itsukichang

フロントエンドが得意なエンジニア.ダーツと旅行とギターが好き

なっとくいかない研究論文の謎

最近,研究論文を読んだり自分で書いたりしているうちによく分からなくなってくることがあるのです.

根拠はどこまで調べる?

研究背景などを書く際に,「近年~~になって来ているが~~」とか「~~するときに~~ということがある」というような書き方をよく目にしますよね.
このいわゆる前提の部分についての根拠はどの程度示すべきなの?
ある程度自明な部分は省略しても良い?でもその自明ってどの範囲の人までがそう感じるまで?
例えば「人は月日の経過とともに老いていくが~~」みたいな事はほぼ全ての人類が把握していることだけど,「人は昼の方が活動効率が良いとされるが~~」とかになってくるとちょっと微妙になってこない?僕夜の方が元気だよ.
こういう時は「人は昼の方が活動効率が良い」っていうことを明らかにした文献を引用するべきなの?
こういうの見て「え,そうなの?まじ?」って思うのは単に勉強不足?いや,なんとなく本当っぽいことは分かるんだけど,それって証明されてんの?って気になってしまう.
この前提が数値的なことだとまだ良い,例えば数学や物理の公式とかだとキチンと証明されているから.
ただ量的なものではなく,質的なものだとどうしても何か引っかかる.
でもこんなのいちいち引用してたらキリがない.だから多分論文だと対象の業界で常識となっていることは省略していいんだろうと思うし,たぶんそうなってる.

一般的にそれっぽい

使いたい前提がどこかの文献の結果として出ているならいいけど,そういうのじゃなくて,なんか"一般的にそれっぽい”ものってあるじゃないですか.例えば適当だけど,「女性は虫を怖がる傾向にある」とか.
これって恐らく皆trueだと思うだろうけど,実際本当にそうなの?っていうこと.この例だと何か大規模に調査とかして統計的に正しい一般的な答えが出てるのかもしれないけど,そうやってわざわざ明らかにされてないものっていっぱいあるよねたぶん.
こういう "一般的にはそれっぽいんだけど,たぶん証明はされてないけど,皆こう思ってるよな!" 的な事は前提として扱うべきではない?それとも自分で調査してから書くべき?でも統計的に保証された結果を出すには相応な標本数が必要だと思うし,そこに力いれるのもしんどくないですか?

田中は○○と言っている.

あとよく見かけるのが「田中は○○と述べている[1]」って書いて引用するパターン.
引用元で田中さんが単純に自分の意見,考察として「○○は△△であろう」って書いてるだけの場合,これって根拠として成り立つの?使っていいの?なんか偉い人が言った事が正しいみたいな雰囲気ない?
これ使って良い場合,もし田中さんの意見が間違ってたら共倒れになるよねたぶん.

○○は△△な点で良いと思いますか?

知見を質的なもので表す研究の場合,評価・調査という形でアンケートとか取るの多いと思うんだけど,それって結構自分が都合いい方向に誘導することできない?質問の組み合わせとか,聞き方とかで.
要は「○○のことについて△△な点について良い」っていう結果が欲しい人が,○○の良い側面について触れられるようなデモをしたり,説明をしたりした後に,「○○は△△な点で良いと思いますか?」って聞いたら良いって答える割合が多くなりそうだし,「○○のことについて△△な点について悪い」っていう結果が欲しい人が対照的に○○の悪い側面を見せて「○○は△△な点で悪いと思いますか?」って聞いたら悪いって答える割合が多くなりそう.
どんなことでも良い面悪い面が存在している限り,この調査による誘導ってやり方次第でいくらでもできるんじゃないかと思った.
本当に正しくやろうと思ったら,調査内容が中立なことであることを保証する中立な人が必要になるのかな?

要するに

前提とか根拠とか評価方法とか,色々やり方あってとりあえず論文とか書くの慣れてないから,ある程度真似るところから始めればいいんだろうけど,でもそれって…?みたいなことが付きまとって悶々としてるのです><><><><><


上に書いたみたいなルールとか定石みたいな事について,教えて偉い人!!!!!

外部swfを読み込んでデータのやり取りする方法

外部swfの変数とか関数を実行したり,値を共有したいとき2つの方法がある.

1つは共有したい変数とかを定義しておくクラス作っておいて,そのクラスのstaticなプロパティ(クラスプロパティ)を参照する方法
もう1つは子swfにpublicな変数,関数作っといてそれにアクセスする方法

方法1:共有したい変数をクラスプロパティとして定義する

  • 共有用
package {	
	public class CommonClass {
		public static var hoge:uint = 10;
	}
}

これを子からも親からもimportしといて,参照(CommonClass.hoge)すれば,一応やりとりできる.
例えば子swfでCommonClass.hoge = 20; ってやった後に,親でtrace(CommonClass.hoge)ってやれば当然20になる.

方法2: 子swfにpublic定義する

  • 子swfの元as
package {
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	import flash.events.Event;
	
	public class ChildSwf extends MovieClip {
		private var _hoge:uint = 10;
		public var fuga:uint = 10;
	
		public function ChildSwf() {			
		}
		
		private function hoge():String {
			return "hoge";
		}
		
		public function fuga():String {
			return "fuga";
		}
	}
}

これをパブリッシュして,ChildSwf.swfを生成.

  • 親swfの元as
package {
	import flash.display.Sprite;
	import flash.display.Loader;
	import flash.events.Event;
	import flash.net.URLRequest;
	
	public class Main extends Sprite {
		private var _loader:Loader;
	
		public function Main() {
			_loader = new Loader();
			_loader.load(new URLRequest('ChildSwf.swf'));
			_loader.addEventListener(IOErrorEvent.IO_ERROR, trace);
			_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComp);
		}
		
		private function onComp(e:Event):void {
			trace("load complete");
			//trace((_loader.content as MovieClip)._hoge);  //private定義だから当然取れない
			trace((_loader.content as MovieClip).fuga); //10
			//trace((_loader.content as MovieClip).hoge()); //private
			trace((_loader.content as MovieClip).fuga()); //"fuga"
		}
	}
}

まずLoaderでswfを普通に読み込む.
contentLoaderInfoなイベントを追加して,ハンドラでターゲット(loader)にアクセス.
Loader.contentの型がDisplayObjectなのでMovieClipとして扱って,プロパティや関数にアクセスする.

子から親へ参照してくださいなお願い

これで子の値を親が参照できる訳だけど,例えば子の値が特定のものになったときに初めて親に渡したいときがある.
親からTimerとかEnterframeで監視してもいいけど流石にダサいので何とかならないかと思ったら,普通にDispatchEvent使えた.

なので,子swfを吐き出すasに

public static const CHANGED:String = "changed";
private function hoge():void { //渡したいタイミングで呼び出される関数 例えばマウスクリックとか
     this.dispatchEvent(new Event(CHANGED));
}

って書いといて,親では

(_loader.content as MovieClip).addEventListener("changed", onChange); //_loaderには子swf

private function onChange(e:Event):void {
	trace((_loader.content as MovieClip).fuga);
}

ってやっとけば,必要なタイミングだけ子swfの要素にアクセスすればいいようになる.

AIRのFileStreamでファイルの読み書きをするときのイベント

読み込み時のイベント

  • ProgressEvent.PROGRESS
  • Event.COMPLETE
  • IOErrorEvent.IO_ERROR
ProgressEvent
  • bytesLoaded : uint

リスナーがイベントを処理しているときにロードされたアイテム数またはバイト数です。

  • bytesTotal : uint

ロードプロセスが成功した場合にロードされるアイテムまたはバイトの総数です。

http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/flash/events/ProgressEvent.html

書き込み時のイベント

  • OutputProgressEvent.OUTPUT_PROGRESS
  • Event.CLOSE
  • IOErrorEvent.IO_ERROR
OutputProgressEvent
  • bytesPending : Number

リスナーがイベントを処理する時点でまだ書き込まれていないバイト数です。

  • bytesTotal : Number

すでに書き込まれたバイト数と書き込みが保留されているバイト数の合計です。

http://help.adobe.com/ja_JP/AIR/1.5/jslr/flash/events/OutputProgressEvent.html

なんで

なんで違うねん
プロパティの型まで違うやーん

AIRのFileクラスが使用するディレクトリについてのメモ②

前回の記事AIRのFileクラスが使用するディレクトリについてのメモ - いつきの技的日記の補足.
ディレクトリ参照するためのプロパティの具体的なpath例を調べてみた.
ちなみにMac版ね.

おさらい

  • File.applicationStorageDirectory - インストールされている各 AIR アプリケーションごとに固有の記憶領域ディレクト
  • File.applicationDirectory - アプリケーションがインストールされている(インストールされるアセットがある場合はそれらも含まれる)読み取り専用ディレクト
  • File.desktopDirectory - ユーザーのデスクトップディレクト
  • File.documentsDirectory - ユーザーのドキュメントディレクト
  • File.userDirectory - ユーザーディレクト
File - Adobe ActionScript® 3(AS3 )API リファレンス

実験

var fileName = "sample.txt";
var file:File;

file = File.applicationStorageDirectory.resolvePath(fileName);
trace(file.nativePath);

file = File.applicationDirectory.resolvePath(fileName);
trace(file.nativePath);

file = File.desktopDirectory .resolvePath(fileName);
trace(file.nativePath);

file = File.documentsDirectory .resolvePath(fileName);
trace(file.nativePath);

file = File.userDirectory.resolvePath(fileName);
trace(file.nativePath);
  • 出力結果
//applicationStorageDirectory 
/Users/[ユーザ名]/Library/Preferences/[アプリ名]/Local Store/Sample.txt

//applicationDirectory
/Users/[ユーザ名]/[作業ディレクトリ]/Sample.txt

//desktopDirectory
/Users/[ユーザ名]/Desktop/Sample.txt

//documentsDirectory
/Users/[ユーザ名]/Documents/Sample.txt

//userDirectory
/Users/[ユーザ名]/Sample.txt

ただし,これはIDEとかでコンパイルしたときの結果.
AIRアプリとして吐き出してインストールすると,applicationDirectoryが変わるので注意

//AIRアプリとしてインストールした時のapplicationDirectory
/Applications/[アプリ名]/Contents/Resources/Sample.txt

ただこのディレクトリは読み取り専用なのだ.

applicationDirectoryに書き込みたい時

AIRアプリケーションでは、File.applicationDirectory (インストールされたアプリケーションファイルが格納されているフォルダ)配下のファイルは、読み込むことはできるが、書き込んだりディレクトリを作成しようとするとセキュリティエラーが発生してしまう。

しかし、「file = new File(file.nativePath)」というように同じパスを指すファイルオブジェクトを作成し直すと、セキュリティエラーは発生しなくなる。

http://www.fores.jp/labs/wiki/index.php?applicationDirectory%E9%85%8D%E4%B8%8B%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95

パブリッシュ時にリソース含めると,File.applicationDirectoryに入るので,こうやってpathとるとアクセスが楽です.

AIRのパブリッシュエラー

NativeProcessとか使いたくて,デスクトップネイティブインストーラ(.exeとか.dmg)を吐き出すオプションをつけてパブリッシュしたときに,
「入力が無効です invalid AIR file」とかでたら,パブリッシュに含めるファイルとか,そもそもプロジェクトの場所とかに日本語が入ってないか確認しましょう!!!!!!!111111111

含めるファイル「/user/username/works/実験中/sample.swf」とかしてて死にました.

AIRのFileクラスが使用するディレクトリについてのメモ

AIRでFileクラスを使えばディレクトリへのパスを扱うことができる.
FileStreamクラスと組み合わせたらファイルの読み書きができたり.

で,adobeのリファレンス(File - Adobe ActionScript® 3(AS3 )API リファレンス)を読むと,Fileクラスには共通的に使用されるディレクトリの場所を参照するための静的プロパティがあるとのこと.

  • File.applicationStorageDirectory - インストールされている各 AIR アプリケーションごとに固有の記憶領域ディレクト
  • File.applicationDirectory - アプリケーションがインストールされている(インストールされるアセットがある場合はそれらも含まれる)読み取り専用ディレクト
  • File.desktopDirectory - ユーザーのデスクトップディレクト
  • File.documentsDirectory - ユーザーのドキュメントディレクト
  • File.userDirectory - ユーザーディレクト
File - Adobe ActionScript® 3(AS3 )API リファレンス

まぁ当然OS毎に違うんだけど,この「アプリケーションがインストールされてる..」ってどこやねん!ってなった.
調べたらOSごとの保存場所が書いてあるblogがあったので引用めもめも.

C:Users[ユーザー]AppDataRoaming[AIRアプリID]Local Store

C:Documents and Settings[ユーザー]Application Data[AIRアプリID]Local Store

Macintosh HD/Users/[ユーザー]/Library/Preferences/[AIRアプリID]/Local Store/

http://keyframe.co.jp/blog/archives/647

ついでに

その保存したものへのアクセスも当然したくなると思うんですけど,上にある絶対パスををいちいち打ち込んで指定するのも単調でダサいので,もっと簡単な方法を.
sample.txtってのをapplicationStorageDirectory,つまりアプリケーション毎の固有記憶領域に保存して,それへのパスを簡単に取りたい時のコードが以下.

var fileName:String = "sample.txt";
var file:File = File.applicationStorageDirectory.resolvePath(fileName);
trace( file.nativePath);

file.nativePathが肝.
こうすると,「/Users/[userName]/Library/Preferences/[appName]/Local Store/sample.txt」みたいなパスが取れる.