<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 <title>Blog on AIRS</title>
 <link href="http://blog.airs.co.jp/feed/atom.xml" rel="self"/>
 <link href="http://blog.airs.co.jp/"/>
 <updated>2011-12-18T09:43:52+09:00</updated>
 <id>http://blog.airs.co.jp/</id>
 <author>
   <name>AIRS inc.</name>
 </author>

 
 <entry>
   <title>JIRAとGitでDRYなワークフローを実践する</title>
   <link href="http://blog.airs.co.jp/2011/12/18/git-jira-dry-workflow.html"/>
   <updated>2011-12-18T00:00:00+09:00</updated>
   <id>/2011/12/18/git-jira-dry-workflow.html</id>
   <content type="html">&lt;p&gt;こんにちは、加藤です。誰かに振られたわけではなく自主的に、&lt;a href=&quot;http://atnd.org/events/22899&quot;&gt;JIRA Advent Calendar 2011&lt;/a&gt;の17番目として参戦します。&lt;/p&gt;

&lt;p&gt;ジラリアンとしては、１年半位前に&lt;a href=&quot;http://eatw.it/&quot;&gt;Eatwit&lt;/a&gt;という自社製品のiPhoneアプリの開発からJIRA+GreenHopper / Confluence / Fisheye を使い始めて、ようやくひと通りの機能が使えるようになってきたレベルです。その前はTracを使っていました。受託案件ではRedmineも使っています。&lt;/p&gt;

&lt;h3&gt;Fisheye経由でJIRAとGitを連携&lt;/h3&gt;

&lt;p&gt;エアーズではバージョン管理にGitを使っています。共有リポジトリはJIRAやFisheyeと同じサーバー(Mac mini)にgitosisというソフトウェアを使って設置してあります。プロジェクトによっては、GitHubやBitbucketも使いますが、社内にある共有リポジトリは速くて快適です。&lt;/p&gt;

&lt;p&gt;Gitの共有リポジトリをFisheyeに登録し、JIRAのFisheye設定でJIRAプロジェクトとFisheyeリポジトリのマッピング設定をすると、JIRAとGitを連携させることができます。具体的には、GitのコミットメッセージにJIRAの課題IDを含めることで指定されたJIRAの課題のアクティビティとして各コミットが記録できるようになります。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/6524547975/&quot; title=&quot;jira-git-changeset by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm8.staticflickr.com/7016/6524547975_192e0ca786.jpg&quot; width=&quot;500&quot; height=&quot;151&quot; alt=&quot;jira-git-changeset&quot; style=&quot;border: 1px solid #999&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;また、Fisheye 2.7で導入されたスマートコミットを利用すると、コミットメッセージに簡単な構文を追加することで、ワークフローのトランジション、コメント、時間の記録など、JIRAの課題を自動的に更新できるようになるそうです（筆者のバージョンは2.5系なので未確認...orz）。スマートコミットについては、&lt;a href=&quot;https://twitter.com/#!/g2gj&quot;&gt;@g2gj&lt;/a&gt;さんの下記の記事が参考になると思います。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.go2group.jp/2011/09/fisheye-%E3%81%8A%E3%82%88%E3%81%B3-crucible-2-7-git-%E3%83%AC%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E7%AE%A1%E7%90%86%E3%80%81%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88-%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88/&quot;&gt;FishEye および Crucible 2.7 – Git レポジトリ管理、スマート コミット、より強固になった JIRA との統合&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;git-jiraによる課題ベースのJIRA/Git連携ワークフロー&lt;/h3&gt;

&lt;p&gt;Stéphane ÉpardaudさんがGitHubで公開している &lt;a href=&quot;https://github.com/FroMage/git-jira&quot;&gt;git-jira&lt;/a&gt; を使うと、作業の開始／終了時に良くおこなうJIRA/Gitの一連の操作を、それぞれ1コマンドでおこなうことができるようになります。あらかじめ&lt;a href=&quot;https://studio.plugins.atlassian.com/wiki/display/JCLI/JIRA+Command+Line+Interface&quot;&gt;JIRA Command Line Interface&lt;/a&gt;が必要です。&lt;br/&gt;&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ksh&quot;&gt;% git jirabranch FOO-123
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;課題:FOO-123と同じ名前のブランチ:FOO-123を作成&lt;/li&gt;
&lt;li&gt;ブランチ:FOO-123にスイッチ&lt;/li&gt;
&lt;li&gt;課題:FOO-123のステータスを進行中に更新&lt;/li&gt;
&lt;li&gt;課題:FOO-123にコメントを追加 ＞ &quot;Coding started by Masakuni Kato&quot;&lt;/li&gt;
&lt;/ol&gt;


&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ksh&quot;&gt;% git jirafix FOO-123
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;ブランチ:FOO-123にスイッチ&lt;/li&gt;
&lt;li&gt;ブランチ:FOO-123にブランチ:masterをrebase&lt;/li&gt;
&lt;li&gt;ブランチ:masterにスイッチ&lt;/li&gt;
&lt;li&gt;ブランチ:masterにブランチ:FOO-123をマージ&lt;/li&gt;
&lt;li&gt;課題:FOO-123のステータスを解決に更新&lt;/li&gt;
&lt;li&gt;課題:FOO-123にコメントを追加 ＞ &quot;Fix committed by Masakuni Kato&quot;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/6524693921/&quot; title=&quot;git-jira-comments by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm8.staticflickr.com/7004/6524693921_bba41eb43e.jpg&quot; width=&quot;500&quot; height=&quot;164&quot; alt=&quot;git-jira-comments&quot; style=&quot;border: 1px solid #999&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;課題に着手するごとにトピックブランチを切るというのは良い習慣ですね。作業の開始や終了時にコメントを入れるのも、他の開発者とのコミュニケーションに役立つ良い習慣だと思います。これらの手順を1つのコマンドで実行できる&lt;a href=&quot;https://github.com/FroMage/git-jira&quot;&gt;git-jira&lt;/a&gt;はチョー便利。オススメです。&lt;/p&gt;

&lt;p&gt;ちなみに、jirabranchとjirafixと打つのは長くてシンドいので、筆者はそれぞれjbとjfというaliasを設定して使っています。&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ksh&quot;&gt;% git config --global alias.jb jirabranch
% git config --global alias.jf jirafix
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;h3&gt;コミットメッセージにJIRAの課題IDを含める&lt;/h3&gt;

&lt;p&gt;GitのコミットメッセージにJIRAの課題IDを含めるだけで連携することが分かっていても、開発者にお願いしただけではついつい書くのを忘れてしまいがちです。&lt;/p&gt;

&lt;p&gt;git-jiraでは、コミットメッセージに課題IDやタイトルを自動的に含めるためのGitのフックスクリプトも提供しています。ただ、スクリプトで使われているsedやawkがMac標準のものだと動かなかったり、タイトルに日本語が含まれていると文字化けしてしまったりするので使いづらいかもしれません。&lt;/p&gt;

&lt;p&gt;git-jira / prepare-commit-msg&lt;br/&gt;
&lt;a href=&quot;https://github.com/FroMage/git-jira/blob/master/prepare-commit-msg&quot;&gt;https://github.com/FroMage/git-jira/blob/master/prepare-commit-msg&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;筆者は、いまのところブランチのチェックアウト時にブランチ名を含んだメッセージテンプレートを作成するpost-checkoutフックと、Gitの設定commit.templateの組み合わせで対応していますが、まだ研究中です。他に良い方法があれば教えてください。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://progit.org/book/ja/ch7-3.html#id173&quot;&gt;Gitフック(その他のクライアントフック)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://progit.org/book/ja/ch7-1.html#committemplate&quot;&gt;Gitの設定(commit.template)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;まとめ&lt;/h3&gt;

&lt;p&gt;JIRAとGitの連携について簡単に紹介してみました。JIRAやConfluenceを使っていると、スペックシートだけでは解らない細かな部分での使い勝手の良さに感心することが多いのですが、いかに良いツールでもうまく活用してあげなければ宝の持ちぐされになってしまいます。&lt;/p&gt;

&lt;p&gt;今後も、JIRAの豊富な設定や拡張機能を利用してジラリアンとしてのレベルをアップしていきたいと思います。なんといっても色々試すのは楽しいですしね。&lt;/p&gt;

&lt;p&gt;では、引き続き&lt;a href=&quot;http://atnd.org/events/22899&quot;&gt;JIRA Advent Calendar 2011&lt;/a&gt;をお楽しみください。と書きましたが次の方がまだいないみたいです。どなたか、立候補を！&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>第2回 浜松ハッカソン(ハマッカソン2) 開催レポート</title>
   <link href="http://blog.airs.co.jp/2010/12/06/hamackathon-20101204.html"/>
   <updated>2010-12-06T13:00:00+09:00</updated>
   <id>/2010/12/06/hamackathon-20101204.html</id>
   <content type="html">&lt;p&gt;12月4日の土曜日にエアーズの入居するインキュベーション施設の &lt;a href=&quot;http://www.hi-cube.jp/&quot;&gt;ハイキューブ&lt;/a&gt; で、「第2回 浜松ウェブAPIハッカソン」をおこない、開発メンバーと見学者あわせて計25名の方にご参加いただきました。&lt;/p&gt;
&lt;p&gt;&lt;!-- more --&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;https://github.com/mackato/hamackathon/wiki&quot;&gt;浜松ハッカソン公開Wiki&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://atnd.org/events/9182&quot;&gt;第2回 浜松ウェブAPIハッカソン: &lt;span class=&quot;caps&quot;&gt;ATND&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://twitter.com/search?q=%23hamackathon&quot;&gt;Twitter #hamackathon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;今回のテーマ&lt;/h3&gt;
&lt;p&gt;今回のハッカソンでは3チームが、メインテーマである「モバイル」に沿って実際に動くプログラムを当日の10:00から17:00にかけておこない、最後に成果発表と参加者・見学者全員による投票をおこないました。以下、上位順にチーム別の発表内容と感想です。&lt;/p&gt;
&lt;h3&gt;1位: Androidチーム – 「自宅から離れたら勝手にマナーモード」「ケモノカメラ」「ワンセグでTwitter」&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/5233519519/&quot; title=&quot;Untitled by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5247/5233519519_2bfb14e87d.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Androidチームのプレゼン中&lt;/p&gt;
&lt;p&gt;投票の結果iPhoneチームと同数票となり、歴史的な同点決勝(後述)によって一位になったのは &lt;a href=&quot;http://twitter.com/amay077&quot;&gt;@amay077&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/kiwofusi&quot;&gt;@kiwofusi&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/w1mvy&quot;&gt;@w1mvy&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/natsumesou&quot;&gt;@natsumesou&lt;/a&gt; さんと私 &lt;a href=&quot;http://twitter.com/mackato&quot;&gt;@mackato&lt;/a&gt; のAndroidチームでした。@amay077さんと@mackato以外は静岡大学の学生さんです。&lt;/p&gt;
&lt;p&gt;今回のハマッカソンでは、チームのメンバーで同じものを作っても、各メンバーで別々のものをつくっても良いルールで、Androidチームは各自別々のものを作って3人が発表しました。&lt;/p&gt;
&lt;p&gt;まずAndroidチームのトップバッターとして発表し、今回のハマッカソンで一番感心を集めていたであろうのが@amay077さんの「自宅から離れたら勝手にマナーモード」です。GeoHexという地図上に表示された六角形の領域を使って、あらかじめマナーモードにしたいエリアを設定しておくと、そこに入った時に自動的にマナーモードになるというアプリです。&lt;/p&gt;
&lt;p&gt;家や会社でAndroidケータイのマナーモードをいちいち切り替えるのがメンドクサイというご自身のニーズから作ったアプリということで実用性があるうえに、実際の人間の代わりに地図上を移動するプログラムを用意して、それがマナーエリアに入ってきたらそれまで流れていたラジオを止めるというデモもバッチリで、会場から感嘆のため息がもれてました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/5234111922/&quot; title=&quot;Untitled by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5043/5234111922_286d7c8003_m.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
あらかじめエリアを設定しておくと&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/5233518705/&quot; title=&quot;Untitled by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5281/5233518705_6d045f4fe3_m.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
ラジオを流しておいても、あとでエリアに入ったときに音声が消えます。&lt;/p&gt;
&lt;p&gt;発表後の質疑応答では、「今日だけで全部作ったんですか？」などAndroidチームの中ではこのアプリに質問が集中していましたね。&lt;/p&gt;
&lt;p&gt;@amay077さんのあとでは学生さんも発表しづらいだろうということで、続いて私が作った「ケモノカメラ」を発表しました。「ケモノカメラ」はAndroidの音声認識とカメラを使ったネタアプリで、実用性はありませんが笑いはとれたので本人的には狙い通りです。&lt;/p&gt;
&lt;p&gt;「ケモノになれ！」ボタンを押して音声認識APIを起動し、「ワン」とか「モー」とか動物の鳴きまねをするとカメラに写っている人の上に犬や牛の写真が顔抜きオーバーレイで表示され、「お前は犬だ！」などと罵倒されます。ちなみに「ニャー」は激ムズで、認識されずに「お前は人間だ！」となかなかケモノ扱いしてもらえません。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/5234112564/&quot; title=&quot;Untitled by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5204/5234112564_47a2dd3c08_m.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
モーと叫ぶと&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/5233519249/&quot; title=&quot;Untitled by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5050/5233519249_6085088bde_m.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
カメラに写った助手のT君が牛になりました。&lt;/p&gt;
&lt;p&gt;Androidチームの最後に、学生代表として@kiwofusiさんが「ワンセグでTwitter」を発表しました。ワンセグ画面の上にTwitterのタイムラインをオーバーレイ表示するアプリで、発表の時はTwitterの後ろでワンセグが動くところまでは行かなかったようですが、Twitterの検索APIを使って取得したツイートをオーバーレイ表示するところまでは出来ていました。完成したらニコ動みたいな感じで色々と使い道はありそうです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/5233519755/&quot; title=&quot;Untitled by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5206/5233519755_ff580a10d7_m.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
ワンセグの画面のうえにツイートが表示されています。&lt;/p&gt;
&lt;p&gt;@w1mvyさんと、@natsumesouさんは加速度センサーをつかったアプリを作っていたみたいですが、残念ながら発表できるところまではいかなかったようです。@amay077さんと私の大人二人は面目が立ってホッとしたので、「大人力を魅せつけた」とか「大人は納期を守る」とか好き勝手なことをほざいてあげました。若者よ、次回ガンバレ！&lt;/p&gt;
&lt;h3&gt;2位: iPhoneチーム – 「通信対戦型の時限爆弾アプリ」&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/5234109190/&quot; title=&quot;Untitled by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5049/5234109190_408d5d4e1c.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
iPhoneチームプレゼン中&lt;/p&gt;
&lt;p&gt;投票の結果Androidチームと同数票となり、歴史的な同点決勝(後述)によって惜しくも二位だったのは、 &lt;a href=&quot;http://twitter.com/tinymouse_jp&quot;&gt;@tinymouse_jp&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/arfyasu&quot;&gt;@arfyasu&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/youzz&quot;&gt;@youzz&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/sasakisasa&quot;&gt;@sasakisasa&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/hide621&quot;&gt;@hide621&lt;/a&gt; さんのiPhoneチームでした。&lt;/p&gt;
&lt;p&gt;iPhoneチームは全員で協力して「通信対戦型の時限爆弾アプリ」を開発しました。BluetoothでつながったiPhone同士で時限爆弾を回していって、爆発したらアウトというゲームです。バラエティ番組で見たことがある、膨らむ風船を回して破裂したらアウトみたいなのをデジタル化した感じですね。&lt;/p&gt;
&lt;p&gt;技術的にはiOSのGameKitというフレームワークを使ってBluetoothでiPhone同士の通信をおこない、その中の1台がサーバーとなってゲームを管理しているということでした。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/5234108774/&quot; title=&quot;Untitled by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5083/5234108774_c868e4f309_m.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
ユーザー名を入力してゲームに参加&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/5234109020/&quot; title=&quot;Untitled by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5284/5234109020_0a88986547_m.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
参加中のプレイヤーが各iPhoneに表示されて、そのうち1台に爆弾が表示されています。&lt;/p&gt;
&lt;p&gt;今回は完成までいきませんでしたが、「ネットワークでプロフィール画像をやり取りしてアイコン表示する」とか、「加速度センサー使って端末を振ってバクダンを渡す」という機能を追加していずれ公開するそうです。開発の中心になっている@hide621さんは、すでにApp Storeに10本以上アプリをリリースされているので、これもApp Storeで公開されるのかな？&lt;br /&gt;
&lt;a href=&quot;http://blog.lapture.net/&quot;&gt;Lapture.net/@hide621さんのブログ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ちなみに、Androidチームのエース@amay077さんとiPhoneチームのエース@hide621さんはともに豊橋からの参加です。二川恐るべし！&lt;/p&gt;
&lt;h3&gt;3位: HTML5チーム &amp;#8211; 「認証UI: Andoroid風のロック解除 / 金庫のダイヤル風」&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/5233520211/&quot; title=&quot;Untitled by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5130/5233520211_26b8df75dd.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
HTML5チームプレゼン中&lt;/p&gt;
&lt;p&gt;最後に惜しくも3位となったのが、 &lt;a href=&quot;http://twitter.com/akisoftware&quot;&gt;@akisoftware&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/jacoyutorius&quot;&gt;@jacoyutorius&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/katsu2000x&quot;&gt;@katsu2000x&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/cherenkov&quot;&gt;@cherenkov&lt;/a&gt; さん、プラス見学組から飛び入り参加のウェブデザイナー &lt;a href=&quot;http://twitter.com/planpot&quot;&gt;@planpot&lt;/a&gt; さんのHTML5チームです。&lt;/p&gt;
&lt;p&gt;こちらのチームもiPhoneチームと同様にメンバー間で協力しての開発です。「認証UIをHTML5で実現 」というアイデアをもとに、Andoroid風にマトリックスを指でなぞってその軌跡でロックを解除するUIと、金庫のダイヤル風に左右にダイヤルを何回か回してロックを解除するUIをHTML5のキャンバスで実装して発表されました。&lt;/p&gt;
&lt;p&gt;AndroidチームやiPhoneチームに比べてハードウェアの機能をフルに使えない点や、認証UIという部品ということで投票的には不利だったと思いますが、機能的にはどちらのUIも完成していましたし、Android風の方は@planpotさんが協力したUIデザインもカッコ良くてレベル高いです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/5233520639/&quot; title=&quot;Untitled by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5007/5233520639_76373b6416_m.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Androidのロック解除風のログイン画面&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/5233520409/&quot; title=&quot;Untitled by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5250/5233520409_3c63b9fe37_m.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
指でなぞると軌跡が表示されます。動きもスムーズ！&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/5234115402/&quot; title=&quot;Untitled by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5124/5234115402_8b1dd5399c_m.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
こちら金庫のダイヤル風。怪盗ゲームとかで使えそう&lt;/p&gt;
&lt;p&gt;Android風のロック解除のメイン開発者の@akisoftwareによると、こちらのコードはいずれオープンソースで公開されるそうです。&lt;/p&gt;
&lt;h3&gt;おまけ「同点決勝」&lt;/h3&gt;
&lt;p&gt;前述の通り、みんなの投票ではAndroidチームとiPhoneチームが同点となり「同点決勝」をおこなうことになりました。はじめ私が「じゃぁジャンケンで&amp;#8230;」とジャンケンで決めようとしたのですが、その時、いつの間にか見学していた &lt;a href=&quot;http://twitter.com/tetsu1969&quot;&gt;@tetsu1969&lt;/a&gt; さんから「ニャーで決めればいいじゃん」というナイスなキラーパスが出ました。同点決勝はケモノカメラに「ニャー」と叫んで猫が出たほうが勝ちに決定です。&lt;/p&gt;
&lt;p&gt;先行はiPhoneチーム、エースの@hide621さんがケモノカメラを起動したギャラクシータブにむかって「にゃ〜」とやさしくささやきます。「認識中です」のあとに出た画面は&amp;#8230;残念「お前は人間だ！」。&lt;/p&gt;
&lt;p&gt;つづいてAndroidチーム、@amay077さんが「ニヤー」と力強く叫びます。「認識中です」のあとに出た画面は&amp;#8230;「お前は猫だ！」。ヤッター！開発中に、となりで「ワン」とか「ニャー」とかいってた甲斐がありました。&lt;/p&gt;
&lt;p&gt;ということで、最後はドラマチック？な展開で一位が決まった今回のハマッカソン、前回よりこなれてきて運営側も参加側もレベルが一段あがった感じで、個人的には大成功でした。他の人はどうだったのかな？次回は3月前半の予定です。テーマとか要望があればTwitterで &lt;a href=&quot;http://twitter.com/hamackathon&quot;&gt;@hamackathon&lt;/a&gt; まで。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/5233522689/&quot; title=&quot;Untitled by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5209/5233522689_156d84e428.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
参加者、見学者全員で記念撮影&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/5233511725/&quot; title=&quot;Untitled by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5050/5233511725_6dafc9741d.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
デモ用に用意したハンディカムとゴリラポッド&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/5234117724/&quot; title=&quot;Untitled by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5047/5234117724_609567fdbc.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
忘年会シーズンとぶつかってしまった懇親会はアバンギャルドな配席に&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Trac+SubversionのようにJIRA+Gitで作業時間を記録する</title>
   <link href="http://blog.airs.co.jp/2010/09/27/git-jira-post-commit.html"/>
   <updated>2010-09-27T10:00:00+09:00</updated>
   <id>/2010/09/27/git-jira-post-commit.html</id>
   <content type="html">&lt;p&gt;エアーズではこれまでプロジェクト管理ツールとしてTracとそのScrumプラグインの &lt;a href=&quot;http://www.agile42.com/cms/pages/agilo/&quot;&gt;Agilo&lt;/a&gt; を使っていたのですが、今年の春から &lt;a href=&quot;http://www.atlassian.co.jp/software/jira/&quot;&gt;Atlassian社のJIRA&lt;/a&gt; と &lt;a href=&quot;http://confluence.atlassian.co.jp/display/WAC/Agile+Project+Management+Tool+-+GreenHopper+Plugin+For+JIRA&quot;&gt;GreenHopper&lt;/a&gt; も使い始めました。&lt;/p&gt;
&lt;p&gt;理由はAtlassian社のツールの方が操作が軽快で機能も優れていたこと、10ユーザー以下であれば各ツールのライセンスをわずか1,000円で購入できる &lt;a href=&quot;http://confluence.atlassian.co.jp/display/WAC/Starter+Licenses+-+Atlassian&quot;&gt;スターターライセンス&lt;/a&gt; を利用できたことなどからです。JIRAとGreenHopper以外に、 &lt;a href=&quot;http://www.atlassian.co.jp/software/confluence/&quot;&gt;Confluence&lt;/a&gt; 、 &lt;a href=&quot;http://www.atlassian.com/software/bamboo/&quot;&gt;Bamboo&lt;/a&gt; 、 &lt;a href=&quot;http://www.atlassian.com/software/fisheye/&quot;&gt;FishEye&lt;/a&gt; 、 &lt;a href=&quot;http://www.atlassian.com/software/crowd/&quot;&gt;Crowd&lt;/a&gt; も導入済みです。&lt;/p&gt;
&lt;p&gt;現在は、お客様のプロジェクトはTrac(Agilo無し)、社内プロジェクトはJIRA+GreenHopperを使って管理しています。&lt;/p&gt;
&lt;h3&gt;今回やりたいコト&lt;/h3&gt;
&lt;p&gt;Tracでは &lt;a href=&quot;http://trac-hacks.org/wiki/TimingAndEstimationPlugin&quot;&gt;Timing and Estimation Plugin&lt;/a&gt; というプラグインとSubversionのフックスクリプトを使って、コミットメッセージに特定の書式を含めると自動的に作業時間を記録できるようにしています。&lt;/p&gt;
&lt;p&gt;例えば、チケットNo.3で1時間半の作業をしたら、以下のようにコミットすることで該当するチケットに作業時間が追加されます。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ksh&quot;&gt;% svn commit -m &lt;span class=&quot;s2&quot;&gt;&amp;quot;refs #3 (1.5) テストデータを追加&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;これと同じような機能をJIRAで探してみましたが無いようでしたし、Gitを使ってローカルコミットのタイミングでこまめに作業を記録したかったので、カスタムスクリプトを作成して対応することにしました。&lt;/p&gt;
&lt;p&gt;具体的には、例えばDragonプロジェクト(キー:&lt;span class=&quot;caps&quot;&gt;DRA&lt;/span&gt;)のチケットNo.3で30分の作業をしたら、以下のようにコミットすることで該当するチケットに作業時間が追加されるようにします。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ksh&quot;&gt;% git commit -a -m &lt;span class=&quot;s2&quot;&gt;&amp;quot;DRA-3 (.5) テストデータを追加&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h3&gt;jira4rのインストール&lt;/h3&gt;
&lt;p&gt;今回のカスタムスクリプトはRubyで作成しました。JIRAのSOAPサービスのドライバであるjira4rが必要になりますので、あらかじめgemでインストールしておきます。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ksh&quot;&gt;% gem install jira4r
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;JIRAのSOAPサービスはデフォルトで有効になっているのでJIRA側で特別な設定は必要ありませんでした。JIRAのSOAPサービスやjira4rの使い方については以下のドキュメントが参考になります。&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://rubydoc.info/gems/jira4r/0.3.0/frames&quot;&gt;jira4r: RDoc&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://docs.atlassian.com/software/jira/docs/api/rpc-jira-plugin/latest/com/atlassian/jira/rpc/soap/JiraSoapService.html&quot;&gt;JiraSoapService: &lt;span class=&quot;caps&quot;&gt;JIRA&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;RPC&lt;/span&gt; plugin 4.1-1 &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;git configにJIRA連携用の設定を追加&lt;/h3&gt;
&lt;p&gt;次にgit configにJIRA連携用の設定を追加します。JIRAでは複数プロジェクトを管理できるので、URLとユーザー名とパスワードはグローバルに設定できます。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ksh&quot;&gt;% git config --global jira.url https://www.example.com/jira/ &lt;span class=&quot;c&quot;&gt;# JIRAサイトのURL&lt;/span&gt;
% git config --global jira.user kato &lt;span class=&quot;c&quot;&gt;# JIRAユーザー名&lt;/span&gt;
% git config --global jira.pass foobarbaz &lt;span class=&quot;c&quot;&gt;# JIRAログインパスワード&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;各プロジェクトのリポジトリでは、プロジェクトのキーの設定を追加するだけです。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ksh&quot;&gt;% git config jira.project DRA &lt;span class=&quot;c&quot;&gt;# JIRAプロジェクトのキー&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h3&gt;JIRA連携用のRubyスクリプトの作成と配置&lt;/h3&gt;
&lt;p&gt;JIRA連携用のRubyスクリプトを作成し適当なディレクトリに配置します。このスクリプトはどのプロジェクトでも共通で使用できるのでプロジェクト毎には必要ありません。僕はパスが通してある $&lt;span class=&quot;caps&quot;&gt;HOME&lt;/span&gt;/bin に実行権限付きで置いています。&lt;/p&gt;
&lt;script src=&quot;http://gist.github.com/597503.js?file=git-jira-post-commit.rb&quot;&gt;&lt;/script&gt;&lt;p&gt;作成した後に気づいたんですが、 &lt;a href=&quot;http://grit.rubyforge.org/&quot;&gt;Grit&lt;/a&gt; のようなRubyからGitリポジトリを操作できるライブラリがいくつかあるので、それらを利用した方がスマートでしたね。今回は取りあえずgitコマンドを呼び出した結果を読み込んで処理しています。&lt;/p&gt;
&lt;h3&gt;プロジェクトのpost-commitフックに連携用スクリプトの呼び出しを追加&lt;/h3&gt;
&lt;p&gt;最後にプロジェクトのpost-commitフックに連携用スクリプトの呼び出しを追加します。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ksh&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/sh&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# /path/to/project/.git/hooks/post-commit&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# An hook script that is called after a successful commit is made.&lt;/span&gt;
...
&lt;span class=&quot;c&quot;&gt;# Add worklog to JIRA project.&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/bin/git-jira-post-commit.rb
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;連携がうまくいっていれば、以下のようにコミットと同時にJIRAに作業ログが追加されます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/jira-post-commit-screenshot.png&quot; style=&quot;border: 3px solid #eee&quot;&gt;&lt;/p&gt;
&lt;h3&gt;まとめ&lt;/h3&gt;
&lt;p&gt;今回の作業で、jira4rを使えば(インターフェイスはイマイチだけど)Rubyから簡単にJIRAのデータを操作できることがわかりました。レポートの作成にも使えそうなので、今後はお客様にも提案していきたいです。&lt;/p&gt;
&lt;p&gt;あとJIRAはインストールやアップデートが結構面倒なのですが、それらがネックになる場合はGoogle Appsと連携できる &lt;a href=&quot;http://www.atlassian.com/google-apps/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;JIRA&lt;/span&gt; Studio&lt;/a&gt; というホスティングサービスがあるので、予算があえばそれを使うのも良いと思います。&lt;/p&gt;
&lt;p&gt;製品紹介を見る限りとても魅力的な製品で、エアーズでも有料版のGoogle Appsを使っているのでぜひ導入したいと思ったのですが、購入単位が5users、10usersと5人単位だったので断念しました。&lt;/p&gt;
&lt;p&gt;1ユーザーあたり月額$25は高いとは思いませんが、うちのような小さな会社では取りあえず2、3人で使うため利用料が半分ぐらい無駄になるのは勿体無いので、1ユーザー単位でも購入できるようになったら検討してみたいと思います。&lt;/p&gt;
&lt;h4&gt;オススメ書籍&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://www.amazon.co.jp/dp/4839924023?tag=airs-22&amp;camp=1027&amp;creative=7407&amp;linkCode=as4&amp;creativeASIN=4839924023&amp;adid=1WN77XEBP4P3JBX209DM&amp;&quot;&gt;&lt;img src=&quot;https://images-na.ssl-images-amazon.com/images/I/51A8BTrHYxL._SL100_.jpg&quot; style=&quot;float:left;margin-right:10px;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://www.amazon.co.jp/dp/4839924023?tag=airs-22&amp;camp=1027&amp;creative=7407&amp;linkCode=as4&amp;creativeASIN=4839924023&amp;adid=1WN77XEBP4P3JBX209DM&amp;&quot;&gt;アジャイルな見積りと計画づくり &amp;lt;価値あるソフトウェアを育てる概念と技法&amp;gt;&lt;/a&gt;&lt;br /&gt;
JIRA+GreenHopperを使ったプロジェクト管理をおこなうならマストな1冊。&lt;br/&gt;
ただただしさんのAmazonレビューが秀逸。&lt;/p&gt;
&lt;p&gt;&lt;br style=&quot;width:100%;&quot;&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>第1回 浜松ウェブAPIハッカソン開催レポート</title>
   <link href="http://blog.airs.co.jp/2010/09/06/hamackathon-20100904.html"/>
   <updated>2010-09-06T13:00:00+09:00</updated>
   <id>/2010/09/06/hamackathon-20100904.html</id>
   <content type="html">&lt;p&gt;先週9月4日の土曜日にエアーズの入居するインキュベーション施設の &lt;a href=&quot;http://www.hi-cube.jp/&quot;&gt;ハイキューブ&lt;/a&gt; で、「第1回 浜松ウェブAPIハッカソン」を弊社主催でおこない、休日にもかかわらず見学もあわせて計16名もの方にご参加いただきました。&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://atnd.org/events/6680&quot;&gt;第1回 浜松ウェブAPIハッカソン: &lt;span class=&quot;caps&quot;&gt;ATND&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://twitter.com/hamackathon&quot;&gt;Twitter @hamackathon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;ハッカソンとは？&lt;/h3&gt;
&lt;p&gt;ハッカソンというのは、Googleなどが開発者向けによく開催しているイベントの呼称で、同じテーマに興味を持ったデベロッパーが集まり、丸一日かけてテーマに沿った開発を協力して行ないます。&lt;/p&gt;
&lt;p&gt;浜松でもIT系の勉強会や、TwitterでのIT技術者同士のユルいつながりみたいなのは広まってきてはいるのですが、個人的に技術的なところでちょっと物足りなさを感じていたので、今回はハッカソンの名前や形式を拝借して、実際にコーディングをおこなえるイベントとして企画してみた次第です。&lt;/p&gt;
&lt;p&gt;今回のハッカソンでは3名もしくは4名の3チームが、メインテーマである「ウェブAPI」に沿って実際に動くプログラムを当日の10:00から17:00にかけておこない、最後に成果発表と参加者・見学者全員による投票をおこないました。以下、投票上位順にチーム別の発表内容と感想です。&lt;/p&gt;
&lt;h3&gt;1位: ソーシャルアプリチーム – 位置情報つきでつぶやくmixiアプリ「なう」&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/4962509354/&quot; title=&quot;DSC_0048 by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4124/4962509354_390a667227.jpg&quot; width=&quot;500&quot; height=&quot;332&quot; alt=&quot;DSC_0048&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://twitter.com/ilink_itoh&quot;&gt;@ilink_ito&lt;/a&gt; さんプレゼン中&lt;/p&gt;
&lt;p&gt;厳正なる投票の結果、1位に輝いたのは &lt;a href=&quot;http://twitter.com/ilink_itoh&quot;&gt;@ilink_ito&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/nya023&quot;&gt;@nya023&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/sasakisasa&quot;&gt;@sasakisasa&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/take_hvn&quot;&gt;@take_hvn&lt;/a&gt; さんのソーシャルアプリチームでした。&lt;/p&gt;
&lt;p&gt;「なう」は、mixiの画面上で自分の現在地を取得して、コメントと一緒にmixiボイスに投稿するmixiアプリです。まだmixi上で一般には公開していないようですが、「なう」からつぶやいた内容が以下のmixiボイスで確認できます。ソースの公開はしていないみたい ＜ メールで共有してマージしたらしい。&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://mixi.jp/list_voice.pl?owner_id=4579669&quot; lang=&quot;mixi&quot;&gt;トッティさんのつぶやき&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;このチーム、昼食ぐらいまでオシャベリばかりしていてまったく進んでいる気配はなかったのですが、2時ぐらいから急にモクモクしだして、各自役割分担を決めて、最後に数分あまらせてキッチリ仕上げてくるあたりは流石でした。特に位置情報を取得するのにブラウザのAPIを使うあたりは、ハッカソンのような限られた環境で動けば良い状況にあわせた手段で関心します。&lt;/p&gt;
&lt;p&gt;ボクもこのチームに投票したんですが、mixiアプリとして、見た目のつくりこみまでは無いにしてもひと通りキッチリ完成していたこと、 &lt;a href=&quot;http://twitter.com/ilink_itoh&quot;&gt;@ilink_ito&lt;/a&gt; さんが発表でキッチリ笑いを取っていたこと(プレゼン重要)、が勝因じゃないかと思います。引き続き開発を継続したいなんていうハナシもあるみたいなので、そちらも期待しています。&lt;/p&gt;
&lt;h3&gt;2位: 情報収集効率化チーム – クーポンまとめサイト「リスポン」&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/4962505526/&quot; title=&quot;DSC_0040 by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4089/4962505526_8efe3d8f37.jpg&quot; width=&quot;500&quot; height=&quot;332&quot; alt=&quot;DSC_0040&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://twitter.com/tinymouse_jp&quot;&gt;@tinymouse_jp&lt;/a&gt; さんプレゼン中&lt;/p&gt;
&lt;p&gt;2位は &lt;a href=&quot;http://twitter.com/tinymouse_jp&quot;&gt;@tinymouse_jp&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/doya&quot;&gt;@doya&lt;/a&gt; さんと、わたくし &lt;a href=&quot;http://twitter.com/mackato&quot;&gt;@mackato&lt;/a&gt; の情報収集効率化チームでした。&lt;/p&gt;
&lt;p&gt;「リスポン」は、今流行のクーポンサイトをクロールして集めた情報をまとめて紹介するクーポンまとめサイト&amp;amp;iPhoneアプリです。実際のウェブサイトとそのソースコードは公開しています。iPhoneアプリの方は未公開です。&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://listpon.appspot.com/&quot;&gt;リスポン&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/listpon/&quot;&gt;listpon: Google Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://twitter.com/doya&quot;&gt;@doya&lt;/a&gt; さんがフロントページの作成を、 &lt;a href=&quot;http://twitter.com/tinymouse_jp&quot;&gt;@tinymouse_jp&lt;/a&gt; さんがiPhoneビューワーの作成を担当し、ボクがGoogle App EngineをつかってウェブクローラーとRestAPIを担当しました。フロントページとiPhoneアプリの受け入れ準備はできていたんですが、ボクのクローラー開発が間に合わなくて、 &lt;a href=&quot;http://qpod.jp/&quot;&gt;QPod&lt;/a&gt; だけからクーポンのタイトルとエリア名ぐらいしか取得することが出来ず、結果ショボい感じになってしまったのが申し訳なかったです。きっちりフィールド決めてあったのに。。。&lt;/p&gt;
&lt;p&gt;残念ながら1位は取れませんでしたが、この企画はやり方次第では化ける可能性があると思うので個人的にもうちょっと追いかけたいと思っています。 &lt;a href=&quot;http://twitter.com/em_DESIGN&quot;&gt;@em_design&lt;/a&gt; さんにかわいいロゴもつくってもらったので。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://listpon.appspot.com/images/logo.gif&quot; /&gt;&lt;br /&gt;
リスポンのロゴ(リスのシッポとタヌキのおヘソで出来てます)&lt;/p&gt;
&lt;h3&gt;3位: Twitterアプリチーム – キーワード&amp;quot;茶&amp;quot;を含んだつぶやきを返すTwitterボット「チャガッパ」&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/4962506906/&quot; title=&quot;DSC_0042 by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4153/4962506906_e8bd1d26bc.jpg&quot; width=&quot;500&quot; height=&quot;332&quot; alt=&quot;DSC_0042&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://twitter.com/youzz&quot;&gt;@youzz&lt;/a&gt; さんプレゼン中&lt;/p&gt;
&lt;p&gt;3位は &lt;a href=&quot;http://twitter.com/youzz&quot;&gt;@youzz&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/arfyasu&quot;&gt;@arfyasu&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/em_DESIGN&quot;&gt;@em_design&lt;/a&gt; さんのTwitterアプリチームでした。&lt;/p&gt;
&lt;p&gt;「チャガッパ」はTwitter上で話しかけてきた相手に対して、&amp;quot;茶&amp;quot;を含んだつぶやきを返す静岡ならではのTwitterボットです。たとえば、「疲れた」というキーワードを含むつぶやきに対して、「疲れたときはカテキン補給っ茶！」みたいなつぶやきを返します。Rubyクラウドホスティングの &lt;a href=&quot;http://heroku.com/&quot;&gt;Heroku&lt;/a&gt; を使って開発や公開をおこなっていて、Twitterアカウントとして公開されています。ソースは未公開です。&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://twitter.com/chagappa&quot;&gt;チャガッパ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Herokuでの環境共有に手間取ったらしく充分な時間が取れなかったようで、残念ながら発表時に動かせるところまで開発がすすまなかったそうです。 &lt;a href=&quot;http://twitter.com/youzz&quot;&gt;@youzz&lt;/a&gt; さんが、発表が終わった後ボクに「クヤシイです！」って言ってくれてグッときました。そこまでマジになってもらえるのが主催者として一番うれしいです。次回リベンジ期待しています。&lt;/p&gt;
&lt;p&gt;チャガッパでも &lt;a href=&quot;http://twitter.com/em_DESIGN&quot;&gt;@em_design&lt;/a&gt; さんは大活躍、速攻でサービスのゆるキャラ「チャガッパ」を産み出していました。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://a1.twimg.com/profile_images/1117016377/______2&quot; /&gt;&lt;br /&gt;
僕、チャガッパ！茶柱が立っているのは元気のしるしだよ！&lt;/p&gt;
&lt;h3&gt;番外: 見学チーム&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/4961908361/&quot; title=&quot;DSC_0034 by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4125/4961908361_ec6289b0af.jpg&quot; width=&quot;500&quot; height=&quot;332&quot; alt=&quot;DSC_0034&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://twitter.com/cherenkov&quot;&gt;@cherenkov&lt;/a&gt; さんのJavaScript講座&lt;/p&gt;
&lt;p&gt;発表時間まではモクモクと作業するだけなので、見学だけで楽しいのかなー？と心配していましたが、 &lt;a href=&quot;http://twitter.com/cherenkov&quot;&gt;@cherenkov&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/jacoyutorius&quot;&gt;@jacoyutorius&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/tsstkyokku&quot;&gt;@tsstkyokku&lt;/a&gt; さんにも見学者として楽しい時間をすごせてもらったようで良かったです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://twitter.com/cherenkov&quot;&gt;@cherenkov&lt;/a&gt; さんは、ボクからiPadをまき上げて「ハイ、見学者集合ー！」といきなりJavaScript講座をはじめたり、3時を過ぎたあたりからおやつを要求しだしたりとフリーダム全開でしたので、次回からは運営側にまわってもらうつもりです。（懇親会おごりでどう？）&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://twitter.com/jacoyutorius&quot;&gt;@jacoyutorius&lt;/a&gt; さんには、朝から懇親会までガッツリ参加していただきました。そういえば、 &lt;a href=&quot;http://twitter.com/mineshin&quot;&gt;懇親会だけ参加していた人&lt;/a&gt; もいたなぁ。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://twitter.com/tetsu1969&quot;&gt;@tetsu1969&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/m_utsunomiya&quot;&gt;@m_utsunomiya&lt;/a&gt; さん、 &lt;a href=&quot;http://twitter.com/akisoftware&quot;&gt;@akisoftware&lt;/a&gt; さんには、最後の発表の時に見学&amp;amp;投票で参加していただきました。 &lt;a href=&quot;http://twitter.com/tetsu1969&quot;&gt;@tetsu1969&lt;/a&gt; さんは &lt;a href=&quot;http://twitter.com/cherenkov&quot;&gt;@cherenkov&lt;/a&gt; さんが甘いものを欲しがっているタイミングでお菓子やジュースを差し入れしてくれたり、ボクが進行上で忘れていた質疑応答をナイスつっこみで思い出させてくれたりして、さすがにイベント慣れしている感じでした。見学者のみなさんも、次回はぜひ参加でお願いします。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/bigmac/4961916693/&quot; title=&quot;DSC_0052 by mackato, on Flickr&quot;&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4086/4961916693_0c6bbff226.jpg&quot; width=&quot;500&quot; height=&quot;332&quot; alt=&quot;DSC_0052&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
参加者・見学者全員で記念撮影。みんなイイひとばかりだよ！&lt;/p&gt;
&lt;h3&gt;まとめ&lt;/h3&gt;
&lt;p&gt;最後の投票の時にアンケートも同時に取らせていただいたのですが、企画自体は概ね好評だったみたいでホッとしました。事前準備の期間や開発時間が足りないというご意見が多かったので、次回以降の参考にさせていただきます。&lt;/p&gt;
&lt;p&gt;次回は、11月か12月頃「モバイル」をテーマに検討中です。ご意見やご質問はTwitterアカウント &lt;a href=&quot;http://twitter.com/hamackathon&quot;&gt;@hamackathon&lt;/a&gt; までお願いします。&lt;/p&gt;
&lt;p&gt;あと、WiFi環境が悪く、ときどきつながらなかったり、スピードが遅かったりして、作業のボトルネックになってしまったようで大変申し訳ありませんでした。次回以降は改善するつもりです。参考までに今回のネットワーク環境をご紹介。Time CupsuleとAirMac Expressが共に初期のモデルなので、ここがボトルネックになっていたみたいです。あと、 &lt;a href=&quot;http://amzn.to/aK3Zlq&quot;&gt;PLANEXの無線LANエクステンダー&lt;/a&gt; は発売されたばかりで、まだ安定して動作しませんでした。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/hamackathon-network.png&quot;&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>iBooks用にRuby on Rails GuidesのePubを自炊してみた</title>
   <link href="http://blog.airs.co.jp/2010/06/04/ruby_on_rails_guides_to_epub.html"/>
   <updated>2010-06-04T13:15:00+09:00</updated>
   <id>/2010/06/04/ruby_on_rails_guides_to_epub.html</id>
   <content type="html">&lt;p&gt;先週の金曜日に日本でもiPadが発売になりました。エアーズでも業務用および開発用として3GモデルとWi-Fiモデルの各1台を購入し、電子書籍ビューワーや &lt;a href=&quot;http://www.atlassian.co.jp/software/jira/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;JIRA&lt;/span&gt;&lt;/a&gt; のダッシュボードモニタとして活用しています。&lt;/p&gt;
&lt;p&gt;今回は、Rails 3のガイドドキュメントである &lt;a href=&quot;http://guides.rails.info/&quot;&gt;Ruby on Rails Guides [Edge Guides]&lt;/a&gt; から、iPad用の電子書籍フォーマットであるePubファイルを作成してみたので、その手順を紹介します。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/ruby_on_rails_guides_on_ibooks.png&quot; width=&quot;550&quot; height=&quot;340&quot;&gt;&lt;/p&gt;
&lt;h2&gt;ePubとは&lt;/h2&gt;
&lt;p&gt;ePubとは、iPadの電子書籍アプリのiBooksやソニーの電子書籍端末で採用されている電子書籍ファイルフォーマット規格です。コンテンツをXHTMLで作成しCSSでデザイン制御をおこなえるので、ウェブコンテンツを作成したことのある人には馴染みやすいフォーマットだと思います。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://ja.wikipedia.org/wiki/EPUB&quot;&gt;ウィキペディア: &lt;span class=&quot;caps&quot;&gt;EPUB&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;iPadやiBookストアについては、その閉鎖性について色々と抵抗もあるようですが、ePub自体はオープンな規格で誰でも作成できますし、作成したファイルはiTunes経由で簡単にiBooksのコンテンツとして転送できます。また、iBooksはHTML5にも一部対応していて &lt;a href=&quot;http://twitter.com/mackato/status/15296579096&quot;&gt;videoタグで電子書籍に簡単に動画を埋め込むことができます&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;iPad用の電子書籍フォーマットについても、PDFが良いとか、オープンで軽いウェブブラウザで見るタイプが良いとか色んな意見があるようですが、iPadのビューワーアプリの中では今のところiBooksが一番できが良いと思いますし、データのポータビリティに関しても問題ないと思うので、現時点で僕はePub派です。&lt;/p&gt;
&lt;h2&gt;Ruby on Rails GuidesからePubを自炊した手順&lt;/h2&gt;
&lt;p&gt;Ruby on Rails Guidesはウェブサイトとして公開されているので、ヘッダー・フッター・サイドバーなど電子書籍には不要な要素が含まれています。また、スタイルシートにも余分なデザインが含まれているのでそれらも削除する必要があります。&lt;/p&gt;
&lt;h3&gt;1. GitHubから最新ドキュメントのソースコードを取得&lt;/h3&gt;
&lt;p&gt;Ruby on Rails GuidesはGitHub上にあるRails関連ドキュメントのプロジェクト &lt;a href=&quot;http://github.com/lifo/docrails&quot;&gt;docrails&lt;/a&gt; の中でメンテナンスされているので、そこから最新のソースコードを取得します。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ksh&quot;&gt;% git clone git://github.com/lifo/docrails.git
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Ruby on Rails Guidesのサイトのソースコードは取得したdocrailsプロジェクト内の &lt;code&gt;railties/guides&lt;/code&gt; になります。&lt;/p&gt;
&lt;h3&gt;2. レイアウトファイルとスタイルシートを変更しサイトを生成&lt;/h3&gt;
&lt;p&gt;Ruby on Rails Guidesのサイトは、コンテンツのソースコードから同梱のRubyスクリプト &lt;code&gt;rails_guides.rb&lt;/code&gt; を使って生成します。その前に、ePub用にレイアウトファイルとCSSファイルを変更しました。変更内容は以下のとおりです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://gist.github.com/424871&quot;&gt;gist: docrails_guides_epub.diff&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;変更が済んだら、サイトの生成をおこないます。出力先は &lt;code&gt;output&lt;/code&gt; ディレクトリです。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ksh&quot;&gt;% ruby rails_guides.rb
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h3&gt;3. ePubライブラリEeePubをインストールしてちょっとイジる&lt;/h3&gt;
&lt;p&gt;ePub生成には &lt;a href=&quot;http://github.com/jugyo&quot;&gt;jugyo&lt;/a&gt; さんが公開されている &lt;a href=&quot;http://github.com/jugyo/eeepub&quot;&gt;EeePub&lt;/a&gt; を利用しました。まず、gemでインストールします。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ksh&quot;&gt;% gem install eeepub
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;EeePubはHTMLや画像、CSSといったコンテンツをePub内の同じディレクトリ内にフラットに配置するのですが、Ruby on Rails Guidesのサイトは画像やCSSを別ディレクトリに配置しているので、そのままではePub化したときに画像などへのリンクが切れてしまいます。&lt;/p&gt;
&lt;p&gt;EeePubでは、階層化コンテンツには対応されていないようなので、今回は以下のようなモンキーパッチで &lt;code&gt;eeepub/maker.rb&lt;/code&gt; を直接修正して対応しました。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://gist.github.com/424887&quot;&gt;gist: eeepub_maker_assets_subdir.diff&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;4. ePub生成スクリプトを書いてePubファイルを生成する&lt;/h3&gt;
&lt;p&gt;最後にePub生成用のRubyスクリプトを書いてサイトデータをePubファイルに変換します。スクリプトでは引数として渡されたサイトデータをもとに、ファイルのコピーやクレジットページからの著者データの生成、目次の作成などをおこなっています。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://gist.github.com/424892&quot;&gt;gist: rails_guides_to_epub.rb&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;スクリプトを実行すると、RubyOnRailsGuides.epub というファイル名のePubファイルが生成されます。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ksh&quot;&gt;% ruby rails_guides_to_epub.rb /path/to/guides/output
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h2&gt;Ruby on Rails Guides ePub版のダウンロード&lt;/h2&gt;
&lt;p&gt;自炊はイヤだという方のために作成したePubファイルをしばらくダウンロードできるようにしておきます。ダウンロードしたファイルはiTunesのライブラリにドラッグアンドドロップして登録できます。データは上記の手順で生成したもので怪しいファイルは含まれていないはずですが、インストールはあくまで自己責任でお願いします。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/files/RubyOnRailsGuides.epub&quot;&gt;Ruby on Rails Guides ePub版: RubyOnRailsGuides.epub[1.2MB]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;また、手元のiPadで問題なく閲覧できることは確認していますが、あくまでウェブサイトのスタイルを継承しているので、多少見にくい部分もありますし、ePubのフォーマットや妥当性は検証していません。ePubの検証については標準的なツールがあるようなので、いずれ利用したいと思います。&lt;/p&gt;
&lt;h2&gt;ePubオーサリングの課題&lt;/h2&gt;
&lt;p&gt;今回、すべての作業はMac上のエディタとiTunesを使っておこなったのですが、ePubを作るのが初めてということで色々とハマりました。昨日の仕事が終わった後に始めて、日が変わる前に終わらせようと思っていたのが、夜なべになる程度のハマリです。以下、参考までに。&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;iBooksのレンダリングは独特なのでiTunesで実機に配置しないと確認できない&lt;/li&gt;
	&lt;li&gt;iBooksはCSSをメモリにキャッシュするので、ファイルを入れ替えたらiBooksも再起動しないといけない&lt;/li&gt;
	&lt;li&gt;実際の閲覧状況によって1行に表示できる文字数が大きく変わるので、codeブロックなどはどうしても見切れる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;iBooksでのレンダリングについては、Mac上でePubリーダーの &lt;a href=&quot;http://www.lexcycle.com/&quot;&gt;Stanza&lt;/a&gt; でも確認してみたのですが、iBooksとはまったく異なります。XCodeについているiPad simulatorで確認できるようになるといいですね。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.itmedia.co.jp/news/articles/1005/28/news065.html&quot;&gt;iBookストアでは個人出版も出来るようですし&lt;/a&gt; 、いずれ日本版のiBookストアもオープンすると思うので、今後もePub関連の情報を追っていきたいと思います。&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Flexアプリケーション開発をRailsライクに簡単にする軽量フレームワーク「RIALY」</title>
   <link href="http://blog.airs.co.jp/2010/04/20/rails-like-flex-framework-rialy.html"/>
   <updated>2010-04-20T10:00:00+09:00</updated>
   <id>/2010/04/20/rails-like-flex-framework-rialy.html</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://github.com/mackato/rialy-flex-framework&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RIALY&lt;/span&gt;&lt;/a&gt; というFlex用の軽量フレームワークを開発しGitHubで公開しました。機能やドキュメントはこれから追加していく予定ですが、まずは簡単に紹介したいと思います。&lt;/p&gt;
&lt;h2&gt;開発の経緯&lt;/h2&gt;
&lt;p&gt;1年ぐらい前からエアーズではクライアント側にFlexを使う案件が多くなってきているのですが、Flexのイベントフレームワークだけで開発するとどうしてもコンポーネント間の依存性が強くなってしまいます。そこで既存のFlex用フレームワークを調査して、まず初めに &lt;a href=&quot;http://trac.puremvc.org/PureMVC_AS3/&quot;&gt;PureMVC&lt;/a&gt; を採用してみました。&lt;/p&gt;
&lt;p&gt;PureMVCを採用したことでコンポーネント間の依存性を弱くするという問題はかなり解消し、無事にひとつのプロジェクトを終わらせることができました。しかしコマンドパターンをベースとするPureMVCでは大量の定型コードを書く必要があって面倒だったことや、UIと処理とをよりキレイに分離したかったことから、次にPureMVCのパターンをベースにイベント処理用のメタデータタグやコマンドの代わりとなるコントローラー層を追加した独自フレームワークを開発しました。&lt;/p&gt;
&lt;p&gt;その後、その独自フレームワークをもとに、Railsライクな命名規則や環境ごとの設定の切り替え機能などを導入してさらに改良・軽量化したものが今回公開した &lt;a href=&quot;http://github.com/mackato/rialy-flex-framework&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RIALY&lt;/span&gt;&lt;/a&gt; になります。&lt;/p&gt;
&lt;h2&gt;RIALYの利点&lt;/h2&gt;
&lt;h4&gt;MXMLとActionScriptの分離&lt;/h4&gt;
&lt;p&gt;Flexの宣言的UIであるMXMLファイルとプログラム処理を記述するActionScriptを別けて書くことには、チーム内での分業をしやすくしたり、アプリケーションのメンテナンス性を向上させたりするメリットがあります。&lt;/p&gt;
&lt;p&gt;他のFlex用フレームワークではMXMLファイルの中に、イベント発生をActionScriptに伝えるための部分的な内部スクリプトが必要であったり、ActionScriptと結びつけるための特別なMXMLタグが必要であったりしますが、RIALYではアプリケーションのメインのMXMLファイルの中で以下のようなboot関数を1回呼び出すだけですませることができます。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;xml&quot;&gt;&lt;span class=&quot;cp&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;mx:Application&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;xmlns:mx=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;http://www.adobe.com/2006/mxml&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;initialize=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;boot(this)&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;mx:Button&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;label=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;Click me!&amp;quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/mx:Application&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;処理をカプセル化する必要のあるカスタムコンポーネントをMXMLで作成する場合を除き、アプリケーション内のMXMLファイルにはScriptタグやその他のActionScript連携用タグは一切必要ありません。&lt;/p&gt;
&lt;h4&gt;独自メタデータタグによる見通しの良さ&lt;/h4&gt;
&lt;p&gt;RIALYではMXMLコンポーネントで発生したイベントの処理や、アクションの実行結果をMXMLビューに反映させる処理を、独自のメタデータタグで宣言することができます。例えば、イベント処理ではイベントの発生元と処理メソッドを以下のように同じ場所にまとめられるので、少ないコードで見通し良く書くことができます。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;as&quot;&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;EventHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;button.click&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;doSomething&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;Event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h4&gt;Railsライクで判りやすいシンプルな規約&lt;/h4&gt;
&lt;p&gt;RIALYはRuby on RailsからCoCやDRYといった考え方の影響を受けて開発されています。フレームワーク内で使用する命名規約もRailsにとても良く似ていて、例えば&lt;code&gt;UserController&lt;/code&gt;の&lt;code&gt;login&lt;/code&gt;メソッドは、&lt;code&gt;&quot;user.login&quot;&lt;/code&gt;という文字列表現で呼び出すことができます。&lt;/p&gt;
&lt;p&gt;その他、プロジェクトのディレクトリ構成や環境ごとの設定の切り替え機能などもRailsを参考にしているため、RailsやRailsライクなその他のウェブフレームワークの経験がある開発者の方は理解しやすいと思います。&lt;/p&gt;
&lt;h4&gt;環境ごとの設定の切り替え&lt;/h4&gt;
&lt;p&gt;Railsでは開発・テスト・本番の各環境ごとに設定を簡単に切り替えることができます。RIALYでも、開発用の&amp;quot;development&amp;quot;と本番用の&amp;quot;production&amp;quot;という2つの環境を標準で用意してある他、テスト用やステージング用の環境を追加することもできます。&lt;/p&gt;
&lt;p&gt;環境ごとの設定の切り替えは、アプリケーション用のConfigクラスでそれぞれの環境に対応した初期化メソッドに記述するだけなのでとても簡単です。例えばサーバーと連携するFlexアプリケーションを開発する場合、リモートサービスのエンドポイントURLは開発環境と本番環境で異なることが普通ですが、そのような場合も以下のようにそれぞれのURLを簡単に設定できます。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;as&quot;&gt;&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ApplicationConfig&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Config&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  
  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  
  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;development&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;http://localhost:8080/service/&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  
  &lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;production&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;http://app.example.com/service/&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;何も指定しない標準の環境は&amp;quot;development&amp;quot;で、コンパイル時に環境を指定することでそれぞれの環境用のSWFファイルを作成することができます。RIALYではビルドツールの &lt;a href=&quot;http://maven.apache.org/&quot;&gt;Maven&lt;/a&gt; と &lt;a href=&quot;http://flexmojos.sonatype.org/&quot;&gt;Flexmojos&lt;/a&gt; というMavenプラグインを使用していて、本番環境用のSWFを作成する場合はコマンドラインから以下のように指定できます。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ksh&quot;&gt;% mvn -P production flexmojos:compile-swf
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h2&gt;いますぐ試すには&lt;/h2&gt;
&lt;p&gt;最初に書いたように、RIALYにはこれから機能やドキュメントを追加していく予定ですので弊社以外の開発で投入するのは時期早尚だと思いますが、ここまで読んだくださった方には実際に試してフィードバックをいただけるとありがたいです。以下の手順で動作させることができます。&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;MavenおよびFlex 3 SDKをインストールし、mvnコマンドとmxmlcコマンドにパスを通しておきます。&lt;/li&gt;
	&lt;li&gt;GitHubからRIALYのブランクアプリケーション &lt;a href=&quot;http://github.com/mackato/rialy-flex-blank-app&quot;&gt;rialy-flex-blank-app&lt;/a&gt; を取得します。&lt;/li&gt;
	&lt;li&gt;取得したrialy-flex-blank-appの中に移動し、mvnコマンドでSWFへのコンパイルをおこないます。無事にコンパイルが通った場合、targetディレクトリ内にSWFファイルが生成されます。&lt;br /&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ksh&quot;&gt;% mvn flexmojos:compile-swf
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;今後の開発予定&lt;/h2&gt;
&lt;p&gt;今後は以下のような開発を予定しています。&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Adobe AIRおよびFlex 4への対応&lt;/li&gt;
	&lt;li&gt;サンプルアプリケーションやチュートリアルの作成&lt;/li&gt;
	&lt;li&gt;MVCパターンでいうM(モデル層)の追加&lt;/li&gt;
	&lt;li&gt;アプリケーションジェネレータやコードジェネレータの提供&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Adobe AIRについてはすでに対応できているはずですが検証がまだ出来ていません。Flex 4についてはコンポーネント層に大きな変更があったようなので修正対応が必要な感じです。&lt;/p&gt;
&lt;p&gt;ジェネレータがないのは不便なので、差し当たり次はMavenのプラグインかRubyスクリプトでジェネレータを作成するつもりです。&lt;/p&gt;
&lt;h2&gt;次回予告&lt;/h2&gt;
&lt;p&gt;次回は近日中に開発予定のジェネレータを使って、簡単なアプリケーションを実際に作ってみるチュートリアルを公開します。４月の終わりか５月の初めになる予定。お楽しみに！&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>RailsのMigrationでMySQLのカラムコメントを使う</title>
   <link href="http://blog.airs.co.jp/2009/02/20/rails-migration-mysql-column-comment.html"/>
   <updated>2009-02-20T08:41:00+09:00</updated>
   <id>/2009/02/20/rails-migration-mysql-column-comment.html</id>
   <content type="html">&lt;p&gt;加藤です。&lt;/p&gt;
&lt;p&gt;MySQLの4.1以降ではテーブルの作成時やALTER TABLEでカラムを変更する際に、下のようにカラムコメントを付けることが出来ます。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;sql&quot;&gt;&lt;span class=&quot;k&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;TABLE&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;auto_increment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;NULL&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;COMMENT&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;氏名: 日本語可。50文字以内。&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;email&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;COMMENT&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;メールアドレス: 半角英数文字のみ。100文字以内。&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;KEY&lt;/span&gt;  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;また、付けたコメントは下のようなSQLで取得することが出来ます。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;sql&quot;&gt;&lt;span class=&quot;n&quot;&gt;mysql&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;SHOW&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;FULL&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;COLUMNS&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;FROM&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;users&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;このMySQLのカラムコメントをRailsのマイグレーションで簡単に設定できるようにすれば、ドキュメント生成なんかに使いまわせてDRYで便利じゃないかということでパッチを書きました。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;k&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;ActiveRecord&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;ConnectionAdapters&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ColumnDefinition&lt;/span&gt;
      &lt;span class=&quot;kp&quot;&gt;attr_accessor&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:comment&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;to_commented_sql&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;comment&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;to_sql&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; COMMENT &amp;#39;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;comment&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;#39;&amp;quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to_sql&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;alias&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;to_s&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:to_commented_sql&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;TableDefinition&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;alias&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:_orig_column&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:column&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;column&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;options&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{})&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;_orig_column&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;options&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;comment&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;options&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:comment&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;column&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;col&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;col&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;pos&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;column&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
          &lt;span class=&quot;vi&quot;&gt;@columns&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pos&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;comment&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;comment&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;これを&lt;code&gt;config/initializers/column_comment.rb&lt;/code&gt;あたりに置いておけば、マイグレーションでのテーブル作成時にカラムコメントを設定出来るようになります。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;CreateUsers&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ActiveRecord&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Migration&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;up&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;create_table&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:users&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:null&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:limit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:comment&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;氏名: 日本語可。50文字以内。&amp;#39;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:email&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:limit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:comment&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;メールアドレス: 半角英数文字のみ。100文字以内。&amp;#39;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;down&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;drop_table&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:users&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Windowsで最新のRailsをJRubyで動かす。</title>
   <link href="http://blog.airs.co.jp/2008/12/13/jruby_on_rails_on_windows.html"/>
   <updated>2008-12-13T13:24:00+09:00</updated>
   <id>/2008/12/13/jruby_on_rails_on_windows.html</id>
   <content type="html">&lt;p&gt;こんにちは。石上です。&lt;/p&gt;
&lt;p&gt;Windows Vista上で最新のRailsをJRubyで動かしたいと思います。少し前まで、JRubyなんて…と思っていましたが、jrubystackを利用したら思いのほか上手く動いたので、報告したいと思います。Java屋の人で、Windows環境でRails開発始めたいと思っている人は注目かもしれません。&lt;/p&gt;
&lt;p&gt;jrubystackは、Jruby on Railsの開発環境に必要なソフトウェア一式を一度に整えることが出来るソフトウェアです。GlassFish、Java、JDBC、MySQL、Ruby on Rails、Subversion、Tomcatなどから構成されます。そのため、何もインストールされていない状態でも、Railsの開発環境を得ることが出来ます。&lt;/p&gt;
&lt;p&gt;まず最初に行うのは、jrubystackのインストールです。&lt;a href=&quot;http://bitnami.org/stack/jrubystack&quot;&gt;公式サイト&lt;/a&gt;から、Windows版のバイナリをダウンロードし、インストーラーを起動します。今回は、JRubyStack 1.1.4-0（JDK含む）を利用しました。&lt;/p&gt;
&lt;p&gt;インストールはウィザードに従っていけば良いですが、MySQLを既にインストールしている人は注意が必要です。既にインストールしてあるMySQLとJrubystackでインストールされるMySQLのポート番号が被らないようにしましょう。私は「13306」にしました。&lt;/p&gt;
&lt;p&gt;自動的にコマンドプロンプトが立ち上がり、暫くしてブラウザに「Welcome aboard」と表示されたらJRubyStackのインストールは完了です。開いたコマンドプロンプトとブラウザは一旦閉じてください。&lt;/p&gt;
&lt;p&gt;JrubyStackを起動します。Windowsのスタートメニューから、[スタート] &amp;#8594; [BitNami JRubyStack] &amp;#8594; [Use Bit Nami JRubyStack]を管理者権限で起動させ、コマンドプロンプトが立ち上がることを確認してください。&lt;/p&gt;
&lt;p&gt;JrubyStackに既にインストールされているRailsは、2.1.0と少し古いので最新版にします。&lt;/p&gt;
&lt;pre&gt;
&amp;gt; jruby -S gem install 
Successfully installed rake-0.8.3
Successfully installed activesupport-2.2.2
Successfully installed activerecord-2.2.2
Successfully installed actionpack-2.2.2
Successfully installed actionmailer-2.2.2
Successfully installed activeresource-2.2.2
Successfully installed rails-2.2.2
7 gems installed
&lt;/pre&gt;
&lt;p&gt;次に、gem自体をアップデートします。参考：&lt;a href=&quot;http://www.func09.com/wordpress/archives/252&quot;&gt;gemが1.3.xにバージョンアップできない件&lt;/a&gt;&lt;br /&gt;
&lt;pre&gt;&lt;br /&gt;
&amp;gt; jruby -S gem install rubygems-update&lt;br /&gt;
&amp;gt; jruby -S update_rubygems&lt;br /&gt;
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Railsのプロジェクトを展開します。&lt;/p&gt;
&lt;pre&gt;
&amp;gt; jruby -S rails test -d mysql
&lt;/pre&gt;
&lt;p&gt;testというディレクトリが作成されたと思います。以降は、testディレクトリで作業をします。&lt;/p&gt;
&lt;p&gt;DBの設定&lt;br /&gt;
「config\database.yml」を編集します。以下の様な感じで設定します。&lt;/p&gt;
&lt;pre&gt;
development:
  adapter: jdbcmysql
  database: jrubystack_development
  username: jrubystack
  password: 
  host: localhost
  socket: C:\Program Files\BitNami JRubyStack/mysql/tmp/mysql.sock
  port: 13306
&lt;/pre&gt;
&lt;p&gt;雛形の作成&lt;br /&gt;
&lt;pre&gt;&lt;br /&gt;
&amp;gt; jruby -S script/generate scaffold person name:string age:integer&lt;br /&gt;
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;データベーススキーマの作成&lt;br /&gt;
&lt;pre&gt;&lt;br /&gt;
&amp;gt; jruby -S rake db:migrate&lt;br /&gt;
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;サーバーの起動&lt;br /&gt;
&lt;pre&gt;&lt;br /&gt;
&amp;gt; jruby -S script/server&lt;br /&gt;
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;ブラウザでの確認&lt;br /&gt;
http://localhost:3000/people/&lt;/p&gt;
&lt;p&gt;どうでしたか。「jruby -S」以外の部分を除けば、普通のRailsアプリケーションの構築とほとんど変わらないと思います。是非とも、スレッドセーフなJRuby on Railsを楽しんでください。&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>RailsとGWT &quot;混ぜるな危険&quot; にしない5つのポイント</title>
   <link href="http://blog.airs.co.jp/2008/10/09/gwt_and_rails.html"/>
   <updated>2008-10-09T12:45:00+09:00</updated>
   <id>/2008/10/09/gwt_and_rails.html</id>
   <content type="html">&lt;p&gt;加藤です。しばらくぶりの更新です。&lt;br /&gt;
ここ最近はRailsとGWTの組み合わせを色々と検証しています。&lt;/p&gt;
&lt;p&gt;GWTといえばJava言語でJavaScriptアプリケーションを書くためのツールという認識が一般的だと思いますが、実際に触ってみると、これは軽くて速いJavaScriptコードを生成するための道具なんだなということが判ります。また全世界で展開するGoogleが開発しているしているだけあって、国際化の仕組みが標準で組み込まれているのも日本人にとってうれしいところです。&lt;/p&gt;
&lt;p&gt;Railsとの連携についての詳しい内容はいずれここで紹介したいと思いますが、Flexなどと比べるとGWTはあまりにもスルーされてる感があるので、差し当たりこれまでにハマった経験をもとにいくつかポイントを晒したいと思います。&lt;/p&gt;
&lt;h2&gt;その1: データ交換はJSONでおこなう&lt;/h2&gt;
&lt;p&gt;まぁ、そりゃそうだろといわれればそうなんですが、データ交換はJSONでおこなうのが一番ラクです。最近正式にリリースされたGWT1.5ではJavaScriptとの連携が強化されたのですが、その中のひとつである &lt;a href=&quot;http://googlewebtoolkit.blogspot.com/2008/08/getting-to-really-know-gwt-part-2.html&quot;&gt;JavaScript Overlay Types&lt;/a&gt; をつかうとJSONコードをパースによるオーバヘッド無しでGWT内のJavaオブジェクトに変換出来ます。&lt;/p&gt;
&lt;p&gt;Rails側のモデルをto_jsonで返して、GWT側ではJavaScript Overlay Typesで受け取ってモデルの基底クラスにNULLチェックや型変換を書いておくのが、今のところベストな方法です。&lt;/p&gt;
&lt;h2&gt;その2: &lt;span class=&quot;caps&quot;&gt;GWT&lt;/span&gt; on Railsは使えない&lt;/h2&gt;
&lt;p&gt;というのは言い過ぎのような気もしますが、GWTとRailsで調べるとすぐに出てくる &lt;a href=&quot;http://code.google.com/p/gwt-on-rails/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;GWT&lt;/span&gt; on Rails&lt;/a&gt; はあまりおすすめ出来ません。最近メンテナンスされていないので、Rails 2.1やGWT 1.5 にまだ対応していないというのが理由のひとつです。また、GWT on RailではRailsとGWTのコードをジェネレータで同時に生成するのですが、これだとどちらも自由度が下がってしまいます。例えば、RSpec使いたいとかMaven使いたいとかいう時には大変不便です。&lt;/p&gt;
&lt;p&gt;他にGWTとRailsの連携を助けるツールとして、 &lt;a href=&quot;http://code.google.com/p/gwt-rest/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;GWT&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;REST&lt;/span&gt;&lt;/a&gt; がありますが、これも長らく更新されていませんし、GWT-RESTで出来ることは前述のJavaScript Overlay Typesで出来ることと変わらないので特に使うメリットはありません。&lt;/p&gt;
&lt;h2&gt;その3: GWTとRJSの連携はやりすぎ&lt;/h2&gt;
&lt;p&gt;GWTが生成するのは普通のHTMLとJavaScriptなので、やろうと思えばRJSとも簡単に連携できます。例えば、GWTからのHTTPリクエストを受け取ったRailsアクションがサーバー側でRJSをつかってHTML上のDOM要素を書き換えてしまってもまったく問題無いわけです。また、RJSで書き換えたコンポーネントからアンカーをつかってURLを変更しGWT側でそれを検知することで、RJSからGWT側に操作を伝えることも出来ます。&lt;/p&gt;
&lt;p&gt;僕も最初は、これなら必要なコンポーネントを遅延ロードさせることが出来るし、簡単なフォームならRJSの方がラクだからこの組み合わせは完璧だねと思ったのですが、クライアント側の処理コードが分散すると1ヶ月もしないうちに書いた人間すら判らない状態になってしまうので、最終的に全部GWT側にまとめました。&lt;/p&gt;
&lt;p&gt;ただアイデア自体は悪くないと思います。いずれフレームワークが出てくるかもしれないので、それまで待ちましょう（もしくは作りましょう）。&lt;/p&gt;
&lt;h2&gt;その4: 認証はRailsでページ遷移させておこなう&lt;/h2&gt;
&lt;p&gt;色々と調べている中で、GWT関連の書籍やブログに「GWTアプリケーションは単独のHTMLページ内で動作し、ログインもその中でおこなわれます」みたいなことが書かれているのを見たのですが、セキュリティ上かなり難しいと思いますし、そうするメリットもあまりないように思います。OpenIDやその他の認証プロバイダを使う場合は現実的にかなり困難です。&lt;/p&gt;
&lt;p&gt;ここは割り切ってRails側でrestful-authenticationあたりをつかってさくっと作りましょう。ホストページ（GWTアプリケーションが動作するコンテナとなるHTMLページ）に初期データを埋め込んでおけば、HTTPリクエストが減らせてGWTアプリケーションの起動も早くできます。&lt;/p&gt;
&lt;h2&gt;その5: GWTの拡張ライブラリは必須&lt;/h2&gt;
&lt;p&gt;これはRailsとは直接関係の無いGWT側のポイントですが、GWTの標準ライブラリにはかなりプリミティブなものしか無いので、拡張ライブラリは必須です。メジャーなものとして、 &lt;a href=&quot;http://code.google.com/p/google-web-toolkit-incubator/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;GWT&lt;/span&gt; incubator&lt;/a&gt; と &lt;a href=&quot;http://code.google.com/p/gwtx/&quot;&gt;GWTx&lt;/a&gt; の2つは最初から導入しておきましょう。&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;GWT&lt;/span&gt; incubatorはGoogleが提供するベータ版ライブラリのような位置づけでかなりボリュームがありますが、良く使うのはロギングや拡張されたGUIウィジェットなどです。また、これはまだ検証できていませんが少し面白いものとして、GWTのコンパイル時にCSSを最適化する &lt;a href=&quot;http://code.google.com/docreader/#p=google-web-toolkit-incubator&amp;amp;s=google-web-toolkit-incubator&amp;amp;t=CssResource&quot;&gt;CSSResource&lt;/a&gt; なんてものもあります。&lt;/p&gt;
&lt;p&gt;GWTxはGWTのJREエミュレーションから漏れたJava標準ライブラリを補完するライブラリで、モデルの変更をオブザーブするためのProperty Change Listenerを良く使います。最近リリースされたGWT1.5対応版では、java.beans.Introspectorやjava.beans.BeanInfoなども追加されたようなので、標準でリフレクションが使えないGWTではますます重宝されそうです。&lt;/p&gt;
&lt;p&gt;また、Ext JSについてあまり詳しくないのでまだ使用したことはありませんが、Ext JSとの連携ライブラリとして、&amp;quot;Ext GWT&amp;quot;:http://extjs.com/products/gxt/ や &lt;a href=&quot;http://code.google.com/p/gwt-ext/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;GWT&lt;/span&gt;-Ext&lt;/a&gt; などがあります。見た目が固定化されてしまいそうな点がちょっと気になりますが、GUIコンポーネントが豊富に揃っているので社内用のアプリケーション開発などには良いのではないでしょうか。&lt;/p&gt;
&lt;p&gt;その他、GWT版JQueryの &lt;a href=&quot;http://code.google.com/p/gwtquery/&quot;&gt;GwtQuery&lt;/a&gt; も要注目です。&amp;quot;Google I/Oのプレゼンテーション&amp;quot;:http://sites.google.com/site/io/gwt-extreme で開発者のRay Cromwellさんが、「縮小化・圧縮されたJQueryは15kb。コンパイル後のGwtQueryはどんだけだと思う？なんとたったの&lt;strong&gt;712bytes&lt;/strong&gt;だぜ（意訳）」とアピールされておりました。プラグインも書けるみたいです。&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ということで、色々と紹介しましたが少しはRailsとGWTの組み合わせに興味はもっていただけたでしょうか？&lt;/p&gt;
&lt;p&gt;あまり生産性は良くないなど色々と課題はありますが、GWTはJavaScriptハッカーじゃなくても高性能なJavaScriptアプリケーションが書ける貴重なツールです。登場から2年、正式リリースから1年以上経つにもかかわらず、ましてやGoogle印にもかかわらず、これまであまり注目されていなかった感がありますが、ブラウザの開発競争が激しくなる中で今後注目は高まっていくと思います。Railsやってる人もぜひ一度試してみて下さい。&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>onclickの無いRJSなんて</title>
   <link href="http://blog.airs.co.jp/2008/05/21/rjs_method_chain_and_highlight_hack.html"/>
   <updated>2008-05-21T10:57:00+09:00</updated>
   <id>/2008/05/21/rjs_method_chain_and_highlight_hack.html</id>
   <content type="html">&lt;p&gt;加藤です。もはやインラインRJSだらけなので、onclickダメとかいわれても困ります。&lt;/p&gt;
&lt;p&gt;ということでRJSネタなんですが、RJSでメソッドチェイン出来ることに今更気付きました。というか、対応するPrototypeやScript.aculo.usのメソッドがElementを返すことを知りませんでした。&lt;/p&gt;
&lt;p&gt;例えば、onClickで要素クラスを入れ替えてYellow Fadeさせる場合は以下のように書けます。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;%=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;link_to_function&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;表示に戻る&amp;#39;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;page&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;page&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:item&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remove_class_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:edit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_class_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:show&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;visual_effect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:highlight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;あとRJSとは直接関係ないですが、Effect.Highlightを使うと最終的な背景色がスタイル属性に書き込まれてしまい色々と副作用があります。一度エフェクトさせた後に背景色が変化しなくなるとか、エフェクトをかける度に背景色が濃くなっていくとったダサい状況は、これが原因であることが多いと思います。&lt;/p&gt;
&lt;p&gt;問題を解決するには、style属性のbackgroundColorをnullにしてあげれば良いのですが、エフェクトのキューの最後に実行したい事が多いので、新しいEffectクラスを作成して対応することにしました。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;javascript&quot;&gt;&lt;span class=&quot;nx&quot;&gt;Effect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;ResetHighlight&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Effect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Base&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;element&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Effect&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_elementDoesNotExistError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;options&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fps&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;duration&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;options&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{},&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;element&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;setStyle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;backgroundColor&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;finish&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;先ほどのRJSで使うと以下のようになります。&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sx&quot;&gt;%= link_to_function &amp;#39;表示に戻る&amp;#39; do |page|&lt;/span&gt;
&lt;span class=&quot;sx&quot;&gt;  page[:item].remove_class_name(:edit).add_class_name(:show).visual_effect(:highlight).visual_effect(:reset_highlight, { :queue =&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:end&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;ちなみに、どちらもまだFirefox3でしか確認していないのでブラウザ互換性については不明です。&lt;/p&gt;</content>
 </entry>
 
</feed>

