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

<channel>
	<title>jmblog.jp &#187; webdev</title>
	<atom:link href="http://jmblog.jp/archives/category/webdev/feed" rel="self" type="application/rss+xml" />
	<link>http://jmblog.jp</link>
	<description></description>
	<lastBuildDate>Mon, 05 Jul 2010 05:02:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Google::Chart を使って QRコードを生成する</title>
		<link>http://jmblog.jp/archives/641</link>
		<comments>http://jmblog.jp/archives/641#comments</comments>
		<pubDate>Fri, 12 Mar 2010 05:50:45 +0000</pubDate>
		<dc:creator>Yoshihide</dc:creator>
				<category><![CDATA[webdev]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://jmblog.jp/?p=641</guid>
		<description><![CDATA[仕事でQRコードを生成しなくちゃならなくなり、「Google が API とか公開してたりして」と思って軽い気持ちで調べてみたら、本当に公開していてビックリ。Google Chart API で QRコードが作れる！
&#187; QR Codes &#8211; Google Chart Tools / Image Charts (aka Chart API) &#8211; Google Code

で、Perl から使うには、Google::Chart がとてもお手軽で簡単でした。
#!/usr/bin/perl
use strict;
use warnings;
use Google::Chart;

my $url = 'http://jmblog.jp';
my $size = '160x160';

my $chart = Google::Chart-&#62;new&#40;
&#160; &#160; type =&#62; &#123;
&#160; &#160; &#160; &#160; module =&#62; 'QRcode',
&#160; &#160; &#160; &#160; args =&#62; &#123;
&#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>仕事でQRコードを生成しなくちゃならなくなり、「Google が API とか公開してたりして」と思って軽い気持ちで調べてみたら、本当に公開していてビックリ。Google Chart API で QRコードが作れる！</p>
<p>&raquo; <a href="http://code.google.com/intl/ja/apis/chart/docs/gallery/qr_codes.html">QR Codes &#8211; Google Chart Tools / Image Charts (aka Chart API) &#8211; Google Code</a></p>
<p><span id="more-641"></span></p>
<p>で、Perl から使うには、<a href="http://search.cpan.org/dist/Google-Chart/">Google::Chart</a> がとてもお手軽で簡単でした。</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> Google<span style="color: #339933;">::</span><span style="color: #006600;">Chart</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$url</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'http://jmblog.jp'</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$size</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'160x160'</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$chart</span> <span style="color: #339933;">=</span> Google<span style="color: #339933;">::</span><span style="color: #006600;">Chart</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; type <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; module <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'QRcode'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; args <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; text <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$url</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; encoding <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'shift_jis'</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> &nbsp;<br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> &nbsp;<br />
&nbsp; &nbsp; size <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">$size</span><span style="color: #339933;">,</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000066;">print</span> <span style="color: #0000ff;">$chart</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">as_uri</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 />
<span style="color: #0000ff;">$chart</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">render_to_file</span><span style="color: #009900;">&#40;</span> filename <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'qr-code.png'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p><img src="http://jmblog.jp/wp-content/uploads/2010/03/qr-code.png" alt="QRコード" title="QRコード" width="160" height="160" class="alignnone size-full wp-image-645" /></p>
<p>まったく、なんて便利な世の中なんでしょ！</p>
]]></content:encoded>
			<wfw:commentRss>http://jmblog.jp/archives/641/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TheSchwartzで関連するジョブをグルーピングしてまとめて実行する</title>
		<link>http://jmblog.jp/archives/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><![CDATA[TheSchwartz では、関連するジョブをグルーピングしてまとめて実行することができるとドキュメントに書いてあったので、試しにやってみました。（参考にしたのは、Movable Type のソースコード。）

グルーピングしない場合
まずは、普通に処理する場合。キューにジョブを追加する client.pl はこんな感じ。
#!/usr/bin/perl
use strict;
use warnings;
use TheSchwartz;
use DateTime;

my $client = TheSchwartz-&#62;new&#40;
&#160; &#160; databases =&#62; &#91;
&#160; &#160; &#160; &#160; &#123; &#160; 
&#160; &#160; &#160; &#160; &#160; &#160; dsn =&#62; 'dbi:mysql:TheSchwartz',
&#160; &#160; &#160; &#160; &#160; &#160; user =&#62; 'db_user',
&#160; &#160; &#160; &#160; &#160; &#160; pass =&#62; 'db_password',
&#160; &#160; &#160; &#160; &#125; &#160; 
&#160; &#160; &#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>
]]></content:encoded>
			<wfw:commentRss>http://jmblog.jp/archives/591/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Coroの初歩的なハマリどころ</title>
		<link>http://jmblog.jp/archives/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><![CDATA[時代は、Coroだ！AnyEventだ！ということで、

AnyEvent::Intro &#8211; search.cpan.org
Coro/Intro.pod &#8211; search.cpan.org

あたりを読みながらお勉強しているときに、ちょいハマった。

use strict;
use warnings;
use Coro;
use Perl6::Say;

async &#123;
&#160; &#160; say 'hello';
&#125;
cede;
このスクリプトを動かすと、
hello
と出力されるはず、なのに何も表示されない。こんな単純なコードなのに、なぜだー！と思ってよく見たら、 async の最後のセミコロンが抜けてた・・・
これなら動く。
use strict;
use warnings;
use Coro;
use Perl6::Say;

async &#123;
&#160; &#160; say 'hello';
&#125;;
cede;
でも何で構文エラーにならないんでしょう？async は
async &#123;
&#160; &#160; print &#34;@_\n&#34;;
&#125; 1,2,3,4;
というように、引数を受け取ることができるので、もしかして cede が引数として渡されてる？と思ったけど、
async &#123;
&#160; &#160; say @_;
&#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>
]]></content:encoded>
			<wfw:commentRss>http://jmblog.jp/archives/537/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>YAPC::Asia 2009 の感想</title>
		<link>http://jmblog.jp/archives/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><![CDATA[Perl を使って早10年。はじめて YAPC::Asia に行ってきました。あまりエントリーを書く時間がないので、簡単に感想とかメモとか。（あんまりまとまってないです。）

1日目
「モダンPerl入門」の入門

ちょうど今やってるプロジェクトと同じ状況（初めて Catalyst ＋モダンPerl に挑戦）なので、共感できるところが多かった。
Catalyst::Model::Adaptor をいちいち書くのは確かにめんどくさい。でも Catalyst::Model::MultiAdaptor を使えばラクチンらしい。
自分のプロジェクトでは、API（Service と呼んでるけど）は CRUD もビジネスロジックも一つになってるけど、レプリケーションとかに対応するなら、確かにAPIをLogicとDataに分けた方が管理しやすそう。

PSGI &#8211; Perl Server Gateway Interface

ちがうセッションを聞いていたので聞けず・・・なんだか評判がよかったみたいなので、あとから資料追いたい。今年は PSGI が熱いらしい。

シックス・アパート・フレームワーク


my $entry = MT::Entry-&#62;new;
って書き方は古くって、今は
my $entry = MT-&#62;model('entry')-&#62;new;
と書くそうな。思いっきり前者で書いた。
アメリカと日本との開発体制はいろいろと大変そう。離れているとどうしても伝わらないことってあるからなぁ。

modern Catalyst
スライド：http://www.slideshare.net/hidek/modern-catalyst

Moose な Catalyst の話。断片的な知識が整理できてよかった。
&#8220;Sugar Syntax&#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>
]]></content:encoded>
			<wfw:commentRss>http://jmblog.jp/archives/517/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DBIx::Class + Oracle でプライマリーキーを auto increment する方法</title>
		<link>http://jmblog.jp/archives/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><![CDATA[Oracle には、MySQL の auto_increment 属性に該当する機能がありません。実現するには、次のサイトで紹介されているように、SEQUENCE と TRIGGER を組み合わせるというのが常套手段のようです。


OracleでAutoIncrement &#8211; (・∀・)イイ!!Memo
OracleでAutoIncrement &#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__-&#62;load_components&#40; &#34;Core&#34; &#41;;
__PACKAGE__-&#62;table&#40;&#34;post&#34;&#41;;
__PACKAGE__-&#62;add_columns&#40;
&#160; &#160; id =&#62; &#123;
&#160; &#160; &#160; &#160; data_type =&#62; 'NUMBER',
&#160; &#160; &#160; &#160; size =&#62; 11,
&#160; &#160; &#160; &#160; is_nullable =&#62; 0,
&#160; &#160; &#160; &#160; is_auto_increment =&#62; 1,
&#160; &#160; &#125;,
&#160; &#160; title =&#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>
]]></content:encoded>
			<wfw:commentRss>http://jmblog.jp/archives/478/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
