<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>FleFla</title>
    <link rel="alternate" type="text/html" href="http://uenon.jp/blog/" />
    <link rel="self" type="application/atom+xml" href="http://uenon.jp/blog/atom.xml" />
    <id>tag:uenon.jp,2007-08-09:/blog//4</id>
    <updated>2008-06-22T14:53:42Z</updated>
    <subtitle>Flex や Flash や ActionScript や MXML や OOP や RIA</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.1</generator>

<entry>
    <title>FLASH OOP for ActionScript 3.0</title>
    <link rel="alternate" type="text/html" href="http://uenon.jp/blog/archives/2008/06/flash_oop_for_actionscript_30.html" />
    <id>tag:uenon.jp,2008:/blog//4.121</id>

    <published>2008-06-22T13:56:46Z</published>
    <updated>2008-06-22T14:53:42Z</updated>

    <summary> 今回は執筆はしてませんが、少しだけ協力させていただいた本の発売日が決まったよう...</summary>
    <author>
        <name>Naohiko Ueno</name>
        <uri>http://uenon.jp/</uri>
    </author>
    
        <category term="Flash" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="OOP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://uenon.jp/blog/">
        <![CDATA[<p class="ff_image">
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://uenon.jp/blog/archives/flashoop_as3.jpg"><img alt="flashoop_as3.jpg" src="http://uenon.jp/blog/archives/flashoop_as3-thumb-160x225.jpg" width="160" height="225" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></a></span>
</p>

<p>
今回は執筆はしてませんが、少しだけ協力させていただいた本の発売日が決まったようです。「<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798116300/">FLASH OOP for ActionScript 3.0</a>」。2008年7月2日発売。
</p>

<p>
内容については<a href="http://www.fumiononaka.com/Books/FlashOOP_AS3.html">野中さんのサイト</a>が詳しいです。概念的な内容が多かった<a href="http://www.amazon.co.jp/FLASH-OOP-Advanced-design-books/dp/4798106119/">前作</a>に比べて、実際に動くサンプルがたくさんつまった盛りだくさんな内容になってますね。Papervision3D、物理エンジン、バイトコード操作、Wiiリモコンとつなげる、などなど。
</p>]]>
        
    </content>
</entry>

<entry>
    <title>Flex3勉強会第33回で話したことメモ</title>
    <link rel="alternate" type="text/html" href="http://uenon.jp/blog/archives/2008/02/flex333.html" />
    <id>tag:uenon.jp,2008:/blog//4.120</id>

    <published>2008-02-02T16:11:36Z</published>
    <updated>2008-02-04T16:40:04Z</updated>

    <summary> Flex3勉強会第33回（アンケート結果）でRails + FlexとLogg...</summary>
    <author>
        <name>Naohiko Ueno</name>
        <uri>http://uenon.jp/</uri>
    </author>
    
        <category term="Flex" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="flex3勉強会" label="Flex3勉強会" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="logging" label="Logging" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://uenon.jp/blog/">
        <![CDATA[<p>
<a href="http://www.fxug.net/modules/bwiki/index.php?cmd=read&page=Flex3%CA%D9%B6%AF%B2%F1%C2%E833%B2%F3%A1%F7%C5%EC%B5%FE%BB%B2%B2%C3%BC%F5%C9%D5">Flex3勉強会第33回</a>（<a href="http://www.fxug.net/modules/bwiki/index.php?cmd=read&page=Flex3%CA%D9%B6%AF%B2%F1%C2%E833%B2%F3%A1%F7%C5%EC%B5%FE%A5%A2%A5%F3%A5%B1%A1%BC%A5%C8%B7%EB%B2%CC">アンケート結果</a>）でRails + FlexとLoggingについての2本立てでしゃべらせてもらいました。
</p>

<p>
簡単ですが、その内容のメモです。
</p>]]>
        <![CDATA[<h3>Ruby on Rails + Flex</h3> 

<p>以下の記事にそってライブコーディングしました。</p> 
<ul>
<li><a href="http://uenon.jp/blog/archives/2007/12/rails_20flex_3_beta3restful_1_1.html">Rails 2.0とFlex 3 beta3でRESTfulなBookmarkアプリを作ろう 1</a></li>
<li><a href="http://uenon.jp/blog/archives/2007/12/rails_20flex_3_beta3restfulboo.html">Rails 2.0とFlex 3 beta3でRESTfulなBookmarkアプリを作ろう 2</a></li>
</ul>

<p>話の中で出てきたもの</p>
<ul>
<li><a href="http://ja.wikipedia.org/wiki/Ruby_on_Rails">Ruby on Rails</a></li>
<li><a href="http://www.aptana.com/rails/">RadRails</a> - Railsの開発環境（Eclipseベース）</li>
<li><a href="http://ja.wikipedia.org/wiki/REST">REST</a></li>
<li><a href="http://sqlitebrowser.sourceforge.net/">SQLite Database Browser</a></li>   
<li><a href="http://www.libspark.org/">Spark project</a></li>
<li><a href="http://getfirebug.com/jp.html">Firebug</a> - XMLの通信内容をチェックするのに利用</li>
<li><a href="
http://code.google.com/p/as3httpclientlib/">as3httpclientlib</a> - AS3でGET, PUT, POST, DELETEを実現するHTTP/HTTPSクライアントライブラリ</li>
</ul>

<h3>Logging</h3>
<p>Loggingどうしてますか？といろいろ参加者の方々に質問を投げかけたところ分かったのは、運用時のロギング（ネット経由でサーバにログを出力）まで行っている方はほとんどいなく、開発時のロギングはtrace()で済ませている方が多数を占めてました。僕としてはかなり予想外だったのですが、Flex SDKの<a href="http://livedocs.adobe.com/flex/201_jp/langref/mx/logging/package-detail.html">ロギングAPI</a>（mx.logging.Logなど）はほとんど使われていないどころか、存在さえ知らなかったという方がほとんどでした。</p>

<p>以下補足</p>

<p>僕はFlashやFlexでちょっと複雑なアプリのコアの部分を担当することが多かったのですが、レベルや出力クラスの情報込みでログ出力させていたことで、バグの原因特定にかかる時間がかなり短縮した経験があります。特に自分以外の人（他の開発者やテスター）がアプリを実行させていたときに発生したバグの原因特定なんかは、ログが残っているかどうかでかなり違いがでます。自分の環境では再現できない問題なんかもありますから。</p>

<p>関連ページ</p>
<ul>
<li><a href="http://livedocs.adobe.com/flex/201_jp/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&amp;file=logging_125_09.html">Logging APIの使用</a></li>
<li><a href="http://uenon.jp/blog/archives/2008/01/traceloggerdebug.html">trace()とlogger.debug()の負荷テスト</a></li>
<li><a href="http://uenon.jp/blog/archives/2008/01/traceloggerdebug_1.html">trace()とlogger.debug()の負荷テスト結果Report</a></li>
</ul>]]>
    </content>
</entry>

<entry>
    <title>Google Maps API + PicasaウェブアルバムのKML</title>
    <link rel="alternate" type="text/html" href="http://uenon.jp/blog/archives/2008/01/google_maps_api_picasakml.html" />
    <id>tag:uenon.jp,2008:/blog//4.119</id>

    <published>2008-01-29T11:47:52Z</published>
    <updated>2008-01-29T12:30:46Z</updated>

    <summary> REDHANDSで出張モミほぐしの記録写真をPicasaウェブアルバムの機能で...</summary>
    <author>
        <name>Naohiko Ueno</name>
        <uri>http://uenon.jp/</uri>
    </author>
    
        <category term="REDHANDS" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="RIA" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="googlemapsapi" label="Google Maps API" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="kml" label="KML" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="picasa" label="Picasa" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://uenon.jp/blog/">
        <![CDATA[<p>
<a href="http://blog.redhands.jp/">REDHANDS</a>で<a href="http://blog.redhands.jp/article/81298794.html">出張モミほぐしの記録写真をPicasaウェブアルバムの機能で地図上にマッピング</a>しました。すると自動的に<a href="http://earth.google.co.jp/kml/">KML</a>も出力されたので、このKMLの情報を<a href="http://code.google.com/intl/ja/apis/maps/index.html">Google Maps API</a>を使ってカスタマイズした地図上に表示させてみました。
</p>  ]]>
        <![CDATA[ <iframe src="/samples/200801/gmap_picasa/gmap_picasa.html" frameborder="no" width="690" height="550">
<a href="/samples/200801/gmap_picasa/gmap_picasa.html">Google Maps APIを使ってPicasaウェブアルバムの写真を地図上にマッピング</a></iframe>  <p>Google Maps APIとKMLの使い方は<a href="http://maoxiong.seesaa.net/article/47124054.html">こちら</a>を参考にさせてもらいました。その部分のコードはほんとにシンプルなので簡単でしたが、HTMLやjavascirptのコーディングは不慣れなのでSignatureBoxの見た目を整えるところが一番苦労しました。でも地図と連携させるのはほんと楽しい。 </p>  <p>以下コードです。 </p>  <pre class="html" name="code">&lt;html&gt;
&lt;head&gt;
	&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
	&lt;title&gt;Google Maps APIを使ってPicasaウェブアルバムの写真を地図上にマッピング&lt;/title&gt;
	&lt;script src=&quot;http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAJKHF84pwt-IsS1rpJHqG9hTeaO0cQNVtPkJkqEbL54wF3_nMBhS4tuKZhMOvkFz24f80ONBOX8hVIQ&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot;&gt;
	//&lt;![CDATA[

	function SignatureBox() {}
	SignatureBox.prototype = new GControl();
	SignatureBox.prototype.initialize = function(map)
	{
		var container = document.createElement(&quot;div&quot;);
		container.style.font = &quot;12px Arial&quot;;
		container.style.color = &quot;#0B333C&quot;;
		container.style.backgroundColor = &quot;white&quot;;
		container.style.border = &quot;1px solid #0B333C&quot;;
		container.style.padding = &quot;4px 4px 1px 4px&quot;;
		container.style.width = &quot;245px&quot;;
		container.style.textAlign = &quot;center&quot;;
		container.innerHTML = 'Developed by&lt;a href=&quot;http://uenon.jp/blog/&quot;&gt;&lt;img src=&quot;http://uenon.jp/icons/flefla_icon.gif&quot; width=&quot;32&quot; height=&quot;32&quot; alt=&quot;FleFla&quot; title=&quot;FleFla&quot; border=&quot;0&quot; style=&quot;margin:0px 10px 0px 4px;vertical-align:middle;&quot; /&gt;&lt;/a&gt;Sponsored by&lt;a href=&quot;http://redhands.jp/&quot;&gt;&lt;img src=&quot;http://uenon.jp/icons/redhands_icon.gif&quot; width=&quot;32&quot; height=&quot;32&quot; alt=&quot;REDHANDS&quot; title=&quot;REDHANDS&quot; border=&quot;0&quot; style=&quot;margin:0px 0px 0px 4px;vertical-align:middle;&quot; /&gt;&lt;/a&gt;';
		
		this.updateBackgroundAlpha(container.style, .8);
		
		var owner = this;
		GEvent.addDomListener(container, &quot;mouseover&quot;,
			function()
			{
				owner.updateBackgroundAlpha(container.style, 1);
			});
		GEvent.addDomListener(container, &quot;mouseout&quot;,
			function()
			{
				owner.updateBackgroundAlpha(container.style, .8);
			});
		
		map.getContainer().appendChild(container);
		return container;
	}
	SignatureBox.prototype.updateBackgroundAlpha = function(style, alpha)
	{
		style.mozOpacity = alpha;
		style.opacity = alpha;
		style.filter = &quot;alpha(opacity=&quot; + String(alpha * 100) + &quot;)&quot;;
	}
	
	SignatureBox.prototype.getDefaultPosition = function()
	{
	  return new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(70, 2));
	}
	
	function load()
	{
		if (GBrowserIsCompatible())
		{
			var map = new GMap2(document.getElementById(&quot;map&quot;));
			map.addControl(new GLargeMapControl());
			map.addControl(new GMapTypeControl());
			map.addControl(new SignatureBox());
			map.setCenter(new GLatLng(35.679052, 139.611511), 11);
			var kml = &quot;http://picasaweb.google.com/data/feed/base/user/redhands.jp/albumid/5159793698554063985?kind=photo&amp;alt=kml&amp;hl=ja&quot;;
			map.setMapType(G_SATELLITE_MAP);
			var geoxml = new GGeoXml(kml);
			map.addOverlay(geoxml);
		}
		else
		{
			document.getElementById(&quot;map&quot;).innerHTML = &quot;ご使用のブラウザはGoogle Mapsに対応していません。&quot;
		}
	}
	//]]&gt;
	&lt;/script&gt;
	&lt;style&gt;
	body { margin: 0px; overflow:hidden }
	#map { width: 100%; height:100% }
	&lt;/style&gt;
&lt;/head&gt;

&lt;body onload=&quot;load()&quot; onunload=&quot;GUnload()&quot; scroll=&quot;no&quot;&gt;
	&lt;div id=&quot;map&quot; &gt;&lt;/div&gt;
&lt;/body&gt;

&lt;/html&gt;</pre>]]>
    </content>
</entry>

<entry>
    <title>コリン・ムックの「今から始める ActionScript 3.0 - WORLD WIDE TOUR 」</title>
    <link rel="alternate" type="text/html" href="http://uenon.jp/blog/archives/2008/01/_actionscript_30_world_wide_to.html" />
    <id>tag:uenon.jp,2008:/blog//4.117</id>

    <published>2008-01-15T17:04:20Z</published>
    <updated>2008-01-16T16:05:25Z</updated>

    <summary> コリン・ムックの「今から始める ActionScript 3.0 - WORL...</summary>
    <author>
        <name>Naohiko Ueno</name>
        <uri>http://uenon.jp/</uri>
    </author>
    
        <category term="Flash" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Flex" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="OOP" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="REDHANDS" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="actionscript3" label="ActionScript 3" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="flashcs3" label="Flash CS3" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="flashdevelop" label="FlashDevelop" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="flexbuilder" label="Flex Builder" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="コリン・ムーク" label="コリン・ムーク" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="セミナー" label="セミナー" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://uenon.jp/blog/">
        <![CDATA[<p>
<a href="http://www.event-web.net/as3/">コリン・ムックの「今から始める ActionScript 3.0 - WORLD WIDE TOUR 」</a>に行ってきました。
</p>

<p class="ff_image">
<span class="mt-enclosure mt-enclosure-image"><a href="http://uenon.jp/blog/archives/2008/01/16/CA390025.html" onclick="window.open('http://uenon.jp/blog/archives/2008/01/16/CA390025.html','popup','width=640,height=480,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://uenon.jp/blog/2008/01/16/CA390025-thumb-320x240.jpg" width="320" height="240" alt="コリンと"  /></a></span>
</p>


]]>
        <![CDATA[<p>
セミナー直後に撮ってもらった写メです。撮影は<a href="http://syner.jp/">サイナー</a>の<a href="http://ks.typepad.jp/blog/">鈴木</a>さん。
</p>

<p>
僕はちょっと遅刻したので、残念ながら最初の方は聞けてないのですが、AS3（ActionScript 3）とOOP（オブジェクト指向プログラミング）についてのすばらしく熱いセミナーでした！　細かい内容のリポートは<a href="http://www.event-web.net/as3/blogger.html">ブログレポーター</a>の方々に任せるとして、今回のセミナーの概要を一言で説明するなら、AS1しか使っていなかったような人にAS3とOOPを始めてみようかなという気持ちにさせるものだったと思います。
</p>

<p>
以下、セミナーを受けて思うところ。
</p>

<p>
AS3もOOPも共通するのは、どっちも最初はとっつきにくく、面倒くさいだけのように見えますいけど、実は筋が通ってて慣れたらその良さが見えてくるということです。ただ、Flash CS3のエディターがAS3やOOPをするには低機能すぎるのが残念です。面倒くささが強調されてAS3を嫌いになってもおかしくありません。AS3やOOPの良さがより見えるようにするは、<a href="http://www.flashdevelop.org/">FlashDevelop</a>や<a href="http://www.adobe.com/jp/products/flex/flexbuilder/">Flex Builder</a>などのいいエディター（IDE）を使うのが結構重要なんじゃないかと思います。
</p>

<p>
セミナーでコリンがテラスゴイと絶賛したのはFlex Builderの[Cntl]+クリックでクラス、メソッド、プロパティの定義部分にジャンプできる機能でした。僕も同感です。これができるかどうかで開発効率に雲泥の差ができますから。同様のことはFlashDevelopでもできますが、Flash CS3はできません。他にも開発効率に差がでる機能差がかなりあります。Flex BuilderやFlashDevelopの機能はAS3やOOPの開発を楽にし、AS3（の型付け）やOOPがFlex BuilderやFlashDevelopの機能を引き出すようないい関係性があります。
</p>

<p>
Flash CS3のエディタにあって（現時点で）他の2つにない僕にとって重要な機能はソースをきれいに整形してくれるソースフォーマットぐらいです。Flash CS3のエディタの機能には残念ながらもう期待できなさそう（複雑なものを作るときは、Flex Builderを使ってくださいというのがAdobeさんのスタンスらしい）ので、ぜひともFlex BuilderとFlashDevelopにソースフォーマット機能を実装してほしいものです。<a href="http://www.fxug.net/modules/xhnewbb/viewtopic.php?viewmode=flat&topic_id=1487&forum=13">先日の勉強会</a>でコリンにFlash CS3のエディタをどう思うかと質問したら「最悪～！」とのことでした。彼はWindows版Flex Builderでコーディングしてるらしいです。
</p>

<p>
セミナー後はコリンと一緒に軽く打ち上げをしました。その辺りは<a href="http://blog.redhands.jp/">REDHANDS</a>の<a href="http://blog.redhands.jp/article/78761494.html">記事</a>で。
</p>]]>
    </content>
</entry>

<entry>
    <title>trace()とlogger.debug()の負荷テスト結果Report</title>
    <link rel="alternate" type="text/html" href="http://uenon.jp/blog/archives/2008/01/traceloggerdebug_1.html" />
    <id>tag:uenon.jp,2008:/blog//4.116</id>

    <published>2008-01-12T22:30:22Z</published>
    <updated>2008-01-16T15:29:07Z</updated>

    <summary> trace()とlogger.debug()の負荷テストを以下にあげる3つのテ...</summary>
    <author>
        <name>Naohiko Ueno</name>
        <uri>http://uenon.jp/</uri>
    </author>
    
        <category term="Flash" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Flex" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="chart" label="Chart" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="debugplayer" label="Debug Player" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="flashplayer" label="Flash Player" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="flexbuilder2" label="Flex Builder 2" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="logging" label="logging" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mmcfg" label="mm.cfg" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="trace" label="trace" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="サンプルアプリ" label="サンプルアプリ" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="パフォーマンス" label="パフォーマンス" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="負荷テスト" label="負荷テスト" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://uenon.jp/blog/">
        <![CDATA[<p>
<a href="http://uenon.jp/blog/archives/2008/01/traceloggerdebug.html">trace()とlogger.debug()の負荷テスト</a>を以下にあげる3つのテスト環境で行い、結果をグラフにまとめました。
</p>

<ul>
	<li>「標準のFlash Player」 → trace()によるflashlog.txtへの出力なし</li>
	<li>「Debug Player + mm.cfgなし」 → trace()によるflashlog.txtへの出力なし</li>
	<li>「Debug Player + mm.cfgあり」 → trace()によるflashlog.txtへの<strong>出力あり</strong></li>
</ul>]]>
        <![CDATA[<iframe src="/samples/200801/trace_test_report/TraceTestReport.html" width="690" height="500" frameborder="no">
<a href="/samples/200801/trace_test_report/TraceTestReport.html">負荷テスト報告アプリ</a>
</iframe>

<blockquote>
※棒グラフは長いほど負荷が低い（＝パフォーマンスがいい）です。<br />
※「logger.debug()」においてTraceTargetは追加していません。つまりtrace()は実行されません。
</blockquote>

<p>
trace()にはやはり負荷がありますが、環境によりその大きさに違いがでます。Debug Playerにおけるtrace()の負荷は標準のFlash Playerの1.6倍で、さらに実際にflashlog.txtに出力される場合になると700倍以上になります。<strong>flashlog.txtへの出力処理が、trace()の負荷の大部分を占めている</strong>ようです。
</p>

<p>
驚いたことに、trace()を実行しないテストケース（「trace()なし」と「logger.debug()」）においても標準のFlash PlayerとDebug Playerでコード実行パフォーマンスにかなり違いがでてます。どうやら（少なくともこのテストにおいては）<strong>Debug Playerは標準のFlash Playerに比べてコード実行パフォーマンスが80%以下</strong>になるようです。
</p>

<p>
テストはWindows XP SP2 + FireFox 2.0.0.11 + Flash Player 9.0.115で行いました。
以下は、3環境それぞれのログです。
</p>

<h3>「標準のFlash Player」のログ</h3>
<pre>
■trace()なし
  経過時間(ミリ秒): 6
  1秒あたりのループ回数: 166666666
----------------------------------------
■trace()なし
  経過時間(ミリ秒): 8
  1秒あたりのループ回数: 125000000
----------------------------------------
■trace()なし
  経過時間(ミリ秒): 6
  1秒あたりのループ回数: 166666666
----------------------------------------
■trace()あり
  経過時間(ミリ秒): 2290
  1秒あたりのループ回数: 436681
----------------------------------------
■trace()あり
  経過時間(ミリ秒): 2307
  1秒あたりのループ回数: 433463
----------------------------------------
■trace()あり
  経過時間(ミリ秒): 2301
  1秒あたりのループ回数: 434593
----------------------------------------
■logger.debug()
  経過時間(ミリ秒): 726
  1秒あたりのループ回数: 1377410
----------------------------------------
■logger.debug()
  経過時間(ミリ秒): 732
  1秒あたりのループ回数: 1366120
----------------------------------------
■logger.debug()
  経過時間(ミリ秒): 736
  1秒あたりのループ回数: 1358695
----------------------------------------
</pre>

<h3>「Debug Player + mm.cfgなし」のログ</h3>
<pre>
■trace()なし
  経過時間(ミリ秒): 9
  1秒あたりのループ回数: 111111111
----------------------------------------
■trace()なし
  経過時間(ミリ秒): 10
  1秒あたりのループ回数: 100000000
----------------------------------------
■trace()なし
  経過時間(ミリ秒): 9
  1秒あたりのループ回数: 111111111
----------------------------------------
■trace()あり
  経過時間(ミリ秒): 3812
  1秒あたりのループ回数: 262329
----------------------------------------
■trace()あり
  経過時間(ミリ秒): 3753
  1秒あたりのループ回数: 266453
----------------------------------------
■trace()あり
  経過時間(ミリ秒): 3745
  1秒あたりのループ回数: 267022
----------------------------------------
■logger.debug()
  経過時間(ミリ秒): 969
  1秒あたりのループ回数: 1031991
----------------------------------------
■logger.debug()
  経過時間(ミリ秒): 968
  1秒あたりのループ回数: 1033057
----------------------------------------
■logger.debug()
  経過時間(ミリ秒): 970
  1秒あたりのループ回数: 1030927
----------------------------------------
</pre>

<h3>「Debug Player + mm.cfgあり」のログ</h3>
<blockquote>
// mm.cfgの内容<br />
ErrorReportingEnable=1<br />
TraceOutputFileEnable=1
</blockquote>
<pre>
■trace()なし
  経過時間(ミリ秒): 10
  1秒あたりのループ回数: 100000000
----------------------------------------
■trace()なし
  経過時間(ミリ秒): 10
  1秒あたりのループ回数: 100000000
----------------------------------------
■trace()なし
  経過時間(ミリ秒): 10
  1秒あたりのループ回数: 100000000
----------------------------------------
■trace()あり
  2539回目でエラー: Error: Error #1502: スクリプトがデフォルトのタイムアウト時間の 15 秒を超えて実行されました。
  経過時間(ミリ秒): 5000
  1秒あたりのループ回数: 507
----------------------------------------
■trace()あり
  1427回目でエラー: Error: Error #1502: スクリプトがデフォルトのタイムアウト時間の 15 秒を超えて実行されました。
  経過時間(ミリ秒): 5002
  1秒あたりのループ回数: 285
----------------------------------------
■trace()あり
  1110回目でエラー: Error: Error #1502: スクリプトがデフォルトのタイムアウト時間の 15 秒を超えて実行されました。
  経過時間(ミリ秒): 5001
  1秒あたりのループ回数: 221
----------------------------------------
■logger.debug()
  経過時間(ミリ秒): 969
  1秒あたりのループ回数: 1031991
----------------------------------------
■logger.debug()
  経過時間(ミリ秒): 970
  1秒あたりのループ回数: 1030927
----------------------------------------
■logger.debug()
  経過時間(ミリ秒): 971
  1秒あたりのループ回数: 1029866
----------------------------------------
</pre>]]>
    </content>
</entry>

<entry>
    <title>FleFlaのアイコン作成</title>
    <link rel="alternate" type="text/html" href="http://uenon.jp/blog/archives/2008/01/flefla.html" />
    <id>tag:uenon.jp,2008:/blog//4.115</id>

    <published>2008-01-12T02:45:59Z</published>
    <updated>2008-01-12T03:06:12Z</updated>

    <summary> FleFlaのFaviconを作ろうと思い立って、FleFlaの名前の由来通り...</summary>
    <author>
        <name>Naohiko Ueno</name>
        <uri>http://uenon.jp/</uri>
    </author>
    
    <category term="favicon" label="Favicon" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="アイコン" label="アイコン" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://uenon.jp/blog/">
        <![CDATA[<p>
FleFlaの<a href="http://ja.wikipedia.org/wiki/Favicon">Favicon</a>を作ろうと思い立って、FleFlaの名前の由来通りFlexとFlashのアイコンを組み合わせたようなものにした。
</p>

<p class="ff_image">
<span class="mt-enclosure mt-enclosure-image"><img alt="flefla_icon.gif" src="http://uenon.jp/blog/archives/2008/01/12/flefla_icon.gif" width="32" height="32" /></span>
</p>

<p>
なんだかいい感じにできたので、FleFlaのブログタイトル横にも大きいサイズのアイコンを入れてみた。ちょっとユニクロっぽいのがまたいい。
</p>

]]>
        
    </content>
</entry>

<entry>
    <title>trace()とlogger.debug()の負荷テスト</title>
    <link rel="alternate" type="text/html" href="http://uenon.jp/blog/archives/2008/01/traceloggerdebug.html" />
    <id>tag:uenon.jp,2008:/blog//4.113</id>

    <published>2008-01-10T13:27:31Z</published>
    <updated>2008-01-13T14:01:53Z</updated>

    <summary> 某所でFlex Builder beta 3の「リリースビルドの書き出し」でt...</summary>
    <author>
        <name>Naohiko Ueno</name>
        <uri>http://uenon.jp/</uri>
    </author>
    
        <category term="Flex" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="flex3beta3" label="Flex 3 beta3" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="logging" label="logging" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="trace" label="trace" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="サンプルアプリ" label="サンプルアプリ" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="負荷テスト" label="負荷テスト" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://uenon.jp/blog/">
        <![CDATA[<p>
某所でFlex Builder beta 3の「リリースビルドの書き出し」でtrace()を無効化できないのは問題だ！という話題が出たので、trace()を実行する負荷と、それに加えてFlex SDKに含まれるロギングAPI（mx.logging.Logなど）の負荷もテストするサンプルを作りました。
</p>
]]>
        <![CDATA[<iframe src="/samples/200801/trace_test/TraceTest.html" width="690" height="500" frameborder="no">
<a href="/samples/200801/trace_test/TraceTest.html">負荷テストアプリ</a>
</iframe>

<pre name="code" class="mxml">
&lt;?xml version="1.0" encoding="utf-8"?>
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
	xmlns:local="*"
	layout="vertical"
	scriptTimeLimit="5"
	viewSourceURL="srcview/index.html">
	
	&lt;mx:Script>
	&lt;![CDATA[
	import mx.logging.ILogger;
	import mx.logging.Log;
	import mx.logging.targets.TraceTarget;
	
	private static const logger:ILogger = Log.getLogger("TraceTest");
	
	private static const NONE:String = "trace()なし";
	private static const TRACE:String = "trace()あり";
	private static const LOGGER:String = "logger.debug()"
	
	private var tt:TraceTarget;
	
	private function test(testCase:String):void
	{
		var loopCount:int = int(count_ns.value);
		
		var start:int, now:int;
		var i:int;
		
		output("■" + testCase);
		
		try
		{
			switch (testCase)
			{
				case NONE:
					start = getTimer();
					for (i = 0; i &lt; loopCount; i++) {
						"abcdefghijklmnopqrstuvwxyz";
					}
					now = getTimer();
					break;
				case TRACE:
					start = getTimer();
					for (i = 0; i &lt; loopCount; i++) {
						trace("abcdefghijklmnopqrstuvwxyz");
					}
					now = getTimer();
					break;
				case LOGGER:
					start = getTimer();
					for (i = 0; i &lt; loopCount; i++) {
						logger.debug("abcdefghijklmnopqrstuvwxyz");
					}
					now = getTimer();
					break;
			}
		}
		catch (e:Error)
		{
			now = getTimer();
			
			output("  " + i + "回目でエラー: " + e);
		}
		var time:int = now - start;
		output("  経過時間(ミリ秒): " + nf.format(time));
		output("  1秒あたりのループ回数: " + nf.format(i * 1000 / time));
		output("----------------------------------------");
	}
	
	private function updateTraceTarget():void
	{
		if (!tt)
		{
			tt = new TraceTarget();
			tt.includeDate = false;
			tt.includeTime = false;
			tt.includeLevel = true;
			tt.includeCategory = true;
		}
		
		if (traceTarget_ch.selected)
		{
			Log.addTarget(tt);
		}
		else
		{
			Log.removeTarget(tt);
		}
	}
	
	private function output(msg:String):void
	{
		output_ta.text += msg + "\n";
	}

	]]&gt;
	&lt;/mx:Script>
	
	&lt;mx:NumberFormatter id="nf" precision="0" />
	
	&lt;mx:Panel title="trace()とlogger.debug()の負荷テスト"
		width="100%" height="100%"
		paddingTop="8" paddingRight="8" paddingBottom="8" paddingLeft="8">
		
		&lt;mx:HBox>
			&lt;mx:Label text="forループ回数:" />
			&lt;mx:NumericStepper id="count_ns" value="1000000" maximum="10000000" />
		&lt;/mx:HBox>
		
		&lt;mx:HBox>
			&lt;mx:Button label="trace()なし" click="test(NONE)" />
			&lt;mx:Button label="trace()あり" click="test(TRACE)" />
			&lt;mx:Button label="logger.debug()" click="test(LOGGER)" />
			&lt;mx:CheckBox id="traceTarget_ch" label="TraceTargetを追加" change="updateTraceTarget()"/>
		&lt;/mx:HBox>
		
		&lt;mx:TextArea id="output_ta" width="100%" height="100%" />
		
		&lt;mx:Label color="red" text="※Application.scriptTimeLimitを5秒に設定してます" selectable="true" />
		
		&lt;mx:ControlBar verticalAlign="middle">
			&lt;mx:Label text="Compiled with Flex Builder 3 beta 3 (3.0.190133)" selectable="true" />
			&lt;mx:Spacer width="100%" minWidth="10" />
			&lt;local:SignatureBox />
		&lt;/mx:ControlBar>
		
	&lt;/mx:Panel>
	
&lt;/mx:Application>
</pre>

<p>
trace()は確かに負荷があります。それに比べるとlogger.debug()は軽いですね（TraceTargetを追加していない状態で）。
</p>

<p>
現時点ではFlexのコードにはtrace()を書かないのが正解なのかも。同じことが1年以上前に<a href="http://d.hatena.ne.jp/sato-shi/">sato-shiさんのブログ</a>に<a href="http://d.hatena.ne.jp/sato-shi/20061127/p11">書かれてました</a>。
</p>

<p>
僕はFlexのロギングAPIが割と好きですが、mxパッケージに依存するがちょっといやな感じです。FlashでもFlexでも使える共通のロギングAPIがあればいいなと以前から思っていたので、今度時間があるときにそういうのを提案しようかな。
</p>

<p>
追記（2008-01-13）: <a href="http://uenon.jp/blog/archives/2008/01/traceloggerdebug-1.html">負荷テスト結果をグラフにまとめました</a>。
</p>]]>
    </content>
</entry>

<entry>
    <title>Flex 4とPlayer 10.1発見！</title>
    <link rel="alternate" type="text/html" href="http://uenon.jp/blog/archives/2008/01/flex_4toplayer_101.html" />
    <id>tag:uenon.jp,2008:/blog//4.111</id>

    <published>2008-01-03T12:40:18Z</published>
    <updated>2008-01-03T15:07:39Z</updated>

    <summary> Flex Builder 3 beta 3を触ってて見つけた、ドキュメントに関...</summary>
    <author>
        <name>Naohiko Ueno</name>
        <uri>http://uenon.jp/</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://uenon.jp/blog/">
        <![CDATA[<p>
Flex Builder 3 beta 3を触ってて見つけた、ドキュメントに関するバグを<a href="https://bugs.adobe.com/jira/secure/CreateIssue!default.jspa">登録</a>しようとしたところ、「Found in version」の選択肢として「Flex 3」に並び「Post Flex 3」と「Flex 4」を発見！
</p>
]]>
        <![CDATA[<p class="ff_image">
<span class="mt-enclosure mt-enclosure-image"><a href="http://uenon.jp/blog/archives/2008/01/03/WS000013.html" onclick="window.open('http://uenon.jp/blog/archives/2008/01/03/WS000013.html','popup','width=850,height=728,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://uenon.jp/blog/2008/01/03/WS000013-thumb-320x274.jpg" width="320" height="274" alt="画面キャプチャ"  /></a></span>
</p>

<p>
ただの選択肢ですが、ちょっとテンション上がってしまいました。ただ「Flex 4」が表示されるのは、「Flex Documentation」プロジェクトのバグ登録画面だけで、「Flex Builder」プロジェクトや「Flex SDK」プロジェクトでは表示されません。
</p>

<p>
もうひとつちょいテンションが上がったのは「ActionScript」プロジェクトでの「Player 10.1 - Code Complete」とう選択肢。
</p>

<p>
<span class="mt-enclosure mt-enclosure-image"><a href="http://uenon.jp/blog/archives/2008/01/04/WS000014.html" onclick="window.open('http://uenon.jp/blog/archives/2008/01/04/WS000014.html','popup','width=850,height=728,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://uenon.jp/blog/2008/01/04/WS000014-thumb-320x274.jpg" width="320" height="274" alt="画面キャプチャ"  /></a></span>
</p>

<p>
すでにFlash Player 10.1の実装が完了してるってこと？まあ<a href="http://www.adobe.com/jp/events/maxjapan2007/">Adobe MAX Japan 2007</a>のスニークピークで実際に動く<a href="http://labs.adobe.com/wiki/index.php/Astro">Astro(Flash Player 10)</a>の<a href="http://ascii.jp/elem/000/000/081/81842/">デモ</a>をやっていたんだから、その部分の実装が完了してるのは当たり前か。
</p>

<p>
Astroの3Dパース機能を<a href="http://code.google.com/p/papervision3d/">Paperｖision3D</a>とかが利用すると平面のポリゴン数を激減できたりするのかな。そうなると今よりもっと凝った3Dコンテンツがバンバン登場するんでしょうね。楽しみですね。
</p>]]>
    </content>
</entry>

<entry>
    <title>Rails 2.0とFlex 3 beta3でRESTfulなBookmarkアプリを作ろう 3</title>
    <link rel="alternate" type="text/html" href="http://uenon.jp/blog/archives/2007/12/rails_20flex_3_beta3restfulboo_1.html" />
    <id>tag:uenon.jp,2007:/blog//4.110</id>

    <published>2007-12-26T02:45:14Z</published>
    <updated>2007-12-26T04:57:40Z</updated>

    <summary> 今回は前回の最後にでてきた問題（新規追加時のエラー）とその回避方法についてまと...</summary>
    <author>
        <name>Naohiko Ueno</name>
        <uri>http://uenon.jp/</uri>
    </author>
    
        <category term="Flex" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="flex3beta3" label="Flex 3 beta3" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="flexsdk" label="Flex SDK" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails202" label="Rails 2.0.2" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rest" label="REST" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="サンプルアプリ" label="サンプルアプリ" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="チュートリアル" label="チュートリアル" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://uenon.jp/blog/">
        <![CDATA[<p>
今回は<a href="http://uenon.jp/blog/archives/2007/12/rails-20flex-3-beta3restfulboo.html">前回</a>の最後にでてきた問題（新規追加時のエラー）とその回避方法についてまとめます。
</p>
]]>
        <![CDATA[<h2>問題の説明</h2>

<p>
Bookmarkを新規追加すると、エラーのダイアログが表示されます。
</p>

<p class="ff_image">
<span class="mt-enclosure mt-enclosure-image"><a href="http://uenon.jp/blog/archives/2007/12/26/WS000010.html" onclick="window.open('http://uenon.jp/blog/archives/2007/12/26/WS000010.html','popup','width=773,height=495,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://uenon.jp/blog/2007/12/26/WS000010-thumb-320x204.jpg" width="320" height="204" alt="画面キャプチャ" /></a></span>
</p>

<p>
でも、最新のリストを再取得してみるとBookmarkの追加自体は成功しています。
</p>

<p class="ff_image">
<span class="mt-enclosure mt-enclosure-image"><a href="http://uenon.jp/blog/archives/2007/12/26/WS000011.html" onclick="window.open('http://uenon.jp/blog/archives/2007/12/26/WS000011.html','popup','width=773,height=495,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://uenon.jp/blog/2007/12/26/WS000011-thumb-320x204.jpg" width="320" height="204" alt="画面キャプチャ" /></a></span>
</p>

<p>
つまり、新規追加の処理自体は成功しているのに、誤ってエラーダイアログが表示されるということです。
</p>

<h2>原因</h2>

<p>
HTTPステータスコード「<a href="http://www.studyinghttp.net/status_code#Code201">201 Created</a>」の扱いについてRailsとFlexにずれがあることが原因です。一般的なWebアプリにおいて、通常クライアントのリクエストが成功した場合はHTTPステータスコード「<a href="http://www.studyinghttp.net/status_code#Code200">200 OK</a>」が返されますが、RailsのRESTfulアプリにおいて新規生成（PUT）が成功したときは、201が返されるようです。ところが、Flexが201を受け取るとエラーとして処理してしまいます。
</p>

<p>
これをFlexのバグとして<a href="https://bugs.adobe.com/jira/browse/SDK-14153">報告</a>しましたが、微妙なとこではあります。というのは、201はHTTPのPUTメソッドが成功したときに返されるものと定義されるようですが、Flex（Flash Player）ではPUTメソッドは送信できません（GETとPOSTのみ可）。これは一般的なブラウザでも同じです。そこでRailsのRESTfulアプリではパラメータに"_method=PUT"が含まれたPOSTメソッドでPUTメソッドの代用ができることを利用して擬似的にPUTを実現しています。つまり実際Flexから送信されているのはPOSTメソッドなのでそのレスポンスにおいてFlexが201を考慮していないのは仕方が無いとも言えます。
</p>

<p>
ただ、今後FlexがRESTfulアプリのクライアントとして重要な地位を占めるためにも、これはぜひ対応してほしいとこです。FlexからＰＵTやDELETEをプロキシサーバなしに送信可能になったらなおよいですが。それはFlash Playerの制限で<a href="https://bugs.adobe.com/jira/browse/SDK-12200">無理そう</a>です。
</p>

<h2>回避方法</h2>

<p>
Flex側でHTTPServiceの代わりに、URLLoaderを使って、HTTPStatusEventを取って（この場合もioErrorになる）201の場合、例外処理をする手もあるが、<a href="http://livedocs.adobe.com/labs/flex3/langref/flash/net/URLLoader.html#event:httpStatus">ブラウザによっては取れない場合もあるらしい</a>ので、サーバ側で対応した方がいいでしょう。
</p>

<p>
つまり、現在201を返しているとこを修正して200を返すようにします。修正するファイルは<code>[RAILS_ROOT]\app\controllers\</code>にあるbookmarks_controller.rbです。これを以下のように修正します。
</p>

<pre name="code" class="ruby">
# bookmarks_controller.rb抜粋

  # POST /bookmarks
  # POST /bookmarks.xml
  def create
    @bookmark = Bookmark.new(params[:bookmark])

    respond_to do |format|
      if @bookmark.save
        flash[:notice] = 'Bookmark was successfully created.'
        format.html { redirect_to(@bookmark) }
        #format.xml  { render :xml => @bookmark, :status => :created, :location => @bookmark } # 201を返す
        format.xml  { render :xml => @bookmark, :location => @bookmark } # 200を返す
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @bookmark.errors, :status => :unprocessable_entity }
      end
    end
  end
</pre>

<h2>修正完了</h2>

<p>
これでRESTfulアプリの基本機能である、一覧取得（GET）、新規追加（PUT）、更新（POST）、削除（DELETE）がエラーなくできるようになりました。
</p>

<p>
次回は、このアプリをレンタルサーバの<a href="http://www.xrea.com/">XREA</a>にアップしてアプリを公開するとこまでやりましょう。
</p>]]>
    </content>
</entry>

<entry>
    <title>SyntaxHighlighterを導入</title>
    <link rel="alternate" type="text/html" href="http://uenon.jp/blog/archives/2007/12/syntaxhighlighter.html" />
    <id>tag:uenon.jp,2007:/blog//4.102</id>

    <published>2007-12-21T22:59:54Z</published>
    <updated>2007-12-22T03:01:18Z</updated>

    <summary>ShigeruさんがSyntaxHighlighterのMXML用ファイルを公開...</summary>
    <author>
        <name>Naohiko Ueno</name>
        <uri>http://uenon.jp/</uri>
    </author>
    
        <category term="Flex" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="markdown" label="Markdown" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="syntaxhighlighter" label="SyntaxHighlighter" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://uenon.jp/blog/">
        <![CDATA[<p><a href="http://shigeru-nakagaki.com/">Shigeruさん</a>が<a href="http://code.google.com/p/syntaxhighlighter/">SyntaxHighlighter</a>のMXML用ファイルを<a href="http://shigeru-nakagaki.com/index.cfm/2007/12/19/20071219-SyntaxHighlighter-for-MXML-and-AS3">公開</a>してるのをみてこのブログでもSyntaxHighlighterを導入しました。</p>
]]>
        <![CDATA[<p>
以下SyntaxHighlighterでソースを表示させたときのサンプルです。ちょっとSyntaxHighlighterのスタイルを変更して日本語化してます。
</p>
<p>
MXMLソースをSyntaxHighlighterで表示。Shigeruさんすばらしい！
</p>
<pre name="code" class="mxml">
&lt;?xml version="1.0" encoding="utf-8"?>
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
	&lt;mx:Script>
		&lt;![CDATA[
			[Embed(source="logo.gif")]
			[Bindable]
			public var imgCls:Class;
		]]&gt;
	&lt;/mx:Script>
	&lt;mx:Image source="{ imgCls }"/>
&lt;/mx:Application>
</pre>
<p>
AS3ソースをSyntaxHighlighterで表示。
</p>
<pre name="code" class="as3">
package jp.redhands
{
	import flash.text.TextField;

	public class Sejutsu extends TextField
	{
		public function Sejutsu()
		{
			text = "施術";
		}
	}
}
</pre>
<p>
SyntaxHighlighterを使うときは<a href="http://www.sixapart.jp/movabletype/plugins/markdown.html">Markdown</a>が使えない(空行があったりするとくずれる)のが難点だなあ。
</p>]]>
    </content>
</entry>

<entry>
    <title>Rails 2.0.2にアップデート</title>
    <link rel="alternate" type="text/html" href="http://uenon.jp/blog/archives/2007/12/rails_202.html" />
    <id>tag:uenon.jp,2007:/blog//4.101</id>

    <published>2007-12-18T13:37:43Z</published>
    <updated>2007-12-21T23:02:43Z</updated>

    <summary> Rails 2.0.2がリリースされたらしいので、コマンドラインでアップデート...</summary>
    <author>
        <name>Naohiko Ueno</name>
        <uri>http://uenon.jp/</uri>
    </author>
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="rails202" label="Rails 2.0.2" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://uenon.jp/blog/">
        <![CDATA[<p>
<a href="http://weblog.rubyonrails.com/2007/12/17/rails-2-0-2-some-new-defaults-and-a-few-fixes">Rails 2.0.2がリリースされた</a>らしいので、コマンドラインでアップデート。
</p>
<pre class="console">
D:\>gem update rails
Updating installed gems...
Updating metadata for 33 gems from http://gems.rubyforge.org
.................................
complete
Attempting remote update of rails
Successfully installed rails-2.0.2
1 gem installed
Gems: [rails] updated
</pre>
<p>
<a href="http://journal.mycom.co.jp/news/2007/12/18/025/index.html">デフォルトDBがMySQLからSQLite3になった</a>らしい。
</p>
]]>
        
    </content>
</entry>

<entry>
    <title>Rails 2.0とFlex 3 beta3でRESTfulなBookmarkアプリを作ろう 2</title>
    <link rel="alternate" type="text/html" href="http://uenon.jp/blog/archives/2007/12/rails_20flex_3_beta3restfulboo.html" />
    <id>tag:uenon.jp,2007:/blog//4.100</id>

    <published>2007-12-17T22:26:54Z</published>
    <updated>2007-12-26T04:32:24Z</updated>

    <summary>  前回の続きで、今回はクライアントサイドのFlexの実装をしましょう。 ...</summary>
    <author>
        <name>Naohiko Ueno</name>
        <uri>http://uenon.jp/</uri>
    </author>
    
        <category term="Flex" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="flex3beta3" label="Flex 3 beta3" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="flexsdk" label="Flex SDK" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails201" label="Rails 2.0.1" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rest" label="REST" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="サンプルアプリ" label="サンプルアプリ" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="チュートリアル" label="チュートリアル" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://uenon.jp/blog/">
        <![CDATA[<p>
<a href="http://uenon.jp/blog/archives/2007/12/rails-20flex-3-beta3restful-1-1.html"> 前回</a>の続きで、今回はクライアントサイドのFlexの実装をしましょう。
</p>
]]>
        <![CDATA[<p>FlexにはEclipseベースの<a href="http://www.adobe.com/jp/products/flex/flexbuilder/">Flex Builder</a>という<a href="http://www.adobe.com/jp/products/flex/buy/">有償</a>（30,000円～）の開発環境が用意されてますが、今回は無償で使えるFlex SDKだけでやりましょう。これを使えばコマンドラインでコンパイルできます。</p>

<p>ちなみに今回は使いまんせがFlex Builder 3 beta3のダウンロードは<a href="http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs_adobeflexbuilder3">ここ</a>からできます。</p>

<h2>準備 （Flex 3 beta3 の SDK）</h2>

<p><a href="http://labs.adobe.com/">Adobe Labs</a>の<a href="http://labs.adobe.com/technologies/flex/sdk/flex3sdk.html">Flex 3 SDKダウンロードページ</a>からDownload Flex 3 SDK 3 beta 3 for all platformsをダウンロード＆解凍して適当なディレクトリに配置します。</p>

<p>僕の場合は、<code>D:\flex\</code>の中に入れました。</p>

<p class="ff_image">
<span class="mt-enclosure mt-enclosure-image"><a href="http://uenon.jp/blog/archives/WS000003.html" onclick="window.open('http://uenon.jp/blog/archives/WS000003.html','popup','width=580,height=389,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://uenon.jp/blog/assets_c/2007/12/WS000003-thumb-320x214.jpg" width="320" height="214" alt="画面キャプチャ" /></a></span>
</p>

<p>さて、コマンドラインで使えるように、パスを通しましょう。</p>

<p>Windows XPの僕のマシンの場合、環境変数PATHに<code>D:\flex\flex3sdk_b3_121207\bin\</code>をセットしました。</p>

<p class="ff_image">
<span class="mt-enclosure mt-enclosure-image"><a href="http://uenon.jp/blog/archives/WS000007.html" onclick="window.open('http://uenon.jp/blog/archives/WS000007.html','popup','width=529,height=455,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://uenon.jp/blog/assets_c/2007/12/WS000007-thumb-320x275.jpg" width="320" height="275" alt="画面キャプチャ" /></a></span>
</p>

<h2>準備 （Flash Player）</h2>

<p>Flash Playerのバージョンを確認。<a href="http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_15507">バージョン確認ページ</a>。</p>

<p class="ff_image">
<span class="mt-enclosure mt-enclosure-image"><a href="http://uenon.jp/blog/archives/WS000004.html" onclick="window.open('http://uenon.jp/blog/archives/WS000004.html','popup','width=693,height=537,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://uenon.jp/blog/assets_c/2007/12/WS000004-thumb-320x247.jpg" width="320" height="247" alt="画面キャプチャ" /></a></span>
</p>

<p>9.0.28未満の場合は、新しいバージョンのFlash Playerをインストール必要があります。
開発時はDebug版のFlash Playerの方が便利なので、バージョンの問題がない場合も含めて最新（現在は9.0.115）のDebug版Flash Playerをインストールしておくといいでしょう。</p>

<p>さっきダウンロードしたSDKの中にそのインストーラが入ってます。
僕の場合、<code>D:\flex\flex3sdk_b3_121207\runtimes\player\</code>以下にあります。</p>

<h2>Flexを知らない人のために</h2>

<p>FlexにはボタンやチェックボックスなどのUIコンポーネントや、通信のためのコンポーネントなどアプリケーションのインタフェースを作る上で便利なものがいっぱい用意されてます。</p>

<p>どんなものがあるかは<a href="http://examples.adobe.com/flex3/componentexplorer/explorer.html">Flex 3 Compon Entexplorer</a>を見るのがいいでしょう。UIコンポーネントはCSSによるスタイル変更も可能で、それは<a href="http://examples.adobe.com/flex3/consulting/styleexplorer/Flex3StyleExplorer.html">Flex Style Explorer</a>で動的に確認できます。</p>

<p>ちなみにこのStyle Explorerはソース付きで、画面上で右クリックしてメニューの「View Source」でソースの閲覧＆ダウンロードができます。</p>

<p class="ff_image">
<span class="mt-enclosure mt-enclosure-image"><a href="http://uenon.jp/blog/archives/WS000005.html" onclick="window.open('http://uenon.jp/blog/archives/WS000005.html','popup','width=734,height=568,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://uenon.jp/blog/assets_c/2007/12/WS000005-thumb-320x247.jpg" width="320" height="247" alt="画面キャプチャ" /></a></span>
</p>

<p class="ff_image">
<span class="mt-enclosure mt-enclosure-image"><a href="http://uenon.jp/blog/archives/WS000006.html" onclick="window.open('http://uenon.jp/blog/archives/WS000006.html','popup','width=726,height=563,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://uenon.jp/blog/assets_c/2007/12/WS000006-thumb-320x248.jpg" width="320" height="248" alt="画面キャプチャ" /></a></span>
</p>

<h2>Flexの実装</h2>

<p>Flexのソースファイルを置くところはどこでもいいのですが、僕の場合は、<code>D:\rails\rails2restful\</code>にflex_srcというフォルダを作りました。</p>

<p>その中にRails2RESTful.mxmlというテキストファイルを作り、以下のコードを入力します。文字コードはUTF-8。</p>

<pre name="code" class="mxml">
&lt;?xml version="1.0" encoding="utf-8"?>
&lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
		initialize="listBookmarks()">
	&lt;mx:Script>
	&lt;![CDATA[
		import mx.controls.Alert;
		import mx.events.CloseEvent;
		import mx.rpc.AsyncResponder;
		import mx.rpc.AsyncToken;
		private function listBookmarks():void
		{
			listBookmarksHS.url = "/bookmarks.xml";
			listBookmarksHS.method = "GET";
			var call:AsyncToken = listBookmarksHS.send();
			call.addResponder(new AsyncResponder(
				function (result:Object, token:Object = null):void
				{
					Alert.show(result.toString(), "listBookmarks 成功");
				},
				function (error:Object, token:Object = null):void
				{
					Alert.show(error.toString(), "listBookmarks エラー");
				},
				call
			));
		}
		private function createBookmark():void
		{
			var request:XML = 
				&lt;bookmark>
					&lt;name>{ nameTextInput.text }&lt;/name>
					&lt;url>{ urlTextInput.text }&lt;/url>
				&lt;/bookmark>;
			createBookmarkHS.contentType = "application/xml";
			createBookmarkHS.url = "/bookmarks.xml";
			createBookmarkHS.method = "POST";
			var call:AsyncToken = createBookmarkHS.send(request);
			call.addResponder(new AsyncResponder(
				function (result:Object, token:Object = null):void
				{
					Alert.show(result.toString(), "createBookmark 成功", 4, null, 
						function (event:CloseEvent):void
						{
							listBookmarks();
						});
				},
				function (error:Object, token:Object = null):void
				{
					Alert.show(error.toString(), "createBookmark エラー");
				},
				call
			));
		}
		private function updateBookmark():void
		{
			var request:Object = {};
			request["_method"] = "PUT";
			request["bookmark[name]"] = nameTextInput.text;
			request["bookmark[url]"] = urlTextInput.text;
			updateBookmarkHS.url = "/bookmarks/" + dataGrid.selectedItem.id + ".xml";
			updateBookmarkHS.method = URLRequestMethod.POST;
			var call:AsyncToken = updateBookmarkHS.send(request);
			call.addResponder(new AsyncResponder(
				function (result:Object, token:Object = null):void
				{
					Alert.show(result.toString(), "updateBookmark 成功", 4, null, 
						function (event:CloseEvent):void
						{
							listBookmarks();
						});
				},
				function (error:Object, token:Object = null):void
				{
					Alert.show(error.toString(), "updateBookmark エラー");
				},
				call
			));
		}
		private function destroyBookmark():void
		{
			var request:Object = {};
			request["_method"] = "DELETE";
			destroyBookmarkHS.url = "/bookmarks/" + dataGrid.selectedItem.id + ".xml";
			destroyBookmarkHS.method = URLRequestMethod.POST;
			var call:AsyncToken = destroyBookmarkHS.send(request);
			call.addResponder(new AsyncResponder(
				function (result:Object, token:Object = null):void
				{
					Alert.show(result.toString(), "destroyBookmark 成功", 4, null, 
						function (event:CloseEvent):void
						{
							listBookmarks();
						});
				},
				function (error:Object, token:Object = null):void
				{
					Alert.show(error.toString(), "destroyBookmark エラー");
				},
				call
			));
		}
	]]&gt;
	&lt;/mx:Script>
	
	&lt;mx:HTTPService id="listBookmarksHS" useProxy="false" showBusyCursor="true" />
	&lt;mx:HTTPService id="createBookmarkHS" useProxy="false" showBusyCursor="true" />
	&lt;mx:HTTPService id="updateBookmarkHS" useProxy="false" showBusyCursor="true" />
	&lt;mx:HTTPService id="destroyBookmarkHS" useProxy="false" showBusyCursor="true" />
	
	&lt;mx:Button label="最新" top="8" right="8" click="listBookmarks()" />
	&lt;mx:DataGrid id="dataGrid" left="8" top="40" right="8" bottom="120"
		dataProvider="{ listBookmarksHS.lastResult.bookmarks.bookmark }"/>
	&lt;mx:Form left="8" right="8" bottom="8">
		&lt;mx:FormItem label="名前">
			&lt;mx:TextInput id="nameTextInput" text="{ dataGrid.selectedItem.name }" />
		&lt;/mx:FormItem>
		&lt;mx:FormItem label="URL">
			&lt;mx:TextInput id="urlTextInput" text="{ dataGrid.selectedItem.url }" />
		&lt;/mx:FormItem>
		&lt;mx:FormItem direction="horizontal">
			&lt;mx:Button label="新規追加" click="createBookmark()" />
			&lt;mx:Button label="更新" click="updateBookmark()" />
			&lt;mx:Button label="削除" click="destroyBookmark()" />
		&lt;/mx:FormItem>
	&lt;/mx:Form>
&lt;/mx:Application>
</pre>

<h2>コマンドラインでコンパイル</h2>

<pre class="console">D:\rails\rails2restful&gt;mxmlc flex_src\Rails2RESTful.mxml
Loading configuration file D:\flex\flex3sdk_b3_121207\frameworks\flex-config.xml

This beta will expire on Sat Mar 15 00:00:00 JST 2008.
D:\rails\rails2restful\flex_src\Rails2RESTful.swf (321711 bytes)
</pre>

<h2>ブラウザで確認するための準備</h2>

<p>できたSWFファイルをRailsのpublicフォルダにコピー。
僕の場合は、<code>D:\rails\rails2restful\public\</code>以下にコピー。</p>

<p>同フォルダにSWFを表示するためのhtmlファイル、flex.htmlを作ります。以下はソース。</p>

<pre name="code" class="html">
&lt;html>
&lt;head>
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
&lt;style>
body { margin: 0px; overflow:hidden }
&lt;/style>
&lt;/head>
&lt;body scroll="no">
    &lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
        id="Rails2RESTful" width="100%" height="100%"
        codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
        &lt;param name="movie" value="Rails2RESTful.swf" />
        &lt;param name="quality" value="high" />
        &lt;param name="bgcolor" value="#869ca7" />
        &lt;param name="allowScriptAccess" value="sameDomain" />
        &lt;embed src="Rails2RESTful.swf" quality="high" bgcolor="#869ca7"
            width="100%" height="100%" name="Rails2RESTful" align="middle"
            play="true"
            loop="false"
            quality="high"
            allowScriptAccess="sameDomain"
            type="application/x-shockwave-flash"
            pluginspage="http://www.adobe.com/go/getflashplayer">
        &lt;/embed>
    &lt;/object>
&lt;/body>
&lt;/html>
</pre>

<h2>ブラウザで確認</h2>

<p><a href="http://localhost:3000/flex.html">http://localhost:3000/flex.html</a>を開く。</p>

<p class="ff_image">
<span class="mt-enclosure mt-enclosure-image"><a href="http://uenon.jp/blog/archives/WS000008.html" onclick="window.open('http://uenon.jp/blog/archives/WS000008.html','popup','width=638,height=446,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://uenon.jp/blog/assets_c/2007/12/WS000008-thumb-320x223.jpg" width="320" height="223" alt="画面キャプチャ" /></a></span>
</p>

<p>データ取得ＯＫ。
データの新規追加、更新、削除も動作確認。</p>

<p class="ff_image">
<span class="mt-enclosure mt-enclosure-image"><a href="http://uenon.jp/blog/archives/WS0000091.html" onclick="window.open('http://uenon.jp/blog/archives/WS0000091.html','popup','width=694,height=520,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://uenon.jp/blog/assets_c/2007/12/WS000009-thumb-320x239.jpg" width="320" height="239" alt="画面キャプチャ" /></a></span>
</p>

<p>ほぼ問題なし、だけど、データの新規追加のときだけ、エラーが発生する。
これについては、<a href="http://uenon.jp/blog/archives/2007/12/rails-20flex-3-beta3restfulboo-1.html">次回</a>で。</p>

<p>つづく。</p>]]>
    </content>
</entry>

<entry>
    <title>Rails 2.0とFlex 3 beta3でRESTfulなBookmarkアプリを作ろう 1</title>
    <link rel="alternate" type="text/html" href="http://uenon.jp/blog/archives/2007/12/rails_20flex_3_beta3restful_1_1.html" />
    <id>tag:uenon.jp,2007:/blog//4.98</id>

    <published>2007-12-16T22:03:00Z</published>
    <updated>2007-12-22T07:22:41Z</updated>

    <summary>昨日、Rails勉強会＠東京第25回に参加してきました。 「TrackBackを...</summary>
    <author>
        <name>Naohiko Ueno</name>
        <uri>http://uenon.jp/</uri>
    </author>
    
        <category term="Flex" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="flex3beta3" label="Flex 3 beta3" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails201" label="Rails 2.0.1" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rest" label="REST" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="サンプルアプリ" label="サンプルアプリ" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="チュートリアル" label="チュートリアル" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://uenon.jp/blog/">
        <![CDATA[<p>昨日、<a href="http://wiki.fdiary.net/rails/?RailsMeetingTokyo-0025">Rails勉強会＠東京第25回</a>に参加してきました。
「TrackBackを送るまでが勉強会です。」ということなので、なんか記事を書きましょう。</p>

<p>RubyやRailsは初心者ですが、Flexは割とできるのでRails+Flexで簡単なサンプルアプリを作ろうと思います。</p>

<p>今日は、ブラウザでXMLを表示するとこまでやりましょう。</p>]]>
        <![CDATA[<h2>使うもの</h2>

<ul>
<li>サーバサイド: Rails 2.0.1</li>
<li>DB: sqlite3</li>
<li>IO: REST</li>

<li>クライアントサイド: Flex 3 beta3</li>
</ul>

<h2>準備</h2>

<pre class="console"><code>&gt;gem install rails
&gt;gem install sqlite3-ruby
</code></pre>

<p>とかやればいいでしょう。</p>

<h2>Railsアプリをコマンドラインで作成</h2>

<pre class="console"><code>D:\rails&gt;rails -d sqlite3 rails2restful
      create
      create  app/controllers
      create  app/helpers
      create  app/models
      create  app/views/layouts
      create  config/environments
      create  config/initializers
      create  db
      create  doc
      create  lib
      create  lib/tasks
      create  log
      create  public/images
      create  public/javascripts
      create  public/stylesheets
      create  script/performance
      create  script/process
      create  test/fixtures
      create  test/functional
      create  test/integration
      create  test/mocks/development
      create  test/mocks/test
      create  test/unit
      create  vendor
      create  vendor/plugins
      create  tmp/sessions
      create  tmp/sockets
      create  tmp/cache
      create  tmp/pids
      create  Rakefile
      create  README
      create  app/controllers/application.rb
      create  app/helpers/application_helper.rb
      create  test/test_helper.rb
      create  config/database.yml
      create  config/routes.rb
      create  public/.htaccess
      create  config/initializers/inflections.rb
      create  config/initializers/mime_types.rb
      create  config/boot.rb
      create  config/environment.rb
      create  config/environments/production.rb
      create  config/environments/development.rb
      create  config/environments/test.rb
      create  script/about
      create  script/console
      create  script/destroy
      create  script/generate
      create  script/performance/benchmarker
      create  script/performance/profiler
      create  script/performance/request
      create  script/process/reaper
      create  script/process/spawner
      create  script/process/inspector
      create  script/runner
      create  script/server
      create  script/plugin
      create  public/dispatch.rb
      create  public/dispatch.cgi
      create  public/dispatch.fcgi
      create  public/404.html
      create  public/422.html
      create  public/500.html
      create  public/index.html
      create  public/favicon.ico
      create  public/robots.txt
      create  public/images/rails.png
      create  public/javascripts/prototype.js
      create  public/javascripts/effects.js
      create  public/javascripts/dragdrop.js
      create  public/javascripts/controls.js
      create  public/javascripts/application.js
      create  doc/README_FOR_APP
      create  log/server.log
      create  log/production.log
      create  log/development.log
      create  log/test.log

D:\rails&gt;cd rails2restful

D:\rails\rails2restful&gt;rake db:create
(in D:/rails/rails2restful)
"db/development.sqlite3 already exists"

D:\rails\rails2restful&gt;ruby script\generate scaffold bookmark name:string url:st
ring
      exists  app/models/
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/bookmarks
      exists  app/views/layouts/
      exists  test/functional/
      exists  test/unit/
      create  app/views/bookmarks/index.html.erb
      create  app/views/bookmarks/show.html.erb
      create  app/views/bookmarks/new.html.erb
      create  app/views/bookmarks/edit.html.erb
      create  app/views/layouts/bookmarks.html.erb
      create  public/stylesheets/scaffold.css
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
      create    app/models/bookmark.rb
      create    test/unit/bookmark_test.rb
      create    test/fixtures/bookmarks.yml
      create    db/migrate
      create    db/migrate/001_create_bookmarks.rb
      create  app/controllers/bookmarks_controller.rb
      create  test/functional/bookmarks_controller_test.rb
      create  app/helpers/bookmarks_helper.rb
       route  map.resources :bookmarks

D:\rails\rails2restful&gt;rake db:migrate
(in D:/rails/rails2restful)
== 1 CreateBookmarks: migrating ===============================================
-- create_table(:bookmarks)
   -&gt; 0.0620s
== 1 CreateBookmarks: migrated (0.0620s) ======================================
</code></pre>

<p>実行したコマンドだけまとめると</p>

<pre class="console"><code>&gt;rails -d sqlite3 rails2restful
&gt;cd rails2restful
&gt;rake db:create
&gt;ruby script\generate scaffold bookmark name:string url:string
&gt;rake db:migrate
</code></pre>

<h2>サーバ起動</h2>

<pre class="console"><code>D:\rails\rails2restful&gt;ruby script\server
=&gt; Booting WEBrick...
=&gt; Rails application started on http://0.0.0.0:3000
=&gt; Ctrl-C to shutdown server; call with --help for options
[2007-12-17 03:37:04] INFO  WEBrick 1.3.1
[2007-12-17 03:37:04] INFO  ruby 1.8.6 (2007-03-13) [i386-mswin32]
[2007-12-17 03:37:04] INFO  WEBrick::HTTPServer#start: pid=2364 port=3000
</code></pre>

<h2>ブラウザで動作確認</h2>

<p><a href="http://localhost:3000/bookmarks/">http://localhost:3000/bookmarks/</a>を開く</p>

<p class="ff_image">
<span class="mt-enclosure mt-enclosure-image"><a href="http://uenon.jp/blog/archives/WS000000.html" onclick="window.open('http://uenon.jp/blog/archives/WS000000.html','popup','width=654,height=407,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://uenon.jp/blog/assets_c/2007/12/WS000000-thumb-320x199.jpg" width="320" height="199" alt="画面キャプチャ" /></a></span>
</p>

<p>Bookmarkを追加してみる</p>

<ul>
<li>REDHANDS <a href="http://redhands.jp/">http://redhands.jp/</a></li>
<li>東急ハンズ <a href="http://www.tokyu-hands.co.jp/">http://www.tokyu-hands.co.jp/</a></li>
</ul>

<p class="ff_image">
<span class="mt-enclosure mt-enclosure-image"><a href="http://uenon.jp/blog/archives/WS0000011.html" onclick="window.open('http://uenon.jp/blog/archives/WS0000011.html','popup','width=654,height=407,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://uenon.jp/blog/assets_c/2007/12/WS000001-thumb-320x199.jpg" width="320" height="199" alt="画面キャプチャ" /></a></span>
</p>

<h2>RESTで見る</h2>

<p><a href="http://localhost:3000/bookmarks.xml">http://localhost:3000/bookmarks.xml</a>を開く</p>

<p class="ff_image">
<span class="mt-enclosure mt-enclosure-image"><a href="http://uenon.jp/blog/archives/WS000002.html" onclick="window.open('http://uenon.jp/blog/archives/WS000002.html','popup','width=654,height=407,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://uenon.jp/blog/assets_c/2007/12/WS000002-thumb-320x199.jpg" width="320" height="199" alt="画面キャプチャ" /></a></span>
</p>

<p>
<pre name="code" class="xml">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;bookmarks type="array"&gt;

  &lt;bookmark&gt;
    &lt;created-at type="datetime"&gt;2007-12-17T06:41:23+09:00&lt;/created-at&gt;
    &lt;id type="integer"&gt;1&lt;/id&gt;
    &lt;name&gt;REDHANDS&lt;/name&gt;

    &lt;updated-at type="datetime"&gt;2007-12-17T06:41:23+09:00&lt;/updated-at&gt;
    &lt;url&gt;http://redhands.jp/&lt;/url&gt;
  &lt;/bookmark&gt;
  &lt;bookmark&gt;
    &lt;created-at type="datetime"&gt;2007-12-17T06:41:45+09:00&lt;/created-at&gt;

    &lt;id type="integer"&gt;2&lt;/id&gt;
    &lt;name&gt;&amp;#26481;&amp;#24613;&amp;#12495;&amp;#12531;&amp;#12474;&lt;/name&gt;
    &lt;updated-at type="datetime"&gt;2007-12-17T06:41:45+09:00&lt;/updated-at&gt;

    &lt;url&gt;http://www.tokyu-hands.co.jp/&lt;/url&gt;
  &lt;/bookmark&gt;
&lt;/bookmarks&gt;
</pre>
</p>

<p>よしよし。</p>

<p>では
<a href="http://localhost:3000/bookmarks/1.xml">http://localhost:3000/bookmarks/1.xml</a>を開くと</p>

<p>
<pre name="code" class="xml">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;bookmark&gt;
  &lt;created-at type="datetime"&gt;2007-12-17T06:41:23+09:00&lt;/created-at&gt;
  &lt;id type="integer"&gt;1&lt;/id&gt;
  &lt;name&gt;REDHANDS&lt;/name&gt;

  &lt;updated-at type="datetime"&gt;2007-12-17T06:41:23+09:00&lt;/updated-at&gt;
  &lt;url&gt;http://redhands.jp/&lt;/url&gt;
&lt;/bookmark&gt;
</pre>
</p>

<p>なるほど。ルートノードがbookmarkになるわけですな。</p>

<p>ここまでコードを書かずにコマンドライン5行の実行だけでアプリになるRailsはすばらしいですね。</p>

<p><a href="http://uenon.jp/blog/archives/2007/12/rails-20flex-3-beta3restfulboo.html">つづく</a>。</p>]]>
    </content>
</entry>

<entry>
    <title>REDHANDS「無料体験キャンペーン for Flash系開発会社」</title>
    <link rel="alternate" type="text/html" href="http://uenon.jp/blog/archives/2007/11/redhands_for_flash.html" />
    <id>tag:uenon.jp,2007:/blog//4.96</id>

    <published>2007-11-27T15:00:00Z</published>
    <updated>2007-12-21T15:58:16Z</updated>

    <summary>REDHANDSでFlash系開発会社様向けにキャンペーンを始めました。よかった...</summary>
    <author>
        <name>Naohiko Ueno</name>
        <uri>http://uenon.jp/</uri>
    </author>
    
        <category term="REDHANDS" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="redhands" label="REDHANDS" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://uenon.jp/blog/">
        <![CDATA[REDHANDSでFlash系開発会社様向けに<a href="http://blog.redhands.jp/article/69643894.html">キャンペーン</a>を始めました。<br />よかったらどうぞ。<br />]]>
        
    </content>
</entry>

<entry>
    <title>REDHANDS 1.0リリース</title>
    <link rel="alternate" type="text/html" href="http://uenon.jp/blog/archives/2007/11/redhands_10.html" />
    <id>tag:uenon.jp,2007:/blog//4.95</id>

    <published>2007-11-06T15:12:13Z</published>
    <updated>2007-12-21T15:57:26Z</updated>

    <summary>IT業界引退後、人を癒す仕事をしたいと思った。それがやっと形になった。REDHA...</summary>
    <author>
        <name>Naohiko Ueno</name>
        <uri>http://uenon.jp/</uri>
    </author>
    
        <category term="REDHANDS" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="redhands" label="REDHANDS" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://uenon.jp/blog/">
        <![CDATA[IT業界引退後、人を癒す仕事をしたいと思った。<br />それがやっと形になった。<br /><br />REDHANDS 1.0本日リリースです。<br /><a href="http://redhands.jp/">http://redhands.jp/</a><br /><br />今後もFlashやFlexは趣味としてバリバリやりますよ。<br /> ]]>
        
    </content>
</entry>

</feed>
