<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>tmty.jp</title>
	<atom:link href="http://tmty.jp/feed/" rel="self" type="application/rss+xml" />
	<link>http://tmty.jp</link>
	<description>tmtysk が前よりも更新しなくなってしまっているブログ</description>
	<lastBuildDate>Thu, 15 Dec 2011 16:17:13 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
<link rel="http://api.friendfeed.com/2008/03#sup" xmlns="http://www.w3.org/2005/Atom" type="application/json" href="http://friendfeed.com/api/public-sup.json#fdff53faaa"/>		<item>
		<title>SwfRuby がドリコム様ご提供のソーシャルアプリで使用されているそうです</title>
		<link>http://tmty.jp/2011/05/19/swf_ruby_use_case/</link>
		<comments>http://tmty.jp/2011/05/19/swf_ruby_use_case/#comments</comments>
		<pubDate>Wed, 18 May 2011 15:02:55 +0000</pubDate>
		<dc:creator>tmtysk</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[FlashLite]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[SwfRuby]]></category>
		<category><![CDATA[UseCase]]></category>

		<guid isPermaLink="false">http://tmty.jp/?p=454</guid>
		<description><![CDATA[SwfRuby 初の利用事例のご紹介です。(すみません！エントリタイトルなど一部ドリコム様社名を誤って表記してしまっていました。お詫びして訂正します。05/19 14:15) 先日、ふと swfruby でググってみたら [...]]]></description>
			<content:encoded><![CDATA[<span class="read_later"><script type="text/javascript"><!--
			instapaper_embed( "http://tmty.jp/2011/05/19/swf_ruby_use_case/", "SwfRuby がドリコム様ご提供のソーシャルアプリで使用されているそうです", "" );
		//--></script></span><p>SwfRuby 初の利用事例のご紹介です。(すみません！エントリタイトルなど一部ドリコム様社名を誤って表記してしまっていました。お詫びして訂正します。05/19 14:15)</p>
<p>先日、ふと swfruby でググってみたら検索結果に以下のような記事がありました(検索結果を定点観測するのを失念していたのです)。</p>
<blockquote><p><a href="http://codezine.jp/article/detail/5794">デブサミ2011レポート　数十～数百億PVのトラフィックをさばく、ソーシャルアプリのインフラ現場の実情：CodeZine</a></p>
<p>Flash Liteの動的生成については、「FlamixierというPHP拡張モジュールを自社で開発して利用している」（安井氏）「swfmillや<strong>swfruby</strong>で生成している」（大仲氏）。</p></blockquote>
<p>で、気になって、 twitter でつぶやいてみたら、ドリコム様のなかのかたからお返事をいただけました！</p>
<!-- tweet id : 68889673078026242 --><style type='text/css'>#bbpBox_68889673078026242 a { text-decoration:none; color:#0000ff; }#bbpBox_68889673078026242 a:hover { text-decoration:underline; }</style><div id='bbpBox_68889673078026242' class='bbpBox' style='padding:20px; margin:5px 0; background-color:#9ae4e8; background-image:url(http://a3.twimg.com/images/themes/theme1/bg.png); background-repeat:no-repeat'><div style='background:#fff; padding:10px; margin:0; min-height:48px; color:#000000; -moz-border-radius:5px; -webkit-border-radius:5px;'><span style='width:100%; font-size:18px; line-height:22px;'>&#12489;&#12522;&#12467;&#12512;&#12391;FlashLite&#21205;&#30340;&#29983;&#25104;&#12395;&#20351;&#12387;&#12390;&#12427;swfruby&#12387;&#12390;&#20693;&#12398;&#12388;&#12367;&#12387;&#12383;&#12420;&#12388;&#12363;&#12394;&#12354;&#12290;&#21516;&#21517;&#12398;&#21029;&#12398;&#12521;&#12452;&#12502;&#12521;&#12522;&#12364;&#12354;&#12387;&#12383;&#12398;&#12363;&#12375;&#12425;&#12435;&#12290; <a href="http://bit.ly/l1eKvk" rel="nofollow">http://bit.ly/l1eKvk</a></span><div class='bbp-actions' style='font-size:12px; width:100%; padding:5px 0; margin:0 0 10px 0; border-bottom:1px solid #e6e6e6;'><img align='middle' src='http://tmty.jp/wp-content/plugins/twitter-blackbird-pie//images/bird.png' /><a title='tweeted on 2011 年 5 月 13 日 13:05' href='http://twitter.com/#!/tmtysk/status/68889673078026242' target='_blank'>2011 年 5 月 13 日 13:05</a> via <a href="http://www.misuzilla.org/dist/net/twitterircgateway/" rel="nofollow" target="blank">TweetIrcGateway</a><a href='https://twitter.com/intent/tweet?in_reply_to=68889673078026242' class='bbp-action bbp-reply-action' title='Reply'><span><em style='margin-left: 1em;'></em><strong>Reply</strong></span></a><a href='https://twitter.com/intent/retweet?tweet_id=68889673078026242' class='bbp-action bbp-retweet-action' title='Retweet'><span><em style='margin-left: 1em;'></em><strong>Retweet</strong></span></a><a href='https://twitter.com/intent/favorite?tweet_id=68889673078026242' class='bbp-action bbp-favorite-action' title='Favorite'><span><em style='margin-left: 1em;'></em><strong>Favorite</strong></span></a></div><div style='float:left; padding:0; margin:0'><a href='http://twitter.com/intent/user?screen_name=tmtysk'><img style='width:48px; height:48px; padding-right:7px; border:none; background:none; margin:0' src='http://a0.twimg.com/profile_images/1184748898/bigger_normal.jpg' /></a></div><div style='float:left; padding:0; margin:0'><a style='font-weight:bold' href='http://twitter.com/intent/user?screen_name=tmtysk'>@tmtysk</a><div style='margin:0; padding-top:2px'>tmtysk</div></div><div style='clear:both'></div></div></div><!-- end of tweet -->
<!-- tweet id : 68913132919209986 --><style type='text/css'>#bbpBox_68913132919209986 a { text-decoration:none; color:#009999; }#bbpBox_68913132919209986 a:hover { text-decoration:underline; }</style><div id='bbpBox_68913132919209986' class='bbpBox' style='padding:20px; margin:5px 0; background-color:#131516; background-image:url(http://a1.twimg.com/profile_background_images/159553067/monkeys-in-trees.jpg);'><div style='background:#fff; padding:10px; margin:0; min-height:48px; color:#333333; -moz-border-radius:5px; -webkit-border-radius:5px;'><span style='width:100%; font-size:18px; line-height:22px;'>@<a href="http://twitter.com/intent/user?screen_name=tmtysk" class="twitter-action">tmtysk</a> &#12354;&#65292;&#36020;&#27583;&#12398;&#12391;&#12377;&#65281;&#22823;&#22793;&#12362;&#19990;&#35441;&#12395;&#12394;&#12387;&#12390;&#12362;&#12426;&#12414;&#12377;&#65310;&#65308;</span><div class='bbp-actions' style='font-size:12px; width:100%; padding:5px 0; margin:0 0 10px 0; border-bottom:1px solid #e6e6e6;'><img align='middle' src='http://tmty.jp/wp-content/plugins/twitter-blackbird-pie//images/bird.png' /><a title='tweeted on 2011 年 5 月 13 日 14:39' href='http://twitter.com/#!/onk/status/68913132919209986' target='_blank'>2011 年 5 月 13 日 14:39</a> via web<a href='https://twitter.com/intent/tweet?in_reply_to=68913132919209986' class='bbp-action bbp-reply-action' title='Reply'><span><em style='margin-left: 1em;'></em><strong>Reply</strong></span></a><a href='https://twitter.com/intent/retweet?tweet_id=68913132919209986' class='bbp-action bbp-retweet-action' title='Retweet'><span><em style='margin-left: 1em;'></em><strong>Retweet</strong></span></a><a href='https://twitter.com/intent/favorite?tweet_id=68913132919209986' class='bbp-action bbp-favorite-action' title='Favorite'><span><em style='margin-left: 1em;'></em><strong>Favorite</strong></span></a></div><div style='float:left; padding:0; margin:0'><a href='http://twitter.com/intent/user?screen_name=onk'><img style='width:48px; height:48px; padding-right:7px; border:none; background:none; margin:0' src='http://a1.twimg.com/profile_images/1117240100/onk_120_normal.png' /></a></div><div style='float:left; padding:0; margin:0'><a style='font-weight:bold' href='http://twitter.com/intent/user?screen_name=onk'>@onk</a><div style='margin:0; padding-top:2px'>Takafumi Onaka</div></div><div style='clear:both'></div></div></div><!-- end of tweet -->
<!-- tweet id : 68918329653469184 --><style type='text/css'>#bbpBox_68918329653469184 a { text-decoration:none; color:#0000ff; }#bbpBox_68918329653469184 a:hover { text-decoration:underline; }</style><div id='bbpBox_68918329653469184' class='bbpBox' style='padding:20px; margin:5px 0; background-color:#9ae4e8; background-image:url(http://a3.twimg.com/images/themes/theme1/bg.png); background-repeat:no-repeat'><div style='background:#fff; padding:10px; margin:0; min-height:48px; color:#000000; -moz-border-radius:5px; -webkit-border-radius:5px;'><span style='width:100%; font-size:18px; line-height:22px;'>@<a href="http://twitter.com/intent/user?screen_name=onk" class="twitter-action">onk</a> &#12431;&#12353;&#12387;&#12289;&#12411;&#12435;&#12392;&#12391;&#12377;&#12363;&#65281;&#23305;&#12375;&#12356;&#12391;&#12377;&#65281;&#12364;&#12435;&#12400;&#12387;&#12390;&#12513;&#12531;&#12486;&#12375;&#12414;&#12377;&#65281;&#12372;&#36899;&#32097;&#12354;&#12426;&#12364;&#12392;&#12358;&#12372;&#12374;&#12356;&#12414;&#12377;.&#12424;&#12363;&#12387;&#12383;&#12425;&#12502;&#12525;&#12464;&#12394;&#12393;&#12391;&#12418;&#32057;&#20171;&#12373;&#12379;&#12390;&#12367;&#12384;&#12373;&#12356;&#12414;&#12379;</span><div class='bbp-actions' style='font-size:12px; width:100%; padding:5px 0; margin:0 0 10px 0; border-bottom:1px solid #e6e6e6;'><img align='middle' src='http://tmty.jp/wp-content/plugins/twitter-blackbird-pie//images/bird.png' /><a title='tweeted on 2011 年 5 月 13 日 14:59' href='http://twitter.com/#!/tmtysk/status/68918329653469184' target='_blank'>2011 年 5 月 13 日 14:59</a> via <a href="http://www.misuzilla.org/dist/net/twitterircgateway/" rel="nofollow" target="blank">TweetIrcGateway</a><a href='https://twitter.com/intent/tweet?in_reply_to=68918329653469184' class='bbp-action bbp-reply-action' title='Reply'><span><em style='margin-left: 1em;'></em><strong>Reply</strong></span></a><a href='https://twitter.com/intent/retweet?tweet_id=68918329653469184' class='bbp-action bbp-retweet-action' title='Retweet'><span><em style='margin-left: 1em;'></em><strong>Retweet</strong></span></a><a href='https://twitter.com/intent/favorite?tweet_id=68918329653469184' class='bbp-action bbp-favorite-action' title='Favorite'><span><em style='margin-left: 1em;'></em><strong>Favorite</strong></span></a></div><div style='float:left; padding:0; margin:0'><a href='http://twitter.com/intent/user?screen_name=tmtysk'><img style='width:48px; height:48px; padding-right:7px; border:none; background:none; margin:0' src='http://a0.twimg.com/profile_images/1184748898/bigger_normal.jpg' /></a></div><div style='float:left; padding:0; margin:0'><a style='font-weight:bold' href='http://twitter.com/intent/user?screen_name=tmtysk'>@tmtysk</a><div style='margin:0; padding-top:2px'>tmtysk</div></div><div style='clear:both'></div></div></div><!-- end of tweet -->
<!-- tweet id : 68922551337889792 --><style type='text/css'>#bbpBox_68922551337889792 a { text-decoration:none; color:#009999; }#bbpBox_68922551337889792 a:hover { text-decoration:underline; }</style><div id='bbpBox_68922551337889792' class='bbpBox' style='padding:20px; margin:5px 0; background-color:#131516; background-image:url(http://a1.twimg.com/profile_background_images/159553067/monkeys-in-trees.jpg);'><div style='background:#fff; padding:10px; margin:0; min-height:48px; color:#333333; -moz-border-radius:5px; -webkit-border-radius:5px;'><span style='width:100%; font-size:18px; line-height:22px;'>@<a href="http://twitter.com/intent/user?screen_name=tmtysk" class="twitter-action">tmtysk</a> &#12399;&#12540;&#12356;&#65292;&#12380;&#12402;&#12362;&#39000;&#12356;&#12375;&#12414;&#12377;&#65281;&#12358;&#12385;&#12398;&#12450;&#12503;&#12522;&#12384;&#12392;&#12300;&#12499;&#12483;&#12463;&#12522;&#12510;&#12531;&#12301;&#12392;&#12300;&#12477;&#12540;&#12489;&#215;&#12477;&#12540;&#12489;&#12301;&#12391;&#20351;&#12431;&#12379;&#12390;&#12356;&#12383;&#12384;&#12356;&#12390;&#12356;&#12414;&#12377;&#12290;&#20170;&#26178;&#28857;&#12391; GREE &#12398;&#20840;&#20307;&#12521;&#12531;&#12461;&#12531;&#12464; 3 &#20301;&#12392; 12 &#20301;&#12394;&#12398;&#12391;&#32080;&#27083;&#20966;&#29702;&#25968;&#22810;&#12356;&#12392;&#24605;&#12358;&#12290;</span><div class='bbp-actions' style='font-size:12px; width:100%; padding:5px 0; margin:0 0 10px 0; border-bottom:1px solid #e6e6e6;'><img align='middle' src='http://tmty.jp/wp-content/plugins/twitter-blackbird-pie//images/bird.png' /><a title='tweeted on 2011 年 5 月 13 日 15:16' href='http://twitter.com/#!/onk/status/68922551337889792' target='_blank'>2011 年 5 月 13 日 15:16</a> via web<a href='https://twitter.com/intent/tweet?in_reply_to=68922551337889792' class='bbp-action bbp-reply-action' title='Reply'><span><em style='margin-left: 1em;'></em><strong>Reply</strong></span></a><a href='https://twitter.com/intent/retweet?tweet_id=68922551337889792' class='bbp-action bbp-retweet-action' title='Retweet'><span><em style='margin-left: 1em;'></em><strong>Retweet</strong></span></a><a href='https://twitter.com/intent/favorite?tweet_id=68922551337889792' class='bbp-action bbp-favorite-action' title='Favorite'><span><em style='margin-left: 1em;'></em><strong>Favorite</strong></span></a></div><div style='float:left; padding:0; margin:0'><a href='http://twitter.com/intent/user?screen_name=onk'><img style='width:48px; height:48px; padding-right:7px; border:none; background:none; margin:0' src='http://a1.twimg.com/profile_images/1117240100/onk_120_normal.png' /></a></div><div style='float:left; padding:0; margin:0'><a style='font-weight:bold' href='http://twitter.com/intent/user?screen_name=onk'>@onk</a><div style='margin:0; padding-top:2px'>Takafumi Onaka</div></div><div style='clear:both'></div></div></div><!-- end of tweet -->
<p>いやー、めちゃめちゃ嬉しいです。今みてみたら、「ビックリマン」と「ソードｘソード」、全体ランキング4位と9位でした！ 人気のゲームなのですね。</p>
<p>SwfRuby、マニアックなライブラリということもあってか、これまで一度も利用事例を聞いたことはなかったのですが.. こんな大規模なサービスでの利用実績が聞けるなんて、とても嬉しいです。</p>
<p>@onkさん、つぶやきにご丁寧にご返信くださいまして、ありがとうございました！<br/><br/><strong>関連していそうなエントリ:</strong>
<ul class="similar-posts">
<li><a href="http://tmty.jp/2011/04/27/updated_swf_ruby/" rel="bookmark" title="2011 年 4 月 27 日">SwfRuby バージョンアップ &#8211; AS変数とムービークリップの置換ができるようになりました</a></li>
<li><a href="http://tmty.jp/2011/01/13/released_swf_ruby/" rel="bookmark" title="2011 年 1 月 13 日">SwfRuby &#8211; SWFバイナリを直接操作して構造解析/リソース置換するためのRubyライブラリをリリースしました</a></li>
<li><a href="http://tmty.jp/2009/05/08/shared_swfmill_ruby/" rel="bookmark" title="2009 年 5 月 8 日">SwfmillでFlashLite用SWFの画像やテキストを操作するRubyライブラリ SwfmillRuby</a></li>
</ul>
<p><!-- Similar Posts took 26.372 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://tmty.jp/2011/05/19/swf_ruby_use_case/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SwfRuby バージョンアップ &#8211; AS変数とムービークリップの置換ができるようになりました</title>
		<link>http://tmty.jp/2011/04/27/updated_swf_ruby/</link>
		<comments>http://tmty.jp/2011/04/27/updated_swf_ruby/#comments</comments>
		<pubDate>Wed, 27 Apr 2011 07:28:51 +0000</pubDate>
		<dc:creator>tmtysk</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[FlashLite]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[SwfRuby]]></category>

		<guid isPermaLink="false">http://tmty.jp/?p=445</guid>
		<description><![CDATA[SwfRuby を version-0.2.0 にバージョンアップして、AS変数の値の書き換えと、ムービークリップの入れ替えをできるようにしてみました。$ gem install swf_ruby でインストール可能。r [...]]]></description>
			<content:encoded><![CDATA[<span class="read_later"><script type="text/javascript"><!--
			instapaper_embed( "http://tmty.jp/2011/04/27/updated_swf_ruby/", "SwfRuby バージョンアップ &#8211; AS変数とムービークリップの置換ができるようになりました", "" );
		//--></script></span><p><a href="http://rubygems.org/gems/swf_ruby" target="_blank">SwfRuby</a> を version-0.2.0 にバージョンアップして、AS変数の値の書き換えと、ムービークリップの入れ替えをできるようにしてみました。$ gem install swf_ruby でインストール可能。ruby-1.8.7, 1.9.2 で動作確認をおこなっています。ライセンスの変更はありません(GPL2)。インタフェースレベルでの後方互換性は確保しているつもりですが、swf_dumper の出力フォーマットが変更されていますので、このコマンドの実行結果をパースするような実装をされている方はご注意ください。</p>
<p>今回のバージョンアップにより、新たなコマンド、swf_as_var_replace, swf_sprite_replace が利用可能となります。それぞれ、AS変数の置換とムービークリップの置換を SWF のバイナリレベルでおこないます。バイナリ書き換えなので、非常に高速に動作します。</p>
<p>それぞれのコマンドの実装を読んでいただければ、アプリケーション内で書き換えをおこなう際の実装方法も、なんとなく掴めるかとおもいます。基本的な使用方法は、これまでのバージョン同様、元の SWF バイナリと、SwfRuby::ReplaceTarget オブジェクトの配列を SwfRuby::SwfTamperer に渡すという流れになります。</p>
<p>なお、手元の VM 環境では、20KB程度のベース SWF に対し、2件のAS変数と3件のムービークリップ(1KB未満のビットマップが貼ってあるだけのもの)の書き換えを1000回連続実行し、実行時間を測定してみたところ、0.252sec という結果が得られました（書き換え前後の SWF 素材を読出/書込するためのファイルシステムとのI/O時間は含みません）。1件当たり 1msec 以下での書き換えが実現できていることになります。</p>
<p>また、ムービークリップの差し替えができるようになったことにより、Jpeg 素材やビットマップ素材を、swftools などの外部ツールで SWF に変換しておくことで、画像変換処理のオーバーヘッドを事前に解決しておくことができるようになりました。ムービークリップの置き換えは、ステージに設置する際のインスタンス変数名を指定して、対象のムービークリップを差し替えるという処理になっていますので、ベースの SWF を制作する際にうまくルール決めができれば、同期的にRMagick(ImageMagick)を使用する必要すらありません。画像素材差し替え処理のコストを大きく削減することができるとおもいます。</p>
<p>やりたいことだけを実現するために、SWF 内要素の細かいパース処理など端折ったり、仕様を割り切ったりしている部分も残っています。適当にお楽しみくださいませ。<br/><br/><strong>関連していそうなエントリ:</strong>
<ul class="similar-posts">
<li><a href="http://tmty.jp/2009/05/28/updated_swfmillruby/" rel="bookmark" title="2009 年 5 月 28 日">SwfmillRuby でムービークリップの入れ替えができるようにしてみた</a></li>
<li><a href="http://tmty.jp/2011/05/19/swf_ruby_use_case/" rel="bookmark" title="2011 年 5 月 19 日">SwfRuby がドリコム様ご提供のソーシャルアプリで使用されているそうです</a></li>
<li><a href="http://tmty.jp/2011/01/13/released_swf_ruby/" rel="bookmark" title="2011 年 1 月 13 日">SwfRuby &#8211; SWFバイナリを直接操作して構造解析/リソース置換するためのRubyライブラリをリリースしました</a></li>
</ul>
<p><!-- Similar Posts took 32.959 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://tmty.jp/2011/04/27/updated_swf_ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SwfRuby &#8211; SWFバイナリを直接操作して構造解析/リソース置換するためのRubyライブラリをリリースしました</title>
		<link>http://tmty.jp/2011/01/13/released_swf_ruby/</link>
		<comments>http://tmty.jp/2011/01/13/released_swf_ruby/#comments</comments>
		<pubDate>Thu, 13 Jan 2011 03:25:21 +0000</pubDate>
		<dc:creator>tmtysk</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[FlashLite]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[SwfmillRuby]]></category>
		<category><![CDATA[SwfRuby]]></category>

		<guid isPermaLink="false">http://tmty.jp/?p=430</guid>
		<description><![CDATA[遅ればせながら jeweler から bundler への移行をちゃんと経験しておくべく、何やらこしらえてみました。といっても、$ bundle gem &#60;ライブラリ名&#62; としてスケルトンを作ったら、あとは  [...]]]></description>
			<content:encoded><![CDATA[<span class="read_later"><script type="text/javascript"><!--
			instapaper_embed( "http://tmty.jp/2011/01/13/released_swf_ruby/", "SwfRuby &#8211; SWFバイナリを直接操作して構造解析/リソース置換するためのRubyライブラリをリリースしました", "" );
		//--></script></span><p>遅ればせながら jeweler から bundler への移行をちゃんと経験しておくべく、何やらこしらえてみました。といっても、$ bundle gem &lt;ライブラリ名&gt; としてスケルトンを作ったら、あとは gemspec をごにょごにょ書くだけだったので、さして難しくはなかったのですが。</p>
<p>今回公開した SwfRuby (swf_ruby) は、SWFバイナリを解析したり、内部に含まれる画像などのリソースを置換したりするための Ruby ライブラリ(およびコマンドラインツール)です。ruby-1.8.7 と ruby-1.9.2 で動作確認をおこなっています。こちらのライブラリは、GPL2(the GNU GENERAL PUBLIC LICENSE Version 2)にて使用を許諾します。</p>
<p><a href="https://rubygems.org/gems/swf_ruby" target="_blank">swf_ruby | RubyGems.org | your community gem host</a></p>
<p><a href="https://rubygems.org/gems/swf_ruby" target="_blank"></a> <a href="https://github.com/tmtysk/swf_ruby" target="_blank">tmtysk/swf_ruby &#8211; GitHub</a></p>
<p><a href="https://github.com/tmtysk/swf_ruby" target="_blank"></a> SwfRuby のメイン機能を司るクラスは2つあります。SWF に含まれるタグ群やタグの登場箇所(オフセット値)をダンプする SwfDumper と、SWF に含まれるリソースを置換する SwfTamperer です。</p>
<p>昨年は携帯向けソーシャルアプリのブームもあり、サーバサイドでの Flash(SWF) 操作のニーズが高かったように思います。このサイトでは、2009年4月ごろから、swfmill を使った SWF の解析方法や、swfmill の Ruby ラッパーである SwfmillRuby を紹介してきました。しかしながら、莫大なアクセス負荷のかかるソーシャルアプリサイトですから、こちらで紹介してきたやり方では機能要件は満たせども、swfmill の起動コストや XML の操作コストに頭を悩ませた開発者の方も多かったのではないでしょうか。</p>
<p>SwfRuby は冒頭で述べた通り、swfmill などの中間ソフトウェアを一切介在させず、SWF バイナリを直接操作するライブラリです。現時点では荒削りなのでお世辞にも使い易い状態とは言えませんが、SWF の仕組みを大体理解している人にとっては、それなりに便利に使える部分があると考えています。(SWF のバイナリ編集については、<a href="http://labs.gree.jp/blog/2010/08/631/" target="_blank">グリーエンジニアブログでの連載</a>がとても丁寧に解説されているので、そちらを参考にすると良いでしょう。)</p>
<p>以下、簡単に使い方を紹介します。</p>
<p>SWF のバイナリを直接操作するに当たって、まず調べないといけないのは「置換対象のリソースがSWF中のどこ(オフセット位置)に含まれているか」です。SwfDumper を使った解析プログラムを書くのも良いですが、swf_ruby をインストール( $ gem install swf_ruby )すると、SwfDumper を使ったコマンドラインツール swf_dump が使えるようになりますので、今回はそちらのツールを使った方法を紹介します。swf_dump の引数として SWF ファイルパスを指定してください。</p>
<pre style="margin-top: 1em !important; margin-right: 0px !important; margin-bottom: 1em !important; margin-left: 0px !important; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.5em !important; font-size: 12px !important; background-color: #f8f8ff !important; color: #444444 !important; overflow-x: auto !important; overflow-y: auto !important; padding: 0.5em !important; border: 1px !important solid !important #dedede !important;"><code style="font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; font-size: 12px !important; background-color: #f8f8ff !important; color: #444444 !important; padding: 0px !important; margin: 0px; border: 1px !important none !important #dedede !important;">$ swf_dump samples/sample.swf
SetBackgroundColor, offset: 20, length: 5
DefineFont2, offset: 25, length: 34
DefineEditText, offset: 59, length: 50
PlaceObject2, offset: 109, length: 11
DefineBitsLossless2, offset: 120, length: 178
DefineShape, offset: 298, length: 55
:
DefineBitsJPEG2, offset: 623, length: 10986
:</code></pre>
<p>このような形で、SWF 内部のタグ一覧と、個々のタグの登場位置/長さを得ることができます。ちなみに、タグ情報は最新の SWF 仕様書を取り込んでありますので、Flash Lite の SWF に限らず、(たぶん)どんな SWF を指定しても、こういったダンプ情報を得ることができます。</p>
<p>さて、上記のダンプ情報により、DefineBitsJPEG2 タグがオフセット位置 623 バイト目から始まることがわかりました。つまり 623 バイト目以降にある JPEG バイト列と関連する情報をよしなに書き換えてやれば、この JPEG を差し替えることができるということになります。SwfTamperer は、この「よしなに書き換える」操作を支援するクラスです。swf_ruby をインストールすると、SwfTamperer を使ったコマンドラインツール swf_jpeg_replace が使えるようになりますので、ここでは、その使い方を紹介します。swf_jpeg_replace の引数として、SWF ファイルパス、書き換えを行う JPEG のオフセット位置(swf_dumpで取得可能)、書き換え後の JPEG ファイルパスを指定してください。</p>
<pre style="margin-top: 1em !important; margin-right: 0px !important; margin-bottom: 1em !important; margin-left: 0px !important; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.5em !important; font-size: 12px !important; background-color: #f8f8ff !important; color: #444444 !important; overflow-x: auto !important; overflow-y: auto !important; padding: 0.5em !important; border: 1px !important solid !important #dedede !important;"><code style="font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; font-size: 12px !important; background-color: #f8f8ff !important; color: #444444 !important; padding: 0px !important; margin: 0px; border: 1px !important none !important #dedede !important;">$ swf_jpeg_replace samples/sample.swf 623 samples/bg.jpg &gt; samples/sample2.swf</code></pre>
<p>書き換え後の SWF は標準出力へ出力されますが、ここでは、ファイルへリダイレクトをおこなっています。</p>
<p>最後に、拙作 SwfmillRuby と SwfRuby とで、SWF 読み込み → SWF 中の JPEG 1 ファイルを置換 → ファイル書き出しする際の簡単な速度比較をおこないましたので、ご参考までに紹介します。それぞれのプログラムを手元の PC のターミナルから100回連続実行(つまり100件のSWFを合成)した際の処理時間は以下のとおりでした。比較に使用した Ruby バージョンは 1.8.7 です。</p>
<ul>
<li>SwfmillRuby .. 11.697s</li>
<li>SwfRuby .. 5.301s</li>
</ul>
<p>SwfRuby は SwfmillRuby の約半分といったところでしょうか。減少分は swfmill の起動や libxml による xml 処理、RMagick による画像処理のオーバーヘッド分かと考えられます（期待値的には、もうちょっと（桁ひとつくらいは）速くなって欲しかったところですが、SwfRuby 側にまだまだ改善の余地があるのかもしれません）。</p>
<p>以上、SwfRuby の概要とコマンドラインツールの簡単な使い方を紹介しました。SwfTamperer は現時点では JPEG と ActionScript 内変数の書き換え機能しか提供しておりませんが、これに DefineEditText や DefineBitsLossless 系の書き換え機能が付けば、それなりに有用なものになると思います。また、ご興味の方には、コマンドラインツールだけでなく、SwfDumper や SwfTamperer クラス群をうまいこと使ってみていただいても良いかも知れません。SwfmillRuby ともども、フィードバック、pull request は大歓迎ですので、ぜひともご意見ご感想などお聞かせいただけると嬉しいです！<br/><br/><strong>関連していそうなエントリ:</strong>
<ul class="similar-posts">
<li><a href="http://tmty.jp/2011/04/27/updated_swf_ruby/" rel="bookmark" title="2011 年 4 月 27 日">SwfRuby バージョンアップ &#8211; AS変数とムービークリップの置換ができるようになりました</a></li>
<li><a href="http://tmty.jp/2011/05/19/swf_ruby_use_case/" rel="bookmark" title="2011 年 5 月 19 日">SwfRuby がドリコム様ご提供のソーシャルアプリで使用されているそうです</a></li>
<li><a href="http://tmty.jp/2009/05/08/shared_swfmill_ruby/" rel="bookmark" title="2009 年 5 月 8 日">SwfmillでFlashLite用SWFの画像やテキストを操作するRubyライブラリ SwfmillRuby</a></li>
</ul>
<p><!-- Similar Posts took 23.121 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://tmty.jp/2011/01/13/released_swf_ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>執筆者向けダッシュボードサービス Amazon SalesRank Tracker をアルファリリースしました</title>
		<link>http://tmty.jp/2010/05/11/launched_amazon_salesrank_tracker/</link>
		<comments>http://tmty.jp/2010/05/11/launched_amazon_salesrank_tracker/#comments</comments>
		<pubDate>Mon, 10 May 2010 17:06:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[AmazonSalesRankTracker]]></category>
		<category><![CDATA[Service]]></category>

		<guid isPermaLink="false">http://tmty.jp/?p=407</guid>
		<description><![CDATA[自分で本を書いてみると、売れ行きや評価などはそれなりに気になるもので、ちょくちょく Amazon.co.jp の商品ページやらブログ検索などを見に行ってしまうのですが、せっかくなので、そういうニッチなニーズに応えられるサ [...]]]></description>
			<content:encoded><![CDATA[<span class="read_later"><script type="text/javascript"><!--
			instapaper_embed( "http://tmty.jp/2010/05/11/launched_amazon_salesrank_tracker/", "執筆者向けダッシュボードサービス Amazon SalesRank Tracker をアルファリリースしました", "" );
		//--></script></span><p><a href="/2010/04/24/wrote_book_to_develop_mobile_site_with_rails/">自分で本を書いて</a>みると、売れ行きや評価などはそれなりに気になるもので、ちょくちょく Amazon.co.jp の商品ページやらブログ検索などを見に行ってしまうのですが、せっかくなので、そういうニッチなニーズに応えられるサービスでも作ってみるかと思いたちました。以下の URL で個人サービスとして公開しています。</p>
<p><del>Amazon SalesRank Tracker α version</del><strong>(サーバ移転中につき、現在停止中)</strong></p>
<p><img class="alignnone size-large wp-image-413" title="Screenshot-25" src="http://tmty.jp/wp-content/uploads/2010/05/Screenshot-25-1024x707.png" alt="Screenshot-25" width="655" height="453" /></p>
<p>あらかじめ書籍を登録しておくと、登録済みのカテゴリ内での表示順や、Amazon.co.jp ランキングの情報を追跡・記録、それに Twitter やソーシャルブックマーク、ブログ検索結果などをひとまとめにしたダッシュボード画面を作成します。</p>
<p>最初はAWSのAPI経由でごにょごにょしていたのですが、ランキング情報がサイトで見られるものと微妙に違っていたり、そもそもAPIの利用規約的にアレだったりするところもあったので、いろいろ調整＆データの素性がわかる範囲でまとめました。道楽で作っているので、今ひとつ足りない機能や不具合などあるかもしれませんが、よろしければご利用ください。</p>
<p>なお、本サービスの稼働環境は暫定的なものなので、あくまでアルファ版です。突然、終了するかもしれませんのでご了承ください。</p>
<p>ちなみに、下記書籍、連休中は在庫切れになっていたようですが、現在は在庫が回復しているようです。こちらも引き続きよろしくお願いいたします。</p>
<p>ところで、作る前に探した感じではこういったサービスが無いように感じたのですが、作った後で探したら、似たような商用サービスや海外サービスがいっぱいありました。。けど、ランキング情報以外の情報もダッシュボード的にまとめてくるっていうのが欲しかったので、まあいいか、と納得することにします。作ってるのも面白かったし。（実はニフティクラウドのモニターアカウントをいただいていたので、それの実験サイトでもありました。といっても、これといってあんまし時間取れなくて、実験らしいことはできなかったですが。。コントロールパネルは使いやすかったです（それだけか））<br/><br/><strong>関連していそうなエントリ:</strong>
<ul class="similar-posts">
<li><a href="http://tmty.jp/2007/10/21/%e6%90%ba%e5%b8%af%e6%a9%9f%e7%a8%ae%e6%83%85%e5%a0%b1db%e3%81%ae%e6%a4%9c%e7%b4%a2%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/" rel="bookmark" title="2007 年 10 月 21 日">携帯機種情報DBの検索サービスを作ってみた</a></li>
<li><a href="http://tmty.jp/2010/04/24/wrote_book_to_develop_mobile_site_with_rails/" rel="bookmark" title="2010 年 4 月 24 日">「Ruby on Rails携帯サイト開発技法」の執筆に参加しました</a></li>
<li><a href="http://tmty.jp/2011/04/27/updated_swf_ruby/" rel="bookmark" title="2011 年 4 月 27 日">SwfRuby バージョンアップ &#8211; AS変数とムービークリップの置換ができるようになりました</a></li>
</ul>
<p><!-- Similar Posts took 32.249 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://tmty.jp/2010/05/11/launched_amazon_salesrank_tracker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>「Ruby on Rails携帯サイト開発技法」の執筆に参加しました</title>
		<link>http://tmty.jp/2010/04/24/wrote_book_to_develop_mobile_site_with_rails/</link>
		<comments>http://tmty.jp/2010/04/24/wrote_book_to_develop_mobile_site_with_rails/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 17:19:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Book]]></category>
		<category><![CDATA[FlashLite]]></category>
		<category><![CDATA[Mobile]]></category>

		<guid isPermaLink="false">http://tmty.jp/?p=381</guid>
		<description><![CDATA[このたび「Rails で携帯サイトを作る」という趣旨の解説書の執筆に参加させていただきました。共著者のお二方、お声がけいただいた編集者様には、大変お世話になりました。このたびは、ご一緒させていただき、ありがとうございまし [...]]]></description>
			<content:encoded><![CDATA[<span class="read_later"><script type="text/javascript"><!--
			instapaper_embed( "http://tmty.jp/2010/04/24/wrote_book_to_develop_mobile_site_with_rails/", "「Ruby on Rails携帯サイト開発技法」の執筆に参加しました", "" );
		//--></script></span><p>このたび「Rails で携帯サイトを作る」という趣旨の解説書の執筆に参加させていただきました。共著者のお二方、お声がけいただいた編集者様には、大変お世話になりました。このたびは、ご一緒させていただき、ありがとうございました。</p>
<p>いわゆる「スマートフォン」向けサイト開発の解説書ではありません。iPhone も android も出てきません。あまり好きな表現では無いですが、あえて言えば「ガラケー」サイト開発の解説書です。</p>
<p>今さら？という声も聞こえてきそうですが、僕は、ある意味良いタイミングだったかも、と思ってます。まだまだ今の状況では「スマートフォン」サイトに（堅実に）お金をかけられるところは少ないという印象ですし、一方で「ガラケー」は「ガラケー」で、わりと基本的なところは変わらなくなってきつつありますし。</p>
<p>個人的には「ガラケー」に固執するつもりはさらさらないですし、かといって今すぐ「スマートフォン」に飛びついてズッポリ浸かりたいというノリでもない感じです。が、まあ、一方で、僕は「ケータイ」がわりと好きなので、どっちにせよ、携帯向けサービスを Ruby/Rails で作っちゃおうぜ、という流れが少しでも広がると、周りから楽しいサービスが生まれていったり、便利なライブラリやノウハウが蓄積されていったりで、そしたら僕もずっと楽しく Ruby と付き合っていけたりで嬉しいので、そんなきっかけになればいいなーと思いながら書きました。</p>
<p>ちなみに、僕はメールに関する章と、Flash Lite に関する章を書きました。Flash Lite の章は Rails からだいぶ離れた話題になっていますが、昨今の携帯サイトを作るという意味では外せない話題だったと思います。概要だけとはいえ、 SWF の内部構造やら、（Flash Liteの各種制限に着目しつつ）オープンソースソフトウェアを併用した SWF のサーバサイドでの生成について扱っている書籍は、他にあまり見ないな、と思いますです。（Flash Liteに限らなければ洋書では何冊かあるのですが。）</p>
<p>あとは、これに動画/音楽系サイト、オートGPS、モバイル向けソーシャルアプリとかの話が加えられるとさらに良かったかな、と思いますが、その辺の話はまだまだ非公開部分が多いので何ともですね。テスト周りが書けなかったのは惜しかったかな。とはいえ、そこそこ守備範囲の広い内容になっていると思います。</p>
<p>最後に、Flash Lite の章で、ページの都合で載せられなかった幾つかのコラムについて、許可をいただいたので、こちらに紹介しておきます。（ちょっと文脈が無いと意味わかんないところがありますが、Flash Lite の章は、こういう文章が途中に入るような内容になっているとご想像いただく材料になれば。）</p>
<blockquote>
<h4><span style="font-weight: normal;">コラム　利用できるActionScriptバージョンに注意</span></h4>
<p><span style="font-weight: normal;">ActionScriptはFlashプレーヤおよびFlash Liteプレーヤ上で動作するスクリプト言語で、よりインタラクティブなFlashコンテンツを制作するうえで欠かせない存在です。本書執筆時点の最新バージョンは3.0（Flash Liteプレーヤでは利用不可）です。Flashプレーヤのバージョンアップに伴い、ActionScriptの言語仕様やプログラミング環境/実行環境は大きく様変わりしてきています。表7-1で示した通り、Flash Liteバージョンを決定することは、利用できるActionScriptバージョンを決定することにもなりますので、対象のFlash Liteプレーヤバージョンを選択する際は、注意しておきましょう。</span></p></blockquote>
<blockquote>
<h4><span style="font-weight: normal;">コラム　Flash Liteコンテンツ内での絵文字利用</span></h4>
<p><strong><span style="font-weight: normal;">バージョン/キャリアによっては、Flash Liteコンテンツ内で各キャリアの絵文字を利用できます。ただし、（本書でこれまで紹介してきた通り）絵文字の表記方法はキャリア別に異なりますし、上記で示した通り、プレーヤバージョンごとに利用できる文字符号化方式も異なっていますので、絵文字の利用には十分に注意が必要です。</span></strong></p></blockquote>
<blockquote>
<h4><span style="font-weight: normal;">コラム　SWFの動的生成はボトルネックになりやすい</span></h4>
<p><span style="font-weight: normal;">本章では、swfmillを利用した &#8220;元のSWF→元のXML→書き換え後XML→書き換え後SWF&#8221;というSWF動的生成の一連の流れを紹介しました。しかしながら、swfmillの利用やXMLの解析/書き換え処理は、それなりに時間のかかる処理ですので、Webアプリケーション内でこれらの処理を実行する際は注意が必要です。必要に応じて、書き換え後のXMLやSWFをキャッシュしたり、非同期（バッチ）処理でSWFを生成したりといった方策、あるいは、より用途に見合ったswfmill以外のソフトウェアの利用も検討すると良いでしょう。</span></p></blockquote>
<p><span style="font-weight: normal;">ところで、Amazon.co.jp からも案内が来てました。笑</span></p>
<p><span style="font-weight: normal;"><img class="alignnone size-full wp-image-389" title="Screenshot-24" src="http://tmty.jp/wp-content/uploads/2010/04/Screenshot-24.png" alt="Screenshot-24" width="604" height="410" /></span><br/><br/><strong>関連していそうなエントリ:</strong>
<ul class="similar-posts">
<li><a href="http://tmty.jp/2009/05/08/generate_flash_lite_on_server-3/" rel="bookmark" title="2009 年 5 月 8 日">ケータイサイトでFlashLiteコンテンツを動的生成する(その3)</a></li>
<li><a href="http://tmty.jp/2009/05/04/generate_flash_lite_on_server-2/" rel="bookmark" title="2009 年 5 月 4 日">ケータイサイトでFlashLiteコンテンツを動的生成する(その2)</a></li>
<li><a href="http://tmty.jp/2011/05/19/swf_ruby_use_case/" rel="bookmark" title="2011 年 5 月 19 日">SwfRuby がドリコム様ご提供のソーシャルアプリで使用されているそうです</a></li>
</ul>
<p><!-- Similar Posts took 38.359 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://tmty.jp/2010/04/24/wrote_book_to_develop_mobile_site_with_rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 2.815 seconds -->
<!-- Cached page served by WP-Cache -->

