<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		<language>ja-jp</language>
		<title>アシアルブログ</title>
		<link>http://blog.asial.co.jp/</link>
		<description>アシアルブログ最新投稿</description>
		<pubDate>Tue, 09 Feb 2010 10:12:46 +0900</pubDate>
		<lastBuildDate>Tue, 09 Feb 2010 11:25:31 +0900</lastBuildDate>
		<managingEditor>info@asial.co.jp</managingEditor>
		<webMaster>info@asial.co.jp</webMaster>
		<copyright>Copyright  All rights reserved.</copyright>
				<item>
			<pubDate>Tue, 09 Feb 2010 10:12:46 +0900</pubDate>
			<title>【AS3】「ActionScript3の、こんなときどうするの？？」</title>
			<link>http://blog.asial.co.jp/660</link>
			<description><![CDATA[ こんにちは、橋本です。<br />
今日は、自分が普段AS3を書いていて「こんなときどうするの？？」と思ったところを中心にいくつか書いみました。<br />
思いついたものから書いていったので、内容はバラバラですが、お役に立てる内容が一つでもあれば幸いです。<br />
<br />
では、どうぞー。<br />
<br />
<br />
Q. イベントリスナーに引数を渡したい。<br />
<br />
A. 関数を返すイベントハンドラを指定することで、引数を渡すことができます。<br />
<br />
サンプル.<br />
<ol class="js-main"><li><span class="js-comment">//<wbr />&nbsp;イベントリスナを登録するときに、引数を渡す</span><span class="js-code"></span></li>
<li><span class="js-code"></span><span class="js-identifier">addEventListener</span><span class="js-brackets">(</span><span class="js-identifier">MouseEvent</span><span class="js-code">.</span><span class="js-identifier">CLICK</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-identifier">clickHandler</span><span class="js-brackets">(</span><span class="js-quotes">&quot;</span><span class="js-string">hoge</span><span class="js-quotes">&quot;</span><span class="js-brackets">))</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;</span></li>
<li><span class="js-code"></span><span class="js-reserved">private</span><span class="js-code"><wbr />&nbsp;</span><span class="js-reserved">function</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">clickHandler</span><span class="js-brackets">(</span><span class="js-identifier">str</span><span class="js-code">:</span><span class="js-builtin">String</span><span class="js-brackets">)</span><span class="js-code">:</span><span class="js-builtin">Function</span><span class="js-code"></span></li>
<li><span class="js-code"></span><span class="js-brackets">{</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-reserved">return</span><span class="js-code"><wbr />&nbsp;</span><span class="js-reserved">function</span><span class="js-code"><wbr />&nbsp;</span><span class="js-brackets">(</span><span class="js-identifier">event</span><span class="js-code">:</span><span class="js-identifier">MouseEvent</span><span class="js-brackets">)</span><span class="js-code">:</span><span class="js-reserved">void</span><span class="js-code"><wbr />&nbsp;</span><span class="js-brackets">{</span><span class="js-identifier">trace</span><span class="js-brackets">(</span><span class="js-identifier">str</span><span class="js-brackets">)}</span><span class="js-code">;</span></li>
<li><span class="js-code"></span><span class="js-brackets">}</span></li></ol><br />
Q. イベントの進行を止めたい。<br />
<br />
A. event.stopPropagation()を使います。現在処理されている対象で、イベントの伝達をストップすることができます。<br />
<br />
サンプル.<br />
<ol class="js-main"><li><span class="js-reserved">public</span><span class="js-code"><wbr />&nbsp;</span><span class="js-reserved">class</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">test</span><span class="js-code"><wbr />&nbsp;</span><span class="js-reserved">extends</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">Sprite</span><span class="js-code"></span></li>
<li><span class="js-code"></span><span class="js-brackets">{</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-reserved">public</span><span class="js-code"><wbr />&nbsp;</span><span class="js-reserved">function</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">test</span><span class="js-brackets">()</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-brackets">{</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-reserved">var</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">obj</span><span class="js-code">:</span><span class="js-identifier">Object</span><span class="js-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="js-brackets">{</span><span class="js-identifier">hoge</span><span class="js-code">:<wbr />&nbsp;</span><span class="js-quotes">&quot;</span><span class="js-string">hoge</span><span class="js-quotes">&quot;</span><span class="js-brackets">}</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-reserved">var</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">sprite</span><span class="js-code">:</span><span class="js-identifier">Sprite</span><span class="js-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="js-reserved">new</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">Sprite</span><span class="js-brackets">()</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">sprite</span><span class="js-code">.</span><span class="js-identifier">name</span><span class="js-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="js-quotes">&quot;</span><span class="js-string">parent</span><span class="js-quotes">&quot;</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-reserved">this</span><span class="js-code">.</span><span class="js-identifier">addChild</span><span class="js-brackets">(</span><span class="js-identifier">sprite</span><span class="js-brackets">)</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">sprite</span><span class="js-code">.</span><span class="js-identifier">graphics</span><span class="js-code">.</span><span class="js-identifier">beginFill</span><span class="js-brackets">(</span><span class="js-number">0</span><span class="js-identifier">xFFFF00</span><span class="js-brackets">)</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">sprite</span><span class="js-code">.</span><span class="js-identifier">graphics</span><span class="js-code">.</span><span class="js-identifier">drawRect</span><span class="js-brackets">(</span><span class="js-number">0</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-number">0</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-number">100</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-number">100</span><span class="js-brackets">)</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">sprite</span><span class="js-code">.</span><span class="js-identifier">addEventListener</span><span class="js-brackets">(</span><span class="js-identifier">MouseEvent</span><span class="js-code">.</span><span class="js-identifier">CLICK</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-identifier">clickHandler1</span><span class="js-brackets">)</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-reserved">var</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">sprite2</span><span class="js-code">:</span><span class="js-identifier">Sprite</span><span class="js-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="js-reserved">new</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">Sprite</span><span class="js-brackets">()</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">sprite2</span><span class="js-code">.</span><span class="js-identifier">name</span><span class="js-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="js-quotes">&quot;</span><span class="js-string">child</span><span class="js-quotes">&quot;</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">sprite</span><span class="js-code">.</span><span class="js-identifier">addChild</span><span class="js-brackets">(</span><span class="js-identifier">sprite2</span><span class="js-brackets">)</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">sprite2</span><span class="js-code">.</span><span class="js-identifier">graphics</span><span class="js-code">.</span><span class="js-identifier">beginFill</span><span class="js-brackets">(</span><span class="js-number">0</span><span class="js-identifier">x00FF00</span><span class="js-brackets">)</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">sprite2</span><span class="js-code">.</span><span class="js-identifier">graphics</span><span class="js-code">.</span><span class="js-identifier">drawRect</span><span class="js-brackets">(</span><span class="js-number">0</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-number">0</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-number">50</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-number">50</span><span class="js-brackets">)</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">sprite2</span><span class="js-code">.</span><span class="js-identifier">addEventListener</span><span class="js-brackets">(</span><span class="js-identifier">MouseEvent</span><span class="js-code">.</span><span class="js-identifier">CLICK</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-identifier">clickHandler2</span><span class="js-brackets">)</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-brackets">}</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-reserved">private</span><span class="js-code"><wbr />&nbsp;</span><span class="js-reserved">function</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">clickHandler1</span><span class="js-brackets">(</span><span class="js-identifier">event</span><span class="js-code">:</span><span class="js-identifier">MouseEvent</span><span class="js-brackets">)</span><span class="js-code">:</span><span class="js-reserved">void</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-brackets">{</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">trace</span><span class="js-brackets">(</span><span class="js-quotes">&quot;</span><span class="js-string">parent</span><span class="js-quotes">&quot;</span><span class="js-brackets">)</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-brackets">}</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-reserved">private</span><span class="js-code"><wbr />&nbsp;</span><span class="js-reserved">function</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">clickHandler2</span><span class="js-brackets">(</span><span class="js-identifier">event</span><span class="js-code">:</span><span class="js-identifier">MouseEvent</span><span class="js-brackets">)</span><span class="js-code">:</span><span class="js-reserved">void</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-brackets">{</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">trace</span><span class="js-brackets">(</span><span class="js-quotes">&quot;</span><span class="js-string">child</span><span class="js-quotes">&quot;</span><span class="js-brackets">)</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">event</span><span class="js-code">.</span><span class="js-identifier">stopPropagation</span><span class="js-brackets">()</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-brackets">}</span><span class="js-code"></span></li>
<li><span class="js-code"></span><span class="js-brackets">}</span></li></ol><br />
Q. イベントの、currentTargetとtargetの違いが、実はよくわかりません。<br />
<br />
A. 大丈夫です。僕は最初はよくわかっていませんでしたｗ<br />
currentTargetは、イベントを受け取ったオブジェクトで、targetはイベントを発生させたオブジェクトです。<br />
以下のサンプルで、親のボックスをクリックしたときには、両方とも"parent"と表示されますが、子のボックスをクリックしたときには、targetが"child"となり、currentTargetが"parent"となります。これは、子のボックスをクリックしたことで発生したイベントを、親のボックスで受け取っているからです。<br />
<br />
サンプル.<br />
<ol class="js-main"><li><span class="js-reserved">public</span><span class="js-code"><wbr />&nbsp;</span><span class="js-reserved">class</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">test</span><span class="js-code"><wbr />&nbsp;</span><span class="js-reserved">extends</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">Sprite</span><span class="js-code"></span></li>
<li><span class="js-code"></span><span class="js-brackets">{</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-reserved">public</span><span class="js-code"><wbr />&nbsp;</span><span class="js-reserved">function</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">test</span><span class="js-brackets">()</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-brackets">{</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-reserved">var</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">obj</span><span class="js-code">:</span><span class="js-identifier">Object</span><span class="js-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="js-brackets">{</span><span class="js-identifier">hoge</span><span class="js-code">:<wbr />&nbsp;</span><span class="js-quotes">&quot;</span><span class="js-string">hoge</span><span class="js-quotes">&quot;</span><span class="js-brackets">}</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-reserved">var</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">sprite</span><span class="js-code">:</span><span class="js-identifier">Sprite</span><span class="js-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="js-reserved">new</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">Sprite</span><span class="js-brackets">()</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">sprite</span><span class="js-code">.</span><span class="js-identifier">name</span><span class="js-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="js-quotes">&quot;</span><span class="js-string">parent</span><span class="js-quotes">&quot;</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-reserved">this</span><span class="js-code">.</span><span class="js-identifier">addChild</span><span class="js-brackets">(</span><span class="js-identifier">sprite</span><span class="js-brackets">)</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">sprite</span><span class="js-code">.</span><span class="js-identifier">graphics</span><span class="js-code">.</span><span class="js-identifier">beginFill</span><span class="js-brackets">(</span><span class="js-number">0</span><span class="js-identifier">xFFFF00</span><span class="js-brackets">)</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">sprite</span><span class="js-code">.</span><span class="js-identifier">graphics</span><span class="js-code">.</span><span class="js-identifier">drawRect</span><span class="js-brackets">(</span><span class="js-number">0</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-number">0</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-number">100</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-number">100</span><span class="js-brackets">)</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">sprite</span><span class="js-code">.</span><span class="js-identifier">addEventListener</span><span class="js-brackets">(</span><span class="js-identifier">MouseEvent</span><span class="js-code">.</span><span class="js-identifier">CLICK</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-identifier">clickHandler1</span><span class="js-brackets">)</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-reserved">var</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">sprite2</span><span class="js-code">:</span><span class="js-identifier">Sprite</span><span class="js-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="js-reserved">new</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">Sprite</span><span class="js-brackets">()</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">sprite2</span><span class="js-code">.</span><span class="js-identifier">name</span><span class="js-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="js-quotes">&quot;</span><span class="js-string">child</span><span class="js-quotes">&quot;</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">sprite</span><span class="js-code">.</span><span class="js-identifier">addChild</span><span class="js-brackets">(</span><span class="js-identifier">sprite2</span><span class="js-brackets">)</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">sprite2</span><span class="js-code">.</span><span class="js-identifier">graphics</span><span class="js-code">.</span><span class="js-identifier">beginFill</span><span class="js-brackets">(</span><span class="js-number">0</span><span class="js-identifier">x00FF00</span><span class="js-brackets">)</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">sprite2</span><span class="js-code">.</span><span class="js-identifier">graphics</span><span class="js-code">.</span><span class="js-identifier">drawRect</span><span class="js-brackets">(</span><span class="js-number">0</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-number">0</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-number">50</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-number">50</span><span class="js-brackets">)</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-brackets">}</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-reserved">private</span><span class="js-code"><wbr />&nbsp;</span><span class="js-reserved">function</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">clickHandler1</span><span class="js-brackets">(</span><span class="js-identifier">event</span><span class="js-code">:</span><span class="js-identifier">MouseEvent</span><span class="js-brackets">)</span><span class="js-code">:</span><span class="js-reserved">void</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-brackets">{</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">trace</span><span class="js-brackets">(</span><span class="js-quotes">&quot;</span><span class="js-string">currentTarget:</span><span class="js-quotes">&quot;</span><span class="js-code"><wbr />&nbsp;+<wbr />&nbsp;</span><span class="js-identifier">event</span><span class="js-code">.</span><span class="js-identifier">currentTarget</span><span class="js-code">.</span><span class="js-identifier">name</span><span class="js-code"><wbr />&nbsp;+<wbr />&nbsp;</span><span class="js-quotes">&quot;</span><span class="js-string">,<wbr />&nbsp;target:</span><span class="js-quotes">&quot;</span><span class="js-code"><wbr />&nbsp;+<wbr />&nbsp;</span><span class="js-identifier">event</span><span class="js-code">.</span><span class="js-identifier">target</span><span class="js-code">.</span><span class="js-identifier">name</span><span class="js-brackets">)</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-brackets">}</span><span class="js-code"></span></li>
<li><span class="js-code"></span><span class="js-brackets">}</span></li></ol><br />
Q. オブジェクトのクラス名を知りたい。<br />
<br />
A. flash.utils.getQualifiedClassNameメソッドを使うと、フルパスのクラス名を取得できます。純粋にクラス名だけを取りたいときには正規表現を使ったりしてみてくだしい。<br />
<br />
サンプル.<br />
<ol class="js-main"><li><span class="js-reserved">var</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">sprite</span><span class="js-code">:</span><span class="js-identifier">Sprite</span><span class="js-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="js-reserved">new</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">Sprite</span><span class="js-brackets">()</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;</span></li>
<li><span class="js-code"></span><span class="js-identifier">trace</span><span class="js-brackets">(</span><span class="js-identifier">getQualifiedClassName</span><span class="js-brackets">(</span><span class="js-identifier">sprite</span><span class="js-brackets">))</span><span class="js-code">;<wbr />&nbsp;</span><span class="js-comment">//　flash.display::Sprite</span><span class="js-code"></span></li>
<li><span class="js-code"></span><span class="js-identifier">trace</span><span class="js-brackets">(</span><span class="js-identifier">getQualifiedClassName</span><span class="js-brackets">(</span><span class="js-identifier">sprite</span><span class="js-brackets">)</span><span class="js-code">.</span><span class="js-identifier">match</span><span class="js-brackets">(</span><span class="js-quotes">/</span><span class="js-string">::(.*)</span><span class="js-quotes">/</span><span class="js-brackets">)[</span><span class="js-number">1</span><span class="js-brackets">])</span><span class="js-code">;<wbr />&nbsp;</span><span class="js-comment">//<wbr />&nbsp;Sprite</span></li></ol><br />
Q. 配列にオブジェクトが含まれているか知りたい（PHPでいうところの、in_array）。<br />
<br />
A. indexOfメソッドを使います。配列に含まれている場合には、インデックスを返し、無い場合には"-1"を返してくれるので、そこで判定します。<br />
<br />
サンプル.<br />
<ol class="js-main"><li><span class="js-reserved">public</span><span class="js-code"><wbr />&nbsp;</span><span class="js-reserved">static</span><span class="js-code"><wbr />&nbsp;</span><span class="js-reserved">function</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">inArray</span><span class="js-brackets">(</span><span class="js-identifier">item</span><span class="js-code">:*,<wbr />&nbsp;</span><span class="js-identifier">arr</span><span class="js-code">:</span><span class="js-builtin">Array</span><span class="js-brackets">)</span><span class="js-code">:</span><span class="js-identifier">Boolean</span><span class="js-code"></span></li>
<li><span class="js-code"></span><span class="js-brackets">{</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-reserved">return</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">arr</span><span class="js-code">.</span><span class="js-identifier">indexOf</span><span class="js-brackets">(</span><span class="js-identifier">item</span><span class="js-brackets">)</span><span class="js-code"><wbr />&nbsp;!=<wbr />&nbsp;-</span><span class="js-number">1</span><span class="js-code">;</span></li>
<li><span class="js-code"></span><span class="js-brackets">}</span></li></ol><br />
Q. 配列のコピーが欲しい。<br />
<br />
A. Arrayの中身をfor文で回して…というのは嘘で、Array.concat()もしくは、Array.slice()を引数無しで呼び出すことで作成可能です。<br />
<br />
サンプル.<br />
<ol class="js-main"><li><span class="js-reserved">var</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">arr</span><span class="js-code">:</span><span class="js-builtin">Array</span><span class="js-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="js-brackets">[</span><span class="js-number">1</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-number">2</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-number">3</span><span class="js-brackets">]</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;</span></li>
<li><span class="js-code"></span><span class="js-reserved">var</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">arr2</span><span class="js-code">:</span><span class="js-builtin">Array</span><span class="js-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="js-identifier">arr</span><span class="js-code">.</span><span class="js-identifier">concat</span><span class="js-brackets">()</span><span class="js-code">;</span></li>
<li><span class="js-code"><wbr />&nbsp;</span></li>
<li><span class="js-code"></span><span class="js-reserved">for</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">each</span><span class="js-code"><wbr />&nbsp;</span><span class="js-brackets">(</span><span class="js-reserved">var</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">num</span><span class="js-code">:</span><span class="js-builtin">Number</span><span class="js-code"><wbr />&nbsp;</span><span class="js-reserved">in</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">arr2</span><span class="js-brackets">)</span><span class="js-code"></span></li>
<li><span class="js-code"></span><span class="js-brackets">{</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">trace</span><span class="js-brackets">(</span><span class="js-identifier">num</span><span class="js-brackets">)</span><span class="js-code">;</span></li>
<li><span class="js-code"></span><span class="js-brackets">}</span></li></ol><br />
Q. オブジェクトディープコピーが欲しい。<br />
<br />
A. ByteArrayクラスのインスタンスを作成することでディープコピーが可能になるようです。（参考:<a href='http://help.adobe.com/ja_JP/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee7.html'>http://help.adobe.com/ja_JP/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ee7.html</a>）リンク先にもありますが、一応cloneメソッドのサンプルを載せておきます。<br />
<br />
サンプル.<br />
<ol class="js-main"><li><span class="js-reserved">import</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">flash</span><span class="js-code">.</span><span class="js-identifier">utils</span><span class="js-code">.</span><span class="js-identifier">ByteArray</span><span class="js-code">;<wbr />&nbsp;</span></li>
<li><span class="js-code"><wbr />&nbsp;</span></li>
<li><span class="js-code"></span><span class="js-reserved">function</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">clone</span><span class="js-brackets">(</span><span class="js-identifier">source</span><span class="js-code">:</span><span class="js-identifier">Object</span><span class="js-brackets">)</span><span class="js-code">:*<wbr />&nbsp;</span></li>
<li><span class="js-code"></span><span class="js-brackets">{</span><span class="js-code"><wbr />&nbsp;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-reserved">var</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">myBA</span><span class="js-code">:</span><span class="js-identifier">ByteArray</span><span class="js-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="js-reserved">new</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">ByteArray</span><span class="js-brackets">()</span><span class="js-code">;<wbr />&nbsp;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">myBA</span><span class="js-code">.</span><span class="js-identifier">writeObject</span><span class="js-brackets">(</span><span class="js-identifier">source</span><span class="js-brackets">)</span><span class="js-code">;<wbr />&nbsp;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">myBA</span><span class="js-code">.</span><span class="js-identifier">position</span><span class="js-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="js-number">0</span><span class="js-code">;<wbr />&nbsp;</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-reserved">return</span><span class="js-brackets">(</span><span class="js-identifier">myBA</span><span class="js-code">.</span><span class="js-identifier">readObject</span><span class="js-brackets">())</span><span class="js-code">;<wbr />&nbsp;</span></li>
<li><span class="js-code"></span><span class="js-brackets">}</span></li></ol><br />
どうでしょうか。<br />
お役に立てることがひとつでもあれば幸いです。 ]]></description>
			<author>橋本章史</author>
			<category>Tech</category>
			<guid isPermaLink="true">http://blog.asial.co.jp/660</guid>
		</item>
				<item>
			<pubDate>Fri, 05 Feb 2010 16:08:42 +0900</pubDate>
			<title>Twitter-APIを使ってみました</title>
			<link>http://blog.asial.co.jp/659</link>
			<description><![CDATA[ こんにちは、中川です。<br />
<br />
今週の<a href="http://www.phppro.jp/">PHPプロ</a>のメルマガで、<br />
<ol class="boxcode-main no-number"><li>「現在発売中の日経ソフトウエア2010年3月号に記事を書きました！Web<wbr />&nbsp;APIに</li><li>ついての特集で、今はやりのTwitterと、Google<wbr />&nbsp;ChartのAPIを活用したPHPの</li><li>アプリケーションを作成する内容になっています。ぜひ読んでみてください。</li><li>皆さまのご意見やご感想をお待ちしています！<wbr />&nbsp;」By<wbr />&nbsp;Katsuhiro<wbr />&nbsp;Ogawa</li></ol>こんな序文を見つけました。<br />
<br />
ブログネタに困っていた時だったのもあり、<br />
また、現在担当しているプロジェクトで使うかもしれないということで、<br />
TwitterのAPIをちょっと触ってみました。<br />
<br />
まずは、APIの仕様について。<br />
<br />
<a href='http://apiwiki.twitter.com/'>http://apiwiki.twitter.com/</a><br />
<br />
ここで、原文で確認できるようです。<br />
<br />
日本語に翻訳している方がいるようです。ありがたいですね。<br />
<a href='http://watcher.moe-nifty.com/memo/2007/04/twitter_api.html'>http://watcher.moe-nifty.com/memo/2007/04/twitter_api.html</a><br />
※更新されているのか不明です。<br />
<br />
それでは、深く調べたりする前にとりあえずさわることにします。<br />
今回は、さくっと試してみたい程度ですので、認証などが一切必要ない、<br />
public timelineの検索APIを試してみます。<br />
<br />
といいましても、検索APIは至って簡単に呼び出しが行えるようですね。<br />
<br />
<a href='http://search.twitter.com/search.json?q=asial'>http://search.twitter.com/search.json?q=asial</a><br />
<br />
これで、json形式で、キーワードにasialを含むつぶやきが取得できます。<br />
<br />
RSS形式だと、以下のように取得できるんですね！<br />
<a href='http://search.twitter.com/search.rss?q=asial'>http://search.twitter.com/search.rss?q=asial</a><br />
<br />
今回はサーバ側のコードも必要ないように、<br />
JavaScriptのみで利用したいと思いますので、<br />
JSONP形式で返却してもらうように呼び出しを以下のようにしてみました。<br />
<br />
<ol class="html-main"><li><span class="html-brackets">&lt;</span><span class="html-reserved">script</span><span class="html-code"><wbr />&nbsp;</span><span class="html-var">type</span><span class="html-code">=</span><span class="html-quotes">&quot;</span><span class="html-string">text/javascript</span><span class="html-quotes">&quot;</span><span class="html-code"><wbr />&nbsp;</span><span class="html-var">src</span><span class="html-code">=</span><span class="html-quotes">&quot;</span><span class="html-string">http://search.twitter.com/search.json?q=asial&amp;rpp=100&amp;callback=myfunc</span><span class="html-quotes">&quot;</span><span class="html-brackets">&gt;&lt;/</span><span class="html-reserved">script</span><span class="html-brackets">&gt;</span></li></ol><br />
・rppで「発言」の数を指定する。<br />
・callbackでコールバック関数名を指定する<br />
<br />
これで、このscriptタグを書くより前に、myfunc関数を定義しておけば返却結果のjsonを引数に与えて実行してくれます。<br />
<br />
実際に返却されるjsonは以下のような形式のようです。※実際には改行されていません。<br />
<br />
<ol class="js-main"><li><span class="js-identifier">results</span><span class="js-code">:<wbr />&nbsp;</span><span class="js-brackets">[</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-brackets">{</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="js-identifier">profile_image_url</span><span class="js-code">:<wbr />&nbsp;</span><span class="js-identifier">http</span><span class="js-code">:</span><span class="js-comment">//a3.twimg.com/profile_images/638624053/___2009-12-16_20.32__normal.jpg<wbr />&nbsp;(string)</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;,</span><span class="js-identifier">created_at</span><span class="js-code">:<wbr />&nbsp;</span><span class="js-identifier">Thu</span><span class="js-code">,<wbr />&nbsp;</span><span class="js-number">28</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">Jan</span><span class="js-code"><wbr />&nbsp;</span><span class="js-number">2010</span><span class="js-code"><wbr />&nbsp;</span><span class="js-number">08</span><span class="js-code">:</span><span class="js-number">29</span><span class="js-code">:</span><span class="js-number">07</span><span class="js-code"><wbr />&nbsp;+</span><span class="js-number">0000</span><span class="js-code"><wbr />&nbsp;</span><span class="js-brackets">(</span><span class="js-identifier">string</span><span class="js-brackets">)</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;,</span><span class="js-identifier">from_user</span><span class="js-code">:<wbr />&nbsp;</span><span class="js-identifier">_mozk</span><span class="js-code"><wbr />&nbsp;</span><span class="js-brackets">(</span><span class="js-identifier">string</span><span class="js-brackets">)</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;,</span><span class="js-identifier">to_user_id</span><span class="js-code">:<wbr />&nbsp;</span><span class="js-reserved">null</span><span class="js-code"><wbr />&nbsp;</span><span class="js-brackets">(</span><span class="js-identifier">object</span><span class="js-brackets">)</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;,</span><span class="js-identifier">text</span><span class="js-code">:<wbr />&nbsp;</span><span class="js-identifier">http</span><span class="js-code">:</span><span class="js-comment">//blog.asial.co.jp/540<wbr />&nbsp;(string)</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;,</span><span class="js-identifier">id</span><span class="js-code">:<wbr />&nbsp;</span><span class="js-number">8315548004</span><span class="js-code"><wbr />&nbsp;</span><span class="js-brackets">(</span><span class="js-identifier">number</span><span class="js-brackets">)</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;,</span><span class="js-identifier">from_user_id</span><span class="js-code">:<wbr />&nbsp;</span><span class="js-number">362873</span><span class="js-code"><wbr />&nbsp;</span><span class="js-brackets">(</span><span class="js-identifier">number</span><span class="js-brackets">)</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;,</span><span class="js-identifier">geo</span><span class="js-code">:<wbr />&nbsp;</span><span class="js-reserved">null</span><span class="js-code"><wbr />&nbsp;</span><span class="js-brackets">(</span><span class="js-identifier">object</span><span class="js-brackets">)</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;,</span><span class="js-identifier">source</span><span class="js-code">:<wbr />&nbsp;&amp;</span><span class="js-identifier">amp</span><span class="js-code">;</span><span class="js-identifier">lt</span><span class="js-code">;</span><span class="js-identifier">a</span><span class="js-code"><wbr />&nbsp;</span><span class="js-identifier">href</span><span class="js-code">=&amp;</span><span class="js-identifier">amp</span><span class="js-code">;</span><span class="js-identifier">quot</span><span class="js-code">;</span><span class="js-identifier">http</span><span class="js-code">:</span><span class="js-comment">//twitter.com/&amp;amp;quot;&amp;amp;gt;web&amp;amp;lt;/a&amp;amp;gt;<wbr />&nbsp;(string)</span><span class="js-code"></span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="js-brackets">}</span><span class="js-code">,</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;・</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;・</span></li>
<li><span class="js-code"><wbr />&nbsp;<wbr />&nbsp;・</span></li></ol><br />
JSから扱いやすい、非常に親切な結果を返してくれるようですね。<br />
<br />
これだけで、あっさりtwitterのデータを引っ張ってこれました。<br />
<br />
実際に見た目をきれいに整えたのが、以下になります。<br />
<br />
<iframe width="300" height="350" frameborder="0" src="http://blog.asial.co.jp/sample/659/twitter.html"><br />
</iframe><br />
<br />
※ソースは、IFRAME内のソースを表示で確認できます。<br />
<br />
Twitter-APIを使う上で注意しなければならないのが、利用回数制限があることです。<br />
APIの呼び出しは、IPアドレス単位で、1時間に150回程度の用です。<br />
今回はJavaScriptで呼び出しているので、クライアントのIP単位になるのでしょうから、<br />
制限は問題なさそうですが、サーバ側からAPIを呼び出す場合は、キャッシュなどの注意が必要そうですね。<br />
尚、この回数制限の状況も、APIから取得・確認できるようです。<br />
<br />
<a href='http://twitter.com/account/rate_limit_status.xml'>http://twitter.com/account/rate_limit_status.xml</a><br />
<br />
非常に親切ですね！！<br />
<br />
と、このようにTwitterはAPIが充実しているのもすごいのですが、<br />
非常に簡単に使い始められるのも魅力ですね。<br />
自身のサイトなどのAPI設計にも非常に参考になりました。<br />
<br />
また、ネット上に情報も多いので、是非みなさんもいろいろ試してみてください。 ]]></description>
			<author>中川善樹</author>
			<category>Tech</category>
			<guid isPermaLink="true">http://blog.asial.co.jp/659</guid>
		</item>
				<item>
			<pubDate>Thu, 04 Feb 2010 23:03:47 +0900</pubDate>
			<title>PHPの名前空間と主要フレームワークの対応について</title>
			<link>http://blog.asial.co.jp/658</link>
			<description><![CDATA[ こんにちは、小川です。<br />
<br />
以前、「モダンPHP勉強会」でPHP 5.3から採用された名前空間について話したことがあるのですが、今日はその時の内容の中から、主要フレームワークの名前空間の対応に関するお話しについてご紹介したいと思います。<br />
<br />
さて、皆さんPHP 5.3はお使いになりましたか？まだまだ少ないのではないかと思うのですが、PHP 5.3にはとても魅力的な新機能がたくさんあります。以前、「<a href="http://blog.asial.co.jp/583">PHP5.3.0がついにリリース</a>」という記事を書きましたので、PHP 5.3の新機能についてはぜひこちらをご覧ください。<br />
<br />
PHP 5.3の新機能の中でも目玉と言っていいのが名前空間です。先に挙げたモダンPHP勉強会で、「<a href="http://prezi.com/0-vyhjdkslih/">もっと知りたい名前空間</a>」というテーマで発表を行いました。細かい仕組みについてはプレゼンの中で解説しますので置いておくとして、早速主要フレームワークの対応などをご紹介していきたいと思います。<br />
<br />
◆PHP Standards Working Group<br />
<br />
ひとまず安心していただきたいことは、名前空間の利用に関して、きちんと標準を制定しようとがんばっている人たちがいるということです。<br />
現在<a href="http://groups.google.com/group/php-standards/web/php-coding-standard">PHP Standards Working Group</a>というGoogleグループにて、主要フレームワークの作者たちが標準の制定のためのディスカッションをしています。<br />
<br />
<a href="http://www.symfony-project.org/">symfony</a>や<a href="http://www.doctrine-project.org/">Doctrine</a>、<a href="http://cakephp.org/">CakePHP</a>、<a href="http://rad-dev.org/lithium">Lithium</a>、<a href="http://framework.zend.com/">Zend Framework</a>、<a href="http://solarphp.com/">Solar</a>といったメジャーなフレームワークのコアデベロッパーなどなど、そうそうたるメンバーによってディスカッションされており、すなわちこの内容が主要フレームワークにも適応されると言うことになります。<br />
<br />
現状すでに名前空間に関する規約の制定は一段落しています。<a href="http://groups.google.com/group/php-standards/web/php-coding-standard">Coding standard for PHP 5.3 and above</a>というページに制定済みの一通りの内容が書いています。<br />
<br />
ここでは、<br />
・名前空間<br />
・クラス名<br />
・例外<br />
の3つに関する規約が制定されています。ではそれぞれご紹介していきます。<br />
<br />
<br />
◆名前空間に関する規約<br />
<br />
名前空間の形式:<br />
<ol class="boxcode-main no-number"><li>&lt;vendor&gt;\&lt;package_or_component&gt;\&lt;ClassName&gt;</li></ol><br />
例:<br />
　pear2\text_diff\Diff<br />
　zend\controller\FrontController<br />
<br />
・名前空間は常に小文字+アンダースコア<br />
・トップレベル名前空間にはベンダー名が入る<br />
　・ベンダー名は最短の名称(Zend Framework => zend, CakePHP => cake, symfony => symfony)<br />
・サブ名前空間はいくつ定義してもよい<br />
・名前空間セパレータはディレクトリセパレータに相当する<br />
・名前空間中のアンダースコアに特別な意味はない<br />
<br />
まず、名前空間は小文字とアンダースコアで定義します。現状のPEARの規約に慣れ親しんだ方や、PerlやRubyなどをお使いの方には、アッパーキャメルケース(InvalidArgumentExceptionのように単語の先頭を大文字にする形式)でないことに違和感を感じるかもしれません。<br />
これは、名前空間とクラス名を明確に分けるためだと思われます。例えば、use Foo\Bar;のようにインポートした場合、Barが名前空間なのかクラスなのかそれだけを見て判断することは難しいでしょう。名前空間を小文字にすることにより、可読性は上がると思われます。<br />
<br />
名前空間の区切り文字(\)はディレクトリセパレータに相当しますので、例えばhttp\Requestの場合はhttpというディレクトリのRequest.phpを指す、ということになります。<br />
<br />
<br />
◆クラス名に関する規約<br />
<br />
・クラス名はアッパーキャメルケース<br />
・クラス名にはアンダースコアを含めても良い<br />
　・クラス名中のアンダースコアはディレクトリセパレータに相当する<br />
・インターフェースにはInterfaceサフィックスをつける<br />
・抽象クラスにはAbstractサフィックスをつける<br />
<br />
クラス名に関しては、現状のPEARと同様にアッパーキャメルケースで記述します。また、名前空間中のアンダースコアに特別な意味はない(ディレクトリセパレータでもなんでもない)とありますが、クラス名中のディレクトリセパレータは現状のPEARと同様にディレクトリセパレータに相当します。これは現状の命名との互換性を保つためのルールでしょう。<br />
<br />
<br />
◆例外に関する規約<br />
<br />
・全てのパッケージにはパッケージレベルの例外を定義する(例: pear2\text_diff\Exception)<br />
・パッケージレベルの例外はクラスでもインターフェイスでもよい<br />
・パッケージから投げられる例外は、SPL例外もしくはパッケージレベルの例外を継承もしくは実装した例外を使う<br />
<br />
例外については細かく言及されていないので少し自信がないのですが、大体上記のようなルールだと思います。<br />
とりあえず<a href="http://jp.php.net/manual/ja/spl.exceptions.php">SPL例外</a>で足りるところはSPL例外を、それ以外で必要ならばパッケージレベルの例外を、という感じでいいのではないでしょうか。<br />
<br />
<br />
以上がPHP Standards Working Groupにて定義されている内容です。<br />
実際に各種フレームワークの対応として、LithiumやZend Frameworkはこの規約に準拠するでしょう。Lithiumは現在独自の例外の定義はしていないようですが、名前空間の使い方などはこの通りになっています。<br />
ただし、このルールから外れるフレームワークがあります。SymfonyとDoctrineです。この2に関しては、名前空間もアッパーキャメルケースとしています。これは、Doctrineが名前空間をアッパーキャメルケースにして開発が行われており、それがこのグループの制定前から開始されていたためではないかと思われます。それこそ名前空間のセパレータが\になる前から開発が進められていたと記憶していますので、仕方がないのかなと思います。<br />
<br />
今後、PHP 5.3で名前空間を採用したコードを書く際は、上記の規約に沿って作っていくとよいかと思われます。<br />
まだ名前空間になれていない方も多いと思いますが、実際に使っていくうちにすぐなれるのではないかと思います。<br />
<br />
名前空間を使えば、長ったらしい名前を毎回タイピングする必要もなくなりますし、名前の衝突を恐れることもなくなるでしょう。<br />
主要フレームワークやPEARの次期バージョンでは名前空間を採用することになりますので、機会があればその時に色々と使ってみるとよいかと思います。 ]]></description>
			<author>小川雄大</author>
			<category>Tech</category>
			<guid isPermaLink="true">http://blog.asial.co.jp/658</guid>
		</item>
				<item>
			<pubDate>Mon, 01 Feb 2010 22:09:34 +0900</pubDate>
			<title>HDDのフォーマットには時間がかかるんです</title>
			<link>http://blog.asial.co.jp/657</link>
			<description><![CDATA[ こんばんは岡本です。<br />
外では久しぶりに本格的な雪がふっております。<br />
電車が止まらなければいいのですが・・・<br />
<br />
最近、日常記事が少ないとのお声を頂いたため、<br />
とある休日の日常のお話。<br />
地元のワイン専門店さんに、NASの導入をしに行った時の、<br />
ごくごくありふれた平和な休日のお話を書きつづりたいと思います。<br />
<br />
導入を行いました！と言いましても、<br />
ビックカメラでNASとバルク売りのハードディスクを購入し、<br />
後は本能に従って、設定を施すだけなのですが、今回は珍しく凡ミスを連発したので、<br />
自戒の意味を込めてここに注意事項を列挙したいと思います。<br />
<br />
<br />
１．ハードディスクをパソコン本体に固定するネジを切らしてしまった。<br />
２．同じく、ハードディスクを接続するためのケーブル（シリアルATA）も切らしてしまった。<br />
→昔はネジやケーブルなんて自宅に売るほど転がっていたのですが、<br />
ノートパソコンを使うようになってから部品をあまり持たないようになっていたのです。<br />
<br />
３．パソコンケース内のシリアルATA用の電源ケーブルを使いきっていた。<br />
→シリアルATAが出始めのころのケースは旧式の給電ケーブルも備えているため、<br />
各ケーブルの本数が相対的に少ない。<br />
<br />
４．HDDの初期化(フォーマット)には時間が掛かることを忘れて貴重な休日を浪費<br />
飯も食べた後だったので、特にすることもなく本を読んでいた休日の昼下がり。<br />
<br />
<br />
と、まぁ、若干のトラブルはあったものの、<br />
導入したNASにはとても満足頂け、システム屋冥利に尽きる形となりました。<br />
（プログラムは一行も書いていないけれど）<br />
曰く、イラストレータのファイルや画像がすぐに開く。<br />
今までwindowsの共有機能で作業したのがNASになって快適。<br />
とのことです。<br />
<br />
予算をケチって1世代前のNASを買わなくて良かったです。<br />
お客さんの満足度とシステムの速さは比例関係にあります。<br />
自分用なら納得ずくで不便とお友達になることもありますが、<br />
他の人に勧めるものは、自分の納得基準より少し良いものを勧めることにしています。<br />
<br />
<br />
●導入したNAS<br />
バッファロー <a href="http://buffalo.jp/products/catalog/storage/ls-xhl/">LS-XHLシリーズ</a> 1TB<br />
<br />
最大66MB/s でとても高速です。<br />
理論上、CD1枚分のデータを10秒程度で転送できます。<br />
この速さだと、動画ファイルを置いても快適に再生できます。<br />
<br />
<br />
●バックアップの設定<br />
NASにデータを置いておくだけですと、<br />
故障した場合に業務に支障をきたすためバックアップ体制も構築しました。<br />
と、いっても、NASにお金を掛けたのでバックアップは半分人力です。<br />
ごめんなさい、さっそく不便を押しつけました。<br />
<br />
<a href="http://www.vector.co.jp/soft/win95/util/se061150.html">RealSync</a>というwindows用の無料のデータ同期ソフトで、<br />
定期的にNASのデータをパソコンに丸ごとコピーして対処して頂く事にしました。<br />
更新されたファイルだけを転送するので高速です。<br />
<br />
<br />
●余談<br />
NASの設定が終わった後に、今年はtwitterが本格的に流行するから、今のうちにやりましょう。<br />
と、話を持ちかけてtwitterを始めて貰いました。<br />
商売をされている方は流行に敏感です。<br />
<br />
アシアルがtwitterを始めたら、誰かみてくれるかなぁ。 ]]></description>
			<author>岡本雄樹</author>
			<category>日常</category>
			<guid isPermaLink="true">http://blog.asial.co.jp/657</guid>
		</item>
				<item>
			<pubDate>Tue, 26 Jan 2010 17:11:23 +0900</pubDate>
			<title>GoogleChrome に Firebug extension をいれてみた + よさげなextensionまとめ</title>
			<link>http://blog.asial.co.jp/656</link>
			<description><![CDATA[ こんにちは。松田です。<br />
システムの開発時にはFirefox+Firebugが欠かせなくなっていますが、最近Firefoxがクラッシュしまくる現象に悩まされてます。セーフモードで起動しようがFirefox自体インストールし直そうが、ちょっと使っているとすぐにクラッシュ。<br />
いい加減Firefoxに愛想がつきてきた・・・けどFirebug無いと開発できない。ChromeとかでFirebugっぽいこと出来ないかなぁ・・・、と検索してみたらFirebug Liteエクステンションなるものを発見。さっそく入れてみました。<br />
<br />
というかエクステンション機能自体出ていたことを知りませんでした。<br />
いつのまに・・・。<br />
<br />
<br />
<strong>まずはGoogleChromeのインストール</strong><br />
<s><br />
通常のGoogleChromeではエクステンションに対応していないので、エクステンションに対応したdev版のGoogleChromeをインストールする必要があります。<br />
</s><br />
通常版のGoogleChromeでもエクステンションに対応したようです。<br />
<a href='http://www.google.com/chrome/eula.html?extra=devchannel'>http://www.google.com/chrome/eula.html?extra=devchannel</a><br />
<br />
<strong>次にFirebugのインストール</strong><br />
<a href='https://chrome.google.com/extensions/detail/bnbbfjbeaefgipfjpdabmpadaacmafkj'>https://chrome.google.com/extensions/detail/bnbbfjbeaefgipfjpdabmpadaacmafkj</a><br />
上記リンクの「インストールボタン」を押せば数秒で登録完了です。<br />
簡単でいいですね。Chromeエクステンションのインストールの場合、ブラウザを再起動させる必要もないようです。<br />
<br />
これでURL入力欄の右側にボタンが追加されます。<br />
通常のプラグインはここのボタンを押せばだいたい何かしら動作します。<br />
さっそくクリッククリック。<br />
<br />
<a href="/read_file.php?id=1013&mode=1" rel="lightbox" class="link-lightbox"><img src="http://blog.asial.co.jp/read_file.php?id=1013" /></a><br />
あれ・・・何も起きない・・・？<br />
<br />
<br />
<strong>何もおきないよ？</strong><br />
サイト内の説明を読むかぎりでは、インストール直後はページをリフレッシュしないとみれない、なおかつ、Google Chrome Extensionのサイト内では使用できないもよう。<br />
上記に当てはまらないのにダメな場合は、以下のリンクをブックマークのツールバーにドラッグしてブックマークレットを作ってみてください。<br />
<br />
↓このリンクをドラッグ！<br />
<a href="javascript:var firebug=document.createElement('script');firebug.setAttribute('src','http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js');document.body.appendChild(firebug);(function(){if(window.firebug.version){firebug.init();}else{setTimeout(arguments.callee);}})();void(firebug);">Firebug Lite</a><br />
<a href="/read_file.php?id=1015&mode=1" rel="lightbox" class="link-lightbox"><img src="http://blog.asial.co.jp/read_file.php?id=1015" /></a><br />
ブックマークレット完成<br />
<br />
アイコンをクリックしても何も起きない場合でも、このブックマークレットからだと何故か起動してくれることが多いです。謎です。<br />
これでうまくいけば無事Firebugが立ち上がります。<br />
<br />
とうとうChromeにFirebugが・・・。<br />
<a href="/read_file.php?id=1011&mode=1" rel="lightbox" class="link-lightbox"><img src="http://blog.asial.co.jp/read_file.php?id=1011" /></a><br />
あ、あれ？<br />
なんか足りない。<br />
一番使いたかった「接続」タブが無いっ。なんてこったい！<br />
この辺がLiteたる所以なのかっ。<br />
<br />
ちょろっと使ってみた感じでは、Inspectorは普通に使えます。<br />
ただ、そこからの要素の書き換えはまだ出来ないようです。<br />
ページをリロードすると枠が消えちゃったりとか改善が必要な様子。<br />
まだまだFirefox版のほうが実用向き。<br />
今後に期待です。<br />
<br />
<br />
<br />
<br />
<strong>ほかのエクステンションも</strong><br />
新しいブラウザにいじると大体やっちゃうのが使えそうなアドオン探し。<br />
どうせいじるのは最初の頃だけなんだろうなーと分かっていながらもいろいろ入れてみました。<br />
せっかくなので入れてみたものを紹介。<br />
<br />
<strong><a href="https://chrome.google.com/extensions/detail/jpkfjicglakibpenojifdiepckckakgk" alt="">Chrome Gestures</a></strong><br />
マウスジェスチャー<br />
右クリックしながらマウス動かして進んだり戻ったり更新したり。<br />
GoogleChromeを使ってなかった理由の一つがこれができないからだったりもしたり。<br />
<br />
<strong><a href="https://chrome.google.com/extensions/detail/gbammbheopgpmaagmckhpjbfgdfkpadb" alt="">XML Tree</a></strong><br />
GoogleChromeではXMLのページがただのテキストで表示されますが、これをいれればカッコよくXML風に表示可能。<br />
ただ、後述の他のエクステンションと同時に使うといろいろとおかしなことが起こります。<br />
Coolirisを入れてるとXMLの最初の階層にstyleタグが入れ込まれちゃう。<br />
Furigana Injectorを入れてるとXMLページを表示しただけでエラーが出ちゃう。<br />
これはどっち側の責任なのか。うーん。<br />
<br />
<strong><a href="https://chrome.google.com/extensions/detail/cbahnmcliajmanjkaolemjelphicnein" alt="">Furigana Injector</a></strong><br />
表示しているサイト内の漢字にフリガナを付けてくれる。<br />
フリガナを付ける漢字のレベルも簡単に調整できる。はずなんですが自分の環境だとまだ動作してくれてません。なぜ・・・。<br />
↓<br />
URL入力フォームの右端に出る「振」マークをクリックしたらフリガナが表示された。<br />
この場所って他のエクステンションとかぶったらどうなるんだろ。<br />
<br />
<strong><a href="https://chrome.google.com/extensions/detail/jibehoijjhabehkjkgekmkekkjconbde" alt="">Ibrii</a></strong><br />
ページ右側にカートのような枠を表示し、サイト内の画像やらテキストやらをドラッグして放り込んで保存しておくことができます。おもしろげ。<br />
最初に簡単なユーザー登録が必要。<br />
<br />
<strong><a href="https://chrome.google.com/extensions/detail/noocneohefmdhonidldnlhaainpiomkp" alt="">Cooliris</a></strong><br />
GoogleImage等の画像検索画面などをカッコよく表示してくれる。<br />
それでいて見やすい。<br />
昔Firefoxで使ってたときは日本語入力ができなかった気がするけどいつの間にか対応してた。カッコイイッス。<br />
<br />
<strong><a href="https://chrome.google.com/extensions/detail/dnlfpnhinnjdgmjfpccajboogcjocdla" alt="">Hatena Bookmark GoogleChrome extension</a></strong><br />
メニューのアイコンには見ているページのはてぶ数を表示。<br />
アイコンをクリックすると、「ブックマークする」ボタンと、そのページについているはてぶコメントが出現。ベンリ。<br />
<br />
<strong><a href="https://chrome.google.com/extensions/detail/hehijbfgiekmjfkfjpbkbammjbdenadd" alt="">IE Tab</a></strong><br />
クリックするとIEを使用したタブが出現。<br />
Web開発者にはもってこい。<br />
<br />
<strong><a href="https://chrome.google.com/extensions/detail/ojemaikiokmokgkaelkkmdakknenlipb" alt="">Digital Clock</a></strong><br />
ただの時計。<br />
アイコン状態で時間が表示されているので地味に便利。<br />
<br />
<strong><a href="https://chrome.google.com/extensions/detail/pjnfggphgdjblhfjaphkjhfpiiekbbej" alt="">Google Similar Pages beta </a></strong><br />
クリックすると表示しているページと似ているサイトをいくつか教えてくれる。<br />
そんなに使ってないけど単にリンクのあるサイトが出ているだけの気もする。<br />
<br />
<strong><a href="https://chrome.google.com/extensions/detail/oeahddlmhbcabnnojadgimmiaaplfpfo" alt="">Mini Google Maps</a></strong><br />
アイコンをクリックするだけでちっこいGoogleMapが出現。検索枠もついてる。<br />
これでいちいち新しいタブで地図を開かなくてもよくなるっ<br />
<br />
<strong><a href="https://chrome.google.com/extensions/detail/jlhlebbhengjlhmcjebbkambaekglhkf" alt="">Bubble Translate</a></strong><br />
翻訳エクステンション。<br />
Ctrlを押しながら文字列選択とかで翻訳結果をツールチップ表示してくれる。<br />
ヴぇんり。<br />
<br />
<strong><a href="https://chrome.google.com/extensions/detail/aeolcjbaammbkgaiagooljfdepnjmkfd" alt="">AutoPatchWork </a></strong><br />
ページャーが存在するページで一番下までスクロールすると、次のページを勝手に取得してつなげて表示してくれる。<br />
<br />
<strong><a href="https://chrome.google.com/extensions/detail/bcennaiejdjpomgmmohhpgnjlmpcjmbg" alt="">Sexy Undo Close Tab</a></strong><br />
閉じたタブをスタックしておいてあとで復元することができる。<br />
やべっ、閉じちゃったっ！　ってことが多い人はぜひ。<br />
同じ内容のエクステンションMK UndoCloseTabよりも、ちょっぴり見た目がせくしー。<br />
<br />
<strong><a href="https://chrome.google.com/extensions/detail/ifbfackeniblnolgehdjdghbkblbljdc" alt="">PageShot</a></strong><br />
クリックするとページのスクリーンショットをとってくれる。<br />
一度ページ全体をキャプチャーしたあと、必要な部分だけ切り出すこともできる。<br />
pngで保存可能。<br />
<br />
<strong><a href="https://chrome.google.com/extensions/detail/bjcpobipejlbogodeiendpdgcdambjgo" alt="">Google Apps Shortcuts</a></strong><br />
Googleの提供するいろんなサービスへのショートカット<br />
生活のすべてをGoogleに預けてちゃってる人は是非<br />
<br />
<br />
<br />
使ってみて思ったこと<br />
・いっぱい入れてみたけど体感速度は変わらず。モッサリしない。<br />
・エクステンションのアイコンの表示位置はすべてここで固定？<br />
・別の場所に移動させたい。それかせめて並べ替えたい。<br />
・まだまだ微妙な出来のエクステンションが多い<br />
・オプション画面がカッコ悪いのが多い<br />
・インストール後に再起動を迫らない割に、再起動しないと動作しないものもあったり<br />
・そもそもちゃんと動作しないものもあったり<br />
・エクステンション同士が邪魔しあうことも<br />
・でも乗り換えちゃっていいと思えるぐらい十分な性能<br />
<br />
全般的に今後が楽しみといった感じです。 ]]></description>
			<author>松田惇</author>
			<category>Tech</category>
			<guid isPermaLink="true">http://blog.asial.co.jp/656</guid>
		</item>
				<item>
			<pubDate>Thu, 21 Jan 2010 18:33:42 +0900</pubDate>
			<title>社員旅行で作成した陶磁器が完成しました！</title>
			<link>http://blog.asial.co.jp/655</link>
			<description><![CDATA[ こんばんは、阿部です。<br />
<br />
社員旅行で作成した陶磁器が完成しました！！！<br />
（<a href="http://blog.asial.co.jp/643">前回のブログ</a>で作成風景を紹介したものです。）<br />
なので今回は届いた完成物を紹介します。<br />
<br />
割れることなく、無事届いて良かったです。<br />
<br />
<a href="/read_file.php?id=1006&mode=1" rel="lightbox" class="link-lightbox"><img src="http://blog.asial.co.jp/read_file.php?id=1006" /></a><br />
<a href="/read_file.php?id=1007&mode=1" rel="lightbox" class="link-lightbox"><img src="http://blog.asial.co.jp/read_file.php?id=1007" /></a><br />
<br />
<a href="/read_file.php?id=1008&mode=1" rel="lightbox" class="link-lightbox"><img src="http://blog.asial.co.jp/read_file.php?id=1008" /></a><br />
<br />
<br />
焼く前と比較するとこんな感じです。<br />
<a href="/read_file.php?id=1009&mode=1" rel="lightbox" class="link-lightbox"><img src="http://blog.asial.co.jp/read_file.php?id=1009" /></a><br />
<br />
自分の湯飲みは、この画像では小さすぎてわからないですが、滑り止めに～と思い、ギザギザ模様をつけてあります。<br />
滑り止め目的だったのですが、溝が浅すぎたのか、つるつるに仕上がってました。。<br />
もっと深く模様をつけないとダメだったようです。ちょっぴり残念。<br />
<br />
焼く前と焼き上がりで少し形が違って見えますが・・・きっと写真撮るときの角度が違うからですね。きっと。<br />
<br />
今までの旅行では、こうして後々形が残るものがなかったので、今回、いい思い出の品を作れて本当に大成功の社員旅行でした。<br />
年々社員が増えているので、今年は更に大変になりそうですが、、、<br />
んんー、がんばろー！ ]]></description>
			<author>阿部恵</author>
			<category>日常</category>
			<guid isPermaLink="true">http://blog.asial.co.jp/655</guid>
		</item>
				<item>
			<pubDate>Wed, 20 Jan 2010 17:21:59 +0900</pubDate>
			<title>PHPでコマンドライン・アプリケーションを簡単に作成する</title>
			<link>http://blog.asial.co.jp/654</link>
			<description><![CDATA[ こんにちは、小川です。<br />
<br />
本日は、PHPで簡単にコマンドライン・アプリケーションを作成できるライブラリをご紹介します。<br />
(本日ご紹介するライブラリは実際には開発途中のものでドキュメントなども存在しません。こういうものがある、程度でとらえていただければ幸いです。)<br />
<br />
さて、みなさんsymfonyはご存じでしょうか。symfonyといえば仏Sensio社が提供するオープンソースのPHPフレームワークです。symfonyはいわゆるフルスタックフレームワークでMVCをベースに様々な機能が提供されています。symfonyにはsymfonyコマンドが存在しており、実際の開発ではこのsymfonyコマンドをもちいて、アプリケーションの雛形やデータベース操作などをコマンドラインで行うことが可能です。<br />
<br />
こういったコマンドラインでアプリケーションの雛形を生成したりする機能は、symfony以外のフレームワークでも広く採用されています。こういったオリジナルのコマンドを作っておけば楽なことは色々とあるでしょう。<br />
ただ、実際に作ろうと思った場合、例えばコマンドに渡す引数の展開や、コマンドの一覧の確認であったり、コマンドの出力結果に色をつけたいなど、少々面倒なことも考慮しなくてはなりません。<br />
<br />
そこで登場するのが、本日ご紹介する「Console」というSymfonyコンポーネントです。Consoleの前に、Symfonyコンポーネントについて説明します。<br />
<br />
<br />
■SymfonyコンポーネントとSymfony 2.0<br />
<br />
Symfonyコンポーネントは、Symfonyの内部から機能を独立させたライブラリ群です。例えばYAMLのパース/ダンプを行う「YAML」、Observerパターンをもちいてオブジェクト間で疎結合なやりとりを行うための「Event Dispatcher」、他にも現在のsymfonyではまだ使われていない、DIコンテナの実装である「Dependency Injection」などがあります。<br />
<br />
これらは前述の通りスタンドアロンなライブラリです。<a href="http://components.symfony-project.org/">Symfony Components</a>というWebサイトが別途用意されており、ここからドキュメントなども閲覧可能です。<br />
<br />
Symfony Componentsのページをご覧になればわかると思うのですが、Consoleコンポーネントはこのページには掲載されていません。Consoleコンポーネントはまだ開発中のものです。<br />
<br />
<a href="http://github.com/fabpot/symfony/tree/master/src/Symfony/Components/Console/">src/Symfony/Components/Console at master from fabpot's symfony - GitHub</a><br />
<br />
現在のsymfonyの最新バージョンは1.4です。バージョン1系の開発は1.4で終了となり、次のバージョンは2.0となります。バージョン2.0からは開発リポジトリがGitHubに移行されており、まだまだ開発は始まったばかりですが、Symfonyの次期バージョンの開発の様子をここから見ることが可能です。<br />
<br />
Consoleコンポーネントもこの中に含まれています。2.0のブランチに含まれるSymfonyコンポーネントは上記のWebサイト上にあるコンポーネントとは若干違っており、PHP 5.3以上専用であること、オートローダーを個別に持っておらず、共通のオートローダーを利用する必要があるなどいくつか注意が必要となります。<br />
<br />
現在このブランチにはオートローダーとコンポーネントしか入っていないため、とりあえず丸ごと持ってきてしまえば良いかと思います。<br />
<br />
<br />
■Consoleコンポーネントでコマンドライン・アプリケーションの作成<br />
<br />
まずはConsoleコンポーネントを利用するために、GitHubからSymfony 2.0のリポジトリを複製します。とりあえずてきとうなディレクトリの中で次のコマンドを実行します。<br />
利用に当たって、PHP 5.3.0以上が必須となります。<br />
(Gitは分散型バージョン管理システムの1つです。今回は特に解説しません。)<br />
<br />
<ol class="boxcode-main"><li>$<wbr />&nbsp;git<wbr />&nbsp;clone<wbr />&nbsp;git://github.com/fabpot/symfony.git</li></ol><br />
これでリポジトリの複製を含むsymfonyというディレクトリができました。<br />
何はともあれ、簡単なコマンド用スクリプトを作ります。<br />
<br />
<ol class="php-main"><li><span class="php-code">#!/usr/bin/env<wbr />&nbsp;php-5.3.1</span></li>
<li><span class="php-code"></span><span class="php-inlinetags">&lt;?php</span><span class="php-code"></span></li>
<li><span class="php-code"></span><span class="php-var">$symfonyLibDir</span><span class="php-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="php-identifier">realpath</span><span class="php-brackets">(</span><span class="php-identifier">__DIR__</span><span class="php-code"><wbr />&nbsp;.<wbr />&nbsp;</span><span class="php-quotes">'</span><span class="php-string">/symfony/src</span><span class="php-quotes">'</span><span class="php-brackets">)</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-reserved">require</span><span class="php-code"><wbr />&nbsp;</span><span class="php-var">$symfonyLibDir</span><span class="php-code"><wbr />&nbsp;.<wbr />&nbsp;</span><span class="php-quotes">'</span><span class="php-string">/Symfony/Foundation/ClassLoader.php</span><span class="php-quotes">'</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;</span></li>
<li><span class="php-code"></span><span class="php-var">$classLoader</span><span class="php-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="php-reserved">new</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Symfony</span><span class="php-code">\</span><span class="php-identifier">Foundation</span><span class="php-code">\</span><span class="php-identifier">ClassLoader</span><span class="php-brackets">()</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-var">$classLoader</span><span class="php-code">-&gt;</span><span class="php-identifier">registerNamespace</span><span class="php-brackets">(</span><span class="php-quotes">'</span><span class="php-string">Symfony</span><span class="php-quotes">'</span><span class="php-code">,<wbr />&nbsp;</span><span class="php-var">$symfonyLibDir</span><span class="php-brackets">)</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-var">$classLoader</span><span class="php-code">-&gt;</span><span class="php-identifier">register</span><span class="php-brackets">()</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;</span></li>
<li><span class="php-code"></span><span class="php-identifier">use</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Symfony</span><span class="php-code">\</span><span class="php-identifier">Components</span><span class="php-code">\</span><span class="php-identifier">Console</span><span class="php-code">\</span><span class="php-identifier">Application</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-var">$application</span><span class="php-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="php-reserved">new</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Application</span><span class="php-brackets">(</span><span class="php-identifier">basename</span><span class="php-brackets">(</span><span class="php-reserved">__FILE__</span><span class="php-brackets">))</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-var">$application</span><span class="php-code">-&gt;</span><span class="php-identifier">run</span><span class="php-brackets">()</span><span class="php-code">;</span></li></ol><br />
このコードをmycommandという名前で保存し、実行権限を付与しておきます。<br />
なお、1行目(shebang)は各自の環境に合わせて変更をお願いします。<br />
<br />
コードの内容を説明します。3～8行目はオートローダーの設定です。10行目以降がConsoleアプリケーションの利用になります。<br />
11行目でApplicationというクラスを生成しています。コンストラクタの第1引数にファイル名を渡していますが、ここにはコマンドの名前を指定します。コマンド名＝ファイル名ですので、ここではファイル名を指定しておきます。第2引数は指定していませんが、本来はここにアプリケーションのバージョンを指定します。<br />
作成したアプリケーションのrun()メソッドを呼び出すと、コマンド呼び出し時の引数をパースして処理してくれます。<br />
(名前空間を利用していますが、名前空間がわからない方は以前僕が<a href="http://prezi.com/0-vyhjdkslih/">勉強会で発表した資料</a>があるので参考にしていただければと思います。)<br />
<br />
このコマンドの実行結果は次のようになります。<br />
<br />
<a href="/read_file.php?id=1002&mode=1" rel="lightbox" class="link-lightbox"><img src="http://blog.asial.co.jp/read_file.php?id=1002" /></a><br />
<br />
コマンドを実行してみると、下部にAvailable commandsという項目が表示されています。デフォルトではhelpとlistの2つが用意されています。Usageにある「command」という部分にコマンド名を指定するような仕組みになっています。上の画像ではcommandには何も指定していません。commandが省略された場合、listコマンドが呼び出されるようになっています。<br />
<br />
helpコマンドは各コマンドのヘルプを表示するためのコマンドです。listコマンドのヘルプを参照したい場合、「./mycommand help list」と入力するとlistコマンドのヘルプが表示されます。<br />
<br />
<br />
■カスタムコマンドを作成<br />
<br />
先ほどまででコマンドライン・アプリケーション自体は作成できました。もちろんこれだけでは役に立ちません。実際にカスタムコマンドを作成します。<br />
例として、引数で渡した文字列を大文字にして出力するコマンドを作成します。<br />
<br />
<ol class="php-main"><li><span class="php-inlinetags">&lt;?php</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;</span></li>
<li><span class="php-code"></span><span class="php-identifier">use</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Symfony</span><span class="php-code">\</span><span class="php-identifier">Components</span><span class="php-code">\</span><span class="php-identifier">Console</span><span class="php-code">\</span><span class="php-identifier">Input</span><span class="php-code">\</span><span class="php-identifier">InputArgument</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-identifier">use</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Symfony</span><span class="php-code">\</span><span class="php-identifier">Components</span><span class="php-code">\</span><span class="php-identifier">Console</span><span class="php-code">\</span><span class="php-identifier">Input</span><span class="php-code">\</span><span class="php-identifier">InputInterface</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-identifier">use</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Symfony</span><span class="php-code">\</span><span class="php-identifier">Components</span><span class="php-code">\</span><span class="php-identifier">Console</span><span class="php-code">\</span><span class="php-identifier">Output</span><span class="php-code">\</span><span class="php-identifier">OutputInterface</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-identifier">use</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Symfony</span><span class="php-code">\</span><span class="php-identifier">Components</span><span class="php-code">\</span><span class="php-identifier">Console</span><span class="php-code">\</span><span class="php-identifier">Command</span><span class="php-code">\</span><span class="php-identifier">Command</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;</span></li>
<li><span class="php-code"></span><span class="php-reserved">class</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">StrtolowerCommand</span><span class="php-code"><wbr />&nbsp;</span><span class="php-reserved">extends</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Command</span><span class="php-code"></span></li>
<li><span class="php-code"></span><span class="php-brackets">{</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="php-reserved">protected</span><span class="php-code"><wbr />&nbsp;</span><span class="php-reserved">function</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">configure</span><span class="php-brackets">()</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="php-brackets">{</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-var">$this</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;-&gt;</span><span class="php-identifier">setDefinition</span><span class="php-brackets">(</span><span class="php-reserved">array</span><span class="php-brackets">(</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-reserved">new</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">InputArgument</span><span class="php-brackets">(</span><span class="php-quotes">'</span><span class="php-string">string</span><span class="php-quotes">'</span><span class="php-code">,<wbr />&nbsp;</span><span class="php-identifier">InputArgument</span><span class="php-code">::</span><span class="php-identifier">REQUIRED</span><span class="php-code">,<wbr />&nbsp;</span><span class="php-quotes">'</span><span class="php-string">文字列</span><span class="php-quotes">'</span><span class="php-brackets">)</span><span class="php-code">,</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-brackets">))</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;-&gt;</span><span class="php-identifier">setName</span><span class="php-brackets">(</span><span class="php-quotes">'</span><span class="php-string">strtolower</span><span class="php-quotes">'</span><span class="php-brackets">)</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;-&gt;</span><span class="php-identifier">setDescription</span><span class="php-brackets">(</span><span class="php-quotes">'</span><span class="php-string">渡された文字列を小文字に変換する</span><span class="php-quotes">'</span><span class="php-brackets">)</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;-&gt;</span><span class="php-identifier">setHelp</span><span class="php-brackets">(</span><span class="php-quotes">&lt;&lt;&lt;EOF</span><span class="php-string"></span></li>
<li><span class="php-string">&lt;info&gt;strtolower&lt;/info&gt;コマンドは渡された文字列を全て小文字に変換します:</span></li>
<li><span class="php-string"><wbr />&nbsp;</span></li>
<li><span class="php-string"><wbr />&nbsp;<wbr />&nbsp;&lt;info&gt;./symfony<wbr />&nbsp;strtolower<wbr />&nbsp;string&lt;/info&gt;</span></li>
<li><span class="php-string"><wbr />&nbsp;</span></li>
<li><span class="php-string"></span><span class="php-quotes">EOF</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-brackets">)</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="php-brackets">}</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="php-reserved">protected</span><span class="php-code"><wbr />&nbsp;</span><span class="php-reserved">function</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">execute</span><span class="php-brackets">(</span><span class="php-identifier">InputInterface</span><span class="php-code"><wbr />&nbsp;</span><span class="php-var">$input</span><span class="php-code">,<wbr />&nbsp;</span><span class="php-identifier">OutputInterface</span><span class="php-code"><wbr />&nbsp;</span><span class="php-var">$output</span><span class="php-brackets">)</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="php-brackets">{</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-var">$string</span><span class="php-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="php-var">$input</span><span class="php-code">-&gt;</span><span class="php-identifier">getArgument</span><span class="php-brackets">(</span><span class="php-quotes">'</span><span class="php-string">string</span><span class="php-quotes">'</span><span class="php-brackets">)</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-var">$lowerString</span><span class="php-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="php-identifier">strtolower</span><span class="php-brackets">(</span><span class="php-var">$string</span><span class="php-brackets">)</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-var">$output</span><span class="php-code">-&gt;</span><span class="php-identifier">writeln</span><span class="php-brackets">(</span><span class="php-var">$lowerString</span><span class="php-brackets">)</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="php-brackets">}</span><span class="php-code"></span></li>
<li><span class="php-code"></span><span class="php-brackets">}</span></li></ol><br />
上記をStrtolowerCommand.phpとして保存します。configure()とexecute()という2つのprotectedなメソッドを実装していますが、configure()ではコマンドの引数の設定やヘルプ・コマンド名の設定を行っています。<br />
execute()は実際にコマンドが実行されたときの挙動です。<br />
<br />
少し細かく見ていきます。configure()で、まずはsetDifinition()を実行しています。これは引数の定義です。そこにInputArgumentオブジェクトを渡していますが、これは引数を表すオブジェクトです。InputArgumentのコンストラクタの第1引数は引数につける名称です。第2引数にInputArgument::REQUIREDという定数を渡していますが、これは必須の引数であることを指定しています。必須でない場合はOPTIONALを指定します。第3引数は引数の説明です。第4引数は省略していますが、デフォルト値を設定したい場合はここに含めます。<br />
<br />
setName()はコマンド名の設定です。今回はstrtolowerコマンドとします。単純に名前を設定するだけではなく、「:(コロン)」を用いて名前空間を指定することが可能です。symfony 1.4などを使ったことがある方はご存じかと思われますが、例えばDoctrineに関連するコマンドはdoctrineという名前空間に属しており、doctrine:buildやdoctrine:migrateのようなコマンド名になります。名前空間を指定しておけばコマンド名の衝突も避けられますし、listコマンドに名前空間を指定することで、特定の名前空間に属するコマンドの一覧の表示が可能になります。<br />
<br />
また、コマンド名にはエイリアスを指定することも可能です。setAliases()メソッドに配列でエイリアス名を渡すと、その名前でもコマンドが呼び出せるようになります。<br />
<br />
execute()では、まず入力された引数を取得しています。入力情報は第1引数の$inputに渡されるオブジェクトが保持しており、$input->getArgument("setDefinitionで指定した引数名")で取得可能です。第2引数の$outputは出力情報を扱うオブジェクトです。このオブジェクトのwriteln()メソッドに文字列を渡すことで、文字列を出力します。<br />
<br />
ではこのコマンドを実際に実行可能にするため、mycommandファイルを開いて次のように修正します。<br />
<br />
<ol class="php-main"><li><span class="php-code">#!/usr/bin/env<wbr />&nbsp;php-5.3.1</span></li>
<li><span class="php-code"></span><span class="php-inlinetags">&lt;?php</span><span class="php-code"></span></li>
<li><span class="php-code"></span><span class="php-var">$symfonyLibDir</span><span class="php-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="php-identifier">realpath</span><span class="php-brackets">(</span><span class="php-identifier">__DIR__</span><span class="php-code"><wbr />&nbsp;.<wbr />&nbsp;</span><span class="php-quotes">'</span><span class="php-string">/symfony/src</span><span class="php-quotes">'</span><span class="php-brackets">)</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-reserved">require</span><span class="php-code"><wbr />&nbsp;</span><span class="php-var">$symfonyLibDir</span><span class="php-code"><wbr />&nbsp;.<wbr />&nbsp;</span><span class="php-quotes">'</span><span class="php-string">/Symfony/Foundation/ClassLoader.php</span><span class="php-quotes">'</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;</span></li>
<li><span class="php-code"></span><span class="php-var">$classLoader</span><span class="php-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="php-reserved">new</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Symfony</span><span class="php-code">\</span><span class="php-identifier">Foundation</span><span class="php-code">\</span><span class="php-identifier">ClassLoader</span><span class="php-brackets">()</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-var">$classLoader</span><span class="php-code">-&gt;</span><span class="php-identifier">registerNamespace</span><span class="php-brackets">(</span><span class="php-quotes">'</span><span class="php-string">Symfony</span><span class="php-quotes">'</span><span class="php-code">,<wbr />&nbsp;</span><span class="php-var">$symfonyLibDir</span><span class="php-brackets">)</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-comment">//<wbr />&nbsp;オートロードの指定</span><span class="php-code"></span></li>
<li><span class="php-code"></span><span class="php-var">$classLoader</span><span class="php-code">-&gt;</span><span class="php-identifier">registerNamespace</span><span class="php-brackets">(</span><span class="php-quotes">''</span><span class="php-code">,<wbr />&nbsp;</span><span class="php-identifier">__DIR__</span><span class="php-brackets">)</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-var">$classLoader</span><span class="php-code">-&gt;</span><span class="php-identifier">register</span><span class="php-brackets">()</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;</span></li>
<li><span class="php-code"></span><span class="php-identifier">use</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Symfony</span><span class="php-code">\</span><span class="php-identifier">Components</span><span class="php-code">\</span><span class="php-identifier">Console</span><span class="php-code">\</span><span class="php-identifier">Application</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;</span></li>
<li><span class="php-code"></span><span class="php-var">$application</span><span class="php-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="php-reserved">new</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Application</span><span class="php-brackets">(</span><span class="php-identifier">basename</span><span class="php-brackets">(</span><span class="php-reserved">__FILE__</span><span class="php-brackets">))</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-comment">//<wbr />&nbsp;コマンドの追加</span><span class="php-code"></span></li>
<li><span class="php-code"></span><span class="php-var">$application</span><span class="php-code">-&gt;</span><span class="php-identifier">addCommand</span><span class="php-brackets">(</span><span class="php-reserved">new</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">StrtolowerCommand</span><span class="php-brackets">())</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-var">$application</span><span class="php-code">-&gt;</span><span class="php-identifier">run</span><span class="php-brackets">()</span><span class="php-code">;</span></li></ol><br />
<a href="/read_file.php?id=1003&mode=1" rel="lightbox" class="link-lightbox"><img src="http://blog.asial.co.jp/read_file.php?id=1003" /></a><br />
<br />
ここで重要となるのはsetDefinition()に指定する引数などの設定です。InputArgumentの他にInputOptionクラスもあります。オプションは引数と違い、--で始まるものです。例として、先ほどのStrtolowerコマンドに渡された文字列の中にスペースが入っていた場合に取り除くstrip-spacesオプションを追加してみます。<br />
<br />
<ol class="php-main"><li><span class="php-inlinetags">&lt;?php</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;</span></li>
<li><span class="php-code"></span><span class="php-identifier">use</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Symfony</span><span class="php-code">\</span><span class="php-identifier">Components</span><span class="php-code">\</span><span class="php-identifier">Console</span><span class="php-code">\</span><span class="php-identifier">Input</span><span class="php-code">\</span><span class="php-identifier">InputArgument</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-identifier">use</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Symfony</span><span class="php-code">\</span><span class="php-identifier">Components</span><span class="php-code">\</span><span class="php-identifier">Console</span><span class="php-code">\</span><span class="php-identifier">Input</span><span class="php-code">\</span><span class="php-identifier">InputOption</span><span class="php-code">;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-comment">//<wbr />&nbsp;追加(1)</span><span class="php-code"></span></li>
<li><span class="php-code"></span><span class="php-identifier">use</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Symfony</span><span class="php-code">\</span><span class="php-identifier">Components</span><span class="php-code">\</span><span class="php-identifier">Console</span><span class="php-code">\</span><span class="php-identifier">Input</span><span class="php-code">\</span><span class="php-identifier">InputInterface</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-identifier">use</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Symfony</span><span class="php-code">\</span><span class="php-identifier">Components</span><span class="php-code">\</span><span class="php-identifier">Console</span><span class="php-code">\</span><span class="php-identifier">Output</span><span class="php-code">\</span><span class="php-identifier">OutputInterface</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-identifier">use</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Symfony</span><span class="php-code">\</span><span class="php-identifier">Components</span><span class="php-code">\</span><span class="php-identifier">Console</span><span class="php-code">\</span><span class="php-identifier">Command</span><span class="php-code">\</span><span class="php-identifier">Command</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;</span></li>
<li><span class="php-code"></span><span class="php-reserved">class</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">StrtolowerCommand</span><span class="php-code"><wbr />&nbsp;</span><span class="php-reserved">extends</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Command</span><span class="php-code"></span></li>
<li><span class="php-code"></span><span class="php-brackets">{</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="php-reserved">protected</span><span class="php-code"><wbr />&nbsp;</span><span class="php-reserved">function</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">configure</span><span class="php-brackets">()</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="php-brackets">{</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-var">$this</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;-&gt;</span><span class="php-identifier">setDefinition</span><span class="php-brackets">(</span><span class="php-reserved">array</span><span class="php-brackets">(</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-reserved">new</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">InputArgument</span><span class="php-brackets">(</span><span class="php-quotes">'</span><span class="php-string">string</span><span class="php-quotes">'</span><span class="php-code">,<wbr />&nbsp;</span><span class="php-identifier">InputArgument</span><span class="php-code">::</span><span class="php-identifier">REQUIRED</span><span class="php-code">,<wbr />&nbsp;</span><span class="php-quotes">'</span><span class="php-string">文字列</span><span class="php-quotes">'</span><span class="php-brackets">)</span><span class="php-code">,</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-comment">//<wbr />&nbsp;追加(2)</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-reserved">new</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">InputOption</span><span class="php-brackets">(</span><span class="php-quotes">'</span><span class="php-string">strip-spaces</span><span class="php-quotes">'</span><span class="php-code">,<wbr />&nbsp;</span><span class="php-quotes">'</span><span class="php-string">s</span><span class="php-quotes">'</span><span class="php-code">,<wbr />&nbsp;</span><span class="php-identifier">InputOption</span><span class="php-code">::</span><span class="php-identifier">PARAMETER_NONE</span><span class="php-code">,<wbr />&nbsp;</span><span class="php-quotes">'</span><span class="php-string">指定した場合は空白を削除</span><span class="php-quotes">'</span><span class="php-brackets">)</span><span class="php-code">,</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-brackets">))</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;-&gt;</span><span class="php-identifier">setName</span><span class="php-brackets">(</span><span class="php-quotes">'</span><span class="php-string">strtolower</span><span class="php-quotes">'</span><span class="php-brackets">)</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;-&gt;</span><span class="php-identifier">setDescription</span><span class="php-brackets">(</span><span class="php-quotes">'</span><span class="php-string">渡された文字列を小文字に変換する</span><span class="php-quotes">'</span><span class="php-brackets">)</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;-&gt;</span><span class="php-identifier">setHelp</span><span class="php-brackets">(</span><span class="php-quotes">&lt;&lt;&lt;EOF</span><span class="php-string"></span></li>
<li><span class="php-string">&lt;info&gt;strtolower&lt;/info&gt;コマンドは渡された文字列を全て小文字に変換します:</span></li>
<li><span class="php-string"><wbr />&nbsp;</span></li>
<li><span class="php-string"><wbr />&nbsp;<wbr />&nbsp;&lt;info&gt;./symfony<wbr />&nbsp;strtolower<wbr />&nbsp;string&lt;/info&gt;</span></li>
<li><span class="php-string"><wbr />&nbsp;</span></li>
<li><span class="php-string"></span><span class="php-quotes">EOF</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-brackets">)</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="php-brackets">}</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="php-reserved">protected</span><span class="php-code"><wbr />&nbsp;</span><span class="php-reserved">function</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">execute</span><span class="php-brackets">(</span><span class="php-identifier">InputInterface</span><span class="php-code"><wbr />&nbsp;</span><span class="php-var">$input</span><span class="php-code">,<wbr />&nbsp;</span><span class="php-identifier">OutputInterface</span><span class="php-code"><wbr />&nbsp;</span><span class="php-var">$output</span><span class="php-brackets">)</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="php-brackets">{</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-var">$string</span><span class="php-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="php-var">$input</span><span class="php-code">-&gt;</span><span class="php-identifier">getArgument</span><span class="php-brackets">(</span><span class="php-quotes">'</span><span class="php-string">string</span><span class="php-quotes">'</span><span class="php-brackets">)</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-var">$lowerString</span><span class="php-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="php-identifier">strtolower</span><span class="php-brackets">(</span><span class="php-var">$string</span><span class="php-brackets">)</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-comment">//<wbr />&nbsp;追加(3)</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-reserved">if</span><span class="php-code"><wbr />&nbsp;</span><span class="php-brackets">(</span><span class="php-var">$encoding</span><span class="php-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="php-var">$input</span><span class="php-code">-&gt;</span><span class="php-identifier">getOption</span><span class="php-brackets">(</span><span class="php-quotes">'</span><span class="php-string">strip-spaces</span><span class="php-quotes">'</span><span class="php-brackets">))</span><span class="php-code"><wbr />&nbsp;</span><span class="php-brackets">{</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-var">$strips</span><span class="php-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="php-reserved">array</span><span class="php-brackets">(</span><span class="php-quotes">'</span><span class="php-string"><wbr />&nbsp;</span><span class="php-quotes">'</span><span class="php-code">,<wbr />&nbsp;</span><span class="php-quotes">'</span><span class="php-string">　</span><span class="php-quotes">'</span><span class="php-brackets">)</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-var">$lowerString</span><span class="php-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="php-identifier">str_replace</span><span class="php-brackets">(</span><span class="php-var">$strips</span><span class="php-code">,<wbr />&nbsp;</span><span class="php-identifier">array_fill</span><span class="php-brackets">(</span><span class="php-number">0</span><span class="php-code">,<wbr />&nbsp;</span><span class="php-identifier">count</span><span class="php-brackets">(</span><span class="php-var">$strips</span><span class="php-brackets">)</span><span class="php-code">,<wbr />&nbsp;</span><span class="php-quotes">''</span><span class="php-brackets">)</span><span class="php-code">,<wbr />&nbsp;</span><span class="php-var">$lowerString</span><span class="php-brackets">)</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-brackets">}</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-var">$output</span><span class="php-code">-&gt;</span><span class="php-identifier">writeln</span><span class="php-brackets">(</span><span class="php-var">$lowerString</span><span class="php-brackets">)</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="php-brackets">}</span><span class="php-code"></span></li>
<li><span class="php-code"></span><span class="php-brackets">}</span></li></ol><br />
StrtolowerCommand.phpに3箇所追加しました。(1)はクラスのインポートです。(2)はオプションの追加です。InputOptionのコンストラクタはInputArgument若干違い、第2引数にはショートカット名を渡します。本来は--strip-spacesと指定しますが、第2引数に文字列を指定しておけば、例えば上記の用にsと指定した場合は-sで呼び出せるようになります。第3引数はオプションに渡す値の種別です。PARAMETER_NONEは--strip-spacesのように、オプションに対して値を指定しない場合に使用します。PARAMETER_REQUIREDを指定すると、--strip-spaces=trueのように値を必ず指定しなければなりません。どちらでも良い場合はPARAMETER_OPTIONALを、同じオプションに複数の値を指定したい場合はPARAMETER_IS_ARRAYを指定します。あとはInputArgumentとほとんど同じです。<br />
<br />
というわけでコマンドを再度実行してみます。<br />
<br />
<a href="/read_file.php?id=1004&mode=1" rel="lightbox" class="link-lightbox"><img src="http://blog.asial.co.jp/read_file.php?id=1004" /></a><br />
<br />
このようにして、コマンドの追加も簡単におこなえます。引数の指定など細かくおこなえますし、メソッドを2つ実装するだけでいいのはとても楽です。<br />
<br />
<br />
■対話式シェルを作成<br />
<br />
Consoleコンポーネントは対話式のシェルを作成することも可能です。<br />
<br />
<ol class="php-main"><li><span class="php-inlinetags">&lt;?php</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;</span></li>
<li><span class="php-code"></span><span class="php-identifier">use</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Symfony</span><span class="php-code">\</span><span class="php-identifier">Components</span><span class="php-code">\</span><span class="php-identifier">Console</span><span class="php-code">\</span><span class="php-identifier">Input</span><span class="php-code">\</span><span class="php-identifier">InputInterface</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-identifier">use</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Symfony</span><span class="php-code">\</span><span class="php-identifier">Components</span><span class="php-code">\</span><span class="php-identifier">Console</span><span class="php-code">\</span><span class="php-identifier">Output</span><span class="php-code">\</span><span class="php-identifier">OutputInterface</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-identifier">use</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Symfony</span><span class="php-code">\</span><span class="php-identifier">Components</span><span class="php-code">\</span><span class="php-identifier">Console</span><span class="php-code">\</span><span class="php-identifier">Command</span><span class="php-code">\</span><span class="php-identifier">Command</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-identifier">use</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Symfony</span><span class="php-code">\</span><span class="php-identifier">Components</span><span class="php-code">\</span><span class="php-identifier">Console</span><span class="php-code">\</span><span class="php-identifier">Shell</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;</span></li>
<li><span class="php-code"></span><span class="php-reserved">class</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">ShellCommand</span><span class="php-code"><wbr />&nbsp;</span><span class="php-reserved">extends</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Command</span><span class="php-code"></span></li>
<li><span class="php-code"></span><span class="php-brackets">{</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="php-reserved">protected</span><span class="php-code"><wbr />&nbsp;</span><span class="php-reserved">function</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">configure</span><span class="php-brackets">()</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="php-brackets">{</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-var">$this</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;-&gt;</span><span class="php-identifier">setName</span><span class="php-brackets">(</span><span class="php-quotes">'</span><span class="php-string">shell</span><span class="php-quotes">'</span><span class="php-brackets">)</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="php-brackets">}</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="php-reserved">protected</span><span class="php-code"><wbr />&nbsp;</span><span class="php-reserved">function</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">execute</span><span class="php-brackets">(</span><span class="php-identifier">InputInterface</span><span class="php-code"><wbr />&nbsp;</span><span class="php-var">$input</span><span class="php-code">,<wbr />&nbsp;</span><span class="php-identifier">OutputInterface</span><span class="php-code"><wbr />&nbsp;</span><span class="php-var">$output</span><span class="php-brackets">)</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="php-brackets">{</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-var">$shell</span><span class="php-code"><wbr />&nbsp;=<wbr />&nbsp;</span><span class="php-reserved">new</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">Shell</span><span class="php-brackets">(</span><span class="php-var">$this</span><span class="php-code">-&gt;</span><span class="php-identifier">application</span><span class="php-brackets">)</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</span><span class="php-var">$shell</span><span class="php-code">-&gt;</span><span class="php-identifier">run</span><span class="php-brackets">()</span><span class="php-code">;</span></li>
<li><span class="php-code"><wbr />&nbsp;<wbr />&nbsp;</span><span class="php-brackets">}</span><span class="php-code"></span></li>
<li><span class="php-code"></span><span class="php-brackets">}</span></li></ol><br />
このコードをShellCommand.phpという名前で保存します。忘れずにmycommandにShellCommandを追加しましょう。<br />
<br />
<ol class="php-main"><li><span class="php-inlinetags">&lt;?php</span><span class="php-code"></span></li>
<li><span class="php-code"></span><span class="php-comment">//<wbr />&nbsp;...</span><span class="php-code"></span></li>
<li><span class="php-code"><wbr />&nbsp;</span></li>
<li><span class="php-code"></span><span class="php-var">$application</span><span class="php-code">-&gt;</span><span class="php-identifier">addCommand</span><span class="php-brackets">(</span><span class="php-reserved">new</span><span class="php-code"><wbr />&nbsp;</span><span class="php-identifier">ShellCommand</span><span class="php-brackets">())</span><span class="php-code">;</span></li>
<li><span class="php-code"></span><span class="php-var">$application</span><span class="php-code">-&gt;</span><span class="php-identifier">run</span><span class="php-brackets">()</span><span class="php-code">;</span></li></ol><br />
これで完了です。Shellというクラスを生成してrun()メソッドを呼ぶだけです。その際にコンストラクタにApplicationを渡していますが、Commandクラスの中で$this->applicationを参照するとApplicationオブジェクトが取得可能です。<br />
<br />
<a href="/read_file.php?id=1005&mode=1" rel="lightbox" class="link-lightbox"><img src="http://blog.asial.co.jp/read_file.php?id=1005" /></a><br />
<br />
このシェルのいいところは、タブを押すことで補完をしてくれることや、ホームディレクトリに .histry_アプリケーション名 というファイルを作成して履歴の保存をしてくれるところです。ちなみにCtrl+Cで抜けられます。<br />
<br />
<br />
簡単にではありましたが、Consoleコンポーネントのご紹介は以上です。Symfony 2が開発中で、実際にSymfonyコンポーネントが将来どうなるかなどまだまだ見えないところがあると思います。<br />
ただ、このSymfonyコンポーネントはSymfony以外でも使える有用なライブラリが揃っており、また今後もどんどん増えていく予定です。<a href="http://components.symfony-project.org/">Symfony Components</a>のページに掲載されているコンポーネントは今回使ったものとは違い、PHP 5.3以前のものでも利用可能です。興味のある方はぜひこのSymfonyコンポーネントを使ってみてください。 ]]></description>
			<author>小川雄大</author>
			<category>Tech</category>
			<guid isPermaLink="true">http://blog.asial.co.jp/654</guid>
		</item>
				<item>
			<pubDate>Wed, 20 Jan 2010 14:44:01 +0900</pubDate>
			<title>kvmでwindows7を入れてみました</title>
			<link>http://blog.asial.co.jp/653</link>
			<description><![CDATA[ kvmでwindows7を入れてみました<br />
<br />
仮想化といえば、VMWareやXenが有名ですが、<br />
今回は割と新しいkvmを使用したいと思います。<br />
<br />
kvmと言っても切替器ではなく、KernelbasedVirtualMachineのkvmです。<br />
<br />
kvmとは<br />
<a href='http://ja.wikipedia.org/wiki/Kernel-based_Virtual_Machine'>http://ja.wikipedia.org/wiki/Kernel-based_Virtual_Machine</a><br />
<br />
要は、軽量でシンプルな仮想化システムです。<br />
kvm自身では何もできないので、フロントエンドとしてqemuを使用します。<br />
<br />
ぐだぐだ書いてもおもしろくないので、百聞は一見にしかず。ぜひ試してみてください。<br />
<br />
０・前提条件<br />
・カーネルは2.6.20以降が必要<br />
・AMD-V、IntelVTなどの仮想化機構が必要<br />
・~/vm/ にvmのディスクイメージを入れます<br />
・~/win7.iso がwindows7のDVDイメージです<br />
<br />
１・kvmのインストール<br />
kvmとqemu-utilsをインストールします。<br />
Debian系使っていることを前提とすれば、<br />
<ol class="boxcode-main no-number"><li>$<wbr />&nbsp;sudo<wbr />&nbsp;apt-get<wbr />&nbsp;install<wbr />&nbsp;kvm<wbr />&nbsp;qemu-utils</li></ol>以上。簡単ですね。<br />
<br />
２・ディスクイメージの作成<br />
これはqemu-utilsのqemu-imgを使用して以下コマンドで作成します。<br />
<ol class="boxcode-main no-number"><li>##<wbr />&nbsp;qcow2で<wbr />&nbsp;~/vm/win7.img<wbr />&nbsp;に<wbr />&nbsp;30GBで作成</li><li>$<wbr />&nbsp;qemu-img<wbr />&nbsp;create<wbr />&nbsp;-f<wbr />&nbsp;qcow2<wbr />&nbsp;~/vm/win7.img<wbr />&nbsp;30G</li></ol><br />
または、ddであらかじめスペースを確保する方法もあります。<br />
（最初から領域を確保するので、若干ディスクアクセスが早くなるかもしれません）<br />
<ol class="boxcode-main no-number"><li>$<wbr />&nbsp;dd<wbr />&nbsp;if=/dev/zero<wbr />&nbsp;of=~/vm/win7.img<wbr />&nbsp;bs=1024<wbr />&nbsp;count=$((20<wbr />&nbsp;*<wbr />&nbsp;1024<wbr />&nbsp;*<wbr />&nbsp;1024))</li></ol><br />
３・起動<br />
windowsをインストールします<br />
<ol class="boxcode-main no-number"><li>$<wbr />&nbsp;sudo<wbr />&nbsp;kvm<wbr />&nbsp;-hda<wbr />&nbsp;~/vm/win7.img<wbr />&nbsp;-cdrom<wbr />&nbsp;~/win7.iso<wbr />&nbsp;-boot<wbr />&nbsp;d<wbr />&nbsp;-m<wbr />&nbsp;1024<wbr />&nbsp;-monitor<wbr />&nbsp;stdio</li></ol>この一行で仮想マシンが起動します。<br />
（後はwindowsのインストールを道なりに進むだけですので割愛します）<br />
<br />
４・その他<br />
・ネットワーク<br />
起動オプションにの-redirでホストの任意のポートにゲストの任意のポートをマッピング出来るので、<br />
例えば以下のようにして起動すると、rdesktopで接続出来ます。<br />
<ol class="boxcode-main no-number"><li>$<wbr />&nbsp;sudo<wbr />&nbsp;kvm<wbr />&nbsp;-hda<wbr />&nbsp;~/vm/win7.img<wbr />&nbsp;-m<wbr />&nbsp;1024<wbr />&nbsp;-monitor<wbr />&nbsp;stdio<wbr />&nbsp;-redir<wbr />&nbsp;tcp:3389::3389</li></ol><br />
・USBデバイス<br />
VMPlayerのようにワンクリックでとはいきませんが、コンソールで以下のようにすれば接続できます。<br />
<ol class="boxcode-main no-number"><li>#<wbr />&nbsp;-usbオプションをつけてkvmを起動</li><li>#<wbr />&nbsp;ホストのデバイスを確認</li><li>(qemu)<wbr />&nbsp;info<wbr />&nbsp;usbhost</li><li>【省略】</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;Class<wbr />&nbsp;00:<wbr />&nbsp;USB<wbr />&nbsp;device<wbr />&nbsp;04fe:000d,<wbr />&nbsp;HHKB<wbr />&nbsp;Professional<wbr />&nbsp;JP</li><li><wbr />&nbsp;<wbr />&nbsp;Device<wbr />&nbsp;1.5,<wbr />&nbsp;speed<wbr />&nbsp;1.5	Mb/s</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;Class<wbr />&nbsp;00:<wbr />&nbsp;USB<wbr />&nbsp;device<wbr />&nbsp;0458:0048,<wbr />&nbsp;Wireless<wbr />&nbsp;Keyboard<wbr />&nbsp;&	Mouse</li><li><wbr />&nbsp;<wbr />&nbsp;Device<wbr />&nbsp;1.6,<wbr />&nbsp;speed<wbr />&nbsp;480	Mb/s<wbr />&nbsp;<wbr />&nbsp;	<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;	<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;	<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;	<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;	<=<wbr />&nbsp;これを追加<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;Class<wbr />&nbsp;00:<wbr />&nbsp;USB<wbr />&nbsp;device<wbr />&nbsp;1307:0163,<wbr />&nbsp;Flash<wbr />&nbsp;Disk</li><li></li><li>#<wbr />&nbsp;usb_addで追加<wbr />&nbsp;</li><li>(qemu)<wbr />&nbsp;usb_add<wbr />&nbsp;host:1307:0163</li><li></li><li>#<wbr />&nbsp;仮想マシンに接続中のデバイス確認</li><li>(qemu)<wbr />&nbsp;info<wbr />&nbsp;usb<wbr />&nbsp;</li><li><wbr />&nbsp;<wbr />&nbsp;Device<wbr />&nbsp;0.2,<wbr />&nbsp;Speed<wbr />&nbsp;480	Mb/s,<wbr />&nbsp;Product<wbr />&nbsp;Flash<wbr />&nbsp;Disk</li></ol>なお、/proc/bus/usb/devicesがないといわれる場合には以下を実行してマウントしておきます。<br />
<ol class="boxcode-main no-number"><li>$<wbr />&nbsp;sudo<wbr />&nbsp;mount<wbr />&nbsp;-t	usbfs<wbr />&nbsp;none<wbr />&nbsp;/proc/bus/usb</li></ol><br />
<br />
使用感としては、思ったよりサクサク動いています。<br />
kvmを使わないqemuの場合は実用に耐えうるスピードではありませんでしたが、kvmを使用するとほぼネイティブと言ってもいいくらいのスピードですね。<br />
ただし、グラフィック系はあまり速くないので、rdesktopでつないだ方が結果として快適かもしれません。<br />
出来て間もないため、サーバー用途にはまだ不安が残りますが、テスト用マシンなどの用途には実用的かと思います。 ]]></description>
			<author>門脇優児</author>
			<category>Tech</category>
			<guid isPermaLink="true">http://blog.asial.co.jp/653</guid>
		</item>
				<item>
			<pubDate>Fri, 15 Jan 2010 13:07:48 +0900</pubDate>
			<title>ratproxyとSelenium IDEを組み合わせたWebアプリケーションテスト</title>
			<link>http://blog.asial.co.jp/652</link>
			<description><![CDATA[ 今回は、統合テストなどで利用できる便利ツール「Selenium IDE」と「ratproxy」を組み合わせてのテスト方法を紹介します。<br />
<br />
どちらも良く使われるツールなので、既に取りれている方もいるとは思いますが、両ツールを組み合わせることでより効率的にテストを行えるのではないでしょうか。<br />
<br />
さっそくテスト方法について書いていきたいと思います。<br />
<br />
1．ratproxyをインストール<br />
<br />
以前、本ブログでも紹介されていましたが、Googleのセキュリティツール「ratproxy」をインストールします。<br />
※参考：<a href="http://blog.asial.co.jp/410">フリーで使えるセキュリティスキャナ・ツールまとめ</a><br />
<br />
ダウンロードは<a href="http://code.google.com/p/ratproxy/downloads/list">こちらのページ</a>から行えます。<br />
<br />
2．Selenium IDEをインストール<br />
<br />
FireFoxのアドオンである、Webアプリケーションテストの自動化ツール「Selenium IDE」をインストールします。<br />
<br />
Selenium IDEは、<a href="https://addons.mozilla.org/ja/firefox/addon/2079">こちらのページ</a>から取得できます。<br />
<br />
3．テスト用のデータ作成<br />
<br />
Selenium IDEを使用してテスト用のデータを作っていきます。<br />
<br />
Selenium IDEを起動します。起動した時点で記録状態となっているので、テストシナリオに沿って操作します。<br />
<a href="/read_file.php?id=994&mode=1" rel="lightbox" class="link-lightbox"><img src="http://blog.asial.co.jp/read_file.php?id=994" /></a><br />
<br />
一通りテストが完了したら、停止ボタンをクリックします。<br />
<a href="/read_file.php?id=995&mode=1" rel="lightbox" class="link-lightbox"><img src="http://blog.asial.co.jp/read_file.php?id=995" /></a><br />
<br />
テストケースを保存します。<br />
<a href="/read_file.php?id=996&mode=1" rel="lightbox" class="link-lightbox"><img src="http://blog.asial.co.jp/read_file.php?id=996" /></a><br />
<br />
4．ratproxyのプロキシ設定、起動<br />
<br />
ブラウザのプロキシをratproxy用に設定します。<br />
<a href="/read_file.php?id=999&mode=1" rel="lightbox" class="link-lightbox"><img src="http://blog.asial.co.jp/read_file.php?id=999" /></a><br />
<br />
ratproxyを起動します。<br />
<br />
<ol class="boxcode-main no-number"><li>./ratproxy<wbr />&nbsp;-w<wbr />&nbsp;hoge.log<wbr />&nbsp;-r<wbr />&nbsp;-lfscmXC<wbr />&nbsp;&</li></ol><br />
5．Selenium IDE実行<br />
<br />
Selenium IDEを起動し、3．で作成したテストーデータを読み込み開始ボタンをクリックします。<br />
<br />
<a href="/read_file.php?id=998&mode=1" rel="lightbox" class="link-lightbox"><img src="http://blog.asial.co.jp/read_file.php?id=998" /></a><br />
<br />
6．ratproxyの結果確認<br />
<br />
Selenium IDE実行後、ratproxyでの結果をHTML化し、ブラウザで表示します。<br />
<br />
<ol class="boxcode-main no-number"><li>./ratproxy-report.sh<wbr />&nbsp;hoge.log<wbr />&nbsp;><wbr />&nbsp;hoge.html</li></ol><br />
<a href="/read_file.php?id=1001&mode=1" rel="lightbox" class="link-lightbox"><img src="http://blog.asial.co.jp/read_file.php?id=1001" /></a><br />
<br />
使用方法はすごく基本的なところばかりですが、自動テストしながらセキュリティチェックまで行えてとても便利だと思います。<br />
ぜひ、お試しください。 ]]></description>
			<author>川原美和</author>
			<category>日常</category>
			<guid isPermaLink="true">http://blog.asial.co.jp/652</guid>
		</item>
				<item>
			<pubDate>Wed, 13 Jan 2010 16:23:45 +0900</pubDate>
			<title>lsyncdでファイルを同期してみよう</title>
			<link>http://blog.asial.co.jp/651</link>
			<description><![CDATA[ こんにちは、熊谷です。<br />
<br />
最近、複数のサーバでファイルを同期しなければいけないということがありました。出来るだけ手軽で簡単にそれを行いたいということで、何か良い方法がないものか、聞いたり調べたりしたところ、<a href="http://code.google.com/p/lsyncd/">lsyncd</a>なるものがあるのでそれを使用してみるのも良いのではないかと、アドバイスを受けました。<br />
<br />
そんなことで、<a href="http://www.naney.org/diki/d/2009-02-13-lsyncd.html">こちらのサイトを参考</a>に実際に使ってみました。<br />
<br />
例として、同期元は192.168.1.10、同期先は192.168.1.20とします。<br />
<br />
まずは、同期元（192.168.1.10）にてlsyncdをダウンロードしてきてインストールです。makeするなりパッケージを作るなりしてインストールします。<br />
<br />
設定ファイルは/etc/lsyncd.conf.xmlとしてこんな感じで記述しました。<br />
<ol class="boxcode-main no-number"><li>&lt;lsyncd<wbr />&nbsp;version="1"&gt;</li><li><wbr />&nbsp;<wbr />&nbsp;&lt;settings&gt;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;&lt;logfile<wbr />&nbsp;filename="/var/log/lsyncd.log"/&gt;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;&lt;binary<wbr />&nbsp;filename="/usr/bin/rsync"/&gt;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;&lt;pidfile<wbr />&nbsp;filename="/var/run/lsyncd.pid"/&gt;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;&lt;callopts&gt;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;&lt;option<wbr />&nbsp;text="-lt%r"/&gt;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;&lt;exclude-file/&gt;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;&lt;source/&gt;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;&lt;destination/&gt;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;&lt;/callopts&gt;</li><li><wbr />&nbsp;<wbr />&nbsp;&lt;/settings&gt;</li><li><wbr />&nbsp;<wbr />&nbsp;&lt;directory&gt;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;&lt;source<wbr />&nbsp;path="/var/www/project/data"/&gt;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;&lt;target<wbr />&nbsp;path="192.168.1.20::backup"/&gt;</li><li><wbr />&nbsp;<wbr />&nbsp;&lt;/directory&gt;</li><li>&lt;/lsyncd&gt;</li></ol>/var/www/project/data内を同期先（この場合は192.168.1.20）のbackupにコピーするようにします。<br />
<br />
同期先（192.168.1.20）ではrsyncをデーモンとして起動させます。<br />
<br />
rsyncの設定ファイルは/etc/rsyncd.confとしてこんな感じで記述しました。<br />
<ol class="boxcode-main no-number"><li>uid<wbr />&nbsp;=<wbr />&nbsp;hoge</li><li>gid<wbr />&nbsp;=<wbr />&nbsp;developer</li><li>log<wbr />&nbsp;file<wbr />&nbsp;=<wbr />&nbsp;/var/log/rsyncd.log</li><li>pid<wbr />&nbsp;file<wbr />&nbsp;=<wbr />&nbsp;/var/log/rsyncd.pid</li><li></li><li>[backup]<wbr />&nbsp;<wbr />&nbsp;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;comment<wbr />&nbsp;=<wbr />&nbsp;rsync<wbr />&nbsp;backup<wbr />&nbsp;server</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;path<wbr />&nbsp;=<wbr />&nbsp;/var/rsync/backup/</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;hosts<wbr />&nbsp;allow<wbr />&nbsp;=<wbr />&nbsp;192.168.1.10</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;read<wbr />&nbsp;only<wbr />&nbsp;=<wbr />&nbsp;false</li></ol>/var/rsync/backup内にファイルを保存します。<br />
<br />
で、同期元である192.168.1.10にてlsyncdを起動すると、その同期元の指定されたディレクトリ内でファイルの書き込みがあるたび192.168.1.20の指定されたディレクトリにファイルがrsyncされていきます。素晴らしい！<br />
<br />
ちなみに、lsyncdの起動スクリプトはこんな感じに<br />
<ol class="boxcode-main no-number"><li>#!/bin/bash</li><li></li><li>DAEMON=/usr/bin/lsyncd</li><li>USER=root</li><li>NAME=lsyncd</li><li>CONF=/etc/lsyncd.conf.xml</li><li>PID=/var/run/lsyncd.pid</li><li></li><li>case<wbr />&nbsp;"$1"<wbr />&nbsp;in</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;start)</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;echo<wbr />&nbsp;-n<wbr />&nbsp;"Starting<wbr />&nbsp;lsyncd:<wbr />&nbsp;"</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;start-stop-daemon<wbr />&nbsp;--start<wbr />&nbsp;--quiet<wbr />&nbsp;--pidfile<wbr />&nbsp;$PID<wbr />&nbsp;--user<wbr />&nbsp;$USER<wbr />&nbsp;--name<wbr />&nbsp;$NAME<wbr />&nbsp;--startas<wbr />&nbsp;$DAEMON<wbr />&nbsp;--<wbr />&nbsp;--conf=$CONF<wbr />&nbsp;--pidfile<wbr />&nbsp;$PID</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;echo<wbr />&nbsp;""</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;;;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;stop)</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;echo<wbr />&nbsp;-n<wbr />&nbsp;"Stopping<wbr />&nbsp;lsyncd:<wbr />&nbsp;"</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;start-stop-daemon<wbr />&nbsp;--stop<wbr />&nbsp;--quiet<wbr />&nbsp;--pidfile<wbr />&nbsp;$PID<wbr />&nbsp;--user<wbr />&nbsp;$USER<wbr />&nbsp;--name<wbr />&nbsp;$NAME</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;echo<wbr />&nbsp;""</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;;;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;restart)</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;echo<wbr />&nbsp;-n<wbr />&nbsp;"Restarting<wbr />&nbsp;lsyncd:<wbr />&nbsp;"</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;start-stop-daemon<wbr />&nbsp;--stop<wbr />&nbsp;--quiet<wbr />&nbsp;--pidfile<wbr />&nbsp;$PID<wbr />&nbsp;--user<wbr />&nbsp;$USER<wbr />&nbsp;--name<wbr />&nbsp;$NAME</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;start-stop-daemon<wbr />&nbsp;--start<wbr />&nbsp;--quiet<wbr />&nbsp;--pidfile<wbr />&nbsp;$PID<wbr />&nbsp;--user<wbr />&nbsp;$USER<wbr />&nbsp;--name<wbr />&nbsp;$NAME<wbr />&nbsp;--startas<wbr />&nbsp;$DAEMON<wbr />&nbsp;--<wbr />&nbsp;--conf=$CONF<wbr />&nbsp;--pidfile<wbr />&nbsp;$PID</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;echo<wbr />&nbsp;""</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;;;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;*)</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;echo<wbr />&nbsp;"Usage:<wbr />&nbsp;lsyncd<wbr />&nbsp;[<wbr />&nbsp;start<wbr />&nbsp;|<wbr />&nbsp;stop<wbr />&nbsp;|<wbr />&nbsp;restart<wbr />&nbsp;]"</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;exit<wbr />&nbsp;1</li><li>esac</li><li>exit<wbr />&nbsp;$?</li></ol>rsyncの起動スクリプトはこんな感じに<br />
<ol class="boxcode-main no-number"><li>#!/bin/bash</li><li></li><li>DAEMON=/usr/bin/rsync</li><li>USER=root</li><li>NAME=rsyncd</li><li>PID=/var/log/rsyncd.pid</li><li></li><li>case<wbr />&nbsp;"$1"<wbr />&nbsp;in</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;start)</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;echo<wbr />&nbsp;-n<wbr />&nbsp;"Starting<wbr />&nbsp;rsync<wbr />&nbsp;daemon:<wbr />&nbsp;"</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;start-stop-daemon<wbr />&nbsp;--start<wbr />&nbsp;--quiet<wbr />&nbsp;--pidfile<wbr />&nbsp;$PID<wbr />&nbsp;--user<wbr />&nbsp;$USER<wbr />&nbsp;--name<wbr />&nbsp;$NAME<wbr />&nbsp;--startas<wbr />&nbsp;$DAEMON<wbr />&nbsp;--<wbr />&nbsp;--daemon</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;echo<wbr />&nbsp;""</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;;;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;stop)</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;echo<wbr />&nbsp;-n<wbr />&nbsp;"Stopping<wbr />&nbsp;rsync<wbr />&nbsp;daemon:<wbr />&nbsp;"</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;kill<wbr />&nbsp;-9<wbr />&nbsp;`cat<wbr />&nbsp;$PID`</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;rm<wbr />&nbsp;-f<wbr />&nbsp;$PID</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;echo<wbr />&nbsp;""</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;;;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;restart)</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;echo<wbr />&nbsp;-n<wbr />&nbsp;"Restarting<wbr />&nbsp;rsync<wbr />&nbsp;daemon:<wbr />&nbsp;"</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;#start-stop-daemon<wbr />&nbsp;--stop<wbr />&nbsp;--quiet<wbr />&nbsp;--pidfile<wbr />&nbsp;$PID<wbr />&nbsp;--user<wbr />&nbsp;$USER<wbr />&nbsp;--name<wbr />&nbsp;$NAME</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;kill<wbr />&nbsp;-9<wbr />&nbsp;`cat<wbr />&nbsp;$PID`</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;rm<wbr />&nbsp;-f<wbr />&nbsp;$PID</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;start-stop-daemon<wbr />&nbsp;--start<wbr />&nbsp;--quiet<wbr />&nbsp;--pidfile<wbr />&nbsp;$PID<wbr />&nbsp;--user<wbr />&nbsp;$USER<wbr />&nbsp;--name<wbr />&nbsp;$NAME<wbr />&nbsp;--startas<wbr />&nbsp;$DAEMON<wbr />&nbsp;--<wbr />&nbsp;--daemon</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;echo<wbr />&nbsp;""</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;;;</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;*)</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;echo<wbr />&nbsp;"Usage:<wbr />&nbsp;rsync<wbr />&nbsp;[<wbr />&nbsp;start<wbr />&nbsp;|<wbr />&nbsp;stop<wbr />&nbsp;|<wbr />&nbsp;restart<wbr />&nbsp;]"</li><li><wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;<wbr />&nbsp;exit<wbr />&nbsp;1</li><li>esac</li><li>exit<wbr />&nbsp;$?</li></ol>にしてます。使用しているのがdebianなので他のディストリビューションな場合は適宜変更を。<br />
<br />
このように、lsyncdを使用すると実に簡単手軽にファイルの同期をすることが出来るようになります。是非試してみてはいかがでしょうか。 ]]></description>
			<author>熊谷裕志</author>
			<category>Tech</category>
			<guid isPermaLink="true">http://blog.asial.co.jp/651</guid>
		</item>
			</channel>
</rss>