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

<channel>
	<title>エスブレイン &#187; プログラム小技</title>
	<atom:link href="http://www.esbrain.com/category/%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e5%b0%8f%e6%8a%80/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.esbrain.com</link>
	<description>高い技術力・創造力・機動力でお客様のビジネスをさらに加速させます</description>
	<lastBuildDate>Wed, 25 Aug 2010 07:34:27 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.esbrain.com/category/%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e5%b0%8f%e6%8a%80/feed/" />
		<item>
		<title>luaで共有ライブラリを作成する方法</title>
		<link>http://www.esbrain.com/2010/05/lua%e3%81%a7%e5%85%b1%e6%9c%89%e3%83%a9%e3%82%a4%e3%83%96%e3%83%a9%e3%83%aa%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.esbrain.com/2010/05/lua%e3%81%a7%e5%85%b1%e6%9c%89%e3%83%a9%e3%82%a4%e3%83%96%e3%83%a9%e3%83%aa%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/#comments</comments>
		<pubDate>Mon, 24 May 2010 03:33:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Lua]]></category>
		<category><![CDATA[liblua5.1.so]]></category>
		<category><![CDATA[lua]]></category>
		<category><![CDATA[コンパイル]]></category>
		<category><![CDATA[共有ライブラリ]]></category>

		<guid isPermaLink="false">http://www.esbrain.com/?p=748</guid>
		<description><![CDATA[Luaバイナリをソースファイルからコンパイルして作成するとき、
標準では静的ライブラリが生成されます。
通常Luaを組み込み用途で使用するときは静的ライブラリで十分なのですが、
時には共有ライブラリが欲しくなるので、作成 [...]]]></description>
			<content:encoded><![CDATA[<p>Luaバイナリをソースファイルからコンパイルして作成するとき、</p>
<p>標準では静的ライブラリが生成されます。</p>
<p>通常Luaを組み込み用途で使用するときは静的ライブラリで十分なのですが、</p>
<p>時には共有ライブラリが欲しくなるので、作成してみます。</p>
<p>(lua5.1を想定しています)</p>
<blockquote><p>src/Makefileに以下を追加する。</p>
<p>LUA_O=lua.oと書かれた行の下に、以下の行を挿入する。</p>
<p>LUA_SO=liblua5.1.so</p>
<p>次の行の最後に、$(LUA_SO)を追記する。</p>
<p>ALL_T=$(LUA_A) $(LUA_T) $(LUAC_T)</p>
<p>↓</p>
<p>ALL_T=$(LUA_A) $(LUA_T) $(LUAC_T) $(LUA_SO)</p>
<p>clean:と書かれた行の前に、以下の2行を挿入する。</p>
<p>（2行の前後には1行の空行があるようにする）</p>
<div id="_mcePaste">$(LUA_SO): $(CORE_O) $(LIB_O)</div>
<div id="_mcePaste">$(CC) -o $@ -shared $?</div>
<p>保存する。</p>
<p>次にMakefileを下記のように編集する。</p>
<p>TO_LIB= liblua.aとなっている行の最後に liblua5.1.soを追記する。</p>
<p>↓</p>
<p>TO_LIB=liblua.a liblua5.1.so</p></blockquote>
<p>これで、makeするとliblua5.1.soが生成されます。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.esbrain.com/2010/05/lua%e3%81%a7%e5%85%b1%e6%9c%89%e3%83%a9%e3%82%a4%e3%83%96%e3%83%a9%e3%83%aa%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.esbrain.com/2010/05/lua%e3%81%a7%e5%85%b1%e6%9c%89%e3%83%a9%e3%82%a4%e3%83%96%e3%83%a9%e3%83%aa%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/" />
	</item>
		<item>
		<title>ubuntuでICタグ(RFID)読み込み</title>
		<link>http://www.esbrain.com/2010/05/ubuntu%e3%81%a7ic%e3%82%bf%e3%82%b0rfid%e8%aa%ad%e3%81%bf%e8%be%bc%e3%81%bf/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.esbrain.com/2010/05/ubuntu%e3%81%a7ic%e3%82%bf%e3%82%b0rfid%e8%aa%ad%e3%81%bf%e8%be%bc%e3%81%bf/#comments</comments>
		<pubDate>Tue, 18 May 2010 00:43:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[ICカード]]></category>
		<category><![CDATA[PC/SC]]></category>
		<category><![CDATA[RFID]]></category>

		<guid isPermaLink="false">http://www.esbrain.com/?p=743</guid>
		<description><![CDATA[WindowsではPC/SCがありますが、LinuxにもPC/SC Liteというライブラリがあり、非接触ICカード(RFID)にアクセスできます。
準備として、必要なライブラリをインストールします。
ubuntuではp [...]]]></description>
			<content:encoded><![CDATA[<p>WindowsではPC/SCがありますが、LinuxにもPC/SC Liteというライブラリがあり、非接触ICカード(RFID)にアクセスできます。</p>
<p>準備として、必要なライブラリをインストールします。</p>
<p>ubuntuではpcscデーモンは最初からインストールされているようです。</p>
<p>ICカードリーダには、OMNIKEYのCardman5321(USBタイプ)を使ってみます。</p>
<p>OMNIKEYはubuntuのSynapticパッケージに登録されているため、インストールが簡単なのです。</p>
<blockquote><p>sudo apt-get install pcsc-tools pcsc-omnikey</p>
<p>（この時、libpcsc-perlなど関連ライブラリもインストールされます）</p></blockquote>
<p>インストールが終わったら、OMNIKEY Cardman5321をPCのUSB端子に差し込み、以下のコマンドを実行します。</p>
<blockquote><p>sudo /etc/init.d/pcscd stop</p>
<p>sudo /usr/sbin/pcscd -f -a -d</p></blockquote>
<p>pcscデーモンがターミナル上でフォアグラウンド起動し、下記のようなメッセージが表示されます。</p>
<blockquote>
<div id="_mcePaste">00000000 debuglog.c:224:DebugLogSetLevel() debug level=debug</div>
<div id="_mcePaste">00001188 pcscdaemon.c:505:main() pcsc-lite 1.5.3 daemon ready.</div>
<div id="_mcePaste">00250251 hotplug_libusb.c:477:HPAddHotPluggable() Adding USB device: 006:003</div>
<div id="_mcePaste">00000075 readerfactory.c:1024:RFInitializeReader() Attempting startup of OMNIKEY CardMan 5&#215;21 00 00 using /usr/lib/pcsc/drivers/ifdokrfid_lnx-2.6.0.bundle/Contents/Linux/ifdokrfid.so</div>
<div id="_mcePaste">00000513 readerfactory.c:877:RFBindFunctions() Loading IFD Handler 3.0</div>
<div id="_mcePaste">OK OMNIKEY CardMan RFID  IA32 v2.6.0 support@omnikey.com</div>
<div id="_mcePaste">00289502 readerfactory.c:249:RFAddReader() Using the pcscd polling thread</div>
<div id="_mcePaste">00002051 readerfactory.c:1024:RFInitializeReader() Attempting startup of OMNIKEY CardMan 5&#215;21 00 01 using /usr/lib/pcsc/drivers/ifdokrfid_lnx-2.6.0.bundle/Contents/Linux/ifdokrfid.so</div>
<div id="_mcePaste">00000028 readerfactory.c:741:RFLoadReader() Reusing already loaded driver for /usr/lib/pcsc/drivers/ifdokrfid_lnx-2.6.0.bundle/Contents/Linux/ifdokrfid.so</div>
<div id="_mcePaste">00000071 readerfactory.c:877:RFBindFunctions() Loading IFD Handler 3.0</div>
<div id="_mcePaste">OK OMNIKEY CardMan RFID  IA32 v2.6.0 support@omnikey.com</div>
<div id="_mcePaste">00393999 readerfactory.c:385:RFAddReader() Using the pcscd polling thread</div>
<div id="_mcePaste">00385840 Card ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0A 00 16 00 00 00 00 74</div>
<p>00000000 debuglog.c:224:DebugLogSetLevel() debug level=debug00001188 pcscdaemon.c:505:main() pcsc-lite 1.5.3 daemon ready.00250251 hotplug_libusb.c:477:HPAddHotPluggable() Adding USB device: 006:00300000075 readerfactory.c:1024:RFInitializeReader() Attempting startup of OMNIKEY CardMan 5&#215;21 00 00 using /usr/lib/pcsc/drivers/ifdokrfid_lnx-2.6.0.bundle/Contents/Linux/ifdokrfid.so00000513 readerfactory.c:877:RFBindFunctions() Loading IFD Handler 3.0OK OMNIKEY CardMan RFID  IA32 v2.6.0 support@omnikey.com00289502 readerfactory.c:249:RFAddReader() Using the pcscd polling thread00002051 readerfactory.c:1024:RFInitializeReader() Attempting startup of OMNIKEY CardMan 5&#215;21 00 01 using /usr/lib/pcsc/drivers/ifdokrfid_lnx-2.6.0.bundle/Contents/Linux/ifdokrfid.so00000028 readerfactory.c:741:RFLoadReader() Reusing already loaded driver for /usr/lib/pcsc/drivers/ifdokrfid_lnx-2.6.0.bundle/Contents/Linux/ifdokrfid.so00000071 readerfactory.c:877:RFBindFunctions() Loading IFD Handler 3.0OK OMNIKEY CardMan RFID  IA32 v2.6.0 support@omnikey.com00393999 readerfactory.c:385:RFAddReader() Using the pcscd polling thread00385840 Card ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0A 00 16 00 00 00 00 74</p></blockquote>
<p>ちゃんとリーダライタと接続できているようです。</p>
<p>別のターミナルを起動して、以下のコマンドを実行します。</p>
<blockquote><p>pcsc_scan</p></blockquote>
<p>すると下記のようなメッセージが表示されます。</p>
<blockquote><p>PC/SC device scanner</p>
<p>V 1.4.16 (c) 2001-2009, Ludovic Rousseau &lt;ludovic.rousseau@free.fr&gt;</p>
<p>Compiled with PC/SC lite version: 1.5.3</p>
<p>Scanning present readers&#8230;</p>
<p>0: OMNIKEY CardMan 5&#215;21 00 00</p>
<p>1: OMNIKEY CardMan 5&#215;21 00 01</p>
<p>Tue May 18 09:19:21 2010</p>
<p>Reader 0: OMNIKEY CardMan 5&#215;21 00 00</p>
<p>Card state: Card removed,</p>
<p>Tue May 18 09:19:21 2010</p>
<p>Reader 1: OMNIKEY CardMan 5&#215;21 00 01</p>
<p>Card state: Card removed,</p>
<div></div>
</blockquote>
<div>これは、現在カードをリーダライタに載せていない状態です。</div>
<div>カードを載せるとさらにメッセージが表示されます。</div>
<div></div>
<div>
<blockquote>
<div>Tue May 18 09:03:31 2010</div>
<div>Reader 1: OMNIKEY CardMan 5&#215;21 00 01</div>
<div>Card state: Card inserted,</div>
<div>ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0A 00 16 00 00 00 00 74</div>
<div></div>
<div>ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 0A 00 16 00 00 00 00 74</div>
<div>+ TS = 3B &#8211;&gt; Direct Convention</div>
<div>+ T0 = 8F, Y(1): 1000, K: 15 (historical bytes)</div>
<div>TD(1) = 80 &#8211;&gt; Y(i+1) = 1000, Protocol T = 0</div>
<div>&#8212;&#8211;</div>
<div>TD(2) = 01 &#8211;&gt; Y(i+1) = 0000, Protocol T = 1</div>
<div>&#8212;&#8211;</div>
<div>+ Historical bytes: 80 4F 0C A0 00 00 03 06 0A 00 16 00 00 00 00</div>
<div>Category indicator byte: 80 (compact TLV data object)</div>
<div>Tag: 4, len: F (initial access data)</div>
<div>Initial access data: 0C A0 00 00 03 06 0A 00 16 00 00 00 00</div>
<div>+ TCK = 74 (correct checksum)</div>
<div></div>
<div>Possibly identified card (using /usr/share/pcsc/smartcard_list.txt):</div>
<div><span style="white-space: pre;"> </span>NONE</div>
<div></div>
<div>Your card is not present in the database.</div>
<div>You can get the latest version of the database from</div>
<div>http://ludovic.rousseau.free.fr/softwares/pcsc-tools/smartcard_list.txt</div>
<div>or use: wget http://ludovic.rousseau.free.fr/softwares/pcsc-tools/smartcard_list.txt &#8211;output-document=/home/xxx/.smartcard_list.txt</div>
<div></div>
<div>If your ATR is still not in the latest version then please send a mail</div>
<div>to &lt;ludovic.rousseau@free.fr&gt; containing:</div>
<div>- your ATR</div>
<div>- a card description (in english)</div>
<div></div>
<div>Tue May 18 09:06:21 2010</div>
<div>Reader 1: OMNIKEY CardMan 5&#215;21 00 01</div>
<div>Card state: Card removed,</div>
<div>Scanning present readers&#8230;</div>
<div>0: OMNIKEY CardMan 5&#215;21 00 01</div>
<div></div>
</blockquote>
</div>
<div>無事タグのIDが読み込めたようです。</div>
<div>ただし、1つ警告が出ています。</div>
<div>指示に従い下記のコマンドを実行します。</div>
<div></div>
<blockquote>
<div>wget http://ludovic.rousseau.free.fr/softwares/pcsc-tools/smartcard_list.txt &#8211;output-document=/home/xxx/.smartcard_list.txt</div>
<div>※/home/xxxは、自分の環境に合わせてください</div>
<div>もし、ユーザに関係なく反映させるなら、/usr/share/pcsc/smartcard_list.txtを上書きして下さい</div>
<div></div>
</blockquote>
<div>これでpcscデーモンを再起動し、pcsc_scanを実行すると警告もなくなりました。</div>
<div></div>
<div>テストが終わったので、pcscデーモンを起動していたターミナルで、CTRL+Cキーを押して終了し、下記コマンドを実行してデーモンとして起動させます。</div>
<div></div>
<blockquote>
<div>sudo /etc/init.d/pcscd start</div>
<div></div>
</blockquote>
<div>この状態で、pcsc_scanを実行し、無事ICカードの読み取りができればOKです。</div>
<div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.esbrain.com/2010/05/ubuntu%e3%81%a7ic%e3%82%bf%e3%82%b0rfid%e8%aa%ad%e3%81%bf%e8%be%bc%e3%81%bf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.esbrain.com/2010/05/ubuntu%e3%81%a7ic%e3%82%bf%e3%82%b0rfid%e8%aa%ad%e3%81%bf%e8%be%bc%e3%81%bf/" />
	</item>
		<item>
		<title>DoctrineでFatal error: Allowed memory size of ???? bytes exhausted を回避する</title>
		<link>http://www.esbrain.com/2010/04/doctrine%e3%81%a7fatal-error/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.esbrain.com/2010/04/doctrine%e3%81%a7fatal-error/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 06:20:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[プログラム小技]]></category>
		<category><![CDATA[未分類]]></category>
		<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[エラー]]></category>
		<category><![CDATA[メモリ]]></category>

		<guid isPermaLink="false">http://www.esbrain.com/?p=717</guid>
		<description><![CDATA[PHPでDoctrineを多用するようになったら、メモリが足りないというエラーが頻発してきました。
Doctrineそのものが3MBほど使うのは仕方ないとしても、クエリやレコード追加する度に使用メモリが増えつづけるのはい [...]]]></description>
			<content:encoded><![CDATA[<p>PHPでDoctrineを多用するようになったら、メモリが足りないというエラーが頻発してきました。</p>
<p>Doctrineそのものが3MBほど使うのは仕方ないとしても、クエリやレコード追加する度に使用メモリが増えつづけるのはいただけない。</p>
<p>不要メモリ削除にチャレンジしてみました。<br />
まずは、一番簡単な方法。</p>
<blockquote><p>例)<br />
$query = Doctrine_Query::create()<br />
-&gt;from(&#8216;SomeModel&#8217;)<br />
-&gt;where(&#8230;);<br />
$rs = $query-&gt;execute();<br />
&#8230;<br />
// 使用後に、ここで参照を止めてみる<br />
$rs = null;<br />
$query = null;</p></blockquote>
<p>通常はスコープをなくせばいいはずなのに、どんどん使用メモリが増えていきます。</p>
<p>さらに調べると、Doctrine_Recordが生成される際、Doctrine_Table_Repositoryに自分を登録しているではありませんか・・・</p>
<p>Doctrine_Query、Doctrine_Collection、Doctrine_Recordにはfreeメソッドがありました。特にDoctrine_Collectionでは、freeメソッドの引数deepをtrueにすることで、子のDoctrine_Recordのリレーション先のfreeまでやってくれそうです。</p>
<blockquote><p>例)<br />
$query = Doctrine_Query::create()<br />
-&gt;from(&#8216;SomeModel&#8217;)<br />
-&gt;where(&#8230;);<br />
$rs = $query-&gt;execute();<br />
&#8230;<br />
// 使用後に、Repositoryから削除し、参照も止めてみる<br />
$rs-&gt;free(true);<br />
$rs = null;<br />
$query-&gt;free();<br />
$query = null;</p></blockquote>
<p>これで使用メモリは増えなくなり、スッキリしました。</p>
<p>ちなみに、そもそもDoctrine_Table_Repositoryに登録しない設定はないのかとしらべましたが、そんなものはありませんでした。</p>
<p>若干面倒ですが、freeしてnullするしかなさそうです。</p>
<p>（nullは、スコープが外れれば同じことなので、よほどシビアでなければやらなくても良い)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.esbrain.com/2010/04/doctrine%e3%81%a7fatal-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.esbrain.com/2010/04/doctrine%e3%81%a7fatal-error/" />
	</item>
		<item>
		<title>Zend_Formを使う時の注意</title>
		<link>http://www.esbrain.com/2009/10/zend_form%e3%81%a7%e3%80%81filter%e3%82%92%e5%ae%9a%e7%be%a9%e3%81%99%e3%82%8b%e6%99%82%e3%81%ae%e6%b3%a8%e6%84%8f/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.esbrain.com/2009/10/zend_form%e3%81%a7%e3%80%81filter%e3%82%92%e5%ae%9a%e7%be%a9%e3%81%99%e3%82%8b%e6%99%82%e3%81%ae%e6%b3%a8%e6%84%8f/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 07:40:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[プログラム小技]]></category>
		<category><![CDATA[php Zend_Form]]></category>

		<guid isPermaLink="false">http://www.esbrain.com/?p=645</guid>
		<description><![CDATA[Zend_Formはとても便利です。
フォームに関するルーチンワーク（入力フォーム作成、バリデータ定義、確認フォーム作成）を定義ファイル1つに置き換えることができます。
ところが、定義ファイルを少し更新すると、動作がおか [...]]]></description>
			<content:encoded><![CDATA[<p>Zend_Formはとても便利です。</p>
<p>フォームに関するルーチンワーク（入力フォーム作成、バリデータ定義、確認フォーム作成）を定義ファイル1つに置き換えることができます。</p>
<p>ところが、定義ファイルを少し更新すると、動作がおかしくなることがちょくちょくあります。</p>
<p>1つ目はsetElementDecoratorsとsetElementFiltersの使い方。</p>
<p>このメソッドを呼び出すと、個別のエレメントで指定していたデコレータとフィルターが消されます。</p>
<p>よって、下記のような書き方は間違っています。</p>
<blockquote><p>[test]<br />
form.elementFilters.trim = &#8220;StringTrim&#8221;<br />
form.elements.name.options.filters.lower.filter = &#8220;StringToLower&#8221;</p></blockquote>
<p>この場合、StringTrimだけがフィルタとして登録されるので、エレメントごとにデコレータやフィルタが違う場合、すべて個別に指定しましょう。</p>
<p>2つ目は、カスタムフィルタなどフィルタを定義し、そのフィルタコンストラクタにオプションを定義したい時の制限です。</p>
<blockquote><p>[test]<br />
form.elements.name.options.filters.myfilter.filter = &#8220;MyFilter&#8221;<br />
form.elements.name.options.filters.myfilter.filter.options.param2 = &#8220;second option&#8221;<br />
form.elements.name.options.filters.myfilter.filter.options.param1 = &#8220;first option&#8221;</p></blockquote>
<p>カスタムフィルタの定義は上のような形で良いのですが、MyFilterに渡すコンストラクタオプションが、optionsで指定した順番に依存し、</p>
<p>名称は無視されます。したがって、上記の定義例ではMyFilter::__construct($param2, $param1)が呼ばれることになります。</p>
<p>Zend_Form_Elementクラス内の_loadFilterメソッドで、実際にフィルタをロードしているのですが、</p>
<p>インスタンス作成は下記のコードを使用しています。</p>
<pre>
if (empty($filter['options'])) {
  $instance = new $name;
} else {
  $r = new ReflectionClass($name);
  if ($r-&gt;hasMethod('__construct')) {
    $instance = $r-&gt;newInstanceArgs((array) $filter['options']);
  } else {
    $instance = $r-&gt;newInstance();
  }
}
</pre>
<p>このRefrectionClassのnewInstanceArgsメソッドは、引数の配列の順番が、コンストラクタの引数の順番に該当するようになっています。</p>
<p>せっかくRefrectionしているのだから、順番ではなくて引数名をハッシュで指定できれば良いのですが・・・残念。</p>
<p>したがって、filterのオプション定義の場合は、コンストラクタの引数の順番と同じ順序で定義しましょう。</p>
<p>以下の書き方の方が、理解しやすいです。</p>
<blockquote><p>[test]<br />
form.elements.name.options.filters.myfilter.filter = &#8220;MyFilter&#8221;<br />
form.elements.name.options.filters.myfilter.filter.options.1 = &#8220;first option&#8221;<br />
form.elements.name.options.filters.myfilter.filter.options.2 = &#8220;second option&#8221;
</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.esbrain.com/2009/10/zend_form%e3%81%a7%e3%80%81filter%e3%82%92%e5%ae%9a%e7%be%a9%e3%81%99%e3%82%8b%e6%99%82%e3%81%ae%e6%b3%a8%e6%84%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.esbrain.com/2009/10/zend_form%e3%81%a7%e3%80%81filter%e3%82%92%e5%ae%9a%e7%be%a9%e3%81%99%e3%82%8b%e6%99%82%e3%81%ae%e6%b3%a8%e6%84%8f/" />
	</item>
		<item>
		<title>ubuntu9.04+bluetoothでSkype(VAIO typeP&amp;Let&#8217;sNote CF-W7)</title>
		<link>http://www.esbrain.com/2009/09/ubuntu904bluetooth%e3%81%a7skypevaio-typepletsnote-cf-w7/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.esbrain.com/2009/09/ubuntu904bluetooth%e3%81%a7skypevaio-typepletsnote-cf-w7/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 04:02:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[ubuntu 9.04 bluetooth skype vaio type p let's note headset]]></category>

		<guid isPermaLink="false">http://www.esbrain.com/?p=626</guid>
		<description><![CDATA[ubuntuは更新が激しいため、更新の度にAV関係が動かなくなります。
この方法がいつまで使えるか分かりませんので、ご注意を。
(使えなくなったら、またご報告します)
今までSkypeを使うには、pulseAudioを削 [...]]]></description>
			<content:encoded><![CDATA[<p>ubuntuは更新が激しいため、更新の度にAV関係が動かなくなります。</p>
<p>この方法がいつまで使えるか分かりませんので、ご注意を。<br />
(使えなくなったら、またご報告します)</p>
<p>今までSkypeを使うには、pulseAudioを削除し、ALSAaudioを使うのが常識でした。</p>
<p>しかし、Skypeが2.1(beta)にバージョンアップし、pulseAudioが正しく使えるようになっています。</p>
<p>ここでは、pulseAudioでの実行方法を説明します。</p>
<p>VAIO type PとLet&#8217;s Note CF-W7で動作確認しました。</p>
<p>なお、Bluetoothヘッドセットには、Sony DRC-BT15を使いました。</p>
<h2>1.pulseAudio関連パッケージのインストール</h2>
<blockquote>
<ul>
<li>synapticパッケージマネージャを起動します。</li>
<li>「設定」-「リポジトリ」メニューを選択し、ダイアログを表示します。</li>
<li>「サードバーティのソフトウェア」タブを選択します。</li>
<li>[追加]ボタンを押し、次の文字を入力します。</li>
</ul>
<pre class="wrap">deb http://ppa.launchpad.net/themuso/ppa/ubuntu jaunty main
</pre>
<ul>
<li>もう1回[追加]ボタンを押し、次の文字を入力します。</li>
</ul>
<pre class="wrap">deb-src http://ppa.launchpad.net/themuso/ppa/ubuntu jaunty main
</pre>
<ul>
<li>端末画面を開き、以下のコマンドを入力します。</li>
</ul>
<pre class="wrap">sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B88A1AA8
</pre>
<ul>
<li>Synapticのメイン画面の[再読込]ボタンを押します。</li>
<li>[検索]ボタンを押し、pulseと入力して検索します。</li>
<li>リストが表示されますので、下記のものをインストール指定してください。（既にインストールされている物については、そのままにしてください)</li>
</ul>
<ol>
<li>gstreamer0.10-pulseaudio</li>
<li>libasound2-plugins</li>
<li>libgsm1</li>
<li>libpulse-browse0</li>
<li>libpulse-mainloop-glib0</li>
<li>libpulse0</li>
<li>libpulsecore9</li>
<li>padevchooser</li>
<li>paman</li>
<li>paprefs</li>
<li>pavucontrol</li>
<li>pavumeter</li>
<li>pulseaudio</li>
<li>pulseaudio-esound-compat</li>
<li>pulseaudio-module-bluetooth</li>
<li>pulseaudio-module-gconf</li>
<li>pulseaudio-module-hal</li>
<li>pulseaudio-module-x11</li>
<li>pulseaudio-module-zeroconf</li>
<li>pulseaudio-utils</li>
</ol>
<ul>
<li>インストール指定が終わったら、[適用]ボタンを押して、インストールします。</li>
</ul>
</blockquote>
<h2>2.bluemanのインストール</h2>
<p>標準でインストールされているbluez-gnomeは大変使いにくいし、接続できないことが多いのですが、bluemanをインストールすると簡単に接続できて楽です。</p>
<blockquote>
<ul>
<li>Synapticパッケージマネージャを起動します。</li>
<li>pulseaudioでリポジトリを追加した方法と同じやり方で、以下の2つを追加します。</li>
</ul>
<pre class="wrap">deb http://ppa.launchpad.net/blueman/blueman-dailies/ubuntu jaunty main
deb-src http://ppa.launchpad.net/blueman/blueman-dailies/ubuntu jaunty main
</pre>
<ul>
<li>端末を起動し、下記のコマンドを実行します。</li>
</ul>
<pre class="wrap">sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 951DC1E2
</pre>
<ul>
<li>synapticのトップ画面から、[再読込]ボタンを押します。</li>
<li>[検索]ボタンを押し、bluemanと入力して検索します。</li>
<li>bluemanをインストール指定し、[適用]ボタンを押します。</li>
<li>このとき、「bluez-manを削除します。」と言う内容のメッセージが出るので、そのままOKします。</li>
<li>インストールが終わったら、念のためubuntuを再起動します。</li>
</ul>
<p>「念のため再起動」というのは、ubuntuを使うときには重要です。
</p></blockquote>
<h2>3.pulseAudioの設定（１）</h2>
<blockquote>
<ul>
<li>「システム」-「サウンド」メニューを選択します。</li>
<li>イベントの音、楽曲と動画、音声会議をすべてPulseAudioサウンド・サーバに変更します。</li>
<li>サウンドメニューを閉じます。</li>
</ul>
</blockquote>
<h2>4.bluetoothヘッドセットとペアリングします。</h2>
<blockquote>
<ul>
<li>ヘッドセットの電源をいれ、画面右上のbluetoothアイコンをクリックします。</li>
<li>目的のヘッドセットが表示されたら、ペアリングし、信頼設定します。</li>
<li>結合できたら、該当のヘッドセットアイコンを右クリックし、「ヘッドセットサービスを接続」をクリックします。</li>
<li>「成功しました！」というメッセージがステータスウィンドウに表示されれば、完了です。</li>
</ul>
<p>※音楽を聞くのであれば、「A2DPサービスを接続」を選択する方法もあります。
</p></blockquote>
<h2>5.pulseAudioの設定(2)</h2>
<blockquote>
<ul>
<li>「アプリケーション」-「サウンドとビデオ」-「PulseAudioDeviceChooser」を選択します。</li>
<li>画面右上にヘッドフォンジャックのようなアイコンが表示されますので、それをクリックします。</li>
<li>「Manager」をクリックし、ダイアログを表示させます。</li>
<li>Devicesタブをクリックし、SinksやSourcesに接続したヘッドセットが追加されていることを確認します。</li>
<li>画面右上のヘッドフォンジャックアイコンをクリックし、「Volume Control」をクリックします。</li>
<li>「Output Devices」タブをクリックし、ヘッドセットの箇所の右端に「へ」が逆になったアイコンがありますので、クリックし、「default」にチェックをつけます。</li>
<li>「Input Devices」タブをクリックし、ヘッドセットの箇所を同様に「default」にチェックをつけます。</li>
</ul>
</blockquote>
<p>あとは、SkypeのサイトからSkype2.1(beta)をダウンロードしてインストールするだけです。</p>
<p>これで、Skypeを起動すると、ほぼ何も設定せず、通話できます。</p>
<p>ちなみに、ubuntuの再起動の度にbluetoothヘッドセットへの「ヘッドセットサービスを接続」や、InputDevices,OutputDevicesへの「default」チェックは手動で行う必要があります。</p>
<p>また、Skypeで会話ができなくなることがありますので、その時はSkypeを再起動してください。</p>
<p>今までUbuntuでbluetoothやSkypeを使うのはかなり大変でしたが、</p>
<p>やっとその苦労から解放されそうな予感がします。</p>
<p>ちなみに、この設定でビデオやインターネットラジオを聞くと、ちゃんとbluetoothヘッドセットから聞こえます。</p>
<p>bluetoothのA2DPサービスを使ってもビデオやインターネットラジオは聞けますが、Skypeの場合には呼び出し音までしか再生されず、通話音は聞けなくなりましたので、ヘッドセットサービスを使う必要があります。<br />
※使用しているデバイスによるかもしれません</p>
]]></content:encoded>
			<wfw:commentRss>http://www.esbrain.com/2009/09/ubuntu904bluetooth%e3%81%a7skypevaio-typepletsnote-cf-w7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.esbrain.com/2009/09/ubuntu904bluetooth%e3%81%a7skypevaio-typepletsnote-cf-w7/" />
	</item>
		<item>
		<title>VAIO type pでubuntuのカーネルバージョンアップ</title>
		<link>http://www.esbrain.com/2009/08/vaio-type-p-ubuntu-kernel-versionup/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.esbrain.com/2009/08/vaio-type-p-ubuntu-kernel-versionup/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 11:59:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[スタッフブログ]]></category>
		<category><![CDATA[VAIO type p ubuntu 解像度 X]]></category>

		<guid isPermaLink="false">http://www.esbrain.com/?p=622</guid>
		<description><![CDATA[VAIO type pでubuntu9.04にpsbドライバをインストールして快適に動作していたのですが、
最近カーネルをバージョンアップしたところ、Xの起動がうまくできなくなりました。
リカバリモードで起動して、Xの修 [...]]]></description>
			<content:encoded><![CDATA[<p>VAIO type pでubuntu9.04にpsbドライバをインストールして快適に動作していたのですが、</p>
<p>最近カーネルをバージョンアップしたところ、Xの起動がうまくできなくなりました。</p>
<p>リカバリモードで起動して、Xの修復を試みてもダメ。</p>
<p>psbドライバの再インストールをしてみてもダメ。</p>
<p>前のカーネルに戻して起動してもダメ。</p>
<p>結局カーネルの起動スクリプトを直すだけで良かったみたいです。</p>
<p>アップデートマネージャでカーネルを更新させると、/boot/grub/menu.lstで指定しているカーネルオプションが消されてしまうのが問題でした。</p>
<p>修正方法</p>
<blockquote><p>$sudo vi /boot/grub/menu.lst</p>
<p>(自分のパスワード入力)</p>
<p>赤色の部分を追加します</p>
<p>kernel /boot/vmlinuz-2.6.xx-xx-generic root=UUID=xxxxxxxxxxx ro quiet splash <span style="color: #ff0000;">mem=2038M</span></p>
<p>kernel /boot/vmlinuz-2.6.xx-xx-generic root=UUID=xxxxxxxxxxx ro single <span style="color: #ff0000;">mem=2038M</span></p>
<p>viを書き込み終了します。（viでなくてもテキストエディタなら何でもいいです)</p>
<p>$sudo update-grub
</p></blockquote>
<p>これで再起動すれば、見事フル解像度で起動しました。</p>
<p>やれやれ。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.esbrain.com/2009/08/vaio-type-p-ubuntu-kernel-versionup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.esbrain.com/2009/08/vaio-type-p-ubuntu-kernel-versionup/" />
	</item>
		<item>
		<title>VAIO TYPE PにUbuntuインストール (1600&#215;768もOK)</title>
		<link>http://www.esbrain.com/2009/07/vaio-type-p%e3%81%abubuntu%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab-1600x768%e3%82%82ok/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.esbrain.com/2009/07/vaio-type-p%e3%81%abubuntu%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab-1600x768%e3%82%82ok/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 06:29:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Ubuntu VAIO type p 1600x768 インストール]]></category>

		<guid isPermaLink="false">http://www.esbrain.com/?p=585</guid>
		<description><![CDATA[携帯性に優れたVAIO TYPE Pは、ネットブックの本命だと思っておりましたが、
ubuntuとVAIO TYPE Pの相性がイマイチだったため、導入を控えておりました。
ネットを調べても、「8.04なら画面表示はいい [...]]]></description>
			<content:encoded><![CDATA[<p>携帯性に優れたVAIO TYPE Pは、ネットブックの本命だと思っておりましたが、</p>
<p>ubuntuとVAIO TYPE Pの相性がイマイチだったため、導入を控えておりました。</p>
<p>ネットを調べても、「8.04なら画面表示はいいが、ネットにつながらない」とか、</p>
<p>「8.10や9.04ならネットはつながるが、画面表示がダメ」とか・・・</p>
<p>やっと最近問題が解決されたため、満を持して導入しました。</p>
<h5>導入方法</h5>
<p>TYPE Pには光学ドライブがないため、USBスティックにインストールメディアを入れ、<br />
そのスティックからブートさせてUbuntuをインストールすることにしました。<br />
インストール後、グラフィックドライバを更新し、1600&#215;768表示に対応させます。</p>
<h5>準備するもの</h5>
<blockquote>
<ul>
<li>1GB以上のUSBメモリ</li>
<li>インストール用USBメモリを作るためのPC（あれば。　type pでも構いません)</li>
</ul>
</blockquote>
<p>1.Ubuntu9.04のインストールCD用ISOファイルをダウンロードします。</p>
<blockquote><p>日本語を使用される方なら、<a href="http://www.ubuntulinux.jp/">こちら</a>から日本語REMIX版ISOファイルをダウンロードすると楽です。</p></blockquote>
<p>2.netbootinをブートUSBメモリ作成用PCにインストールします。</p>
<blockquote><p><a href="http://unetbootin.sourceforge.net/">こちら</a>のトップにWindows用、Linux用のダウンロードボタンがあるので、適当なものをダウンロードします。<br />
ちなみに、Ubuntuと書いてあるリンクを元にパッケージインストールしたら、「qtライブラリのインストールができない云々」と表示されインストールに失敗しました。<br />
しかし、p7zip-fullをパッケージインストールしておけば、<br />
Linux用のダウンロードbinファイルを実行できます。</p></blockquote>
<p>3.USBスティックをPCに差し込みます。<br />
Windowsならドライブ名、Linuxならデバイス名をgpartedなどで確認しておいてください。(/dev/sdd1など)</p>
<p>4.netbootinを実行します。<br />
ダウンロード済みのUbuntu9.04インストールISOファイルを指定し、インストール先に先のドライブ名（もしくはデバイス名）を選択します。<br />
[OK]ボタンを押すと、USBスティックにブートイメージが書き込まれます。</p>
<h5>インストール編</h5>
<p>1.USBメモリを本体に差し込み、Ubuntu9.04のインストーラを起動します。</p>
<blockquote><p>BIOS設定方法<br />
VAIOの電源を入れ、「VAIO」と表示されたらすかさずF2キーを押します。<br />
BIOS画面が表示されますので、右矢印キーを2回押してBoot設定画面に切り替えます。<br />
「Boot Configuration」中の「External Device Boot」をEnabledに切り替えます。<br />
「Boot Priority」中の「External Device」にカーソルを移動し、F5キーを押してExternal DeviceがInternal Hard Disk Deviceより上になるようにします。<br />
右矢印キーを押して、Exit Setupを選択し、「The system saves the changes and restarts?」という質問に[Yes]を選択します。</p></blockquote>
<p>2.デスクトップにある「インストール」アイコンをクリックします。インストーラが起動します。</p>
<p>3.言語は「日本語」を選択します。</p>
<p>4.「どこにお住まいですか?」や「キーボードレイアウト」はそのまま進みます。</p>
<p>5.「ディスクの準備」では、「それぞれ別のものとしてインストールし、起動時にどれを起動するか選択」を選びます（最初から選ばれています）。<br />
「手動でパーティションを設定する」の下に現在のパーティションを示すバーと、グリグリするスライダーがありますので、Ubuntuに必要なサイズになるよう調整します。<br />
（ちなみに、プリインストールOSが30GBほど使用済みです）</p>
<p>6.後は適当にユーザパスワードなどを設定し、インストールします。</p>
<p>7.20分ほどでインストールが完了しますので、USBスティックを抜いて再起動します。</p>
<h5>1600&#215;768の実現編</h5>
<p>1.システムメニューから「システム」ー「システム管理」ー「Synapticパッケージ・マネージャ」をクリックします。</p>
<p>2.「設定」ー「リポジトリ」メニューをクリックします。</p>
<p>3.「サードパーティのソフトウェア」タブを選択し、[追加]ボタンを押し、下記をそのままコピペします。</p>
<blockquote><p>deb http://ppa.launchpad.net/ubuntu-mobile/ppa/ubuntu jaunty main</p></blockquote>
<p>4.もう一回[追加]ボタンを押し、さらに下記をそのままコピペします。</p>
<blockquote><p>deb-src http://ppa.launchpad.net/ubuntu-mobile/ppa/ubuntu jaunty main</p></blockquote>
<p>5.ダイアログの[閉じる]ボタンをします。</p>
<p>6.システムメニューから「アプリケーション」ー「アクセサリ」ー「端末」をクリックします。</p>
<p>7.端末の画面が表示されたら、以下のコマンドを実行します。</p>
<blockquote><p>sudo apt-key adv &#8211;keyserver keyserver.ubuntu.com &#8211;recv-keys C6598A30</p></blockquote>
<p>8.公開鍵がインストールされたら、Synapticにもどり、[再読込]ボタンをクリックします。</p>
<p>9.「編集」ー「検索」メニューをクリックし、「psb」と入力して検索します。</p>
<p>10.検索結果が表示されたら、最低以下の4つを選択してインストールします。</p>
<blockquote><p>psb-kernel-source<br />
psb-kernel-headers<br />
psb-modules<br />
xserver-xorg-video-psb</p></blockquote>
<p>11.インストールが完了したら再起動します。<br />
が、このままですとXの起動に失敗します。<br />
そこで、GRUBローダの画面では、「recovery mode」を選択して起動します。<br />
画面が表示されたら、「XFIX」を選択してX設定の再初期化を行います。<br />
その後、REBOOTを選択して再起動。</p>
<p>これで、1600&#215;768表示の快適なUbuntu Type Pが完成です。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.esbrain.com/2009/07/vaio-type-p%e3%81%abubuntu%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab-1600x768%e3%82%82ok/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.esbrain.com/2009/07/vaio-type-p%e3%81%abubuntu%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab-1600x768%e3%82%82ok/" />
	</item>
		<item>
		<title>dijitコンテンツをネストしたときにイベントを親に渡したくない</title>
		<link>http://www.esbrain.com/2009/06/dijit%e3%82%b3%e3%83%b3%e3%83%86%e3%83%b3%e3%83%84%e3%82%92%e3%83%8d%e3%82%b9%e3%83%88%e3%81%97%e3%81%9f%e3%81%a8%e3%81%8d%e3%81%ab%e3%82%a4%e3%83%99%e3%83%b3%e3%83%88%e3%82%92%e8%a6%aa%e3%81%ab/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.esbrain.com/2009/06/dijit%e3%82%b3%e3%83%b3%e3%83%86%e3%83%b3%e3%83%84%e3%82%92%e3%83%8d%e3%82%b9%e3%83%88%e3%81%97%e3%81%9f%e3%81%a8%e3%81%8d%e3%81%ab%e3%82%a4%e3%83%99%e3%83%b3%e3%83%88%e3%82%92%e8%a6%aa%e3%81%ab/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 10:46:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[dojo]]></category>

		<guid isPermaLink="false">http://www.esbrain.com/?p=552</guid>
		<description><![CDATA[そんなとき、dojo.stopEvent(event)一発で可能です。 以下、ContentPaneをネストしたときに、onClickイベントを親に渡さない例です。 &#60;html&#62; &#60;head&#62; &#60;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html;charset=UTF-8&#34;/&#62; &#60;style type=&#34;text/css&#34;&#62; @import &#34;/js/dojo/resources/dojo.css&#34;; @import &#34;/js/dijit/themes/tundra/tundra.css&#34;; &#60;/style&#62; &#60;script type=&#34;text/javascript&#34; src=&#34;/js/dojo/dojo.js&#34; djConfig=&#34;parseOnLoad: false, isDebug: true&#34;&#62;&#60;/script&#62; &#60;script type=&#34;text/javascript&#34;&#62; dojo.require(&#34;dojo.parser&#34;); dojo.require(&#34;dijit.layout.BorderContainer&#34;); dojo.require(&#34;dijit.layout.ContentPane&#34;); dojo.addOnLoad(function() { dojo.parser.parse(); }); &#60;/script&#62; &#60;style type=&#34;text/css&#34;&#62; .nest { border: 1px solid #CCCCCC; margin: 5px; } &#60;/style&#62; &#60;/head&#62; &#60;body class=&#34;tundra&#34; id=&#34;body&#34;&#62; &#60;div dojoType=&#34;dijit.layout.BorderContainer&#34; design=&#34;screenDesign&#34; style=&#34;width:100%;height:100%&#34;&#62; &#60;div dojoType=&#34;dijit.layout.ContentPane&#34; region=&#34;center&#34; class=&#34;nest&#34;&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>そんなとき、dojo.stopEvent(event)一発で可能です。</p>
<p>以下、ContentPaneをネストしたときに、onClickイベントを親に渡さない例です。</p>
<pre class="brush: xml;">
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html;charset=UTF-8&quot;/&gt;
&lt;style type=&quot;text/css&quot;&gt;
 @import &quot;/js/dojo/resources/dojo.css&quot;;
 @import &quot;/js/dijit/themes/tundra/tundra.css&quot;;
&lt;/style&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;/js/dojo/dojo.js&quot;
 djConfig=&quot;parseOnLoad: false, isDebug: true&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
 dojo.require(&quot;dojo.parser&quot;);

 dojo.require(&quot;dijit.layout.BorderContainer&quot;);
 dojo.require(&quot;dijit.layout.ContentPane&quot;);

 dojo.addOnLoad(function() {
  dojo.parser.parse();
 });

&lt;/script&gt;
&lt;style type=&quot;text/css&quot;&gt;
.nest {
 border: 1px solid #CCCCCC;
 margin: 5px;
}
&lt;/style&gt;
&lt;/head&gt;
&lt;body class=&quot;tundra&quot; id=&quot;body&quot;&gt;
&lt;div dojoType=&quot;dijit.layout.BorderContainer&quot; design=&quot;screenDesign&quot; style=&quot;width:100%;height:100%&quot;&gt;

&lt;div dojoType=&quot;dijit.layout.ContentPane&quot; region=&quot;center&quot; class=&quot;nest&quot;&gt;
 topのトップ&lt;br/&gt;
 &lt;script type=&quot;dojo/connect&quot; event=&quot;onClick&quot; args=&quot;event&quot;&gt;
  alert(&quot;topのオンクリック&quot;);
 &lt;/script&gt;
 &lt;div dojoType=&quot;dijit.layout.ContentPane&quot; class=&quot;nest&quot;&gt;
  1つネスト
  &lt;script type=&quot;dojo/connect&quot; event=&quot;onClick&quot; args=&quot;event&quot;&gt;
   alert(&quot;1つネストのオンクリック&quot;);
   dojo.stopEvent(event);
  return false;
  &lt;/script&gt;
  &lt;div dojoType=&quot;dijit.layout.ContentPane&quot; class=&quot;nest&quot;&gt;
   2つネスト
   &lt;script type=&quot;dojo/connect&quot; event=&quot;onClick&quot; args=&quot;event&quot;&gt;
    alert(&quot;2つネストのオンクリック&quot;);
    dojo.stopEvent(event);
   return false;
   &lt;/script&gt;
  &lt;/div&gt;
 &lt;/div&gt;
 topのボトム
&lt;/div&gt;

&lt;/div&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.esbrain.com/2009/06/dijit%e3%82%b3%e3%83%b3%e3%83%86%e3%83%b3%e3%83%84%e3%82%92%e3%83%8d%e3%82%b9%e3%83%88%e3%81%97%e3%81%9f%e3%81%a8%e3%81%8d%e3%81%ab%e3%82%a4%e3%83%99%e3%83%b3%e3%83%88%e3%82%92%e8%a6%aa%e3%81%ab/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.esbrain.com/2009/06/dijit%e3%82%b3%e3%83%b3%e3%83%86%e3%83%b3%e3%83%84%e3%82%92%e3%83%8d%e3%82%b9%e3%83%88%e3%81%97%e3%81%9f%e3%81%a8%e3%81%8d%e3%81%ab%e3%82%a4%e3%83%99%e3%83%b3%e3%83%88%e3%82%92%e8%a6%aa%e3%81%ab/" />
	</item>
		<item>
		<title>dijit.Treeが変わってしまった</title>
		<link>http://www.esbrain.com/2009/06/dijittree%e3%81%8c%e5%a4%89%e3%82%8f%e3%81%a3%e3%81%a6%e3%81%97%e3%81%be%e3%81%a3%e3%81%9f/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.esbrain.com/2009/06/dijittree%e3%81%8c%e5%a4%89%e3%82%8f%e3%81%a3%e3%81%a6%e3%81%97%e3%81%be%e3%81%a3%e3%81%9f/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 04:11:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[dojo]]></category>

		<guid isPermaLink="false">http://www.esbrain.com/?p=546</guid>
		<description><![CDATA[久々にdijit.Treeを使ってみたら、FireBug上にエラーが・・・
dijit.Treeにdojo.data.ItemFileWriteStoreなどStoreを直結するのは古いらしい。
Modelというアダプタ [...]]]></description>
			<content:encoded><![CDATA[<p>久々にdijit.Treeを使ってみたら、FireBug上にエラーが・・・</p>
<p>dijit.Treeにdojo.data.ItemFileWriteStoreなどStoreを直結するのは古いらしい。</p>
<p>Modelというアダプタ？を使って、StoreとTreeを接続するのだそうだ。</p>
<p>Modelを調べてみると、dijit.tree.TreeStoreModelとdijit.tree.ForestStoreModelの2種類見つかりました。</p>
<p>TreeStoreModelはルートが1つだけ定義されているStoreに接続するのに対して、</p>
<p>ForestStoreModelはルートが複数あっても良いらしいです。</p>
<p>しかも、dojo1.1系からはStore用のデータがネストノードのものは推奨されないとも記述がありました。</p>
<p>ネストノードの場合、子ノードはユニークになってしまうので、</p>
<p>例えばファイルシステムのエイリアスをStoreで表現できません。</p>
<p>新しい方法では、子ノードの記述にリファレンスIDで指定できるため、ネストノードが要らなくなります。</p>
<p>スマートではありますが、通信用のXMLやJsonデータ自体の可読性は下がります。</p>
<p>将来性を考えると、dojo1.1系に合わせライブラリ作り直し・・・</p>
]]></content:encoded>
			<wfw:commentRss>http://www.esbrain.com/2009/06/dijittree%e3%81%8c%e5%a4%89%e3%82%8f%e3%81%a3%e3%81%a6%e3%81%97%e3%81%be%e3%81%a3%e3%81%9f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.esbrain.com/2009/06/dijittree%e3%81%8c%e5%a4%89%e3%82%8f%e3%81%a3%e3%81%a6%e3%81%97%e3%81%be%e3%81%a3%e3%81%9f/" />
	</item>
		<item>
		<title>Luaの配列展開</title>
		<link>http://www.esbrain.com/2009/06/lua%e3%81%ae%e9%85%8d%e5%88%97%e5%b1%95%e9%96%8b/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=rss</link>
		<comments>http://www.esbrain.com/2009/06/lua%e3%81%ae%e9%85%8d%e5%88%97%e5%b1%95%e9%96%8b/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 11:38:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Lua]]></category>

		<guid isPermaLink="false">http://www.esbrain.com/?p=538</guid>
		<description><![CDATA[前回call_user_func関数の実装を行いました。
かなり便利になったのですが、すぐに1点の曇りが見つかりました。
そう、call_user_funcの場合、引数は直接指定しないといけないのです。
この手の関数を使 [...]]]></description>
			<content:encoded><![CDATA[<p>前回call_user_func関数の実装を行いました。</p>
<p>かなり便利になったのですが、すぐに1点の曇りが見つかりました。</p>
<p>そう、call_user_funcの場合、引数は直接指定しないといけないのです。</p>
<p>この手の関数を使う場面では、引数もあらかじめ配列に格納しておき、呼び出すことが多いのです。</p>
<p>例えば、以下のような関数が定義されていたとします。</p>
<pre class="brush: cpp;">
function funcA(a,b,c)
        print(a,b,c)
end
</pre>
<p>これを普通に呼び出すのは簡単</p>
<pre>
funcA("a", "b", "c")

実行結果
a	b	c
</pre>
<p>しかし、とあるケースではこの引数を配列にしておきたいときがあります。</p>
<pre>
args = {"a", "b", "c"}
</pre>
<p>さて、funcAをどう呼び出すのか?</p>
<pre>
funcA(args)

実行結果
table: 0x806f168	nil	nil
</pre>
<p>当然ですが、第1引数にテーブルの参照が渡っているのです。</p>
<p>お察しのよろしい方は、タイトルでピンとくるでしょう。</p>
<p>そう、unpack関数があるのです。</p>
<pre>
funcA(unpack(args))

実行結果
a	b	c
</pre>
<p>あっという間に解決しました。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.esbrain.com/2009/06/lua%e3%81%ae%e9%85%8d%e5%88%97%e5%b1%95%e9%96%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.esbrain.com/2009/06/lua%e3%81%ae%e9%85%8d%e5%88%97%e5%b1%95%e9%96%8b/" />
	</item>
	</channel>
</rss>
