preload
9月 29

PHP×携帯サイト デベロッパーズバイブル を日頃からお世話になっている、memokami の荒木さんよりご献本いただきました。荒木さん、ありがとうございました。


さて、タイトルにも書きましたが、この本、ケータイサイト開発に関わる方なら PHPer でなくともオススメです。実装例やサンプルライブラリこそ PHP で紹介してあるものの、各種環境構築やサーバ設定などの主題から外れる内容は極力省かれており、全体的な解説の重心は「ケータイサイトを作る際に知っておきたいこと、考えておきたいこと」におかれています(と僕は思います)。ですので、「知っておきたいこと、考えておきたいこと」を読み解いていくことで、他言語での開発をおこなう場合でも、とても参考になる一冊だと思います。


もうちょっと細かく書くと、僕がこの本をオススメする理由は、大きく次の 3 点が挙げられます。

  1. 3キャリア対応サイトを作るために、3箇所(以上)に分散している一次情報をチェックし、比較活用できる形にする必要がある => その手間をショートカットできる
  2. キャリア仕様からは必ずしもうかがい知れない、「やってみなければ分からない」ポイントが押さえてある
  3. これらの情報が、実際のサイト開発の流れに載せて、順序立てて解説してある

1 点めは、ケータイサイト開発を始めて、すぐに遭遇する「メンドクサイポイント」です。たとえば「位置情報を使ったサイトを作るぞ」という状況になったとき、各キャリア仕様を当たることになりますが、「つくろうiモードコンテンツ」やら「EZ Factory」やら「SoftBank Mobile Creation」やらを巡回して、必要そうな資料(PDF)をピックアップしてくることになるわけです。当然、3 社とも資料の様式/解説手順は異なりますし、必ずしも一つの資料じゃ見えきれないキャリア特有の前提知識があったり、初めて見る標準仕様っぽい名前やら用語が出てきたりと、これらの情報を整理解釈するフェーズがどうしても必要です。これらの情報が「一次情報はどこにあって」「最低限見ておくところがこれで、3 キャリアではこうなってて」「実装するならこうだ」というのが一通り書いてある、というのは、これだけで大きなショートカットになります。


2 点めですが、たとえば、次のような情報で「何だこりゃ、どういうことよ」「うわ、ケータイサイト、メンドクさそう(でもやることになっちまった)」って方は、きっとこの本を読んでおくと、少なからず救われるのではないかと思います。

  • SoftBank モトローラ機種は、User-Agent の表示フォーマットが異なる
  • au は Win かそうでないかで利用可能絵文字数を見分けると良い
  • SoftBank 絵文字の扱いは 3GC 機種とそうでない機種で微妙に違う
  • au デコレーションメールの MIME フォーマットは他キャリアのフォーマットと異なる
  • SoftBank の旧機種では端末シリアル番号が取得できない
  • au だけは HTTP リクエスト拡張ヘッダで、位置情報対応有無を確認できる

こんなふうに、まさしく「ハマった人しか知らない」「やったことがある人でないとわからない」ポイントが目白押しです。とくに絵文字の扱いに関する説明の丁寧さには特筆すべきものがあります。3 キャリアサイトでの絵文字対応は鬼門ですが、ここまで絵文字についてページを割いて丁寧に説明している本を、僕は見たことが無いです。

余談ですが、僕は最近↑のデコレーションメール周りでいろいろハマってました(諸事情あり、ここで紹介できてなくて申し訳ないです)。ここも、しっかり解説してくれてるのが、ちょっと悔しかったりする。


最後の 3 点めは 2 点めとも共通してくるのですが、

ケータイサイトの開発では、「技術的に難易度が高い」というのとは異なるトリッキーなハマりどころが多く、何も知らずに足を突っ込んでしまうと、「オイオイ、こんなのでアリなのかよ」「この○○××め〜!(○○にはお好みの文句、××にはお好きなキャリア名もしくは機種メーカをどうぞ)」という実装 TIPS と、特異な( bad というには抵抗があるので)ノウハウの嵐に遭遇します。ケータイサイト開発を安易に考えていた結果、落とし穴にハマりまくって、見積りが大きくブレたという痛い経験は無いでしょうか。僕はあります。泣きました。


現実的には、最近は、これらのハマりポイントも Web 検索で解決できるようになってきました。けれど、この本は単にハマりポイントと対処療法を散乱させた、Web で検索できるネタの寄せ集めではありません。これらを、実際のサイト開発の流れに載せて、順序立てて解説してくれているという構成もオススメポイントのひとつです。こういう構成にしてくれているおかげで、これからケータイサイト開発に取り組む方がハマる前に、何を見ておくべきかを、あらかじめ知ることができると思います。


というわけで、携帯サイトの開発にかかわっている僕も、多くを勉強させていただきました。ケータイに関する開発にこだわって携わってこられ、自身でのケータイサービスも運用されている荒木さんならではの、エネルギーを感じる一冊です。これからケータイサイト始める方にも、すでに幾つか経験されてる方にもオススメです。


最後に、

荒木さんが巻末に書かれている通り、ケータイ技術は日進月歩、異常に速いスピードで進化していますから、確かにこの本の内容も、すぐに古くなって行ってしまうかもしれません。が、今までのスピードに比べれば、端末の買い替えサイクルも長くなってきたし、「普通のケータイサイト」を作る上でのポイントはちょうど成熟してきた頃なんじゃないかな、とも思います。

今後は iPhone やら android やらの話題がモリモリ世に出て行きそうですが、それらの開発 TIPS が一般的に必要とされるのは、もうちょっと先になりそうですよね。まだまだケータイサイトはいっぱい生まれてきてますし、ケータイサイト開発解説本としては、とても良いタイミングで発売されたのではないでしょうか。

Tagged with:
7月 29

ここのところ、請負案件から派生してる研究活動が多いので、イマイチネタが放出できてなくてアレです。まあ、今に、書ける段階になれば、書ける範囲で公開していきます。


とか言って、何も書けないのもつまらんので、最近機種変更した au の新機種についてダラダラ書こうと思います。W51CA(黒) から W62CA(G’zOne)(白) に機種変しました。使い始めて一週間くらい経ったので、宣伝でも批判でもなく、僕の視点と感想を適当にまとめてみます。きっと W62CA という機種に興味が無ければ全然面白くないし、興味があっても、一部なにを言ってるのか分からないくらい細かいところに言及すると思います。なので、途中で飽きるかも。飽きたらすいません。

ココが変わってて良かった

防水・耐衝撃
濡れを意識しなくていいのは快適。家の洗面所にも気兼ねなく置けるし、アウトドアレジャーにも良い。冬のゲレンデでも気にせず取り出せる
センサーいっぱい(G’zGEAR)
温度計とか電子コンパスが楽しい。室内でエアコン効き過ぎとかわかるし、高度計と電子コンパスは、「あの山はなんだっけ?」とか「富士山こっちか!」みたいのが、これまたゲレンデで楽しめそう(言うほど行ってないくせに)
ブラウザでの通信体感速度アップ
他の部分では速度ダウン(後述)だけど、ここは快適。EV-DO rev.A ってやつ?W51CA が対応してなかったのかどうかは知らないけど、体感は確実に速くなってる
ブラウザでのテキストコピーができるようになった
電話番号が tel: リンクになってないときとか、不便だったんです。これでコピって電話帳登録とかできるようになった
歩数計&カロリーメーター
待受け設定しておいたら、常に当日分の消費カロリーやら食べ物に換算したアニメーションやらが表示されて、楽しい。僕の昨日の運動量はマッシュルーム 198 個分だった。少ないな..
左右キーはブラウザの一画面スクロールになった。ブラウザの「戻る」「進む」は「メール」「EZWeb」ソフトキー
最初違和感があったけど、端末横のスクロールキーは押しにくかったので、これは結構うれしい。ひょっとして FlashLite コンテンツのインタラクティブ再生で四方向ナビゲーション拾えるようになったか?と思って

var keyListener_obj:Object = new Object();
keyListener_obj.onKeyDown = function() {
switch (Key.getCode()) {
case Key.DOWN :
cube._y += 10;
break;
case Key.UP :
cube._y -= 10;
break;
case Key.LEFT :
cube._x -= 10;
break;
case Key.RIGHT :
cube._x += 10;
break;
}
};
Key.addListener(keyListener_obj);

こんな感じで cube ひょこひょこさせるサンプル swf 作ってみたけど、やっぱダメでした。四方向拾えるのは未だに SoftBank だけか

通常メール <=> デコレーションメールの編集中切り替えが可能になった
今まで mailto リンククリックするとデコレーションメール使えなかったのですよ。これで急にデコレーションメールに気分が変わってもだいじょうぶ!
デコレーションメール編集中にデコレーションエモジ(絵文字)へのショートカットが使えるようになった
今までのデコレーションメールはデコレーション絵文字を入れるのでも通常のインライン画像挿入操作だったので、連続入力もできず、使いにくかった。これでだいぶドコモのデコメール編集の使い勝手に近づいてきたかも(ドコモのデコメール編集 UI は通常メールとの境がほとんど感じられない。アレくらい割り切っていても良いと思う。ユーザは HTML メールとか中身がどうなってるとかはどうでも良いんだし)
LISMO Playerの起動速度up
メニュークリック => スプラッシュ表示 => Player メニュー表示が一秒未満。ここはがんばってるとおもう。使ってないけどね(Macだと使えないんだもん
Run&Walk アプリ
ジョギングに使ってみてるけど、地図へのコースマッピングやら、速度チェックやら連動して、ちょっと楽しい。続けんとなあ
背面液晶(電子ペーパー)で時刻が常時表示
なにもキーを押さなくても時刻が常時出ててくれるので、テーブルの上とかでも、操作無しでこっそり時間確認できてよい(何がだ
Bluetooth 搭載
未使用だけど、使ってみたい。Mac で LISMO 行けるようになったらヘッドホンへのアダプタ買って使ってみるんだけどな
ワンセグアンテナが内蔵
いちいちアンテナ伸ばさなくて良い。こういうのは気持ちいい。もっと起動が速くなってくれると良いんだけど

ココは変わってなくて良かった

防水仕様でキーがシート形式なのに、かなり押しやすい
前の W51CA はかなりキーが押しやすい形状だったけど、この機種もキーの凸部がちゃんと確保してあって、シート形式とは思えないほど、ちゃんと触感がある。結構工夫したところじゃないかな、これ
メール送信中に折り畳み閉じても、送信処理続行してくれる
稀に、折り畳むと送信処理を中断する機種が居て、送信完了まで見届けないといけないのが困る。たまに「送信できませんでした」ってエラーを報告してくるのはなんとかしてほしいけど(送信できるまでやってくれよ、と思う)

あ、この項目あんまし無いな。でも、↑は重要。

ココが変わってて残念

基本的に、何するにも処理遅い
通信速度は上がってると思うんだけど、メインメニュー起動、メール画面表示、ブラウザやメーラから待受に戻る、データフォルダ開く、など画面を切り替える操作は、ほとんどが 1 秒以上かかる。データフォルダ表示や移動に毎回「処理中です」とか出るのも謎。前の機種よりも全然データが少ないのに。
メニューカーソル移動も、方向キー押しっぱなしで動かすだけでも 3,4 項目ごとに引っかかる。文字入力もたまに後追いになる。すげーストレス
電源ボタン短押しで、待受に戻らない
メインメニューより下の階層にいると電源ボタンでメインメニューへ、ブラウザだと EZWeb メニュー画面へ、というように、一発で待受に戻らなくなった。常に待受に戻しておきたいのに、電源連打しても上述の通りレスポンス遅いので、これまたストレス
待受ショートカットから新着メール起動して、電源ボタンで待受に戻ってくると、他のショートカットにカーソルが残留している
この状態だと、EZ ニュースフラッシュが流れないので、もう一度電源ボタンを押してカーソル解除する必要がある。ただし EZ ニュースフラッシュが流れているときに電源ボタンを押すと、ニュースフラッシュが消えてしまい、再度表示するためには「上」キーを押す必要がある => しかも、この表示に 1 秒程度かかる上に、表示設定無しにしてある検索ガジェットが勝手に登場してくれる(意味がわからん..)。このため、「常に待受はニュースフラッシュ表示させておきたい」場合は、電源ボタン連打ではなく、待受に戻る => クリアキーでカーソル解除 をいちいち画面で応答状況を確認しながら操作する必要がある
ガジェット使わない
表示する => ガジェット操作に入るためにそれぞれ 1-2 秒かかる。これなら前の機種でショートカットメニュー開いた方がよっぽど早い
2画面分割(マルチウィンドウ)使わない
分割できたのは一瞬うれしくてスゲーって思ったけど、ケータイでそんなにいっぺんにいろいろやんないから、それで重くなるくらいなら要らない。なんでいろんなキャリアでマルチタスク的な機能を入れてるんだろう。みんな使ってるんだろうか。ドコモで「ブラウザがこれ以上開けないから一旦終了してください」みたいなエラーが出るのも、未だにまったく理解できない
ケータイ de PCメール、使うと思ったけど有料だし使わなさそう
IMAP してる gmail をブラウザで覗きに行くだけでわりと十分とわかった。会社メールの流量が少なくて、それをケータイで送受信したい人は便利かもね
ツータッチ入力設定で英字モードに入ると、ここでもツータッチ設定になる
日本語ツータッチ入力設定してあっても、英数字はツータッチになってないのが au の魅力だったんだけど、変わってしまったみたい。ボタン一個で通常の英数字入力モードに戻せるので、まだ我慢できるけど、前の方がよかった。みんな英数字もツータッチで入力してるのかな?ドコモとSoftBankはツータッチ設定を解除しないと英数字入力もずっとツータッチになるのが使いにくいんですよ
ツータッチ入力時の記号の割当や改行入力、記号表呼び出し時のキー割当が微妙に変わっている
これは慣れるしか無いかなぁ.. 句読点(前まで 88 で入力できてた)はどうやって入れるんだ
背面液晶(電子ペーパー)に呼出し元が表示されない
解像度&アニメーションの応答的に厳しいのかな.. 開いてメイン液晶見れば良いんだけど、不便
メニューの背景色ができない。フォントも細くてヘニョイのしか無い
装飾できるメニューは一階層めだけみたいで、その下は、すげーシンプルな白黒 UI しかない。フォントも、変。gmail を EZWeb ブラウザで見ると、フォントが旧世代の機種のドット文字みたくカクカク。なんだこれ。どうにかできるのかな..
電話をかける際の呼び出し中画面で、コール先の電話番号表示が消える
「プップップッ」音が消えたときとかに間が空くと「あれ?どこにかけたっけ?」って思うんだけど、画面に何も表示されてなくて、確認のしようが無くて困る
EZムービーの早送りが、高速再生というより、秒飛ばしコマ表示再生
EZムービー再生中に右キーを押すと早送りできるんだけど、W51CA はそこそこ滑らかな高速再生で、一通りの映像が見られたのに、この機種は数秒ごとのコマがパラパラで表示されるようになっちゃってる
ライト点灯のキーが暗闇で識別しにくいところになった
W51CA は # 長押しでカメラ用のライトが点灯できて、簡易懐中電灯的に使えた(PCの裏側とか机の下の暗所作業でよく使う)んだけど、この機種は側面ボタンの 4 つ並んでるうちの上から 2 番目にライトが割り当てられてる。これがなんとも暗闇では指先で判別しにくい位置で、これまでに何回もマナーモード設定キーと間違えちゃってる
たまにメインメニューからその下の階層に行けなくなる
メニューのカーソルキーは動くのに、決定キーが無視されて、一切のメニューが使えなくなる。再起動すると復帰。なにこれ
折り畳み開いたときに、たまに画面真っ黒でなにも表示されない
何かボタンを押すと待受けが表示される。何が起こってるんだ
たまにカメラが起動できない
カメラ起動しようとすると「カメラの起動に失敗しました」ってエラーが出る。知らんよw この現象が出ると、電源も切れなくなるので、電池パックを外して再起動。

ココが変わってなくて残念

ブックマークデータ移行時に、フォルダ構造が消える
W51CA にしたときもこうだったんだけど、未だに同じだった。ブックマークの整理を作り直すのが面倒

こんなかんじかな。変わっても我慢できるものは仕方ないとして、基本的に、処理が遅くなってるのがストレス。au は速かったのが良かったんだけど、これでモッサリ度は 3 キャリアだいたい一緒になってしまったなあ。防水は本当に有り難いので、ソフトウェア更新で速くできるものならガンガンやって欲しい。(いろんな事情があって)無理なんだろうけど。


ちなみに、ナカチェン?ケータイアレンジ?、とかでメインメニューを変える際は、項目ごとでカーソル停止した際にアニメーションが入るタイプを選ぶと、大変遅いぽいので、さくさく使いたい人はアニメーションが入ってるようなメニューは避けた方が良いと思う。これは FlashLite が遅いのかな。au で FlashLite アニメーション、やけに遅いし。


以上、大変偏った視点で恐縮ですが、思うままに書きました。

Tagged with:
5月 02

ssh(1) と apache proxy を使って、ローカルの開発環境にケータイの実機ブラウザから直アクセスして動作確認する方法。ssh(1) の -R オプションを使うのがキモです。これだけで分かる人は、以下略でどうぞ。

ちょっと考えたらできそうな気はしてたんだけど、-R オプションの存在を知らなかったので、いろいろ試してみる時間が取れなかったのです。で、ふとマニュアル読んでたら -R オプションの存在を知り、やってみたらやっぱし簡単にできた、と。みんなやってるのかもだけど、あまりネット上で見かけない tips なのでポストします。

動作イメージ

(A)                  (B)                        (C)
携帯電話 ←────→ サーバ ←─────→ ローカル開発環境
http    80   13000    ssh    3000

まず、(C) の開発環境で Web アプリケーションを稼働させて、その後 (C) から (B) サーバへ ssh(1) で接続します。この際、-R オプションを指定し、(B) サーバの適当なポート(ここでは 13000)へのアクセスを、(C) の稼働環境 Listen ポート(ここでは 3000) にフォワードします。

次に、(B) サーバへの http アクセスを、(B) サーバ上ローカルの 13000 ポートにプロキシする設定をします。これで、(B) サーバへの http アクセスが、ssh のポートフォワード設定に渡されるようになります。

設定はこれだけ。あとは (A) の携帯ブラウザから (B) へ接続すれば、アクセスがローカル開発環境へ飛んできます。

用意するもの

上図の通り、(B) サーバとして使える インターネットから固定名もしくは固定IPでアクセスできて、わりと自由に使えるサーバ機 があれば、だいたいオッケーです。レンタルサーバでも良いですが、リモート側に開いたポートをローカルにフォワードするということをやるので、共用環境ではオススメしません。

ローカルの開発環境を見に来る、ということですので、ローカルには Web アプリケーションの稼働環境が入っている事が前提です。最近の気の利いたフレームワークは httpd や DB もセットになっててラクチンですね。

サーバ側の設定

上記 (B) サーバのアクセス名を example.com とします。

サーバ側には ssh 接続できる sshd と、適当な http プロキシの設定が必要です。僕は sshd に OpenSSH、http プロキシには Apache の mod_proxy を使いました。どちらもパッケージシステム等で簡単にインストールできます。

Apache のプロキシ設定は、以下のような感じです。httpd.conf など適当なところに書きます。

ProxyRequests Off
<VirtualHost *>
ServerName mobile.example.com
ProxyPass / http://localhost:13000/
ProxyPassReverse / http://localhost:13000/
</VirtualHost>

mobile.example.com の部分は、適当に読み替えてください。
要は ProxyPass を書くだけなので、Location とかで適当なパス以下をプロキシしても良いと思います。VirtualHost にしてるのは、アプリ内で指定するリンクのパスの書き方を初期から気にするのが面倒なのでルートを合わせたい、というだけ。

ここまで設定が終わったら $ apachectl graceful で適用して、サーバ側設定おわり。

ローカル開発環境側の設定

(C) のローカル側には ssh 接続クライアントが必要です。ssh クライアントが用意できたら、上記の (B) サーバに ssh するときのオプションとして -R を指定し、接続します。

$ ssh -R13000:127.0.0.1:3000 example.com

こんな感じ。-R オプションには、サーバ側で待ち受けるポート:フォワードする先のアドレス(接続元ネットワークで識別できるもの):フォワード先ポート を指定しています。127.0.0.1 のところには localhost と書いても良さそうなのですが、これだと僕の環境だとうまくいきませんでした。詳しくは $ man ssh をどうぞ。

携帯からアクセス確認

携帯のブラウザから、プロキシ設定した (B) サーバ(上記だと http://mobile.example.com/ )へ接続すると、ローカルの稼働環境にアクセスが飛んできます。ssh(1) スゲー。-R オプションスゲー。

うまくいかなかったら、ssh 接続した状態で (B) サーバから $ curl http://localhost:13000/ とかやって、ポートフォワードがちゃんと動いてるか、mod_proxy の設定がちゃんと生きているか、とかとか、確認してみてください。

おわりに

最近は携帯サイト開発向けのイカしたエミュレータが出てきてたりしてますし(Winソフトなので、使えてない Orz)、moxy やら ssb も超便利なので、あんまし面白くない tips かもしれません。が、ケータイサービス作ってると、やっぱし実機確認が、ツラくもあり面白くもあるフェーズだと、僕はおもいます。どうせパケット定額制使ってるんなら、がりがり実機確認しちゃえばいいじゃん、と。

手元の実機で目の前で作ってるアプリがすぐに見られるというのは、結構快感です。ちょっと出来上がってきたので実機で見ようかな、と思っても、デプロイ環境作るまでに一手間あって、そこでテンション下がることも多いです。手元でちまちま仕込みながらも、さくっと実機確認できる環境があるのはうれしいなあ、とやってみながらおもったのでした。

おお、最近ずっと書いてなかったからか、やけに真面目な文体になっている。なぜだ。

Tagged with:
3月 16

BeInteractive! の yossy さんの呼びかけで始まった、変態さんたちの集いに行ってきました。参加しただけで、しゃべるネタが用意できなくてごめんなさい。でも、皆さんのお話や飲み会での会話は、思ってた以上に楽しくて、思う存分ニヤニヤできました。ニヤニヤ。

では、例によってメモを転記。

BeInteractive! yossyさん

  • Shibuya.abc 誕生の理由
  • AVM2, FlexSDK オープン化の話
  • たまりんと戯れる話
    • ビルド。ソース入手。
    • zlib のパスを Makefile にいれとく
    • avmplus できる。
    • asc ひろってくる。ビルトインのabcをパスの通ったとこにおく
    • as プログラムかく。クラス単位である必要なし。
    • コマンドライン引数を取得するテスト
      • 引数は — をつけてやらないといけないらしい。
    • 標準入力を取得するテスト
    • 直接実行できるようにするテスト。binfmt_misc つーので avmplus へ渡せるとかなんとか@linux
    • – で引数書かなくてすむように、ラッパーのシェルスクリプトを書いてやるテスト
  • ServerSide AS3 .. CGI で動くようにする
    • GET引数はQueryStringに入る。でもenvが取れない。
      • AVM2 を拡張する。SystemClass に getEnv() 追加。内部的には getenv システム関数を呼ぶ
      • ビルド方法がむずかしそう。ながい
      • 同様にPOSTもとれる。取り出すときは、Content-Length とかちゃんとチェックしてやる。
    • 独自のWebフレームワークを使って、ゲストブックを作る
      • javac のときに -AS3 フラグが要るらしい
  • Flashと連携する。BlaseDSを使う。AMF通信。移植したらしい。なんと。
  • swfassist もサーバサイドで動いたとな

クジラ飛行机さん

  • FlashLite でうごく言語をつくる
    • 言語を作ると出勤が週2でよくなることもある
    • 電車でつくるプログラミング言語
    • FL2.0 をつかった。パーサジェネレータで自動生成。コンパイルはサーバサイドでやる。アセンブラだけつくる
    • swfmill, flasm, kmyacc .. swfmill は simple モードを使う
    • flasm は swf の中のアクションを書き換えるのに使う
    • swfmillでテンプレートswfを作る。kmyaccでパーサを作る。flasmでアクションを書き換える
    • kmyacc で文法を作る。calc.phpy っていうサンプルを改造していく
      • 実行コードの中に、計算結果を返す代わりに、flasm のアセンブラ表記に書き換える形にする
      • PRINT をサポートさせる。字句解析ルールを追加。
      • サーバサイド処理を作る。ソース入力に対してyyparse()を実行して、flmの中身を書き換えてアセンブルする
  • 「葵」.. FLashベース開発環境
  • 八角研究所で情報公開中。AIRの本も書いてるそうです

鴨志田さん

  • A=ord(“d”) でニヤニヤする話
  • よりコンパクトに
    • 直接 値を書くよりも、何か評価した結果を値にもっていくことで、その命令セットと合わせてもちっちゃくなるばあいがある
    • substring(A,1,1) よりも chr(ord(A))
    • 変数名を短くする。コンスタントプールが使えない FL1.1 では重要
    • eval で数字やら制御文字を渡してやって変数名にする事もできる。そうすると使える一文字変数の数がふえる!eval(“t”) = 123; とか。
    • FL1.x で $_VARSION みると、5 系っぽい。試してみたら 5 のアクションも使えた。Increment とか使えた。SWFヘッダは4にしとく必要あり。
    • 複数の値をいっぺんに Push して、Push のヘッダ部分を節約する話 .. FL1.x 系でもいけたらしい
      • 変数が入る場合はgetVarも必要。交換法則が適用できるかどうかチェック必要
    • if で || やら && を使うと、コードサイズが2の冪乗でコードサイズが増える。
      • 各論理値を他方の式に対してそれぞれ重複して生成してしまうためらしい。A || A || A || .. ってたくさんかくだけで swf が 100K こえる
  • より高速に
    • SetRegister した値をすぐ使う場合は、直後の pop, push は要らない
    • 1万回の push[null] からオーバヘッドを測定。ヘッダ部分で 1.5μsec くらい
    • サイズが減る=アクション数が減る場合は、たいてい高速になる

TAKESAKO さん

  • Flashアンチリバースエンジニアリング
    • ライセンス。オープンにされている情報の話
    • swf を頭から読んでいく話。可変長タグの「データが無ければ飛ばされる」データを節約してファイルサイズを下げる話
    • 境界ジャンプを使う。逆コンパイラがジャンプのフローを解析できないものが多い。ジャンプ先のコードが正しく読めない
      • このテクニックを自動化するツール as2lock

gyuque さん

  • Gnash ぐなっしゅの話。オープン実装の Flash プレイヤー
  • ubuntu だとパッケージで入るらしい。でもビルドする。gtk いれとかないと mozilla 対応できない
  • 実験台swfアニメーション: アニメーションは完璧ぽい。BGM が変
  • ゲームをやってみる。クリック効かない。gotoAndPlay 追加して強制スタート。ぐちゃぐちゃになった。
  • Gnash は youtube を意識している?Youtube 再生結構完璧にいける。シークできない。バッファリングできない。
  • ソースを覗く。ソースツリーの解説。
    • swf.h に AVM2 のオペコードの実装が進んでるぽい形跡が
    • ASHander.cpp に各アクションの実装。動く仕様書というかんじ。
  • AVM を書いてみる。命令の解釈や実行スコープ管理を俺実装するデモ。それ以外は既存のVMに渡す
    • mtasc でコンパイルして defineFunction2 を置き換える
    • VM の教科書として最適?

nitoyon さん

  • avmplus how-to
  • irb みたいのがほしい。いちいちコンパイルがめんどくさい
    • ソースの中に AVMPLUS_INTERACTIVE てのが。コメントとってリビルドすると使えるようになった。おおおおお
    • でも、実行毎の状態は保持できない.. 内部的には毎回コンパイルして実行してるみたい。
    • class Hoge() {} に失敗。Object のビルトインが読み込まれてないためらしい。.import でビルトインのabcを呼んでやればOK
    • Windows でしか動かないみたい
  • winQuery .. Windows で jQuery 、みたいな Windows アプリ。
    • $(“explorer.exe”).close() みたくやりたい
    • as3Query をベースにする。
    • Window の構造を DOM として捉えるとできるんじゃないか?という仮説。nodeName=window名、className=プロセス名みたいにしてみる
    • print($(“.explorer:root:visible”)) とかで、見えてはいけないウィンドウまで見えちゃってニヤニヤ
    • ウィンドウのパーツを取得して動的に書き換えるとか。
    • 裏側では Win32 な関数をいっぱい書いてる。avmplus ってスクリプトエンジンとしても使えるんですね

こんなかんじ。wiki の方には nishio さんが Ust 中継された動画もあるみたいですので、そちらもどうぞー。

yossy さん、お声がけありがとうございました。おかげで楽しめました :)
yossy さんとは、前に amachang さん繋がりの勉強会 で会っていたと思うんだけど、今回はお話するタイミングを逸してしまった。残念。

それから、休日にもかかわらず、勉強会の場所を提供いただけるサイボウズラボさんには感謝です。TAKESAKO さん、飲み会の取りまとめまで、ありがとうございました。

ではでは、次回 Shibuya.abc[d-z]+ を楽しみにしております!

Tagged with:
2月 27

Amazon Web Service の Simple DB を試してみたけど、なかなかリクエストの作成がうまくいかなくて、一回リクエストに成功したところで、明日も早いしもう寝るか、というポスト。へにょいリクエスト作成用の Ruby クラス付き。


Amazon Simple DB (以下、ASDB)
は Web ベースで利用できるデータベースサービス。REST やら SOAP やらでアクセスできる。利用には Amazon Web Service (以下、AWS) のアカウントと Simple DB サービスへのサインアップが必要。2007 年末くらいから公開されていたのだが、サインアップが遅れた (Limited Beta の) ため、順番待ちに入っていた。で、1 月末にようやく使えるようになった。
ちなみに、S3 やら EC2 と同じく従量課金。手軽にスケールアウトできそうな反面、規模によっちゃ実はそんなに安くないんじゃないの?とハマりそうではある。(EC2 立ち上げっぱなしで放置してたら $70/月 くらいかかった。)

ASDB では、Domain というデータセットのハコに Item という単位でレコードを追加していく。Item には Attribute という名前で属性を付加する事ができ、記録されているレコードには Query によりアクセスする事ができる。ちょっと強引に RDB のように解釈するなら、Domain がテーブル、Item がレコード、Attribute はカラムみたいなものだとおもう。

まず、REST の API を使って、上記でいう Domain を定義する CreateDomain アクションを試してみる。実際の利用には、AWS にサインアップして得られる AWS Access Key ID と AWS Secret Access Key が必要。

ASDB へのリクエストの構成要素は大まかに以下のような感じ。これを GET のパラメタに含める。

  • AWS Access Key ID
  • アクション
  • アクション毎に指定するオプションパラメタ
  • タイムスタンプ
  • APIバージョン
  • シグネチャバージョン
  • シグネチャ

ここで、最後のシグネチャは、以下のようにして作る。

  1. シグネチャ以外の構成要素 (AWS Access Key ID 〜 API バージョン) をキー名で昇順ソートする
  2. ソートしたペアのキーと値をセパレータとか付けずに単純に並べる
  3. 並べたパラメタを HMAC-SHA-1 にかけてメッセージダイジェストを得る。この時の秘密鍵に AWS Secret Access Key を指定する
  4. 得られたダイジェストを Base64 エンコードする
  5. 得られたエンコード文字列を更に URL エンコードする

このようにして得られたシグネチャを Signature 値としてリクエストに含める事で、ASDB がメッセージの正当性を確認してくれるというしくみ。

で、このリクエストを作成するクラスが以下のもの (AWSACCESSKEY やら AWSSECRETKEY はサインアップして得られるものを使う):

require 'openssl'
require 'base64'
require 'cgi'
class AmazonSimpleDb
BASEURI = 'https://sdb.amazonaws.com/?'
AWSACCESSKEY = 'Your AWS Access Key'
AWSSECRETKEY = 'Your AWS Secret Key'
def initialize
@params = Hash.new
@params.store('AWSAccessKeyId', AWSACCESSKEY)
@params.store('SignatureVersion', '1')
@params.store('Version', '2007-11-07')
end
def add_param(key, value)
@params.store(key, value)
end
def request_uri
uri = BASEURI
message = ''
(@params.sort_by { |x| x[0].downcase }).each do |e|
uri << "#{CGI.escape(e[0])}=#{CGI.escape(e[1])}&"
message << "#{e[0]}#{e[1]}"
end
hmac = OpenSSL::HMAC.new(AWSSECRETKEY, OpenSSL::Digest::SHA1.new)
hmac.update(message)
signature = CGI.escape(Base64.encode64(hmac.digest).chop)
uri << "Signature=#{signature}"
end
end

sort_by してるんで、Ruby は 1.8 以上で。パラメタは case-sensitive なのに、ソート時は case-insensitive だったり、生メッセージは URL エンコード不要だったり(そりゃそうか)、Base64 したら最後に改行文字が入ってたりにハマった。

これを AmazonSimpleDb.rb とかで保存して、以下のような感じで使う。タイムスタンプで指定してる日付は適当。DomainName に DoCoMo とか指定してるのは、機種情報 DB を作ってみようとしただけで、深い意味は無し。XXX やら YYY はダミーです。

$ irb -r 'AmazonSimpleDb'
irb(main):001:0> asdb = AmazonSimpleDb.new
=> #"2007-11-07", "AWSAccessKeyId"=>"XXXXXXXXXXXXXXXX", "SignatureVersion"=>"1"}>
irb(main):002:0> asdb.add_param('Action', 'CreateDomain')
=> "CreateDomain"
irb(main):003:0> asdb.add_param('DomainName', 'DoCoMo')
=> "DoCoMo"
irb(main):004:0> asdb.add_param('Timestamp', '2008-02-26T23:27:00-09:00')
=> "2008-02-26T23:27:00-09:00"
irb(main):005:0> asdb.request_uri
=> "https://sdb.amazonaws.com/?Action=CreateDomain&
AWSAccessKeyId=XXXXXXXXXXXXXXXX&
DomainName=DoCoMo&
SignatureVersion=1&
Timestamp=2008-02-26T23%3A27%3A00-09%3A00&
Version=2007-11-07&
Signature=YYYYYYYYYYYY" (実際は一行)

得られた request_uri にブラウザとか適当な https が行けるクライアントからリクエストを投げれば XML で結果が返ってくる。net/http でアクセスするところはまだ作ってない。ていうか、まだ PutAttributes も Query も試してないし。これでバッコンバッコンリクエスト投げたらいくら請求くるんだろう。。誰かやってみたひと居ないかな..

参考:

Tagged with: