飴屋

開発日記/2009年の日記

2009/12/23

MovableType5をいじる機会があったのですが、そのときに詰まったことのメモ。

MTは4から5へのバージョンアップで、ブログ制作ソフトからサイト制作ソフトという面が強く押し出されているようでした。MT4のときと同じ感覚で設置したら、ブログ記事の新規追加ができなくていきなり躓きました。インストール(設置)などの工程はMT4とさして変わらないのですが、MT5では一番最初に設置されるのが「ブログ」ではなく、「サイト」なのでした。ブログを設置しているつもりで名前をつけたら、それはブログの名前ではなく、サイトの名前だったという。

「へ〜、サイト管理が便利になるかもなぁ」ぐらいの軽い気持ちでとりあえず、「サイト」の中に改めて「ブログ」を新規に追加し、MT4と同じようにブログのテンプレートをいじって指定のデザインを組み込み、期待通りの動作をしたので納品したのですが、後日お客さんから「トップページがデフォルトのデザインになっちゃった」との連絡がありました。テンプレートは書き変えてあるはずなので、そんなことになるわけはないと思ったのですが、確かにMT5標準のデザインテンプレートが使われた赤い画面になっています。

とりあえず、ブログの再構築を行ったところ、元の正しいデザインのトップページに戻ったのですが、あまりに不可解な現象だったのでしばらく悩みこんでしまいました。新たに追加された「テーマ」という機能に私の知らない何か特別な要素があって、テンプレートの設定以外の操作が必要になっているのかも、と「テーマ」について調べてみるも、テーマ自体はテンプレートやカスタムフィールド、ウィジェットなどの要素を包括的に管理するだけの仕組みでした。

そこで、最初に躓いた「サイト」と「ブログ」のことが思い出されました。私のいじったテンプレートはブログのテンプレートであって、サイトにはまた別にサイト用のテンプレートが存在することに気が付き、問題は氷解しました。ブログのインデックス(index.html)がサイトのインデックスに上書きされてたのか・・・。

お客さんの要望は「ブログをメインにしたサイト」とのことだったので、ルートディレクトリにブログを書きだすように設定していたのですが、それとは別に最初に名前をつけた「サイト」も同じ場所にindex.htmlやらRSSやらを出力する設定にデフォルトでなっていたのでした。

う〜ん、初めてのバージョンにはこういった初めての現象がつきものですが、早めに気がついてよかったです。出力ファイルがサイトやブログで重複した場合に、警告してくれるような仕組みがあったら、こんなミスにもすぐに気がつけたかもしれないですね。

2009/12/8

FlexでFlash制作中にIE8がJavaScriptエラーを出していたときのメモ。
FlashのExternalInterfaceオブジェクトを使用してFlash表示中のブラウザと通信を行う際に、ExternalInterface.call("関数名")といったような感じで、JavaScriptの関数を呼び出すことができますが、呼び出し時に以下のようなJavaScriptが動的に生成され、返り値がFlash側に返ってくるようです。

try { document.getElementById("").SetReturnValue( __flash__toXML(関数名) ); } catch (e) { document.getElementById("").SetReturnValue( "<undefined/>"); }

このときに「オブジェクトはNullです。」みたいなエラーが出るようになって、最初はExternalInterfaceがIE8では使えないのか!?なんて慌ててしまいました。
でもよくみると動的に生成されたコードのgetElementByIdの引数が空の文字列になっていますね。ここでnullなオブジェクトに対してSetReturnValueメソッドを呼ぼうとしてエラーが発生していたというだけの話でした。

動的なスクリプトが空のエレメントIDを指定していた理由は、そもそもFlash表示用のタグ(object、embed)にIDを割り当てていなかったという単純なミスでした。普段のFlash
制作では起こらないようなミスなのですが、今回のFlashはmixiアプリ用のものだったため、opensosicalのAPIが提供する方法(gadgets.flash.embedFlash)でFlashを表示したら、IDを指定し忘れてしまったんですね。先日は「allowScriptAccess」も指定し忘れてましたっけ・・・。

2009/12/4

Google App Engineで詰まったメモ

現象

File referenced by handler not found

という警告が出て、うまくレスポンスが返ってこない。
ローカルでのテストは問題なかった。

原因

どうもpythonスクリプトのファイル名に問題があったらしい。
json.pyというそのまんまなファイル名ではアウトだった。
jsonp.pyでも駄目。
先頭にjsonがついているのが駄目っぽい。
似たような事例を検索して発見。こちらのケースでは「img」で始まるのがよくなかったらしい。

対策

fugajson.pyのような感じでファイル名の先頭を変更。

結果

うまくいった。多分、他の何らかのファイル名と競合するのだろう。

2009/11/21

mixiアプリの開発の延長で、Google App Engineを使ったサービスの構築を行ってみようと本日挑戦中です。Pythonは概要しか知らない言語でしたが、既知のOOP言語からそれほど外れているわけでもなさそうなので、何となくわかったつもりになっています。

以前、Shade Basicを買って、Pythonスクリプトのプラグインを書こうと思ったときにインストールしてあったPythonがバージョン3.0でしたので、最新バージョンの3.1をインストールしなおしてみました。そして、GAEの利用申し込みを済ませ、開発ツールをインストールし、デフォルトで設定されていた「Hello, World」表示スクリプトを走らせてみようとしたところ、

NameError: global name 'execfile' is not defined

とログに表示されてしまいました。特別な操作はしていないのに何故?と焦りましたが、調べてみると外部ファイルの実行関数「execfile」は、Pythonがバージョン2系統からバージョン3系統にアップデートする際に「exec」という名前に変更があったそうです。そして、GAEのPython環境はバージョン2.5系統なんだそうです。

ということなので、バージョン2.5.4のPythonをインストールして、開発ツールのPythonへのパスを設定しなおすことで事なきを得たのですが、将来的にはPythonのバージョンアップに対応した環境も開放してもらえるのでしょうか。若い言語のようですし、頻繁に改修もあると思いますが、追いついていけるのか少し心配になったのでした。

追記

一つのデータモデルのプロパティに、同じモデルを参照するdb.ReferencePropertyを複数設定すると「DuplicatePropertyError」が発生するという現象に遭遇しました。私の場合、db.SelfReferencePropertyを二つ持たせてあげたときに発生したのですが、同じことでしょう、きっと。

class Hoge(db.Model):
mugaKey = db.SelfReferenceProperty()
moheKey = db.SelfReferenceProperty()

さっぱり、ピンとこなかったのですが、以下のようにcollection_nameを指定してあげるとよいとのことでした。

class Hoge(db.Model):
mugaKey = db.SelfReferenceProperty(collection_name="muga")
moheKey = db.SelfReferenceProperty(collection_name="mohe")

例えば、MySQLで同じテーブルを二回JOINするときにそれぞれのテーブルに名前をつけてやらないと中身を扱えないというようなことかと推測してみましたが、これ以上深くは考えないでおきます。

「DuplicatePropertyError」で似たような現象について解説していないかググってみましたが、英語サイトの方がやはり情報が充実しているように感じました。いいお手本になる日本語サイトとめぐり合いたいです。

2009/5/30

先日、ふと気がつくとMovableTypeで管理している自分のブログの記事のカテゴリー情報がすべて消え、タグ情報もちぐはぐに関連付けられていました。血の気のひいた一瞬です。どうやら去年の末にブログの整理作業を行った際に問題が発生し、数ヶ月間気がつかないでいたようです。バックアップから復旧作業を行ったのですが、一部未済のままだったようです。昨年末の作業を詳細まで覚えていないので、とりあえずmt_objecttagテーブルとmt_placementテーブルを当時のバックアップデータと照合して、ずれを補正するという作業でことなきをえました。失われたデータが残っていなかったらと思うと今でもぞっとします。忘れないうちに修正済みのデータもバックアップしておこうと思います。

今回、修正作業のついでにバージョンを4.1から4.25にアップグレードしましたが、そこでも少し厄介なことが起こりました。以前とったバックアップの復元をしようとしたら、どうもバックアップファイルの仕様がどこかの段階で変更されていたらしく、受け付けてもらえず、また、再構築しようとしたらテンプレートの仕様がこれまた変更されたらしく途中でエラーを吐いて止まってしまいました。バージョンアップによる仕様変更は仕方ないと思いますが、ちょっと喫茶店にでも寄る感覚で気軽にバージョンアップをしようとすると火傷するので、今後はもうちょっと慎重にいきたいと思いました。

2009/5/18

デジタルカメラで写真をたくさん撮るのですが、現在、整理の方法を検討中です。日付のフォルダを作って撮影日ごとに分類し、月に一度差分のバックアップを取るというスタイルでやってきていたのですが、共同で写真を使う人から時系列だと探している写真がみつけにくいと文句がでてきたのでした。時系列ではなく、ロケーションやイベント毎に分類されていることが望ましいそうです。私は主にPicasa3でパラパラとサムネイルを確認し、必要に応じて写真にタグ付け(今はアルバムと呼ぶらしいです)しているので、不便はなかったのですが、Windows標準のエクスプローラでもわかりやすく分類しなおせと言われました。

さて、そこで問題になったのがデジカメ写真のファイル名です。最新のデジカメがどういう命名規則でファイル名を決定しているのかはわかりませんが、うちでメインに使っている2台のカメラはというと・・・

  1. メディアにすでに入っている写真と被らないように0から連番
  2. 最後に撮った写真の番号を記憶して連番(10000枚ごとに別フォルダ作成)

というルールなので、それなりの頻度で名前がかぶるのです。なので、同名のファイルを同じフォルダにまとめて突っ込もうとすると「上書き、キャンセル、リネーム」の選択ウィンドウが出てきてしまいます。別にリネームして「ABC00001(2).jpg」みたいな変なファイル名になっても構わないのですが、どうもリネームを選択するとファイルの移動にかなり時間がかかるみたいなので、整理していてイライラがつのるのでした。

じゃあ、事前にExif情報から撮影日時をひいてリネームしておこうと思って、書いたPerlのスクリプトがこれです。「Image::ExifTool」は別途入れる必要のあるモジュールです。開発者の人、便利なものをありがとうございます。

use Image::ExifTool;

;
exit;

sub renameDir {
my $dir = $_[0];
print $dir."\n";
opendir DIR,$dir;
my @files = readdir(DIR);
closedir DIR;
foreach my $file (@files) {
if ($file =~ m/^\./) {next;}
if (-d $dir.'/'.$file) {;}
if ($file !~ m/\.jpe?g$/i) {next;}
;
}
}

sub renameFile {
my $fn = $_[0];
my $exifTool = new Image::ExifTool;
my $info = $exifTool->ImageInfo($fn);
my $newname = $fn;
if ($info->{CreateDate} eq '') {return;}
my $dt = $info->{CreateDate};
$dt =~ s/\D//g;
$newname =~ s/\/\w+\.jpe?g$/\/$dt.jpg/i;
if (-e $newname) {return;}
rename $fn,$newname;
}

これで、事なきを得たかと思われましたが、一部リネームされないデータがありました。デジカメの時計用の電池が切れたのか、はたまた時計を未設定状態で使っていたのか、Exif情報が記録されていないファイルが・・・これは仕方がないので、不明な部分を連番に置き換える処理でお茶を濁しました。

しかし、問題はそれだけではありませんでした。デジタル一眼レフの連射機能にまかせて、バッシャバッシャと写真を撮っていたら、一秒間に複数枚写真を撮っている場合があり、日時でファイル名を作るとまたしてもファイル名が重複するケースが出てきました。アナログカメラのときはフィルム代をケチって連射なんて使わなかったので考えもつかなかったのですが、すごい勢いで画面を切り取っていたのですね、自分。まぁ、最近のデジカメのCMでは「フルハイビジョン動画も撮れる」なんて文句も踊ってるくらいですもんね。動画のコーデックや、記録媒体の進歩は目覚ましいものです。近いうちに、写真は「動画の一部を切り出すもの」になるのかもしれませんね。
そうするとデジカメプリント屋に列ができそうでいやだなぁ。読み込みに何十分もかかったりして。

2009/5/17

引き続きWordPressの構築でつまづいた点をメモ。

「amazon-showcase-wordpress-widget」というAmazonの商品をウィジェットとして表示してくれる便利なプラグインがあるのですが、利用者が商品の番号(ASIN、ISBN)を調べるのが面倒だとごねているので、ASINの検索プラグインを作らなければならなくなりそうになりました。しかし、「wp-tmkm-amazon」なんていうこれまた便利なプラグインが公開されていまして、本来なら記事の編集画面でAmazonの商品情報を差し込むというプラグインではあるのですが、その商品検索窓の部分だけiframeタグでひっぱってくることでことなきをえました。ありがたや、ありがたや。

しかし、さらに「Amazon Showcase」の方で、追加した商品情報が管理者画面では確認できるのに、公開されるブログの方では表示されないという問題にぶち当たりました。原因がさっぱりわからないのでデータベースを覗いてみたところ、どうもAmazonから引っ張ってきた商品情報のキャッシュが保存されていない模様。
仕方がないので、プラグインのコードを一から読み直してデバッグしてみたところ、日本のAmazonの情報サービスのドメインが変更されていたのが原因のようでした。

amazonshowcase.php 539行目ぐらい

//修正前
case 'jp': $base = 'http://ecs.amazonaws.co.jp/onca/xml'; break;
//修正後
case 'jp': $base = 'http://ecs.amazonaws.jp/onca/xml'; break;

要するに「.co.jp」を「.jp」にするだけで直ってしまう現象なのでした。Amazonの商品情報サービスを直接自分で使ったことはないのですが、提供元ドメインの変更がどこかの段階であったのでしょうね。「Amazon Showcase」を利用している人は国内でも多そうなので、商品が表示されなくなって困っている人も結構いるかもしれませんね。

2009/5/13

以前、WordPressの設置を頼まれることがあり、テンプレートを作ったり、編集画面用のプラグインを作ったり、いろいろいじっているうちにちょっと興味が湧いてきたので、自分の管理しているサイトにも導入してみました。私のほかにも記事を書く人がいて、その人はWYSIWYGなエディタに不慣れなため、これまたいろいろと機能を追加してあげる必要がありました。そんな中、挙がってきた要望に「画像をたくさん記事に挿入したいけどめんどい」というものがありました。なるほど、自分でやっても確かに煩わしいです。

WordPressは、Flashを使って画像を一度に複数枚アップロードできるので、写真をたくさん載せる人に優しいと思っていたのですが、実際に掲載する際は「メディアライブラリ」を開いて、該当ファイルを選択して、「投稿に挿入」ボタンを押さなければなりません。画像一つ挿入するのに4クリックも必要であり、しかもメディアライブラリを開くのに少し時間がかかるものですから、たくさん画像を張り付けるのも一苦労です。

そこは何とか便利なプラグインがあるんじゃないかと検索しましたが、今のところまだ見つかっていません。しかし、同様の悩みを抱えている人はいるようで、以下のような解決策が提示されていました。

[wp/wp-admin/js/media-upload.js 24行目]でメディアライブラリのthickboxを閉じる処理を、ページを戻る処理に変更

//変更前
tb_remove();
//変更後
window.history.back();

これで、画像を挿入するたびにメディアライブラリの窓が閉じないので、いくらか手間が減ります。しかし、欲を言えば、画像の一覧画面から画像を「投稿に挿入」できたらもっと楽ができそうです。

[wp/wp-admin/includes/media.php 1082行目]

//変更前
$toggle_links = "
<a class='toggle describe-toggle-on' href='#'>$toggle_on</a>
<a class='toggle describe-toggle-off' href='#'>$toggle_off</a>";
//変更後
$send2 = "<input type='submit' class='button' name='send[$attachment_id]' value='" . attribute_escape( __( 'Insert into Post' ) ) . "' />";
$toggle_links = "$send2
<a class='toggle describe-toggle-on' href='#'>$toggle_on</a>
<a class='toggle describe-toggle-off' href='#'>$toggle_off</a>";

自分で使うものなのでやっつけ仕事ですが、とりあえず、一覧から画像を挿入できるようになりました。前のthickboxを閉じない処理と組み合わせることで一覧からガンガン画像を追加できるようになりました。(ボタンの表示位置とかは$send2の追加位置を変更すれば、もうちょっとましになりそうです。)

とりあえず満足ですが、プラグイン化しないとバージョンアップ時にまた同じ作業をやり直しですね。ちなみに作業時のWordPressのバージョンは2.7.1でした。

2009/5/3

先日、注文したShade10.5が本日届きました。連休中に遊べるようにAmazonのお急ぎ便で注文したにも関わらず、昨日は不在で受け取れなかったというがっかり感を払拭すべく、さっそくインストール作業を開始します。ライセンスは一本につきPC一台だそうです。ただし、LAN内のマシンにレンダリングの計算だけをさせるプログラムも同梱されていましたので、有事の際には他マシンも動員して計算することができそうでした。ユーザ登録作業を終えると、Poser6もダウンロードできるようになってました。製品ID的なものを打ち込む作業は、今も昔も変わらず面倒くさいですね。
すでに発売されてから何回かパッチプログラムが発表されているようなので、10.5.3なる最新のパッチをあててみました。前評判で「バグが多い」なんて情報もみかけたのですが、致命的なやつはもうそこそこ塞がれているのでしょうか。
あとは同梱のHanakoという女の子のモデリングデータも入れてみました。ただ、水着姿の女の子がモニタに現れると、なんというか気恥ずかしいものですね。まだ、人体のモデリングを行うようなレベルではないので、とりあえずこの子のことは忘れておきます。

体験版をいじってみたときから、以下のサイトを参考にモデリングの実験を行っていました。

http://www.nichibun.net/applications/collection/fn2001/index.htm

古いバージョンを使用しての解説だったので、ツール名や作法が最新版のShadeとは結構異なっていましたが、ざっくりと検索した結果の中では一番わかりやすいサイトでした。およそのモデリング手順は理解できたので、後は実践あるのみです。

#img(http://soft.candychip.net/images/2009/05/03/shade.jpg)

初レンダリングは、意味不明な自由曲面の計上となりました。記念に貼っておきましょう。

2009/5/1

たまに無性に3DCGへの興味がムクムクと起きだして、衝動的にプログラムを組んでみたり、形状データの記録ファイルのフォーマットを調べてみたりすることがあります。どうも春の陽気に誘われて、そういった欲求が起こってきたようです。

今回はモデリング関連に興味が湧きまして、ソフトウェアを一つ買ってみようと考えています。定額給付金の通知もきたことなので、それで少し遊んでみようというわけです。ただ、たくさんお金がもらえるわけではありませんので、選択肢は非常に狭いのです。3DCG関連のソフトウェアは昔と比べれば値段は随分と廉価になったものですが、まだ、本格的に仕事に使うわけでもないのに、何十万円も投資はできません。

無償のものも含めていくつか調べてみて、一番気になっているのがShadeです。数少ない国産のソフトの中では、ユーザのコミュニティもそれなりに活発そうな印象を受けました。最近、10.5にバージョンアップしたとのことで、それを記念してPoser6と女の子のモデリングデータが付属するというキャンペーンも展開されているみたいですね。お金の都合上Basic版という機能制限版を買うことになりました。これは、実際に触ってみて、機能が足りないと感じた時にアップグレードも検討するということにします。本日のAmazonでの価格は10289円でしたので、本当に定額給付金で買えてしまいました。

Shadeの販売元のe-frontierのサイトでは、最新版のShadeの体験版を配布しているとのことなので、どんなものか試しにダウンロードしてみました。レンダリング結果への制限事項がかなり厳しいものなので、イマイチきれいな出力を実感できませんでしたが、とりあえず手に余るものでもなさそうです。

自分のモデリングソフトの使用歴を振り返ると、まだMS-DOSをOSに使っていたころに、アスキーあたりから出ていた3DCGツクールとかいうものから、六角大王とかメタセコイアとか、最近ですとGoogle Sketchupなど、比較的安価なものばかり使っていました。最初は一枚絵を出力して満足していたものでした。昔のマシンの処理能力では、一枚出力するにも一日がかりでしたので、生半可な気持ちでレンダリングを開始することはできなかったというのが、非常に記憶に残っています。それから、ゲーム機の主軸がプレイステーション時代になってくるとともに、徐々に自分でモデリングしたデータを自由に動かしてみたくなる欲求が出てきて、ローポリゴンのモデルをJavaやDirectXで動かして満足したものでした。それから、何度か衝動的に3D関連のことをしたくなり、Postpetのデータをいじってみたり、ゲームソフト内のデータを捕まえてみたり、一番最近はXAMLで遊んでみたりして遊んでいました。今回は、もう少し真面目に取り組んでみるのもいいかもしれませんね。面白いものができたら発表しましょう。

Shadeを選んだ理由は、自由曲面という面白そうな響きの単語があったのが大きいですね。これは計算式で面の形状を示すというモデルなんだそうで、ポリゴンとはまた違った使用感があるそうです。多分、自分はモデリングにはある段階で飽きるか限界を感じると思うので、その次の段階でプログラマブルにモデリングをしてみたくなるものと見込んでいます。Pythonでプラグインが書けるようなので、この機能を使って、Basic版でもそれなりに便利に活用できるようになるとうれしいです。

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ベースのなじみやすい構文でしたし、今のところ制作は快調です。

開発日記