preload
5月 19

SwfRuby 初の利用事例のご紹介です。(すみません!エントリタイトルなど一部ドリコム様社名を誤って表記してしまっていました。お詫びして訂正します。05/19 14:15)

先日、ふと swfruby でググってみたら検索結果に以下のような記事がありました(検索結果を定点観測するのを失念していたのです)。

デブサミ2011レポート 数十~数百億PVのトラフィックをさばく、ソーシャルアプリのインフラ現場の実情:CodeZine

Flash Liteの動的生成については、「FlamixierというPHP拡張モジュールを自社で開発して利用している」(安井氏)「swfmillやswfrubyで生成している」(大仲氏)。

で、気になって、 twitter でつぶやいてみたら、ドリコム様のなかのかたからお返事をいただけました!

ドリコムでFlashLite動的生成に使ってるswfrubyって僕のつくったやつかなあ。同名の別のライブラリがあったのかしらん。 http://bit.ly/l1eKvk
@tmtysk
tmtysk
@ あ,貴殿のです!大変お世話になっております><
@onk
Takafumi Onaka
@ わぁっ、ほんとですか!嬉しいです!がんばってメンテします!ご連絡ありがとうございます.よかったらブログなどでも紹介させてくださいませ
@tmtysk
tmtysk
@ はーい,ぜひお願いします!うちのアプリだと「ビックリマン」と「ソード×ソード」で使わせていただいています。今時点で GREE の全体ランキング 3 位と 12 位なので結構処理数多いと思う。
@onk
Takafumi Onaka

いやー、めちゃめちゃ嬉しいです。今みてみたら、「ビックリマン」と「ソードxソード」、全体ランキング4位と9位でした! 人気のゲームなのですね。

SwfRuby、マニアックなライブラリということもあってか、これまで一度も利用事例を聞いたことはなかったのですが.. こんな大規模なサービスでの利用実績が聞けるなんて、とても嬉しいです。

@onkさん、つぶやきにご丁寧にご返信くださいまして、ありがとうございました!

Tagged with:
4月 27

SwfRuby を version-0.2.0 にバージョンアップして、AS変数の値の書き換えと、ムービークリップの入れ替えをできるようにしてみました。$ gem install swf_ruby でインストール可能。ruby-1.8.7, 1.9.2 で動作確認をおこなっています。ライセンスの変更はありません(GPL2)。インタフェースレベルでの後方互換性は確保しているつもりですが、swf_dumper の出力フォーマットが変更されていますので、このコマンドの実行結果をパースするような実装をされている方はご注意ください。

今回のバージョンアップにより、新たなコマンド、swf_as_var_replace, swf_sprite_replace が利用可能となります。それぞれ、AS変数の置換とムービークリップの置換を SWF のバイナリレベルでおこないます。バイナリ書き換えなので、非常に高速に動作します。

それぞれのコマンドの実装を読んでいただければ、アプリケーション内で書き換えをおこなう際の実装方法も、なんとなく掴めるかとおもいます。基本的な使用方法は、これまでのバージョン同様、元の SWF バイナリと、SwfRuby::ReplaceTarget オブジェクトの配列を SwfRuby::SwfTamperer に渡すという流れになります。

なお、手元の VM 環境では、20KB程度のベース SWF に対し、2件のAS変数と3件のムービークリップ(1KB未満のビットマップが貼ってあるだけのもの)の書き換えを1000回連続実行し、実行時間を測定してみたところ、0.252sec という結果が得られました(書き換え前後の SWF 素材を読出/書込するためのファイルシステムとのI/O時間は含みません)。1件当たり 1msec 以下での書き換えが実現できていることになります。

また、ムービークリップの差し替えができるようになったことにより、Jpeg 素材やビットマップ素材を、swftools などの外部ツールで SWF に変換しておくことで、画像変換処理のオーバーヘッドを事前に解決しておくことができるようになりました。ムービークリップの置き換えは、ステージに設置する際のインスタンス変数名を指定して、対象のムービークリップを差し替えるという処理になっていますので、ベースの SWF を制作する際にうまくルール決めができれば、同期的にRMagick(ImageMagick)を使用する必要すらありません。画像素材差し替え処理のコストを大きく削減することができるとおもいます。

やりたいことだけを実現するために、SWF 内要素の細かいパース処理など端折ったり、仕様を割り切ったりしている部分も残っています。適当にお楽しみくださいませ。

Tagged with:
5月 11

自分で本を書いてみると、売れ行きや評価などはそれなりに気になるもので、ちょくちょく Amazon.co.jp の商品ページやらブログ検索などを見に行ってしまうのですが、せっかくなので、そういうニッチなニーズに応えられるサービスでも作ってみるかと思いたちました。以下の URL で個人サービスとして公開しています。

Amazon SalesRank Tracker α version(サーバ移転中につき、現在停止中)

Screenshot-25

あらかじめ書籍を登録しておくと、登録済みのカテゴリ内での表示順や、Amazon.co.jp ランキングの情報を追跡・記録、それに Twitter やソーシャルブックマーク、ブログ検索結果などをひとまとめにしたダッシュボード画面を作成します。

最初はAWSのAPI経由でごにょごにょしていたのですが、ランキング情報がサイトで見られるものと微妙に違っていたり、そもそもAPIの利用規約的にアレだったりするところもあったので、いろいろ調整&データの素性がわかる範囲でまとめました。道楽で作っているので、今ひとつ足りない機能や不具合などあるかもしれませんが、よろしければご利用ください。

なお、本サービスの稼働環境は暫定的なものなので、あくまでアルファ版です。突然、終了するかもしれませんのでご了承ください。

ちなみに、下記書籍、連休中は在庫切れになっていたようですが、現在は在庫が回復しているようです。こちらも引き続きよろしくお願いいたします。

ところで、作る前に探した感じではこういったサービスが無いように感じたのですが、作った後で探したら、似たような商用サービスや海外サービスがいっぱいありました。。けど、ランキング情報以外の情報もダッシュボード的にまとめてくるっていうのが欲しかったので、まあいいか、と納得することにします。作ってるのも面白かったし。(実はニフティクラウドのモニターアカウントをいただいていたので、それの実験サイトでもありました。といっても、これといってあんまし時間取れなくて、実験らしいことはできなかったですが。。コントロールパネルは使いやすかったです(それだけか))

Tagged with:
4月 24

このたび「Rails で携帯サイトを作る」という趣旨の解説書の執筆に参加させていただきました。共著者のお二方、お声がけいただいた編集者様には、大変お世話になりました。このたびは、ご一緒させていただき、ありがとうございました。

いわゆる「スマートフォン」向けサイト開発の解説書ではありません。iPhone も android も出てきません。あまり好きな表現では無いですが、あえて言えば「ガラケー」サイト開発の解説書です。

今さら?という声も聞こえてきそうですが、僕は、ある意味良いタイミングだったかも、と思ってます。まだまだ今の状況では「スマートフォン」サイトに(堅実に)お金をかけられるところは少ないという印象ですし、一方で「ガラケー」は「ガラケー」で、わりと基本的なところは変わらなくなってきつつありますし。

個人的には「ガラケー」に固執するつもりはさらさらないですし、かといって今すぐ「スマートフォン」に飛びついてズッポリ浸かりたいというノリでもない感じです。が、まあ、一方で、僕は「ケータイ」がわりと好きなので、どっちにせよ、携帯向けサービスを Ruby/Rails で作っちゃおうぜ、という流れが少しでも広がると、周りから楽しいサービスが生まれていったり、便利なライブラリやノウハウが蓄積されていったりで、そしたら僕もずっと楽しく Ruby と付き合っていけたりで嬉しいので、そんなきっかけになればいいなーと思いながら書きました。

ちなみに、僕はメールに関する章と、Flash Lite に関する章を書きました。Flash Lite の章は Rails からだいぶ離れた話題になっていますが、昨今の携帯サイトを作るという意味では外せない話題だったと思います。概要だけとはいえ、 SWF の内部構造やら、(Flash Liteの各種制限に着目しつつ)オープンソースソフトウェアを併用した SWF のサーバサイドでの生成について扱っている書籍は、他にあまり見ないな、と思いますです。(Flash Liteに限らなければ洋書では何冊かあるのですが。)

あとは、これに動画/音楽系サイト、オートGPS、モバイル向けソーシャルアプリとかの話が加えられるとさらに良かったかな、と思いますが、その辺の話はまだまだ非公開部分が多いので何ともですね。テスト周りが書けなかったのは惜しかったかな。とはいえ、そこそこ守備範囲の広い内容になっていると思います。

最後に、Flash Lite の章で、ページの都合で載せられなかった幾つかのコラムについて、許可をいただいたので、こちらに紹介しておきます。(ちょっと文脈が無いと意味わかんないところがありますが、Flash Lite の章は、こういう文章が途中に入るような内容になっているとご想像いただく材料になれば。)

コラム 利用できるActionScriptバージョンに注意

ActionScriptはFlashプレーヤおよびFlash Liteプレーヤ上で動作するスクリプト言語で、よりインタラクティブなFlashコンテンツを制作するうえで欠かせない存在です。本書執筆時点の最新バージョンは3.0(Flash Liteプレーヤでは利用不可)です。Flashプレーヤのバージョンアップに伴い、ActionScriptの言語仕様やプログラミング環境/実行環境は大きく様変わりしてきています。表7-1で示した通り、Flash Liteバージョンを決定することは、利用できるActionScriptバージョンを決定することにもなりますので、対象のFlash Liteプレーヤバージョンを選択する際は、注意しておきましょう。

コラム Flash Liteコンテンツ内での絵文字利用

バージョン/キャリアによっては、Flash Liteコンテンツ内で各キャリアの絵文字を利用できます。ただし、(本書でこれまで紹介してきた通り)絵文字の表記方法はキャリア別に異なりますし、上記で示した通り、プレーヤバージョンごとに利用できる文字符号化方式も異なっていますので、絵文字の利用には十分に注意が必要です。

コラム SWFの動的生成はボトルネックになりやすい

本章では、swfmillを利用した “元のSWF→元のXML→書き換え後XML→書き換え後SWF”というSWF動的生成の一連の流れを紹介しました。しかしながら、swfmillの利用やXMLの解析/書き換え処理は、それなりに時間のかかる処理ですので、Webアプリケーション内でこれらの処理を実行する際は注意が必要です。必要に応じて、書き換え後のXMLやSWFをキャッシュしたり、非同期(バッチ)処理でSWFを生成したりといった方策、あるいは、より用途に見合ったswfmill以外のソフトウェアの利用も検討すると良いでしょう。

ところで、Amazon.co.jp からも案内が来てました。笑

Screenshot-24

Tagged with:
7月 27

SwfmillRubyで32bit版PNGに暫定対応しました

Ruby コメントは受け付けていません。

先日、SwfmillRuby に hokaccha さんのブランチをマージしました。hokaccha さんのブランチでは、32bit png の image2xml に対応いただいておりましたが、これに xml2image の処理を追加実装しています。これにより、32bit png (DefineBitsLossless2 の image format=5) に暫定対応しました。

ただし、今回追加実装した xml2image は、透過色を含む PNG の扱いについて完全ではないので、あくまで暫定対応という位置づけです。32bit png を SWF 内部のビットマップに変換する際に RMagick(ImageMagick) を経由して得られる各ピクセルの情報と、Flash IDE がパブリッシュするビットマップの各ピクセルの情報とで、微妙に誤差が出てしまっており、現時点で、Flash IDE が出力するビットマップデータと完全に一致させる事ができていません。

具体的には、DefineBitsLossless2 の ARGB データから RMagick::Image の png イメージを作成する部分が怪しい感じです。確証はないのですが、どうも、SWF File Format Specification にある:

The RGB data must already be multiplied by the alpha channel value.

の “multiplied” の解釈が単なる乗算ではないみたいような気がしています(除算で逆変換しても適当な数値にならないのです)。今のところ、幾つか透過色を含む PNG で動作検証してみた限りでは、ここを逆変換する際に、RGB それぞれの値と opacity との OR を取る事で、元のイメージの再現性がある程度確認できたので、ひとまずこの方法で実装してみました。何か勘違いしている気がしないでもないのですが、、お気づきの方、コメントいただけると幸いです。

ちなみに、上記の更新以外でも、partialize や templatize の機能を追加し、partizlize や templatize において、SWF を再生成(regenerate)する際の XML 処理コストを少しでも削減するための事前処理をおこなえるように改修を続けています。これは、ちょっと複雑な SWF の動的生成/書き換え/合成をしようとすると、再生成に XML 中の ID 体系を付け替えたり、要素を入れ替えたりといった処理のコストがとても大きくなる事がわかってきたからです。詳しくドキュメントを書く時間が取れていないのですが、サンプルやソースコードコメントから意図を汲んでいただけると幸いです。(少なくとも FlashLite 1.1 の携帯サイト向けには、わりと面白い事ができるくらいのものにはなってきていると思います。)

まだ公開して間もない SwfmillRuby ですが、いつの間にか、いくつかの方面からご利用のご連絡をいただいており、とても励みになっております。ライセンス上、ご利用のご連絡は必須ではありませんが、よろしければご利用コメントやご意見などお寄せいただければとうれしいです!

Tagged with: