飴屋

2009年1月〜4月の日記

2009/3/7

Perlで昨日躓いたメモ。

よくファイルハンドルからファイルの中身を全部取り出すときの処理でこんなのをみかけませんか。

while (<FILEHANDLE>) {print $_;}

具体的には、ファイルのアップロードを受け付けるようなCGIでみかけるコードで見かける気がします。特に問題なさそうにみえますが、昨日はここで躓いたのでした。

foreach (@lines) {print $_;}

気分的には、上記のforeachのような感覚で使ってみたのですが、READONLYな変数を描き変えるなというエラーメッセージをいただいてしまいました。whileブロックとforeachブロックの性質の違いになかなか気づけなかった自分。$_変数のスコープが、foreachの場合、ブロック内のローカルスコープですが、whileはそうではないのですね。サブルーチン内で先ほどのコードを実行すると、$_を書き変えようとしてしまうので怒られるのでした。

while (my $line = <FILEHANDLE>) {print $line;}

こんな感じに直しました。

2009/3/2

Perlのバグ取り中、少しハマったことのメモ。検証用のコードは以下の通り。

$hash = {
hoge=>,
fuga=>'fugafuga'
};
print join(',',keys(%$hash));

出力は以下の通り。

> fugafuga,hoge

ハッシュのキーの配列を返す「keys」が、キー以外の値も交えて返してくるので変だなと思ったら、どうもハッシュの生成時にキーに対応する値に未定義値が混ざっていた模様。キーと値は交互に記述されますが、未定義値の値は無視されて、次のキーが値として挿入されているようです。一つずつずれてペアができるのでものすごく気持ち悪いハッシュになりました。気をつけないとなぁ・・・。

2009/2/23

仕事の一環で千葉県内の市町村名を調べるためにGoogle兄さんに「千葉県」をキーワードに尋ねてみました。すると、Wikipedia先生の「千葉県」の項目が一番先頭に表示され、さぁ、調べろといった状況が整いました。助かります。Google兄さんとWikipedia先生に聞けばたいていのことは教えてくれるのでとても便利だな、と思う今日この頃。
しかし、待てよ。Google兄さんってば、「千葉県」という質問に対して、いきなりWikipedia先生を呼び出すのはちょっと義理に欠けるんじゃないですかい?千葉県庁あたりが保持している千葉県の公式ページってものがあるはずですから、そっちを優先させるべきではないでしょうか。

というわけでとりあえず、関東内一都六県の都道府県名で検索してみました。まぁ、Wikipedia先生ともなれば、公式ページをさしおいて検索結果順一位に表示されるのも不思議ではないのかなとも思いますが、一応、念のために調べてみたところ、驚くべきことに千葉県以外の一都五県では、少なくとも先頭には公式ページが、二番目以降も都道府県の公的施設のページが並ぶことが多いようでした。関東地域で千葉県の公式ページだけが、Google兄さんとは仲がよろしくないようです。

乗りかかった船ですから、残りの40道府県についても同様の調査を行ってみたところ、国内で公式ページがトップに表示されていないのは、千葉県だけという何かを示唆するような結果に終わりました。おい、千葉県さん、何やってるんすか。もっと頑張ろうよ!

千葉県のITへの取り組みに不安を覚えた瞬間でした。それと同時に、仕事中にどうしようもないことに時間を潰してしまった自分を反省させられるのでした。

2009/1/20

昨日の続きの話ですが、クロスドメイン用のポリシーファイルのことをもう少し調べていると、「画像」の読み込みには特にポリシーファイルを必要としないという話を発見しました。あれこれポリシーファイルのことを調べてやっと画像を表示できるようになった私としては、腑に落ちない話だったのですが、なるほど、Loaderで画像を読み込むところまでは、ポリシーファイルなしでもSecurityErrorが発生しないことが確認できました。
どうも、自分が躓いた理由は、Loaderで読み込んだ画像(BitmapData)をdrawメソッドで他のコンテナに描きだそうとしていたのが問題だったようです。
あくまでも「表示」するだけならポリシーファイルはいらないということで、画像を改変したり、別の情報と関係させたりするような動作が必要な場合は、セキュリティ上の制約を受けるということなんですね。

2009/1/19

Flashを使っていると、段々いろんなことができることに気づいて、あれもこれもやろうと挑戦したくなりますが、何でもできる万能なFlash Playerはしばし情報セキュリティの脅威になることがあるようです。ドメインをまたいだ「Flash」と「その他のリソース」の連携は、新しい情報の融合を生み出す反面、利用者の予期せぬ情報漏洩の引き金になりかねません。

・・・というような話をcrossdomain.xmlのことを調べているうちに学びました。確かにFlash Playerはクライアントサイドで動くものなので、下手をするとユーザのローカルマシンの情報やブラウザに蓄積されたCookieみたいな情報を読み出せてしまったりする可能性があるわけですね。(同様にJavaScriptでもまだいろいろいたずらできちゃう穴があるみたいですし。もう塞がってるのかな・・・。)そんな情報漏洩の危険性が指摘される度に、Flash Playerはバージョンアップとともに穴を塞いできた経緯がありまして、制作サイドはその度にセキュリティに関する変更点を確認して、場合によっては修正する作業を要求されてきたのでした。まぁ、私は最近までしばらくFlashいじってなかったので、特にそんなことは気にせずに生きてこれたのですが、Flashからよそのドメインの画像を読み込んで表示させようとしたときに躓いたので、ここに講じた対策をメモしておきます。

※「Flash Player 10,0,12,36」での動作確認している情報なので、将来的(または過去の)セキュリティポリシーの変更に関しては一切頓着していません。以下、参照する場合は情報の賞味期限にご注意ください。

1.まず、ネットで調べたところ、自分のFlashから他所のドメインのリソース(今回は画像)を読み込むときには、事前に相手のドメインのお許しを得る必要があるようです。具体的な方法は、相手のドメインのルートにcrossdomain.xmlというセキュリティポリシーに関する記述の入ったファイルを設置する必要があるとのことでした。

http://candychip.net ←自分のドメイン
http://candychip.net/candy.swf ←自分のFLASHファイル
http://example.com/ ←相手のドメイン
http;//example.com/images/candy.jpg ←読み込みたい画像ファイル

とした場合、

http://example.com/crossdomain.xml

というファイルを設置しておかないと「candy.swf」は「candy.jpg」を読み込めないようになっているそうです。しかも、crossdomain.xmlの中には「candychip.net」からのアクセスを許すという記述が書いてある必要があります。

<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="candychip.net" />
</cross-domain-policy>

いろいろ詳細を端折ると上のような感じの内容が書いてある必要があります。crossdomain.xmlの書式については、他のサイトで調べてみてください。Adobeサイトに定義ファイルもあります。

http://www.adobe.com/xml/dtds/cross-domain-policy.dtd

2.でいわれるがままに設置したのですが、うまくいきませんでした。crossdomain.xmlの書式の問題かと思ってあれこれ調べているうちにMacromedia時代からの変遷があったことがわかりました。検索すると古い情報が結構ひっかかるんですよね。ことセキュリティ関連の情報は、古いと致命的だったりもするのでよくよく検証しなくてはいけません。でも、結局どれを試してもうまくいかなかったので、その日はふてくされて寝ました。

3.翌朝(今日)、改めてAdobeのリファレンスガイドを眺めてみると、ちゃんと読めば答えが書いてありました。気づくまで時間がかかりましたよ。リファレンスを斜め読みするのは危険ですね。ポッと大事なことがさりげなく置いてあるので、無機質なドキュメントには要注意です。
リソースを読み出すLoaderクラスがloadメソッドを呼び出すときに、省略可能な第2引数がありまして、その引数にLoaderContext型を渡してやるんですが、LoaderContextのcheckPolicyFileプロパティをtrueにしてやると先ほどのcrossdomain.xmlを読み込みにいってくれるんだそうです。LoaderContextのコンストラクタの第1引数でそのプロパティを指定できるようなので、以下のような感じでいけるようになりました。

var context:LoaderContext = new LoaderContext(true);
var url:String = "http;//example.com/images/candy.jpg";
var loader:Loader = new Loader();
loader.load(new URLRequest(url),context);

SecurityオブジェクトのloadPolicyFileメソッドなんかも興味深い項目だったので、もうちょっと詳しく調べてみようと思ってます。

2009/1/5

あけましておめでとうございます。本年もよろしくお願いいたします。
昨年末から、新しいサイトの制作を開始していまして、正月もずっと楽しみながら作業を行っていましたが、もうじき正式オープンもできるかと思いますので、ここでも告知しておこうと思います。

いわせてねっと」という名のサイトでして、子猫に言葉を教えて、代弁してもらうといういたってシンプルな発想から生まれたサイトになっています。これまでのWEBシステム制作実務で培ったものを全力でぶつけてみようと思いますので、興味をもたれた方はぜひ遊んでみてください。

今回、Flashを使ったコンテンツ作成というのが、自分の中での技術的なポイントになっています。FlashはActionScriptのバージョンが3になって、AIRが誕生して、最近Playerのバージョンが10になって・・・とめくるめく革新が続いているようでしたが、自分は2004年ぐらいで何か作ることはしなくなっていました。
ですが、去年、WPFを勉強した流れで「Flashの対抗勢力、Silverlight!」みたいな雑誌の煽り文がよく目にとまり、WEB上のリッチコンテンツについて考える機会が増えてきました。
そして、別の機会で簡単な画像編集を行うFlashの制作をするうちに、もう少し面白そうなことがやってみたいと強く思うようになりました。ActionScript3もECMA Scriptベースのなじみやすい構文でしたし、今のところ制作は快調です。

開発日記

Last-Modified