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

<channel>
	<title>いわぶろ（ろてん） &#187; 開発ごっこ</title>
	<atom:link href="http://blog.iss.ms/category/%e9%96%8b%e7%99%ba%e3%81%94%e3%81%a3%e3%81%93/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.iss.ms</link>
	<description>issmの公私混同的おぼえがき</description>
	<lastBuildDate>Sat, 28 Jan 2012 09:45:59 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>GTDmeの「Inbox」に放り込むAlfred拡張を書いてみた</title>
		<link>http://blog.iss.ms/2012/01/06/212345</link>
		<comments>http://blog.iss.ms/2012/01/06/212345#comments</comments>
		<pubDate>Fri, 06 Jan 2012 12:23:45 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[開発ごっこ]]></category>
		<category><![CDATA[alfred]]></category>
		<category><![CDATA[gtdme]]></category>
		<category><![CDATA[tool]]></category>

		<guid isPermaLink="false">http://blog.iss.ms/?p=3656</guid>
		<description><![CDATA[はじめに 1つ前のエントリ の「今後」として書いたうちの1つ： ランチャからInboxに放り込めると便利そう 「GTDme」というオレオレGTDツールを作って使い始めようとしています « いわぶろ（ろてん） 今のうちに作 [...]]]></description>
			<content:encoded><![CDATA[<p><!--Title:GTDmeの「Inbox」に放り込むAlfred拡張を書いてみた--></p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6646465165/" title="ss-1325848366 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7149/6646465165_5d6e06a8b3_o.png" width="640" height="180" alt="ss-1325848366"></a>
</div>
<h3>はじめに</h3>
<p><a href="http://blog.iss.ms/2012/01/06/123500">1つ前のエントリ</a> の「今後」として書いたうちの1つ：</p>
<blockquote cite="http://blog.iss.ms/2012/01/06/123500"><p>
ランチャからInboxに放り込めると便利そう<br />
<cite><a href="http://blog.iss.ms/2012/01/06/123500" title="「GTDme」というオレオレGTDツールを作って使い始めようとしています « いわぶろ（ろてん）">「GTDme」というオレオレGTDツールを作って使い始めようとしています « いわぶろ（ろてん）</a></cite>
</p></blockquote>
<p>今のうちに作ってしまった方が今後恩恵に与れそうなので，「Alfredの拡張機能」という形でひとつこさえてみました．</p>
<p>以下，そのあたりの紹介などです．</p>
<h3>Alfredって何？</h3>
<p>いわゆる「ランチャ」の1つです．</p>
<ul class="links">
<li><a href="http://www.alfredapp.com/" title="Alfred App">Alfred App</a></li>
</ul>
<p>もともと <a href="http://code.google.com/p/qsb-mac/">qsb-mac</a> を使っていたのですが，ここ2年近くアップデートもなくてマンネリ化してきたので，「Mac ランチャ」とかでググっていたところ，次のエントリに行き当たりました．</p>
<ul class="links">
<li><a href="http://veadardiary.blog29.fc2.com/blog-entry-2695.html" title="格好いい・使いやすい・軽快と三拍子揃ったランチャ『Alfred』 | Macの手書き説明書">格好いい・使いやすい・軽快と三拍子揃ったランチャ『Alfred』 | Macの手書き説明書</a></li>
</ul>
<blockquote cite="http://veadardiary.blog29.fc2.com/blog-entry-2695.html"><p>
現在ベータ版で普通にはダウンロードができませんが、メールアドレスを登録するとダウンロードリンクが送られてきます。</p>
<p>Google Quick Search Boxをよりお洒落に使いやすくしたような印象。</p>
<p>なにより軽快に動いて、わかりやすい操作方法なのがいいですね。</p>
<p><cite><a href="http://veadardiary.blog29.fc2.com/blog-entry-2695.html" title="格好いい・使いやすい・軽快と三拍子揃ったランチャ『Alfred』 | Macの手書き説明書">格好いい・使いやすい・軽快と三拍子揃ったランチャ『Alfred』 | Macの手書き説明書</a></cite>
</p></blockquote>
<p>エントリ時期自体はちょっと前のものですが，「Google Quick Search Boxをよりお洒落に使いやすくしたような印象。」の一文で，使ってみる気になった感じです．（QSBの使い勝手は好きなので．）</p>
<p>で，Alfred の半分くらいの機能は，&pound; 15 の「Powerpack」を購入する必要があり，本エントリで触れる「拡張」機能もこの範囲に入っていたかと思います．が，他の機能も含めて，その価値は十分にあると思いますよ．例えば，Free版では，ランチャの表示・非表示の際必ずフェイドイン・フェイドアウトがかかり，サクサク感を得にくいのですが，Powerpackによって，この設定を解除することができるようになる，といった具合です．</p>
<h3>セットアップ</h3>
<h4>拡張機能のインポート</h4>
<p><span id="more-3656"></span></p>
<ul class="links">
<li><a href="https://github.com/issm/gtdme-alfred-inbox-extension" title="issm/gtdme-alfred-inbox-extension - GitHub">issm/gtdme-alfred-inbox-extension &#8211; GitHub</a></li>
</ul>
<p>これをどこかテキトーなところに <code>git clone</code> します．</p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6646592681/" title="ss-1325851309 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7021/6646592681_c8b6f213f3_o.png" width="506" height="263" alt="ss-1325851309"></a>
</div>
<p>そして，<code>packs</code> ディレクトリ下にある <code>GTDme Alfred Inbox.alfredextension</code> をファイラ上から開くことで，Alfredへの拡張機能インポートを行います．</p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6646465355/" title="ss-1325848749 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7005/6646465355_54384d2b32_o.png" width="640" height="360" alt="ss-1325848749"></a>
</div>
<p>こんな感じで拡張機能が入ります．</p>
<h4>API設定</h4>
<p>項目「Command:」のテキストエリアを編集することで，APIを叩くための設定を行います．</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="shellscript" style="font-family:monospace;">#
# GTDme Alfred Inbox Extension - 0.01
#
#   Usage: in &lt;text &gt;
#
PERL=&quot;/usr/bin/env perl&quot;
GTDME_URL=&quot;http://gtdme.local:1080/&quot;
GTDME_APIKEY=&quot;WxmFXSffMFMfEYeI2wX1sWvULrnnAUO6JI5MB7wKMf80z90RGTMQ3hxCIh3HR6di&quot;
&nbsp;
...</pre></td></tr></table></div>

<p>7行目の <code>GTDME_URL</code> に，GTDme アプリケーションが動作しているURL（のベース）を，8行目の <code>GTDME_APIKEY</code> に，利用するユーザに対して発行されるAPIキーを設定します．</p>
<p>※ 2012-01-06 21:00 時点で，APIキーを発行する機能が実装されていません＞＜ データベースを直接触れば好きにすることができます．．．</p>
<h3>Alfredから入力してみる</h3>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6646465165/" title="ss-1325848366 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7149/6646465165_5d6e06a8b3_o.png" width="640" height="180" alt="ss-1325848366"></a>
</div>
<p>Alfred を表示して，キーワード <code>in</code> （とスペース）に続いて，Inboxに放り込みたい内容を入力して Enter，です．</p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6646465271/" title="ss-1325848589 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7013/6646465271_4c0d589383_o.png" width="640" height="120" alt="ss-1325848589"></a>
</div>
<p>こんな感じで Growl に表示されれば，POST成功です．</p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6646489401/" title="ss-1325849283 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7142/6646489401_b9cc01a2ba_o.png" width="640" height="120" alt="ss-1325849283"></a>
</div>
<p>Inboxに入ってます．やったね！</p>
<h3>おわりに</h3>
<p>以上，拙作（途中） GTDme の Inbox に，ランチャアプリ「Alfred」から気軽に放り込むための拡張機能「gtdme-alfred-inbox-extension」の紹介でした．</p>
<p>こんな感じで，Inbox に放り込むための入り口をいろいろ増やして行ってみたいと思ってます．</p>
<p>また，今回を経て，Alfred の拡張機能もけっこう簡単に作れるんだな，ということがわかったので，こちらもいろいろ試してみたいですね！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.iss.ms/2012/01/06/212345/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>「GTDme」というオレオレGTDツールを作って使い始めようとしています</title>
		<link>http://blog.iss.ms/2012/01/06/123500</link>
		<comments>http://blog.iss.ms/2012/01/06/123500#comments</comments>
		<pubDate>Fri, 06 Jan 2012 03:35:00 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[開発ごっこ]]></category>
		<category><![CDATA[amon2]]></category>
		<category><![CDATA[gtd]]></category>
		<category><![CDATA[gtdme]]></category>
		<category><![CDATA[mylifehacks]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[tool]]></category>
		<category><![CDATA[webapp]]></category>

		<guid isPermaLink="false">http://blog.iss.ms/?p=3641</guid>
		<description><![CDATA[はじめに ここ2年ほどで，未実施なプロジェクトリスト == 紙の束を持ち運ぶのが大変になってきたり，毎度紙におこすのがメンドかったりと，週次レビューに対するモチベーションが，本題とは外れた部分をきっかけに下がり始めてきた [...]]]></description>
			<content:encoded><![CDATA[<p><!--Title:「GTDme」というオレオレGTDツールを作って使い始めようとしています--></p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6644230029/" title="ss-1325810374 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7016/6644230029_d624d103f5_o.png" width="640" height="480" alt="ss-1325810374"></a>
</div>
<h3>はじめに</h3>
<p>ここ2年ほどで，未実施なプロジェクトリスト == 紙の束を持ち運ぶのが大変になってきたり，毎度紙におこすのがメンドかったりと，週次レビューに対するモチベーションが，本題とは外れた部分をきっかけに下がり始めてきたので，ちょっとツールを切り替えてみようかな，などと思い立ちました．</p>
<p>で，これまでやってきたオレオレ週次レビューの流れをそれなりに活かせそうな形で，「GTDme」というツールを作り始めてみてます．ネーミングは気にしない．</p>
<p>多少形になってきたので，以下，現状での紹介など．</p>
<h3>そもそもGTDって何？</h3>
<p>ここでは省略．</p>
<p>まずは実践してみることをオススメします．「脳はHDDではなくCPUである」という考えに賛同できれば，コンセプトは吸収しやすいんじゃないかな，と思います．</p>
<ul class="links">
<li><a href="http://bizmakoto.jp/bizid/articles/0606/27/news003.html" title="はじめてのGTD - ITmedia Biz.ID">はじめてのGTD &#8211; ITmedia Biz.ID</a></li>
<li><a href="http://ja.wikipedia.org/wiki/Getting_Things_Done" title="Getting Things Done - Wikipedia">Getting Things Done &#8211; Wikipedia</a></li>
</ul>
<h3>現状をざっと詳細</h3>
<h4>認証</h4>
<p>Twitter な OAuth のみサポートしています．個人レベルでの利用とかいいながら，認証はソーシャルっぽく．</p>
<h4>ナビゲーション</h4>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6644193433/" title="ss-1325807388 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7154/6644193433_312f69bb85_o.png" width="640" height="100" alt="ss-1325807388"></a>
</div>
<p>GTDにおいて，一般的に「準備しよう」とされている各種の「リスト（フォルダ）」に相当するようにナビゲーションを置いてます．だいたい次のような感じです：</p>
<dl>
<dt><code>Home</code></dt>
<dd>「次に取るべき行動」リスト</dd>
<dt><code>Inbox</code></dt>
<dd>「In-box」</dd>
<dt><code>Calendar</code></dt>
<dd>「カレンダー」．オレオレ的に，特定日（期間）もの，週次反復もの，月次反復もの，と分割していたり</dd>
<dt><code>Background</code></dt>
<dd>「連絡待ち」リスト</dd>
<dt><code>Materials</code></dt>
<dd>「資料」．単語に違和感＞＜</dd>
<dt><code>Someday</code></dt>
<dd>「多分やる・いつかやる」リスト</dd>
<dt><code>Projects</code></dt>
<dd>「プロジェクト」リスト</dd>
</dl>
<h4>Add to Inbox?</h4>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6644193607/" title="ss-1325807448 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7018/6644193607_c4bbe5f4a7_o.png" width="640" height="360" alt="ss-1325807448"></a>
</div>
<p>どのページにも，右上のあたりに「Add to Inbox?」という，ボタンのようなものを置いてます．これをクリックすると．．．</p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6644193717/" title="ss-1325807658 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7026/6644193717_8968114e17_o.png" width="640" height="320" alt="ss-1325807658"></a>
</div>
<p>．．．何か入力フォームが表示されるので，頭に浮かんだ気になったことを書いて Enter すれば，その内容が <code>Inbox</code> に入ります．</p>
<h4>Inbox</h4>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6644193937/" title="ss-1325808195 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7021/6644193937_c1a706e76d_o.png" width="640" height="320" alt="ss-1325808195"></a>
</div>
<p>こんな感じで，「Add to Inbox」した内容がいろいろたまります．それらにマウスを乗せると．．．<br />
<span id="more-3641"></span></p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6644194071/" title="ss-1325808307 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7159/6644194071_1605944dfd_o.png" width="640" height="240" alt="ss-1325808307"></a>
</div>
<p>．．．ボタンっぽいものがいくつか表示されます（デザイン募集中ですｗ）．いわゆる「GTDのワークフロー」におけるいくつもの分岐先をワンクリックで行えるようになっています．</p>
<dl>
<dt>Done!</dt>
<dd>既に完了したときに選択</dd>
<dt>Can do now!</dt>
<dd>2分以内に完了できそうなときに選択（後述）</dd>
<dt>Next action</dt>
<dd>「次にとるべき行動」リストへ</dd>
<dt>Calendar</dt>
<dd>「カレンダー」へ</dd>
<dt>Material</dt>
<dd>「資料」へ</dd>
<dt>Background</dt>
<dd>「連絡待ち」リストへ</dd>
<dt>Someday</dt>
<dd>「多分やる・いつかやる」リストへ</dd>
<dt>Project</dt>
<dd>行動が複数ありそうなときに選択（後述）</dd>
<dt>No need</dt>
<dd>不要であればポイ</dd>
<dt>Edit</dt>
<dd>内容を編集（後述）</dd>
</dl>
<h5>Can do now!</h5>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6644194417/" title="ss-1325808797 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7007/6644194417_8ea7801866_o.png" width="640" height="320" alt="ss-1325808797"></a>
</div>
<p>その場で2分以内にできそうな場合に選択します．このボタンをクリックしてさっそく行動しましょう．ダイアログの「OK」を選択すれば，そのタスクは完了扱いとなります．</p>
<h5>Project</h5>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6644194185/" title="ss-1325808405-1 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7168/6644194185_4f4b69cfe7_o.png" width="640" height="240" alt="ss-1325808405-1"></a>
</div>
<p>そのタスクを「プロジェクト」として作成する（Create）か，既存の「プロジェクト」に一行動として追加するか，を選択します．</p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6644194281/" title="ss-1325808563 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7029/6644194281_539960905d_o.png" width="640" height="240" alt="ss-1325808563"></a>
</div>
<p>作成した場合，その元となったタスクは削除されます．</p>
<h5>Edit</h5>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6644194523/" title="ss-1325808899 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7162/6644194523_21c3436608_o.png" width="640" height="180" alt="ss-1325808899"></a>
</div>
<p>その場で内容を編集できます．</p>
<h4>Calendar</h4>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6644194649/" title="ss-1325809230 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7156/6644194649_ccf1c3497c_o.png" width="640" height="320" alt="ss-1325809230"></a>
</div>
<p>タスクの内容により，次の4種類に分けられます：</p>
<ul>
<dt>The day</dt>
<dd>特定年月日日，または特定期間が指定されたもの</dd>
<dt>Weekly</dt>
<dd>特定の曜日が指定されたもの</dd>
<dt>Monthly</dt>
<dd>特定の「日」が指定されたもの</dd>
<dt>Unclassified</dt>
<dd>上記の指定がないもの．「Edit」によりいずれかの指定を行う必要がある</dd>
</ul>
<p>Inbox 同様，ここからいつくかの操作を行えます．</p>
<h4>Projects</h4>
<p>「プロジェクト」の一覧やそれぞれに属するタスク・行動を確認したり操作したりできます．</p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6644194753/" title="ss-1325809504 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7020/6644194753_0ae96a670f_o.png" width="640" height="180" alt="ss-1325809504"></a>
</div>
<p>「プロジェクト」の一覧です．</p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6644194873/" title="ss-1325809565 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7144/6644194873_6756d9b009_o.png" width="640" height="320" alt="ss-1325809565"></a>
</div>
<p>特定の「プロジェクト」に属するタスク・行動の一覧です．</p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6644194989/" title="ss-1325809647 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7015/6644194989_2caa486595_o.png" width="640" height="180" alt="ss-1325809647"></a>
</div>
<p>Inbox 同様，ここからいくつかの操作を行えます．</p>
<h4>特殊記法</h4>
<p>タスク内容の入力の際に特定の書式で記述することで，特別な情報を付加することができます．</p>
<ul>
<li>タグ</li>
<li>年月日・期間</li>
<li>（毎週の）曜日</li>
<li>（毎月の）日</li>
<li>「ステップ」の数（「ステップ」の定義は特にない＞＜）</li>
</ul>
<h4>Home</h4>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6644195145/" title="ss-1325809808 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7175/6644195145_6f59ebc365_o.png" width="640" height="680" alt="ss-1325809808"></a>
</div>
<p>「次にとるべき行動」の一覧が表示されます．特定のプロジェクトや，自分で定義したタグによる絞り込みも行えます．あと並び替えとかもきっと．</p>
<h3>開発がらみのメモ</h3>
<p>Perl な Webアプリケーションフレームワーク <a href="http://amon.64p.org/">Amon2</a> の「Large」フレーバーをベースに，シンプル O/R マッパ<a href="http://search.cpan.org/dist/Teng/">Teng</a>，テンプレートエンジン <a href="http://search.cpan.org/dist/Text-Xslate/">Text::Xslate</a> を中心とした構成で作ってます．</p>
<p>関連して，Amon2 や Teng のちょっとしたプラグインも作って組み込んでみてます．</p>
<p>また，表側は，Amon2に同梱の <a href="http://twitter.github.com/bootstrap/">Bootstrap</a> をベースに，<a href="http://jashkenas.github.com/coffee-script/">CoffeeScript</a> とか <a href="https://github.com/kotas/jarty">Jarty</a> とか使ってみてます．</p>
<p>あと，まだまだ途中ですが，一応 GitHub に上げながらやってます．</p>
<ul class="links">
<li><a href="https://github.com/issm/GTDme" title="issm/GTDme - GitHub">issm/GTDme &#8211; GitHub</a></li>
</ul>
<h3>今後</h3>
<ul>
<li>DotCloud へデプロイできるようにしたい</li>
<li>スマフォ向けインタフェイスを準備したい</li>
<li>ランチャからInboxに放り込めると便利そう</li>
<li>とにかく「Inboxに放り込む」ための手段についていろいろ考えたい</li>
</ul>
<p>とりあえずこんなことを考えてます．</p>
<h3>おわりに</h3>
<p>以上，私が週次レビューのモチベーションを上げるために作り始めたGTDツール「GTDme」の現状を紹介しました．</p>
<p>もう少し整理した後，今晩か明日かにでも，紙で書かれた無数のタスクをどんどん放り込んでいってみることにします．</p>
<h3>Amazonさん</h3>
<p><a href="http://www.100shiki.com/">百式</a> の中の人による三部作（？）．</p>
<ul class="amazlet">
<li>
<div class="amazlet-box">
<div class="amazlet-image"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4576060732/issm-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51QrUAYs8kL._SL160_.jpg" alt="ストレスフリーの仕事術―仕事と人生をコントロールする52の法則" /></a></div>
<div class="amazlet-info">
<div class="amazlet-name"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4576060732/issm-22/ref=nosim/" name="amazletlink" target="_blank">ストレスフリーの仕事術―仕事と人生をコントロールする52の法則</a>
<div class="amazlet-powered-date">posted with <a href="http://www.amazlet.com/browse/ASIN/4576060732/issm-22/ref=nosim/" title="ストレスフリーの仕事術―仕事と人生をコントロールする52の法則" target="_blank">amazlet</a> at 12.01.06</div>
</div>
<div class="amazlet-detail">デビッド アレン <br />二見書房 <br />売り上げランキング: 8033</div>
<div class="amazlet-sub-info">
<div class="amazlet-link"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4576060732/issm-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
</div>
<div class="amazlet-footer"></div>
</div>
</li>
<li>
<div class="amazlet-box">
<div class="amazlet-image"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4576082116/issm-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51umAMmeSlL._SL160_.jpg" alt="はじめてのGTD ストレスフリーの整理術" /></a></div>
<div class="amazlet-info">
<div class="amazlet-name"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4576082116/issm-22/ref=nosim/" name="amazletlink" target="_blank">はじめてのGTD ストレスフリーの整理術</a>
<div class="amazlet-powered-date">posted with <a href="http://www.amazlet.com/browse/ASIN/4576082116/issm-22/ref=nosim/" title="はじめてのGTD ストレスフリーの整理術" target="_blank">amazlet</a> at 12.01.06</div>
</div>
<div class="amazlet-detail">デビッド・アレン <br />二見書房 <br />売り上げランキング: 641</div>
<div class="amazlet-sub-info">
<div class="amazlet-link"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4576082116/issm-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
</div>
<div class="amazlet-footer"></div>
</div>
</li>
<li>
<div class="amazlet-box">
<div class="amazlet-image"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4576101714/issm-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51rqNl71s%2BL._SL160_.jpg" alt="ひとつ上のＧＴＤ　ストレスフリーの整理術　実践編　仕事というゲームと人生というビジネスに勝利する方法" /></a></div>
<div class="amazlet-info">
<div class="amazlet-name"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4576101714/issm-22/ref=nosim/" name="amazletlink" target="_blank">ひとつ上のＧＴＤ　ストレスフリーの整理術　実践編　仕事というゲームと人生というビジネスに勝利する方法</a>
<div class="amazlet-powered-date">posted with <a href="http://www.amazlet.com/browse/ASIN/4576101714/issm-22/ref=nosim/" title="ひとつ上のＧＴＤ　ストレスフリーの整理術　実践編　仕事というゲームと人生というビジネスに勝利する方法" target="_blank">amazlet</a> at 12.01.06</div>
</div>
<div class="amazlet-detail">デビッド・アレン <br />二見書房 <br />売り上げランキング: 4267</div>
<div class="amazlet-sub-info">
<div class="amazlet-link"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4576101714/issm-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
</div>
<div class="amazlet-footer"></div>
</div>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.iss.ms/2012/01/06/123500/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[git][perl] rebase祭りを支援するツール「git-rebase-matsuri」というのを書いてみた</title>
		<link>http://blog.iss.ms/2011/12/26/114441</link>
		<comments>http://blog.iss.ms/2011/12/26/114441#comments</comments>
		<pubDate>Mon, 26 Dec 2011 02:44:41 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[開発ごっこ]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[tool]]></category>

		<guid isPermaLink="false">http://blog.iss.ms/?p=3625</guid>
		<description><![CDATA[はじめに どのブランチがどのブランチの上に乗っかるか，というルールが複数定義されたファイルを読んでひたすら git rebase を行うためのツール「git-rebase-matsuri」というのを書いてみたので，本エン [...]]]></description>
			<content:encoded><![CDATA[<p><!--Title:[git][perl] rebase祭りを支援するツール「git-rebase-matsuri」というのを書いてみた--></p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6571913917/" title="ss-1324860051 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7142/6571913917_0de54b22d7_o.png" width="500" height="280" alt="ss-1324860051"></a>
</div>
<h3>はじめに</h3>
<p>どのブランチがどのブランチの上に乗っかるか，というルールが複数定義されたファイルを読んでひたすら <code>git rebase</code> を行うためのツール「git-rebase-matsuri」というのを書いてみたので，本エントリで軽く紹介します．</p>
<ul class="links">
<li><a href="https://github.com/issm/git-rebase-matsuri" title="issm/git-rebase-matsuri - GitHub">issm/git-rebase-matsuri &#8211; GitHub</a></li>
</ul>
<p>※ とあるコミットポイントにおいてちょっとした主要なコミットが発生したおかげで，そこから派生していたすべてのブランチに対して <code>git rebaase</code> する作業が発生することを，私は勝手に「rebase祭り」などと呼んでおります．</p>
<h3>背景</h3>
<p>「この機能の実装を進めて」「ちょっとあれを直してほしい」先方からそんな要求がくるたびに，その数だけトピックブランチを，公開状態のコミットポイントから生やして作業しています．で，こちらが作業を完了して報告，公開向けの準備の指示を仰ぐのですが，そこから返信がこなくなります．（まぁお忙しいのでしょうね．）その結果，「公開待ち」な状態のブランチが増えてきます．</p>
<p>コミットツリーは次のような感じになります：</p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6571897519/" title="ss-1324859692 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7021/6571897519_07a3fbb0e9_o.png" width="450" height="240" alt="ss-1324859692"></a>
</div>
<p>そこで飛び込んでくる「これ，あのお客さんにどうしても対応したいから，すぐに実装して反映してほしい」といった要求．私の少量メモリな脳内ではスワップを起こしていますが，対応しなければなりません．そしてその修正を先に公開します．</p>
<p>（本エントリを書いている最中にも，何か1件飛び込んできましたｗ）</p>
<p>コミットツリーは次のような感じになります：</p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6571913917/" title="ss-1324860051 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7142/6571913917_0de54b22d7_o.png" width="500" height="280" alt="ss-1324860051"></a>
</div>
<p>さて，本来の開発作業に戻りますか．しかし，安心して開発を再開するには，コミットツリーを次のようにしておきたいところですね：</p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6571945375/" title="ss-1324860499 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7025/6571945375_021cf1d52c_o.png" width="500" height="280" alt="ss-1324860499"></a>
</div>
<p>まぁ <code>git rebase</code> しまくればよいだけですが，いかんせんメンドイ！</p>
<h3>使い方</h3>
<h4>インストール</h4>
<p><span id="more-3625"></span></p>
<p>App::gitrebasematsuri として，CPANモジュール形式で作ってみました．今のところ GitHub にだけ上がってます：</p>
<ul class="links">
<li><a href="https://github.com/issm/git-rebase-matsuri" title="issm/git-rebase-matsuri - GitHub">issm/git-rebase-matsuri &#8211; GitHub</a></li>
</ul>
<p><code>cpanm</code> とかで入れればよいと思います．</p>
<p>インストールできたら， <code>git-rebase-matsuri</code> というコマンドが使えるようになります．</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% git-rebase-matsuri
Usage:
      git-rebase-matsuri --conf=&lt;config_file&gt;
      git-rebase-matsuri --conf=&lt;config_file&gt; --doit  # really execute &quot;git rebase&quot;</pre></div></div>

<h4>コンフィグファイル</h4>
<p>「どのブランチが，どのブランチ（コミット）に乗っかるか」というルールを任意のファイルを作って記述していきます．</p>
<p>例えば，先の「背景」での rebaase祭り前のヤツ：</p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6571913917/" title="ss-1324860051 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7142/6571913917_0de54b22d7_o.png" width="500" height="280" alt="ss-1324860051"></a>
</div>
<p>を，公開最新状態である <code>release-3</code> タグ （ここでは <code>master</code> ブランチをいっしょ）を起点とした形に rebase したい：</p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6571945375/" title="ss-1324860499 by issm, on Flickr"><img src="http://farm8.staticflickr.com/7025/6571945375_021cf1d52c_o.png" width="500" height="280" alt="ss-1324860499"></a>
</div>
<p>とします．</p>
<p>この場合，次のように記述します：</p>

<div class="wp_syntax"><div class="code"><pre class="conf" style="font-family:monospace;"># &lt;branch&gt; -&gt; &lt;onto&gt;
id/1 -&gt; master
id/2 -&gt; ^
id/3 -&gt; master
id/6 -&gt; ^
id/4 -&gt; master
id/5 -&gt; master</pre></div></div>

<p>「<code>-&gt;</code>」の左側が「乗っかる」側のブランチ，右側が「起点となる」ブランチ，となります．</p>
<p>記号「<code>^</code>」は，「直前のルールの『左側』のブランチを起点にする」という意味を持っています．もちろん，ブランチ名を直接指定してもOKです．</p>
<p>ファイル名は <code>rebase-matsuri.conf</code> とでもしておきましょう．</p>
<h4>コマンドの実行</h4>
<p>コンフィグファイルを <code>--conf</code> または <code>-c</code> オプションで指定して実行します．</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% git-rebase-matsuri -c rebase-matsuri.conf
2011-12-26T09:46:33 [INFO] rebase rule has been added: id/1 -&gt; master
2011-12-26T09:46:33 [INFO] rebase rule has been added: id/2 -&gt; id/1
2011-12-26T09:46:33 [INFO] rebase rule has been added: id/3 -&gt; master
2011-12-26T09:46:33 [INFO] rebase rule has been added: id/6 -&gt; id/3
2011-12-26T09:46:33 [INFO] rebase rule has been added: id/4 -&gt; master
2011-12-26T09:46:33 [INFO] rebase rule has been added: id/5 -&gt; master
2011-12-26T09:46:33 [WARN] Do you really rebase? specify &quot;--doit&quot; option.</pre></div></div>

<p>ルールの確認<strong>だけ</strong>できました．実際に <code>git rebase</code> も行うには，<code>--doit</code> オプションをつける必要があります．一応予防線をはってみましたｗ</p>
<p>では，<code>--doit</code> オプションもつけて実行します．</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% git-rebase-matsuri -c rebase-matsuri.conf --doit
2011-12-26T09:46:59 [INFO] rebase rule has been added: id/1 -&gt; master
2011-12-26T09:46:59 [INFO] rebase rule has been added: id/2 -&gt; id/1
2011-12-26T09:46:59 [INFO] rebase rule has been added: id/3 -&gt; master
2011-12-26T09:46:59 [INFO] rebase rule has been added: id/6 -&gt; id/3
2011-12-26T09:46:59 [INFO] rebase rule has been added: id/4 -&gt; master
2011-12-26T09:46:59 [INFO] rebase rule has been added: id/5 -&gt; master
2011-12-26T09:46:59 [INFO] current branch/commit: id/7
2011-12-26T09:46:59 [WARN] Switched to branch 'id/1'
2011-12-26T09:46:59 [INFO] First, rewinding head to replay your work on top of it...
2011-12-26T09:46:59 [INFO] Applying: 7l9mSClY2I6MDToR8Fu5mEhn16Xvxrr4jSiqnyfI. refs #1
2011-12-26T09:46:59 [INFO] Applying: CR5q38OuoIj63HrhelKAFQEshtGPvd6H1mglSaPU. refs #1
2011-12-26T09:46:59 [WARN] Switched to branch 'id/2'
2011-12-26T09:46:59 [INFO] First, rewinding head to replay your work on top of it...
2011-12-26T09:46:59 [INFO] Applying: eymEmpKebkoBHXMvBKh6VoYL0D0S3vYASDf3Evv6. refs #2
2011-12-26T09:46:59 [WARN] Switched to branch 'id/3'
2011-12-26T09:47:00 [INFO] First, rewinding head to replay your work on top of it...
2011-12-26T09:47:00 [INFO] Applying: OJBncdWk5xzkINMCCqiPlRkdH3E7ZEAiUirPWEPq. refs #3
2011-12-26T09:47:00 [INFO] Applying: LFeSI6SsTyKi6ZDIUXQK69zWX4IfB6OT14FCmPU2. refs #3
2011-12-26T09:47:00 [INFO] Applying: YPgXUdxQJCKqOFsukt5jpxOuUCo9gSpLIuOmXQlv. refs #3
2011-12-26T09:47:00 [WARN] Switched to branch 'id/6'
2011-12-26T09:47:00 [INFO] First, rewinding head to replay your work on top of it...
2011-12-26T09:47:00 [INFO] Applying: n3gYUd9m1z12NJ63D3hIrVL7ZDvWnAqFbtbuupdT. refs #6
2011-12-26T09:47:00 [WARN] Switched to branch 'id/4'
2011-12-26T09:47:00 [INFO] First, rewinding head to replay your work on top of it...
2011-12-26T09:47:00 [INFO] Applying: bdqD7UZ9VLyyov3FIQ8Y4r2kGFUsmDlTQHqZYeN4. refs #4
2011-12-26T09:47:00 [INFO] Applying: rQZGVsQrhswVVskKHJ7P3HcDqCR7OtmccozHrRXa. refs #4
2011-12-26T09:47:00 [WARN] Switched to branch 'id/5'
2011-12-26T09:47:01 [INFO] First, rewinding head to replay your work on top of it...
2011-12-26T09:47:01 [INFO] Applying: GL6q8fM3EI1FhxPqlHInVPfgRfdmdhpmj7uDDKAL. refs #5
2011-12-26T09:47:01 [INFO] Applying: 4nVra34dYs5SrY1it2cACZ3jJw87JQrkSt6Hg3YX. refs #5
2011-12-26T09:47:01 [WARN] Switched to branch 'id/7'</pre></div></div>

<p>こんな感じで rebase祭りを手軽に執り行うことができます．</p>
<p>もちろん，未コミットなファイルがあったりするとできないので，コミットするか <code>git stash</code> などするかしておくところは従来と同様です．</p>
<p>また，conflictが発生したときは，そこは自力でガンバる必要がありますｗ</p>
<h3>おわりに</h3>
<p>以上，rebase祭りを手軽に執り行なうための支援ツール「git-rebase-matsuri」の紹介と，その使い方についてのエントリでした．</p>
<p>さて，飛び込んできた修正依頼に対応して公開して，またrebase祭りを始めるとしますかねｗ</p>
<h3>Amazonさん</h3>
<ul class="amazlet">
<li>
<div class="amazlet-box">
<div class="amazlet-image"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798023809/issm-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41R5gj5VRFL._SL160_.jpg" alt="入門Git" /></a></div>
<div class="amazlet-info">
<div class="amazlet-name"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798023809/issm-22/ref=nosim/" name="amazletlink" target="_blank">入門Git</a>
<div class="amazlet-powered-date">posted with <a href="http://www.amazlet.com/browse/ASIN/4798023809/issm-22/ref=nosim/" title="入門Git" target="_blank">amazlet</a> at 11.12.26</div>
</div>
<div class="amazlet-detail">濱野 純(Junio C Hamano) <br />秀和システム <br />売り上げランキング: 91450</div>
<div class="amazlet-sub-info">
<div class="amazlet-link"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798023809/issm-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
</div>
<div class="amazlet-footer"></div>
</div>
</li>
<li>
<div class="amazlet-box">
<div class="amazlet-image"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/427406767X/issm-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41k7xonwpdL._SL160_.jpg" alt="入門git" /></a></div>
<div class="amazlet-info">
<div class="amazlet-name"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/427406767X/issm-22/ref=nosim/" name="amazletlink" target="_blank">入門git</a>
<div class="amazlet-powered-date">posted with <a href="http://www.amazlet.com/browse/ASIN/427406767X/issm-22/ref=nosim/" title="入門git" target="_blank">amazlet</a> at 11.12.26</div>
</div>
<div class="amazlet-detail">Travis Swicegood <br />オーム社 <br />売り上げランキング: 8628</div>
<div class="amazlet-sub-info">
<div class="amazlet-link"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/427406767X/issm-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
</div>
<div class="amazlet-footer"></div>
</div>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.iss.ms/2011/12/26/114441/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>「イカワイパー」なプレゼンツール「SliDegeso」をCoffeeScriptに移植してみたでゲソ</title>
		<link>http://blog.iss.ms/2011/09/12/095555</link>
		<comments>http://blog.iss.ms/2011/09/12/095555#comments</comments>
		<pubDate>Mon, 12 Sep 2011 00:55:55 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[開発ごっこ]]></category>
		<category><![CDATA[coffeescript]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[tool]]></category>

		<guid isPermaLink="false">http://blog.iss.ms/?p=3460</guid>
		<description><![CDATA[はじめに 約1年前に公開していたアレ： 「イカワイパー」なHTMLベースのプレゼンツール「SliDegeso」を作ってみたでゲソ « いわぶろ（ろてん） 勉強の一環として，コレの JavaScript で書かれている部分 [...]]]></description>
			<content:encoded><![CDATA[<p><!--Title:「イカワイパー」なプレゼンツール「SliDegeso」をCoffeeScriptに移植してみたでゲソ--></p>
<h3>はじめに</h3>
<p>約1年前に公開していたアレ：</p>
<ul class="links">
<li><a href="http://blog.iss.ms/2010/11/15/080918" title="「イカワイパー」なHTMLベースのプレゼンツール「SliDegeso」を作ってみたでゲソ « いわぶろ（ろてん）">「イカワイパー」なHTMLベースのプレゼンツール「SliDegeso」を作ってみたでゲソ « いわぶろ（ろてん）</a></li>
</ul>
<p>勉強の一環として，コレの JavaScript で書かれている部分を，CoffeeScript に移植してみました．動作はたぶん以前のままのはず．Safari，Chrome （Webkit系？）でしか動かないのはもともとの仕様です＞＜</p>
<h3>GitHub</h3>
<p>ここに置いてあります：</p>
<ul class="links">
<li><a href="https://github.com/issm/SliDegeso" title="issm/SliDegeso - GitHub">issm/SliDegeso &#8211; GitHub</a></li>
</ul>
<p>こちらで動作を確認いただけます：</p>
<ul class="links">
<li><a href="http://issm.github.com/slide/slidegeso-sample/sample.html" title="SliDegesoサンプル">SliDegesoサンプル</a></li>
</ul>
<h3>ビフォーアフター一部</h3>
<p>ページを切り換える際の「イカワイパー」な処理を <code>_wipe</code> という関数で定義していますが，これのビフォーアフターでも．</p>
<h4>JavaScriptによる <code>_wipe</code> 関数</h4>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> _wipe <span style="color: #009900;">&#40;</span>callback<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> T <span style="color: #339933;">=</span> <span style="color: #CC0000;">1500</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> t <span style="color: #339933;">=</span> <span style="color: #CC0000;">400</span><span style="color: #339933;">;</span>
&nbsp;
    _unbind_functions<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> $geso1 <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#gesogeso-geso-1'</span><span style="color: #009900;">&#41;</span>
      <span style="color: #339933;">,</span> $geso2 <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#gesogeso-geso-2'</span><span style="color: #009900;">&#41;</span>
      <span style="color: #339933;">,</span> $geso3 <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#gesogeso-geso-3'</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">;</span>
    $geso1.<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #3366CC;">'-webkit-animation-iteration-count'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'0'</span><span style="color: #339933;">,</span>
        <span style="color: #3366CC;">'-webkit-animation-duration'</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#40;</span>T <span style="color: #339933;">/</span> <span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'s'</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    $geso2.<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #3366CC;">'-webkit-animation-iteration-count'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'0'</span><span style="color: #339933;">,</span>
        <span style="color: #3366CC;">'-webkit-animation-duration'</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>T <span style="color: #339933;">-</span> t<span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'s'</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    $geso3.<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #3366CC;">'-webkit-animation-iteration-count'</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'0'</span><span style="color: #339933;">,</span>
        <span style="color: #3366CC;">'-webkit-animation-duration'</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>T <span style="color: #339933;">-</span> t <span style="color: #339933;">*</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'s'</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    setTimeout<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>  <span style="color: #006600; font-style: italic;">// ----------------- 1st geso</span>
        _wipe_a_geso<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        setTimeout<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>  <span style="color: #006600; font-style: italic;">//-------------- 2nd geso</span>
            _wipe_a_geso<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            setTimeout<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>  <span style="color: #006600; font-style: italic;">// --------- 3rd geso</span>
                _wipe_a_geso<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                setTimeout<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>  <span style="color: #006600; font-style: italic;">// ----- wiped screen</span>
                    _wiped_screen<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    __data.<span style="color: #660066;">current_slide</span>.<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    setTimeout<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">// -- clear wiped</span>
                        _wiped_screen<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #009900;">&#40;</span> callback <span style="color: #339933;">||</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        _bind_functions<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> T <span style="color: #339933;">-</span> t <span style="color: #339933;">*</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> t<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> t<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<h4>CoffeeScriptによる <code>_wipe</code> 関数</h4>

<div class="wp_syntax"><div class="code"><pre class="coffeescript" style="font-family:monospace;">_wipe = <span style="color: black;">&#40;</span>callback<span style="color: black;">&#41;</span> <span style="color: #66cc66;">-&gt;</span>
    <span style="color: black;">&#91;</span>T<span style="color: #66cc66;">,</span> t<span style="color: black;">&#93;</span> = <span style="color: black;">&#91;</span><span style="color: #ff4500;">1500</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">400</span><span style="color: black;">&#93;</span>
&nbsp;
    _unbind_functions<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
&nbsp;
    $geso1 = $ <span style="color: #483d8b;">'#gesogeso-geso-1'</span>
    $geso2 = $ <span style="color: #483d8b;">'#gesogeso-geso-2'</span>
    $geso3 = $ <span style="color: #483d8b;">'#gesogeso-geso-3'</span>
&nbsp;
    $geso1.<span style="color: black;">css</span>
        <span style="color: #483d8b;">'-webkit-animation-iteration-count'</span><span style="color: #66cc66;">:</span> <span style="color: #483d8b;">'0'</span><span style="color: #66cc66;">,</span>
        <span style="color: #483d8b;">'-webkit-animation-duration'</span><span style="color: #66cc66;">:</span>        <span style="color: black;">&#40;</span>T <span style="color: #66cc66;">/</span> <span style="color: #ff4500;">1000</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">+</span> <span style="color: #483d8b;">'s'</span>
    $geso2.<span style="color: black;">css</span>
        <span style="color: #483d8b;">'-webkit-animation-iteration-count'</span><span style="color: #66cc66;">:</span> <span style="color: #483d8b;">'0'</span><span style="color: #66cc66;">,</span>
        <span style="color: #483d8b;">'-webkit-animation-duration'</span><span style="color: #66cc66;">:</span>        <span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>T <span style="color: #66cc66;">-</span> t<span style="color: black;">&#41;</span> <span style="color: #66cc66;">/</span> <span style="color: #ff4500;">1000</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">+</span> <span style="color: #483d8b;">'s'</span>
    $geso3.<span style="color: black;">css</span>
        <span style="color: #483d8b;">'-webkit-animation-iteration-count'</span><span style="color: #66cc66;">:</span> <span style="color: #483d8b;">'0'</span><span style="color: #66cc66;">,</span>
        <span style="color: #483d8b;">'-webkit-animation-duration'</span><span style="color: #66cc66;">:</span>        <span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>T <span style="color: #66cc66;">-</span> t <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">/</span> <span style="color: #ff4500;">1000</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">+</span> <span style="color: #483d8b;">'s'</span>
&nbsp;
    setTimeout <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">-&gt;</span>  <span style="color: #808080; font-style: italic;">#  ----------------- 1st geso</span>
        _wipe_a_geso <span style="color: #ff4500;">1</span>
        setTimeout <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">-&gt;</span>  <span style="color: #808080; font-style: italic;"># -------------- 2nd geso</span>
            _wipe_a_geso <span style="color: #ff4500;">2</span>
            setTimeout <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">-&gt;</span>  <span style="color: #808080; font-style: italic;">#  --------- 3rd geso</span>
                _wipe_a_geso <span style="color: #ff4500;">3</span>
                setTimeout <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">-&gt;</span>  <span style="color: #808080; font-style: italic;">#  ----- wiped screen</span>
                    _wiped_screen <span style="color: #0000cd;">true</span>
                    __data.<span style="color: black;">current_slide</span>.<span style="color: black;">hide</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                    setTimeout <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">-&gt;</span>  <span style="color: #808080; font-style: italic;">#  -- clear wiped</span>
                        _wiped_screen <span style="color: #0000cd;">false</span>
                        <span style="color: black;">&#40;</span> callback <span style="color: #66cc66;">?</span> <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">-&gt;</span> <span style="color: black;">&#41;</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                        _bind_functions<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                    <span style="color: #66cc66;">,</span> <span style="color: #ff4500;">100</span>
                <span style="color: #66cc66;">,</span> T <span style="color: #66cc66;">-</span> t <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">2</span>
            <span style="color: #66cc66;">,</span> t
        <span style="color: #66cc66;">,</span> t
    <span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span></pre></div></div>

<h3>おわりに</h3>
<p>そんなわけで，「イカワイパー」なプレゼンツール「SliDegeso」のJavaScript部分を，CoffeeScriptに移植したお話でした．</p>
<p>CoffeeScript，ほんのさわりだけしか触れていませんが，なんだか楽しいです！</p>
<p>楽しいといえば，<a href="http://ika-musume.com/">イカ娘の第2期放送</a>も楽しみですね！</p>
<h3>Amazonさん</h3>
<ul class="amazlet">
<li>
<div class="amazlet-box">
<div class="amazlet-image"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4048547089/issm-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51YAyWTRUYL._SL160_.jpg" alt="侵略！イカ娘　アニメーションブック　イカ娘侵略報告記" /></a></div>
<div class="amazlet-info">
<div class="amazlet-name"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4048547089/issm-22/ref=nosim/" name="amazletlink" target="_blank">侵略！イカ娘　アニメーションブック　イカ娘侵略報告記</a>
<div class="amazlet-powered-date">posted with <a href="http://www.amazlet.com/browse/ASIN/4048547089/issm-22/ref=nosim/" title="侵略！イカ娘　アニメーションブック　イカ娘侵略報告記" target="_blank">amazlet</a> at 11.09.12</div>
</div>
<div class="amazlet-detail">角川書店 (2011-09-10)<br />売り上げランキング: 168</div>
<div class="amazlet-sub-info">
<div class="amazlet-link"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4048547089/issm-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
</div>
<div class="amazlet-footer"></div>
</div>
</li>
<li>
<div class="amazlet-box">
<div class="amazlet-image"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/425321410X/issm-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://images-jp.amazon.com/images/G/09/icons/books/comingsoon_books.gif" alt="侵略!イカ娘(10) (少年チャンピオン・コミックス)" /></a></div>
<div class="amazlet-info">
<div class="amazlet-name"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/425321410X/issm-22/ref=nosim/" name="amazletlink" target="_blank">侵略!イカ娘(10) (少年チャンピオン・コミックス)</a>
<div class="amazlet-powered-date">posted with <a href="http://www.amazlet.com/browse/ASIN/425321410X/issm-22/ref=nosim/" title="侵略!イカ娘(10) (少年チャンピオン・コミックス)" target="_blank">amazlet</a> at 11.09.12</div>
</div>
<div class="amazlet-detail">安部真弘 <br />秋田書店 </div>
<div class="amazlet-sub-info">
<div class="amazlet-link"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/425321410X/issm-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
</div>
<div class="amazlet-footer"></div>
</div>
</li>
<li>
<div class="amazlet-box">
<div class="amazlet-image"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B0045OVB0A/issm-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51mqwv%2BFXdL._SL160_.jpg" alt="侵略！イカ娘　6 [Blu-ray]" /></a></div>
<div class="amazlet-info">
<div class="amazlet-name"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B0045OVB0A/issm-22/ref=nosim/" name="amazletlink" target="_blank">侵略！イカ娘　6 [Blu-ray]</a>
<div class="amazlet-powered-date">posted with <a href="http://www.amazlet.com/browse/ASIN/B0045OVB0A/issm-22/ref=nosim/" title="侵略！イカ娘　6 [Blu-ray]" target="_blank">amazlet</a> at 11.09.12</div>
</div>
<div class="amazlet-detail">ポニーキャニオン (2011-05-27)<br />売り上げランキング: 2531</div>
<div class="amazlet-sub-info">
<div class="amazlet-link"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B0045OVB0A/issm-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
</div>
<div class="amazlet-footer"></div>
</div>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.iss.ms/2011/09/12/095555/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[perl][shellscript] CoffeeScriptファイルを継続コンパイルして結果をGrowlに表示する何かを書いてみた</title>
		<link>http://blog.iss.ms/2011/09/11/142114</link>
		<comments>http://blog.iss.ms/2011/09/11/142114#comments</comments>
		<pubDate>Sun, 11 Sep 2011 05:21:14 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[開発ごっこ]]></category>
		<category><![CDATA[coffeescript]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[shellscript]]></category>

		<guid isPermaLink="false">http://blog.iss.ms/?p=3452</guid>
		<description><![CDATA[はじめに 練習がてら，以前作った オレオレプレゼンツール で書かれているJavaScriptをCofeeScript で書いてみようかな，とか思い立ち，ただ，毎回コンパイするのもメンドイので，継続コンパイルとかその結果を [...]]]></description>
			<content:encoded><![CDATA[<p><!--Title:[perl][shellscript] CoffeeScriptファイルを継続コンパイルして結果をGrowlに表示する何かを書いてみた--></p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6135359940/" title="ss-1315716199 by issm, on Flickr"><img src="http://farm7.static.flickr.com/6167/6135359940_a63be7b31e_o.png" width="616" height="502" alt="ss-1315716199"></a>
</div>
<h3>はじめに</h3>
<p>練習がてら，以前作った <a href="https://github.com/issm/SliDegeso">オレオレプレゼンツール</a> で書かれているJavaScriptをCofeeScript で書いてみようかな，とか思い立ち，ただ，毎回コンパイするのもメンドイので，継続コンパイルとかその結果をGrowlに出したりとかできるような何かを，Perlスクリプトとシェルスクリプトで書きなぐってみました．</p>
<p>まぁどちらかと言えば，ただ組み合わせた感が強いですが！</p>
<p>なお，coffeeコマンドのみでも，<code>-w</code> オプションで継続コンパイルができることは，一応存じております．まぁ結局は，<a href="http://search.cpan.org/dist/App-watcher/">App::watcher</a> 使ってみたかっただけです．</p>
<h3>レシピ</h3>
<p>このへんの準備が要ります：</p>
<ul>
<li><a href="http://jashkenas.github.com/coffee-script/">CoffeeScript</a></li>
<li><a href="http://search.cpan.org/dist/App-watcher/">App::watcher</a></li>
<li><a href="http://search.cpan.org/dist/Cocoa-Growl/">Cocoa::Growl</a></li>
</ul>
<h3>使い方</h3>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% ./script/watch-coffee start
% ./script/watch-coffee stop
% ./script/watch-coffee restart</pre></div></div>

<p>とりあえずは，特定のプロジェクト下にて，<code>script</code> ディレクトリを作って，そこにスクリプトを置いて使うことを想定しています．</p>
<p>あと，pidファイルを <code>tmp</code> ディレクトリ下に作るので，これも必要です．</p>
<h3>こんな感じ</h3>
<p>コンパイル成功：</p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6135357894/" title="ss-1315716059 by issm, on Flickr"><img src="http://farm7.static.flickr.com/6085/6135357894_f9c391b82a_o.png" width="616" height="278" alt="ss-1315716059"></a>
</div>
<p>コンパイル失敗：</p>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6135359940/" title="ss-1315716199 by issm, on Flickr"><img src="http://farm7.static.flickr.com/6167/6135359940_a63be7b31e_o.png" width="616" height="502" alt="ss-1315716199"></a>
</div>
<h3>ソースコード</h3>
<ul class="links">
<li><a href="https://gist.github.com/1209188" title="issm's gist: 1209188 — Gist">issm&#8217;s gist: 1209188 — Gist</a></li>
</ul>
<p><span id="more-3452"></span></p>
<h4>シェルスクリプト</h4>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
&nbsp;
<span style="color: #007800;">ROOT</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span> <span style="color: #7a0874; font-weight: bold;">cd</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">dirname</span> <span style="color: #007800;">$0</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #000000; font-weight: bold;">/</span>..<span style="color: #000000; font-weight: bold;">/</span>  <span style="color: #000000; font-weight: bold;">&amp;&amp;</span>  <span style="color: #7a0874; font-weight: bold;">pwd</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #007800;">PIDFILE</span>=<span style="color: #007800;">$ROOT</span><span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>watch-coffee.pid
<span style="color: #007800;">MODE</span>=<span style="color: #007800;">$1</span>
&nbsp;
&nbsp;
_main<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #007800;">$MODE</span> <span style="color: #000000; font-weight: bold;">in</span>
        <span style="color: #ff0000;">&quot;start&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
            __start
            <span style="color: #000000; font-weight: bold;">;;</span>
        <span style="color: #ff0000;">&quot;stop&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
            __stop
            <span style="color: #000000; font-weight: bold;">;;</span>
        <span style="color: #ff0000;">&quot;restart&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
            __stop
            __start
            <span style="color: #000000; font-weight: bold;">;;</span>
        <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span>
            __start
    <span style="color: #000000; font-weight: bold;">esac</span>
    <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
&nbsp;
__start<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000; font-weight: bold;">!</span> <span style="color: #660033;">-d</span> <span style="color: #007800;">$ROOT</span><span style="color: #000000; font-weight: bold;">/</span>tmp <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
        <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;no such directory: <span style="color: #007800;">$ROOT</span>/tmp&quot;</span>
        <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">1</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
    <span style="color: #7a0874; font-weight: bold;">exec</span> watcher \
        <span style="color: #660033;">--dir</span> <span style="color: #007800;">$ROOT</span><span style="color: #000000; font-weight: bold;">/</span>coffee \
        <span style="color: #660033;">--</span> \
        <span style="color: #c20cb9; font-weight: bold;">perl</span> <span style="color: #007800;">$ROOT</span><span style="color: #000000; font-weight: bold;">/</span>script<span style="color: #000000; font-weight: bold;">/</span>compile_coffee.pl <span style="color: #007800;">$ROOT</span><span style="color: #000000; font-weight: bold;">/</span>coffee<span style="color: #000000; font-weight: bold;">/</span>slidegeso.coffee \
        <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">&amp;</span>
&nbsp;
    <span style="color: #007800;">PID_WATCHER</span>=<span style="color: #007800;">$!</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$PID_WATCHER</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #007800;">$PIDFILE</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
&nbsp;
__stop<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #c20cb9; font-weight: bold;">kill</span> <span style="color: #660033;">-TERM</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #007800;">$PIDFILE</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-f</span> <span style="color: #007800;">$PIDFILE</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
        <span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #007800;">$PIDFILE</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
&nbsp;
__restart<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
    __stop
    <span style="color: #c20cb9; font-weight: bold;">sleep</span> .5
    __start
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
&nbsp;
_main</pre></div></div>

<h4>Perlスクリプト</h4>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> 5<span style="color: #339933;">.</span>12<span style="color: #339933;">.</span>0<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Cocoa<span style="color: #339933;">::</span><span style="color: #006600;">Growl</span> <span style="color: #ff0000;">':all'</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> File<span style="color: #339933;">::</span><span style="color: #006600;">Basename</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> main <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$target</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
&nbsp;
    growl_register<span style="color: #009900;">&#40;</span>
        app           <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'CoffeeScript Compiler'</span><span style="color: #339933;">,</span>
        notifications <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #000066;">qw</span><span style="color: #339933;">/</span> notif_success notif_failure <span style="color: #339933;">/</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$cmd</span> <span style="color: #339933;">=</span> <span style="color: #000066;">sprintf</span> <span style="color: #ff0000;">'coffee -c -o js %s 2&gt; /dev/stdout'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$target</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$result</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">`$cmd`</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$title</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">%params_notify</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;"># failure</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$result</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #0000ff;">$title</span> <span style="color: #339933;">=</span> <span style="color: #000066;">sprintf</span> <span style="color: #ff0000;">'%s: compile failed'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>basename <span style="color: #0000ff;">$target</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #0000ff;">%params_notify</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>
            <span style="color: #0000ff;">%params_notify</span><span style="color: #339933;">,</span>
            name        <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'notif_failure'</span><span style="color: #339933;">,</span>
            title       <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$title</span><span style="color: #339933;">,</span>
            description <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$result</span><span style="color: #339933;">,</span>
            priority    <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span>
            sticky      <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #666666; font-style: italic;"># success</span>
    <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #0000ff;">$title</span> <span style="color: #339933;">=</span> <span style="color: #000066;">sprintf</span> <span style="color: #ff0000;">'%s: compiled'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>basename <span style="color: #0000ff;">$target</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #0000ff;">%params_notify</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>
            <span style="color: #0000ff;">%params_notify</span><span style="color: #339933;">,</span>
            name        <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'notif_success'</span><span style="color: #339933;">,</span>
            title       <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$title</span><span style="color: #339933;">,</span>
            description <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'ok.'</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    growl_notify<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">%params_notify</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
main<span style="color: #009900;">&#40;</span><span style="color: #339933;">@</span><span style="color: #000000; font-weight: bold;">ARGV</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">__END__</span></pre></div></div>

<h3>おわりに</h3>
<p>以上，CoffeeScriptファイルを継続コンパイルしつつ，その結果をGrowlに出すための何かを，Perlスクリプトとシェルスクリプトで書いてみたお話でした．</p>
<p>では，CoffeeScriptへの移植を始めてみます．</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.iss.ms/2011/09/11/142114/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[git][redmine] pushした際にRedmine側の「リポジトリ」の情報も更新する</title>
		<link>http://blog.iss.ms/2011/08/30/125938</link>
		<comments>http://blog.iss.ms/2011/08/30/125938#comments</comments>
		<pubDate>Tue, 30 Aug 2011 03:59:38 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[開発ごっこ]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[redmine]]></category>
		<category><![CDATA[shellscript]]></category>

		<guid isPermaLink="false">http://blog.iss.ms/?p=3436</guid>
		<description><![CDATA[はじめに Redmine をゆるく使い始めて何ヶ月か経過した今日この頃ですが，Redmine側に，関連付けているリポジトリの情報を反映させる手間が，けっこうストレスでした． 先日，Nagoya.pm #1 やります のた [...]]]></description>
			<content:encoded><![CDATA[<p><!--Title:[git][redmine] pushした際にRedmine側の「リポジトリ」の情報も更新する--></p>
<h3>はじめに</h3>
<p><a href="http://redmine.jp/">Redmine</a> をゆるく使い始めて何ヶ月か経過した今日この頃ですが，Redmine側に，関連付けているリポジトリの情報を反映させる手間が，けっこうストレスでした．</p>
<p>先日，<a href="http://blog.iss.ms/2011/08/29/034558">Nagoya.pm #1 やります</a> のためのミーティングにて clairvy さんとお話ししていた中でアドバイスをいただけたので，それを基に手を動かしてみました．</p>
<p>なお，使っているRedmineのバージョンは 1.2.0 です．</p>
<h3>参考</h3>
<ul class="links">
<li><a href="http://blog.redmine.jp/articles/redmine-0_9-url-to-fetch-changesets/" title="小技(0.9): コミットと同時にリポジトリの情報を取得する | Redmine.JP Blog">小技(0.9): コミットと同時にリポジトリの情報を取得する | Redmine.JP Blog</a></li>
<li><a href="http://redmine.jp/faq/repository/subversion/" title="「リポジトリ」を開くまでSubversion等のリポジトリへのコミットが「活動」に表示されません | Redmine.JP">「リポジトリ」を開くまでSubversion等のリポジトリへのコミットが「活動」に表示されません | Redmine.JP</a></li>
</ul>
<h3>Redmine側を設定する</h3>
<div class="flickr2-photo-o">
<a href="http://www.flickr.com/photos/issm/6094923985/" title="ss-1314673618 by issm, on Flickr"><img src="http://farm7.static.flickr.com/6080/6094923985_362b59953b_o.jpg" width="700" height="232" alt="ss-1314673618"></a>
</div>
<p>「管理 &gt;設定」にある「リポジトリ」タブにて，次の操作を行います：</p>
<ol>
<li>「リポジトリ管理用のWebサービスを有効にする」をONにする</li>
<li>「APIキー」ラベル右にある「キーの生成」をクリックする</li>
</ol>
<p>これで「APIキー」が生成されます．</p>
<p>これを基に，次のようなURLにリクエストを送る（GETでOKみたい）ことで，Redmineが，それに関連付けられているリポジトリから情報を引っ張ってくれます：</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">{Redmineサーバ}/sys/fetch_changesets?key=${生成されたAPIキー}&amp;id=${プロジェクトの識別子}</pre></div></div>

<p>試しに <code>curl</code> とか <code>wget</code> とかで試してみるとよさげです．なお，「プロジェクトの識別子」とは，最初にプロジェクトを作成する際に指定したアレです．</p>
<h3>Gitベアリポジトリ側のフックスクリプトを書く</h3>
<p>目的のベアリポジトリの <code>.git/hooks/post-receive</code> を，次のように書いてみました．</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
<span style="color: #007800;">CURL</span>=<span style="color: #ff0000;">&quot;/usr/bin/curl -s&quot;</span>
<span style="color: #007800;">REDMINE_URL_BASE</span>=<span style="color: #ff0000;">&quot;https://redmine.your.server/&quot;</span>
<span style="color: #007800;">REDMINE_REPOS_API_KEY</span>=your_api_key
<span style="color: #007800;">REDMINE_PROJECT_ID</span>=your_project_id
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;updating redmine...&quot;</span>
<span style="color: #007800;">RESPONSE</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">$CURL</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${REDMINE_URL_BASE}</span>sys/fetch_changesets?key=<span style="color: #007800;">${REDMINE_REPOS_API_KEY}</span>&amp;id=<span style="color: #007800;">${REDMINE_PROJECT_ID}</span>&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$RESPONSE</span>
<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span></pre></div></div>

<h3>ローカルからpushしてみる</h3>
<p>実際に，ローカルから <code>git push</code> してみます．</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% git push origin master
Counting objects: 19, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (10/10), 791 bytes, done.
Total 10 (delta 7), reused 0 (delta 0)
remote: updating redmine...
remote:
To git@git.your.server:path/to/repos.git
   3d502c9..4a79baa  master -&gt; master</pre></div></div>

<p>コミットに関連するチケットのページでも，「関連するリビジョン」にちゃんと反映されていました！</p>
<h3>おわりに</h3>
<p>以上，<code>git push</code> した際に，自動的にRedmine側の関連情報も更新するためのしくみを準備してみたので，一サンプルとして紹介しました．</p>
<p>今さらですが，フックスクリプトが書ければ，ツールの連携がいろいろできてオモシロソウですね！</p>
<p>最後に，アドバイスいただいた clairvyさんに，<a href="http://www.nicovideo.jp/tag/感謝ぁ☆">感謝ぁ☆</a></p>
<h3>Amazonさん</h3>
<ul class="amazlet">
<li>
<div class="amazlet-box">
<div class="amazlet-image"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798027057/issm-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51woBfGW6BL._SL160_.jpg" alt="入門Redmine 第2版 Linux/Windows対応" /></a></div>
<div class="amazlet-info">
<div class="amazlet-name"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798027057/issm-22/ref=nosim/" name="amazletlink" target="_blank">入門Redmine 第2版 Linux/Windows対応</a>
<div class="amazlet-powered-date">posted with <a href="http://www.amazlet.com/browse/ASIN/4798027057/issm-22/ref=nosim/" title="入門Redmine 第2版 Linux/Windows対応" target="_blank">amazlet</a> at 11.08.30</div>
</div>
<div class="amazlet-detail">前田 剛 <br />秀和システム <br />売り上げランキング: 116052</div>
<div class="amazlet-sub-info">
<div class="amazlet-link"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798027057/issm-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
</div>
<div class="amazlet-footer"></div>
</div>
</li>
<li>
<div class="amazlet-box">
<div class="amazlet-image"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798023809/issm-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41R5gj5VRFL._SL160_.jpg" alt="入門Git" /></a></div>
<div class="amazlet-info">
<div class="amazlet-name"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798023809/issm-22/ref=nosim/" name="amazletlink" target="_blank">入門Git</a>
<div class="amazlet-powered-date">posted with <a href="http://www.amazlet.com/browse/ASIN/4798023809/issm-22/ref=nosim/" title="入門Git" target="_blank">amazlet</a> at 11.08.30</div>
</div>
<div class="amazlet-detail">濱野 純(Junio C Hamano) <br />秀和システム <br />売り上げランキング: 52115</div>
<div class="amazlet-sub-info">
<div class="amazlet-link"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798023809/issm-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
</div>
<div class="amazlet-footer"></div>
</div>
</li>
<li>
<div class="amazlet-box">
<div class="amazlet-image"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873114403/issm-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51B2dc%2BsJGL._SL160_.jpg" alt="実用Git" /></a></div>
<div class="amazlet-info">
<div class="amazlet-name"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873114403/issm-22/ref=nosim/" name="amazletlink" target="_blank">実用Git</a>
<div class="amazlet-powered-date">posted with <a href="http://www.amazlet.com/browse/ASIN/4873114403/issm-22/ref=nosim/" title="実用Git" target="_blank">amazlet</a> at 11.08.30</div>
</div>
<div class="amazlet-detail">Jon Loeliger <br />オライリージャパン <br />売り上げランキング: 86379</div>
<div class="amazlet-sub-info">
<div class="amazlet-link"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873114403/issm-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
</div>
<div class="amazlet-footer"></div>
</div>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.iss.ms/2011/08/30/125938/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>異なるネットワーク環境でUnbound設定を簡単に切り換えるためのPerlスクリプトを書いてみた</title>
		<link>http://blog.iss.ms/2011/08/28/162714</link>
		<comments>http://blog.iss.ms/2011/08/28/162714#comments</comments>
		<pubDate>Sun, 28 Aug 2011 07:27:14 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[開発ごっこ]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[unbound]]></category>

		<guid isPermaLink="false">http://blog.iss.ms/?p=3412</guid>
		<description><![CDATA[はじめに お仕事場やカフェ（特にスタバ）に出先など，キーボートを叩く環境がコロコロ変わったりする私ですが，そのたびにネットワーク設定が切り替わります． 開発機1台でごにょごにょするだけであればまぁ問題はないのですが，開発 [...]]]></description>
			<content:encoded><![CDATA[<p><!--Title:異なるネットワーク環境でUnbound設定を簡単に切り換えるためのPerlスクリプトを書いてみた--></p>
<h3>はじめに</h3>
<p>お仕事場やカフェ（特にスタバ）に出先など，キーボートを叩く環境がコロコロ変わったりする私ですが，そのたびにネットワーク設定が切り替わります．</p>
<p>開発機1台でごにょごにょするだけであればまぁ問題はないのですが，開発途中で iPhone や iPad とかから確認したい場合，<a href="http://blog.iss.ms/2011/08/28/044226">前エントリ</a> のような設定を，ネットワーク環境が変わるたびにしなおすなんてことはやってられません．</p>
<p>そのあたりを少し幸せにするために，ちょっとした2つのPerlスクリプトを書いてみたので，以下に紹介しておきます．</p>
<h3>まずまとめから</h3>
<p>（あらかじめ定義しておいた）各ネットワーク環境における名前解決設定のためのファイルをまとめて更新するためのスクリプトを書いてみました：</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% update-unbound-hosts.pl</pre></div></div>

<p>もうひとつ，指定したネットワーク環境に対応する設定でUnboundを再起動する，といったことを，1コマンドで実行するためのスクリプトを書いてみました：</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% switch-unbound.pl local
% switch-unbound.pl emobile</pre></div></div>

<h3>とりあえずこんな前提として</h3>
<h4>Unbound設定なディレクトリ</h4>
<p><code>/usr/local/etc/unbound</code> とします．</p>
<p>また，ここで紹介するPerlスクリプトは，<code>/usr/local/etc/unbound/scripts</code> に入っているものとします．</p>
<h4>ネットワーク環境</h4>
<p>開発機を，次の3パタンのネットワーク環境で利用しているとします．</p>
<dl>
<dt>普段のローカル環境（<code>local</code>）</dt>
<dd>IPアドレス: <code>192.168.1.152</code></dd>
<dt>emobile下（<code>emobile</code>）</dt>
<dd>IPアドレス: <code>192.168.144.152</code></dd>
<dt>実家（<code>home</code>）</dt>
<dd>IPアドレス: <code>192.168.0.152</code></dd>
</dl>
<p>そして，それぞれ向けのUnbound設定ファイルが，次のようにあるとします．（まぁデフォルトのファイルをコピーするだけでですが＞＜）</p>
<ul>
<li><code>/usr/local/etc/unbound/local.conf</code></li>
<li><code>/usr/local/etc/unbound/emobile.conf</code></li>
<li><code>/usr/local/etc/unbound/home.conf</code></li>
</ul>
<h4>名前解決</h4>
<p>次のホスト名で開発機にアクセスできるようにしたいものとします．</p>
<ul>
<li><code>www.momoco.local</code></li>
<li><code>dev.momoco.local</code></li>
<li><code>foo.momoco.local</code></li>
<li><code>dev.proj1.local</code></li>
<li><code>www.proj2.local</code></li>
</ul>
<p>また，次のホスト名については，必ず特定のIPドレスに解決されるものとします．</p>
<ul>
<li><code>hoge.example.com</code> => <code>aaa.bbb.ccc.ddd</code></li>
</ul>
<h4>Unboundの再起動</h4>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% sudo kill -HUP $(cat /usr/local/etc/unbound/unbound.pid)</pre></div></div>

<p>これでいけますよね？</p>
<h3>その1： 名前解決を定義したファイルを書き出すPerlスクリプト <code>update-unbound-hosts.pl</code></h3>
<p><code>config.pl</code> を，こんな感じで準備します：</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #339933;">+</span><span style="color: #009900;">&#123;</span>
    network_type <span style="color: #339933;">=&gt;</span> <span style="color: #339933;">+</span><span style="color: #009900;">&#123;</span><span style="color: #000066;">qw</span><span style="color: #339933;">/</span>
<span style="color: #000066;">local</span>    192<span style="color: #339933;">.</span>168<span style="color: #339933;">.</span>1<span style="color: #339933;">.</span>152
emobile  192<span style="color: #339933;">.</span>168<span style="color: #339933;">.</span>144<span style="color: #339933;">.</span>152
home     192<span style="color: #339933;">.</span>168<span style="color: #339933;">.</span>0<span style="color: #339933;">.</span>152
    <span style="color: #339933;">/</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    rules <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #000066;">qw</span><span style="color: #339933;">/</span>
www<span style="color: #339933;">.</span>momoco<span style="color: #339933;">.</span><span style="color: #000066;">local</span>  <span style="color: #339933;">%</span>
dev<span style="color: #339933;">.</span>momoco<span style="color: #339933;">.</span><span style="color: #000066;">local</span>  <span style="color: #339933;">%</span>
foo<span style="color: #339933;">.</span>momoco<span style="color: #339933;">.</span><span style="color: #000066;">local</span>  <span style="color: #339933;">%</span>
dev<span style="color: #339933;">.</span>proj1<span style="color: #339933;">.</span><span style="color: #000066;">local</span>   <span style="color: #339933;">%</span>
www<span style="color: #339933;">.</span>proj2<span style="color: #339933;">.</span><span style="color: #000066;">local</span>   <span style="color: #339933;">%</span>
hoge<span style="color: #339933;">.</span>example<span style="color: #339933;">.</span>com  aaa<span style="color: #339933;">.</span>bbb<span style="color: #339933;">.</span>ccc<span style="color: #339933;">.</span>ddd
    <span style="color: #339933;">/</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% update-unbound-hosts.pl
/usr/local/etc/unbound/include/emobile.hosts
/usr/local/etc/unbound/include/home.hosts
/usr/local/etc/unbound/include/local.hosts</pre></div></div>

<p><code>/usr/local/etc/unbound/include</code> というディレクトリを作り，その下に，各ネットワーク環境向けの名前解決ファイルができます．</p>
<p>ネットワーク環境「<code>local</code>」向けのファイルはこんな感じ：</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% cat /usr/local/etc/unbound/include/local.hosts
&nbsp;
local-zone: &quot;local.&quot; static
&nbsp;
local-data: &quot;www.momoco.local. A 192.168.1.152&quot;
local-data: &quot;dev.momoco.local. A 192.168.1.152&quot;
local-data: &quot;foo.momoco.local. A 192.168.1.152&quot;
local-data: &quot;dev.proj1.local. A 192.168.1.152&quot;
local-data: &quot;www.proj2.local. A 192.168.1.152&quot;
local-data: &quot;hoge.example.com. A aaa.bbb.ccc.ddd&quot;</pre></div></div>

<p>「<code>emobile</code>」向けはこんな感じ：</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% cat /usr/local/etc/unbound/include/emobile.hosts
&nbsp;
local-zone: &quot;local.&quot; static
&nbsp;
local-data: &quot;www.momoco.local. A 192.168.144.152&quot;
local-data: &quot;dev.momoco.local. A 192.168.144.152&quot;
local-data: &quot;foo.momoco.local. A 192.168.144.152&quot;
local-data: &quot;dev.proj1.local. A 192.168.144.152&quot;
local-data: &quot;www.proj2.local. A 192.168.144.152&quot;
local-data: &quot;hoge.example.com. A aaa.bbb.ccc.ddd&quot;</pre></div></div>

<p>あとは，Unbound設定ファイル内でこれを include する感じです：</p>

<div class="wp_syntax"><div class="code"><pre class="conf" style="font-family:monospace;">server:
    ...
&nbsp;
    include: &quot;/usr/local/etc/unbound/include/local.hosts&quot;
&nbsp;
    ...</pre></div></div>

<h3>その2： 指定したネットワーク環境の設定でUnboundを再起動するPerlスクリプト <code>switch-unbound.pl</code></h3>
<p><span id="more-3412"></span></p>
<p>これまでで，次のようなファイル構成になっています．</p>

<div class="wp_syntax"><div class="code"><pre class="tree" style="font-family:monospace;">/usr/local/etc/unbound
├── emobile.conf
├── home.conf
├── include
│   ├── emobile.hosts
│   ├── home.hosts
│   └── local.hosts
├── local.conf
├── scripts
│   ├── config.pl
│   ├── switch-unbound.pl
│   └── update-unbound-hosts.pl
└── unbound.pid</pre></div></div>

<p>2つ目のスクリプトは，次のような形で実行することで，指定した「ネットワーク名」（本エントリでいう <code>local</code> とか <code>emobile</code> とか）に対応した設定ファイルでUnboundを起動しなおします．</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">switch-unbound.pl {network_name}</pre></div></div>

<p>実行例はこんな感じ：</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% switch-unbound.pl emobile
Restarting unbound with &quot;emobile&quot; mode...
    % sudo kill -TERM $(cat /usr/local/etc/unbound/unbound.pid)
Password:
    % sudo unbound -c /usr/local/etc/unbound/emobile.conf
...done.</pre></div></div>

<h3>切り替わり確認</h3>
<p>実際に <code>dig</code> コマンドで確認してみます．</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% dig www.momoco.local
&nbsp;
; &lt;&lt;&gt;&gt; DiG 9.6.0-APPLE-P2 &lt;&lt;&gt;&gt; www.momoco.local
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 9071
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
&nbsp;
;; QUESTION SECTION:
;www.momoco.local.		IN	A
&nbsp;
;; ANSWER SECTION:
www.momoco.local.	3600	IN	A	192.168.1.152
&nbsp;
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Aug 28 15:53:41 2011
;; MSG SIZE  rcvd: 50
&nbsp;
% switch-unbound.pl emobile
Restarting unbound with &quot;emobile&quot; mode...
    % sudo kill -TERM $(cat /usr/local/etc/unbound/unbound.pid)
    % sudo unbound -c /usr/local/etc/unbound/emobile.conf
...done.
% dig www.momoco.local
&nbsp;
; &lt;&lt;&gt;&gt; DiG 9.6.0-APPLE-P2 &lt;&lt;&gt;&gt; www.momoco.local
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 5608
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
&nbsp;
;; QUESTION SECTION:
;www.momoco.local.		IN	A
&nbsp;
;; ANSWER SECTION:
www.momoco.local.	3600	IN	A	192.168.144.152
&nbsp;
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Aug 28 15:53:48 2011
;; MSG SIZE  rcvd: 50</pre></div></div>

<p>切り替わっているようですね．</p>
<p>ただ，リゾルバに開発機を指定している端末側では，この変更が即座に反映されているかどうかはよくわかっていせん＞＜</p>
<h3>ソースコード</h3>
<p>2つのPerlスクリプトのソースコードを載せておきます． gist の方もご参照いただければ．</p>
<ul class="links">
<li><a href="https://gist.github.com/1176338" title="issm's gist: 1176338 — Gist">issm&#8217;s gist: 1176338 — Gist</a></li>
</ul>
<h4><code>update-unbound-hosts.pl</code></p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/env perl</span>
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> utf8<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> 5<span style="color: #339933;">.</span>12<span style="color: #339933;">.</span>0<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> FindBin<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Data<span style="color: #339933;">::</span><span style="color: #006600;">Section</span><span style="color: #339933;">::</span><span style="color: #006600;">Simple</span> <span style="color: #009966; font-style: italic;">qw/get_data_section/</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Text<span style="color: #339933;">::</span><span style="color: #006600;">MicroTemplate</span> <span style="color: #009966; font-style: italic;">qw/:all/</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> File<span style="color: #339933;">::</span><span style="color: #006600;">Path</span> <span style="color: #009966; font-style: italic;">qw/make_path/</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$DIR_ROOT</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'/usr/local/etc/unbound'</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> fix_rules <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$rules</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$ip_base</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$ret</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">@$rules</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$hostname</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$ip</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #0000ff;">$hostname</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #0000ff;">@$rules</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">next</span>  <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$hostname</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">/^(#|[-=]{2,})/</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;"># &quot;#&quot; &quot;--&quot; &quot;==&quot; で始まる行はスキップする</span>
        <span style="color: #0000ff;">$ip</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #0000ff;">@$rules</span><span style="color: #339933;">;</span>
        <span style="color: #0000ff;">$ip</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$ip_base</span>  <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$ip</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'%'</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">push</span> <span style="color: #0000ff;">@$ret</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$hostname</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$ip</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066;">return</span> <span style="color: #0000ff;">$ret</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> main <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$conf_file</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$conf_file</span> <span style="color: #339933;">//=</span> <span style="color: #ff0000;">&quot;${DIR_ROOT}/scripts/config.pl&quot;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$conf</span> <span style="color: #339933;">=</span> <span style="color: #b1b100;">do</span> <span style="color: #0000ff;">$conf_file</span>  <span style="color: #b1b100;">or</span> <span style="color: #000066;">die</span> <span style="color: #0000ff;">$!</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$dir_inc</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;${DIR_ROOT}/include&quot;</span><span style="color: #339933;">;</span>
    make_path <span style="color: #0000ff;">$dir_inc</span>  <span style="color: #b1b100;">unless</span> <span style="color: #339933;">-</span>d <span style="color: #0000ff;">$dir_inc</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$out_template</span> <span style="color: #339933;">=</span> get_data_section<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'hosts.mt'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">for</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$type</span> <span style="color: #009900;">&#40;</span> <span style="color: #000066;">keys</span> <span style="color: #339933;">%</span><span style="color: #009900;">&#123;</span> <span style="color: #0000ff;">$conf</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>network_type<span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$ip_base</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$conf</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>network_type<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#123;</span><span style="color: #0000ff;">$type</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@rules</span> <span style="color: #339933;">=</span> <span style="color: #339933;">@</span><span style="color: #009900;">&#123;</span> <span style="color: #0000ff;">$conf</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>rules<span style="color: #009900;">&#125;</span> <span style="color: #339933;">//</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$out</span> <span style="color: #339933;">=</span> render_mt<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$out_template</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>
            type    <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$type</span><span style="color: #339933;">,</span>
            ip_base <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$ip_base</span><span style="color: #339933;">,</span>
            rules   <span style="color: #339933;">=&gt;</span> fix_rules<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">\@rules</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$ip_base</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$f_out</span> <span style="color: #339933;">=</span> <span style="color: #000066;">sprintf</span> <span style="color: #ff0000;">'%s/%s.hosts'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$dir_inc</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$type</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">open</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$fh_out</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'&gt;'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$f_out</span>  <span style="color: #b1b100;">or</span> <span style="color: #000066;">die</span> <span style="color: #0000ff;">$!</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">print</span> <span style="color: #0000ff;">$fh_out</span> <span style="color: #0000ff;">$out</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">close</span> <span style="color: #0000ff;">$fh_out</span><span style="color: #339933;">;</span>
        say <span style="color: #0000ff;">$f_out</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066;">exit</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
main<span style="color: #009900;">&#40;</span><span style="color: #339933;">@</span><span style="color: #000000; font-weight: bold;">ARGV</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">__DATA__</span>
&nbsp;
<span style="color: #339933;">@@</span> hosts<span style="color: #339933;">.</span>mt
<span style="color: #339933;">&lt;?</span>
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$var</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$_</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$ip_base</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$var</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>ip_base<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@rules</span><span style="color: #339933;">;</span>
<span style="color: #339933;">?&gt;</span>
local<span style="color: #339933;">-</span>zone<span style="color: #339933;">:</span> <span style="color: #ff0000;">&quot;local.&quot;</span> static
&nbsp;
<span style="color: #339933;">?</span> <span style="color: #0000ff;">@rules</span> <span style="color: #339933;">=</span>  <span style="color: #339933;">@</span><span style="color: #009900;">&#123;</span> <span style="color: #0000ff;">$var</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>rules<span style="color: #009900;">&#125;</span> <span style="color: #339933;">//</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">?</span> <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">@rules</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #339933;">?</span>   <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$hostname</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #0000ff;">@rules</span><span style="color: #339933;">;</span>
<span style="color: #339933;">?</span>   <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$ip</span>       <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #0000ff;">@rules</span><span style="color: #339933;">;</span>
local<span style="color: #339933;">-</span>data<span style="color: #339933;">:</span> <span style="color: #ff0000;">&quot;&lt;?= $hostname; ?&gt;. A &lt;?= $ip; ?&gt;&quot;</span>
<span style="color: #339933;">?</span> <span style="color: #009900;">&#125;</span></pre></div></div>

<h4><code>switch-unbound.pl</code></p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/env perl</span>
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> 5<span style="color: #339933;">.</span>12<span style="color: #339933;">.</span>0<span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> main <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$mode</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$mode</span> <span style="color: #339933;">//=</span> <span style="color: #ff0000;">'local'</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$dir_root</span>  <span style="color: #339933;">=</span> <span style="color: #ff0000;">'/usr/local/etc/unbound'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$pid_file</span>  <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;${dir_root}/unbound.pid&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$conf_file</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;${dir_root}/${mode}.conf&quot;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #339933;">-</span>f <span style="color: #0000ff;">$conf_file</span>  <span style="color: #b1b100;">or</span>  <span style="color: #000066;">die</span> <span style="color: #000066;">qq</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#91;</span>31mFile does <span style="color: #b1b100;">not</span> exist<span style="color: #339933;">:</span> <span style="color: #0000ff;">$</span><span style="color: #009900;">&#123;</span>conf_file<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#91;</span>0m<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$action</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span>f <span style="color: #0000ff;">$pid_file</span> <span style="color: #339933;">?</span> <span style="color: #ff0000;">'restart'</span> <span style="color: #339933;">:</span> <span style="color: #ff0000;">'start'</span><span style="color: #339933;">;</span>
    say <span style="color: #000066;">sprintf</span> <span style="color: #000066;">qq</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#91;</span>32m<span style="color: #0000ff;">%sing</span> unbound with <span style="color: #ff0000;">&quot;%s&quot;</span> mode<span style="color: #339933;">...</span><span style="color: #009900;">&#91;</span>0m<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #000066;">ucfirst</span> <span style="color: #0000ff;">$action</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$mode</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$cmd_stop</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$cmd_start</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>
        <span style="color: #ff0000;">&quot;sudo kill -TERM <span style="color: #000099; font-weight: bold;">\$</span>(cat ${pid_file})&quot;</span><span style="color: #339933;">,</span>
        <span style="color: #ff0000;">&quot;sudo unbound -c ${conf_file}&quot;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$msg</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">-</span>f <span style="color: #0000ff;">$pid_file</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        say <span style="color: #ff0000;">&quot;    % $cmd_stop&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #0000ff;">$msg</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">`$cmd_stop`</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    say <span style="color: #ff0000;">&quot;    % $cmd_start&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #0000ff;">$msg</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">`$cmd_start`</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$msg</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066;">die</span> <span style="color: #ff0000;">&quot;[31m${msg}[0m&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">exit</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
        say <span style="color: #ff0000;">&quot;[32m...done.[0m&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">exit</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
main <span style="color: #009900;">&#40;</span><span style="color: #339933;">@</span><span style="color: #000000; font-weight: bold;">ARGV</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">__END__</span></pre></div></div>

<h3>おわりに</h3>
<p>以上，ネットワーク環境が変わったときに，その環境にあわせてUnboundを再設定することを，それなりに簡単にするためのPerlスクリプトを書いてみたお話でした．</p>
<p>これで，どこへ行っても，開発中・未公開のローカルなWebアプリとかをモバイル端末から確認することができますね，というか，確認するための設定が楽になりますね！ たぶん！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.iss.ms/2011/08/28/162714/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unboundを入れてiPhoneやiPadでローカルで開発しているWebアプリとかにアクセスできるようにする</title>
		<link>http://blog.iss.ms/2011/08/28/044226</link>
		<comments>http://blog.iss.ms/2011/08/28/044226#comments</comments>
		<pubDate>Sat, 27 Aug 2011 19:42:26 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[開発ごっこ]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[unbound]]></category>
		<category><![CDATA[webapp]]></category>

		<guid isPermaLink="false">http://blog.iss.ms/?p=3396</guid>
		<description><![CDATA[はじめに iPhone や iPad で開発中のWebアプリなんかを http://192.168.xxx.xxx:5000/ とかではなくて http://app.example.local:5000/ のように確認し [...]]]></description>
			<content:encoded><![CDATA[<p><!--Title:Unboundを入れてiPhoneやiPadでローカルで開発しているWebアプリとかにアクセスできるようにする--></p>
<div class="flickr2-photo">
<a href="http://www.flickr.com/photos/issm/6085547529/" title="IMGP5372 by issm, on Flickr"><img src="http://farm7.static.flickr.com/6068/6085547529_ab714fbbf1.jpg" width="500" height="333" alt="IMGP5372"></a>
</div>
<h3>はじめに</h3>
<p>iPhone や iPad で開発中のWebアプリなんかを <code>http://192.168.xxx.xxx:5000/</code> とかではなくて <code>http://app.example.local:5000/</code> のように確認してみたい，けれど端末の <code>/etc/hosts</code> とか編集できない，となるとDNS？なんかおっかない，などとこれまでやってきてました．</p>
<p>しかし，なかなかそうも言っていられなくなってきたのかきていないのかはわかりませんが，試しに開発機のMacBookProにDNSサーバを立ててみることにしました．サーバには，ちょうど目的の似た次のエントリあたりに触発されて，<a href="http://unbound.net/" title="Unbound">Unbound</a> を選んでみました．</p>
<ul class="links">
<li><a href="http://d.hatena.ne.jp/sfujiwara/20110614/1308031490" title="Unbound で一部の名前だけ置き換える DNS cache サーバを立てる - 酒日記 はてな支店">Unbound で一部の名前だけ置き換える DNS cache サーバを立てる &#8211; 酒日記 はてな支店</a></li>
</ul>
<p>では以下，Unboundのお試しと，iPhoneとかでアクセスできるようになるまでの流れについて．</p>
<h3>ちょっと前提</h3>
<p>次の前提でエントリを進めていきます：</p>
<ul>
<li>開発機（MacBookPro）のIPアドレスが 192.168.1.152</li>
<li><code>www.momoco.local</code> という名前でiPhoneとかからアクセスしたい</li>
</ul>
<h3>Unboundをインストールする</h3>
<p>Homebrew があれば一発ですね！</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% brew install unbound</pre></div></div>

<p>バージョンやインストールオプションなんかはこんな感じ：</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% unbound -h
usage:  unbound [options]
	start unbound daemon DNS resolver.
-h	this help
-c file	config file to read instead of /usr/local/Cellar/unbound/1.4.7/etc/unbound/unbound.conf
	file format is described in unbound.conf(5).
-d	do not fork into the background.
-v	verbose (more times to increase verbosity)
Version 1.4.7
linked libs: mini-event internal (it uses select), ldns 1.6.5, OpenSSL 0.9.8r 8 Feb 2011
linked modules: validator iterator
configured for x86_64-apple-darwin10.8.0 on Tue Jul  5 04:25:12 JST 2011 with options: '--disable-gost' '--disable-sha2' '--with-ssl-optional' '--prefix=/usr/local/Cellar/unbound/1.4.7'
BSD licensed, see LICENSE in source package for details.
Report bugs to unbound-bugs@nlnetlabs.nl</pre></div></div>

<h3>Unboundを設定する</h3>
<p><span id="more-3396"></span></p>
<p><code>/usr/local/etc/unbound</code> （厳密には <code>/usr/local/Cellar/unbound/1.4.7/etc</code> へのリンク）下に，<code>unbound.conf</code> だったか <code>unbound.conf.default</code> だったかのファイルがありますが，まずは任意の名前で簡単なファイルを自分で作ればよいです．（Unboundの実行時に，設定ファイルを指定できるので．）</p>
<p>とはいえ，設定ファイルを <code>/usr/local/etc/unbound/unbound.conf</code> として進めます．</p>

<div class="wp_syntax"><div class="code"><pre class="conf" style="font-family:monospace;">server:
    username: someone
    logfile: /usr/local/var/log/unbound/unbound.log
    interface: 0.0.0.0
    access-control: 192.168.1.0/24 allow</pre></div></div>

<p>これに加え，次のような1行を付け足します：</p>

<div class="wp_syntax"><div class="code"><pre class="conf" style="font-family:monospace;">    local-data: &quot;www.momoco.local. A 192.168.1.152&quot;</pre></div></div>

<p>これで，「<code>www.momoco.local</code>」という名前を「192.168.1.152」というIPアドレスに対応付けるためのルールができました．</p>
<h3>Unboundを起動する</h3>
<p><code>-c</code> オプションで設定ファイルを指定して実行することで，バックグラウンドで起動します：</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% sudo unbound -c /usr/local/etc/unbound/unbound.conf</pre></div></div>

<p><code>-d</code> オプションをつけることで，フォアグラウンドで実行させることもできます：</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% sudo unbound -d -c /usr/local/etc/unbound/unbound.conf</pre></div></div>

<h3>リゾルバを設定する</h3>
<p>先で起動したサーバに問い合わせが行くようにします．（本エントリのタイトルのとおりの目的であれば不要かも＞＜）</p>
<p>MacBook（Mac OSX）であれば，設定は「環境設定 &gt; ネットワーク」におけるアクティヴなデバイスについての「DNSサーバ」に，「127.0.0.1」（もしくは「192.168.1.152」？）が最初にくるように追記します：</p>
<div class="flickr2-photo">
<a href="http://www.flickr.com/photos/issm/6086458550/" title="ss-1314468905 by issm, on Flickr"><img src="http://farm7.static.flickr.com/6075/6086458550_d5579e648f.jpg" width="500" height="433" alt="ss-1314468905"></a>
</div>
<p>イーサネットなら上のような感じ，ワイヤレスなら次のような感じでしょうか：</p>
<div class="flickr2-photo">
<a href="http://www.flickr.com/photos/issm/6086458658/" title="ss-1314468960 by issm, on Flickr"><img src="http://farm7.static.flickr.com/6075/6086458658_e55d229dac.jpg" width="500" height="389" alt="ss-1314468960"></a>
</div>
<p>設定完了後，ファイル <code>/etc/resolv.conf</code> が次のようになっているでしょう：</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">#
# Mac OS X Notice
#
# This file is not used by the host name and address resolution
# or the DNS query routing mechanisms used by most processes on
# this Mac OS X system.
#
# This file is automatically generated.
#
nameserver 127.0.0.1
nameserver 192.168.1.1</pre></div></div>

<h3>確認してみる</h3>
<h4><code>dig</code>コマンドで</h4>
<p><code>dig</code> コマンドなるもので確認できます．詳しくは次あたりを．</p>
<ul class="links">
<li><a href="http://www.atmarkit.co.jp/fnetwork/dnstips/012.html" title="＠IT：DNS Tips：digコマンドとは">＠IT：DNS Tips：digコマンドとは</a></li>
</ul>
<p><code>www.momoco.local</code> に対しては次のようになります：</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% dig www.momoco.local
&nbsp;
; &lt;&lt;&gt;&gt; DiG 9.6.0-APPLE-P2 &lt;&lt;&gt;&gt; www.momoco.local
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 30365
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
&nbsp;
;; QUESTION SECTION:
;www.momoco.local.		IN	A
&nbsp;
;; ANSWER SECTION:
www.momoco.local.	3600	IN	A	192.168.1.152
&nbsp;
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Aug 28 03:44:33 2011
;; MSG SIZE  rcvd: 50</pre></div></div>

<p>ちなみに，設定を行っていない <code>hoge.example.com</code> に対しては次のようになりました：</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% dig hoge.example.com
&nbsp;
; &lt;&lt;&gt;&gt; DiG 9.6.0-APPLE-P2 &lt;&lt;&gt;&gt; hoge.example.com
;; global options: +cmd
;; Got answer:
;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NXDOMAIN, id: 27890
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
&nbsp;
;; QUESTION SECTION:
;hoge.example.com.		IN	A
&nbsp;
;; AUTHORITY SECTION:
example.com.		3351	IN	SOA	dns1.icann.org. hostmaster.icann.org. 2011061531 7200 3600 1209600 3600
&nbsp;
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Aug 28 03:45:03 2011
;; MSG SIZE  rcvd: 95</pre></div></div>

<h4>ブラウザで</h4>
<div class="flickr2-photo">
<a href="http://www.flickr.com/photos/issm/6086566596/" title="ss-1314471175 by issm, on Flickr"><img src="http://farm7.static.flickr.com/6061/6086566596_acf69a54fe.jpg" width="500" height="281" alt="ss-1314471175"></a>
</div>
<p>ここではPlackアプリなので5000番ポートになっています，念のため．</p>
<h3>iPhoneの設定を変更する</h3>
<p>ようやくiPhoneの設定です．</p>
<p>先の「リゾルバ設定」と同じ感じで，「設定 &gt; Wi-Fi &gt; （アクティヴなネットワーク）」における「DNS」の欄に「192.168.1.152」を，最初にくるように追記します：</p>
<div class="flickr2-photo">
<a href="http://www.flickr.com/photos/issm/6085589681/" title="ss-1314462256 by issm, on Flickr"><img src="http://farm7.static.flickr.com/6073/6085589681_dfc442d02a.jpg" width="320" height="480" alt="ss-1314462256"></a>
</div>
<p>iPadなんかも同様ですね！</p>
<h3>iPhoneで確認してみる</h3>
<p>iPhoneのブラウザで，先と同様に <code>http://www.momoco.local:5000/</code> としてアクセスしてみたのが次です：</p>
<div class="flickr2-photo">
<a href="http://www.flickr.com/photos/issm/6086536482/" title="ss-1314470564 by issm, on Flickr"><img src="http://farm7.static.flickr.com/6064/6086536482_88eac3c328.jpg" width="320" height="480" alt="ss-1314470564"></a>
</div>
<p>できました！</p>
<p>※ 場合によっては，アクセスできるようになるまでに少し時間がかかる場合があるみたいです．このへんはまったく無知なので理由はわかりませんｗ どなたか教えてください＞＜</p>
<h3>おわりに</h3>
<p>以上，私のメイン開発機である MacBookPro に Unbound を入れ，iPhone や iPad から開発しているWebアプリなんかにアクセスできるようにちょこっと設定してみたお話でした．</p>
<h3 class="appendix">おまけ</h3>
<p>「momoco」は，<a href="http://www.tokuma.co.jp/coil/">電脳コイル</a> に登場する，ねこ型でピンク色の「ペットマトン」の名前にインスパイアされています．</p>
<div class="photo">
  <a href="http://blog.iss.ms/wp-content/uploads/2011/08/img-13144694781.jpg"><img src="http://blog.iss.ms/wp-content/uploads/2011/08/img-13144694781.jpg" alt="ミゼットとモモコ" title="ミゼットとモモコ" /></a>
</div>
<p>※ <a href="http://9742.blog3.fc2.com/blog-entry-1536.html" title="前橋のほどよい郊外 // 電脳コイル再見　第１４話">前橋のほどよい郊外 // 電脳コイル再見　第１４話</a> より転載．</p>
<p>とりあえずWikipediaにざっと情報があるので，詳しくはそちらを．</p>
<ul class="links">
<li><a href="http://ja.wikipedia.org/wiki/電脳コイル" title="電脳コイル - Wikipedia">電脳コイル &#8211; Wikipedia</a></li>
</ul>
<h3>Amazonさん</h3>
<ul class="amazlet">
<li>
<div class="amazlet-box">
<div class="amazlet-image"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B0058QFZYC/issm-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51CWy3VrXKL._SL160_.jpg" alt="電脳コイル Blu-ray Disc Box" /></a></div>
<div class="amazlet-info">
<div class="amazlet-name"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B0058QFZYC/issm-22/ref=nosim/" name="amazletlink" target="_blank">電脳コイル Blu-ray Disc Box</a>
<div class="amazlet-powered-date">posted with <a href="http://www.amazlet.com/browse/ASIN/B0058QFZYC/issm-22/ref=nosim/" title="電脳コイル Blu-ray Disc Box" target="_blank">amazlet</a> at 11.08.28</div>
</div>
<div class="amazlet-detail">バンダイビジュアル (2011-11-25)<br />売り上げランキング: 478</div>
<div class="amazlet-sub-info">
<div class="amazlet-link"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B0058QFZYC/issm-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
</div>
<div class="amazlet-footer"></div>
</div>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.iss.ms/2011/08/28/044226/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[amon2] 練習がてらMongoDBを利用するためのプラグインを書いてみた</title>
		<link>http://blog.iss.ms/2011/08/07/185443</link>
		<comments>http://blog.iss.ms/2011/08/07/185443#comments</comments>
		<pubDate>Sun, 07 Aug 2011 09:54:43 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[開発ごっこ]]></category>
		<category><![CDATA[amon2]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[webapp]]></category>

		<guid isPermaLink="false">http://blog.iss.ms/?p=3387</guid>
		<description><![CDATA[はじめに これで、Amon2::Plugin::DBI をロードしています。Amon2 はプラグイン機構によって無限の拡張性を演出しております。このプラグインをロードすることにより $c->dbh() というメソッドが追 [...]]]></description>
			<content:encoded><![CDATA[<p><!--[amon2] 練習がてらMongoDBを利用するためのプラグインを書いてみた--></p>
<h3>はじめに</h3>
<blockquote cite="http://d.hatena.ne.jp/tokuhirom/20110715/1310600765"><p>
これで、Amon2::Plugin::DBI をロードしています。Amon2 はプラグイン機構によって無限の拡張性を演出しております。このプラグインをロードすることにより $c->dbh() というメソッドが追加され、DB へ簡単にアクセスできるようになります。このメソッドは Amon2::DBI のインスタンスをかえします。<br />
<cite><a href="http://d.hatena.ne.jp/tokuhirom/20110715/1310600765" title="TinyURLをつくってみよう ～ 軽量フレームワークAmon２入門　(４) ～ - TokuLog 改メ tokuhirom’s blog">TinyURLをつくってみよう ～ 軽量フレームワークAmon２入門　(４) ～ &#8211; TokuLog 改メ tokuhirom’s blog</a></cite>
</p></blockquote>
<p>開発者ご本人によるこのチュートリアルを進めてみて，プラグインのしくみと便利さがが少しわかりました．</p>
<p>そこで，プラグイン機構への理解をもう1歩進めるため，<code>Amon2::Plugin::DBI</code> を参考に，<a href="http://www.mongodb.org/">MongoDB</a> の特定のデータベースへのアクセスを行うためのプラグインを書いてみました．</p>
<p>以下，その辺のまとめです．</p>
<h3>ファイル構成</h3>
<p>プラグインの読み込みは，（ライブラリのパスが通ってさえいれば）どこにあっても可能なのですが，まぁプロジェクト向けプラグインということで，次のように，ディレクトリ <code>lib/MyApp/Plugin</code> を準備し，その下に入れることにしました：</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">lib
├── MyApp
│   ├── Plugin
│   │   └── MongoDB.pm
│   ├── Web
│   │   └── Dispatcher.pm
│   └── Web.pm
└── MyApp.pm</pre></div></div>

<p>ソースコードについては後ほど．</p>
<h3>プラグインを読み込む</h3>
<p><code>MyApp::Web</code> 内で，次のようにすれば読み込めます：</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">__PACKAGE__<span style="color: #339933;">-&gt;</span><span style="color: #006600;">load_plugins</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'+MyApp::Plugin::MongoDB'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>実際には，次のように追記すればよいかと：</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">diff <span style="color: #339933;">--</span>git a<span style="color: #339933;">/</span>lib<span style="color: #339933;">/</span>MyApp<span style="color: #339933;">/</span>Web<span style="color: #339933;">.</span>pm b<span style="color: #339933;">/</span>lib<span style="color: #339933;">/</span>MyApp<span style="color: #339933;">/</span>Web<span style="color: #339933;">.</span>pm
<span style="color: #000066;">index</span> 991c904<span style="color: #339933;">..</span>7dbe878 <span style="color: #cc66cc;">100644</span>
<span style="color: #339933;">---</span> a<span style="color: #339933;">/</span>lib<span style="color: #339933;">/</span>MyApp<span style="color: #339933;">/</span>Web<span style="color: #339933;">.</span>pm
<span style="color: #339933;">+++</span> b<span style="color: #339933;">/</span>lib<span style="color: #339933;">/</span>MyApp<span style="color: #339933;">/</span>Web<span style="color: #339933;">.</span>pm
<span style="color: #339933;">@@</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">37</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">6</span> <span style="color: #339933;">+</span><span style="color: #cc66cc;">37</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">7</span> <span style="color: #339933;">@@</span> <span style="color: #000000; font-weight: bold;">use</span> Text<span style="color: #339933;">::</span><span style="color: #006600;">Xslate</span><span style="color: #339933;">;</span>
 <span style="color: #666666; font-style: italic;"># load plugins</span>
 <span style="color: #000000; font-weight: bold;">use</span> HTTP<span style="color: #339933;">::</span><span style="color: #006600;">Session</span><span style="color: #339933;">::</span><span style="color: #006600;">Store</span><span style="color: #339933;">::</span><span style="color: #006600;">File</span><span style="color: #339933;">;</span>
 __PACKAGE__<span style="color: #339933;">-&gt;</span><span style="color: #006600;">load_plugins</span><span style="color: #009900;">&#40;</span>
<span style="color: #339933;">+</span>    <span style="color: #ff0000;">'+MyApp::Plugin::MongoDB'</span><span style="color: #339933;">,</span>
     <span style="color: #ff0000;">'Web::FillInFormLite'</span><span style="color: #339933;">,</span>
     <span style="color: #ff0000;">'Web::NoCache'</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;"># do not cache the dynamic content by default</span>
     <span style="color: #ff0000;">'Web::CSRFDefender'</span><span style="color: #339933;">,</span></pre></div></div>

<h3>コンフィグを追加する</h3>
<p>コンフィグに，MongoDBへの接続設定を追記します：</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #339933;">+</span><span style="color: #009900;">&#123;</span>
    <span style="color: #339933;">...</span>
&nbsp;
    <span style="color: #ff0000;">'MongoDB'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#123;</span>
        host     <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'localhost'</span><span style="color: #339933;">,</span>
        port     <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'27017'</span><span style="color: #339933;">,</span>
        username <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">''</span><span style="color: #339933;">,</span>
        password <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">''</span><span style="color: #339933;">,</span>
        database <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'foo'</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    <span style="color: #339933;">...</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>できあがり</h3>
<p><code>$c->db</code> という形で，先のコンフィグで設定したデータベースに関する <code>MongoDB::Database</code> オブジェクトが返ってきます．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">any <span style="color: #ff0000;">'/'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$c</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">use</span> Data<span style="color: #339933;">::</span><span style="color: #006600;">Dumper</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">warn</span> Dumper <span style="color: #0000ff;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">db</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #0000ff;">$c</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">render</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'index.tx'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">$VAR1 = bless( {
                 '_connection' =&gt; bless( {
                                           'find_master' =&gt; 0,
                                           'query_timeout' =&gt; 30000,
                                           'w' =&gt; 1,
                                           '_servers' =&gt; {},
                                           'right_port' =&gt; 27017,
                                           'wtimeout' =&gt; 1000,
                                           'timeout' =&gt; 20000,
                                           'auto_connect' =&gt; 1,
                                           'auto_reconnect' =&gt; 1,
                                           'db_name' =&gt; 'admin',
                                           'ts' =&gt; 0,
                                           'port' =&gt; '27017',
                                           'left_port' =&gt; 27017,
                                           'host' =&gt; 'localhost',
                                           'username' =&gt; 'admin',
                                           'max_bson_size' =&gt; 16777216
                                         }, 'MongoDB::Connection' ),
                 'name' =&gt; 'foo'
               }, 'MongoDB::Database' );</pre></div></div>

<h3>ソースコード</h3>
<p><code>Amon2::Plugin::DBI</code> の内容をそのままMongoDB向けに置き換えた感じです．<code>MongoDB::Database</code> オブジェクトを，ラップなどせずにそのまま返しています．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000066;">package</span> MyApp<span style="color: #339933;">::</span><span style="color: #006600;">Plugin</span><span style="color: #339933;">::</span><span style="color: #006600;">MongoDB</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> utf8<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> MongoDB<span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> init <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$class</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$c</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$params</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000066;">no</span> strict <span style="color: #ff0000;">'refs'</span><span style="color: #339933;">;</span>
    <span style="color: #339933;">*</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">&quot;$c<span style="color: #000099; font-weight: bold;">\:</span>:db&quot;</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">\&amp;_db</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> _db <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$self</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #000066;">defined</span> <span style="color: #0000ff;">$self</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>db<span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$conf</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$self</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">config</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'MongoDB'</span><span style="color: #009900;">&#125;</span>
            <span style="color: #b1b100;">or</span> <span style="color: #000066;">die</span> <span style="color: #ff0000;">&quot;missing configuration for 'MongoDB'&quot;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$dbname</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$conf</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>database<span style="color: #009900;">&#125;</span>
            <span style="color: #b1b100;">or</span> <span style="color: #000066;">die</span> <span style="color: #ff0000;">&quot;missing 'MongoDB.database'&quot;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">%params_conn</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>
            host <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$conf</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>host<span style="color: #009900;">&#125;</span> <span style="color: #339933;">||</span> <span style="color: #ff0000;">'localhost'</span><span style="color: #339933;">,</span>
            port <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$conf</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>port<span style="color: #009900;">&#125;</span> <span style="color: #339933;">||</span> <span style="color: #ff0000;">'27017'</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #0000ff;">$params_conn</span><span style="color: #009900;">&#123;</span>username<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$conf</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>username<span style="color: #009900;">&#125;</span>  <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$conf</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>username<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
        <span style="color: #0000ff;">$params_conn</span><span style="color: #009900;">&#123;</span>password<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$conf</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>password<span style="color: #009900;">&#125;</span>  <span style="color: #b1b100;">if</span> <span style="color: #0000ff;">$conf</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>password<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$conn</span> <span style="color: #339933;">=</span> MongoDB<span style="color: #339933;">::</span><span style="color: #006600;">Connection</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">%params_conn</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #0000ff;">$self</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>db<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$conn</span><span style="color: #339933;">-&gt;</span><span style="color: #0000ff;">$dbname</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066;">return</span> <span style="color: #0000ff;">$self</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>db<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span></pre></div></div>

<ul class="links">
<li><a href="https://gist.github.com/1130238" title="issm's gist: 1130238 — Gist">issm&#8217;s gist: 1130238 — Gist</a></li>
</ul>
<h3>おわりに</h3>
<p>以上，Amon2でMongoDBを利用するためのプラグインを練習がてら書いてみたお話でした．</p>
<p>さて，MongoDBの使い方を覚えねば．．．</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.iss.ms/2011/08/07/185443/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[amon2] ビューのXslateで「Kolon」シンタックスを使えるようにしてみる</title>
		<link>http://blog.iss.ms/2011/08/07/174053</link>
		<comments>http://blog.iss.ms/2011/08/07/174053#comments</comments>
		<pubDate>Sun, 07 Aug 2011 08:40:53 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[開発ごっこ]]></category>
		<category><![CDATA[amon2]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[webapp]]></category>
		<category><![CDATA[xslate]]></category>

		<guid isPermaLink="false">http://blog.iss.ms/?p=3378</guid>
		<description><![CDATA[はじめに 前エントリ で準備したAmon2プロジェクトでは，ビューのテンプレートエンジンとして Xslate が使われているものの，そのシンタックスが「TTerse」でした． 個人的には「Kolon」シンタックスを使って [...]]]></description>
			<content:encoded><![CDATA[<p><!--Title:[amon2] ビューのXslateで「Kolon」シンタックスを使えるようにしてみる--></p>
<h3>はじめに</h3>
<p><a href="http://blog.iss.ms/2011/08/07/163042">前エントリ</a> で準備したAmon2プロジェクトでは，ビューのテンプレートエンジンとして <a href="http://xslate.org/">Xslate</a> が使われているものの，そのシンタックスが「TTerse」でした．</p>
<p>個人的には「Kolon」シンタックスを使ってみたいので，同プロジェクトで，「Kolon」シンタックスなテンプレートが使えるように変更してみました．</p>
<h3>コンフィグを修正する</h3>

<div class="wp_syntax"><div class="code"><pre class="diff" style="font-family:monospace;">diff --git a/config/development.pl b/config/development.pl
index a<span style="color: #440088;">7c51</span>df..c<span style="color: #440088;">4a812</span>e <span style="">100644</span>
<span style="color: #888822;">--- a/config/development.pl</span>
<span style="color: #888822;">+++ b/config/development.pl</span>
<span style="color: #440088;">@@ -1,4 +1,10 @@</span>
 +<span style="">&#123;</span>
<span style="color: #00b000;">+    'Text::Xslate' =&gt; +<span style="">&#123;</span></span>
<span style="color: #00b000;">+        syntax =&gt; 'Kolon',</span>
<span style="color: #00b000;">+        suffix =&gt; '.tx',</span>
<span style="color: #00b000;">+        module =&gt; undef,  # デフォルトで <span style="">&#91;</span> 'Text::Xslate::Bridge::TT2Like' <span style="">&#93;</span> ってなってるけど，そのままでもOK？</span>
<span style="color: #00b000;">+    <span style="">&#125;</span>,</span>
<span style="color: #00b000;">+</span>
     'DBI' =&gt; <span style="">&#91;</span>
         'dbi:SQLite:dbname=development.db',
         '',</pre></div></div>

<h3>テンプレートを修正する</h3>
<p>ファイル構成をちょこっと変更しました．</p>
<p>before:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">tmpl
├── include
│   └── layout.tt
└── index.tt</pre></div></div>

<p>after:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">tmpl
├── _base.tx
└── index.tx</pre></div></div>

<p><code>include/layout.tt</code>， <code>_base.tx</code> は，どちらも「継承のベースとなるテンプレート」という感じです．</p>
<p>ベーステンプレートの差分はこんな感じです：</p>

<div class="wp_syntax"><div class="code"><pre class="diff" style="font-family:monospace;"><span style="color: #888822;">--- include/layout.tt	2011-08-07 15:18:28.000000000 +0900</span>
<span style="color: #888822;">+++ _base.tx	2011-08-07 15:39:32.000000000 +0900</span>
<span style="color: #440088;">@@ -2,27 +2,27 @@</span>
 &lt;html xmlns=&quot;http://www.w3.org/<span style="">1999</span>/xhtml&quot;&gt;
 &lt;head&gt;
     &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-<span style="">8</span>&quot; /&gt;
<span style="color: #991111;">-    &lt;title&gt;<span style="">&#91;</span>% title || 'MyApp' %<span style="">&#93;</span>&lt;/title&gt;</span>
<span style="color: #00b000;">+    &lt;title&gt;&lt;: $title || 'MyApp' :&gt;&lt;/title&gt;</span>
     &lt;meta http-equiv=&quot;Content-Style-Type&quot; content=&quot;text/css&quot; /&gt;  
     &lt;meta http-equiv=&quot;Content-Script-Type&quot; content=&quot;text/javascript&quot; /&gt;  
     &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, minimum-scale=<span style="">1.0</span>, maximum-scale=<span style="">1.0</span>&quot;<span style="">&#93;</span><span style="">&#93;</span>&gt;
     &lt;meta name=&quot;format-detection&quot; content=&quot;telephone=no&quot; /&gt;
<span style="color: #991111;">-    &lt;link href=&quot;<span style="">&#91;</span>% uri_for<span style="">&#40;</span>'/static/css/blueprint/screen.css'<span style="">&#41;</span> %<span style="">&#93;</span>&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot; /&gt;</span>
<span style="color: #991111;">-    &lt;link href=&quot;<span style="">&#91;</span>% uri_for<span style="">&#40;</span>'/static/css/blueprint/print.css'<span style="">&#41;</span> %<span style="">&#93;</span>&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;print&quot; /&gt;</span>
<span style="color: #991111;">-    &lt;!--<span style="">&#91;</span>if lt IE 8<span style="">&#93;</span>&gt;&lt;link rel=&quot;stylesheet&quot; href=&quot;<span style="">&#91;</span>% uri_for<span style="">&#40;</span>'/static/css/blueprint/ie.css'<span style="">&#41;</span> %<span style="">&#93;</span>&quot; type=&quot;text/css&quot; media=&quot;screen, projection&quot;&gt;&lt;!<span style="">&#91;</span>endif<span style="">&#93;</span>--&gt; </span>
<span style="color: #991111;">-    &lt;link href=&quot;<span style="">&#91;</span>% uri_for<span style="">&#40;</span>'/static/css/main.css'<span style="">&#41;</span> %<span style="">&#93;</span>&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot; /&gt;</span>
<span style="color: #991111;">-    &lt;script src=&quot;<span style="">&#91;</span>% uri_for<span style="">&#40;</span>'/static/js/jquery-1.6.2.min.js'<span style="">&#41;</span> %<span style="">&#93;</span>&quot;&gt;&lt;/script&gt;</span>
<span style="color: #00b000;">+    &lt;link href=&quot;&lt;: uri_for<span style="">&#40;</span>'/static/css/blueprint/screen.css'<span style="">&#41;</span> :&gt;&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot; /&gt;</span>
<span style="color: #00b000;">+    &lt;link href=&quot;&lt;: uri_for<span style="">&#40;</span>'/static/css/blueprint/print.css'<span style="">&#41;</span> :&gt;&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;print&quot; /&gt;</span>
<span style="color: #00b000;">+    &lt;!--<span style="">&#91;</span>if lt IE 8<span style="">&#93;</span>&gt;&lt;link rel=&quot;stylesheet&quot; href=&quot;&lt;: uri_for<span style="">&#40;</span>'/static/css/blueprint/ie.css'<span style="">&#41;</span> :&gt;&quot; type=&quot;text/css&quot; media=&quot;screen, projection&quot;&gt;&lt;!<span style="">&#91;</span>endif<span style="">&#93;</span>--&gt; </span>
<span style="color: #00b000;">+    &lt;link href=&quot;&lt;: uri_for<span style="">&#40;</span>'/static/css/main.css'<span style="">&#41;</span> :&gt;&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;screen&quot; /&gt;</span>
<span style="color: #00b000;">+    &lt;script src=&quot;&lt;: uri_for<span style="">&#40;</span>'/static/js/jquery-1.6.2.min.js'<span style="">&#41;</span> :&gt;&quot;&gt;&lt;/script&gt;</span>
     &lt;!--<span style="">&#91;</span>if lt IE <span style="">9</span><span style="">&#93;</span>&gt;
         &lt;script src=&quot;http://html5shiv.googlecode.com/svn/trunk/html5.js&quot;&gt;&lt;/script&gt;
     &lt;!<span style="">&#91;</span>endif<span style="">&#93;</span>--&gt;
 &lt;/head&gt;
<span style="color: #991111;">-&lt;body<span style="">&#91;</span>% IF bodyID %<span style="">&#93;</span> class=&quot;<span style="">&#91;</span>% bodyID %<span style="">&#93;</span>&quot;<span style="">&#91;</span>% END %<span style="">&#93;</span>&gt;</span>
<span style="color: #00b000;">+&lt;body&lt;: if <span style="">&#40;</span> $bodyID <span style="">&#41;</span> <span style="">&#123;</span> :&gt; class=&quot;&lt;: $bodyID :&gt;&quot;&lt;: <span style="">&#125;</span> :&gt;&gt;</span>
     &lt;div class=&quot;container&quot;&gt;
         &lt;header&gt;
<span style="color: #991111;">-            &lt;a href=&quot;<span style="">&#91;</span>% uri_for<span style="">&#40;</span>'/'<span style="">&#41;</span> %<span style="">&#93;</span>&quot;&gt;MyApp&lt;/a&gt;</span>
<span style="color: #00b000;">+            &lt;a href=&quot;&lt;: uri_for<span style="">&#40;</span>'/'<span style="">&#41;</span> :&gt;&quot;&gt;MyApp&lt;/a&gt;</span>
         &lt;/header&gt;
         &lt;div id=&quot;main&quot;&gt;
<span style="color: #991111;">-            <span style="">&#91;</span>% content %<span style="">&#93;</span></span>
<span style="color: #00b000;">+: block content -&gt; <span style="">&#123;</span><span style="">&#125;</span></span>
         &lt;/div&gt;
         &lt;footer&gt;
             Powered by &lt;a href=&quot;http://amon.64p.org/&quot;&gt;Amon2&lt;/a&gt;</pre></div></div>

<p>「index」テンプレートの差分はこんな感じです：</p>

<div class="wp_syntax"><div class="code"><pre class="diff" style="font-family:monospace;"><span style="color: #888822;">--- index.tt	2011-08-07 15:18:28.000000000 +0900</span>
<span style="color: #888822;">+++ index.tx	2011-08-07 15:40:10.000000000 +0900</span>
<span style="color: #440088;">@@ -1,5 +1,6 @@</span>
<span style="color: #991111;">-<span style="">&#91;</span>% WRAPPER 'include/layout.tt' %<span style="">&#93;</span></span>
<span style="color: #00b000;">+: cascade _base</span>
&nbsp;
<span style="color: #00b000;">+: around content -&gt; <span style="">&#123;</span></span>
 &lt;hr class=&quot;space&quot;&gt;
&nbsp;
 &lt;div class=&quot;span-<span style="">15</span> colborder&quot;&gt;
<span style="color: #440088;">@@ -21,4 +22,4 @@</span>
&nbsp;
 &lt;hr class=&quot;space&quot;&gt;
&nbsp;
<span style="color: #991111;">-<span style="">&#91;</span>% END %<span style="">&#93;</span></span>
<span style="color: #00b000;">+: <span style="">&#125;</span></span></pre></div></div>

<h3>ディスパッチャを修正する</h3>
<p>render対象を変更するだけですね：</p>

<div class="wp_syntax"><div class="code"><pre class="diff" style="font-family:monospace;">diff --git a/lib/MyApp/Web/Dispatcher.pm b/lib/MyApp/Web/Dispatcher.pm
index 516ef4a..3fc4596 <span style="">100644</span>
<span style="color: #888822;">--- a/lib/MyApp/Web/Dispatcher.pm</span>
<span style="color: #888822;">+++ b/lib/MyApp/Web/Dispatcher.pm</span>
<span style="color: #440088;">@@ -<span style="">5</span>,<span style="">7</span> +<span style="">5</span>,<span style="">7</span> @@ use Amon2::Web::Dispatcher::Lite;</span>
&nbsp;
 any '/' =&gt; sub <span style="">&#123;</span>
     my <span style="">&#40;</span>$c<span style="">&#41;</span> = @_;
<span style="color: #991111;">-    $c-&gt;render<span style="">&#40;</span>'index.tt'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+    $c-&gt;render<span style="">&#40;</span>'index.tx'<span style="">&#41;</span>;</span>
 <span style="">&#125;</span>;
&nbsp;
 <span style="">1</span>;</pre></div></div>

<h3>flavor</h3>
<p>毎回こういった変更を行うのもメンドイよね，と思ったら，「flavor」というしくみを利用すればよいみたいですね．</p>
<ul class="links">
<li><a href="http://d.hatena.ne.jp/ka2u/20110526/1306435775" title="Amon2の自分用Flavorを作る - Learn to Crawl">Amon2の自分用Flavorを作る &#8211; Learn to Crawl</a></li>
</ul>
<h3>おわりに</h3>
<p>以上，（デフォルトのflavorで）生成されたプロジェクトのビューのテンプレートで「Kolon」シンタックスを使えるようにしてみたお話でした．</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.iss.ms/2011/08/07/174053/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

