<?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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>jmblog.jp</title>
	
	<link>http://jmblog.jp</link>
	<description>ぼちぼち更新していきます</description>
	<lastBuildDate>Mon, 08 Feb 2010 00:00:00 PST</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/jp/jmblog" /><feedburner:info uri="jp/jmblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><image><url>http://feeds.feedburner.jp/~fc/jmblog?bg=FFFFFF&amp;amp;fg=0099CC&amp;amp;anim=0</url></image><item><title>Links for 2010-02-07 [del.icio.us]</title><link>http://feedproxy.google.com/~r/jp/jmblog/~3/AfpGdlKoTA0/caol_ila</link><pubDate>Mon, 08 Feb 2010 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/caol_ila#2010-02-07</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.designerstoolbox.com/designresources/"&gt;Designers Toolbox: Design Resources&lt;/a&gt;&lt;br/&gt;
Web Safe Area とか Web Browser Elements とかいろいろ便利なまとめサイト&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/caol_ila#2010-02-07</feedburner:origLink></item><item><title>Links for 2010-02-06 [del.icio.us]</title><link>http://feedproxy.google.com/~r/jp/jmblog/~3/HUBYsJq-6LA/caol_ila</link><pubDate>Sun, 07 Feb 2010 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/caol_ila#2010-02-06</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.smashingmagazine.com/2010/02/05/50-free-ui-and-web-design-wireframing-kits-resources-and-source-files/"&gt;50 Free UI and Web Design Wireframing Kits, Resources and Source Files - Smashing Magazine&lt;/a&gt;&lt;br/&gt;
フリーのワイヤーフレームツール50選&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/caol_ila#2010-02-06</feedburner:origLink></item><item><title>Links for 2010-02-03 [del.icio.us]</title><link>http://feedproxy.google.com/~r/jp/jmblog/~3/JR7UrQMxQZ4/caol_ila</link><pubDate>Thu, 04 Feb 2010 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/caol_ila#2010-02-03</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://html5doctor.com/article-archive/"&gt;Article Archive | HTML5 Doctor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://processingjs.org/"&gt;Processing.js&lt;/a&gt;&lt;br/&gt;
Processing.js uses Javascript to draw shapes and manipulate images on the HTML5 Canvas element.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.modernizr.com/"&gt;Modernizr&lt;/a&gt;&lt;br/&gt;
CSS3の各種プロパティが有効かを検出するためのライブラリ&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.creamu.com/mt/2010/02/fireworks.html"&gt;Fireworks&amp;#12398;&amp;#32032;&amp;#26448;&amp;#38598;&amp;#27770;&amp;#23450;&amp;#29256; | CREAMU&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/caol_ila#2010-02-03</feedburner:origLink></item><item><title>Links for 2010-02-02 [del.icio.us]</title><link>http://feedproxy.google.com/~r/jp/jmblog/~3/yZcjFGqC7po/caol_ila</link><pubDate>Wed, 03 Feb 2010 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/caol_ila#2010-02-02</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.skyrocketlabs.com/categories/tutorials/jdiv/demo/index.html"&gt;jDiv | A Skyrocket Labs jQuery plugin&lt;/a&gt;&lt;br/&gt;
多くのコンテンツが設置できるドロップダウン型のナビゲーション&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/caol_ila#2010-02-02</feedburner:origLink></item><item><title>Links for 2010-02-01 [del.icio.us]</title><link>http://feedproxy.google.com/~r/jp/jmblog/~3/Ydt9_UjOXA0/caol_ila</link><pubDate>Tue, 02 Feb 2010 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/caol_ila#2010-02-01</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.ie6nomore.com/code-samples.html"&gt;Code Samples - IE6 No More&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/caol_ila#2010-02-01</feedburner:origLink></item><item><title>Links for 2010-01-28 [del.icio.us]</title><link>http://feedproxy.google.com/~r/jp/jmblog/~3/AIpRewf0uYo/caol_ila</link><pubDate>Fri, 29 Jan 2010 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/caol_ila#2010-01-28</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://gihyo.jp/dev/serial/01/chrome-extensions"&gt;&amp;#36899;&amp;#36617;&amp;#65306;&amp;#32154;&amp;#12539;&amp;#20808;&amp;#21462;&amp;#12426;&amp;#65281; Google Chrome Extensions&amp;#65372;gihyo.jp &amp;hellip; &amp;#25216;&amp;#34899;&amp;#35413;&amp;#35542;&amp;#31038;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.serendip.ws/archives/3823"&gt;Google Chrome Extensions (&amp;#25313;&amp;#24373;&amp;#27231;&amp;#33021;) &amp;#12434;&amp;#20316;&amp;#12387;&amp;#12390;&amp;#12415;&amp;#12427; : Serendip - Web&amp;#12487;&amp;#12470;&amp;#12452;&amp;#12531;&amp;#12539;&amp;#12503;&amp;#12525;&amp;#12464;&amp;#12521;&amp;#12511;&amp;#12531;&amp;#12464;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/caol_ila#2010-01-28</feedburner:origLink></item><item><title>Links for 2010-01-26 [del.icio.us]</title><link>http://feedproxy.google.com/~r/jp/jmblog/~3/zWwe0Gwit7M/caol_ila</link><pubDate>Wed, 27 Jan 2010 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/caol_ila#2010-01-26</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.ideaxidea.com/archives/2010/01/dummy_image.html"&gt;&amp;#12371;&amp;#12356;&amp;#12388;&amp;#12399;&amp;#20415;&amp;#21033;&amp;#65281;&amp;#22909;&amp;#12365;&amp;#12394;&amp;#12469;&amp;#12452;&amp;#12474;&amp;#12398;&amp;#12480;&amp;#12511;&amp;#12540;&amp;#30011;&amp;#20687;&amp;#12364;&amp;#21205;&amp;#30340;&amp;#12395;&amp;#20316;&amp;#12428;&amp;#12427;&amp;#12302;Dummy Image&amp;#12303; - IDEA*IDEA &amp;#65374; &amp;#30334;&amp;#24335;&amp;#31649;&amp;#29702;&amp;#20154;&amp;#12398;&amp;#12521;&amp;#12452;&amp;#12501;&amp;#12495;&amp;#12483;&amp;#12463;&amp;#12502;&amp;#12525;&amp;#12464;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/tokuhirom/20090615/1245067184"&gt;Re: Perl &amp;#12363;&amp;#12425; MySQL &amp;#12395;&amp;#38750;&amp;#21516;&amp;#26399;&amp;#12450;&amp;#12463;&amp;#12475;&amp;#12473;&amp;#12377;&amp;#12427;&amp;#26041;&amp;#27861; - TokuLog &amp;#25913;&amp;#12417;B&amp;#26085;&amp;#35352;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/caol_ila#2010-01-26</feedburner:origLink></item><item>
		<title>TheSchwartzで関連するジョブをグルーピングしてまとめて実行する</title>
		<link>http://feedproxy.google.com/~r/jp/jmblog/~3/3AgxQb5b3MU/591</link>
		<comments>http://jmblog.jp/archives/591#comments</comments>
		<pubDate>Tue, 19 Jan 2010 10:34:22 +0000</pubDate>
		<dc:creator>Yoshihide</dc:creator>
				<category><![CDATA[webdev]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://jmblog.jp/?p=591</guid>
		<description>TheSchwartz では、関連するジョブをグルーピングしてまとめて実行することができるとドキュメントに書いてあったので、試しにやってみました。（参考にしたのは、Movable Type のソースコード。）

グルーピングしない場合
まずは、普通に処理する場合。キューにジョブを追加する client.pl はこんな感じ。
#!/usr/bin/perl
use strict;
use warnings;
use TheSchwartz;
use DateTime;

my $client = TheSchwartz-&amp;#62;new&amp;#40;
&amp;#160; &amp;#160; databases =&amp;#62; &amp;#91;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#123; &amp;#160; 
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; dsn =&amp;#62; 'dbi:mysql:TheSchwartz',
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; user =&amp;#62; 'db_user',
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; pass =&amp;#62; 'db_password',
&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#125; &amp;#160; 
&amp;#160; &amp;#160; &amp;#93;, [...]</description>
			<content:encoded><![CDATA[<p>TheSchwartz では、関連するジョブをグルーピングしてまとめて実行することができると<a href="http://search.cpan.org/dist/TheSchwartz/lib/TheSchwartz.pm">ドキュメント</a>に書いてあったので、試しにやってみました。（参考にしたのは、Movable Type のソースコード。）</p>
<p><span id="more-591"></span></p>
<h3>グルーピングしない場合</h3>
<p>まずは、普通に処理する場合。キューにジョブを追加する client.pl はこんな感じ。</p>
<div class="codecolorer-container perl blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="perl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span><br />
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> TheSchwartz<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> DateTime<span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$client</span> <span style="color: #339933;">=</span> TheSchwartz<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; databases <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#123;</span> &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dsn <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'dbi:mysql:TheSchwartz'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; user <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'db_user'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pass <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'db_password'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> &nbsp; <br />
&nbsp; &nbsp; <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> &nbsp;<br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #0000ff;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">insert</span><span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">'SampleWorker1'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span> datetime <span style="color: #339933;">=&gt;</span> DateTime<span style="color: #339933;">-&gt;</span><span style="color: #006600;">now</span><span style="color: #009900;">&#40;</span> time_zone <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'local'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;added a &nbsp;job<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span></div></div>
<p>続いて、溜まったジョブを実行する worker.pl はこんな感じ。</p>
<div class="codecolorer-container perl blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="perl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">package</span> SampleWorker1<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> base <span style="color: #000066;">qw</span><span style="color: #009900;">&#40;</span> TheSchwartz<span style="color: #339933;">::</span><span style="color: #006600;">Worker</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> TheSchwartz<span style="color: #339933;">::</span><span style="color: #006600;">Job</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">sub</span> work <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">my</span> TheSchwartz<span style="color: #339933;">::</span><span style="color: #006600;">Job</span> <span style="color: #0000ff;">$job</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;[%s] %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$job</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">arg</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>datetime<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">hms</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$job</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">funcname</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; <span style="color: #0000ff;">$job</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">completed</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000066;">package</span> main<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> TheSchwartz<span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$client</span> <span style="color: #339933;">=</span> TheSchwartz<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; databases <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#123;</span> &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dsn <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'dbi:mysql:TheSchwartz'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; user <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'db_user'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pass <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'db_password'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> &nbsp; <br />
&nbsp; &nbsp; <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> &nbsp;<br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #0000ff;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">can_do</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'SampleWorker1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #0000ff;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">work</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>worker.pl を実行すると監視状態になるので、client.pl を何度か叩いてみます。すると、以下のような結果が返ってきます。</p>
<pre>
[18:43:48] SampleWorker1
[18:43:49] SampleWorker1
[18:43:51] SampleWorker1
[18:43:54] SampleWorker1
[18:43:53] SampleWorker1
[18:43:52] SampleWorker1
[18:43:56] SampleWorker1
[18:43:58] SampleWorker1
[18:43:57] SampleWorker1
[18:43:59] SampleWorker1
</pre>
<h3>グルーピングする場合</h3>
<p>では、本題。まず client.pl です。ジョブをグルーピングするには、TheSchwartz::Job のインスタンスを生成して、coalesce というプロパティに値をセットします。</p>
<div class="codecolorer-container perl blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="perl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span><br />
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> TheSchwartz<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> DateTime<span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$database_info</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span> <br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span> &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; dsn <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'dbi:mysql:TheSchwartz'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; user <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'db_user'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; pass <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'db_password'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span> &nbsp; <br />
<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$client</span> <span style="color: #339933;">=</span> TheSchwartz<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span> databases <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$database_info</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">### Group A ###</span><br />
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$job</span> <span style="color: #339933;">=</span> TheSchwartz<span style="color: #339933;">::</span><span style="color: #006600;">Job</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; funcname <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'SampleWorker2'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; coalesce <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'group_A'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; arg &nbsp; &nbsp; &nbsp;<span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; datetime <span style="color: #339933;">=&gt;</span> DateTime<span style="color: #339933;">-&gt;</span><span style="color: #006600;">now</span><span style="color: #009900;">&#40;</span> time_zone <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'local'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #0000ff;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">insert</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$job</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;added a job to Group A<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">### Group B ###</span><br />
<span style="color: #0000ff;">$job</span> <span style="color: #339933;">=</span> TheSchwartz<span style="color: #339933;">::</span><span style="color: #006600;">Job</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; funcname <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'SampleWorker2'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; coalesce <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'group_B'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; arg &nbsp; &nbsp; &nbsp;<span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; datetime <span style="color: #339933;">=&gt;</span> DateTime<span style="color: #339933;">-&gt;</span><span style="color: #006600;">now</span><span style="color: #009900;">&#40;</span> time_zone <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'local'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #0000ff;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">insert</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$job</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;added a job to Group B<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">### Non grouped job ###</span><br />
<span style="color: #0000ff;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">insert</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'SampleWorker2'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span> datetime <span style="color: #339933;">=&gt;</span> DateTime<span style="color: #339933;">-&gt;</span><span style="color: #006600;">now</span><span style="color: #009900;">&#40;</span> time_zone <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'local'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;added a job<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span></div></div>
<p>続いて worker.pl ですが、こちらはちょっとだけ工夫が要ります。work() メソッドが受け取ったジョブに coalesce がセットされていれば、TheSchwartz の find_job_with_coalescing_value() メソッドを利用して、同じ値がセットされているジョブを見つけて、まとめて実行します。</p>
<div class="codecolorer-container perl blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="perl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">package</span> SampleWorker2<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> base <span style="color: #000066;">qw</span><span style="color: #009900;">&#40;</span> TheSchwartz<span style="color: #339933;">::</span><span style="color: #006600;">Worker</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> TheSchwartz<span style="color: #339933;">::</span><span style="color: #006600;">Job</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">sub</span> work <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">my</span> TheSchwartz<span style="color: #339933;">::</span><span style="color: #006600;">Job</span> <span style="color: #0000ff;">$job</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span> &nbsp; &nbsp;<br />
&nbsp; &nbsp; <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@jobs</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; <span style="color: #000066;">push</span> <span style="color: #0000ff;">@jobs</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$job</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$key</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$job</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">coalesce</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;work for &quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$job</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">coalesce</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><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$client</span> <span style="color: #339933;">=</span> TheSchwartz<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; databases <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#123;</span> &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dsn <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'dbi:mysql:TheSchwartz'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; user <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'db_user'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pass <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'db_password'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$coalesced_job</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">find_job_with_coalescing_value</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$class</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">push</span> <span style="color: #0000ff;">@jobs</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$coalesced_job</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> &nbsp; <br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span> &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #b1b100;">foreach</span> <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$j</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@jobs</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;[%s] %s %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$j</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">arg</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>datetime<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">hms</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$j</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">funcname</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$j</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">coalesce</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">$j</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">completed</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span> &nbsp; <br />
&nbsp; &nbsp; <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><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000066;">package</span> main<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> TheSchwartz<span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$client</span> <span style="color: #339933;">=</span> TheSchwartz<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; databases <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#123;</span> &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dsn <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'dbi:mysql:TheSchwartz'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; user <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'db_user'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pass <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'db_password'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #0000ff;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">can_do</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'SampleWorker2'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #0000ff;">$client</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">work</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>client.pl を何度か叩いた後、worker.pl を実行すると、以下のような結果が得られました。group_A および group_B のジョブが一度の処理でまとめて実行されていることがわかります。</p>
<pre>
work for group_A
[19:10:01] SampleWorker2 group_A
[19:10:03] SampleWorker2 group_A
[19:10:02] SampleWorker2 group_A
---------
[19:10:01] SampleWorker2
---------
work for group_B
[19:10:02] SampleWorker2 group_B
[19:10:03] SampleWorker2 group_B
[19:10:01] SampleWorker2 group_B
---------
[19:10:02] SampleWorker2
---------
[19:10:03] SampleWorker2
---------
</pre>
<p>以上！</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/jp/jmblog?a=3AgxQb5b3MU:0snGlAAfe4s:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/jp/jmblog?d=OAQBO0PjnPA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/jp/jmblog?a=3AgxQb5b3MU:0snGlAAfe4s:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/jp/jmblog?d=spdCosxkSQE" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://jmblog.jp/archives/591/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jmblog.jp/archives/591</feedburner:origLink></item>
		<item>
		<title>Coroの初歩的なハマリどころ</title>
		<link>http://feedproxy.google.com/~r/jp/jmblog/~3/Zb9N0isTxNU/537</link>
		<comments>http://jmblog.jp/archives/537#comments</comments>
		<pubDate>Mon, 14 Dec 2009 08:06:22 +0000</pubDate>
		<dc:creator>Yoshihide</dc:creator>
				<category><![CDATA[webdev]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://jmblog.jp/?p=537</guid>
		<description>時代は、Coroだ！AnyEventだ！ということで、

AnyEvent::Intro &amp;#8211; search.cpan.org
Coro/Intro.pod &amp;#8211; search.cpan.org

あたりを読みながらお勉強しているときに、ちょいハマった。

use strict;
use warnings;
use Coro;
use Perl6::Say;

async &amp;#123;
&amp;#160; &amp;#160; say 'hello';
&amp;#125;
cede;
このスクリプトを動かすと、
hello
と出力されるはず、なのに何も表示されない。こんな単純なコードなのに、なぜだー！と思ってよく見たら、 async の最後のセミコロンが抜けてた・・・
これなら動く。
use strict;
use warnings;
use Coro;
use Perl6::Say;

async &amp;#123;
&amp;#160; &amp;#160; say 'hello';
&amp;#125;;
cede;
でも何で構文エラーにならないんでしょう？async は
async &amp;#123;
&amp;#160; &amp;#160; print &amp;#34;@_\n&amp;#34;;
&amp;#125; 1,2,3,4;
というように、引数を受け取ることができるので、もしかして cede が引数として渡されてる？と思ったけど、
async &amp;#123;
&amp;#160; &amp;#160; say @_;
&amp;#125;
cede;
cede;
とやっても
cede
とは出力されない。Coroのコードを読んでも良くわからなかった。何で・・・？？</description>
			<content:encoded><![CDATA[<p>時代は、Coroだ！AnyEventだ！ということで、</p>
<ul>
<li><a href="http://search.cpan.org/dist/AnyEvent/lib/AnyEvent/Intro.pod">AnyEvent::Intro &#8211; search.cpan.org</a></li>
<li><a href="http://search.cpan.org/dist/Coro/Coro/Intro.pod">Coro/Intro.pod &#8211; search.cpan.org</a></li>
</ul>
<p>あたりを読みながらお勉強しているときに、ちょいハマった。</p>
<p><span id="more-537"></span></p>
<div class="codecolorer-container perl blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="perl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> Coro<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> Perl6<span style="color: #339933;">::</span><span style="color: #006600;">Say</span><span style="color: #339933;">;</span><br />
<br />
async <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; say <span style="color: #ff0000;">'hello'</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
cede<span style="color: #339933;">;</span></div></div>
<p>このスクリプトを動かすと、</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">hello</div></div>
<p>と出力されるはず、なのに何も表示されない。こんな単純なコードなのに、なぜだー！と思ってよく見たら、 async の最後のセミコロンが抜けてた・・・</p>
<p>これなら動く。</p>
<div class="codecolorer-container perl blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="perl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> Coro<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> Perl6<span style="color: #339933;">::</span><span style="color: #006600;">Say</span><span style="color: #339933;">;</span><br />
<br />
async <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; say <span style="color: #ff0000;">'hello'</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
cede<span style="color: #339933;">;</span></div></div>
<p>でも何で構文エラーにならないんでしょう？async は</p>
<div class="codecolorer-container perl blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="perl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">async <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <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><br />
<span style="color: #009900;">&#125;</span> 1<span style="color: #339933;">,</span>2<span style="color: #339933;">,</span>3<span style="color: #339933;">,</span><span style="color: #cc66cc;">4</span><span style="color: #339933;">;</span></div></div>
<p>というように、引数を受け取ることができるので、もしかして cede が引数として渡されてる？と思ったけど、</p>
<div class="codecolorer-container perl blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="perl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">async <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; say <span style="color: #0000ff;">@_</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
cede<span style="color: #339933;">;</span><br />
cede<span style="color: #339933;">;</span></div></div>
<p>とやっても</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">cede</div></div>
<p>とは出力されない。Coroのコードを読んでも良くわからなかった。何で・・・？？</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/jp/jmblog?a=Zb9N0isTxNU:j-bzm2iMm4E:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/jp/jmblog?d=OAQBO0PjnPA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/jp/jmblog?a=Zb9N0isTxNU:j-bzm2iMm4E:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/jp/jmblog?d=spdCosxkSQE" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://jmblog.jp/archives/537/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jmblog.jp/archives/537</feedburner:origLink></item>
		<item>
		<title>YAPC::Asia 2009 の感想</title>
		<link>http://feedproxy.google.com/~r/jp/jmblog/~3/AXoVIOkT7ho/517</link>
		<comments>http://jmblog.jp/archives/517#comments</comments>
		<pubDate>Mon, 14 Sep 2009 12:54:17 +0000</pubDate>
		<dc:creator>Yoshihide</dc:creator>
				<category><![CDATA[webdev]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://jmblog.jp/?p=517</guid>
		<description>Perl を使って早10年。はじめて YAPC::Asia に行ってきました。あまりエントリーを書く時間がないので、簡単に感想とかメモとか。（あんまりまとまってないです。）

1日目
「モダンPerl入門」の入門

ちょうど今やってるプロジェクトと同じ状況（初めて Catalyst ＋モダンPerl に挑戦）なので、共感できるところが多かった。
Catalyst::Model::Adaptor をいちいち書くのは確かにめんどくさい。でも Catalyst::Model::MultiAdaptor を使えばラクチンらしい。
自分のプロジェクトでは、API（Service と呼んでるけど）は CRUD もビジネスロジックも一つになってるけど、レプリケーションとかに対応するなら、確かにAPIをLogicとDataに分けた方が管理しやすそう。

PSGI &amp;#8211; Perl Server Gateway Interface

ちがうセッションを聞いていたので聞けず・・・なんだか評判がよかったみたいなので、あとから資料追いたい。今年は PSGI が熱いらしい。

シックス・アパート・フレームワーク


my $entry = MT::Entry-&amp;#62;new;
って書き方は古くって、今は
my $entry = MT-&amp;#62;model('entry')-&amp;#62;new;
と書くそうな。思いっきり前者で書いた。
アメリカと日本との開発体制はいろいろと大変そう。離れているとどうしても伝わらないことってあるからなぁ。

modern Catalyst
スライド：http://www.slideshare.net/hidek/modern-catalyst

Moose な Catalyst の話。断片的な知識が整理できてよかった。
&amp;#8220;Sugar Syntax&amp;#8221; というキーワードが出てきたけど、どういう意味なんだろう？？
Moose もっと勉強しなければ。

Event programming fun with AnyEvent and Coro

miyagawa 氏のトーク。すごくわかりやすい。さすが。
AnyEvent と Coro が熱いらしい。

ペパボでの Perl のつかいかた

このセッションもそうだけど、「コーポレートトラック」は実際の業務に使えそうな話がたくさん聞けてよかった。コーポレートトラックを設けたのは初めての試みだったそうだけど、とてもよいと思います。仕事に使えるのって大事。
Perlbal 試してみたい。

Corporate Perl in Recruit, OpenSocial and Emoji

身内の話なのでコメントは特にないですが、Recruit が Perl を長年採用してきたのは本当。私もPerl [...]</description>
			<content:encoded><![CDATA[<p>Perl を使って早10年。はじめて YAPC::Asia に行ってきました。あまりエントリーを書く時間がないので、簡単に感想とかメモとか。（あんまりまとまってないです。）</p>
<p><span id="more-517"></span></p>
<h2>1日目</h2>
<h3>「モダンPerl入門」の入門</h3>
<ul>
<li>ちょうど今やってるプロジェクトと同じ状況（初めて Catalyst ＋モダンPerl に挑戦）なので、共感できるところが多かった。</li>
<li>Catalyst::Model::Adaptor をいちいち書くのは確かにめんどくさい。でも Catalyst::Model::MultiAdaptor を使えばラクチンらしい。</li>
<li>自分のプロジェクトでは、API（Service と呼んでるけど）は CRUD もビジネスロジックも一つになってるけど、レプリケーションとかに対応するなら、確かにAPIをLogicとDataに分けた方が管理しやすそう。</li>
</ul>
<h3>PSGI &#8211; Perl Server Gateway Interface</h3>
<ul>
<li>ちがうセッションを聞いていたので聞けず・・・なんだか評判がよかったみたいなので、あとから資料追いたい。今年は PSGI が熱いらしい。</li>
</ul>
<h3>シックス・アパート・フレームワーク</h3>
<ul>
<li>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">my $entry = MT::Entry-&gt;new;</div></div>
<p>って書き方は古くって、今は</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">my $entry = MT-&gt;model('entry')-&gt;new;</div></div>
<p>と書くそうな。思いっきり前者で書いた。</li>
<li>アメリカと日本との開発体制はいろいろと大変そう。離れているとどうしても伝わらないことってあるからなぁ。</li>
</ul>
<h3>modern Catalyst</h3>
<p>スライド：<a href="http://www.slideshare.net/hidek/modern-catalyst">http://www.slideshare.net/hidek/modern-catalyst</a></p>
<ul>
<li>Moose な Catalyst の話。断片的な知識が整理できてよかった。</li>
<li>&#8220;Sugar Syntax&#8221; というキーワードが出てきたけど、どういう意味なんだろう？？</li>
<li>Moose もっと勉強しなければ。</li>
</ul>
<h3>Event programming fun with AnyEvent and Coro</h3>
<ul>
<li>miyagawa 氏のトーク。すごくわかりやすい。さすが。</li>
<li>AnyEvent と Coro が熱いらしい。</li>
</ul>
<h3>ペパボでの Perl のつかいかた</h3>
<ul>
<li>このセッションもそうだけど、「コーポレートトラック」は実際の業務に使えそうな話がたくさん聞けてよかった。コーポレートトラックを設けたのは初めての試みだったそうだけど、とてもよいと思います。仕事に使えるのって大事。</li>
<li>Perlbal 試してみたい。</li>
</ul>
<h3>Corporate Perl in Recruit, OpenSocial and Emoji</h3>
<ul>
<li>身内の話なのでコメントは特にないですが、Recruit が Perl を長年採用してきたのは本当。私もPerl エンジニアの一人です。</li>
</ul>
<h3>Lightning Talks (1)</h3>
<ul>
<li>yusukebe 氏の miyagawanize 最高！！</li>
</ul>
<h2>2日目</h2>
<h3>FormValidator::LazyWay で検証ルールをまとめよう</h3>
<ul>
<li>正直、FormValidator::Simple との違い（どっちがよいのか）がわかっていない。今度実際に試してみよう。</li>
</ul>
<h3>スケールするウェブアプリケーションを20分で作る方法</h3>
<ul>
<li>難しい・・・全然ついていけなかった・・・</li>
<li>シャーディングって何？</li>
</ul>
<h3>kamaitachi &#8211; perl flash media server</h3>
<ul>
<li>Flash とか ActionScript はどうしても敬遠してしまうのはなぜなんだろう。</li>
<li>でもこんなの作れたらかっこいいなぁー</li>
</ul>
<h3>perl hacks on vim</h3>
<p>スライド：<a href="http://www.slideshare.net/c9s/perlhacksonvim">http://www.slideshare.net/c9s/perlhacksonvim</a></p>
<ul>
<li>もっと Vim を使いこなせるようにならねば。</li>
<li>:set equalprg=perltidy</li>
<li>perlprove.vim</li>
</ul>
<h3>大規模画像配信を支えるPerl</h3>
<ul>
<li>mixi の中の話。</li>
<li>この規模のインフラとかアーキテクチャって、すごいよ、本当に。</li>
<li>富豪プログラミングを改めて、もっとパフォーマンスにシビアになったほうがいいかな。</li>
</ul>
<h3>Perlbal Tutorial</h3>
<p>スライド：<a href="http://www.slideshare.net/comewalk/perlbal-tutorial">http://www.slideshare.net/comewalk/perlbal-tutorial</a></p>
<ul>
<li>めっちゃ役に立った。</li>
<li>今すぐ業務で試したい。</li>
</ul>
<h3>Asynchronous Programming for (A)synchronous Communication</h3>
<ul>
<li>40分で内容盛りだくさん。</li>
<li>AnyEvent とか Coro とか PubSubHubbub とか今年ブレークしそうな話題ですごく刺激を受けた。</li>
<li>非同期処理ってとっつきにくかったけど、やってみようと言う気にさせてくれるセッションでした。</li>
</ul>
<h3>Perl? Which Perl?</h3>
<ul>
<li>Dan Kogai 氏のトーク。わかりやすかった。</li>
<li>Perl 6 を業務で使うのはまだちょっと先になりそうだけど、楽しみ。</li>
<li>Perl 5.8.x はコンサバティブで、Perl 5.10.x がナウでモダンな Perl だそうです。</li>
<li>ちなみに、Snow Leopard にはどっちも入ってます。</li>
</ul>
<h3>Remedie: Building a desktop app using Perl, SQLite and jQuery</h3>
<ul>
<li>miyagawa 氏のトーク。</li>
<li>ここでも AnyEvent と Coro の話題が。</li>
<li>デスクトップアプリでは SQLite の選択肢は確かにありですね。バックアップも簡単だし、Dropbox を使えばいろんなパソコンで共有できるし。</li>
</ul>
<h3>Lightning Talks (2)‎ </h3>
<ul>
<li>miyagawa 氏の話はやっぱ安定してるなーと思ってたら、そんな miyagawa 氏を前振りに使ってしまう yusukebe の才能に嫉妬。</li>
</ul>
<h2>全体を通して</h2>
<ul>
<li>会場の東工大は家からすぐ近くなので楽でした。来年もぜひ。</li>
<li>電源タップが全然なくて、そこが唯一残念でした。</li>
<li>何はともあれ、スタッフの皆さん、どうもありがとうございました。</li>
<p>とりあえず、AnyEvent と Coro と Perlbal を試してみようと思います！</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/jp/jmblog?a=AXoVIOkT7ho:l_TRvTVWI7g:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/jp/jmblog?d=OAQBO0PjnPA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/jp/jmblog?a=AXoVIOkT7ho:l_TRvTVWI7g:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/jp/jmblog?d=spdCosxkSQE" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://jmblog.jp/archives/517/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jmblog.jp/archives/517</feedburner:origLink></item>
		<item>
		<title>Snow Leopard をクリーンインストールするついでに、Perlの開発環境もきれいにしてしまおうというメモ</title>
		<link>http://feedproxy.google.com/~r/jp/jmblog/~3/BJ7KaTK042s/495</link>
		<comments>http://jmblog.jp/archives/495#comments</comments>
		<pubDate>Fri, 28 Aug 2009 17:05:34 +0000</pubDate>
		<dc:creator>Yoshihide</dc:creator>
				<category><![CDATA[personal note]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[macbook]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://jmblog.jp/?p=495</guid>
		<description>会社帰りにビックカメラに寄って、Snow Leopard を買ってきました。アップグレードはいろいろ不具合が出そうだし、Perl の開発環境も探り探りで構築してきたせいでちょっと汚くなってしまったので、さっぱりとクリーンインストールすることにしました。というわけで、備忘録として、作業の内容を記録して行きます。（順次、更新予定。）

インストール前の下準備


TimeMachineでバックアップ


基本ですね。といいつつ、初回バックアップですが。ちなみにバックアップ先は、先日購入したLS-XH1.5TL。1.5TB で 2万円前半ははっきりいってお買い得です。


アプリケーションリストの作成


使っているアプリケーションのリストを作成。アプリケーションフォルダの中だけ見ていると漏れが出るので、AppCleaner を使って検索。愛用しているウィジェットの Deep Sleep とか拾えたので助かりました。


無線LANへの接続方法の確認


一度つないでしまえば普段意識しないので、ついつい接続方法を忘れてしまいがちです。インストール後にインターネットに接続できなくて調べ物もできない！という状況を避けるために、事前に確認しておきました。


システム環境設定をキャプチャ


意外と盲点になりそうなのが、システム環境設定。使い勝手に直結するので、ちょっと変わっただけでストレスに感じることも。ただ、項目が多く、メモっていくのは大変。というわけで、スクリーンキャプチャをとって、画像として保存しました。SimpleCap というアプリケーションを使うと、とても簡単にキャプチャをとることができます。

&amp;#160;
事前準備はこれぐらいかなぁ。何か漏れてそうだけど。まぁ、TimeMachine もあるし、普段から Mozy とか Dropbox とか SugarSync とか使ってあちこちに保険かけてるから、少なくとも重要なデータを失うことはないでしょう。
クリーンインストールの実施
以下の手順でクリーンインストール。ここを参照。

インストールDVDを入れて、「Mac OS X インストール」をダブルクリックしてインストーラーを起動。「続ける」ボタンを押しちゃいそうになるけど、左下の「ユーティリティ」をクリックする。再起動を促されるので指示に従って再起動。
インストールDVDから起動すると、また「Mac OS X インストール」画面が出るけど、ここでも「続ける」を押さずに、&amp;#8221;ユーティリティ&amp;#8221;メニューから&amp;#8221;ディスクユーティリティ&amp;#8230;&amp;#8221;を選択。
インストール先のディスクを選んで「消去」タブをクリック。フォーマットは「Mac OS 拡張（ジャーナリング）」を選んで、右下の「消去&amp;#8230;」で実行。これでハードディスクのデータがすべて消去されました。
ディスクユーティリティを終了。
「Mac OS X インストール」画面に戻るので、「続ける」をクリック。
インストール先のディスクを選ぶ。そのあと「インストール」を押さずに、今度は「カスタマイズ」をクリック。
まず「言語環境」から不要な言語を外す。一つの言語で 75MB とか使っているのでディスク容量を節約したい人は是非。「ポーランド語環境」とか絶対使わないし。あと X11 も使わないからチェックを外す。それからプリンタサポートの「近くにあるプリンタ、および一般的なプリンタ」も。我が家にはプリンタないし。
ようやく「インストール」ボタンをクリック。「残り時間：約20分」だって。結構早いなぁ。
インストール完了後、テンションのあがるオープニングムービー！そしてもろもろ設定。ネットワークの設定もするので、事前に無線LANの設定はプリントアウトしておくなりしておいたほうがよいかも。
インストール完了。
さらに、インストールDVDの「オプションインストール」から、Xcode をインストール。

あとはシステム環境設定だとか、アプリケーションのインストールだとか、Time Machine からのデータ復元だとか。
local::libでPerlの開発環境をキレイに
次の更新は、いよいよ Perl の環境構築かな？
[追記  2009-12-13]
local::lib を使ってCPAN環境をきれいに管理した。やり方をエントリーを書こうと思ったけど、あちこちで既出だったのでリンクのみ。（というか思いっきり参考にさせていただきました。ありがとうございました。）

myfinder&amp;#8217;s blog: Leopardでlocal::libを設定する
Mac OS Xでもlocal::libをつかってCPANモジュールを入れよう &amp;#8211; JPerl Advent Calendar 2009</description>
			<content:encoded><![CDATA[<p>会社帰りにビックカメラに寄って、Snow Leopard を買ってきました。アップグレードはいろいろ不具合が出そうだし、Perl の開発環境も探り探りで構築してきたせいでちょっと汚くなってしまったので、さっぱりとクリーンインストールすることにしました。というわけで、備忘録として、作業の内容を記録して行きます。（順次、更新予定。）</p>
<p><span id="more-495"></span></p>
<h4>インストール前の下準備</h4>
<dl>
<dt>
<p>TimeMachineでバックアップ</p>
</dt>
<dd>
<p>基本ですね。といいつつ、初回バックアップですが。ちなみにバックアップ先は、先日購入した<a href="http://www.amazon.co.jp/gp/product/B001TZBBQ2?ie=UTF8&#038;tag=0755-22&#038;linkCode=as2&#038;camp=247&#038;creative=7399&#038;creativeASIN=B001TZBBQ2">LS-XH1.5TL</a><img src="http://www.assoc-amazon.jp/e/ir?t=0755-22&#038;l=as2&#038;o=9&#038;a=B001TZBBQ2" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />。1.5TB で 2万円前半ははっきりいってお買い得です。</p>
</dd>
<dt>
<p>アプリケーションリストの作成
</dt>
<dd>
<p>使っているアプリケーションのリストを作成。アプリケーションフォルダの中だけ見ていると漏れが出るので、<a href="http://freemacsoft.net/AppCleaner/" target="_blank">AppCleaner</a> を使って検索。愛用しているウィジェットの <a href="http://deepsleep.free.fr/">Deep Sleep</a> とか拾えたので助かりました。</p>
</dd>
<dt>
<p>無線LANへの接続方法の確認</p>
</dt>
<dd>
<p>一度つないでしまえば普段意識しないので、ついつい接続方法を忘れてしまいがちです。インストール後にインターネットに接続できなくて調べ物もできない！という状況を避けるために、事前に確認しておきました。</p>
</dd>
<dt>
<p>システム環境設定をキャプチャ</p>
</dt>
<dd>
<p>意外と盲点になりそうなのが、システム環境設定。使い勝手に直結するので、ちょっと変わっただけでストレスに感じることも。ただ、項目が多く、メモっていくのは大変。というわけで、スクリーンキャプチャをとって、画像として保存しました。<a href="http://xcatsan.com/simplecap/" target="_blank">SimpleCap</a> というアプリケーションを使うと、とても簡単にキャプチャをとることができます。</p>
</dl>
<p>&nbsp;</p>
<p>事前準備はこれぐらいかなぁ。何か漏れてそうだけど。まぁ、TimeMachine もあるし、普段から <a href="http://www.mozy.com/?ref=3f9a896b&#038;m=5" target="_blank">Mozy</a> とか <a href="https://www.getdropbox.com/referrals/NTQ3ODIxNjk" target="_blank">Dropbox</a> とか <a href="https://www.sugarsync.com/referral?rf=csdzv3eqx2ihc" target="_blank">SugarSync</a> とか使ってあちこちに保険かけてるから、少なくとも重要なデータを失うことはないでしょう。</p>
<h4>クリーンインストールの実施</h4>
<p>以下の手順でクリーンインストール。<a href="http://ascii.jp/elem/000/000/455/455112/index-2.html">ここを参照</a>。</p>
<ol>
<li>インストールDVDを入れて、「Mac OS X インストール」をダブルクリックしてインストーラーを起動。「続ける」ボタンを押しちゃいそうになるけど、左下の「ユーティリティ」をクリックする。再起動を促されるので指示に従って再起動。</li>
<li>インストールDVDから起動すると、また「Mac OS X インストール」画面が出るけど、ここでも「続ける」を押さずに、&#8221;ユーティリティ&#8221;メニューから&#8221;ディスクユーティリティ&#8230;&#8221;を選択。</li>
<li>インストール先のディスクを選んで「消去」タブをクリック。フォーマットは「Mac OS 拡張（ジャーナリング）」を選んで、右下の「消去&#8230;」で実行。これでハードディスクのデータがすべて消去されました。</li>
<li>ディスクユーティリティを終了。</li>
<li>「Mac OS X インストール」画面に戻るので、「続ける」をクリック。</li>
<li>インストール先のディスクを選ぶ。そのあと「インストール」を押さずに、今度は「カスタマイズ」をクリック。</li>
<li>まず「言語環境」から不要な言語を外す。一つの言語で 75MB とか使っているのでディスク容量を節約したい人は是非。「ポーランド語環境」とか絶対使わないし。あと X11 も使わないからチェックを外す。それからプリンタサポートの「近くにあるプリンタ、および一般的なプリンタ」も。我が家にはプリンタないし。</li>
<li>ようやく「インストール」ボタンをクリック。「残り時間：約20分」だって。結構早いなぁ。</li>
<li>インストール完了後、テンションのあがるオープニングムービー！そしてもろもろ設定。ネットワークの設定もするので、事前に無線LANの設定はプリントアウトしておくなりしておいたほうがよいかも。</li>
<li>インストール完了。</li>
<li>さらに、インストールDVDの「オプションインストール」から、Xcode をインストール。
</ol>
<p>あとはシステム環境設定だとか、アプリケーションのインストールだとか、Time Machine からのデータ復元だとか。</p>
<h4>local::libでPerlの開発環境をキレイに</h4>
<p><del datetime="2009-12-13T07:41:07+00:00">次の更新は、いよいよ Perl の環境構築かな？</del></p>
<p><ins datetime="2009-12-13T07:41:07+00:00">[追記  2009-12-13]</ins></p>
<p><ins datetime="2009-12-13T07:41:07+00:00">local::lib を使ってCPAN環境をきれいに管理した。やり方をエントリーを書こうと思ったけど、あちこちで既出だったのでリンクのみ。（というか思いっきり参考にさせていただきました。ありがとうございました。）</p>
<ul>
<li><a href="http://blog.myfinder.jp/2009/07/leopardlocallib.html">myfinder&#8217;s blog: Leopardでlocal::libを設定する</a></li>
<li><a href="http://perl-users.jp/articles/advent-calendar/2009/casual/02.html">Mac OS Xでもlocal::libをつかってCPANモジュールを入れよう &#8211; JPerl Advent Calendar 2009</a></li>
</ul>
<p></ins></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/jp/jmblog?a=BJ7KaTK042s:5fVhGhXwQ4E:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/jp/jmblog?d=OAQBO0PjnPA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/jp/jmblog?a=BJ7KaTK042s:5fVhGhXwQ4E:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/jp/jmblog?d=spdCosxkSQE" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://jmblog.jp/archives/495/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jmblog.jp/archives/495</feedburner:origLink></item>
		<item>
		<title>DBIx::Class + Oracle でプライマリーキーを auto increment する方法</title>
		<link>http://feedproxy.google.com/~r/jp/jmblog/~3/Dfnn3XzjbLo/478</link>
		<comments>http://jmblog.jp/archives/478#comments</comments>
		<pubDate>Tue, 28 Jul 2009 14:13:20 +0000</pubDate>
		<dc:creator>Yoshihide</dc:creator>
				<category><![CDATA[webdev]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://jmblog.jp/?p=478</guid>
		<description>Oracle には、MySQL の auto_increment 属性に該当する機能がありません。実現するには、次のサイトで紹介されているように、SEQUENCE と TRIGGER を組み合わせるというのが常套手段のようです。


OracleでAutoIncrement &amp;#8211; (・∀・)イイ!!Memo
OracleでAutoIncrement &amp;#8211; niwaのoracle日記

でも、Perl の DBIx::Class を使えばラクチンです！例えば、次のようなクラスを作ったとします。
MyApp/Schema/Result/Post.pm
package MyApp::Schema::Result::Post;

use strict;
use warnings;

use base 'DBIx::Class';

__PACKAGE__-&amp;#62;load_components&amp;#40; &amp;#34;Core&amp;#34; &amp;#41;;
__PACKAGE__-&amp;#62;table&amp;#40;&amp;#34;post&amp;#34;&amp;#41;;
__PACKAGE__-&amp;#62;add_columns&amp;#40;
&amp;#160; &amp;#160; id =&amp;#62; &amp;#123;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; data_type =&amp;#62; 'NUMBER',
&amp;#160; &amp;#160; &amp;#160; &amp;#160; size =&amp;#62; 11,
&amp;#160; &amp;#160; &amp;#160; &amp;#160; is_nullable =&amp;#62; 0,
&amp;#160; &amp;#160; &amp;#160; &amp;#160; is_auto_increment =&amp;#62; 1,
&amp;#160; &amp;#160; &amp;#125;,
&amp;#160; &amp;#160; title =&amp;#62; [...]</description>
			<content:encoded><![CDATA[<p>Oracle には、MySQL の auto_increment 属性に該当する機能がありません。実現するには、次のサイトで紹介されているように、SEQUENCE と TRIGGER を組み合わせるというのが常套手段のようです。</p>
<p><span id="more-478"></span></p>
<ul>
<li><a href="http://memo.majide.com/index.php?Oracle%A4%C7AutoIncrement">OracleでAutoIncrement &#8211; (・∀・)イイ!!Memo</a></li>
<li><a href="http://d.hatena.ne.jp/niwanos/20090219/1235064261">OracleでAutoIncrement &#8211; niwaのoracle日記</a></li>
</ul>
<p>でも、Perl の DBIx::Class を使えばラクチンです！例えば、次のようなクラスを作ったとします。</p>
<p>MyApp/Schema/Result/Post.pm</p>
<div class="codecolorer-container perl blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;height:300px;"><div class="perl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000066;">package</span> MyApp<span style="color: #339933;">::</span><span style="color: #006600;">Schema</span><span style="color: #339933;">::</span><span style="color: #006600;">Result</span><span style="color: #339933;">::</span><span style="color: #006600;">Post</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">use</span> base <span style="color: #ff0000;">'DBIx::Class'</span><span style="color: #339933;">;</span><br />
<br />
__PACKAGE__<span style="color: #339933;">-&gt;</span><span style="color: #006600;">load_components</span><span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;Core&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
__PACKAGE__<span style="color: #339933;">-&gt;</span><span style="color: #006600;">table</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;post&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
__PACKAGE__<span style="color: #339933;">-&gt;</span><span style="color: #006600;">add_columns</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; id <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; data_type <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'NUMBER'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; size <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">11</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; is_nullable <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; is_auto_increment <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; title <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; data_type <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'VARCHAR2'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; size <span style="color: #339933;">=&gt;</span> 500<span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
__PACKAGE__<span style="color: #339933;">-&gt;</span><span style="color: #006600;">set_primary_key</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;id&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span></div></div>
</p>
<p>15行目で is_auto_increment => 1 という指定をしています。この状態で、DBIx::Class::Schema の deploy メソッドを実行すると、次のように TABLE と同時に SEQUENCE と TRIGGER を自動的に作成してくれます。</p>
<div class="codecolorer-container sql blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> SEQUENCE sq_post_id;<br />
<br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> post <span style="color: #66cc66;">&#40;</span><br />
&nbsp; id number<span style="color: #66cc66;">&#40;</span>11<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><br />
&nbsp; title varchar2<span style="color: #66cc66;">&#40;</span>500<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#41;</span>;<br />
<br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">REPLACE</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> ai_post_id<br />
BEFORE <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">ON</span> post<br />
<span style="color: #993333; font-weight: bold;">FOR</span> EACH ROW WHEN <span style="color: #66cc66;">&#40;</span><br />
&nbsp; new<span style="color: #66cc66;">.</span>id <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">OR</span> new<span style="color: #66cc66;">.</span>id <span style="color: #66cc66;">=</span> 0<br />
<span style="color: #66cc66;">&#41;</span><br />
BEGIN<br />
&nbsp; <span style="color: #993333; font-weight: bold;">SELECT</span> sq_post_id<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">NEXTVAL</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">INTO</span> :new<span style="color: #66cc66;">.</span>id<br />
&nbsp; <span style="color: #993333; font-weight: bold;">FROM</span> dual;<br />
END;</div></div>
<p>実際の処理は、<a href="http://search.cpan.org/search?q=SQL::Translator::Producer::Oracle">SQL::Translator::Producer::Oracle</a> が担当しているようです。</p>
<p>ちなみに、add_columns() でカラムを定義する時に、data_type => &#8216;timestamp&#8217; とすると、同様に次のような TRIGGER が作成され、レコードの追加および更新時に自動的に SYSDATE をセットしてくれます。</p>
<div class="codecolorer-container sql blackboard" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">REPLACE</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> ts_post_updated_at<br />
BEFORE <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #993333; font-weight: bold;">UPDATE</span> <span style="color: #993333; font-weight: bold;">ON</span> post<br />
<span style="color: #993333; font-weight: bold;">FOR</span> EACH ROW WHEN <span style="color: #66cc66;">&#40;</span>new<span style="color: #66cc66;">.</span>updated_at <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span><br />
BEGIN<br />
&nbsp; <span style="color: #993333; font-weight: bold;">SELECT</span> sysdate <span style="color: #993333; font-weight: bold;">INTO</span> :new<span style="color: #66cc66;">.</span>updated_at <span style="color: #993333; font-weight: bold;">FROM</span> dual;<br />
END;</div></div>
<p>仕事で Oracle を使うことになり、「えー！auto_increment ないのー！」と困っていたのですが、おかげで楽に実装できました。欲を言えば、作成する SEQUENCE の START WITH を指定できたり、レコードの追加のときだけ SYSDATE をセットしてくれる TRIGGER が自動生成できれば、もっとありがたいんだけどなぁ。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/jp/jmblog?a=Dfnn3XzjbLo:gPttmZqMmrA:OAQBO0PjnPA"><img src="http://feeds.feedburner.com/~ff/jp/jmblog?d=OAQBO0PjnPA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/jp/jmblog?a=Dfnn3XzjbLo:gPttmZqMmrA:spdCosxkSQE"><img src="http://feeds.feedburner.com/~ff/jp/jmblog?d=spdCosxkSQE" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://jmblog.jp/archives/478/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jmblog.jp/archives/478</feedburner:origLink></item>
	</channel>
</rss>
