<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2japanesefull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>岩家ぶろぐ</title>
	
	<link>http://blog.iwa-ya.net</link>
	<description>issmの公私混同的覚え書き．</description>
	<lastBuildDate>Thu, 25 Feb 2010 03:20:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.iwa-ya.net/feed" />
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/issm" /><feedburner:info uri="issm" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>[mac][emacs] ElScreenをタブブラウザちっくに操作するためのキーバインド設定</title>
		<link>http://feedproxy.google.com/~r/issm/~3/6TXzu8Ndn34/121855</link>
		<comments>http://blog.iwa-ya.net/2010/02/25/121855#comments</comments>
		<pubDate>Thu, 25 Feb 2010 03:18:55 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[Macライフ]]></category>
		<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[elisp]]></category>
		<category><![CDATA[emacs]]></category>
		<category><![CDATA[mac]]></category>

		<guid isPermaLink="false">http://blog.iwa-ya.net/?p=2455</guid>
		<description><![CDATA[はじめに
つい先日導入したElScreen，これだけでもEmacsでの作業がかなり快適になってきています．
ところでこのElScreen，「タブ」が上部に表示されてUI（？）の配置がタブブラウザちっくであることも手伝って [...]]]></description>
			<content:encoded><![CDATA[<h3>はじめに</h3>
<p>つい先日導入した<a href="http://www.morishima.net/~naoto/software/elscreen/index.php.ja" title="Fragments of Reality - ElScreen">ElScreen</a>，これだけでもEmacsでの作業がかなり快適になってきています．</p>
<p>ところでこのElScreen，「タブ」が上部に表示されてUI（？）の配置がタブブラウザちっくであることも手伝ってか，「タブ」を切り替える際，ついついタブブラウザのようにキーを操作してしまいますｗ （ちなみに，<a href="http://www.gnu.org/software/screen/" title="GNU Screen - GNU Project - Free Software Foundation">GNU Screen</a>の場合，上部に「タブ」は表示されません，たぶん．）</p>
<p>ということで，ElScreenをタブブラウザちっくに操作できるよう，キーバインドを設定してみました．以下，その辺のメモです．</p>
<p>あ，<kbd>Command</kbd>キーが<kbd>Meta</kbd>キーとして割り当てられていることを前提としていますので，そのあたりは適宜置き換えてください．</p>
<h3>タブブラウザのキーバインド</h3>
<p>MacBookを始めてからはSafariが主になっているので，このキーバインドを．（というか，Macでは，それなりのアプリでこのキーバインドが使えるみたいですね．Thunderbird 3も見習ってほしいところです．．．）</p>
<dl>
<dt>新しいタブ</dt>
<dd><kbd>Command-t</kbd></dd>
<dt>次のタブへ切り替え</dt>
<dd><kbd>Command+}</kbd> または <kbd>Control+Tab</kbd></dd>
<dt>前のタブへ切り替え</dt>
<dd><kbd>Command+{</kbd> または <kbd>Control+Shift+Tab</kbd></dd>
</dl>
<h3>こんな感じに設定</h3>
<p>よくわからないので，グローバルなキーバインドとして設定しましたｗ</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\M</span>-t&quot;</span> 'elscreen-create<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\M</span>-T&quot;</span> 'elscreen-clone<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\M</span>-}&quot;</span> 'elscreen-next<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\M</span>-{&quot;</span> 'elscreen-previous<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>C-tab<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'elscreen-next<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>C-S-tab<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'elscreen-previous<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>ちなみに，<code>elscreen-create</code>で新しいタブを作ると，カレントバッファが<code>*scratch*</code>になり，新しくファイルをオープンするときのパス入力がメンドクなります．<code>elscreen-clone</code>であれば，新しいタブを作る直前にアクティブだったタブのカレントバッファが引き継がれるので，ファイルオープンの際のパス入力が少しラクです．</p>
<p>そんなことから，<kbd>Meta+t</kbd>と<kbd>Meta+T</kbd>の2パタンを割り当てています．</p>
<h3>ついでに設定</h3>
<p>前後のバッファへの切り替えを，<kbd>Meta+n</kbd>，<kbd>Meta+p</kbd>に割り当てました．<kbd>Control-x b</kbd>による切り替えにはもううんざりなのでｗ</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\M</span>-n&quot;</span> 'next-buffer<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\M</span>-p&quot;</span> 'previous-buffer<span style="color: #66cc66;">&#41;</span></pre></div></div>

<h3>参考</h3>
<p>タブキーのキーバインドをどのように表記したらよいかがわからなかったので，以下を参考にしました．</p>
<ul class="links">
<li><a href="http://d.hatena.ne.jp/kobapan/20090429/1259971276" title="Emacs Lisp キーバインドの変更の仕方 - tigre">Emacs Lisp キーバインドの変更の仕方 &#8211; tigre</a></li>
</ul>
<h3>おわりに</h3>
<p>以上，ElScreenをタブブラウザちっくに操作するためのキーバインド設定についてのメモでした．</p>
<p>それでは，ElScreenと快適なキー操作で，ワンランク上のテキストエディットライフをｗ</p>
<h3 class="appendix">おまけ</h3>
<p>これを書いているときにふと気になって検索してみたのが次．</p>
<ul class="links">
<li><a href="http://www.moongift.jp/2009/05/wp-emacs/" title="MOONGIFT: » EmacsでWordPressにポストしたい方は「wp-emacs」:オープンソースを毎日紹介">MOONGIFT: » EmacsでWordPressにポストしたい方は「wp-emacs」:オープンソースを毎日紹介</a></li>
<li><a href="http://code.google.com/p/wp-emacs/" title="wp-emacs - Project Hosting on Google Code">wp-emacs &#8211; Project Hosting on Google Code</a></li>
</ul>
<p>．．．ですが，本家の内容がなくなっちゃってますね orz 気になるツールなのに残念．</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.iwa-ya.net/2010/02/25/121855/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.iwa-ya.net/2010/02/25/121855" />
	<feedburner:origLink>http://blog.iwa-ya.net/2010/02/25/121855</feedburner:origLink></item>
		<item>
		<title>[mac][emacs] Cocoa Emacsを始めるにあたって入れてみた拡張とか.emacsの現状とか</title>
		<link>http://feedproxy.google.com/~r/issm/~3/nWPv35-fU7Y/091647</link>
		<comments>http://blog.iwa-ya.net/2010/02/20/091647#comments</comments>
		<pubDate>Sat, 20 Feb 2010 00:16:47 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[Macライフ]]></category>
		<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[elisp]]></category>
		<category><![CDATA[emacs]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mac]]></category>

		<guid isPermaLink="false">http://blog.iwa-ya.net/?p=2442</guid>
		<description><![CDATA[


はじめに
半年くらい前だったかに使い始めたAquamacs Emacsですが，Ctrl+n，Ctrl+pの押しっぱなしによるカーソルの上下移動がモッサリしていて，イライラさせられてきました．
そんなチリがそれなりに [...]]]></description>
			<content:encoded><![CDATA[<div class="flickr-photo-noresize">
<a href="http://www.flickr.com/photos/issm/4370598231/" title="ss-2010-02-20-01 on Flickr"><img src="http://farm3.static.flickr.com/2757/4370598231_2e7033315a.jpg" alt="ss-2010-02-20-01 on Flickr" title="ss-2010-02-20-01 on Flickr" /></a>
</div>
<h3>はじめに</h3>
<p>半年くらい前だったかに使い始めた<a href="http://aquamacs.org/">Aquamacs Emacs</a>ですが，<kbd>Ctrl+n</kbd>，<kbd>Ctrl+p</kbd>の押しっぱなしによるカーソルの上下移動がモッサリしていて，イライラさせられてきました．</p>
<p>そんなチリがそれなりに積もってきたとか，突然掃除を始めたくなるくらい崖っぷち的精神状態な今日この頃とか．．．そんな背景もあり，以前から存在だけは知っていながら触らずじまいだった<a href="http://macwiki.sourceforge.jp/wiki/index.php/CocoaEmacs">Cocoa Emacs</a>をインストールして使ってみることにしました．</p>
<p>以下，それを機に新しく（話題的には新しくないかと）入れてみた拡張と，それを踏まえた.emacsの現状についての記録です．</p>
<ul class="links">
<li><a href="http://blog.iwa-ya.net/2009/06/21/093100" title="[mac][emacs] Carbon Emacs設定の現状をまとめてみた «  岩家ぶろぐ">[mac][emacs] Carbon Emacs設定の現状をまとめてみた «  岩家ぶろぐ</a></li>
</ul>
<p>かなり間が空いてますが，このエントリの「その後」的な位置づけにでもなりますかね．</p>
<p>なお，相変わらず，Emacs Lispは書けません．変更部分は，「雰囲気」で書いているため，（Emacs）Lispの観点からは外れているかもです．</p>
<h3>インストール</h3>
<p>MacPortsにある「emacs-app @23.1」を入れるのが簡単です．</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% port search emacs
&nbsp;
...
&nbsp;
emacs-app @23.1 (aqua, editors)
The GNU Emacs text editor (Cocoa version)
&nbsp;
...
&nbsp;
% sudo port -d install emacs-app</pre></div></div>

<h3>ファイル置き場</h3>
<p>以前のエントリから学習し，ホームディレクトリ下に「site-lisp」というディレクトリを掘って，そこへ拡張するためのEmacs Lispなファイルを置いています．</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> load-path <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> <span style="color: #ff0000;">&quot;/Users/iwata/site-lisp/&quot;</span> load-path<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> load-path <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> <span style="color: #ff0000;">&quot;/Users/iwata/site-lisp/apel-10.7/&quot;</span> load-path<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> load-path <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> <span style="color: #ff0000;">&quot;/Users/iwata/site-lisp/elscreen-1.4.6/&quot;</span> load-path<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>現状こんな感じです．</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% ls -1 ~/site-lisp
apel-10.7
apel-10.7.tar.gz
elscreen-1.4.6
elscreen-1.4.6.tar.gz
espresso.el
espresso.elc
jaspace.el
jaspace.elc
js2-20090723b.el
js2.elc
yaml-mode-0.0.4.el
yaml-mode-0.0.4x.el
yaml-mode-0.0.4x.elc
yaml-mode.elc
zencoding-mode.el
zencoding-mode.elc
%</pre></div></div>

<h3>zencoding-mode</h3>
<p><span id="more-2442"></span></p>
<div class="flickr-photo-noresize">
<a href="http://www.flickr.com/photos/issm/4371436954/" title="ss-2010-02-20-02 on Flickr"><img src="http://farm3.static.flickr.com/2747/4371436954_fab954b3dc.jpg" alt="ss-2010-02-20-02 on Flickr" title="ss-2010-02-20-02 on Flickr" /></a>
</div>
<p>CSSライクに入力すると，それに対応したHTMLタグなテキストに変換される，というような，HTMLやCSSのコーディングを支援してくれるツール，とでもいいましょうか．そのEmacs Lispでの実装版です．</p>
<blockquote cite="http://code.google.com/p/zen-coding/"><p>
Partial support (&#8220;Expand Abbreviation&#8221; only)</p>
<p>TopStyle, Windows<br />
Sublime Text, Windows<br />
GEdit —	external download, crossplatform<br />
Dreamweaver CS4, Windows, Mac<br />
UltraEdit, Windows<br />
BBEdit/TextWrangler — external download, Mac<br />
Emacs — non-official plugin</p>
<p><cite><a href="http://code.google.com/p/zen-coding/" title="zen-coding -  Project Hosting on Google Code">zen-coding &#8211; Project Hosting on Google Code</a></cite>
</p></blockquote>
<p>公式ではないんですね．</p>
<p>インストールの方法についてはどの拡張も同様なので，（ｒｙ 次のようなものを.emacsに追記します．</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require 'zencoding-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'xml-mode-hook 'zencoding-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'sgml-mode-hook 'zencoding-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'html-mode-hook 'zencoding-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-key zencoding-mode-keymap <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;&lt;C-return&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-key zencoding-mode-keymap <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;&lt;S-return&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'zencoding-expand-line<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>デフォルトでは<kbd>Ctrl+Enter</kbd>ですが，個人的に<kbd>Shift+Enter</kbd>としています．</p>
<h4>参考</h4>
<ul class="links">
<li><a href="http://www.emacswiki.org/emacs/ZenCoding" title="EmacsWiki: Zen Coding">EmacsWiki: Zen Coding</a></li>
<li><a href="http://code.google.com/p/zen-coding/" title="zen-coding -  Project Hosting on Google Code">zen-coding &#8211; Project Hosting on Google Code</a></li>
</ul>
<h3>espresso-mode</h3>
<p>JavaScriptを書く際に重宝している<a href="http://code.google.com/p/js2-mode/" title="js2-mode -  Project Hosting on Google Code">js2-mode</a>ですが，インデントがなかなか残念です．</p>
<blockquote cite="http://d.hatena.ne.jp/speg03/20091011/1255244329"><p>
というのをどうにかして直せないかと探し回って対策を発見。</p>
<p>Editing JavaScript with Emacs ? js2-mode / Projects / Mishoo’s homepage<br />
ほぼ丸パクリでかなり良い感じになりました。多謝。<br />
<cite><a href="http://d.hatena.ne.jp/speg03/20091011/1255244329" title="js2-modeを使いやすくする - speg03の日記">js2-modeを使いやすくする &#8211; speg03の日記</a></cite>
</p></blockquote>
<p>js2-modeに加え，<a href="http://www.nongnu.org/espresso/" title="espresso-mode">espresso-mode</a>を入れてゴニョゴニョすることで，対策ができるようです．</p>
<p>．．．が，まだゴニョゴニョしてません＞＜ ひとまずespresso-modeを入れるだけ入れておきました．今後調整，と．</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>autoload #'espresso-mode <span style="color: #ff0000;">&quot;espresso&quot;</span> <span style="color: #ff0000;">&quot;Start espresso-mode&quot;</span> t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'auto-mode-alist '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.js$&quot;</span> <span style="color: #66cc66;">.</span> espresso-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'auto-mode-alist '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.json$&quot;</span> <span style="color: #66cc66;">.</span> espresso-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<h4>参考</h4>
<ul class="links">
<li><a href="http://www.nongnu.org/espresso/" title="espresso-mode">espresso-mode</a></li>
<li><a href="http://d.hatena.ne.jp/speg03/20091011/1255244329" title="js2-modeを使いやすくする - speg03の日記">js2-modeを使いやすくする &#8211; speg03の日記</a></li>
<li><a href="http://mihai.bazon.net/projects/editing-javascript-with-emacs-js2-mode" title="Editing JavaScript with Emacs — js2-mode / Projects / Mishoo's homepage">Editing JavaScript with Emacs — js2-mode / Projects / Mishoo&#8217;s homepage</a></li>
<li><a href="http://www.tumblr.com/tagged/js2-mode" title="js2-mode | Tumblr">js2-mode | Tumblr</a></li>
</ul>
<h3>ElScreen，APEL</h3>
<p>Emacsを<a href="http://www.gnu.org/software/screen/">GNU Screen</a>っぽく操作できるようにしてくれます．これが動作するには，<a href="http://cvs.m17n.org/elisp/APEL">APEL</a>なるものが必要になるようなので，合わせて入れておきます．</p>
<p>そして次のような記述を加えます．</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> elscreen-prefix-key <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\C</span>-t&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> elscreen-display-tab t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>load <span style="color: #ff0000;">&quot;elscreen&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-key elscreen-map <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\C</span>-t&quot;</span> 'elscreen-toggle<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-key elscreen-map <span style="color: #ff0000;">&quot;t&quot;</span> 'elscreen-toggle<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>個人的に，ターミナルのScreenで「prefix key」を<kbd>Ctrl+t</kbd>としているため，それに合わせています．（デフォルトでは<kbd>Ctrl+z</kbd>に設定されています．）</p>
<h4>参考</h4>
<ul class="links">
<li><a href="http://www.morishima.net/~naoto/software/elscreen/index.php.ja" title="Fragments of Reality - ElScreen">Fragments of Reality &#8211; ElScreen</a></li>
<li><a href="http://cvs.m17n.org/elisp/APEL/" title="APEL">APEL</a></li>
<li><a href="http://d.hatena.ne.jp/hitode909/20091223/1261573371" title=" Emacs23に移行したけど22に戻った - hitode909のダイアリー"> Emacs23に移行したけど22に戻った &#8211; hitode909のダイアリー</a></li>
<li><a href="http://dev.ariel-networks.com/Members/matsuyama/pseudo-screen-on-emacs-with-elscreen-and-term" title="ElScreen と Term で疑似 GNU Screen を作る — ありえるえりあ">ElScreen と Term で疑似 GNU Screen を作る — ありえるえりあ</a></li>
</ul>
<h3>細かな設定いくつか</h3>
<h4>フォント</h4>
<p>Emacs23では，それ以前と比べてフォントの設定方法が異なるようです．現状こんな感じです．</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>set-face-attribute 'default <span style="color: #b1b100;">nil</span>
		    <span style="color: #66cc66;">:</span><span style="color: #555;">family</span> <span style="color: #ff0000;">&quot;Monaco&quot;</span>
		    <span style="color: #808080; font-style: italic;">;:height 120)</span>
		    <span style="color: #66cc66;">:</span><span style="color: #555;">height</span> <span style="color: #cc66cc;">90</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>set-fontset-font <span style="color: #ff0000;">&quot;fontset-default&quot;</span>
		  'japanese-jisx0208
		  '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Osaka&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;iso10646-1&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>set-fontset-font <span style="color: #ff0000;">&quot;fontset-default&quot;</span>
		  'katakana-jisx0201
		  '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Osaka&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;iso10646-1&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> face-font-rescale-alist
      '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;.*Monaco-bold.*&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #cc66cc;">1.0</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;.*Monaco-medium.*&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #cc66cc;">1.0</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;.*Osaka-bold.*&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #cc66cc;">1.2</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;.*Osaka-medium.*&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #cc66cc;">1.2</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;-cdac$&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #cc66cc;">1.4</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<h4>commandキーとoptionキーを入れ替え</h4>
<p>デフォルトでは，Aquamacs Emacs，というかその前使っていたCarbon Emacsですね，とは真逆の役割があてられているために混乱してしまいます．Aquamacs Emacsでは，「Preferences」でその割り当てを変更できたのですが，Cocoa Emacsでは，それをうまく見つけられませんでした．</p>
<p>.emacsでは次のようにすればOKみたいです．</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> ns-command-modifier <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">quote</span> meta<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> ns-alternate-modifier <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">quote</span> super<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<h4>対応するカッコをハイライト</h4>
<p>うっとうしいときもあるけど，やっぱりあった方が安心できます．</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>show-paren-mode <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<h4>カーソルを点滅</h4>
<p>現在位置を見失いにくくする手段の1つとして．</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>blink-cursor-mode t<span style="color: #66cc66;">&#41;</span></pre></div></div>

<h4>スクロールバーを非表示に</h4>
<p>どうせ使わないしｗ</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>set-scroll-bar-mode <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<h4><code>*.psgi</code>や<code>*.t</code>なファイルもcperl-modeに</h4>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> auto-mode-alist <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.psgi$&quot;</span> <span style="color: #66cc66;">.</span> cperl-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> auto-mode-alist<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> auto-mode-alist <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.cgi$&quot;</span> <span style="color: #66cc66;">.</span> cperl-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> auto-mode-alist<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> auto-mode-alist <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.pl$&quot;</span> <span style="color: #66cc66;">.</span> cperl-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> auto-mode-alist<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> auto-mode-alist <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.t$&quot;</span> <span style="color: #66cc66;">.</span> cperl-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> auto-mode-alist<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<h4><code>*.mt</code>なファイルもxml-modeに</h4>
<p>xml-modeにフックされたzencoding-modeももれなくついてきます．</p>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> auto-mode-alist <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.mt$&quot;</span> <span style="color: #66cc66;">.</span> xml-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> auto-mode-alist<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<h4>参考</h4>
<ul class="links">
<li><a href="http://emacs.g.hatena.ne.jp/sakito/20100127" title="CocoaEmacs(Emacs23.1.91 Mac)での等幅フォントの設定例 - とある日の Emacs - Emacsグループ">CocoaEmacs(Emacs23.1.91 Mac)での等幅フォントの設定例 &#8211; とある日の Emacs &#8211; Emacsグループ</a></li>
<li><a href="http://d.hatena.ne.jp/tomoya/20090210/1234297520" title="Cocoa Emacs を MacPorts からインストールしてみた。 - 日々、とんは語る。">Cocoa Emacs を MacPorts からインストールしてみた。 &#8211; 日々、とんは語る。</a></li>
<li><a href="http://dodeka.net/~j2/wp/?p=457" title="じぇっつ どっと ねっと  » Blog Archive   » emacs23 に乗り換えた">じぇっつ どっと ねっと  » Blog Archive   » emacs23 に乗り換えた</a></li>
<li><a href="http://d.hatena.ne.jp/sugyan/20091227/1261860179" title="Cocoa Emacsに移行してみた - すぎゃーんメモ">Cocoa Emacsに移行してみた &#8211; すぎゃーんメモ</a></li>
<li><a href="http://d.hatena.ne.jp/goryugo/20080724/1216830229" title="Carbon Emacs用 .emacs 2008年7月版 - goryugo">Carbon Emacs用 .emacs 2008年7月版 &#8211; goryugo</a></li>
</ul>
<h3>Cocoa Emacsの雑感</h3>
<p>まだほんの数時間程度しか使っていませんが．．．</p>
<p>Aquamacs Emacsと比べると起動が速いですね．ストレスの原因となっていた，<kbd>Ctrl+n</kbd>，<kbd>Ctrl+p</kbd>の押しっぱなしによるカーソルの上下移動についてもサクサク快適です．</p>
<p>逆に気になるところとして，全角スペースや全角括弧，というか，Shiftキーを押しながらの場合，全角による入力できないっぽい，というのがあります．ちなみに，Google IMEを使用しています．他ではどうなんでしょうかね？</p>
<p>また，ベースのEmacsがバージョン23と（大きく？）変わったため，過去のEmacs Lispなファイルをそのまま利用できない場合もあります．バイトコンパイルするものについても警告がいくつも出たりします．（まぁelcなファイルはできるのでとりあえずはいいんですが．．．）</p>
<h3>おわりに</h3>
<p>以上，Cocoa Emacsを使い始めるにあたって，新たに入れた拡張や.emacsファイルの現状について触れてみました．</p>
<p>過去のEmacs Lispの互換性やらキーの入力やらと，気になる部分はいくつかありますが，まぁまずは「レスポンスの快適さ」という，よいところ（他にも必ずあるはず！）を見ていくことにします．</p>
<p>なお，今回のエントリは，このつぶやきが目に入り，「zen coding」というキーワードを検索してみたところからいろいろ始まってしまいましたｗ</p>
<blockquote cite="http://twitter.com/taka0205/status/9338675150"><p>
zen codingを入れてみた。慣れたいなこれ。<br />
<cite><a href="http://twitter.com/taka0205/status/9338675150" title="Twitter / takayuki katsumata: zen codingを入れてみた。慣れたいなこれ。">Twitter / takayuki katsumata: zen codingを入れてみた。慣れたいなこれ。</a></cite>
</p></blockquote>
<h3 class="appendix"><code>.emacs</code>全体</h3>

<div class="wp_syntax"><div class="code"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> load-path <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> <span style="color: #ff0000;">&quot;/Users/iwata/site-lisp/&quot;</span> load-path<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> load-path <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> <span style="color: #ff0000;">&quot;/Users/iwata/site-lisp/apel-10.7/&quot;</span> load-path<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> load-path <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> <span style="color: #ff0000;">&quot;/Users/iwata/site-lisp/elscreen-1.4.6/&quot;</span> load-path<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> inhibit-startup-message t<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; key bindings</span>
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; ¥ではなく\を入力する</span>
<span style="color: #66cc66;">&#40;</span>define-key global-map <span style="color: #66cc66;">&#91;</span>?¥<span style="color: #66cc66;">&#93;</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\C</span>-m&quot;</span> 'newline-and-indent<span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;; bind key Ctrl-H to 'Backspace'</span>
<span style="color: #66cc66;">&#40;</span>load <span style="color: #ff0000;">&quot;term/bobcat&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span>fboundp 'terminal-init-bobcat<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>terminal-init-bobcat<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;; 次の設定の場合，Ctrl-Sによるインクリメンタルサーチ時，</span>
<span style="color: #808080; font-style: italic;">;; ミスしてCtrl-Hすると元のバッファの内容をBackspaceしてしまう</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\C</span>-h&quot;</span> 'backward-delete-char<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; ref: http://d.hatena.ne.jp/sugyan/20091227/1261860179</span>
<span style="color: #808080; font-style: italic;">;; Command-Key and Option-Key</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> ns-command-modifier <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">quote</span> meta<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> ns-alternate-modifier <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">quote</span> super<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; font</span>
<span style="color: #808080; font-style: italic;">;; ref: http://d.hatena.ne.jp/tomoya/20090210/1234297520</span>
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;(when (eq system-type 'darwin)</span>
<span style="color: #808080; font-style: italic;">;  (setq my-font &quot;-*-*-medium-r-normal--9-*-*-*-*-*-fontset-osaka&quot;)</span>
<span style="color: #808080; font-style: italic;">;;;  (setq fixed-width-use-QuickDraw-for-ascii t)</span>
<span style="color: #808080; font-style: italic;">;  (setq mac-allow-anti-aliasing t)</span>
<span style="color: #808080; font-style: italic;">;  (if (= emacs-major-version 22)</span>
<span style="color: #808080; font-style: italic;">;      (require 'carbon-font))</span>
<span style="color: #808080; font-style: italic;">;  (set-default-font my-font)</span>
<span style="color: #808080; font-style: italic;">;  (add-to-list 'default-frame-alist `(font . ,my-font))</span>
<span style="color: #808080; font-style: italic;">;  (when (= emacs-major-version 23)</span>
<span style="color: #808080; font-style: italic;">;    (set-fontset-font</span>
<span style="color: #808080; font-style: italic;">;     (frame-parameter nil 'font)</span>
<span style="color: #808080; font-style: italic;">;     'japanese-jisx0208</span>
<span style="color: #808080; font-style: italic;">;     '(&quot;osaka&quot; . &quot;iso10646-1&quot;))</span>
<span style="color: #808080; font-style: italic;">;    (setq face-font-rescale-alist</span>
<span style="color: #808080; font-style: italic;">;	  '((&quot;^-apple-hiragino.*&quot; . 1.2)</span>
<span style="color: #808080; font-style: italic;">;	    (&quot;.*osaka-bold.*&quot; . 1.2)</span>
<span style="color: #808080; font-style: italic;">;  	    (&quot;.*osaka-medium.*&quot; . 1.2)</span>
<span style="color: #808080; font-style: italic;">;  	    (&quot;.*courier-bold-.*-mac-roman&quot; . 1.0)</span>
<span style="color: #808080; font-style: italic;">;  	    (&quot;.*monaco cy-bold-.*-mac-cyrillic&quot; . 0.9)</span>
<span style="color: #808080; font-style: italic;">;  	    (&quot;.*monaco-bold-.*-mac-roman&quot; . 0.9)</span>
<span style="color: #808080; font-style: italic;">;  	    (&quot;-cdac$&quot; . 1.3)))))</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;;;</span>
<span style="color: #808080; font-style: italic;">;;; ref: http://emacs.g.hatena.ne.jp/sakito/20100127</span>
<span style="color: #808080; font-style: italic;">;;;</span>
<span style="color: #808080; font-style: italic;">;;(create-fontset-from-ascii-font &quot;Menlo-14:weight=normal:slant=normal&quot; nil &quot;menlokakugo&quot;)</span>
<span style="color: #808080; font-style: italic;">;;(set-fontset-font &quot;fontset-menlokakugo&quot;</span>
<span style="color: #808080; font-style: italic;">;;                  'unicode</span>
<span style="color: #808080; font-style: italic;">;;                  (font-spec :family &quot;Hiragino Kaku Gothic ProN&quot; :size 16)</span>
<span style="color: #808080; font-style: italic;">;;                  nil</span>
<span style="color: #808080; font-style: italic;">;;                  'append)</span>
<span style="color: #808080; font-style: italic;">;;(add-to-list 'default-frame-alist '(font . &quot;fontset-menlokakugo&quot;))</span>
<span style="color: #808080; font-style: italic;">;(create-fontset-from-ascii-font &quot;Osaka-9:weight=normal:slant=normal&quot; nil &quot;osaka&quot;)</span>
<span style="color: #808080; font-style: italic;">;(set-fontset-font &quot;fontset-osaka&quot;</span>
<span style="color: #808080; font-style: italic;">;                  'unicode</span>
<span style="color: #808080; font-style: italic;">;                  (font-spec :family &quot;Hiragino Kaku Gothic ProN&quot; :size 12)</span>
<span style="color: #808080; font-style: italic;">;                  nil</span>
<span style="color: #808080; font-style: italic;">;                  'append)</span>
<span style="color: #808080; font-style: italic;">;(add-to-list 'default-frame-alist '(font . &quot;fontset-osaka&quot;))</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; ref: http://dodeka.net/~j2/wp/?p=457p</span>
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #66cc66;">&#40;</span>set-face-attribute 'default <span style="color: #b1b100;">nil</span>
		    <span style="color: #66cc66;">:</span><span style="color: #555;">family</span> <span style="color: #ff0000;">&quot;Monaco&quot;</span>
		    <span style="color: #808080; font-style: italic;">;:height 120)</span>
		    <span style="color: #66cc66;">:</span><span style="color: #555;">height</span> <span style="color: #cc66cc;">90</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>set-fontset-font <span style="color: #ff0000;">&quot;fontset-default&quot;</span>
		  'japanese-jisx0208
		  '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Osaka&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;iso10646-1&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>set-fontset-font <span style="color: #ff0000;">&quot;fontset-default&quot;</span>
		  'katakana-jisx0201
		  '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Osaka&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;iso10646-1&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> face-font-rescale-alist
      '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;.*Monaco-bold.*&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #cc66cc;">1.0</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;.*Monaco-medium.*&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #cc66cc;">1.0</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;.*Osaka-bold.*&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #cc66cc;">1.2</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;.*Osaka-medium.*&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #cc66cc;">1.2</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;-cdac$&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #cc66cc;">1.4</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; window geometry</span>
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;(if window-system (progn</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> initial-frame-alist '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>width <span style="color: #66cc66;">.</span> <span style="color: #cc66cc;">198</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span>height <span style="color: #66cc66;">.</span> <span style="color: #cc66cc;">68</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span>top <span style="color: #66cc66;">.</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span>left <span style="color: #66cc66;">.</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>set-background-color <span style="color: #ff0000;">&quot;Black&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #808080; font-style: italic;">;(set-foreground-color &quot;White&quot;)</span>
  <span style="color: #66cc66;">&#40;</span>set-foreground-color <span style="color: #ff0000;">&quot;Gray92&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>set-cursor-color <span style="color: #ff0000;">&quot;Yellow&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;))</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; title</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> frame-title-format <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;%%f - Emacs@%s&quot;</span> <span style="color: #66cc66;">&#40;</span>system-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; disable making backup files</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> backup-inhibited t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> make-backup-files <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; line cursor</span>
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #66cc66;">&#40;</span>defface hlline-face
  '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>class color<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>background dark<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #808080; font-style: italic;">;;(:background &quot;dark state gray&quot;))</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">background</span> <span style="color: #ff0000;">&quot;gray10&quot;</span>
		  <span style="color: #66cc66;">:</span><span style="color: #555;">underline</span> <span style="color: #ff0000;">&quot;gray32&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>class color<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>background light<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">background</span> <span style="color: #ff0000;">&quot;ForestGreen&quot;</span>
		  <span style="color: #66cc66;">:</span><span style="color: #555;">underline</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;*Face used by hl-line.&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> hl-line-face 'hlline-face<span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;;(setq hl-line-face 'underline)</span>
<span style="color: #66cc66;">&#40;</span>global-hl-line-mode<span style="color: #66cc66;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; ref: http://d.hatena.ne.jp/sugyan/20091227/1261860179</span>
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">; カーソルの点滅</span>
<span style="color: #66cc66;">&#40;</span>blink-cursor-mode t<span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">; カーソルの位置が何文字目かを表示する</span>
<span style="color: #66cc66;">&#40;</span>column-number-mode t<span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">; スクロールバーを消す</span>
<span style="color: #66cc66;">&#40;</span>set-scroll-bar-mode <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; ref: http://d.hatena.ne.jp/goryugo/20080724/1216830229</span>
<span style="color: #808080; font-style: italic;">;; 括弧の対応をハイライト.</span>
<span style="color: #66cc66;">&#40;</span>show-paren-mode <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; cperl-mode</span>
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> auto-mode-alist <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.psgi$&quot;</span> <span style="color: #66cc66;">.</span> cperl-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> auto-mode-alist<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> auto-mode-alist <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.cgi$&quot;</span> <span style="color: #66cc66;">.</span> cperl-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> auto-mode-alist<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> auto-mode-alist <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.pl$&quot;</span> <span style="color: #66cc66;">.</span> cperl-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> auto-mode-alist<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> auto-mode-alist <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.t$&quot;</span> <span style="color: #66cc66;">.</span> cperl-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> auto-mode-alist<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; xml-mode</span>
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> auto-mode-alist <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.html$&quot;</span> <span style="color: #66cc66;">.</span> xml-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> auto-mode-alist<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> auto-mode-alist <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.tpl$&quot;</span> <span style="color: #66cc66;">.</span> xml-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> auto-mode-alist<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;; Text::MicroTemplate</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> auto-mode-alist <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.mt$&quot;</span> <span style="color: #66cc66;">.</span> xml-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> auto-mode-alist<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; zencoding-mode</span>
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #66cc66;">&#40;</span>require 'zencoding-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'xml-mode-hook 'zencoding-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'sgml-mode-hook 'zencoding-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'html-mode-hook 'zencoding-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-key zencoding-mode-keymap <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;&lt;C-return&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-key zencoding-mode-keymap <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;&lt;S-return&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'zencoding-expand-line<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; yaml-mode</span>
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #66cc66;">&#40;</span>autoload 'yaml-mode <span style="color: #ff0000;">&quot;yaml-mode&quot;</span> <span style="color: #b1b100;">nil</span> t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'auto-mode-alist '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.yml$&quot;</span> <span style="color: #66cc66;">.</span> yaml-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'auto-mode-alist '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.yaml$&quot;</span> <span style="color: #66cc66;">.</span> yaml-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; espresso-mode</span>
<span style="color: #66cc66;">&#40;</span>autoload #'espresso-mode <span style="color: #ff0000;">&quot;espresso&quot;</span> <span style="color: #ff0000;">&quot;Start espresso-mode&quot;</span> t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'auto-mode-alist '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.js$&quot;</span> <span style="color: #66cc66;">.</span> espresso-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'auto-mode-alist '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.json$&quot;</span> <span style="color: #66cc66;">.</span> espresso-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; js2-mode</span>
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #66cc66;">&#40;</span>autoload 'js2-mode <span style="color: #ff0000;">&quot;js2&quot;</span> <span style="color: #b1b100;">nil</span> t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'auto-mode-alist '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.js$&quot;</span> <span style="color: #66cc66;">.</span> js2-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'auto-mode-alist '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.json$&quot;</span> <span style="color: #66cc66;">.</span> js2-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;; http://8-p.info/emacs-javascript.html</span>
<span style="color: #808080; font-style: italic;">;(setq-default c-basic-offset 4)</span>
<span style="color: #808080; font-style: italic;">;</span>
<span style="color: #808080; font-style: italic;">;(when (load &quot;js2&quot; t)</span>
<span style="color: #808080; font-style: italic;">;  (setq js2-cleanup-whitespace nil</span>
<span style="color: #808080; font-style: italic;">;	js2-mirror-mode nil</span>
<span style="color: #808080; font-style: italic;">;	js2-bounce-indent-flag nil)</span>
<span style="color: #808080; font-style: italic;">;</span>
<span style="color: #808080; font-style: italic;">;  (defun indent-and-back-to-indentation ()</span>
<span style="color: #808080; font-style: italic;">;    (interactive)</span>
<span style="color: #808080; font-style: italic;">;    (indent-for-tab-command)</span>
<span style="color: #808080; font-style: italic;">;    (let ((point-of-indentation</span>
<span style="color: #808080; font-style: italic;">;	   (save-excursion</span>
<span style="color: #808080; font-style: italic;">;	     (back-to-indentation)</span>
<span style="color: #808080; font-style: italic;">;	     (point))))</span>
<span style="color: #808080; font-style: italic;">;      (skip-chars-forward &quot;\s &quot; point-of-indentation)))</span>
<span style="color: #808080; font-style: italic;">;</span>
<span style="color: #808080; font-style: italic;">;      (define-key js2-mode-map &quot;\C-i&quot; 'indent-and-back-to-indentation)</span>
<span style="color: #808080; font-style: italic;">;      (define-key js2-mode-map &quot;\C-m&quot; nil))</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; jaspace-mode</span>
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #66cc66;">&#40;</span>require 'jaspace<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'fundamental-mode-hook 'jaspace-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'js2-mode-hook 'jaspace-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'yaml-mode-hook 'jaspace-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'perl-mode-hook 'jaspace-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'cperl-mode-hook 'jaspace-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'python-mode-hook 'jaspace-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'ruby-mode-hook 'jaspace-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'php-mode-hook 'jaspace-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'xml-mode-hook 'jaspace-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'html-mode-hook 'jaspace-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'sgml-mode-hook 'jaspace-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'text-mode-hook 'jaspace-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'tt-mode-hook 'jaspace-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;(when (require 'jaspace nil t)</span>
<span style="color: #808080; font-style: italic;">;  (when jaspace-modes (append jaspace-modes</span>
<span style="color: #808080; font-style: italic;">;			      (list 'lisp-mode</span>
<span style="color: #808080; font-style: italic;">;				    'yaml-mode</span>
<span style="color: #808080; font-style: italic;">;				    'perl-mode</span>
<span style="color: #808080; font-style: italic;">;				    'cperl-mode</span>
<span style="color: #808080; font-style: italic;">;				    'js2-mode</span>
<span style="color: #808080; font-style: italic;">;				    'javascript-mode</span>
<span style="color: #808080; font-style: italic;">;				    'python-mode</span>
<span style="color: #808080; font-style: italic;">;				    'ruby-mode</span>
<span style="color: #808080; font-style: italic;">;				    'php-mode</span>
<span style="color: #808080; font-style: italic;">;				    'xml-mode</span>
<span style="color: #808080; font-style: italic;">;				    'html-mode</span>
<span style="color: #808080; font-style: italic;">;				    'css-mode</span>
<span style="color: #808080; font-style: italic;">;				    'text-mode</span>
<span style="color: #808080; font-style: italic;">;				    'tt-mode</span>
<span style="color: #808080; font-style: italic;">;				    'fundamental-mode</span>
<span style="color: #808080; font-style: italic;">;				    ))))</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">boundp</span> 'jaspace-alternate-jaspace-string<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> jaspace-alternate-jaspace-string <span style="color: #ff0000;">&quot;□&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">boundp</span> 'jaspace-highlight-tabs<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> jaspace-highlight-tabs ?<span style="color: #66cc66;">^</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">; 以下の4行，emacs23にてエラーが出る</span>
<span style="color: #808080; font-style: italic;">;(add-hook 'jaspace-mode-off-hook</span>
<span style="color: #808080; font-style: italic;">;	  (lambda()</span>
<span style="color: #808080; font-style: italic;">;	    (when (boundp 'show-trailing-whitespace)</span>
<span style="color: #808080; font-style: italic;">;	      (setq show-trailing-whitespace nil)</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'jaspace-mode-hook
	  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
	    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">progn</span>
	      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">boundp</span> 'show-trailing-whitespace<span style="color: #66cc66;">&#41;</span>
		<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> show-trailing-whitespace t<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	      <span style="color: #66cc66;">&#40;</span>face-spec-<span style="color: #b1b100;">set</span> 'jaspace-highlight-jaspace-face
			     '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>class color<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>background light<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
				<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;blue&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
			       <span style="color: #808080; font-style: italic;">;;(t (:foreground &quot;green&quot;))))</span>
			       <span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;gray64&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	      <span style="color: #66cc66;">&#40;</span>face-spec-<span style="color: #b1b100;">set</span> 'jaspace-highlight-tab-face
			     '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>class color<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>background light<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
				<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;red&quot;</span>
					     <span style="color: #66cc66;">:</span><span style="color: #555;">background</span> <span style="color: #ff0000;">&quot;unspecified&quot;</span>
					     <span style="color: #66cc66;">:</span><span style="color: #555;">strike-through</span> <span style="color: #b1b100;">nil</span>
					     <span style="color: #66cc66;">:</span><span style="color: #555;">underline</span> t<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
			       <span style="color: #808080; font-style: italic;">;;(t (:foreground &quot;purple&quot;</span>
			       <span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;gray32&quot;</span>
					       <span style="color: #66cc66;">:</span><span style="color: #555;">background</span> <span style="color: #ff0000;">&quot;unspecified&quot;</span>
					       <span style="color: #66cc66;">:</span><span style="color: #555;">strike-through</span> <span style="color: #b1b100;">nil</span>
					       <span style="color: #66cc66;">:</span><span style="color: #555;">underline</span> t<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	      <span style="color: #66cc66;">&#40;</span>face-spec-<span style="color: #b1b100;">set</span> 'trailing-whitespace
			     '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>class color<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>background light<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
				 <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;red&quot;</span>
					      <span style="color: #66cc66;">:</span><span style="color: #555;">background</span> <span style="color: #ff0000;">&quot;unspecified&quot;</span>
					      <span style="color: #66cc66;">:</span><span style="color: #555;">strike-through</span> <span style="color: #b1b100;">nil</span>
					      <span style="color: #66cc66;">:</span><span style="color: #555;">underline</span> t<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
			       <span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;purple&quot;</span>
			       <span style="color: #808080; font-style: italic;">;;(t (:foreground &quot;gray16&quot;</span>
						<span style="color: #66cc66;">:</span><span style="color: #555;">background</span> <span style="color: #ff0000;">&quot;unspecified&quot;</span>
						<span style="color: #66cc66;">:</span><span style="color: #555;">strike-through</span> <span style="color: #b1b100;">nil</span>
						<span style="color: #66cc66;">:</span><span style="color: #555;">underline</span> t<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; elscreen</span>
<span style="color: #808080; font-style: italic;">;;   ref: http://dev.ariel-networks.com/Members/matsuyama/pseudo-screen-on-emacs-with-elscreen-and-term</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> elscreen-prefix-key <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\C</span>-t&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> elscreen-display-tab t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>load <span style="color: #ff0000;">&quot;elscreen&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-key elscreen-map <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\C</span>-t&quot;</span> 'elscreen-toggle<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-key elscreen-map <span style="color: #ff0000;">&quot;t&quot;</span> 'elscreen-toggle<span style="color: #66cc66;">&#41;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.iwa-ya.net/2010/02/20/091647/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.iwa-ya.net/2010/02/20/091647" />
	<feedburner:origLink>http://blog.iwa-ya.net/2010/02/20/091647</feedburner:origLink></item>
		<item>
		<title>[perl][cpan] DBIモジュールのfetchall_hashrefメソッドをいじってHash::MultiValueオブジェクトを返すようにしてみた</title>
		<link>http://feedproxy.google.com/~r/issm/~3/YqmIQEjr6Ns/192601</link>
		<comments>http://blog.iwa-ya.net/2010/02/18/192601#comments</comments>
		<pubDate>Thu, 18 Feb 2010 10:26:01 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[cpan]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://blog.iwa-ya.net/?p=2425</guid>
		<description><![CDATA[はじめに
O/Rマッパを勉強せず，いまだにDBIのオレオレラッピングなモジュールでデータベースをさわっているissmです．
現状では，DBIモジュールのfetchall_arrayrefやfetchall_hashref [...]]]></description>
			<content:encoded><![CDATA[<h3>はじめに</h3>
<p>O/Rマッパを勉強せず，いまだにDBIのオレオレラッピングなモジュールでデータベースをさわっているissmです．</p>
<p>現状では，DBIモジュールの<code>fetchall_arrayref</code>や<code>fetchall_hashref</code>を（ラップしたものを）使ってデータを取得したりしています．で，その取得したデータを他で使いやすいように加工して云々．．．ということをしています．その「加工」が毎回メンドイんですね．（日々効率化を心がけているつもりではありますが＞＜）</p>
<p>そんなことから今回，最近かじった<a href="http://search.cpan.org/perldoc?Hash::MultiValue">Hash::MultiValue</a>を使ってアドホックな対策をしてみたので，以下，その記録です．</p>
<p>なお，DBIモジュールのバージョンは1.609，Hash::Multivalueのバージョンは0.07（0.08出てるけど）です．</p>
<h3>現状</h3>
<p>SQLなテキストをまとめたものをYAMLファイルとして外部化し（「SQLライブラリ」と呼んでます．参考：「<a href="http://www.amazon.co.jp/gp/product/4798119172?ie=UTF8&#038;tag=issm-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=4798119172">モダンPerl入門</a><img src="http://www.assoc-amazon.jp/e/ir?t=issm-22&#038;l=as2&#038;o=9&#038;a=4798119172" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />」p.83），DBIモジュールをラップしたオレオレモジュール的なものを使って読み込み，データベースに投げています．</p>
<h4>SQLライブラリ</h4>
<p>SQLライブラリは次のような感じです．</p>

<div class="wp_syntax"><div class="code"><pre class="yaml" style="font-family:monospace;"># shop.yml - SQLライブラリ的なYAMLファイル
---
get__select: |
  SELECT shop_id id, shop_No
       , code, name, flg_suspend
    FROM %%shop  /* 「%%」は適当なテーブル接頭辞に置換 */
    WHERE flg_del = 0
    ORDER BY shop_No ASC
&nbsp;
add__insert: |
  INSERT INTO %%shop ...
  ...</pre></div></div>

<h4><code>fetchall_arrayref</code>をラップ</h4>
<p>先のSQLを読み込んでデータベースに投げ，間接的に<code>fetchall_arrayref</code>メソッドを呼ぶことで，結果をリストリファレンスで取得しています．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$list</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$_dsh</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">q</span><span style="color: #009900;">&#40;</span>     <span style="color: #666666; font-style: italic;"># $_dsh: DBIのラッパ的なもの</span>
    <span style="color: #ff0000;">'shop::get__select'</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;"># shop.ymlの「get__select」をロード</span>
    <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>                  <span style="color: #666666; font-style: italic;"># バインド値はなし</span>
    <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>                  <span style="color: #666666; font-style: italic;"># リストリファレンスで取得</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066;">print</span> <span style="color: #000066;">dump</span> <span style="color: #0000ff;">$list</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;"># use Data::Dump qw/dump/;</span></pre></div></div>

<p><var>$list</var>の内容は次のような感じになります．</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">[
  [&quot;roisxgdpraisxCeb&quot;, 1, &quot;test1&quot;, &quot;\x{30C6}\x{30B9}\x{30C8}1&quot;, 0],
  [&quot;rpisxlbrryisxqAs&quot;, 2, &quot;test2&quot;, &quot;\x{30C6}\x{30B9}\x{30C8}2&quot;, 0],
  [&quot;rpisxDgqrsisxqas&quot;, 3, &quot;test3&quot;, &quot;\x{30C6}\x{30B9}\x{30C8}3&quot;, 0],
  [&quot;shisxwrpssisxKwD&quot;, 4, &quot;test4&quot;, &quot;\x{30C6}\x{30B9}\x{30C8}4&quot;, 0],
  [&quot;rxisxvDlrJisxAey&quot;, 5, &quot;test5&quot;, &quot;\x{30C6}\x{30B9}\x{30C8}5&quot;, 0],
]</pre></div></div>

<h4><code>fetchall_hashref</code>をラップ</h4>
<p>間接的に<code>fetchall_hashref</code>メソッドを呼ぶ場合は次のような感じです．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$list</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$_dsh</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">q</span><span style="color: #009900;">&#40;</span>     <span style="color: #666666; font-style: italic;"># $_dsh: DBIのラッパ的なもの</span>
    <span style="color: #ff0000;">'shop::get__select'</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;"># shop.ymlの「get__select」をロード</span>
    <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>                  <span style="color: #666666; font-style: italic;"># バインド値はなし</span>
    <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>                  <span style="color: #666666; font-style: italic;"># ハッシュリファレンスで取得</span>
    <span style="color: #ff0000;">'id'</span><span style="color: #339933;">,</span>                <span style="color: #666666; font-style: italic;"># キーを「id」にセット</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066;">print</span> <span style="color: #000066;">dump</span> <span style="color: #0000ff;">$list</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;"># use Data::Dump qw/dump/;</span></pre></div></div>

<p><var>$list</var>は次のような感じのものが得られます．</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">{
  roisxgdpraisxCeb =&gt; {
                        code =&gt; &quot;test1&quot;,
                        flg_suspend =&gt; 0,
                        id =&gt; &quot;roisxgdpraisxCeb&quot;,
                        name =&gt; &quot;\x{30C6}\x{30B9}\x{30C8}1&quot;,
                        shop_No =&gt; 1,
                      },
  rpisxDgqrsisxqas =&gt; {
                        code =&gt; &quot;test3&quot;,
                        flg_suspend =&gt; 0,
                        id =&gt; &quot;rpisxDgqrsisxqas&quot;,
                        name =&gt; &quot;\x{30C6}\x{30B9}\x{30C8}3&quot;,
                        shop_No =&gt; 3,
                      },
  rpisxlbrryisxqAs =&gt; {
                        code =&gt; &quot;test2&quot;,
                        flg_suspend =&gt; 0,
                        id =&gt; &quot;rpisxlbrryisxqAs&quot;,
                        name =&gt; &quot;\x{30C6}\x{30B9}\x{30C8}2&quot;,
                        shop_No =&gt; 2,
                      },
  rxisxvDlrJisxAey =&gt; {
                        code =&gt; &quot;test5&quot;,
                        flg_suspend =&gt; 0,
                        id =&gt; &quot;rxisxvDlrJisxAey&quot;,
                        name =&gt; &quot;\x{30C6}\x{30B9}\x{30C8}5&quot;,
                        shop_No =&gt; 5,
                      },
  shisxwrpssisxKwD =&gt; {
                        code =&gt; &quot;test4&quot;,
                        flg_suspend =&gt; 0,
                        id =&gt; &quot;shisxwrpssisxKwD&quot;,
                        name =&gt; &quot;\x{30C6}\x{30B9}\x{30C8}4&quot;,
                        shop_No =&gt; 4,
                      },
}</pre></div></div>

<h4>加工がメンドイ</h4>
<p>得られたデータをテンプレートでも利用しやすいように，もう少し加工してあげたいところです．個人的には，「ハッシュリファレンスのリスト（リファレンス）」がいちばん扱いやすいんでないかな，と考えてます．</p>
<p>前者（arrayref）の場合，SQLでの「ORDER」どおりの順序ではありますが，それぞれの要素において，どのカラムがどの値なのか，ということを，リストの「位置」で把握する必要があります．データベースの構成に変更があれば，それに伴って「位置」も把握し直さなければなりません．各要素をハッシュリファレンスに置き換えるには，何らかの方法で，「カラム名の集合」を準備し，対応づける処理が必要になります．</p>
<p>後者（hashref）の場合，各カラムをハッシュのキーとして参照することができますが，ハッシュの特性上，<code>keys</code>とか<code>values</code>とかして得られるリストの順序が，SQLで指定したとおりになる保証がありません．<code>sort</code>すればOKではありますが，まぁ二度手間ですね．SQLで指定したORDERはなんだったの？</p>
<p>．．．とまぁ，そんなメンドイ加工を毎回しているわけです＞＜</p>
<h3>Hash::MultiValueをかじって</h3>
<p><span id="more-2425"></span></p>
<p>で，<a href="http://blog.iwa-ya.net/2010/02/11/193810">先日のエントリ</a>で<a href="http://bulknews.typepad.com/">miyagawaさん</a>にご指摘をいただいてから，<a href="http://blog.iwa-ya.net/2010/02/12/080259">Hash::MultiValue</a>をかじってみているわけですが，そこでのひとりごと：</p>
<blockquote cite="http://twitter.com/issm/status/8962937150"><p>
Hash::MultiValueって，「順序のあるハッシュ」としても使えるのかな．<br />
<cite><a href="http://twitter.com/issm/status/8962937150" title="Twitter / IWATA, Susumu : Hash::MultiValueって，「順序のあるハ ...">Twitter / IWATA, Susumu : Hash::MultiValueって，「順序のあるハ &#8230;</a></cite>
</p></blockquote>
<p>に対して，次のようなレスポンスをいただけました．</p>
<blockquote cite="http://twitter.com/miyagawa/status/8976157197"><p>
@issm つかえます＞Hash::MultiValue<br />
<cite><a href="http://twitter.com/miyagawa/status/8976157197" title="Twitter / Tatsuhiko Miyagawa: @issm つかえます＞Hash::MultiValue">Twitter / Tatsuhiko Miyagawa: @issm つかえます＞Hash::MultiValue</a></cite>
</p></blockquote>
<p>．．．そんなわけで，Hash::Valueのこの特徴を利用して，先の不満を解決できるか試してみました．</p>
<h3><code>fetchall_hmv</code>（仮）を追加してみた</h3>
<p>DBIモジュールの内部にHash::MultiValueオブジェクトを返すための<code>fetchall_hmv</code>というメソッドを新たに追加し（ソースコードは後ほど），先の<code>fetchall_hashref</code>を呼び出す部分をこれに置き換えてみました．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$list</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$_dsh</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">q</span><span style="color: #009900;">&#40;</span>     <span style="color: #666666; font-style: italic;"># $_dsh: DBIのラッパ的なもの</span>
    <span style="color: #ff0000;">'shop::get__select'</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;"># shop.ymlの「get__select」をロード</span>
    <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>                  <span style="color: #666666; font-style: italic;"># バインド値はなし</span>
    <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>                  <span style="color: #666666; font-style: italic;"># Hash::MultiValueオブジェクトとして取得</span>
    <span style="color: #ff0000;">'id'</span><span style="color: #339933;">,</span>                <span style="color: #666666; font-style: italic;"># キーを「id」にセット</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066;">print</span> <span style="color: #000066;">dump</span> <span style="color: #0000ff;">$list</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;"># use Data::Dump qw/dump/;</span></pre></div></div>

<p><var>$list</var>を<code>dump</code>してみると次のようになります．Hash::MultiValueオブジェクトですね．</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">bless({
  roisxgdpraisxCeb =&gt; {
                        code =&gt; &quot;test1&quot;,
                        flg_suspend =&gt; 0,
                        id =&gt; &quot;roisxgdpraisxCeb&quot;,
                        name =&gt; &quot;\x{30C6}\x{30B9}\x{30C8}1&quot;,
                        shop_No =&gt; 1,
                      },
  rpisxDgqrsisxqas =&gt; {
                        code =&gt; &quot;test3&quot;,
                        flg_suspend =&gt; 0,
                        id =&gt; &quot;rpisxDgqrsisxqas&quot;,
                        name =&gt; &quot;\x{30C6}\x{30B9}\x{30C8}3&quot;,
                        shop_No =&gt; 3,
                      },
  rpisxlbrryisxqAs =&gt; {
                        code =&gt; &quot;test2&quot;,
                        flg_suspend =&gt; 0,
                        id =&gt; &quot;rpisxlbrryisxqAs&quot;,
                        name =&gt; &quot;\x{30C6}\x{30B9}\x{30C8}2&quot;,
                        shop_No =&gt; 2,
                      },
  rxisxvDlrJisxAey =&gt; {
                        code =&gt; &quot;test5&quot;,
                        flg_suspend =&gt; 0,
                        id =&gt; &quot;rxisxvDlrJisxAey&quot;,
                        name =&gt; &quot;\x{30C6}\x{30B9}\x{30C8}5&quot;,
                        shop_No =&gt; 5,
                      },
  shisxwrpssisxKwD =&gt; {
                        code =&gt; &quot;test4&quot;,
                        flg_suspend =&gt; 0,
                        id =&gt; &quot;shisxwrpssisxKwD&quot;,
                        name =&gt; &quot;\x{30C6}\x{30B9}\x{30C8}4&quot;,
                        shop_No =&gt; 4,
                      },
}, &quot;Hash::MultiValue&quot;)</pre></div></div>

<p>これだけでは，<code>fetchall_hashref</code>とほとんど変わりませんが，そこで同オブジェクトのメソッドが活躍します．</p>
<p>例えば，<code>values</code>メソッド．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000066;">print</span> <span style="color: #000066;">dump</span> <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$list</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">values</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;"># use Data::Dump qw/dump/;</span></pre></div></div>

<p>すると，次のようになります．</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">[
  {
    code =&gt; &quot;test1&quot;,
    flg_suspend =&gt; 0,
    id =&gt; &quot;roisxgdpraisxCeb&quot;,
    name =&gt; &quot;\x{30C6}\x{30B9}\x{30C8}1&quot;,
    shop_No =&gt; 1,
  },
  {
    code =&gt; &quot;test2&quot;,
    flg_suspend =&gt; 0,
    id =&gt; &quot;rpisxlbrryisxqAs&quot;,
    name =&gt; &quot;\x{30C6}\x{30B9}\x{30C8}2&quot;,
    shop_No =&gt; 2,
  },
  {
    code =&gt; &quot;test3&quot;,
    flg_suspend =&gt; 0,
    id =&gt; &quot;rpisxDgqrsisxqas&quot;,
    name =&gt; &quot;\x{30C6}\x{30B9}\x{30C8}3&quot;,
    shop_No =&gt; 3,
  },
  {
    code =&gt; &quot;test4&quot;,
    flg_suspend =&gt; 0,
    id =&gt; &quot;shisxwrpssisxKwD&quot;,
    name =&gt; &quot;\x{30C6}\x{30B9}\x{30C8}4&quot;,
    shop_No =&gt; 4,
  },
  {
    code =&gt; &quot;test5&quot;,
    flg_suspend =&gt; 0,
    id =&gt; &quot;rxisxvDlrJisxAey&quot;,
    name =&gt; &quot;\x{30C6}\x{30B9}\x{30C8}5&quot;,
    shop_No =&gt; 5,
  },
]</pre></div></div>

<p>SQLで指定したとおりの順序での「ハッシュリファレンスのリスト（リファレンス）」が簡単に得られました．</p>
<h3>おわりに</h3>
<p>以上，データベースから取得したデータを，有用なデータ構造へ手間をかけずに準備するために，DBIモジュールへ，結果データをHash::MultiValueオブジェクトとして返す<code>fetchall_hmv</code>メソッドを追加してみた，というお話でした．</p>
<p>勢いで書いたので，文体の乱れはスルーの方向でお願いしますｗ</p>
<p>コードが間に合わせだったり，<code>fetchall_hashref</code>メソッドのパラメータ体系に完全互換でなかったり，パフォーマンスとか未計測だったりと，いろいろな点でアドホックなので，どなたか検証してみていただければ幸いです．</p>
<p>では，以降にコードの差分を載せておしまいとします．</p>
<h3 class="appendix">オリジナルとの差分</h3>
<p>オリジナルとの差分（<code>diff -u</code>）です．</p>

<div class="wp_syntax"><div class="code"><pre class="diff" style="font-family:monospace;">--- DBI.pm.orig	<span style="">2010</span>-02-<span style="">18</span> <span style="">15</span>:<span style="">21</span>:<span style="">00.000000000</span> +0900
<span style="color: #888822;">+++ DBI.pm.mod	<span style="">2010</span>-02-<span style="">18</span> <span style="">16</span>:<span style="">53</span>:<span style="">33.000000000</span> +0900</span>
<span style="color: #440088;">@@ -<span style="">156</span>,<span style="">6</span> +<span style="">156</span>,<span style="">7</span> @@</span>
 use Carp<span style="">&#40;</span><span style="">&#41;</span>;
 use DynaLoader <span style="">&#40;</span><span style="">&#41;</span>;
 use Exporter <span style="">&#40;</span><span style="">&#41;</span>;
<span style="color: #00b000;">+use Hash::MultiValue;</span>
&nbsp;
 BEGIN <span style="">&#123;</span>
 @ISA = qw<span style="">&#40;</span>Exporter DynaLoader<span style="">&#41;</span>;
<span style="color: #440088;">@@ -<span style="">465</span>,<span style="">6</span> +<span style="">466</span>,<span style="">7</span> @@</span>
&nbsp;
 	fetchall_arrayref =&gt; <span style="">&#123;</span> U =&gt;<span style="">&#91;</span><span style="">1</span>,<span style="">3</span>, '<span style="">&#91;</span> $slice <span style="">&#91;</span>, $max_rows<span style="">&#93;</span><span style="">&#93;</span>'<span style="">&#93;</span> <span style="">&#125;</span>,
 	fetchall_hashref  =&gt; <span style="">&#123;</span> U =&gt;<span style="">&#91;</span><span style="">2</span>,<span style="">2</span>,'$key_field'<span style="">&#93;</span> <span style="">&#125;</span>,
<span style="color: #00b000;">+	fetchall_hmv      =&gt; <span style="">&#123;</span> U =&gt;<span style="">&#91;</span><span style="">2</span>,<span style="">2</span>,'$key_field'<span style="">&#93;</span> <span style="">&#125;</span>,</span>
&nbsp;
 	blob_read  =&gt;	<span style="">&#123;</span> U =&gt;<span style="">&#91;</span><span style="">4</span>,<span style="">5</span>,'$field, $offset, $len <span style="">&#91;</span>, ¥¥$buf <span style="">&#91;</span>, $bufoffset<span style="">&#93;</span><span style="">&#93;</span>'<span style="">&#93;</span> <span style="">&#125;</span>,
 	blob_copy_to_file =&gt; <span style="">&#123;</span> U =&gt;<span style="">&#91;</span><span style="">3</span>,<span style="">3</span>,'$field, $filename_or_handleref'<span style="">&#93;</span> <span style="">&#125;</span>,
<span style="color: #440088;">@@ -<span style="">2057</span>,<span style="">6</span> +<span style="">2059</span>,<span style="">35</span> @@</span>
         return $rows;
     <span style="">&#125;</span>
&nbsp;
<span style="color: #00b000;">+    sub fetchall_hmv <span style="">&#123;</span></span>
<span style="color: #00b000;">+	my <span style="">&#40;</span>$sth, $key_field<span style="">&#41;</span> = @_;</span>
<span style="color: #00b000;">+</span>
<span style="color: #00b000;">+        my $hash_key_name = $sth-&gt;<span style="">&#123;</span>FetchHashKeyName<span style="">&#125;</span> || 'NAME';</span>
<span style="color: #00b000;">+        my $names_hash = $sth-&gt;FETCH<span style="">&#40;</span>&quot;$<span style="">&#123;</span>hash_key_name<span style="">&#125;</span>_hash&quot;<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+        my @key_fields = <span style="">&#40;</span>ref $key_field<span style="">&#41;</span> ? @$key_field : <span style="">&#40;</span>$key_field<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+        my @key_indexes;</span>
<span style="color: #00b000;">+        my $num_of_fields = $sth-&gt;FETCH<span style="">&#40;</span>'NUM_OF_FIELDS'<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+        foreach <span style="">&#40;</span>@key_fields<span style="">&#41;</span> <span style="">&#123;</span></span>
<span style="color: #00b000;">+           my $index = $names_hash-&gt;<span style="">&#123;</span>$_<span style="">&#125;</span>;  # perl index not column</span>
<span style="color: #00b000;">+           $index = $_ - <span style="">1</span> if !defined $index &amp;&amp; DBI::looks_like_number<span style="">&#40;</span>$_<span style="">&#41;</span> &amp;&amp; $_&gt;=<span style="">1</span> &amp;&amp; $_ &lt;= $num_of_fields;</span>
<span style="color: #00b000;">+           return $sth-&gt;set_err<span style="">&#40;</span>$DBI::stderr, &quot;Field '$_' does not exist <span style="">&#40;</span>not one of @<span style="">&#123;</span><span style="">&#91;</span>keys %$names_hash<span style="">&#93;</span><span style="">&#125;</span><span style="">&#41;</span>&quot;<span style="">&#41;</span></span>
<span style="color: #00b000;">+                unless defined $index;</span>
<span style="color: #00b000;">+           push @key_indexes, $index;</span>
<span style="color: #00b000;">+        <span style="">&#125;</span></span>
<span style="color: #00b000;">+        my $hmv = Hash::MultiValue-&gt;new;</span>
<span style="color: #00b000;">+        my $rows = <span style="">&#123;</span><span style="">&#125;</span>;</span>
<span style="color: #00b000;">+        my $NAME = $sth-&gt;FETCH<span style="">&#40;</span>$hash_key_name<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+        my @row = <span style="">&#40;</span>undef<span style="">&#41;</span> x $num_of_fields;</span>
<span style="color: #00b000;">+        $sth-&gt;bind_columns<span style="">&#40;</span>¥<span style="">&#40;</span>@row<span style="">&#41;</span><span style="">&#41;</span>;</span>
<span style="color: #00b000;">+        while <span style="">&#40;</span>$sth-&gt;fetch<span style="">&#41;</span> <span style="">&#123;</span></span>
<span style="color: #00b000;">+            my $ref = $rows;</span>
<span style="color: #00b000;">+            $ref = $ref-&gt;<span style="">&#123;</span>$row<span style="">&#91;</span>$_<span style="">&#93;</span><span style="">&#125;</span> ||= <span style="">&#123;</span><span style="">&#125;</span> for @key_indexes;</span>
<span style="color: #00b000;">+            @<span style="">&#123;</span>$ref<span style="">&#125;</span><span style="">&#123;</span>@$NAME<span style="">&#125;</span> = @row;</span>
<span style="color: #00b000;">+            $hmv-&gt;add<span style="">&#40;</span>$row<span style="">&#91;</span>$key_indexes<span style="">&#91;</span><span style="">0</span><span style="">&#93;</span><span style="">&#93;</span>, $ref<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+        <span style="">&#125;</span></span>
<span style="color: #00b000;">+        return $hmv;</span>
<span style="color: #00b000;">+    <span style="">&#125;</span></span>
<span style="color: #00b000;">+</span>
     *dump_results = ¥&amp;DBI::dump_results;
&nbsp;
     sub blob_copy_to_file <span style="">&#123;</span>	# returns length or undef on error</pre></div></div>

<h3 class="appendix"><code>fetchall_hashref</code>と<code>fetchall_hmv</code>との差分</h3>
<p><code>fetchall_hashref</code>と<code>fetchall_hmv</code>を直接差分をとってみたものが次です．（同じく<code>diff -u</code>）</p>

<div class="wp_syntax"><div class="code"><pre class="diff" style="font-family:monospace;">--- fetchall_hashref <span style="">2010</span>-02-<span style="">18</span> <span style="">16</span>:<span style="">59</span>:<span style="">14.000000000</span> +0900
<span style="color: #888822;">+++ fetchall_hmv	 <span style="">2010</span>-02-<span style="">18</span> <span style="">16</span>:<span style="">59</span>:<span style="">52.000000000</span> +0900</span>
<span style="color: #440088;">@@ -<span style="">1</span>,<span style="">4</span> +<span style="">1</span>,<span style="">4</span> @@</span>
<span style="color: #991111;">-    sub fetchall_hashref <span style="">&#123;</span></span>
<span style="color: #00b000;">+    sub fetchall_hmv <span style="">&#123;</span></span>
     my <span style="">&#40;</span>$sth, $key_field<span style="">&#41;</span> = @_;
&nbsp;
         my $hash_key_name = $sth-&gt;<span style="">&#123;</span>FetchHashKeyName<span style="">&#125;</span> || 'NAME';
<span style="color: #440088;">@@ -<span style="">13</span>,<span style="">6</span> +<span style="">13</span>,<span style="">7</span> @@</span>
                 unless defined $index;
            push @key_indexes, $index;
         <span style="">&#125;</span>
<span style="color: #00b000;">+        my $hmv = Hash::MultiValue-&gt;new;</span>
         my $rows = <span style="">&#123;</span><span style="">&#125;</span>;
         my $NAME = $sth-&gt;FETCH<span style="">&#40;</span>$hash_key_name<span style="">&#41;</span>;
         my @row = <span style="">&#40;</span>undef<span style="">&#41;</span> x $num_of_fields;
<span style="color: #440088;">@@ -<span style="">21</span>,<span style="">7</span> +<span style="">22</span>,<span style="">8</span> @@</span>
             my $ref = $rows;
             $ref = $ref-&gt;<span style="">&#123;</span>$row<span style="">&#91;</span>$_<span style="">&#93;</span><span style="">&#125;</span> ||= <span style="">&#123;</span><span style="">&#125;</span> for @key_indexes;
             @<span style="">&#123;</span>$ref<span style="">&#125;</span><span style="">&#123;</span>@$NAME<span style="">&#125;</span> = @row;
<span style="color: #00b000;">+            $hmv-&gt;add<span style="">&#40;</span>$row<span style="">&#91;</span>$key_indexes<span style="">&#91;</span><span style="">0</span><span style="">&#93;</span><span style="">&#93;</span>, $ref<span style="">&#41;</span>;</span>
         <span style="">&#125;</span>
<span style="color: #991111;">-        return $rows;</span>
<span style="color: #00b000;">+        return $hmv;</span>
     <span style="">&#125;</span>
<span style="color: #991111;">-  </span>
<span style="color: #00b000;">+</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.iwa-ya.net/2010/02/18/192601/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.iwa-ya.net/2010/02/18/192601" />
	<feedburner:origLink>http://blog.iwa-ya.net/2010/02/18/192601</feedburner:origLink></item>
		<item>
		<title>[perl][mac] Mac::Growl経由の通知が文字化けする件を修正してみる</title>
		<link>http://feedproxy.google.com/~r/issm/~3/YEpbMgNTriY/152735</link>
		<comments>http://blog.iwa-ya.net/2010/02/14/152735#comments</comments>
		<pubDate>Sun, 14 Feb 2010 06:27:35 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[Macライフ]]></category>
		<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[cpan]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://blog.iwa-ya.net/?p=2418</guid>
		<description><![CDATA[はじめに
ちょっとLog::Dispatch::*系の勉強がてら軽く試してみたLog::Dispatch::MacGrowlですが，日本語使用時にうまく表示されません．
ので，同モジュールが利用しているMac::Grow [...]]]></description>
			<content:encoded><![CDATA[<h3>はじめに</h3>
<p>ちょっとLog::Dispatch::*系の勉強がてら軽く試してみた<a href="http://search.cpan.org/perldoc?Log::Dispatch::MacGrowl">Log::Dispatch::MacGrowl</a>ですが，日本語使用時にうまく表示されません．</p>
<p>ので，同モジュールが利用している<a href="http://search.cpan.org/~cnandor/Mac-Growl-0.67/lib/Mac/Growl.pm">Mac::Growl</a>のソースコードを，アドホックに修正して，日本語表示できるようにしてみました．</p>
<h3>Before</h3>
<p>後で示すサンプルコードを実行すると，こんな感じになります．</p>
<div class="flickr-photo-noresize">
<a href="http://www.flickr.com/photos/issm/4354916211/" title="ss-2010-02-14-01 on Flickr"><img src="http://farm5.static.flickr.com/4053/4354916211_495af897bb.jpg" alt="ss-2010-02-14-01 on Flickr" title="ss-2010-02-14-01 on Flickr" /></a>
</div>
<p>「システム環境設定 / Growl」の「アプリケーション一覧」でも，名前が化けています．</p>
<div class="flickr-photo-noresize">
<a href="http://www.flickr.com/photos/issm/4354916289/" title="ss-2010-02-14-02 on Flickr"><img src="http://farm5.static.flickr.com/4064/4354916289_57ef9fd59e.jpg" alt="ss-2010-02-14-02 on Flickr" title="ss-2010-02-14-02 on Flickr" /></a>
</div>
<h3>After</h3>
<p>とりあえず表示．このフレーズしか試していませんが．</p>
<div class="flickr-photo-noresize">
<a href="http://www.flickr.com/photos/issm/4355662164/" title="ss-2010-02-14-02 on Flickr"><img src="http://farm5.static.flickr.com/4014/4355662164_a3e481428e.jpg" alt="ss-2010-02-14-02 on Flickr" title="ss-2010-02-14-02 on Flickr" /></a>
</div>
<p>設定の方もOKみたいです．</p>
<div class="flickr-photo-noresize">
<a href="http://www.flickr.com/photos/issm/4355662202/" title="ss-2010-02-14-04 on Flickr"><img src="http://farm5.static.flickr.com/4038/4355662202_efc917eca7.jpg" alt="ss-2010-02-14-04 on Flickr" title="ss-2010-02-14-04 on Flickr" /></a>
</div>
<h3>差分</h3>
<p>ということで，オリジナルとの差分です．<br />
<span id="more-2418"></span></p>

<div class="wp_syntax"><div class="code"><pre class="diff" style="font-family:monospace;">--- Growl.orig.pm	<span style="">2010</span>-02-<span style="">14</span> <span style="">14</span>:<span style="">28</span>:<span style="">08.000000000</span> +0900
<span style="color: #888822;">+++ Growl.mod.pm	<span style="">2010</span>-02-<span style="">14</span> <span style="">14</span>:<span style="">47</span>:<span style="">48.000000000</span> +0900</span>
<span style="color: #440088;">@@ -<span style="">287</span>,<span style="">7</span> +<span style="">287</span>,<span style="">7</span> @@</span>
 sub AppleScript_RegisterNotifications<span style="">&#40;</span>$$$;$<span style="">&#41;</span>
 <span style="">&#123;</span>
 	my<span style="">&#40;</span>$appName, $allNotes, $defaultNotes, $iconOfApp<span style="">&#41;</span> = @_;
<span style="color: #991111;">-	_Fix_Encode<span style="">&#40;</span>$_, 'MacRoman'<span style="">&#41;</span> for <span style="">&#40;</span>$appName<span style="">&#41;</span>;</span>
<span style="color: #00b000;">+	_Fix_Encode<span style="">&#40;</span>$_, 'sjis'<span style="">&#41;</span> for <span style="">&#40;</span>$appName<span style="">&#41;</span>;</span>
&nbsp;
 	# protect quotes and slashes
 	for <span style="">&#40;</span>$appName, $iconOfApp<span style="">&#41;</span> <span style="">&#123;</span>
<span style="color: #440088;">@@ -<span style="">318</span>,<span style="">7</span> +<span style="">318</span>,<span style="">7</span> @@</span>
 	for <span style="">&#40;</span>$appName, $noteName, $noteTitle, $noteDescription<span style="">&#41;</span> <span style="">&#123;</span>
 		next unless defined;
 		_Fix_AppleScript_String<span style="">&#40;</span>$_<span style="">&#41;</span>;
<span style="color: #991111;">-		_Fix_Encode<span style="">&#40;</span>$_, 'MacRoman'<span style="">&#41;</span>;  # can't get to work with UTF8, so this will do</span>
<span style="color: #00b000;">+		_Fix_Encode<span style="">&#40;</span>$_, 'sjis'<span style="">&#41;</span>;  # can't get to work with UTF8, so this will do</span>
 	<span style="">&#125;</span>
&nbsp;
 	my $script = qq'tell application &quot;$helper&quot; to notify ' .</pre></div></div>

<h3>おわりに</h3>
<p>あくまでアドホックなので，他の部分の動作に影響が出る可能性も十分あるかもしれません．</p>
<h3>参考</h3>
<ul class="links">
<li><a href="http://search.cpan.org/~cnandor/Mac-Growl-0.67/lib/Mac/Growl.pm" title="Mac::Growl - search.cpan.org">Mac::Growl &#8211; search.cpan.org</a></li>
<li><a href="http://qz.tsugumi.org/Perl_Mac_Growl.html" title="qzのメモ帳 - Perl - Mac::Growl">qzのメモ帳 &#8211; Perl &#8211; Mac::Growl</a></li>
<li><a href="http://search.cpan.org/~ryochin/Log-Dispatch-MacGrowl-0.01/lib/Log/Dispatch/MacGrowl.pm" title="Log::Dispatch::MacGrowl - search.cpan.org">Log::Dispatch::MacGrowl &#8211; search.cpan.org</a></li>
</ul>
<h3 class="appendix">サンプルコード</h3>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/env perl</span>
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> utf8<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> Log<span style="color: #339933;">::</span><span style="color: #006600;">Dispatch</span><span style="color: #339933;">::</span><span style="color: #006600;">MacGrowl</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Encode<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> en <span style="color: #009900;">&#123;</span> encode_utf8<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$_</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$note1</span> <span style="color: #339933;">=</span> Log<span style="color: #339933;">::</span><span style="color: #006600;">Dispatch</span><span style="color: #339933;">::</span><span style="color: #006600;">MacGrowl</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span>
    name      <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'sample1'</span><span style="color: #339933;">,</span>
    min_level <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'debug'</span><span style="color: #339933;">,</span>
    app_name  <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'sample1'</span><span style="color: #339933;">,</span>
    title     <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'sample1'</span><span style="color: #339933;">,</span>
    sticky    <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span>
    priority  <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$note2</span> <span style="color: #339933;">=</span> Log<span style="color: #339933;">::</span><span style="color: #006600;">Dispatch</span><span style="color: #339933;">::</span><span style="color: #006600;">MacGrowl</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span>
    name      <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'sample2'</span><span style="color: #339933;">,</span>
    min_level <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'debug'</span><span style="color: #339933;">,</span>
    app_name  <span style="color: #339933;">=&gt;</span> en<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'サンプル2'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #666666; font-style: italic;">#app_name  =&gt; 'sample2',</span>
    title     <span style="color: #339933;">=&gt;</span> en<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'サンプル2'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    sticky    <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span>
    priority  <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #0000ff;">$note1</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">log</span><span style="color: #009900;">&#40;</span>level <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'debug'</span><span style="color: #339933;">,</span> message <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'Hello!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$note2</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">log</span><span style="color: #009900;">&#40;</span>level <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'debug'</span><span style="color: #339933;">,</span> message <span style="color: #339933;">=&gt;</span> en<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'こんにちは！'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">__END__</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.iwa-ya.net/2010/02/14/152735/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.iwa-ya.net/2010/02/14/152735" />
	<feedburner:origLink>http://blog.iwa-ya.net/2010/02/14/152735</feedburner:origLink></item>
		<item>
		<title>[plack][perl] Plackにおけるファイルアップロード処理の準備メモ・改</title>
		<link>http://feedproxy.google.com/~r/issm/~3/2vVUsirRNpQ/143801</link>
		<comments>http://blog.iwa-ya.net/2010/02/12/143801#comments</comments>
		<pubDate>Fri, 12 Feb 2010 05:38:01 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[plack]]></category>

		<guid isPermaLink="false">http://blog.iwa-ya.net/?p=2395</guid>
		<description><![CDATA[
次のエントリの修正版となります．

[plack][perl] Plackにおけるファイルアップロード処理の準備メモ «  岩家ぶろぐ


はじめに

[plack][perl] Plackにおけるファイルアップロード [...]]]></description>
			<content:encoded><![CDATA[<div class="note">
次のエントリの修正版となります．</p>
<ul class="links">
<li><a href="http://blog.iwa-ya.net/2010/02/11/193810" title="[plack][perl] Plackにおけるファイルアップロード処理の準備メモ «  岩家ぶろぐ">[plack][perl] Plackにおけるファイルアップロード処理の準備メモ «  岩家ぶろぐ</a></li>
</ul>
</div>
<h3>はじめに</h3>
<ul class="links">
<li><a href="http://blog.iwa-ya.net/2010/02/11/193810" title="[plack][perl] Plackにおけるファイルアップロード処理の準備メモ «  岩家ぶろぐ">[plack][perl] Plackにおけるファイルアップロード処理の準備メモ «  岩家ぶろぐ</a></li>
</ul>
<p>このエントリを公開後，Plackの中の人でもある<a href="http://bulknews.typepad.com/">miyagawa</a>さんより，同エントリの内容が現在のバージョンのものにおいて正しくない，という旨のご指摘をいただきました．ありがとうございます．（実際には，0.90*系と0.99_*系との違い，ということで無問題？）</p>
<p>ということで，現時点で最新（ですよね？）の「0.99_5（DEVELOPER RELEASE）」を入れ，同バージョンにおけるPlack::Request，Plack::Request::Uploadのドキュメントを確認し，修正したものを以下に掲載します．</p>
<h3>アップロードフォーム</h3>
<p>前エントリと同様のものです．</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">form</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #000066;">method</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;post&quot;</span></span>
<span style="color: #009900;">      <span style="color: #000066;">enctype</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;multipart/form-data&quot;</span>&gt;</span>
  ファイル 1-1
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file1&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
&nbsp;
  ファイル 1-2
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file1&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
&nbsp;
  ファイル 2
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file2&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
&nbsp;
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;submit&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;submit&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;アップロード！&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">form</span>&gt;</span></pre></div></div>

<h3>Plack::Request::Uploadオブジェクトを取得する</h3>
<h4>アップロードオブジェクトの集合はHash::MultiValueオブジェクトとして</h4>
<p><span id="more-2395"></span></p>
<p>Plack::Requestオブジェクトのuploadsメソッドを呼ぶところは，前と変わりありませんが，得られるものがHash::MultiValueオブジェクトとなりました．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> Data<span style="color: #339933;">::</span><span style="color: #006600;">Dumper</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># $req is Plack::Request object</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$uploads</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$req</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">uploads</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> <span style="color: #000066;">ref</span> <span style="color: #0000ff;">$uploads</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">Hash::MultiValue</pre></div></div>

<h4>データ構成</h4>
<p>今回もスペースの都合上，<code>$VAR1 =</code>な部分は削ってます．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> Data<span style="color: #339933;">::</span><span style="color: #006600;">Dumper</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">$uploads</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">bless( {
         'file2' =&gt; bless( {
                             'headers' =&gt; bless( {
                                                   'content-disposition' =&gt; 'form-data; name=&quot;file2&quot;; filename=&quot;9a8ba767.jpg&quot;',
                                                   'content-type' =&gt; 'image/jpeg'
                                                 }, 'HTTP::Headers' ),
                             'filename' =&gt; '9a8ba767.jpg',
                             'tempname' =&gt; '/tmp/f2cY6WMe0_',
                             'size' =&gt; 102723
                           }, 'Plack::Request::Upload' ),
         'file1' =&gt; bless( {
                             'headers' =&gt; bless( {
                                                   'content-disposition' =&gt; 'form-data; name=&quot;file1&quot;; filename=&quot;7a98edb3.jpg&quot;',
                                                   'content-type' =&gt; 'image/jpeg'
                                                 }, 'HTTP::Headers' ),
                             'filename' =&gt; '7a98edb3.jpg',
                             'tempname' =&gt; '/tmp/6hLGbxAmym',
                             'size' =&gt; 301283
                           }, 'Plack::Request::Upload' )
       }, 'Hash::MultiValue' );</pre></div></div>

<p>キーにフォームのフィールド名，値にPlack::Request::Uploadオブジェクトが1ファイルにつき1つ，という構成になっているのがわかｒ．．．おっと，Data::Dumperでの出力では，キーが重複した分については表示されないんでした．このあたりは次節で確認してみます．</p>
<h4>特定のフィールドの要素を取得する</h4>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">$uploads</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>file1<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">$uploads</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>file2<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">$VAR1 = bless( {
                 'headers' =&gt; bless( {
                                       'content-disposition' =&gt; 'form-data; name=&quot;file1&quot;; filename=&quot;7a98edb3.jpg&quot;',
                                       'content-type' =&gt; 'image/jpeg'
                                     }, 'HTTP::Headers' ),
                 'filename' =&gt; '7a98edb3.jpg',
                 'tempname' =&gt; '/tmp/j4gQY8Am6V',
                 'size' =&gt; 301283
               }, 'Plack::Request::Upload' );
$VAR1 = bless( {
                 'headers' =&gt; bless( {
                                       'content-disposition' =&gt; 'form-data; name=&quot;file2&quot;; filename=&quot;9a8ba767.jpg&quot;',
                                       'content-type' =&gt; 'image/jpeg'
                                     }, 'HTTP::Headers' ),
                 'filename' =&gt; '9a8ba767.jpg',
                 'tempname' =&gt; '/tmp/GbG3P_7Fhp',
                 'size' =&gt; 102723
               }, 'Plack::Request::Upload' );</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">$uploads</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get_all</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'file1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">$uploads</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get_all</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'file2'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">$VAR1 = bless( {
                 'headers' =&gt; bless( {
                                       'content-disposition' =&gt; 'form-data; name=&quot;file1&quot;; filename=&quot;6ac3d070.jpg&quot;',
                                       'content-type' =&gt; 'image/jpeg'
                                     }, 'HTTP::Headers' ),
                 'filename' =&gt; '6ac3d070.jpg',
                 'tempname' =&gt; '/tmp/E63LJB8y1s',
                 'size' =&gt; 59307
               }, 'Plack::Request::Upload' );
$VAR2 = bless( {
                 'headers' =&gt; bless( {
                                       'content-disposition' =&gt; 'form-data; name=&quot;file1&quot;; filename=&quot;7a98edb3.jpg&quot;',
                                       'content-type' =&gt; 'image/jpeg'
                                     }, 'HTTP::Headers' ),
                 'filename' =&gt; '7a98edb3.jpg',
                 'tempname' =&gt; '/tmp/38aWzTxmFv',
                 'size' =&gt; 301283
               }, 'Plack::Request::Upload' );
$VAR1 = bless( {
                 'headers' =&gt; bless( {
                                       'content-disposition' =&gt; 'form-data; name=&quot;file2&quot;; filename=&quot;9a8ba767.jpg&quot;',
                                       'content-type' =&gt; 'image/jpeg'
                                     }, 'HTTP::Headers' ),
                 'filename' =&gt; '9a8ba767.jpg',
                 'tempname' =&gt; '/tmp/jFgvreL2Ol',
                 'size' =&gt; 102723
               }, 'Plack::Request::Upload' );</pre></div></div>

<p>Data::Dumperでは確認できなかった分についてもしっかり取得できていますね．</p>
<h3>Plack::Request::Uploadオブジェクトのメソッド</h3>
<ul class="links">
<li><a href="http://search.cpan.org/~miyagawa/Plack-0.99_05/lib/Plack/Request/Upload.pm" title="Plack::Request::Upload - search.cpan.org">Plack::Request::Upload &#8211; search.cpan.org</a></li>
</ul>
<p>こちらにも変更がありますね．</p>
<h4>size</h4>
<p>アップロードされたファイルのサイズが得られます．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$up</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$uploads</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get_all</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'file1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">$up</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">size</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">$VAR1 = 59307;</pre></div></div>

<h4>path</h4>
<p>ファイルは自動的に一時ファイルとして保存されるわけですが，このメソッドは，その保存先のパスを取得できます．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">$up</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">path</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">$VAR1 = '/tmp/FmOgLKzAZQ';</pre></div></div>

<h4>content_type</h4>
<p>アップロードされたファイルのContent-Typeが得られます．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">$up</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">content_type</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">$VAR1 = 'image/jpeg';</pre></div></div>

<h4>filename，basename</h4>
<p>それぞれ，「original filename in the client」「basename for &#8220;filename&#8221;」ということですが，まだよくわかっていません＞＜</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">$up</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">filename</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">$up</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">basename</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">$VAR1 = '6ac3d070.jpg';
$VAR1 = '6ac3d070.jpg';</pre></div></div>

<h3>参考</h3>
<ul class="links">
<li><a href="http://search.cpan.org/~miyagawa/Plack-0.99_05/" title="Tatsuhiko Miyagawa / Plack-0.99_05 - search.cpan.org">Tatsuhiko Miyagawa / Plack-0.99_05 &#8211; search.cpan.org</a></li>
</ul>
<h3>おわりに</h3>
<p>以上，Plackにおけるファイルアップロード処理のための準備（というか，もうファイル自体はアップロードされてしまっていますがｗ）に関するメモの修正版でした．</p>
<blockquote cite="http://search.cpan.org/~miyagawa/Plack-0.99_05/lib/Plack/Request.pm#INCOMPATIBILITIES"><p>
All parameter-related methods such as parameters, body_parameters, query_parameters and uploads now contains Hash::MultiValue objects, rather than scalar or an array reference depending on the user input which is insecure. See Hash::MultiValue for more about this change.<br />
<cite><a href="http://search.cpan.org/~miyagawa/Plack-0.99_05/lib/Plack/Request.pm#INCOMPATIBILITIES" title="Plack::Request - search.cpan.org">INCOMPATIBILITIES &#8211; Plack::Request &#8211; search.cpan.org</a></cite>
</p></blockquote>
<p>ということなので，Hash::MultiValueオブジェクトの扱いに慣れておいて損はないかと思います．</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.iwa-ya.net/2010/02/12/143801/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.iwa-ya.net/2010/02/12/143801" />
	<feedburner:origLink>http://blog.iwa-ya.net/2010/02/12/143801</feedburner:origLink></item>
		<item>
		<title>[perl][cpan] Hash::MultiValue-0.07を軽く触ってみた</title>
		<link>http://feedproxy.google.com/~r/issm/~3/sf7hB7qdRkY/080259</link>
		<comments>http://blog.iwa-ya.net/2010/02/12/080259#comments</comments>
		<pubDate>Thu, 11 Feb 2010 23:02:59 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[cpan]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://blog.iwa-ya.net/?p=2397</guid>
		<description><![CDATA[はじめに
先のエントリ公開後間もなく，miyagawaさんより次のようなご指摘をいただきました．

> ただし，冒頭のフォームのように，1つのフィールドに複数の要素が存在する場合，リストリファレンスが得られることに注意で [...]]]></description>
			<content:encoded><![CDATA[<h3>はじめに</h3>
<p><a href="http://blog.iwa-ya.net/2010/02/11/193810">先のエントリ</a>公開後間もなく，<a href="http://bulknews.typepad.com/">miyagawa</a>さんより次のようなご指摘をいただきました．</p>
<blockquote cite="http://blog.iwa-ya.net/2010/02/11/193810#comments"><p>
> ただし，冒頭のフォームのように，1つのフィールドに複数の要素が存在する場合，リストリファレンスが得られることに注意です<br />
Plack 0.99 以降ではそのようになりません。Hash::MultiValue オブジェクトになるので、ハッシュとして扱えば最後の要素のみ、複数取得する場合は ->get_all を使用します。<br />
<cite><a href="http://blog.iwa-ya.net/2010/02/11/193810#comments" title="[plack][perl] Plackにおけるファイルアップロード処理の準備メモ «  岩家ぶろぐ">comment by @miyagawa on [plack][perl] Plackにおけるファイルアップロード処理の準備メモ «  岩家ぶろぐ</a></cite>
</p></blockquote>
<p>私の環境に入っていたのは「0.9031」でした．で，現在「DEVELOPER RELEASE」である「0.99_5」のPlack::Requestのドキュメントを見てみたところ，次のような記述がありました．</p>
<blockquote cite="http://search.cpan.org/~miyagawa/Plack-0.99_05/lib/Plack/Request.pm#INCOMPATIBILITIES"><p>
In version 1.0, many utility methods are removed or deprecated, and most methods are made read-only.</p>
<p>The following methods are deprecated: hostname, url_scheme, params, query_params, body_params, cookie and raw_uri. They will be removed in the next major release.</p>
<p>All parameter-related methods such as parameters, body_parameters, query_parameters and uploads now contains Hash::MultiValue objects, rather than scalar or an array reference depending on the user input which is insecure. See Hash::MultiValue for more about this change.<br />
<cite><a href="http://search.cpan.org/~miyagawa/Plack-0.99_05/lib/Plack/Request.pm#INCOMPATIBILITIES" title="Plack::Request - search.cpan.org">Plack::Request &#8211; search.cpan.org</a></cite>
</p></blockquote>
<p>「deprecated」なものが多々ありますね．これはバージョンを上げておいた方がよさげですね．ということで，これを機に「0.99_5」をインストール．</p>
<p>では，Plack::Request::Uploadあたりの動作確認，と，その前に．．．そもそも「Hash::MultiValueオブジェクト」というものがよく分かっていませんでした．</p>
<p>ので，まずは，Hash::MultiValueモジュールについてざっと触れるところから始めました，以下はそのメモです．</p>
<p>なお，バージョンアップの頻度が高そうなので，タイトルのとおり，バージョンは「0.07」ということを明記しておきます．（他のモジュールについても，今後，バージョンを明記した方が問題は少ないかもですね．）</p>
<h3>Hash::MultiValueオブジェクトの特徴</h3>
<p>ざっと触ってのイメージを．</p>
<p>通常のハッシュ（リファレンス）では，複数の同名のキーによって値を代入する場合，最後のものが優先されます．また，<code>keys</code>や<code>values</code>でそのキーや値を列挙する場合，その順序が定義のとおりになる保証はありません．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$h</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>a <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> b <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>a<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>a<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;"># 3</span></pre></div></div>

<p>一方Hash::MultiValueオブジェクトは，同名のキーに複数の値が存在することや，値を設定した順序が保持されることが保証（？）されるように実装されています．一部の操作において，ハッシュリファレンスと同じように扱うこともできます．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$h</span> <span style="color: #339933;">=</span> Hash<span style="color: #339933;">::</span><span style="color: #006600;">MultiValue</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span>
    a <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span>
    b <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span>
    a <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>この場合，次のようなハッシュリファレンス的なものを扱えるようになる，といったイメージでしょうか．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #009900;">&#123;</span>
    a <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    b <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>また，このオブジェクトには，次のような対応と，その順序に関する情報が保持されます．</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">1. 'a' =&gt; 1
2. 'b' =&gt; 2
3. 'a' =&gt; 3</pre></div></div>

<h3>触ってみる</h3>
<p><a href="http://search.cpan.org/~miyagawa/Hash-MultiValue-0.07/lib/Hash/MultiValue.pm">ドキュメント</a>に記載されているメソッドをひととおり実行してみます．<br />
<span id="more-2397"></span></p>
<h4>new</h4>
<p>Hash::MultiValueオブジェクトを生成します．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> Hash<span style="color: #339933;">::</span><span style="color: #006600;">MultiValue</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Try<span style="color: #339933;">::</span><span style="color: #006600;">Tiny</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Data<span style="color: #339933;">::</span><span style="color: #006600;">Dumper</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> p <span style="color: #009900;">&#123;</span> <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">sub</span> d <span style="color: #009900;">&#123;</span> <span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@pairs</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">%h</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$h</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">@pairs</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>
    a <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span>
    b <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span>
    a <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span>
    c <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span>
    d <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span>
    b <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">6</span><span style="color: #339933;">,</span>
    a <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">7</span><span style="color: #339933;">,</span>
    e <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">8</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">%h</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@pairs</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$h</span> <span style="color: #339933;">=</span> Hash<span style="color: #339933;">::</span><span style="color: #006600;">MultiValue</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@pairs</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
d <span style="color: #0000ff;">\@pairs</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">\%h</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">$VAR1 = [
          'a',
          1,
          'b',
          2,
          'a',
          3,
          'c',
          4,
          'd',
          5,
          'b',
          6,
          'a',
          7,
          'e',
          8
        ];
$VAR1 = {
          'e' =&gt; 8,
          'c' =&gt; 4,
          'a' =&gt; 7,
          'b' =&gt; 6,
          'd' =&gt; 5
        };
$VAR1 = bless( {
                 'e' =&gt; 8,
                 'c' =&gt; 4,
                 'a' =&gt; 7,
                 'b' =&gt; 6,
                 'd' =&gt; 5
               }, 'Hash::MultiValue' );</pre></div></div>

<h4>get</h4>
<p>指定のキーに対応する値を取得します．対応する値が複数存在する場合は，「最後の」値が得られます．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">p <span style="color: #ff0000;">'# get'</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'a'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>a<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'f'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;"># get
$VAR1 = 7;
$VAR1 = 7;
$VAR1 = undef;</pre></div></div>

<p>なぜ「最後」かは，次を参照してください．ひとことで言えば，「Perlの仕様」ということでしょうか．</p>
<ul class="links">
<li><a href="http://search.cpan.org/~miyagawa/Hash-MultiValue-0.07/lib/Hash/MultiValue.pm#WHY_LAST_NOT_FIRST?" title="WHY_LAST_NOT_FIRST? - Hash::MultiValue - search.cpan.org">WHY_LAST_NOT_FIRST? &#8211; Hash::MultiValue &#8211; search.cpan.org</a></li>
</ul>
<h4>get_one</h4>
<p>指定のキーに対応する値を取得します．ただし，対応する値が「単一」の場合に限ります．それ以外，つまり「値が複数存在する」場合や「値が存在しない」場合には，例外が発生します．</p>
<blockquote cite="http://search.cpan.org/~miyagawa/Hash-MultiValue-0.07/lib/Hash/MultiValue.pm"><p>
This method croaks if there is no value or multiple values associated with the key, so you should wrap it with eval or modules like Try::Tiny.<br />
<cite><a href="http://search.cpan.org/~miyagawa/Hash-MultiValue-0.07/lib/Hash/MultiValue.pm" title="Hash::MultiValue - search.cpan.org">Hash::MultiValue &#8211; search.cpan.org</a></cite>
</p></blockquote>
<p>ということなので，<code>use Try::Tiny</code>などして<code>try {} catch {}</code>して利用するとよさげなようです．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">p <span style="color: #ff0000;">'# get_one'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$k</span> <span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">qw/b d f/</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    try<span style="color: #009900;">&#123;</span>
        d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get_one</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$k</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> catch <span style="color: #009900;">&#123;</span>
        d <span style="color: #0000ff;">$_</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;"># get_one
$VAR1 = 'Multiple values match: b at ./sample.pl line 40
';
$VAR1 = 5;
$VAR1 = 'Key not found: f at ./sample.pl line 40
';</pre></div></div>

<h4>get_all</h4>
<p>指定したキーに対応するすべての値を，リストとして取得します．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">p <span style="color: #ff0000;">'# get_all'</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get_all</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'a'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get_all</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'f'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;"># get_all
$VAR1 = [
          1,
          3,
          7
        ];
$VAR1 = [];</pre></div></div>

<h4>keys</h4>
<p>キーを列挙します．定義時やaddメソッド（後述）による追加の順序も保持されています．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">p <span style="color: #ff0000;">'# keys'</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">keys</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #000066;">keys</span> <span style="color: #0000ff;">%$h</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;"># keys
$VAR1 = [
          'a',
          'b',
          'a',
          'c',
          'd',
          'b',
          'a',
          'e'
        ];
$VAR1 = [
          'e',
          'c',
          'a',
          'b',
          'd'
        ];</pre></div></div>

<h4>values</h4>
<p>値を列挙します．定義時やaddメソッド（後述）による追加の順序も保持されています．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">p <span style="color: #ff0000;">'# values'</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">values</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #000066;">values</span> <span style="color: #0000ff;">%$h</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;"># values
$VAR1 = [
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8
        ];
$VAR1 = [
          8,
          4,
          7,
          6,
          5
        ];</pre></div></div>

<h4>add</h4>
<p>キーと値のペアを追加します．値は複数まとめて追加できます．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">p <span style="color: #ff0000;">'# add'</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">add</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'f'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get_all</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'f'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;"># add
$VAR1 = bless( {
                 'e' =&gt; 8,
                 'c' =&gt; 4,
                 'a' =&gt; 7,
                 'b' =&gt; 6,
                 'd' =&gt; 5,
                 'f' =&gt; 20
               }, 'Hash::MultiValue' );
$VAR1 = [
          10,
          20
        ];</pre></div></div>

<h4>remove</h4>
<p>指定したキーとそれに対応する値すべてを削除します．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">p <span style="color: #ff0000;">'# remove'</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">remove</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'f'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get_all</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'f'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;"># remove
$VAR1 = bless( {
                 'e' =&gt; 8,
                 'c' =&gt; 4,
                 'a' =&gt; 7,
                 'b' =&gt; 6,
                 'd' =&gt; 5
               }, 'Hash::MultiValue' );
$VAR1 = [];</pre></div></div>

<h4>clear</h4>
<p>内容を空にします．オブジェクト自体は消えません．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">p <span style="color: #ff0000;">'# clear'</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">clear</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">keys</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;"># clear
$VAR1 = bless( {}, 'Hash::MultiValue' );
$VAR1 = [];</pre></div></div>

<h4>flatten</h4>
<p>「キー」「値」「キー」「値」．．．と，保持された順序で列挙したリストが得られます．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">p <span style="color: #ff0000;">'# flatten'</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">flatten</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;"># flatten
$VAR1 = [
          'a',
          1,
          'b',
          2,
          'a',
          3,
          'c',
          4,
          'd',
          5,
          'b',
          6,
          'a',
          7,
          'e',
          8
        ];</pre></div></div>

<h4>each</h4>
<p>ペアそれぞれについて，引数として定義されるサブルーチンを実行します．サブルーチン内では，第1引数，第2引数が，実行の対象となるペアのキー，値を，それぞれ参照します．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">p <span style="color: #ff0000;">'# each'</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">each</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #009900;">&#123;</span> d <span style="color: #ff0000;">&quot;$_[0] =&gt; $_[1]&quot;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$k</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$v</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">each</span> <span style="color: #0000ff;">%$h</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> d <span style="color: #ff0000;">&quot;$k ==&gt; $v&quot;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;"># each
$VAR1 = 'a =&gt; 1';
$VAR1 = 'b =&gt; 2';
$VAR1 = 'a =&gt; 3';
$VAR1 = 'c =&gt; 4';
$VAR1 = 'd =&gt; 5';
$VAR1 = 'b =&gt; 6';
$VAR1 = 'a =&gt; 7';
$VAR1 = 'e =&gt; 8';
$VAR1 = 'e ==&gt; 8';
$VAR1 = 'c ==&gt; 4';
$VAR1 = 'a ==&gt; 7';
$VAR1 = 'b ==&gt; 6';
$VAR1 = 'd ==&gt; 5';</pre></div></div>

<h4>clone</h4>
<p>Hash::MultiValueオブジェクトを複製します．参照先（？）もまったく別のものとなります．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">p <span style="color: #ff0000;">'# clone'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$hh1</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$hh2</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$hh3</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">$h</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">clone</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">%$h</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$hh1</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$hh2</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$hh3</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">&quot;$h&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;$hh1&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;$hh2&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;$hh3&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;"># clone
$VAR1 = bless( {
                 'e' =&gt; 8,
                 'c' =&gt; 4,
                 'a' =&gt; 7,
                 'b' =&gt; 6,
                 'd' =&gt; 5
               }, 'Hash::MultiValue' );
$VAR1 = bless( {
                 'e' =&gt; 8,
                 'c' =&gt; 4,
                 'a' =&gt; 7,
                 'b' =&gt; 6,
                 'd' =&gt; 5
               }, 'Hash::MultiValue' );
$VAR1 = 'e';
$VAR1 = [
          'Hash::MultiValue=HASH(0x81b634)',
          'Hash::MultiValue=HASH(0x81b634)',
          'Hash::MultiValue=HASH(0x844960)',
          'e'
        ];</pre></div></div>

<h4>as_hashref</h4>
<p>オブジェクトの持つ内容を，単なるハッシュリファレンスに変換したものが得られます．もちろん，「同じキーの重複」もなく「キー・値のペアの順序」も保証されません．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">p <span style="color: #ff0000;">'# as_hashref'</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">as_hashref</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;"># as_hashref
$VAR1 = {
          'e' =&gt; 8,
          'c' =&gt; 4,
          'a' =&gt; 7,
          'b' =&gt; 6,
          'd' =&gt; 5
        };</pre></div></div>

<h4>as_hashref_mixed，mixed</h4>
<p>自身の内容を，値にスカラとリストリファレンスが混在したハッシュリファレンスへ変換したものが得られます．文章がなんだか変です．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">p <span style="color: #ff0000;">'# as_hasref_mixed, mixed'</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">as_hashref_mixed</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">mixed</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;"># as_hasref_mixed, mixed
$VAR1 = {
          'e' =&gt; 8,
          'c' =&gt; 4,
          'a' =&gt; [
                 1,
                 3,
                 7
               ],
          'b' =&gt; [
                 2,
                 6
               ],
          'd' =&gt; 5
        };
$VAR1 = {
          'e' =&gt; 8,
          'c' =&gt; 4,
          'a' =&gt; [
                 1,
                 3,
                 7
               ],
          'b' =&gt; [
                 2,
                 6
               ],
          'd' =&gt; 5
        };</pre></div></div>

<h4>as_hashref_multi，multi</h4>
<p>自身の内容を，すべての値がリストリファレンスとなるハッシュリファレンスへと変換したものが得られます．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">p <span style="color: #ff0000;">'# as_hashref_multi, multi'</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">as_hashref_multi</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">multi</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;"># as_hashref_multi, multi
$VAR1 = {
          'e' =&gt; [
                 8
               ],
          'c' =&gt; [
                 4
               ],
          'a' =&gt; [
                 1,
                 3,
                 7
               ],
          'b' =&gt; [
                 2,
                 6
               ],
          'd' =&gt; [
                 5
               ]
        };
$VAR1 = {
          'e' =&gt; [
                 8
               ],
          'c' =&gt; [
                 4
               ],
          'a' =&gt; [
                 1,
                 3,
                 7
               ],
          'b' =&gt; [
                 2,
                 6
               ],
          'd' =&gt; [
                 5
               ]
        };</pre></div></div>

<h4>from_mixed</h4>
<p>クラスメソッドとして使います．「mixed」なハッシュリファレンスを引数として与えると，そのデータを内容としたHash::MultiValueオブジェクトが得られます．<code>as_hashref_mixed</code>メソッドのちょうど反対の操作です．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;">p <span style="color: #ff0000;">'# from_mixed'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$mixed</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
    o <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span>
    p <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
    <span style="color: #000066;">q</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">7</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
    r <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">9</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$h</span> <span style="color: #339933;">=</span> Hash<span style="color: #339933;">::</span><span style="color: #006600;">MultiValue</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">from_mixed</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$mixed</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$mixed</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">flatten</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;"># from_mixed
$VAR1 = {
          'p' =&gt; [
                 3,
                 4,
                 5
               ],
          'r' =&gt; 9,
          'q' =&gt; [
                 7
               ],
          'o' =&gt; 1
        };
$VAR1 = bless( {
                 'p' =&gt; 5,
                 'r' =&gt; 9,
                 'q' =&gt; 7,
                 'o' =&gt; 1
               }, 'Hash::MultiValue' );
$VAR1 = [
          'p',
          3,
          'p',
          4,
          'p',
          5,
          'r',
          9,
          'q',
          7,
          'o',
          1
        ];</pre></div></div>

<h3>「順序のあるハッシュ」という位置づけ</h3>
<blockquote cite="http://twitter.com/issm/status/8962937150"><p>
Hash::MultiValueって，「順序のあるハッシュ」としても使えるのかな．<br />
<cite><a href="http://twitter.com/issm/status/8962937150" title="Twitter / IWATA, Susumu : Hash::MultiValueって，「順序のあるハ ...">Twitter / IWATA, Susumu : Hash::MultiValueって，「順序のあるハ &#8230;</a></cite>
</p></blockquote>
<blockquote cite="http://twitter.com/miyagawa/status/8976157197"><p>
@issm つかえます＞Hash::MultiValue<br />
<cite><a href="http://twitter.com/miyagawa/status/8976157197" title="Twitter / Tatsuhiko Miyagawa: @issm つかえます＞Hash::MultiValue">Twitter / Tatsuhiko Miyagawa: @issm つかえます＞Hash::MultiValue</a></cite>
</p></blockquote>
<p>値の重複はさせず，「ペアの順序を保持する」という特徴だけを利用すれば，「順序のある」ハッシュが実現できてしまうわけですね．</p>
<p><a href="http://search.cpan.org/~timb/DBI-1.609/DBI.pm#fetchall_hashref">DBIモジュールの<code>fetchall_hashref</code>メソッド</a>あたりで何か楽しいことができないでしょうかね．</p>
<h3>参考</h3>
<ul class="links">
<li><a href="http://search.cpan.org/~miyagawa/Hash-MultiValue-0.07/lib/Hash/MultiValue.pm" title="Hash::MultiValue - search.cpan.org">Hash::MultiValue &#8211; search.cpan.org</a></li>
<li><a href="http://d.hatena.ne.jp/tokuhirom/20100129/1264733540#" title="Plack::Request と Hash::MultiValue の話 - TokuLog 改めB日記">Plack::Request と Hash::MultiValue の話 &#8211; TokuLog 改めB日記</a></li>
</ul>
<h3>おわりに</h3>
<p>以上，Hash::MultiValueモジュール（バージョン0.07）におけるメソッドを，ざっとひととおり試してみました．</p>
<p>これまでも，スカラまたはリストリファレンスのいずれかが各キーの値となるようなハッシュリファレンスの処理ってコードが冗長になりがちだったため，このモジュールはいろいろな場面でオモシロク使えるんじゃないかな，と思います．これから慣れてみます．</p>
<p>（<a href="http://search.cpan.org/perldoc?Tie::Hash::MultiValue">Tie::Hash::MultiValue</a>なるモジュールが存在していたようですが，無知でした＞＜）</p>
<p>．．．今確認したところ，もう0.08が出てますね．</p>
<ul class="links">
<li><a href="http://search.cpan.org/~miyagawa/Hash-MultiValue-0.08/" title="Tatsuhiko Miyagawa / Hash-MultiValue-0.08 - search.cpan.org">Tatsuhiko Miyagawa / Hash-MultiValue-0.08 &#8211; search.cpan.org</a></li>
</ul>
<h3 class="appendix">サンプルコードをまとめて</h3>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/env perl</span>
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> utf8<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> Hash<span style="color: #339933;">::</span><span style="color: #006600;">MultiValue</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Try<span style="color: #339933;">::</span><span style="color: #006600;">Tiny</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Data<span style="color: #339933;">::</span><span style="color: #006600;">Dumper</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> p <span style="color: #009900;">&#123;</span> <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">sub</span> d <span style="color: #009900;">&#123;</span> <span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@pairs</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">%h</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$h</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">@pairs</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>
    a <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span>
    b <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span>
    a <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span>
    c <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span>
    d <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span>
    b <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">6</span><span style="color: #339933;">,</span>
    a <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">7</span><span style="color: #339933;">,</span>
    e <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">8</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">%h</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@pairs</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$h</span> <span style="color: #339933;">=</span> Hash<span style="color: #339933;">::</span><span style="color: #006600;">MultiValue</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@pairs</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
d <span style="color: #0000ff;">\@pairs</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">\%h</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">;</span>
&nbsp;
p <span style="color: #ff0000;">'# get'</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'a'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>a<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'f'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
p <span style="color: #ff0000;">'# get_one'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$k</span> <span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">qw/b d f/</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    try<span style="color: #009900;">&#123;</span>
        d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get_one</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$k</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> catch <span style="color: #009900;">&#123;</span>
        d <span style="color: #0000ff;">$_</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
p <span style="color: #ff0000;">'# get_all'</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get_all</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'a'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get_all</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'f'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
p <span style="color: #ff0000;">'# keys'</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">keys</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #000066;">keys</span> <span style="color: #0000ff;">%$h</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
p <span style="color: #ff0000;">'# values'</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">values</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #000066;">values</span> <span style="color: #0000ff;">%$h</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
p <span style="color: #ff0000;">'# add'</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">add</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'f'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get_all</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'f'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
p <span style="color: #ff0000;">'# remove'</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">remove</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'f'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get_all</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'f'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
p <span style="color: #ff0000;">'# clear'</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">clear</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">keys</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #0000ff;">$h</span> <span style="color: #339933;">=</span> Hash<span style="color: #339933;">::</span><span style="color: #006600;">MultiValue</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@pairs</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
p <span style="color: #ff0000;">'# flatten'</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">flatten</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
p <span style="color: #ff0000;">'# each'</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">each</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #009900;">&#123;</span> d <span style="color: #ff0000;">&quot;$_[0] =&gt; $_[1]&quot;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$k</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$v</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">each</span> <span style="color: #0000ff;">%$h</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> d <span style="color: #ff0000;">&quot;$k ==&gt; $v&quot;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
&nbsp;
p <span style="color: #ff0000;">'# clone'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$hh1</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$hh2</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$hh3</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">$h</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">clone</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">%$h</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$hh1</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$hh2</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$hh3</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">&quot;$h&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;$hh1&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;$hh2&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;$hh3&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
p <span style="color: #ff0000;">'# as_hashref'</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">as_hashref</span><span style="color: #339933;">;</span>
&nbsp;
p <span style="color: #ff0000;">'# as_hasref_mixed, mixed'</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">as_hashref_mixed</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">mixed</span><span style="color: #339933;">;</span>
&nbsp;
p <span style="color: #ff0000;">'# as_hashref_multi, multi'</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">as_hashref_multi</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">multi</span><span style="color: #339933;">;</span>
&nbsp;
p <span style="color: #ff0000;">'# from_mixed'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$mixed</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
    o <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span>
    p <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
    <span style="color: #000066;">q</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">7</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
    r <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">9</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$h</span> <span style="color: #339933;">=</span> Hash<span style="color: #339933;">::</span><span style="color: #006600;">MultiValue</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">from_mixed</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$mixed</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$mixed</span><span style="color: #339933;">;</span>
d <span style="color: #0000ff;">$h</span><span style="color: #339933;">;</span>
d <span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$h</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">flatten</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">__END__</span></pre></div></div>

<h3 class="appendix">実行結果をまとめて</h3>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% sample.pl
$VAR1 = [
          'a',
          1,
          'b',
          2,
          'a',
          3,
          'c',
          4,
          'd',
          5,
          'b',
          6,
          'a',
          7,
          'e',
          8
        ];
$VAR1 = {
          'e' =&gt; 8,
          'c' =&gt; 4,
          'a' =&gt; 7,
          'b' =&gt; 6,
          'd' =&gt; 5
        };
$VAR1 = bless( {
                 'e' =&gt; 8,
                 'c' =&gt; 4,
                 'a' =&gt; 7,
                 'b' =&gt; 6,
                 'd' =&gt; 5
               }, 'Hash::MultiValue' );
&nbsp;
# get
$VAR1 = 7;
$VAR1 = 7;
$VAR1 = undef;
&nbsp;
# get_one
$VAR1 = 'Multiple values match: b at ./sample.pl line 40
';
$VAR1 = 5;
$VAR1 = 'Key not found: f at ./sample.pl line 40
';
&nbsp;
# get_all
$VAR1 = [
          1,
          3,
          7
        ];
$VAR1 = [];
&nbsp;
# keys
$VAR1 = [
          'a',
          'b',
          'a',
          'c',
          'd',
          'b',
          'a',
          'e'
        ];
$VAR1 = [
          'e',
          'c',
          'a',
          'b',
          'd'
        ];
&nbsp;
# values
$VAR1 = [
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8
        ];
$VAR1 = [
          8,
          4,
          7,
          6,
          5
        ];
&nbsp;
# add
$VAR1 = bless( {
                 'e' =&gt; 8,
                 'c' =&gt; 4,
                 'a' =&gt; 7,
                 'b' =&gt; 6,
                 'd' =&gt; 5,
                 'f' =&gt; 20
               }, 'Hash::MultiValue' );
$VAR1 = [
          10,
          20
        ];
&nbsp;
# remove
$VAR1 = bless( {
                 'e' =&gt; 8,
                 'c' =&gt; 4,
                 'a' =&gt; 7,
                 'b' =&gt; 6,
                 'd' =&gt; 5
               }, 'Hash::MultiValue' );
$VAR1 = [];
&nbsp;
# clear
$VAR1 = bless( {}, 'Hash::MultiValue' );
$VAR1 = [];
&nbsp;
# flatten
$VAR1 = [
          'a',
          1,
          'b',
          2,
          'a',
          3,
          'c',
          4,
          'd',
          5,
          'b',
          6,
          'a',
          7,
          'e',
          8
        ];
&nbsp;
# each
$VAR1 = 'a =&gt; 1';
$VAR1 = 'b =&gt; 2';
$VAR1 = 'a =&gt; 3';
$VAR1 = 'c =&gt; 4';
$VAR1 = 'd =&gt; 5';
$VAR1 = 'b =&gt; 6';
$VAR1 = 'a =&gt; 7';
$VAR1 = 'e =&gt; 8';
$VAR1 = 'e ==&gt; 8';
$VAR1 = 'c ==&gt; 4';
$VAR1 = 'a ==&gt; 7';
$VAR1 = 'b ==&gt; 6';
$VAR1 = 'd ==&gt; 5';
&nbsp;
# clone
$VAR1 = bless( {
                 'e' =&gt; 8,
                 'c' =&gt; 4,
                 'a' =&gt; 7,
                 'b' =&gt; 6,
                 'd' =&gt; 5
               }, 'Hash::MultiValue' );
$VAR1 = bless( {
                 'e' =&gt; 8,
                 'c' =&gt; 4,
                 'a' =&gt; 7,
                 'b' =&gt; 6,
                 'd' =&gt; 5
               }, 'Hash::MultiValue' );
$VAR1 = 'e';
$VAR1 = [
          'Hash::MultiValue=HASH(0x81b634)',
          'Hash::MultiValue=HASH(0x81b634)',
          'Hash::MultiValue=HASH(0x844960)',
          'e'
        ];
&nbsp;
# as_hashref
$VAR1 = {
          'e' =&gt; 8,
          'c' =&gt; 4,
          'a' =&gt; 7,
          'b' =&gt; 6,
          'd' =&gt; 5
        };
&nbsp;
# as_hasref_mixed, mixed
$VAR1 = {
          'e' =&gt; 8,
          'c' =&gt; 4,
          'a' =&gt; [
                 1,
                 3,
                 7
               ],
          'b' =&gt; [
                 2,
                 6
               ],
          'd' =&gt; 5
        };
$VAR1 = {
          'e' =&gt; 8,
          'c' =&gt; 4,
          'a' =&gt; [
                 1,
                 3,
                 7
               ],
          'b' =&gt; [
                 2,
                 6
               ],
          'd' =&gt; 5
        };
&nbsp;
# as_hashref_multi, multi
$VAR1 = {
          'e' =&gt; [
                 8
               ],
          'c' =&gt; [
                 4
               ],
          'a' =&gt; [
                 1,
                 3,
                 7
               ],
          'b' =&gt; [
                 2,
                 6
               ],
          'd' =&gt; [
                 5
               ]
        };
$VAR1 = {
          'e' =&gt; [
                 8
               ],
          'c' =&gt; [
                 4
               ],
          'a' =&gt; [
                 1,
                 3,
                 7
               ],
          'b' =&gt; [
                 2,
                 6
               ],
          'd' =&gt; [
                 5
               ]
        };
&nbsp;
# from_mixed
$VAR1 = {
          'p' =&gt; [
                 3,
                 4,
                 5
               ],
          'r' =&gt; 9,
          'q' =&gt; [
                 7
               ],
          'o' =&gt; 1
        };
$VAR1 = bless( {
                 'p' =&gt; 5,
                 'r' =&gt; 9,
                 'q' =&gt; 7,
                 'o' =&gt; 1
               }, 'Hash::MultiValue' );
$VAR1 = [
          'p',
          3,
          'p',
          4,
          'p',
          5,
          'r',
          9,
          'q',
          7,
          'o',
          1
        ];
%</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.iwa-ya.net/2010/02/12/080259/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.iwa-ya.net/2010/02/12/080259" />
	<feedburner:origLink>http://blog.iwa-ya.net/2010/02/12/080259</feedburner:origLink></item>
		<item>
		<title>[plack][perl] Plackにおけるファイルアップロード処理の準備メモ</title>
		<link>http://feedproxy.google.com/~r/issm/~3/aE3V1a7AzjM/193810</link>
		<comments>http://blog.iwa-ya.net/2010/02/11/193810#comments</comments>
		<pubDate>Thu, 11 Feb 2010 10:38:10 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[plack]]></category>

		<guid isPermaLink="false">http://blog.iwa-ya.net/?p=2382</guid>
		<description><![CDATA[

2010-02-11 14:38 追記
修正版を掲載しました．

[plack][perl] Plackにおけるファイルアップロード処理の準備メモ・改 «  岩家ぶろぐ





2010-02-11 20:55 追 [...]]]></description>
			<content:encoded><![CDATA[<p><ins datetime="2010-02-11T14:38:00+09:00"></p>
<div class="note">
<b>2010-02-11 14:38 追記</b><br />
修正版を掲載しました．</p>
<ul class="links">
<li><a href="http://blog.iwa-ya.net/2010/02/12/143801" title="[plack][perl] Plackにおけるファイルアップロード処理の準備メモ・改 «  岩家ぶろぐ">[plack][perl] Plackにおけるファイルアップロード処理の準備メモ・改 «  岩家ぶろぐ</a></li>
</ul>
</div>
<p></ins></p>
<p><ins datetime="2010-02-11T20:55:00+09:00"></p>
<div class="note">
<b>2010-02-11 20:55 追記</b><br />
本エントリの内容は，<a href="http://search.cpan.org/~miyagawa/Plack-0.9031/">Plack-0.9031</a>におけるものです．</p>
<p>本エントリの投稿時点で「**DEVELOPER RELEASE**」として<a href="http://search.cpan.org/~miyagawa/Plack-0.99_05/">Plack-0.99_05</a>が公開されてれおり，「0.9031」から内容が大きく変わっています．</p>
<p>@miyagawa<br />
ご指摘ありがとうございます．
</p></div>
<p></ins></p>
<h3>はじめに</h3>
<p><a href="http://conferences.yapcasia.org/ya2009/">YAPC::Asia 2009</a>でのキーワードの1つとなった<a href="http://www.google.com/search?q=psgi%20plack">PSGI/Plack</a>について，ようやく少しかじり出しました．</p>
<p>まずは，Plack Advent Calendarを一日かけて一気読み，ほんの表面的だけですが，ようやく概要くらいはつかめた気がします．</p>
<ul class="links">
<li><a href="http://advent.plackperl.org/" title="Plack Advent Calendar">Plack Advent Calendar</a></li>
</ul>
<p>前置きはさておき，以下，Plackにおけるファイルアップロード処理のための，ほんのざっと下調べしたメモを備忘録として残しておきます．</p>
<h3>こんな感じのフォームの場合</h3>
<p>サンプルとして次のようなフォームからアップロードを行うことを考えてみます．</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">form</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #000066;">method</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;post&quot;</span></span>
<span style="color: #009900;">      <span style="color: #000066;">enctype</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;multipart/form-data&quot;</span>&gt;</span>
  ファイル 1-1
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file1&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
&nbsp;
  ファイル 1-2
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file1&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
&nbsp;
  ファイル 2
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file2&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
&nbsp;
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;submit&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;submit&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;アップロード！&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">form</span>&gt;</span></pre></div></div>

<h3>Plack::Request::Uploadオブジェクトを取得する</h3>
<h4>アップロードオブジェクトの集合体（？）</h4>
<p>Plack::Requestオブジェクトのuploadsメソッドを呼ぶことで，ファイルアップロードの要素の集合を，ハッシュリファレンスとして取得できます．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># $req: Plack::Request</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$uploads</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$req</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">uploads</span><span style="color: #339933;">;</span></pre></div></div>

<h4>データ構成</h4>
<p><var>$uploads</var>がどんな構成なのかを，ダンプして確認してみます．スペースの都合上，<code>$VAR1 =</code>な部分は削ってます．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> Data<span style="color: #339933;">::</span><span style="color: #006600;">Dumper</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">$uploads</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">{
  'file2' =&gt; bless( {
                      'headers' =&gt; bless( {
                                            'content-disposition' =&gt; 'form-data; name=&quot;file2&quot;; filename=&quot;9a8ba767.jpg&quot;',
                                            'content-type' =&gt; 'image/jpeg'
                                          }, 'HTTP::Headers' ),
                      'filename' =&gt; '9a8ba767.jpg',
                      'tempname' =&gt; '/tmp/zKMx5lPeQm',
                      'size' =&gt; 102723
                    }, 'Plack::Request::Upload' ),
  'file1' =&gt; [
               bless( {
                        'headers' =&gt; bless( {
                                              'content-disposition' =&gt; 'form-data; name=&quot;file1&quot;; filename=&quot;6ac3d070.jpg&quot;',
                                              'content-type' =&gt; 'image/jpeg'
                                            }, 'HTTP::Headers' ),
                        'filename' =&gt; '6ac3d070.jpg',
                        'tempname' =&gt; '/tmp/MsOfRtTGPe',
                        'size' =&gt; 59307
                      }, 'Plack::Request::Upload' ),
               bless( {
                        'headers' =&gt; bless( {
                                              'content-disposition' =&gt; 'form-data; name=&quot;file1&quot;; filename=&quot;7a98edb3.jpg&quot;',
                                              'content-type' =&gt; 'image/jpeg'
                                            }, 'HTTP::Headers' ),
                        'filename' =&gt; '7a98edb3.jpg',
                        'tempname' =&gt; '/tmp/iSiVfM9ghl',
                        'size' =&gt; 301283
                      }, 'Plack::Request::Upload' )
             ]
};</pre></div></div>

<h4>特定のフィールドの要素を取得する</h4>
<p>ということで，フィールド名をハッシュリファレンス<var>$uploads</var>のキーとして指定してやればOKです．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$up1</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$uploads</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>file1<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$up2</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$uploads</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>file2<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>ただし，冒頭のフォームのように，1つのフィールドに複数の要素が存在する場合，リストリファレンスが得られることに注意です．この場合，リストの要素がそれぞれPlack::Request::Uploadオブジェクトとなっています．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000066;">print</span> Dumper <span style="color: #000066;">ref</span> <span style="color: #0000ff;">$up1</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> Dumper <span style="color: #000066;">ref</span> <span style="color: #0000ff;">$up2</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">$VAR1 = 'ARRAY';
$VAR1 = 'Plack::Request::Upload';</pre></div></div>

<h3>Plack::Request::Uploadオブジェクトのメソッド</h3>
<p><a href="http://search.cpan.org/perldoc?Plack::Request::Upload">CPANのPlack::Request::Uploadモジュールのページ</a>には，現在4つのメソッドのみ書かれていますが，同モジュールの基となっている（のかな？不勉強です＞＜）<a href="http://search.cpan.org/perldoc?Catalyst::Request::Upload">Catalyst::Request::Uploadモジュール</a>同じ感じで使えるみたいですね．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">$up1</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">tempname</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">$up1</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">type</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">$up1</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">headers</span><span style="color: #339933;">;</span>
<span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">$up1</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">fh</span><span style="color: #339933;">;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">$VAR1 = '/tmp/O3ECOY_iD8';
$VAR1 = 'image/jpeg';
$VAR1 = bless( {
                 'content-disposition' =&gt; 'form-data; name=&quot;file1&quot;; filename=&quot;6ac3d070.jpg&quot;',
                 'content-type' =&gt; 'image/jpeg'
               }, 'HTTP::Headers' );
$VAR1 = \*{'Plack::Request::Upload::$fh'};</pre></div></div>

<h3>参考</h3>
<p>詳しくはこのあたりを．</p>
<ul class="links">
<li><a href="http://search.cpan.org/perldoc?Plack::Request::Upload">Plack::Request::Upload &#8211; search.cpan.org</a></li>
<li><a href="http://search.cpan.org/perldoc?Plack::Request">Plack::Request &#8211; search.cpan.org</a></li>
<li><a href="http://search.cpan.org/perldoc?Catalyst::Request::Upload">Catalyst::Request::Upload &#8211; search.cpan.org</a></li>
<li><a href="http://search.cpan.org/perldoc?HTTP::Headers">HTTP::Headers &#8211; search.cpan.org</a></li>
</ul>
<h3>おわりに</h3>
<p>Plackの部分でほとんどやってくれてますので，ファイルのアップロード処理も簡単に準備できますね．</p>
<p>あとは<a href="http://swfupload.org/">SWFUpload</a>との連携もしなければ．．．あ，<a href="http://swfupload.org/forum/news/1955">2.5.0 Beta 2</a>に上がってるじゃん．</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.iwa-ya.net/2010/02/11/193810/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.iwa-ya.net/2010/02/11/193810" />
	<feedburner:origLink>http://blog.iwa-ya.net/2010/02/11/193810</feedburner:origLink></item>
		<item>
		<title>[neta] 膝を伸ばせないようなサイズの浴槽についてごにょごにょ</title>
		<link>http://feedproxy.google.com/~r/issm/~3/Soq7vG9UlfM/051941</link>
		<comments>http://blog.iwa-ya.net/2010/02/07/051941#comments</comments>
		<pubDate>Sat, 06 Feb 2010 20:19:41 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[ふと考えごと]]></category>
		<category><![CDATA[neta]]></category>

		<guid isPermaLink="false">http://blog.iwa-ya.net/?p=2375</guid>
		<description><![CDATA[はじめに
お風呂に入っていたらなんだか気になりだしたので，そのままアウトプット．テキトーにスルーの方向で．
考えてたこと
一人暮らしのアパートとかをはじめ，膝を伸ばせないくらいのサイズの浴槽ってけっこうあると思います．入 [...]]]></description>
			<content:encoded><![CDATA[<h3>はじめに</h3>
<p>お風呂に入っていたらなんだか気になりだしたので，そのままアウトプット．テキトーにスルーの方向で．</p>
<h3>考えてたこと</h3>
<p>一人暮らしのアパートとかをはじめ，膝を伸ばせないくらいのサイズの浴槽ってけっこうあると思います．入浴時，体育座り（三角座りとも）のような体制にならざるを得なくなります（次図）．</p>
<div class="flickr-photo-noresize">
<a href="http://www.flickr.com/photos/issm/4334801457/" title="fig-2010-02-07-01 on Flickr"><img src="http://farm5.static.flickr.com/4052/4334801457_f47ff5784f.jpg" alt="fig-2010-02-07-01 on Flickr" title="fig-2010-02-07-01 on Flickr" /></a>
</div>
<p>まぁ体格にもよりますが，基本足を伸ばせないので，膝とお尻と踵を結ぶ三角形の内側の空間（？）が寂しい感じになります（次図）．</p>
<div class="flickr-photo-noresize">
<a href="http://www.flickr.com/photos/issm/4335543664/" title="fig-2010-02-07-02 on Flickr"><img src="http://farm3.static.flickr.com/2702/4335543664_2bbbc21ff6.jpg" alt="fig-2010-02-07-02 on Flickr" title="fig-2010-02-07-02 on Flickr" /></a>
</div>
<p>で，どうせこの空間に（手以外で）触れることができないのであれば，もういっそ，その三角形に沿うように浴槽の底を上げちゃえばいいんじゃね？みたいな（死語）．その分使うお湯も減るし，もともと再利用率低いし，みたいな（死語）．（次図）</p>
<div class="flickr-photo-noresize">
<a href="http://www.flickr.com/photos/issm/4335543716/" title="fig-2010-02-07-03 on Flickr"><img src="http://farm5.static.flickr.com/4030/4335543716_0468931ed7.jpg" alt="fig-2010-02-07-03 on Flickr" title="fig-2010-02-07-03 on Flickr" /></a>
</div>
<p>しかし完全固定だと，誰かと二人でいっしょに入るようなシチュエーションのときに後悔するかもしれないので，謎の技術で脱着できるようにしてみたらいいんじゃね？みたいな（死語）．（次図）</p>
<div class="flickr-photo-noresize">
<a href="http://www.flickr.com/photos/issm/4334801605/" title="fig-2010-02-07-04 on Flickr"><img src="http://farm5.static.flickr.com/4041/4334801605_01b24e93e6.jpg" alt="fig-2010-02-07-04 on Flickr" title="fig-2010-02-07-04 on Flickr" /></a>
</div>
<h3>おわりに</h3>
<p>．．．とまぁそんなことを，温めた<a href="http://www.amazon.co.jp/gp/product/B000FP3P3Y?ie=UTF8&#038;tag=issm-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=B000FP3P3Y">ゆたぽん</a><img src="http://www.assoc-amazon.jp/e/ir?t=issm-22&#038;l=as2&#038;o=9&#038;a=B000FP3P3Y" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />を布団の中へ設置して，久しぶりにしっかり寝る気満々でお湯に浸かって，冷えきった体に入り込んでくる熱に幸せを感じた途端，考え始めてしまってました．</p>
<p>これを書いている間に，体は十分に冷えちゃいました．それでは，おやすみなさい＞＜</p>
<p>ちなみに，元画像はこちらより．</p>
<ul class="links">
<li><a href="http://yaruo.jp/?v=01193" title="やる夫のAAデータベース - やる夫・三角座り">やる夫のAAデータベース &#8211; やる夫・三角座り</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.iwa-ya.net/2010/02/07/051941/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.iwa-ya.net/2010/02/07/051941" />
	<feedburner:origLink>http://blog.iwa-ya.net/2010/02/07/051941</feedburner:origLink></item>
		<item>
		<title>お客様より液晶モニタをご提供いただきました</title>
		<link>http://feedproxy.google.com/~r/issm/~3/6e2vjBcOT60/180246</link>
		<comments>http://blog.iwa-ya.net/2010/02/06/180246#comments</comments>
		<pubDate>Sat, 06 Feb 2010 09:02:46 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[お仕事的な何か]]></category>

		<guid isPermaLink="false">http://blog.iwa-ya.net/?p=2365</guid>
		<description><![CDATA[


現在（といってもけっこう前からですがｗ）お仕事をさせていただいている写真の伊里様より，液晶モニタLCD-AD221EBをご提供いただきました．もちろん新品ですよｗ

写真の伊里｜スクールフォト専門店

この場を借り [...]]]></description>
			<content:encoded><![CDATA[<div class="flickr-photo">
<a href="http://www.flickr.com/photos/issm/4333679399/" title="P1380534 on Flickr"><img src="http://farm3.static.flickr.com/2748/4333679399_e496b48c29.jpg" alt="P1380534 on Flickr" title="P1380534 on Flickr" /></a>
</div>
<p>現在（といってもけっこう前からですがｗ）お仕事をさせていただいている<a href="http://syashinnoiri.co.jp/">写真の伊里</a>様より，液晶モニタ<a href="http://www.amazon.co.jp/exec/obidos/ASIN/B001VH8I3W/issm-22/ref=nosim/">LCD-AD221EB</a>をご提供いただきました．もちろん新品ですよｗ</p>
<ul class="links">
<li><a href="http://syashinnoiri.co.jp/" title="写真の伊里｜スクールフォト専門店">写真の伊里｜スクールフォト専門店</a></li>
</ul>
<p>この場を借りて，改めてお礼申し上げます．</p>
<p>2，3年くらい前に <a href="http://www.eizo.co.jp/products/discontinued/lcd/files/P1700-R.pdf">P1700</a>（PDF）とか<a href="http://www.eizo.co.jp/products/discontinued/lcd/m1700/index.html">M1700</a>とかを買って以来，液晶モニタについてはほとんどチェックしていませんでしたが，今って1920&#215;1080とかの解像度のものがこんな値段で買えてしまうんですね．スゴイ時代です．．．</p>
<h3>amazonさん</h3>
<ul class="amazlet">
<li>
<div class="amazlet-box">
<div class="amazlet-image"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B001VH8I3W/issm-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/31LoqH6iDCL._SL160_.jpg" alt="I-O DATA 16:9ワイド液晶ディスプレイ LCD-AD221EB" /></a></div>
<div class="amazlet-info">
<div class="amazlet-name"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B001VH8I3W/issm-22/ref=nosim/" name="amazletlink" target="_blank">I-O DATA 16:9ワイド液晶ディスプレイ LCD-AD221EB</a>
<div class="amazlet-powered-date">posted with <a href="http://www.amazlet.com/browse/ASIN/B001VH8I3W/issm-22/ref=nosim/" title="I-O DATA 16:9ワイド液晶ディスプレイ LCD-AD221EB" target="_blank">amazlet</a> at 10.02.06</div>
</div>
<div class="amazlet-detail">アイ・オー・データ (2009-03-23)<br />売り上げランキング: 372</div>
<div class="amazlet-link"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B001VH8I3W/issm-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer"></div>
</div>
</li>
</ul>
<p><br class="cl" /></p>
<h3 class="appendix">おまけ</h3>
<p>今さらですが，「R.O.D」のサントラを買って聴いていたりします．「OVA」「THE TV」のオープニングとか「偉人組曲」とかテンション上がりますよ．</p>
<p>あ，そういえば，Blu-ray BOX出るんですね．まだBlu-rayプレイヤすら持ってないや＞＜</p>
<ul class="amazlet">
<li>
<div class="amazlet-box">
<div class="amazlet-image"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00005R6K5/issm-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51IvtdmUFBL._SL160_.jpg" alt="R.O.D ― オリジナル・サウンドトラック" /></a></div>
<div class="amazlet-info">
<div class="amazlet-name"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00005R6K5/issm-22/ref=nosim/" name="amazletlink" target="_blank">R.O.D ― オリジナル・サウンドトラック</a>
<div class="amazlet-powered-date">posted with <a href="http://www.amazlet.com/browse/ASIN/B00005R6K5/issm-22/ref=nosim/" title="R.O.D ― オリジナル・サウンドトラック" target="_blank">amazlet</a> at 10.02.06</div>
</div>
<div class="amazlet-detail">ビデオ・サントラ <br />SME・ビジュアルワークス (2001-11-21)<br />売り上げランキング: 13597</div>
<div class="amazlet-link"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B00005R6K5/issm-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer"></div>
</div>
</li>
<li>
<div class="amazlet-box">
<div class="amazlet-image"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000BV7Y1G/issm-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51t0cLc8mkL._SL160_.jpg" alt="R.O.D-THE TV-ORIGINAL SOUND TRACK" /></a></div>
<div class="amazlet-info">
<div class="amazlet-name"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000BV7Y1G/issm-22/ref=nosim/" name="amazletlink" target="_blank">R.O.D-THE TV-ORIGINAL SOUND TRACK</a>
<div class="amazlet-powered-date">posted with <a href="http://www.amazlet.com/browse/ASIN/B000BV7Y1G/issm-22/ref=nosim/" title="R.O.D-THE TV-ORIGINAL SOUND TRACK" target="_blank">amazlet</a> at 10.02.06</div>
</div>
<div class="amazlet-detail">TVサントラ kazami with HOME GROWN 三浦理恵子 <br />アニプレックス (2004-03-24)<br />売り上げランキング: 14130</div>
<div class="amazlet-link"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000BV7Y1G/issm-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer"></div>
</div>
</li>
<li>
<div class="amazlet-box">
<div class="amazlet-image"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B002ZG75QE/issm-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51QZaNpAZbL._SL160_.jpg" alt="R.O.D -THE COMPLETE- Blu-ray BOX　【完全生産限定盤】" /></a></div>
<div class="amazlet-info">
<div class="amazlet-name"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B002ZG75QE/issm-22/ref=nosim/" name="amazletlink" target="_blank">R.O.D -THE COMPLETE- Blu-ray BOX　【完全生産限定盤】</a>
<div class="amazlet-powered-date">posted with <a href="http://www.amazlet.com/browse/ASIN/B002ZG75QE/issm-22/ref=nosim/" title="R.O.D -THE COMPLETE- Blu-ray BOX　【完全生産限定盤】" target="_blank">amazlet</a> at 10.02.06</div>
</div>
<div class="amazlet-detail">アニプレックス (2010-04-07)<br />売り上げランキング: 383</div>
<div class="amazlet-link"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B002ZG75QE/issm-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer"></div>
</div>
</li>
</ul>
<p><br class="cl" /></p>
<p>「R.O.D」といえば，こちらも気になるところです．</p>
<ul class="links">
<li><a href="http://www.uchushow.net/" title="宇宙ショーへようこそ　2010 ROADSHOW">宇宙ショーへようこそ　2010 ROADSHOW</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.iwa-ya.net/2010/02/06/180246/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.iwa-ya.net/2010/02/06/180246" />
	<feedburner:origLink>http://blog.iwa-ya.net/2010/02/06/180246</feedburner:origLink></item>
		<item>
		<title>[perl][cpan] 今さらながらCache::FileCacheを触ってみた</title>
		<link>http://feedproxy.google.com/~r/issm/~3/svavfVPXijI/064253</link>
		<comments>http://blog.iwa-ya.net/2010/02/05/064253#comments</comments>
		<pubDate>Thu, 04 Feb 2010 21:42:53 +0000</pubDate>
		<dc:creator>issm</dc:creator>
				<category><![CDATA[技術メモ]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[cpan]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://blog.iwa-ya.net/?p=2345</guid>
		<description><![CDATA[はじめに

tokuhirom&#8217;s cgi-extlib-perl at master &#8211; GitHub

このあたりを見て，ポータブルな（サーバに置くだけで動作する？）モジュールについて，ちょこ [...]]]></description>
			<content:encoded><![CDATA[<h3>はじめに</h3>
<ul class="links">
<li><a href="http://github.com/tokuhirom/cgi-extlib-perl" title="tokuhirom's cgi-extlib-perl at master - GitHub">tokuhirom&#8217;s cgi-extlib-perl at master &#8211; GitHub</a></li>
</ul>
<p>このあたりを見て，ポータブルな（サーバに置くだけで動作する？）モジュールについて，ちょこっとだけ勉強を始めました．</p>
<p>この先何回か，ここにあるモジュールを触ってみたメモなんかをエントリしてみようと思います．</p>
<p>今回は，<a href="http://search.cpan.org/perldoc?Cache::FileCache">Cache::FileCache</a>モジュールについてです．恥ずかしながら，これまでデータとかのキャッシュ処理を扱ったことがほとんどなかったので，そのあたりの勉強もかねて．</p>
<ul class="links">
<li><a href="http://search.cpan.org/perldoc?Cache::FileCache" title="Cache::FileCache - search.cpan.org">Cache::FileCache &#8211; search.cpan.org</a></li>
<li><a href="http://search.cpan.org/perldoc?Cache::Cache" title="Cache::Cache - search.cpan.org">Cache::Cache &#8211; search.cpan.org</a></li>
</ul>
<p>では以下．</p>
<h3>基本</h3>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> Cache<span style="color: #339933;">::</span><span style="color: #006600;">FileCache</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$cache</span> <span style="color: #339933;">=</span> Cache<span style="color: #339933;">::</span><span style="color: #006600;">FileCache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    namespace          <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'filecache_sample'</span><span style="color: #339933;">,</span>
    default_expires_in <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>キャッシュするには，<code>set</code>メソッドを呼びます．後で値を引き出すための「キー」と値自身を引数に渡します．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$to_be_cached</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'hogehoge'</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'keyname'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$to_be_cached</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>この場合，Cache::FileCacheオブジェクト生成時に指定した<code>default_expires_in</code>パラメータの値が表す時間だけ保持されます．</p>
<p>保持する時間を変更したい場合は，第3引数にその値を指定すればOKです．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'keyname'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$to_be_cached</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">60</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>キャッシュした値を取得するには，先で指定した「キー」を引数に，<code>get</code>メソッドで呼び出します．保持期限を過ぎていたり，指定した「キー」に対応する値が存在しない場合には<code>undef</code>が返ります．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$cached</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'keyname'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;"># 保持期限内 ? 'hogehoge' : undef</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$undef</span>  <span style="color: #339933;">=</span> <span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'hogehoge'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;"># undef</span></pre></div></div>

<p>簡単ですね．</p>
<p>イメージ的には，「ファイルシステムレベルでのハッシュ」みたいな感じ，とでも言いましょうか．</p>
<h3>とりあえず使ってみる</h3>
<p><span id="more-2345"></span></p>
<p>まずは，キャッシュをセットしたり取得したり，保持期限前後の様子を確認してみます．</p>
<p>（<code>sample1.pl</code>のソースコードは「おわりに」以降に掲載．）</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% ./sample1.pl
&nbsp;
# about 0 sec.
$VAR1 = {
          'bar' =&gt; 'huga',
          'baz' =&gt; 'piyo',
          'foo' =&gt; 'hoge'
        };
$VAR1 = {
          'c' =&gt; '3',
          'a' =&gt; '1',
          'b' =&gt; '2'
        };
&nbsp;
# about 5 sec.
$VAR1 = {
          'bar' =&gt; 'huga',
          'baz' =&gt; 'piyo',
          'foo' =&gt; 'hoge'
        };
$VAR1 = {
          'c' =&gt; '3',
          'a' =&gt; '1',
          'b' =&gt; '2'
        };
&nbsp;
# about 11 sec.
$VAR1 = undef;
$VAR1 = {
          'c' =&gt; '3',
          'a' =&gt; '1',
          'b' =&gt; '2'
        };
&nbsp;
# about 15 sec.
$VAR1 = undef;
$VAR1 = {
          'c' =&gt; '3',
          'a' =&gt; '1',
          'b' =&gt; '2'
        };
&nbsp;
# about 21 sec.
$VAR1 = undef;
$VAR1 = undef;
%</pre></div></div>

<h3>ディレクトリ構造とかファイルとか</h3>
<p>どのように保存されているかを確認してみます．</p>
<h4>ディレクトリ構造</h4>
<p>（<code>sample2.pl</code>のソースコードは「おわりに」以降に掲載．）</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% ./sample2.pl
&nbsp;
# cache_root
&nbsp;
/var/folders/sC/sCwCvkCpGzSDGTP6+Wood++++TI/-Tmp-/FileCache
&nbsp;
# tree
&nbsp;
/var/folders/sC/sCwCvkCpGzSDGTP6+Wood++++TI/-Tmp-/FileCache
`-- filecache_sample
    |-- 9
    |   `-- b
    |       `-- 6
    |           `-- 9b63072850833c63c5200f2c35b3edc4118f705e
    `-- a
        `-- 1
            `-- d
                `-- a1dd4114c98069523cdf1d90ff3a43222670b8c8
&nbsp;
7 directories, 2 files
&nbsp;
&nbsp;
# sha1
&nbsp;
a1dd4114c98069523cdf1d90ff3a43222670b8c8
&nbsp;
9b63072850833c63c5200f2c35b3edc4118f705e
&nbsp;
# changing cache_root
&nbsp;
# cache_root
&nbsp;
./tmp
&nbsp;
# tree
&nbsp;
./tmp
`-- filecache_sample
    |-- 9
    |   `-- b
    |       `-- 6
    |           `-- 9b63072850833c63c5200f2c35b3edc4118f705e
    `-- a
        `-- 1
            `-- d
                `-- a1dd4114c98069523cdf1d90ff3a43222670b8c8
&nbsp;
7 directories, 2 files
&nbsp;
&nbsp;
# sha1
&nbsp;
a1dd4114c98069523cdf1d90ff3a43222670b8c8
&nbsp;
9b63072850833c63c5200f2c35b3edc4118f705e
%</pre></div></div>

<p>「キャッシュルート」となるディレクトリの下に，オブジェクト生成時に<code>namespace</code>パラメータで指定した値（名前空間）のディレクトリができ，その下に，キーと値とのペアを表すファイルが入っています．名前空間ディレクトリ（？）と各ファイルとの間には，ファイル名にちなんだ名前のディレクトリが，数階層掘られています．</p>
<p>「キャッシュルート」ディレクトリは，オブジェクト生成時に指定することも可能です．</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #0000ff;">$cache</span> <span style="color: #339933;">=</span> Cache<span style="color: #339933;">::</span><span style="color: #006600;">FileCache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    namespace          <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'filecache_sample'</span><span style="color: #339933;">,</span>
    default_expires_in <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span>
    cache_root         <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'./tmp'</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>次に示すのは，キャッシュするディレクトリを先のように<code>./tmp</code>と指定した場合の，<code>ls -l</code>コマンドのbefore/afterです．</p>
<p>before:</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% ll
total 24
-rw-r--r--@ 1 iwata  staff  673  2  5 01:20 sample.yml
-rwxr-xr-x  1 iwata  staff  681  2  5 02:56 sample1.pl
-rwxr-xr-x@ 1 iwata  staff  946  2  5 03:03 sample2.pl
%</pre></div></div>

<p>after:</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% ll
total 24
-rw-r--r--@ 1 iwata  staff  673  2  5 01:20 sample.yml
-rwxr-xr-x  1 iwata  staff  681  2  5 02:56 sample1.pl
-rwxr-xr-x@ 1 iwata  staff  942  2  5 03:07 sample2.pl
drwxrwxrwx  3 iwata  staff  102  2  5 03:06 tmp
%</pre></div></div>

<h4>ファイル名と中身</h4>
<p>先の実行結果より，キャッシュファイルの名前は，「キー名のSHA1ハッシュ」ということがわかるかと思います．</p>
<p>また，キャッシュファイルを覗いてみると，次のような感じのものが確認できます．バイナリファイルですが，それっぽい部分もありますね．</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% less ./tmp/filecache_sample/a/1/d/a1dd4114c98069523cdf1d90ff3a43222670b8c8
&nbsp;
^E^G^B^@^@^@^B
^Dvar1^D^Q^MCache::Object^C^@^@^@^F^E^@^@^@^E_Size      Kk^MS^@^@^@^K_Expires_At^E^@^@^@^D_Key  Kk^M^W^@^@^@^K_Created_At^D^C^@^@^@^C
^Dhuga^@^@^@^Cbar
^Dpiyo^@^@^@^Cbaz
^Dhoge^@^@^@^Cfoo^@^@^@^E_Data  Kk^M^W^@^@^@^L_Accessed_At</pre></div></div>

<h3>cache_depthオプションとdirectory_umaskオプション</h3>
<p>Cache::FileCacheオブジェクトを生成する際のその他のオプションについてもざっと確認してみます．</p>
<p>（<code>sample3.pl</code>のソースコードは「おわりに」以降に掲載．）</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% ./sample3.pl
&nbsp;
# tree -p
&nbsp;
./tmp
`-- [drwxrwxrwx]  filecache_sample
    |-- [drwxrwxrwx]  9
    |   `-- [drwxrwxrwx]  b
    |       `-- [drwxrwxrwx]  6
    |           `-- [-rw-r--r--]  9b63072850833c63c5200f2c35b3edc4118f705e
    `-- [drwxrwxrwx]  a
        `-- [drwxrwxrwx]  1
            `-- [drwxrwxrwx]  d
                `-- [-rw-r--r--]  a1dd4114c98069523cdf1d90ff3a43222670b8c8
&nbsp;
7 directories, 2 files
&nbsp;
&nbsp;
# changing cache_depth and directory_umask
&nbsp;
# tree -p
&nbsp;
./tmp
`-- [drwxrwxrwx]  filecache_sample
    |-- [drwxrwxrwx]  9
    |   `-- [drwxrwxrwx]  b
    |       `-- [drwxrwxrwx]  6
    |           |-- [drwx------]  3
    |           |   `-- [drwx------]  0
    |           |       `-- [drwx------]  7
    |           |           `-- [-rw-r--r--]  9b63072850833c63c5200f2c35b3edc4118f705e
    |           `-- [-rw-r--r--]  9b63072850833c63c5200f2c35b3edc4118f705e
    `-- [drwxrwxrwx]  a
        `-- [drwxrwxrwx]  1
            `-- [drwxrwxrwx]  d
                |-- [-rw-r--r--]  a1dd4114c98069523cdf1d90ff3a43222670b8c8
                `-- [drwx------]  d
                    `-- [drwx------]  4
                        `-- [drwx------]  1
                            `-- [-rw-r--r--]  a1dd4114c98069523cdf1d90ff3a43222670b8c8
&nbsp;
13 directories, 4 files
&nbsp;
%</pre></div></div>

<h3>簡単なベンチマーク</h3>
<p>次の4種類の処理を，それぞれ10000回実行して比較してみました．</p>
<p>（<code>sample4.pl</code>のソースコード，YAMLファイル<code>sample.yml</code>は「おわりに」以降に掲載．）</p>
<dl>
<dt>b1</dt>
<dd>YAMLモジュールを使ってYAMLファイルを読み込み，ハッシュリファレンスに変換する</dd>
<dt>b2</dt>
<dd>YAML::Syckモジュールを使ってYAMLファイルを読み込み，ハッシュリファレンスに変換する</dd>
<dt>b3</dt>
<dd>ハッシュリファレンスのキャッシュがない場合のみ，YAMLモジュールを使ってYAMLファイルを読み込んでハッシュリファレンスに変換，キャッシュする</dd>
<dt>b4</dt>
<dd>ハッシュリファレンスのキャッシュがない場合のみ，YAML::Syckモジュールを使ってYAMLファイルを読み込んでハッシュリファレンスに変換，キャッシュする</dd>
</dl>
<p>実行したMacBookのスペックについては，次あたりを参照してください．</p>
<ul class="links">
<li><a href="http://blog.iwa-ya.net/2009/05/09/092030" title="Mac始めました «  岩家ぶろぐ">Mac始めました «  岩家ぶろぐ</a></li>
</ul>
<p>実行結果は次のようになりました．</p>

<div class="wp_syntax"><div class="code"><pre class="terminal" style="font-family:monospace;">% ./sample4.pl
Benchmark: timing 10000 iterations of b1, b2, b3, b4...
        b1: 75 wallclock secs (72.25 usr +  0.70 sys = 72.95 CPU) @ 137.08/s (n=10000)
        b2:  3 wallclock secs ( 2.16 usr +  0.28 sys =  2.44 CPU) @ 4098.36/s (n=10000)
        b3:  3 wallclock secs ( 2.62 usr +  0.64 sys =  3.26 CPU) @ 3067.48/s (n=10000)
        b4:  4 wallclock secs ( 2.59 usr +  0.64 sys =  3.23 CPU) @ 3095.98/s (n=10000)
     Rate    b1    b3    b4    b2
b1  137/s    --  -96%  -96%  -97%
b3 3067/s 2138%    --   -1%  -25%
b4 3096/s 2159%    1%    --  -24%
b2 4098/s 2890%   34%   32%    --
%</pre></div></div>

<p>このことから，次のことがわかるんじゃないかな，と．</p>
<ul>
<li>YAMLモジュールを使って毎回読み込むよりは，Cache::FileCacheによってキャッシュした方が効率がよい</li>
<li>YAML::Syckモジュールが使える場合，Cache::FileCacheによるキャッシュは逆効果っぽい</li>
</ul>
<h3>おわりに</h3>
<p>以上，Cache::FileCacheモジュールを使ってみたメモでした．Cache::Cacheモジュールのサブクラスにあたるため，そのドキュメントもざっと読んだところ，他のサブクラス（例えば<a href="http://search.cpan.org/perldoc?Cache::MemoryCache">Cache::MemoryCache</a>とか）も同じようなメソッドで操作できるようですね．今後試してみることにします．</p>
<h3 class="appendix">ソースコード：sample1.pl</h3>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/env perl</span>
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> utf8<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> YAML<span style="color: #339933;">::</span><span style="color: #006600;">Syck</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Cache<span style="color: #339933;">::</span><span style="color: #006600;">FileCache</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Data<span style="color: #339933;">::</span><span style="color: #006600;">Dumper</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> p <span style="color: #009900;">&#123;</span> <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">sub</span> d <span style="color: #009900;">&#123;</span> <span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$cache</span> <span style="color: #339933;">=</span> Cache<span style="color: #339933;">::</span><span style="color: #006600;">FileCache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    namespace          <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'filecache_sample'</span><span style="color: #339933;">,</span>
    default_expires_in <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$var1</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #000066;">qw</span><span style="color: #339933;">/</span>foo hoge bar huga baz piyo<span style="color: #339933;">/</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$var2</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #000066;">qw</span><span style="color: #339933;">/</span>a <span style="color: #cc66cc;">1</span> b <span style="color: #cc66cc;">2</span> c <span style="color: #cc66cc;">3</span><span style="color: #339933;">/</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'var1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$var1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'var2'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$var2</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> cache_test <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@plan</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$sec</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$s</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@plan</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #0000ff;">$sec</span> <span style="color: #339933;">+=</span> <span style="color: #0000ff;">$s</span><span style="color: #339933;">;</span>
        <span style="color: #000066;">sleep</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$s</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        p <span style="color: #ff0000;">&quot;# about $sec sec.&quot;</span><span style="color: #339933;">;</span>
        d <span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'var1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        d <span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'var2'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
cache_test <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">6</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">6</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">__END__</span></pre></div></div>

<h3 class="appendix">sample2.pl</h3>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/env perl</span>
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> utf8<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> YAML<span style="color: #339933;">::</span><span style="color: #006600;">Syck</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Cache<span style="color: #339933;">::</span><span style="color: #006600;">FileCache</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Data<span style="color: #339933;">::</span><span style="color: #006600;">Dumper</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> p <span style="color: #009900;">&#123;</span> <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">sub</span> d <span style="color: #009900;">&#123;</span> <span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$cache</span> <span style="color: #339933;">=</span> Cache<span style="color: #339933;">::</span><span style="color: #006600;">FileCache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    namespace          <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'filecache_sample'</span><span style="color: #339933;">,</span>
    default_expires_in <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">60</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$var1</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #000066;">qw</span><span style="color: #339933;">/</span>foo hoge bar huga baz piyo<span style="color: #339933;">/</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$var2</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #000066;">qw</span><span style="color: #339933;">/</span>a <span style="color: #cc66cc;">1</span> b <span style="color: #cc66cc;">2</span> c <span style="color: #cc66cc;">3</span><span style="color: #339933;">/</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'var1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$var1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'var2'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$var2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$cache_root</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get_cache_root</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
p <span style="color: #ff0000;">'# cache_root'</span><span style="color: #339933;">;</span>
p <span style="color: #0000ff;">$cache_root</span><span style="color: #339933;">;</span>
&nbsp;
p <span style="color: #ff0000;">'# tree'</span><span style="color: #339933;">;</span>
p <span style="color: #ff0000;">`tree $cache_root`</span><span style="color: #339933;">;</span>
&nbsp;
p <span style="color: #ff0000;">'# sha1'</span><span style="color: #339933;">;</span>
p sha1_hex <span style="color: #ff0000;">'var1'</span><span style="color: #339933;">;</span>
p sha1_hex <span style="color: #ff0000;">'var2'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># cache_rootを変更してみる</span>
<span style="color: #666666; font-style: italic;">#</span>
p <span style="color: #ff0000;">'# changing cache_root'</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set_cache_root</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'./tmp'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'var1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$var1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'var2'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$var2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #0000ff;">$cache_root</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get_cache_root</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
p <span style="color: #ff0000;">'# cache_root'</span><span style="color: #339933;">;</span>
p <span style="color: #0000ff;">$cache_root</span><span style="color: #339933;">;</span>
&nbsp;
p <span style="color: #ff0000;">'# tree'</span><span style="color: #339933;">;</span>
p <span style="color: #ff0000;">`tree $cache_root`</span><span style="color: #339933;">;</span>
&nbsp;
p <span style="color: #ff0000;">'# sha1'</span><span style="color: #339933;">;</span>
p sha1_hex <span style="color: #ff0000;">'var1'</span><span style="color: #339933;">;</span>
p sha1_hex <span style="color: #ff0000;">'var2'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">__END__</span></pre></div></div>

<h3 class="appendix">sample3.pl</h3>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/env perl</span>
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> utf8<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> YAML<span style="color: #339933;">::</span><span style="color: #006600;">Syck</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Cache<span style="color: #339933;">::</span><span style="color: #006600;">FileCache</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Digest<span style="color: #339933;">::</span><span style="color: #006600;">SHA1</span> <span style="color: #009966; font-style: italic;">qw/sha1_hex/</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Data<span style="color: #339933;">::</span><span style="color: #006600;">Dumper</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> p <span style="color: #009900;">&#123;</span> <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">sub</span> d <span style="color: #009900;">&#123;</span> <span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$cache</span> <span style="color: #339933;">=</span> Cache<span style="color: #339933;">::</span><span style="color: #006600;">FileCache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    namespace          <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'filecache_sample'</span><span style="color: #339933;">,</span>
    default_expires_in <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">60</span><span style="color: #339933;">,</span>
    cache_root         <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'./tmp'</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$var1</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #000066;">qw</span><span style="color: #339933;">/</span>foo hoge bar huga baz piyo<span style="color: #339933;">/</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$var2</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #000066;">qw</span><span style="color: #339933;">/</span>a <span style="color: #cc66cc;">1</span> b <span style="color: #cc66cc;">2</span> c <span style="color: #cc66cc;">3</span><span style="color: #339933;">/</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'var1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$var1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'var2'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$var2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$cache_root</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get_cache_root</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
p <span style="color: #ff0000;">'# tree -p'</span><span style="color: #339933;">;</span>
p <span style="color: #ff0000;">`tree -p $cache_root`</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># cache_depth，directory_umaskを変更してみる</span>
<span style="color: #666666; font-style: italic;">#</span>
p <span style="color: #ff0000;">'# changing cache_depth and directory_umask'</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set_cache_depth</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set_directory_umask</span><span style="color: #009900;">&#40;</span>077<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'var1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$var1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'var2'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$var2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
p <span style="color: #ff0000;">'# tree -p'</span><span style="color: #339933;">;</span>
p <span style="color: #ff0000;">`tree -p $cache_root`</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">__END__</span></pre></div></div>

<h3 class="appendix">sample4.pl</h3>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/env perl</span>
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> utf8<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> YAML<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> YAML<span style="color: #339933;">::</span><span style="color: #006600;">Syck</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Cache<span style="color: #339933;">::</span><span style="color: #006600;">FileCache</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Benchmark <span style="color: #009966; font-style: italic;">qw/:all/</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Data<span style="color: #339933;">::</span><span style="color: #006600;">Dumper</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> p <span style="color: #009900;">&#123;</span> <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">@_</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">sub</span> d <span style="color: #009900;">&#123;</span> <span style="color: #000066;">print</span> Dumper <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$cache</span> <span style="color: #339933;">=</span> Cache<span style="color: #339933;">::</span><span style="color: #006600;">FileCache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    namespace          <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'filecache_sample'</span><span style="color: #339933;">,</span>
    default_expires_in <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">600</span><span style="color: #339933;">,</span>
    cache_root         <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'./tmp'</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$yamlfile</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'./sample.yml'</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$b1</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$b2</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$b3</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$b4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># b1: YAML</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #0000ff;">$b1</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$hash</span> <span style="color: #339933;">=</span> YAML<span style="color: #339933;">::</span><span style="color: #006600;">LoadFile</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$yamlfile</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">return</span> <span style="color: #0000ff;">$hash</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># b2: YAML::Syck</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #0000ff;">$b2</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$hash</span> <span style="color: #339933;">=</span> YAML<span style="color: #339933;">::</span><span style="color: #006600;">Syck</span><span style="color: #339933;">::</span><span style="color: #006600;">LoadFile</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$yamlfile</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066;">return</span> <span style="color: #0000ff;">$hash</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># b3: Cache::FileCache || YAML</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #0000ff;">$b3</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$key</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'sample4_b3'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$hash</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">unless</span> <span style="color: #009900;">&#40;</span><span style="color: #000066;">defined</span> <span style="color: #0000ff;">$hash</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #0000ff;">$hash</span> <span style="color: #339933;">=</span> YAML<span style="color: #339933;">::</span><span style="color: #006600;">LoadFile</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$yamlfile</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$key</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$hash</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066;">return</span> <span style="color: #0000ff;">$hash</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># b4: Cache::FileCache || YAML::Syck</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #0000ff;">$b4</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$key</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'sample4_b4'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$hash</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">unless</span> <span style="color: #009900;">&#40;</span><span style="color: #000066;">defined</span> <span style="color: #0000ff;">$hash</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #0000ff;">$hash</span> <span style="color: #339933;">=</span> YAML<span style="color: #339933;">::</span><span style="color: #006600;">Syck</span><span style="color: #339933;">::</span><span style="color: #006600;">LoadFile</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$yamlfile</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #0000ff;">$cache</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$key</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$hash</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066;">return</span> <span style="color: #0000ff;">$hash</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$results</span> <span style="color: #339933;">=</span> timethese<span style="color: #009900;">&#40;</span>
    <span style="color: #cc66cc;">10</span>_000<span style="color: #339933;">,</span>
    <span style="color: #009900;">&#123;</span>
        b1 <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$b1</span><span style="color: #339933;">,</span>
        b2 <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$b2</span><span style="color: #339933;">,</span>
        b3 <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$b3</span><span style="color: #339933;">,</span>
        b4 <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$b4</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
cmpthese<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$results</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">__END__</span></pre></div></div>

<h3 class="appendix">sample.yml</h3>

<div class="wp_syntax"><div class="code"><pre class="yaml" style="font-family:monospace;">---
LOCATION:
  PROTOCOL:  http
  DOMAIN:    denske.local
  SUBDOMAIN: www.
  PATH:      /path
&nbsp;
PAGE:
  COMMON_CSS: [_base, _layout, _additional]
  COMMON_JS:  [_base, _additional]
&nbsp;
DSI:
  DBI:  1
  YAML: 1
&nbsp;
DB:
  TYPE:   mysql
  NAME:   sample
  HOST:   localhost
  USER:   sample
  PASSWD: samplepasswd
  TABLE_PREFIX: sample_
&nbsp;
CACHE:
  ENABLED:   1
  NAMESPACE: samplesample
  EXPIRES:   600
&nbsp;
COOKIE:
  EXPIRES: +14d
  DOMAIN:  
  PATH:    /
  SECURE:  0
&nbsp;
MAIL:
  SERVER_SMTP: localhost:587
  ADDRESS:
    FROM: noreply@example.com
    CC:
  SIGNATURE: |
    --
    your email signature.
&nbsp;
SESSION_KEY_NAME: sample_session
&nbsp;
CONTENT_TYPE_DEFAULT: text/html; charset=utf-8</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.iwa-ya.net/2010/02/05/064253/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.iwa-ya.net/2010/02/05/064253" />
	<feedburner:origLink>http://blog.iwa-ya.net/2010/02/05/064253</feedburner:origLink></item>
	</channel>
</rss>
