<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <generator>Plagger/0.7.17</generator>
    <link>http://hanekomu.at/planet-perl-jp/</link>
    <description>Blogs relevant to Perl from Japan</description>
    <title>Planet Perl.jp</title>
    <pubDate>Wed, 08 Sep 2010 13:41:16 +0200</pubDate>
    <item>
      <author>nobody@example.com (antipop)</author>
      <dc:creator>nobody@example.com (antipop)</dc:creator>
      <link>http://d.hatena.ne.jp/antipop/20100907/1283872227</link>
      <description>
		
			気になったので質問してみました。ふるってご回答ください。
			
			雨降りは、虫にとっては大変なことではないでしょうか？特に、蚊や羽虫のような小さな虫にとっては特に。そこで、以下の疑問にお答え願います。
			
				 雨粒に直撃されるとダメージを負うのでしょうか？
				 雨粒に囲まれて地面に叩きつけられるようなことがあるのでしょうか？
				 叩きつけられた後、水たまりで溺れて死んでしまったりするのでしょうか？
				 その他、なにか大変なことがあったりするのではないでしょうか？
			
			
			question:1283769171
		
</description>
      <dc:date>2010-09-08T00:10:27+09:00</dc:date>
      <title>雨が降ったら虫はどうなるの？</title>
      <pubDate>Wed, 08 Sep 2010 00:10:27 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;p&gt;気になったので質問してみました。ふるってご回答ください。&lt;/p&gt;
			&lt;blockquote&gt;
			&lt;p&gt;雨降りは、虫にとっては大変なことではないでしょうか？特に、蚊や羽虫のような小さな虫にとっては特に。そこで、以下の疑問にお答え願います。&lt;/p&gt;
			&lt;ol&gt;
				&lt;li&gt; 雨粒に直撃されるとダメージを負うのでしょうか？&lt;/li&gt;
				&lt;li&gt; 雨粒に囲まれて地面に叩きつけられるようなことがあるのでしょうか？&lt;/li&gt;
				&lt;li&gt; 叩きつけられた後、水たまりで溺れて死んでしまったりするのでしょうか？&lt;/li&gt;
				&lt;li&gt; その他、なにか大変なことがあったりするのではないでしょうか？&lt;/li&gt;
			&lt;/ol&gt;
			&lt;/blockquote&gt;
			&lt;p&gt;&lt;a href="http://q.hatena.ne.jp/1283769171"&gt;question:1283769171&lt;/a&gt;&lt;/p&gt;
		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-09-08T00:10:27+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:sehbaer,2006:http://d.hatena.ne.jp/antipop/20100907/1283872227</guid>
    </item>
    <item>
      <author>nobody@example.com (antipop)</author>
      <dc:creator>nobody@example.com (antipop)</dc:creator>
      <link>http://d.hatena.ne.jp/antipop/20100907/1283866114</link>
      <description>
		
			弊社では、東京オフィスと京都オフィスとを常時、Polycomという、ビデオチャットの高級版みたいなシステムで接続していて、東京・京都間でいつでも距離を感じさせずに自然にコミュニケーションを図れるような仕組みが整備されています。
			それは便利な一方、たまに静かであるべき状況で相手側の音声が入って鬱陶しい場合があって、IRCや口頭で、近くにいるひとにマイクのミュートをお願いしたりすることがあります。最近、PolycomのWebインタフェイスから、リモコンのような仕組みでPolycomを操作できることがわかって、それを使ってミュートすればいいじゃないかということになりました。ということはつまりなんかしらのAPIみたいなものがあるんだろうなーと思って見てみたら、案の定あったので、Perlから叩けるようにしてみました。
			
				 http://github.com/kentaro/perl-webservice-polycom-remotecontroller
			
			以下のサンプルスクリプトでは、シェルからPolycomの各種操作（カメラの向きをかえたり、音声レベルを上下したりなど、いろいろ）を行えます。

#!/usr/bin/env perl

use strict;
use warnings;
use Config::Pit;
use Term::ReadLine;

use FindBin::libs;
use WebService::Polycom::RemoteController;

my $config = pit_get('polycom.kyoto', require =&gt; {
    host     =&gt; 'your host for polycom',
    username =&gt; 'your username for polycom',
    password =&gt; 'your password for polycom',
});

my $polycom = WebService::Polycom::RemoteController-&gt;new;
   $polycom-&gt;host($config-&gt;{host});
   $polycom-&gt;username($config-&gt;{username});
   $polycom-&gt;password($config-&gt;{password});

my $term = Term::ReadLine-&gt;new('Polycom Controller');

while (defined (my $command = $term-&gt;readline('polycom&gt; '))) {
    my $res = $polycom-&gt;button($command);
    for my $command (@{$res-&gt;commands}) {
        printf "%s: %s\n", $command-&gt;is_success ? 'OK' : 'NG', $command-&gt;message
    }
}


			http://github.com/kentaro/perl-webservice-polycom-remotecontroller/blob/master/eg/controller.pl
			これだけでは何がうれしいんだという感じですが、一歩進んで、以下のようなスクリプトを書いて、社内IRCからPolycomコマンドを叩けるようにしてみました（WebService::Polycom::RemoteControllerをラップしたライブラリなどが他にあるけど、社内用なので非公開。以下は雰囲気で）。

#!/usr/bin/env perl

use strict;
use warnings;

use YAML::Syck;
use Encode;
use FindBin;
use UNIVERSAL::require;
use Getopt::Long;

use AnyEvent;
use AnyEvent::IRC::Client;

use lib      "$FindBin::Bin/../lib";
use lib glob "$FindBin::Bin/../modules/*/lib";

my $config_file = "$FindBin::Bin/../config/kyoto.yml";
GetOptions(
    "config=s" =&gt; \$config_file,
);

my $config = LoadFile($config_file);
my $polycom_class = $config-&gt;{polycom}{class};
$polycom_class-&gt;use or die $@;
my $polycom = $polycom_class-&gt;new;

my $cv     = AE::cv;
my $client = AnyEvent::IRC::Client-&gt;new;
$client-&gt;reg_cb(
    connect   =&gt; \&amp;on_connect,
    publicmsg =&gt; \&amp;on_publicmsg,
);

$client-&gt;connect(
    $config-&gt;{irc}{server}{host}, $config-&gt;{irc}{server}{port}, {
        user     =&gt; $config-&gt;{irc}{client}{user},
        nick     =&gt; $config-&gt;{irc}{client}{nick},
        real     =&gt; $config-&gt;{irc}{client}{real},
        password =&gt; $config-&gt;{irc}{server}{password},
        timeout  =&gt; 60,
    }
);

$cv-&gt;recv;

sub on_connect {
    my ($client, $error) = @_;
    if ($error) {
        die $error;
    }
    else {
        for my $channel (@{$config-&gt;{irc}{channels}}) {
            $client-&gt;send_srv('JOIN', '#'.$channel);
        }
    }
}

sub on_publicmsg {
    my ($client, $channel, $message) = @_;
    if ($message-&gt;{params}-&gt;[1] =~ /^@{[$config-&gt;{irc}{client}{nick}]}:\s+(.+)$/i) {
        my $command = $1;
        chomp $command;
        my $res = $polycom-&gt;button($command);
        for my $result (@{$res-&gt;commands}) {
            my $reply = sprintf "%s: %s", $result-&gt;is_success ? 'OK' : 'NG', $result-&gt;message;
            $client-&gt;send_chan(
                $channel, 'NOTICE', $channel, encode('iso-2022-jp', $reply)
            );
        }
    }
}


			これで、IRCにjoinしてるひとならPolycomを机に向かっていながらにして簡単に操作できて便利になり、生産性の向上を見込めます。
			どのバージョンのPolycomにもこのAPIがあるのかなどは知らないです。
		
</description>
      <dc:date>2010-09-07T22:28:34+09:00</dc:date>
      <title>PolycomをPerlから操作する</title>
      <pubDate>Tue, 07 Sep 2010 22:28:34 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;p&gt;弊社では、東京オフィスと京都オフィスとを常時、Polycomという、ビデオチャットの高級版みたいなシステムで接続していて、東京・京都間でいつでも距離を感じさせずに自然にコミュニケーションを図れるような仕組みが整備されています。&lt;/p&gt;
			&lt;p&gt;それは便利な一方、たまに静かであるべき状況で相手側の音声が入って鬱陶しい場合があって、IRCや口頭で、近くにいるひとにマイクのミュートをお願いしたりすることがあります。最近、PolycomのWebインタフェイスから、リモコンのような仕組みでPolycomを操作できることがわかって、それを使ってミュートすればいいじゃないかということになりました。ということはつまりなんかしらのAPIみたいなものがあるんだろうなーと思って見てみたら、案の定あったので、Perlから叩けるようにしてみました。&lt;/p&gt;
			&lt;ul&gt;
				&lt;li&gt; &lt;a href="http://github.com/kentaro/perl-webservice-polycom-remotecontroller"&gt;http://github.com/kentaro/perl-webservice-polycom-remotecontroller&lt;/a&gt;&lt;/li&gt;
			&lt;/ul&gt;
			&lt;p&gt;以下のサンプルスクリプトでは、シェルからPolycomの各種操作（カメラの向きをかえたり、音声レベルを上下したりなど、いろいろ）を行えます。&lt;/p&gt;
&lt;pre class="syntax-highlight"&gt;
&lt;span class="synPreProc"&gt;#!/usr/bin/env perl&lt;/span&gt;

&lt;span class="synStatement"&gt;use strict&lt;/span&gt;;
&lt;span class="synStatement"&gt;use warnings&lt;/span&gt;;
&lt;span class="synStatement"&gt;use &lt;/span&gt;Config::Pit;
&lt;span class="synStatement"&gt;use &lt;/span&gt;Term::ReadLine;

&lt;span class="synStatement"&gt;use &lt;/span&gt;FindBin::libs;
&lt;span class="synStatement"&gt;use &lt;/span&gt;WebService::Polycom::RemoteController;

&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$config&lt;/span&gt; = pit_get(&lt;span class="synConstant"&gt;'polycom.kyoto'&lt;/span&gt;, &lt;span class="synStatement"&gt;require&lt;/span&gt; =&amp;#62; {
    &lt;span class="synConstant"&gt;host     &lt;/span&gt;=&amp;#62; &lt;span class="synConstant"&gt;'your host for polycom'&lt;/span&gt;,
    &lt;span class="synConstant"&gt;username &lt;/span&gt;=&amp;#62; &lt;span class="synConstant"&gt;'your username for polycom'&lt;/span&gt;,
    &lt;span class="synConstant"&gt;password &lt;/span&gt;=&amp;#62; &lt;span class="synConstant"&gt;'your password for polycom'&lt;/span&gt;,
});

&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$polycom&lt;/span&gt; = WebService::Polycom::RemoteController-&amp;#62;&lt;span class="synStatement"&gt;new&lt;/span&gt;;
   &lt;span class="synIdentifier"&gt;$polycom&lt;/span&gt;-&amp;#62;host(&lt;span class="synIdentifier"&gt;$config&lt;/span&gt;-&amp;#62;{host});
   &lt;span class="synIdentifier"&gt;$polycom&lt;/span&gt;-&amp;#62;username(&lt;span class="synIdentifier"&gt;$config&lt;/span&gt;-&amp;#62;{username});
   &lt;span class="synIdentifier"&gt;$polycom&lt;/span&gt;-&amp;#62;password(&lt;span class="synIdentifier"&gt;$config&lt;/span&gt;-&amp;#62;{password});

&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$term&lt;/span&gt; = Term::ReadLine-&amp;#62;&lt;span class="synStatement"&gt;new&lt;/span&gt;(&lt;span class="synConstant"&gt;'Polycom Controller'&lt;/span&gt;);

&lt;span class="synStatement"&gt;while&lt;/span&gt; (&lt;span class="synStatement"&gt;defined&lt;/span&gt; (&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$command&lt;/span&gt; = &lt;span class="synIdentifier"&gt;$term&lt;/span&gt;-&amp;#62;&lt;span class="synStatement"&gt;readline&lt;/span&gt;(&lt;span class="synConstant"&gt;'polycom&amp;#62; '&lt;/span&gt;))) {
    &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$res&lt;/span&gt; = &lt;span class="synIdentifier"&gt;$polycom&lt;/span&gt;-&amp;#62;button(&lt;span class="synIdentifier"&gt;$command&lt;/span&gt;);
    &lt;span class="synStatement"&gt;for&lt;/span&gt; &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$command&lt;/span&gt; (@{&lt;span class="synIdentifier"&gt;$res&lt;/span&gt;-&amp;#62;commands}) {
        &lt;span class="synStatement"&gt;printf&lt;/span&gt; &lt;span class="synConstant"&gt;&amp;#34;&lt;/span&gt;&lt;span class="synIdentifier"&gt;%s&lt;/span&gt;&lt;span class="synConstant"&gt;: &lt;/span&gt;&lt;span class="synIdentifier"&gt;%s&lt;/span&gt;&lt;span class="synSpecial"&gt;\n&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;#34;&lt;/span&gt;, &lt;span class="synIdentifier"&gt;$command&lt;/span&gt;-&amp;#62;is_success ? &lt;span class="synConstant"&gt;'OK'&lt;/span&gt; : &lt;span class="synConstant"&gt;'NG'&lt;/span&gt;, &lt;span class="synIdentifier"&gt;$command&lt;/span&gt;-&amp;#62;message
    }
}
&lt;/pre&gt;

			&lt;p&gt;&lt;a href="http://github.com/kentaro/perl-webservice-polycom-remotecontroller/blob/master/eg/controller.pl"&gt;http://github.com/kentaro/perl-webservice-polycom-remotecontroller/blob/master/eg/controller.pl&lt;/a&gt;&lt;/p&gt;
			&lt;p&gt;これだけでは何がうれしいんだという感じですが、一歩進んで、以下のようなスクリプトを書いて、社内IRCからPolycomコマンドを叩けるようにしてみました（WebService::Polycom::RemoteControllerをラップしたライブラリなどが他にあるけど、社内用なので非公開。以下は雰囲気で）。&lt;/p&gt;
&lt;pre class="syntax-highlight"&gt;
&lt;span class="synPreProc"&gt;#!/usr/bin/env perl&lt;/span&gt;

&lt;span class="synStatement"&gt;use strict&lt;/span&gt;;
&lt;span class="synStatement"&gt;use warnings&lt;/span&gt;;

&lt;span class="synStatement"&gt;use &lt;/span&gt;YAML::Syck;
&lt;span class="synStatement"&gt;use &lt;/span&gt;Encode;
&lt;span class="synStatement"&gt;use &lt;/span&gt;FindBin;
&lt;span class="synStatement"&gt;use &lt;/span&gt;UNIVERSAL::&lt;span class="synStatement"&gt;require&lt;/span&gt;;
&lt;span class="synStatement"&gt;use &lt;/span&gt;Getopt::Long;

&lt;span class="synStatement"&gt;use &lt;/span&gt;AnyEvent;
&lt;span class="synStatement"&gt;use &lt;/span&gt;AnyEvent::IRC::Client;

&lt;span class="synStatement"&gt;use lib&lt;/span&gt;      &lt;span class="synConstant"&gt;&amp;#34;&lt;/span&gt;&lt;span class="synIdentifier"&gt;$FindBin::Bin&lt;/span&gt;&lt;span class="synConstant"&gt;/../lib&amp;#34;&lt;/span&gt;;
&lt;span class="synStatement"&gt;use lib&lt;/span&gt; &lt;span class="synStatement"&gt;glob&lt;/span&gt; &lt;span class="synConstant"&gt;&amp;#34;&lt;/span&gt;&lt;span class="synIdentifier"&gt;$FindBin::Bin&lt;/span&gt;&lt;span class="synConstant"&gt;/../modules/*/lib&amp;#34;&lt;/span&gt;;

&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$config_file&lt;/span&gt; = &lt;span class="synConstant"&gt;&amp;#34;&lt;/span&gt;&lt;span class="synIdentifier"&gt;$FindBin::Bin&lt;/span&gt;&lt;span class="synConstant"&gt;/../config/kyoto.yml&amp;#34;&lt;/span&gt;;
GetOptions(
    &lt;span class="synConstant"&gt;&amp;#34;config=s&amp;#34;&lt;/span&gt; =&amp;#62; &lt;span class="synIdentifier"&gt;\$config_file&lt;/span&gt;,
);

&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$config&lt;/span&gt; = LoadFile(&lt;span class="synIdentifier"&gt;$config_file&lt;/span&gt;);
&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$polycom_class&lt;/span&gt; = &lt;span class="synIdentifier"&gt;$config&lt;/span&gt;-&amp;#62;{polycom}{class};
&lt;span class="synIdentifier"&gt;$polycom_class&lt;/span&gt;-&amp;#62;&lt;span class="synStatement"&gt;use or&lt;/span&gt; &lt;span class="synStatement"&gt;die&lt;/span&gt; &lt;span class="synIdentifier"&gt;$@&lt;/span&gt;;
&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$polycom&lt;/span&gt; = &lt;span class="synIdentifier"&gt;$polycom_class&lt;/span&gt;-&amp;#62;&lt;span class="synStatement"&gt;new&lt;/span&gt;;

&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$cv&lt;/span&gt;     = AE::cv;
&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$client&lt;/span&gt; = AnyEvent::IRC::Client-&amp;#62;&lt;span class="synStatement"&gt;new&lt;/span&gt;;
&lt;span class="synIdentifier"&gt;$client&lt;/span&gt;-&amp;#62;reg_cb(
    &lt;span class="synStatement"&gt;connect&lt;/span&gt;   =&amp;#62; &lt;span class="synIdentifier"&gt;\&amp;#38;on_connect&lt;/span&gt;,
    &lt;span class="synConstant"&gt;publicmsg &lt;/span&gt;=&amp;#62; &lt;span class="synIdentifier"&gt;\&amp;#38;on_publicmsg&lt;/span&gt;,
);

&lt;span class="synIdentifier"&gt;$client&lt;/span&gt;-&amp;#62;&lt;span class="synStatement"&gt;connect&lt;/span&gt;(
    &lt;span class="synIdentifier"&gt;$config&lt;/span&gt;-&amp;#62;{irc}{server}{host}, &lt;span class="synIdentifier"&gt;$config&lt;/span&gt;-&amp;#62;{irc}{server}{port}, {
        &lt;span class="synConstant"&gt;user     &lt;/span&gt;=&amp;#62; &lt;span class="synIdentifier"&gt;$config&lt;/span&gt;-&amp;#62;{irc}{client}{user},
        &lt;span class="synConstant"&gt;nick     &lt;/span&gt;=&amp;#62; &lt;span class="synIdentifier"&gt;$config&lt;/span&gt;-&amp;#62;{irc}{client}{nick},
        &lt;span class="synConstant"&gt;real     &lt;/span&gt;=&amp;#62; &lt;span class="synIdentifier"&gt;$config&lt;/span&gt;-&amp;#62;{irc}{client}{real},
        &lt;span class="synConstant"&gt;password &lt;/span&gt;=&amp;#62; &lt;span class="synIdentifier"&gt;$config&lt;/span&gt;-&amp;#62;{irc}{server}{password},
        &lt;span class="synConstant"&gt;timeout  &lt;/span&gt;=&amp;#62; &lt;span class="synConstant"&gt;60&lt;/span&gt;,
    }
);

&lt;span class="synIdentifier"&gt;$cv&lt;/span&gt;-&amp;#62;&lt;span class="synStatement"&gt;recv&lt;/span&gt;;

&lt;span class="synStatement"&gt;sub&lt;/span&gt;&lt;span class="synIdentifier"&gt; on_connect &lt;/span&gt;{
    &lt;span class="synStatement"&gt;my&lt;/span&gt; (&lt;span class="synIdentifier"&gt;$client&lt;/span&gt;, &lt;span class="synIdentifier"&gt;$error&lt;/span&gt;) = &lt;span class="synIdentifier"&gt;@_&lt;/span&gt;;
    &lt;span class="synStatement"&gt;if&lt;/span&gt; (&lt;span class="synIdentifier"&gt;$error&lt;/span&gt;) {
        &lt;span class="synStatement"&gt;die&lt;/span&gt; &lt;span class="synIdentifier"&gt;$error&lt;/span&gt;;
    }
    &lt;span class="synStatement"&gt;else&lt;/span&gt; {
        &lt;span class="synStatement"&gt;for&lt;/span&gt; &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$channel&lt;/span&gt; (@{&lt;span class="synIdentifier"&gt;$config&lt;/span&gt;-&amp;#62;{irc}{channels}}) {
            &lt;span class="synIdentifier"&gt;$client&lt;/span&gt;-&amp;#62;send_srv(&lt;span class="synConstant"&gt;'JOIN'&lt;/span&gt;, &lt;span class="synConstant"&gt;'#'&lt;/span&gt;.&lt;span class="synIdentifier"&gt;$channel&lt;/span&gt;);
        }
    }
}

&lt;span class="synStatement"&gt;sub&lt;/span&gt;&lt;span class="synIdentifier"&gt; on_publicmsg &lt;/span&gt;{
    &lt;span class="synStatement"&gt;my&lt;/span&gt; (&lt;span class="synIdentifier"&gt;$client&lt;/span&gt;, &lt;span class="synIdentifier"&gt;$channel&lt;/span&gt;, &lt;span class="synIdentifier"&gt;$message&lt;/span&gt;) = &lt;span class="synIdentifier"&gt;@_&lt;/span&gt;;
    &lt;span class="synStatement"&gt;if&lt;/span&gt; (&lt;span class="synIdentifier"&gt;$message&lt;/span&gt;-&amp;#62;{params}-&amp;#62;[&lt;span class="synConstant"&gt;1&lt;/span&gt;] =~&lt;span class="synStatement"&gt; /&lt;/span&gt;&lt;span class="synConstant"&gt;^@{&lt;/span&gt;&lt;span class="synSpecial"&gt;[$config-&amp;#62;{irc}{client}{nick}]&lt;/span&gt;&lt;span class="synConstant"&gt;}:&lt;/span&gt;&lt;span class="synSpecial"&gt;\s+(.+)&lt;/span&gt;&lt;span class="synConstant"&gt;$&lt;/span&gt;&lt;span class="synStatement"&gt;/i&lt;/span&gt;) {
        &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$command&lt;/span&gt; = &lt;span class="synIdentifier"&gt;$1&lt;/span&gt;;
        &lt;span class="synStatement"&gt;chomp&lt;/span&gt; &lt;span class="synIdentifier"&gt;$command&lt;/span&gt;;
        &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$res&lt;/span&gt; = &lt;span class="synIdentifier"&gt;$polycom&lt;/span&gt;-&amp;#62;button(&lt;span class="synIdentifier"&gt;$command&lt;/span&gt;);
        &lt;span class="synStatement"&gt;for&lt;/span&gt; &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$result&lt;/span&gt; (@{&lt;span class="synIdentifier"&gt;$res&lt;/span&gt;-&amp;#62;commands}) {
            &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$reply&lt;/span&gt; = &lt;span class="synStatement"&gt;sprintf&lt;/span&gt; &lt;span class="synConstant"&gt;&amp;#34;&lt;/span&gt;&lt;span class="synIdentifier"&gt;%s&lt;/span&gt;&lt;span class="synConstant"&gt;: &lt;/span&gt;&lt;span class="synIdentifier"&gt;%s&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;#34;&lt;/span&gt;, &lt;span class="synIdentifier"&gt;$result&lt;/span&gt;-&amp;#62;is_success ? &lt;span class="synConstant"&gt;'OK'&lt;/span&gt; : &lt;span class="synConstant"&gt;'NG'&lt;/span&gt;, &lt;span class="synIdentifier"&gt;$result&lt;/span&gt;-&amp;#62;message;
            &lt;span class="synIdentifier"&gt;$client&lt;/span&gt;-&amp;#62;send_chan(
                &lt;span class="synIdentifier"&gt;$channel&lt;/span&gt;, &lt;span class="synConstant"&gt;'NOTICE'&lt;/span&gt;, &lt;span class="synIdentifier"&gt;$channel&lt;/span&gt;, encode(&lt;span class="synConstant"&gt;'iso-2022-jp'&lt;/span&gt;, &lt;span class="synIdentifier"&gt;$reply&lt;/span&gt;)
            );
        }
    }
}
&lt;/pre&gt;

			&lt;p&gt;これで、IRCにjoinしてるひとならPolycomを机に向かっていながらにして簡単に操作できて便利になり、生産性の向上を見込めます。&lt;/p&gt;
			&lt;p&gt;どのバージョンのPolycomにもこのAPIがあるのかなどは知らないです。&lt;/p&gt;
		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-09-07T22:28:34+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:sehbaer,2006:http://d.hatena.ne.jp/antipop/20100907/1283866114</guid>
    </item>
    <item>
      <author>nobody@example.com (tokuhirom)</author>
      <dc:creator>nobody@example.com (tokuhirom)</dc:creator>
      <link>http://d.hatena.ne.jp/tokuhirom/20100907/1283829435</link>
      <description>
		
			http://yapcasia.org/2010/
			http://atnd.org/events/7811
			Kan Fushihara organize drinking party after YAPC::Asia 2010. Join us!
			If you cannot understand  how to use atnd.org, contact to us by e-mail to me: tokuhriom at gmail.com.
			Let's drink!
			
			YAPC::Asia 2010 のあとに目黒の大和路という、おれらがよくつかってるしゃぶしゃぶ屋で打ち上げをやろうとおもうので、ふるってご参加ください。YAPC に参加してなくて、たんに perl mongers と飲みたいっていうだけの人とかでも OK です。
		
</description>
      <dc:date>2010-09-07T12:17:15+09:00</dc:date>
      <title>Syabusyabu and drinking party at Yamatoji after YAPC::Asia 2010</title>
      <pubDate>Tue, 07 Sep 2010 12:17:15 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;p&gt;&lt;a href="http://yapcasia.org/2010/" target="_blank"&gt;http://yapcasia.org/2010/&lt;/a&gt;&lt;/p&gt;
			&lt;p&gt;&lt;a href="http://atnd.org/events/7811" target="_blank"&gt;http://atnd.org/events/7811&lt;/a&gt;&lt;/p&gt;
			&lt;p&gt;Kan Fushihara organize drinking party after YAPC::Asia 2010. Join us!&lt;/p&gt;
			&lt;p&gt;If you cannot understand  how to use atnd.org, contact to us by e-mail to me: tokuhriom at gmail.com.&lt;/p&gt;
			&lt;p&gt;Let's drink!&lt;/p&gt;
			&lt;p&gt;&lt;hr&gt;&lt;/p&gt;
			&lt;p&gt;YAPC::Asia 2010 のあとに目黒の大和路という、おれらがよくつかってるしゃぶしゃぶ屋で打ち上げをやろうとおもうので、ふるってご参加ください。YAPC に参加してなくて、たんに perl mongers と飲みたいっていうだけの人とかでも OK です。&lt;/p&gt;
		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-09-07T12:17:15+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:sehbaer,2006:http://d.hatena.ne.jp/tokuhirom/20100907/1283829435</guid>
    </item>
    <item>
      <author>nobody@example.com (tokuhirom)</author>
      <dc:creator>nobody@example.com (tokuhirom)</dc:creator>
      <link>http://d.hatena.ne.jp/tokuhirom/20100906/1283740881</link>
      <description>
		

0.18
	- added accessor: Text::MicroTemplate::File-&gt;include_path


			T::MT::File-&gt;include_path があると、Plack::App::MicroTemplate みたいなのをつくるときに便利だよねーっということで。
			これは read only accessor としているが、これをうわがきすると、キャッシュが混乱するため(まあ、キャッシュをクリアする方向で調整してもいいのだが、そもそもそうそう書換えるもんでもないので read only とした)。
		
</description>
      <dc:date>2010-09-06T11:41:21+09:00</dc:date>
      <title>本日の早朝勉強会の成果: added accessor: Text::MicroTemplate::File-&gt;include_path</title>
      <pubDate>Mon, 06 Sep 2010 11:41:21 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
&lt;pre&gt;
0.18
	- added accessor: Text::MicroTemplate::File-&amp;#62;include_path
&lt;/pre&gt;

			&lt;p&gt;T::MT::File-&amp;#62;include_path があると、Plack::App::MicroTemplate みたいなのをつくるときに便利だよねーっということで。&lt;/p&gt;
			&lt;p&gt;これは read only accessor としているが、これをうわがきすると、キャッシュが混乱するため(まあ、キャッシュをクリアする方向で調整してもいいのだが、そもそもそうそう書換えるもんでもないので read only とした)。&lt;/p&gt;
		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-09-06T11:41:21+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:sehbaer,2006:http://d.hatena.ne.jp/tokuhirom/20100906/1283740881</guid>
    </item>
    <item>
      <author>nobody@example.com (tokuhirom)</author>
      <dc:creator>nobody@example.com (tokuhirom)</dc:creator>
      <link>http://d.hatena.ne.jp/tokuhirom/20100905/1283645852</link>
      <description>
		
			http://frepan.64p.org/~flora/Devel-bt-0.01/lib/Devel/bt.pm

    $ perl -d:bt -MB -e'(bless \(my $o = 0), q{B::SV})-&gt;REFCNT'
    #0  0x00007f9c3215ab0e in __libc_waitpid (pid=&lt;value optimized out&gt;, stat_loc=0x7fff4c5ffbe8, options=&lt;value optimized out&gt;) at ../sysdeps/unix/sysv/linux/waitpid.c:32
    #1  0x00007f9c319168c1 in backtrace () at bt.xs:129
    #2  0x00007f9c319168ec in sighandler (sig=11) at bt.xs:135
    #3  &lt;signal handler called&gt;
    #4  0x00007f9c316c8ccf in XS_B__SV_REFCNT (my_perl=0x151c010, cv=0x177bfb8) at B.c:3360
    #5  0x000000000057d5a0 in Perl_pp_entersub (my_perl=0x151c010) at pp_hot.c:2882
    #6  0x000000000051a331 in Perl_runops_debug (my_perl=0x151c010) at dump.c:2049
    #7  0x0000000000454ab0 in S_run_body (my_perl=0x151c010, oldscope=1) at perl.c:2308
    #8  0x0000000000453d78 in perl_run (my_perl=0x151c010) at perl.c:2233
    #9  0x00000000004230fd in main (argc=6, argv=0x7fff4c600788, env=0x7fff4c6007c0) at perlmain.c:117


			このように、簡単に、gdb とかつかったことない人でも segv 時の stacktrace がとれる。内部の実装的には、gdb を起動しちゃってるんで、そこが微妙かなあ。
			catchsegv とかつかっとけやという話もあるけど。
			参考文献:
			http://0xcc.net/blog/archives/000067.html
		
</description>
      <dc:date>2010-09-05T09:17:32+09:00</dc:date>
      <title>rafl’s Devel::bt is awesome.</title>
      <pubDate>Sun, 05 Sep 2010 09:17:32 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;p&gt;&lt;a href="http://frepan.64p.org/~flora/Devel-bt-0.01/lib/Devel/bt.pm" target="_blank"&gt;http://frepan.64p.org/~flora/Devel-bt-0.01/lib/Devel/bt.pm&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;
    $ perl -d:bt -MB -e&amp;#39;(bless &amp;#92;(my $o = 0), q{B::SV})-&amp;#62;REFCNT&amp;#39;
    #0  0x00007f9c3215ab0e in __libc_waitpid (pid=&amp;#60;value optimized out&amp;#62;, stat_loc=0x7fff4c5ffbe8, options=&amp;#60;value optimized out&amp;#62;) at ../sysdeps/unix/sysv/linux/waitpid.c:32
    #1  0x00007f9c319168c1 in backtrace () at bt.xs:129
    #2  0x00007f9c319168ec in sighandler (sig=11) at bt.xs:135
    #3  &amp;#60;signal handler called&amp;#62;
    #4  0x00007f9c316c8ccf in XS_B__SV_REFCNT (my_perl=0x151c010, cv=0x177bfb8) at B.c:3360
    #5  0x000000000057d5a0 in Perl_pp_entersub (my_perl=0x151c010) at pp_hot.c:2882
    #6  0x000000000051a331 in Perl_runops_debug (my_perl=0x151c010) at dump.c:2049
    #7  0x0000000000454ab0 in S_run_body (my_perl=0x151c010, oldscope=1) at perl.c:2308
    #8  0x0000000000453d78 in perl_run (my_perl=0x151c010) at perl.c:2233
    #9  0x00000000004230fd in main (argc=6, argv=0x7fff4c600788, env=0x7fff4c6007c0) at perlmain.c:117
&lt;/pre&gt;

			&lt;p&gt;このように、簡単に、gdb とかつかったことない人でも segv 時の stacktrace がとれる。内部の実装的には、gdb を起動しちゃってるんで、そこが微妙かなあ。&lt;/p&gt;
			&lt;p&gt;catchsegv とかつかっとけやという話もあるけど。&lt;/p&gt;
			&lt;p&gt;参考文献:&lt;/p&gt;
			&lt;p&gt;&lt;a href="http://0xcc.net/blog/archives/000067.html" target="_blank"&gt;http://0xcc.net/blog/archives/000067.html&lt;/a&gt;&lt;/p&gt;
		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-09-05T09:17:32+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:sehbaer,2006:http://d.hatena.ne.jp/tokuhirom/20100905/1283645852</guid>
    </item>
    <item>
      <author>nobody@example.com (ZIGOROu)</author>
      <dc:creator>nobody@example.com (ZIGOROu)</dc:creator>
      <category>ARRAY(0x98425d8)</category>
      <link>http://d.hatena.ne.jp/ZIGOROu/20100904/1283615808</link>
      <description>
		
			sharding やら partitioning とかし始めると段々とその key が特定のノートやパーティションに収まるように分類した上で処理とかしたくなる訳です。
			最近、モバゲーのオープンプラットフォームのプロダクト全てで使っている、DBIx-DBHResolver にちょこちょこ新機能を入れたりしてるんですが、これに resolve_node_keys ってメソッドを最近つけたりしました。

#!/usr/bin/perl

use strict;
use warnings;
use feature qw(say);
use Data::Dump qw(dump);
use DBIx::DBHResolver;

my $resolver = DBIx::DBHResolver-&gt;new;
$resolver-&gt;config(
    +{
        clusters =&gt; +{
            TIMELINE =&gt;
              +{ nodes =&gt; [qw/TIMELINE001 TIMELINE002/], strategy =&gt; 'Key' }
        },
        connect_info =&gt; +{
            TIMELINE001 =&gt; +{},
            TIMELINE002 =&gt; +{},
        }
    }
);

my %node_keys = $resolver-&gt;resolve_node_keys( TIMELINE =&gt; [ 1 .. 20 ] );
while ( my ( $node, $keys ) = each %node_keys ) {
    say $node;
    say dump $keys;
}


			まぁこんな感じで使うんですが、

TIMELINE001
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
TIMELINE002
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]


			という出力となります。各ノードに分割アルゴリズムに則った形でノート名とキーの配列として返してくれます。余談ですがこの分割アルゴリズムは現在は Key, Range, List に対応してます。
			このキーが今度はまた万単位であってそれらのキーを元に bulk insert するとかそんな処理が出てきたりする訳ですが、毎回のごとく

my @all_values = ( 1 .. 100000 );
my @values;
while ( ( @values = splice(@all_values, 0, 1000) ) &gt; 0 ) {
  ### bulk insert by each @values
}


			みたいな処理を書いて居た訳ですがどうにもスマートじゃないなぁと前から思ってました。
			でこんな風にしてみるのはどうかなと思い立ったのがこちら。

#!/usr/bin/perl

use strict;
use warnings;
use feature qw(say);

use Array::AsHash;
use Data::Dump qw(dump);
use Data::Util qw(is_scalar_ref is_number);
use Iterator::Simple qw(iterator);
use SQL::Abstract;
use SQL::Abstract::Plugin::InsertMulti;

sub bulk_insert_iterator {
    my ( $values, $size ) = @_;
    $size ||= 100;
    iterator {
        my @next = splice( @$values, 0, $size );
        return unless ( @next &gt; 0 );
        \@next;
    };
}

sub as_sql {
    my ( $stmt, @bind ) = @_;
    for my $v (@bind) {
        if ( is_scalar_ref $v ) {
            $stmt =~ s/\?/%s/;
        }
        elsif ( is_number $v ) {
            $stmt =~ s/\?/%d/;
        }
        else {
            $stmt =~ s/\?/'%s'/;
        }
    }
    sprintf( $stmt, @bind );
}

my $sql = SQL::Abstract-&gt;new;
my ( $stmt, @bind );
my %node_keys = (
    PEOPLE001_MASTER =&gt; [ map { $_ * 2 } ( 1 .. 25 ) ],
    PEOPLE002_MASTER =&gt; [ map { ( $_ * 2 ) - 1 } ( 1 .. 25 ) ]
);
my @cols = qw( id ref_id created_on );

my $ah = Array::AsHash-&gt;new( +{ array =&gt; [%node_keys] } );

while ( my ( $node, $keys ) = $ah-&gt;each ) {
    say $node;
    say '-' x 100;
    my $iter =
      bulk_insert_iterator( [ map { [ 1, $_, \'NOW()' ] } @$keys ], 10 );
    while ( my $values = $iter-&gt;next ) {
        ( $stmt, @bind ) = $sql-&gt;insert_multi( 'hidek', \@cols, $values );
        say as_sql( $stmt, @bind );
    }
    say '-' x 100;
}


			で出力はこんな風になります。

PEOPLE001_MASTER
----------------------------------------------------------------------------------------------------
INSERT INTO hidek ( id, ref_id, created_on ) VALUES ( 1, 2, NOW() ), ( 1, 4, NOW() ), ( 1, 6, NOW() ), ( 1, 8, NOW() ), ( 1, 10, NOW() ), ( 1, 12, NOW() ), ( 1, 14, NOW() ), ( 1, 16, NOW() ), ( 1, 18, NOW() ), ( 1, 20, NOW() )
INSERT INTO hidek ( id, ref_id, created_on ) VALUES ( 1, 22, NOW() ), ( 1, 24, NOW() ), ( 1, 26, NOW() ), ( 1, 28, NOW() ), ( 1, 30, NOW() ), ( 1, 32, NOW() ), ( 1, 34, NOW() ), ( 1, 36, NOW() ), ( 1, 38, NOW() ), ( 1, 40, NOW() )
INSERT INTO hidek ( id, ref_id, created_on ) VALUES ( 1, 42, NOW() ), ( 1, 44, NOW() ), ( 1, 46, NOW() ), ( 1, 48, NOW() ), ( 1, 50, NOW() )
----------------------------------------------------------------------------------------------------
PEOPLE002_MASTER
----------------------------------------------------------------------------------------------------
INSERT INTO hidek ( id, ref_id, created_on ) VALUES ( 1, 1, NOW() ), ( 1, 3, NOW() ), ( 1, 5, NOW() ), ( 1, 7, NOW() ), ( 1, 9, NOW() ), ( 1, 11, NOW() ), ( 1, 13, NOW() ), ( 1, 15, NOW() ), ( 1, 17, NOW() ), ( 1, 19, NOW() )
INSERT INTO hidek ( id, ref_id, created_on ) VALUES ( 1, 21, NOW() ), ( 1, 23, NOW() ), ( 1, 25, NOW() ), ( 1, 27, NOW() ), ( 1, 29, NOW() ), ( 1, 31, NOW() ), ( 1, 33, NOW() ), ( 1, 35, NOW() ), ( 1, 37, NOW() ), ( 1, 39, NOW() )
INSERT INTO hidek ( id, ref_id, created_on ) VALUES ( 1, 41, NOW() ), ( 1, 43, NOW() ), ( 1, 45, NOW() ), ( 1, 47, NOW() ), ( 1, 49, NOW() )
----------------------------------------------------------------------------------------------------


			まぁ最初の Array::AsHash は each でも一向に構わない訳ですが、何となく試しに使ってみました。
			汎用的な Iterator を作りたいのであれば、Iterator::Simple が一番軽量で汎用的だなーという印象。
		
</description>
      <dc:date>2010-09-05T00:56:48+09:00</dc:date>
      <dc:subject>ARRAY(0x98425c8)</dc:subject>
      <title>[Perl] Iteration あれこれ</title>
      <pubDate>Sun, 05 Sep 2010 00:56:48 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;p&gt;sharding やら partitioning とかし始めると段々とその key が特定のノートやパーティションに収まるように分類した上で処理とかしたくなる訳です。&lt;/p&gt;
			&lt;p&gt;最近、モバゲーのオープンプラットフォームのプロダクト全てで使っている、&lt;a href="http://search.cpan.org/~zigorou/DBIx-DBHResolver/"&gt;DBIx-DBHResolver&lt;/a&gt; にちょこちょこ新機能を入れたりしてるんですが、これに resolve_node_keys って&lt;a href="http://javascript.g.hatena.ne.jp/keyword/%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89" class="okeyword"&gt;メソッド&lt;/a&gt;を最近つけたりしました。&lt;/p&gt;
&lt;pre class="syntax-highlight"&gt;
&lt;span class="synPreProc"&gt;#!/usr/bin/perl&lt;/span&gt;

&lt;span class="synStatement"&gt;use strict&lt;/span&gt;;
&lt;span class="synStatement"&gt;use warnings&lt;/span&gt;;
&lt;span class="synStatement"&gt;use &lt;/span&gt;feature &lt;span class="synConstant"&gt;qw(say)&lt;/span&gt;;
&lt;span class="synStatement"&gt;use &lt;/span&gt;Data::Dump &lt;span class="synConstant"&gt;qw(dump)&lt;/span&gt;;
&lt;span class="synStatement"&gt;use &lt;/span&gt;DBIx::DBHResolver;

&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$resolver&lt;/span&gt; = DBIx::DBHResolver-&amp;#62;&lt;span class="synStatement"&gt;new&lt;/span&gt;;
&lt;span class="synIdentifier"&gt;$resolver&lt;/span&gt;-&amp;#62;config(
    +{
        &lt;span class="synConstant"&gt;clusters &lt;/span&gt;=&amp;#62; +{
            &lt;span class="synConstant"&gt;TIMELINE &lt;/span&gt;=&amp;#62;
              +{ &lt;span class="synConstant"&gt;nodes &lt;/span&gt;=&amp;#62; [&lt;span class="synConstant"&gt;qw/TIMELINE001 TIMELINE002/&lt;/span&gt;], &lt;span class="synConstant"&gt;strategy &lt;/span&gt;=&amp;#62; &lt;span class="synConstant"&gt;'Key'&lt;/span&gt; }
        },
        &lt;span class="synConstant"&gt;connect_info &lt;/span&gt;=&amp;#62; +{
            &lt;span class="synConstant"&gt;TIMELINE001 &lt;/span&gt;=&amp;#62; +{},
            &lt;span class="synConstant"&gt;TIMELINE002 &lt;/span&gt;=&amp;#62; +{},
        }
    }
);

&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;%node_keys&lt;/span&gt; = &lt;span class="synIdentifier"&gt;$resolver&lt;/span&gt;-&amp;#62;resolve_node_keys( &lt;span class="synConstant"&gt;TIMELINE &lt;/span&gt;=&amp;#62; [ &lt;span class="synConstant"&gt;1&lt;/span&gt; .. &lt;span class="synConstant"&gt;20&lt;/span&gt; ] );
&lt;span class="synStatement"&gt;while&lt;/span&gt; ( &lt;span class="synStatement"&gt;my&lt;/span&gt; ( &lt;span class="synIdentifier"&gt;$node&lt;/span&gt;, &lt;span class="synIdentifier"&gt;$keys&lt;/span&gt; ) = &lt;span class="synStatement"&gt;each&lt;/span&gt; &lt;span class="synIdentifier"&gt;%node_keys&lt;/span&gt; ) {
    say &lt;span class="synIdentifier"&gt;$node&lt;/span&gt;;
    say &lt;span class="synStatement"&gt;dump&lt;/span&gt; &lt;span class="synIdentifier"&gt;$keys&lt;/span&gt;;
}
&lt;/pre&gt;

			&lt;p&gt;まぁこんな感じで使うんですが、&lt;/p&gt;
&lt;pre&gt;
TIMELINE001
&amp;#91;2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
TIMELINE002
&amp;#91;1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
&lt;/pre&gt;

			&lt;p&gt;という出力となります。各ノードに分割アルゴリズムに則った形でノート名とキーの&lt;a href="http://javascript.g.hatena.ne.jp/keyword/%E9%85%8D%E5%88%97" class="okeyword"&gt;配列&lt;/a&gt;として返してくれます。余談ですがこの分割アルゴリズムは現在は Key, Range, List に対応してます。&lt;/p&gt;
			&lt;p&gt;このキーが今度はまた万単位であってそれらのキーを元に bulk insert するとかそんな処理が出てきたりする訳ですが、毎回のごとく&lt;/p&gt;
&lt;pre class="syntax-highlight"&gt;
&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;@all_values&lt;/span&gt; = ( &lt;span class="synConstant"&gt;1&lt;/span&gt; .. &lt;span class="synConstant"&gt;100000&lt;/span&gt; );
&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;@values&lt;/span&gt;;
&lt;span class="synStatement"&gt;while&lt;/span&gt; ( ( &lt;span class="synIdentifier"&gt;@values&lt;/span&gt; = &lt;span class="synStatement"&gt;splice&lt;/span&gt;(&lt;span class="synIdentifier"&gt;@all_values&lt;/span&gt;, &lt;span class="synConstant"&gt;0&lt;/span&gt;, &lt;span class="synConstant"&gt;1000&lt;/span&gt;) ) &amp;#62; &lt;span class="synConstant"&gt;0&lt;/span&gt; ) {
  &lt;span class="synComment"&gt;### bulk insert by each @values&lt;/span&gt;
}
&lt;/pre&gt;

			&lt;p&gt;みたいな処理を書いて居た訳ですがどうにもスマートじゃないなぁと前から思ってました。&lt;/p&gt;
			&lt;p&gt;でこんな風にしてみるのはどうかなと思い立ったのがこちら。&lt;/p&gt;
&lt;pre class="syntax-highlight"&gt;
&lt;span class="synPreProc"&gt;#!/usr/bin/perl&lt;/span&gt;

&lt;span class="synStatement"&gt;use strict&lt;/span&gt;;
&lt;span class="synStatement"&gt;use warnings&lt;/span&gt;;
&lt;span class="synStatement"&gt;use &lt;/span&gt;feature &lt;span class="synConstant"&gt;qw(say)&lt;/span&gt;;

&lt;span class="synStatement"&gt;use &lt;/span&gt;Array::AsHash;
&lt;span class="synStatement"&gt;use &lt;/span&gt;Data::Dump &lt;span class="synConstant"&gt;qw(dump)&lt;/span&gt;;
&lt;span class="synStatement"&gt;use &lt;/span&gt;Data::Util &lt;span class="synConstant"&gt;qw(is_scalar_ref is_number)&lt;/span&gt;;
&lt;span class="synStatement"&gt;use &lt;/span&gt;Iterator::Simple &lt;span class="synConstant"&gt;qw(iterator)&lt;/span&gt;;
&lt;span class="synStatement"&gt;use &lt;/span&gt;SQL::Abstract;
&lt;span class="synStatement"&gt;use &lt;/span&gt;SQL::Abstract::Plugin::InsertMulti;

&lt;span class="synStatement"&gt;sub&lt;/span&gt;&lt;span class="synIdentifier"&gt; bulk_insert_iterator &lt;/span&gt;{
    &lt;span class="synStatement"&gt;my&lt;/span&gt; ( &lt;span class="synIdentifier"&gt;$values&lt;/span&gt;, &lt;span class="synIdentifier"&gt;$size&lt;/span&gt; ) = &lt;span class="synIdentifier"&gt;@_&lt;/span&gt;;
    &lt;span class="synIdentifier"&gt;$size&lt;/span&gt; ||= &lt;span class="synConstant"&gt;100&lt;/span&gt;;
    iterator {
        &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;@next&lt;/span&gt; = &lt;span class="synStatement"&gt;splice&lt;/span&gt;( &lt;span class="synIdentifier"&gt;@$values&lt;/span&gt;, &lt;span class="synConstant"&gt;0&lt;/span&gt;, &lt;span class="synIdentifier"&gt;$size&lt;/span&gt; );
        &lt;span class="synStatement"&gt;return&lt;/span&gt; &lt;span class="synStatement"&gt;unless&lt;/span&gt; ( &lt;span class="synIdentifier"&gt;@next&lt;/span&gt; &amp;#62; &lt;span class="synConstant"&gt;0&lt;/span&gt; );
        &lt;span class="synIdentifier"&gt;\@next&lt;/span&gt;;
    };
}

&lt;span class="synStatement"&gt;sub&lt;/span&gt;&lt;span class="synIdentifier"&gt; as_sql &lt;/span&gt;{
    &lt;span class="synStatement"&gt;my&lt;/span&gt; ( &lt;span class="synIdentifier"&gt;$stmt&lt;/span&gt;, &lt;span class="synIdentifier"&gt;@bind&lt;/span&gt; ) = &lt;span class="synIdentifier"&gt;@_&lt;/span&gt;;
    &lt;span class="synStatement"&gt;for&lt;/span&gt; &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$v&lt;/span&gt; (&lt;span class="synIdentifier"&gt;@bind&lt;/span&gt;) {
        &lt;span class="synStatement"&gt;if&lt;/span&gt; ( is_scalar_ref &lt;span class="synIdentifier"&gt;$v&lt;/span&gt; ) {
            &lt;span class="synIdentifier"&gt;$stmt&lt;/span&gt; =~ &lt;span class="synStatement"&gt;s/&lt;/span&gt;&lt;span class="synSpecial"&gt;\?&lt;/span&gt;&lt;span class="synStatement"&gt;/&lt;/span&gt;&lt;span class="synIdentifier"&gt;%s&lt;/span&gt;&lt;span class="synStatement"&gt;/&lt;/span&gt;;
        }
        &lt;span class="synStatement"&gt;elsif&lt;/span&gt; ( is_number &lt;span class="synIdentifier"&gt;$v&lt;/span&gt; ) {
            &lt;span class="synIdentifier"&gt;$stmt&lt;/span&gt; =~ &lt;span class="synStatement"&gt;s/&lt;/span&gt;&lt;span class="synSpecial"&gt;\?&lt;/span&gt;&lt;span class="synStatement"&gt;/&lt;/span&gt;&lt;span class="synIdentifier"&gt;%d&lt;/span&gt;&lt;span class="synStatement"&gt;/&lt;/span&gt;;
        }
        &lt;span class="synStatement"&gt;else&lt;/span&gt; {
            &lt;span class="synIdentifier"&gt;$stmt&lt;/span&gt; =~ &lt;span class="synStatement"&gt;s/&lt;/span&gt;&lt;span class="synSpecial"&gt;\?&lt;/span&gt;&lt;span class="synStatement"&gt;/&lt;/span&gt;&lt;span class="synConstant"&gt;'&lt;/span&gt;&lt;span class="synIdentifier"&gt;%s&lt;/span&gt;&lt;span class="synConstant"&gt;'&lt;/span&gt;&lt;span class="synStatement"&gt;/&lt;/span&gt;;
        }
    }
    &lt;span class="synStatement"&gt;sprintf&lt;/span&gt;( &lt;span class="synIdentifier"&gt;$stmt&lt;/span&gt;, &lt;span class="synIdentifier"&gt;@bind&lt;/span&gt; );
}

&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$sql&lt;/span&gt; = SQL::Abstract-&amp;#62;&lt;span class="synStatement"&gt;new&lt;/span&gt;;
&lt;span class="synStatement"&gt;my&lt;/span&gt; ( &lt;span class="synIdentifier"&gt;$stmt&lt;/span&gt;, &lt;span class="synIdentifier"&gt;@bind&lt;/span&gt; );
&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;%node_keys&lt;/span&gt; = (
    &lt;span class="synConstant"&gt;PEOPLE001_MASTER &lt;/span&gt;=&amp;#62; [ &lt;span class="synStatement"&gt;map&lt;/span&gt; { &lt;span class="synIdentifier"&gt;$_&lt;/span&gt; * &lt;span class="synConstant"&gt;2&lt;/span&gt; } ( &lt;span class="synConstant"&gt;1&lt;/span&gt; .. &lt;span class="synConstant"&gt;25&lt;/span&gt; ) ],
    &lt;span class="synConstant"&gt;PEOPLE002_MASTER &lt;/span&gt;=&amp;#62; [ &lt;span class="synStatement"&gt;map&lt;/span&gt; { ( &lt;span class="synIdentifier"&gt;$_&lt;/span&gt; * &lt;span class="synConstant"&gt;2&lt;/span&gt; ) - &lt;span class="synConstant"&gt;1&lt;/span&gt; } ( &lt;span class="synConstant"&gt;1&lt;/span&gt; .. &lt;span class="synConstant"&gt;25&lt;/span&gt; ) ]
);
&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;@cols&lt;/span&gt; = &lt;span class="synConstant"&gt;qw( id ref_id created_on )&lt;/span&gt;;

&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$ah&lt;/span&gt; = Array::AsHash-&amp;#62;&lt;span class="synStatement"&gt;new&lt;/span&gt;( +{ &lt;span class="synConstant"&gt;array &lt;/span&gt;=&amp;#62; [&lt;span class="synIdentifier"&gt;%node_keys&lt;/span&gt;] } );

&lt;span class="synStatement"&gt;while&lt;/span&gt; ( &lt;span class="synStatement"&gt;my&lt;/span&gt; ( &lt;span class="synIdentifier"&gt;$node&lt;/span&gt;, &lt;span class="synIdentifier"&gt;$keys&lt;/span&gt; ) = &lt;span class="synIdentifier"&gt;$ah&lt;/span&gt;-&amp;#62;&lt;span class="synStatement"&gt;each&lt;/span&gt; ) {
    say &lt;span class="synIdentifier"&gt;$node&lt;/span&gt;;
    say &lt;span class="synConstant"&gt;'-'&lt;/span&gt; x &lt;span class="synConstant"&gt;100&lt;/span&gt;;
    &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$iter&lt;/span&gt; =
      bulk_insert_iterator( [ &lt;span class="synStatement"&gt;map&lt;/span&gt; { [ &lt;span class="synConstant"&gt;1&lt;/span&gt;, &lt;span class="synIdentifier"&gt;$_&lt;/span&gt;, \&lt;span class="synConstant"&gt;'NOW()'&lt;/span&gt; ] } &lt;span class="synIdentifier"&gt;@$keys&lt;/span&gt; ], &lt;span class="synConstant"&gt;10&lt;/span&gt; );
    &lt;span class="synStatement"&gt;while&lt;/span&gt; ( &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$values&lt;/span&gt; = &lt;span class="synIdentifier"&gt;$iter&lt;/span&gt;-&amp;#62;&lt;span class="synStatement"&gt;next&lt;/span&gt; ) {
        ( &lt;span class="synIdentifier"&gt;$stmt&lt;/span&gt;, &lt;span class="synIdentifier"&gt;@bind&lt;/span&gt; ) = &lt;span class="synIdentifier"&gt;$sql&lt;/span&gt;-&amp;#62;insert_multi( &lt;span class="synConstant"&gt;'hidek'&lt;/span&gt;, &lt;span class="synIdentifier"&gt;\@cols&lt;/span&gt;, &lt;span class="synIdentifier"&gt;$values&lt;/span&gt; );
        say as_sql( &lt;span class="synIdentifier"&gt;$stmt&lt;/span&gt;, &lt;span class="synIdentifier"&gt;@bind&lt;/span&gt; );
    }
    say &lt;span class="synConstant"&gt;'-'&lt;/span&gt; x &lt;span class="synConstant"&gt;100&lt;/span&gt;;
}
&lt;/pre&gt;

			&lt;p&gt;で出力はこんな風になります。&lt;/p&gt;
&lt;pre&gt;
PEOPLE001_MASTER
----------------------------------------------------------------------------------------------------
INSERT INTO hidek ( id, ref_id, created_on ) VALUES ( 1, 2, NOW() ), ( 1, 4, NOW() ), ( 1, 6, NOW() ), ( 1, 8, NOW() ), ( 1, 10, NOW() ), ( 1, 12, NOW() ), ( 1, 14, NOW() ), ( 1, 16, NOW() ), ( 1, 18, NOW() ), ( 1, 20, NOW() )
INSERT INTO hidek ( id, ref_id, created_on ) VALUES ( 1, 22, NOW() ), ( 1, 24, NOW() ), ( 1, 26, NOW() ), ( 1, 28, NOW() ), ( 1, 30, NOW() ), ( 1, 32, NOW() ), ( 1, 34, NOW() ), ( 1, 36, NOW() ), ( 1, 38, NOW() ), ( 1, 40, NOW() )
INSERT INTO hidek ( id, ref_id, created_on ) VALUES ( 1, 42, NOW() ), ( 1, 44, NOW() ), ( 1, 46, NOW() ), ( 1, 48, NOW() ), ( 1, 50, NOW() )
----------------------------------------------------------------------------------------------------
PEOPLE002_MASTER
----------------------------------------------------------------------------------------------------
INSERT INTO hidek ( id, ref_id, created_on ) VALUES ( 1, 1, NOW() ), ( 1, 3, NOW() ), ( 1, 5, NOW() ), ( 1, 7, NOW() ), ( 1, 9, NOW() ), ( 1, 11, NOW() ), ( 1, 13, NOW() ), ( 1, 15, NOW() ), ( 1, 17, NOW() ), ( 1, 19, NOW() )
INSERT INTO hidek ( id, ref_id, created_on ) VALUES ( 1, 21, NOW() ), ( 1, 23, NOW() ), ( 1, 25, NOW() ), ( 1, 27, NOW() ), ( 1, 29, NOW() ), ( 1, 31, NOW() ), ( 1, 33, NOW() ), ( 1, 35, NOW() ), ( 1, 37, NOW() ), ( 1, 39, NOW() )
INSERT INTO hidek ( id, ref_id, created_on ) VALUES ( 1, 41, NOW() ), ( 1, 43, NOW() ), ( 1, 45, NOW() ), ( 1, 47, NOW() ), ( 1, 49, NOW() )
----------------------------------------------------------------------------------------------------
&lt;/pre&gt;

			&lt;p&gt;まぁ最初の &lt;a href="http://search.cpan.org/dist/Array-AsHash/lib/Array/AsHash.pm"&gt;Array::AsHash&lt;/a&gt; は each でも一向に構わない訳ですが、何となく試しに使ってみました。&lt;/p&gt;
			&lt;p&gt;汎用的な Iterator を作りたいのであれば、&lt;a href="http://search.cpan.org/dist/Iterator-Simple/lib/Iterator/Simple.pm"&gt;Iterator::Simple&lt;/a&gt; が一番軽量で汎用的だなーという印象。&lt;/p&gt;
		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-09-05T00:56:48+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:sehbaer,2006:http://d.hatena.ne.jp/ZIGOROu/20100904/1283615808</guid>
    </item>
    <item>
      <author>nobody@example.com (tokuhirom)</author>
      <dc:creator>nobody@example.com (tokuhirom)</dc:creator>
      <link>http://d.hatena.ne.jp/tokuhirom/20100904/1283573706</link>
      <description>
		&lt;div class="section"&gt;
&lt;pre class="syntax-highlight"&gt;
&lt;span class="synStatement"&gt;use strict&lt;/span&gt;;
&lt;span class="synStatement"&gt;use warnings&lt;/span&gt;;
&lt;span class="synStatement"&gt;use &lt;/span&gt;Authen::Htpasswd;
&lt;span class="synStatement"&gt;use &lt;/span&gt;Plack::Builder;

&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$app&lt;/span&gt; =&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synStatement"&gt;sub&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;{
    [&lt;span class="synConstant"&gt;200&lt;/span&gt;, [], [&lt;span class="synConstant"&gt;'OK'&lt;/span&gt;]]
};

builder {
    &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$authen&lt;/span&gt; = Authen::Htpasswd-&amp;#62;&lt;span class="synStatement"&gt;new&lt;/span&gt;(&lt;span class="synConstant"&gt;'user.txt'&lt;/span&gt;, {&lt;span class="synConstant"&gt;encrypt_hash &lt;/span&gt;=&amp;#62; &lt;span class="synConstant"&gt;'md5'&lt;/span&gt;});
    enable &lt;span class="synConstant"&gt;'Auth::Basic'&lt;/span&gt;,
        &lt;span class="synConstant"&gt;authenticator &lt;/span&gt;=&amp;#62;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synStatement"&gt;sub&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;{
            &lt;span class="synStatement"&gt;my&lt;/span&gt; (&lt;span class="synIdentifier"&gt;$username&lt;/span&gt;, &lt;span class="synIdentifier"&gt;$password&lt;/span&gt;) = &lt;span class="synIdentifier"&gt;@_&lt;/span&gt;;
            &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$user&lt;/span&gt; = &lt;span class="synIdentifier"&gt;$authen&lt;/span&gt;-&amp;#62;lookup_user(&lt;span class="synIdentifier"&gt;$username&lt;/span&gt;);
            &lt;span class="synStatement"&gt;return&lt;/span&gt; &lt;span class="synIdentifier"&gt;$user&lt;/span&gt; &amp;#38;&amp;#38; &lt;span class="synIdentifier"&gt;$user&lt;/span&gt;-&amp;#62;check_password(&lt;span class="synIdentifier"&gt;$password&lt;/span&gt;);
        };
    &lt;span class="synIdentifier"&gt;$app&lt;/span&gt;;
};
&lt;/pre&gt;

		&lt;/div&gt;
</description>
      <dc:date>2010-09-04T13:15:06+09:00</dc:date>
      <title>How to authenticate with basic auth + htpasswd</title>
      <pubDate>Sat, 04 Sep 2010 13:15:06 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
&lt;pre class="syntax-highlight"&gt;
&lt;span class="synStatement"&gt;use strict&lt;/span&gt;;
&lt;span class="synStatement"&gt;use warnings&lt;/span&gt;;
&lt;span class="synStatement"&gt;use &lt;/span&gt;Authen::Htpasswd;
&lt;span class="synStatement"&gt;use &lt;/span&gt;Plack::Builder;

&lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$app&lt;/span&gt; =&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synStatement"&gt;sub&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;{
    [&lt;span class="synConstant"&gt;200&lt;/span&gt;, [], [&lt;span class="synConstant"&gt;'OK'&lt;/span&gt;]]
};

builder {
    &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$authen&lt;/span&gt; = Authen::Htpasswd-&amp;#62;&lt;span class="synStatement"&gt;new&lt;/span&gt;(&lt;span class="synConstant"&gt;'user.txt'&lt;/span&gt;, {&lt;span class="synConstant"&gt;encrypt_hash &lt;/span&gt;=&amp;#62; &lt;span class="synConstant"&gt;'md5'&lt;/span&gt;});
    enable &lt;span class="synConstant"&gt;'Auth::Basic'&lt;/span&gt;,
        &lt;span class="synConstant"&gt;authenticator &lt;/span&gt;=&amp;#62;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synStatement"&gt;sub&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;{
            &lt;span class="synStatement"&gt;my&lt;/span&gt; (&lt;span class="synIdentifier"&gt;$username&lt;/span&gt;, &lt;span class="synIdentifier"&gt;$password&lt;/span&gt;) = &lt;span class="synIdentifier"&gt;@_&lt;/span&gt;;
            &lt;span class="synStatement"&gt;my&lt;/span&gt; &lt;span class="synIdentifier"&gt;$user&lt;/span&gt; = &lt;span class="synIdentifier"&gt;$authen&lt;/span&gt;-&amp;#62;lookup_user(&lt;span class="synIdentifier"&gt;$username&lt;/span&gt;);
            &lt;span class="synStatement"&gt;return&lt;/span&gt; &lt;span class="synIdentifier"&gt;$user&lt;/span&gt; &amp;#38;&amp;#38; &lt;span class="synIdentifier"&gt;$user&lt;/span&gt;-&amp;#62;check_password(&lt;span class="synIdentifier"&gt;$password&lt;/span&gt;);
        };
    &lt;span class="synIdentifier"&gt;$app&lt;/span&gt;;
};
&lt;/pre&gt;

		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-09-04T13:15:06+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:sehbaer,2006:http://d.hatena.ne.jp/tokuhirom/20100904/1283573706</guid>
    </item>
    <item>
      <author>nobody@example.com (tokuhirom)</author>
      <dc:creator>nobody@example.com (tokuhirom)</dc:creator>
      <link>http://d.hatena.ne.jp/tokuhirom/20100903/1283508291</link>
      <description>
		
			vox がおわるというので tokuhirom.wordpress.com にうつした。
			import tool があるので簡単だった。
			しかし今後も更新の予定はない。
		
</description>
      <dc:date>2010-09-03T19:04:51+09:00</dc:date>
      <title>tokuhirom.vox.com 移転のおしらせ</title>
      <pubDate>Fri, 03 Sep 2010 19:04:51 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;p&gt;vox がおわるというので tokuhirom.wordpress.com にうつした。&lt;/p&gt;
			&lt;p&gt;import tool があるので簡単だった。&lt;/p&gt;
			&lt;p&gt;しかし今後も更新の予定はない。&lt;/p&gt;
		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-09-03T19:04:51+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:sehbaer,2006:http://d.hatena.ne.jp/tokuhirom/20100903/1283508291</guid>
    </item>
    <item>
      <author>nobody@example.com (tokuhirom)</author>
      <dc:creator>nobody@example.com (tokuhirom)</dc:creator>
      <link>http://d.hatena.ne.jp/tokuhirom/20100903/1283508290</link>
      <description>
		
			
				Duselongdouble してるときに、double の文字列表現がちがくなるのでテストがこけるという問題があって、それをなおした。
			
			あと、PP 版の pull request がまかまかさんからきており、review して 2 点ほど追加要望をつけてさしもどし中(お前がやれってはなしなんですが、ちょっと手をつける余裕がなくてすみません)。
			というわけで、ぼちぼち PP 版もでるんじゃないかとおもいます。
		
</description>
      <dc:date>2010-09-03T19:04:50+09:00</dc:date>
      <title>Data-MessagePack 0.16 だした</title>
      <pubDate>Fri, 03 Sep 2010 19:04:50 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;ul&gt;
				&lt;li&gt;Duselongdouble してるときに、double の文字列表現がちがくなるのでテストがこけるという問題があって、それをなおした。&lt;/li&gt;
			&lt;/ul&gt;
			&lt;p&gt;あと、PP 版の pull request がまかまかさんからきており、review して 2 点ほど追加要望をつけてさしもどし中(お前がやれってはなしなんですが、ちょっと手をつける余裕がなくてすみません)。&lt;/p&gt;
			&lt;p&gt;というわけで、ぼちぼち PP 版もでるんじゃないかとおもいます。&lt;/p&gt;
		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-09-03T19:04:50+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:sehbaer,2006:http://d.hatena.ne.jp/tokuhirom/20100903/1283508290</guid>
    </item>
    <item>
      <author>nobody@example.com (tokuhirom)</author>
      <dc:creator>nobody@example.com (tokuhirom)</dc:creator>
      <link>http://d.hatena.ne.jp/tokuhirom/20100903/1283503900</link>
      <description>
		
			http://use.perl.org/~cosimo/journal/37554
			
				withoutworldwritables という謎の suffix をつけて CPAN にアップしてる人がいて、だいたいそういうモジュールはクオリティがひくいなあとおもっていたのだけど、この suffix は PAUSE が自動的につけていて、world writable なファイルがふくまれているときに自動的につくものだということを miyagawa さんからおしえていただきました。
			

		
</description>
      <dc:date>2010-09-03T17:51:40+09:00</dc:date>
      <title>withoutworldwritables の話</title>
      <pubDate>Fri, 03 Sep 2010 17:51:40 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;p&gt;&lt;a href="http://use.perl.org/~cosimo/journal/37554" target="_blank"&gt;http://use.perl.org/~cosimo/journal/37554&lt;/a&gt;&lt;/p&gt;
			&lt;ul&gt;
				&lt;li&gt;withoutworldwritables という謎の suffix をつけて CPAN にアップしてる人がいて、だいたいそういうモジュールはクオリティがひくいなあとおもっていたのだけど、この suffix は PAUSE が自動的につけていて、world writable なファイルがふくまれているときに自動的につくものだということを miyagawa さんからおしえていただきました。&lt;/li&gt;
			&lt;/ul&gt;

		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-09-03T17:51:40+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:sehbaer,2006:http://d.hatena.ne.jp/tokuhirom/20100903/1283503900</guid>
    </item>
    <item>
      <author>nobody@example.com (tokuhirom)</author>
      <dc:creator>nobody@example.com (tokuhirom)</dc:creator>
      <link>http://d.hatena.ne.jp/tokuhirom/20100903/1283466812</link>
      <description>
		
			http://blog.livedoor.jp/dankogai/archives/51512419.html
			Perl5.10 なら state がつかえるから、以下のように書けるのではないか。

#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
use Test::More;

sub flipflop {
    state $p = !shift;
    $p = !$p
}

ok !flipflop();
ok flipflop();
ok !flipflop();
ok flipflop();

done_testing;


		
</description>
      <dc:date>2010-09-03T07:33:32+09:00</dc:date>
      <title>Re: Algorithm - 0と1を次々と返す簡単なお仕事</title>
      <pubDate>Fri, 03 Sep 2010 07:33:32 +0900</pubDate>
      <content:encoded>
		&lt;div class="section"&gt;
			&lt;p&gt;&lt;a href="http://blog.livedoor.jp/dankogai/archives/51512419.html" target="_blank"&gt;http://blog.livedoor.jp/dankogai/archives/51512419.html&lt;/a&gt;&lt;/p&gt;
			&lt;p&gt;Perl5.10 なら state がつかえるから、以下のように書けるのではないか。&lt;/p&gt;
&lt;pre&gt;
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
use Test::More;

sub flipflop {
    state $p = !shift;
    $p = !$p
}

ok !flipflop();
ok flipflop();
ok !flipflop();
ok flipflop();

done_testing;
&lt;/pre&gt;

		&lt;/div&gt;
</content:encoded>
      <dcterms:modified>2010-09-03T07:33:32+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:sehbaer,2006:http://d.hatena.ne.jp/tokuhirom/20100903/1283466812</guid>
    </item>
    <item>
      <author>nobody@example.com</author>
      <dc:creator>nobody@example.com</dc:creator>
      <link>http://feedproxy.google.com/~r/hidek/~3/8b8meSYeCI8/hidek-age_40.php</link>
      <description>赤外線通信って本当に危険ですね。
こんばんは。

2010年9月2日をもってわたくし、とうとう40歳を迎えました。

昨日は&lt;a href="http://twitter.com/myfinder"&gt;myfinder&lt;/a&gt;さん幹事のもと、ダブル成人式と題して30人を超える人に祝って頂きました。たくさんのプレゼントと暖かいお祝いの言葉を頂いて本当に感激でした。


&lt;a href="http://hidek.ficia.com/pl/album-photo/A349BD40-B6AA-11DF-9732-6FCD6E373816/gpShX6q23xGKDe5ar-Uyjg" target="_blank"&gt;&lt;img src="http://hidek.pst.ficia.com/m/gpShX6q23xGKDe5ar-Uyjg.jpg" title="hidek Ficia Photo" alt="hidek Ficia Photo" width="375" \ /&gt;&lt;/a&gt;


中でも&lt;a href="http://twitter.com/__gfx__"&gt;gfx&lt;/a&gt;さん、&lt;a href="http://twitter.com/hirose31"&gt;hirose31&lt;/a&gt;さん、&lt;a href="http://twitter.com/moriyoshi"&gt;moriyoshi&lt;/a&gt;さんという豪華すぎる面々によるLT大会までしていただいて感謝感謝です。というかあれは一おっさんの誕生日だけでやるにはもったいないクオリティだと思います。本当にありがとうございました。


&lt;a href="http://hidek.ficia.com/pl/album-photo/A349BD40-B6AA-11DF-9732-6FCD6E373816/PgJxV6q23xGNqe5ar-Uyjg" target="_blank"&gt;&lt;img src="http://hidek.pst.ficia.com/m/PgJxV6q23xGNqe5ar-Uyjg.jpg" title="hidek Ficia Photo" alt="hidek Ficia Photo" width="375" /&gt;&lt;/a&gt;


あんな大勢の方々に笑顔で祝って頂ける自分は本当に幸せだと思います。
本当にありがとうございます。
40歳と言えば不惑ということでこれからも惑わずに楽しく過ごせたらと思います。
今後ともよろしくお願い申し上げます！


&lt;a href="http://fujiwara.ficia.com/pl/album-photo/0668D4C8-B62A-11DF-AEE5-EE5AAFE5328E/hEg8Zf-13xGUb-5ar-Uyjg" target="_blank"&gt;&lt;img src="http://fujiwara.pst.ficia.com/m/hEg8Zf-13xGUb-5ar-Uyjg.jpg" title=" Ficia Photo" alt=" Ficia Photo" width="375" /&gt;&lt;/a&gt;


そういえば、出社したらガリガリ君40本とコーラ40本いう粋なプレゼントも待っていました。


&lt;a href="http://www.flickr.com/photos/hidek/4951649820/" title="P1000476.jpg by hidek, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4129/4951649820_7af70be7bc.jpg" width="375" height="500" alt="P1000476.jpg" /&gt;&lt;/a&gt;


では、頂いた篠田麻里子の写真集を読みながら40代最初の睡眠に就こうと思います。
おやすみなさい。


&lt;a href="http://hidek.ficia.com/pl/album-photo/A349BD40-B6AA-11DF-9732-6FCD6E373816/dEieJKy23xGnFm_Nbjc4Fg" target="_blank"&gt;&lt;img src="http://hidek.pst.ficia.com/m/dEieJKy23xGnFm_Nbjc4Fg.jpg" title="hidek Ficia Photo" alt="hidek Ficia Photo" width="375" /&gt;&lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/hidek?a=8b8meSYeCI8:8bnMOvGYCGM:s9VDnicYSUo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/hidek?i=8b8meSYeCI8:8bnMOvGYCGM:s9VDnicYSUo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/hidek?a=8b8meSYeCI8:8bnMOvGYCGM:spdCosxkSQE"&gt;&lt;img src="http://feeds.feedburner.com/~ff/hidek?d=spdCosxkSQE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/hidek?a=8b8meSYeCI8:8bnMOvGYCGM:OAQBO0PjnPA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/hidek?d=OAQBO0PjnPA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <dc:date>2010-09-03T00:03:19+09:00</dc:date>
      <title>$hidek-&gt;{age}++; #40</title>
      <pubDate>Fri, 03 Sep 2010 00:03:19 +0900</pubDate>
      <content:encoded>赤外線通信って本当に危険ですね。
こんばんは。

2010年9月2日をもってわたくし、とうとう40歳を迎えました。

昨日は&lt;a href="http://twitter.com/myfinder"&gt;myfinder&lt;/a&gt;さん幹事のもと、ダブル成人式と題して30人を超える人に祝って頂きました。たくさんのプレゼントと暖かいお祝いの言葉を頂いて本当に感激でした。


&lt;a href="http://hidek.ficia.com/pl/album-photo/A349BD40-B6AA-11DF-9732-6FCD6E373816/gpShX6q23xGKDe5ar-Uyjg" target="_blank"&gt;&lt;img src="http://hidek.pst.ficia.com/m/gpShX6q23xGKDe5ar-Uyjg.jpg" title="hidek Ficia Photo" alt="hidek Ficia Photo" width="375" \ /&gt;&lt;/a&gt;


中でも&lt;a href="http://twitter.com/__gfx__"&gt;gfx&lt;/a&gt;さん、&lt;a href="http://twitter.com/hirose31"&gt;hirose31&lt;/a&gt;さん、&lt;a href="http://twitter.com/moriyoshi"&gt;moriyoshi&lt;/a&gt;さんという豪華すぎる面々によるLT大会までしていただいて感謝感謝です。というかあれは一おっさんの誕生日だけでやるにはもったいないクオリティだと思います。本当にありがとうございました。


&lt;a href="http://hidek.ficia.com/pl/album-photo/A349BD40-B6AA-11DF-9732-6FCD6E373816/PgJxV6q23xGNqe5ar-Uyjg" target="_blank"&gt;&lt;img src="http://hidek.pst.ficia.com/m/PgJxV6q23xGNqe5ar-Uyjg.jpg" title="hidek Ficia Photo" alt="hidek Ficia Photo" width="375" /&gt;&lt;/a&gt;


あんな大勢の方々に笑顔で祝って頂ける自分は本当に幸せだと思います。
本当にありがとうございます。
40歳と言えば不惑ということでこれからも惑わずに楽しく過ごせたらと思います。
今後ともよろしくお願い申し上げます！


&lt;a href="http://fujiwara.ficia.com/pl/album-photo/0668D4C8-B62A-11DF-AEE5-EE5AAFE5328E/hEg8Zf-13xGUb-5ar-Uyjg" target="_blank"&gt;&lt;img src="http://fujiwara.pst.ficia.com/m/hEg8Zf-13xGUb-5ar-Uyjg.jpg" title=" Ficia Photo" alt=" Ficia Photo" width="375" /&gt;&lt;/a&gt;


そういえば、出社したらガリガリ君40本とコーラ40本いう粋なプレゼントも待っていました。


&lt;a href="http://www.flickr.com/photos/hidek/4951649820/" title="P1000476.jpg by hidek, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4129/4951649820_7af70be7bc.jpg" width="375" height="500" alt="P1000476.jpg" /&gt;&lt;/a&gt;


では、頂いた篠田麻里子の写真集を読みながら40代最初の睡眠に就こうと思います。
おやすみなさい。


&lt;a href="http://hidek.ficia.com/pl/album-photo/A349BD40-B6AA-11DF-9732-6FCD6E373816/dEieJKy23xGnFm_Nbjc4Fg" target="_blank"&gt;&lt;img src="http://hidek.pst.ficia.com/m/dEieJKy23xGnFm_Nbjc4Fg.jpg" title="hidek Ficia Photo" alt="hidek Ficia Photo" width="375" /&gt;&lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/hidek?a=8b8meSYeCI8:8bnMOvGYCGM:s9VDnicYSUo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/hidek?i=8b8meSYeCI8:8bnMOvGYCGM:s9VDnicYSUo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/hidek?a=8b8meSYeCI8:8bnMOvGYCGM:spdCosxkSQE"&gt;&lt;img src="http://feeds.feedburner.com/~ff/hidek?d=spdCosxkSQE" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/hidek?a=8b8meSYeCI8:8bnMOvGYCGM:OAQBO0PjnPA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/hidek?d=OAQBO0PjnPA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</content:encoded>
      <dcterms:modified>2010-09-03T00:03:19+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:sehbaer,2006:http://blog.hide-k.net/archives/2010/09/hidek-age_40.php</guid>
    </item>
    <item>
      <author>nobody@example.com (Kawanet Tech Blog)</author>
      <dc:creator>nobody@example.com (Kawanet Tech Blog)</dc:creator>
      <category>ARRAY(0x9846c38)</category>
      <link>http://feedproxy.google.com/~r/at/webry/info/~3/mdjfJVviD6c/article_2.html</link>
      <description>川崎がリクルートの メディアテクノロジーラボ が執筆した書籍『ソーシャルストリーム・ビジネスTwitter、Facebook、iPhone時代の消費者を巻き込むビジネスの新ルール』の増刷が決定しました！8888!

</description>
      <dc:date>2010-09-01T03:17:00+09:00</dc:date>
      <dc:subject>ARRAY(0x983d818)</dc:subject>
      <title>祝！共著『ソーシャルストリーム・ビジネス』重版決定♪　好評発売中！ </title>
      <pubDate>Wed, 01 Sep 2010 03:17:00 +0900</pubDate>
      <content:encoded>川崎がリクルートの メディアテクノロジーラボ が執筆した書籍『ソーシャルストリーム・ビジネスTwitter、Facebook、iPhone時代の消費者を巻き込むビジネスの新ルール』の増刷が決定しました！8888!
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hASzcihJe289fwuFbfb2w4hEhOM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hASzcihJe289fwuFbfb2w4hEhOM/0/di"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hASzcihJe289fwuFbfb2w4hEhOM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hASzcihJe289fwuFbfb2w4hEhOM/1/di"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/at/webry/info/~4/mdjfJVviD6c"&gt;</content:encoded>
      <dcterms:modified>2010-09-01T03:17:00+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:sehbaer,2006:http://feedproxy.google.com/~r/at/webry/info/~3/mdjfJVviD6c/article_2.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Kawanet Tech Blog)</author>
      <dc:creator>nobody@example.com (Kawanet Tech Blog)</dc:creator>
      <category>ARRAY(0x9841ff8)</category>
      <link>http://feedproxy.google.com/~r/at/webry/info/~3/N9H9B-BBwSg/article_1.html</link>
      <description>ウェブリブログに、はてなスター を貼ってみた手順メモ。はてなスターは、最近話題の『いいね！』『Like！』みたいなレイティング・投票機能の一種です。はてなダイヤリーに限らず、他のサイトにも 簡単な JavaScript だけで手軽に★機能を追加できます。

</description>
      <dc:date>2010-09-01T01:19:00+09:00</dc:date>
      <dc:subject>ARRAY(0x9841f98)</dc:subject>
      <title>ウェブリブログに、はてなスターを貼る手順</title>
      <pubDate>Wed, 01 Sep 2010 01:19:00 +0900</pubDate>
      <content:encoded>ウェブリブログに、はてなスター を貼ってみた手順メモ。はてなスターは、最近話題の『いいね！』『Like！』みたいなレイティング・投票機能の一種です。はてなダイヤリーに限らず、他のサイトにも 簡単な JavaScript だけで手軽に★機能を追加できます。
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ceTAXJe9Ye-o9Pp78hx3AZ7lMJc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ceTAXJe9Ye-o9Pp78hx3AZ7lMJc/0/di"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ceTAXJe9Ye-o9Pp78hx3AZ7lMJc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ceTAXJe9Ye-o9Pp78hx3AZ7lMJc/1/di"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/at/webry/info/~4/N9H9B-BBwSg"&gt;</content:encoded>
      <dcterms:modified>2010-09-01T01:19:00+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:sehbaer,2006:http://feedproxy.google.com/~r/at/webry/info/~3/N9H9B-BBwSg/article_1.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Kawanet Tech Blog)</author>
      <dc:creator>nobody@example.com (Kawanet Tech Blog)</dc:creator>
      <category>ARRAY(0x983d428)</category>
      <link>http://feedproxy.google.com/~r/at/webry/info/~3/PlCLrJb737s/article_8.html</link>
      <description>TechCrunch でも使われている DISQUS COMMETNS が便利です。JavaScript のコードを貼るだけで、自分のブログやウェブサイトにコメント欄を追加できます。コメントを投稿する人は、Twitter アカウントで認証できるのでラク。（OpenIDも可）投稿されたコメントは、そのまま Twitter で流れる。Twitter 上でその URL について言及された他のツイートも、コメントとして表示してくれる。Twitter のリアルタイム検索ではツイー...

</description>
      <dc:date>2010-08-28T19:41:00+09:00</dc:date>
      <dc:subject>ARRAY(0x983d3d8)</dc:subject>
      <title>DISQUS CommentsのTwitterコメント投稿・表示欄を掲載する手順</title>
      <pubDate>Sat, 28 Aug 2010 19:41:00 +0900</pubDate>
      <content:encoded>TechCrunch でも使われている DISQUS COMMETNS が便利です。JavaScript のコードを貼るだけで、自分のブログやウェブサイトにコメント欄を追加できます。コメントを投稿する人は、Twitter アカウントで認証できるのでラク。（OpenIDも可）投稿されたコメントは、そのまま Twitter で流れる。Twitter 上でその URL について言及された他のツイートも、コメントとして表示してくれる。Twitter のリアルタイム検索ではツイー...
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yZagGx5E8I0LjYsktwcX_5aOnjA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yZagGx5E8I0LjYsktwcX_5aOnjA/0/di"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yZagGx5E8I0LjYsktwcX_5aOnjA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yZagGx5E8I0LjYsktwcX_5aOnjA/1/di"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/at/webry/info/~4/PlCLrJb737s"&gt;</content:encoded>
      <dcterms:modified>2010-08-28T19:41:00+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:sehbaer,2006:http://feedproxy.google.com/~r/at/webry/info/~3/PlCLrJb737s/article_8.html</guid>
    </item>
    <item>
      <author>nobody@example.com (Kawanet Tech Blog)</author>
      <dc:creator>nobody@example.com (Kawanet Tech Blog)</dc:creator>
      <category>ARRAY(0x983d258)</category>
      <link>http://feedproxy.google.com/~r/at/webry/info/~3/XqTc27IInzM/article_7.html</link>
      <description>トラックバックは死んだ と言われて久しいですが、ウェブリブログは「ブログ」サービスなので、今もトラックバック機能が付いています。表示エリアも結構大きい。ときどきは便利なんですが、最近は滅多に使われないので、『トラックバック　（0件）』の表示エリアをまるごと削除してしまうスクリプトを書いてみました。ウェブリブログの表示が少しスッキリします。

</description>
      <dc:date>2010-08-28T18:49:00+09:00</dc:date>
      <dc:subject>ARRAY(0x983d248)</dc:subject>
      <title>ウェブリブログでトラックバックの表示を削除するスクリプト</title>
      <pubDate>Sat, 28 Aug 2010 18:49:00 +0900</pubDate>
      <content:encoded>トラックバックは死んだ と言われて久しいですが、ウェブリブログは「ブログ」サービスなので、今もトラックバック機能が付いています。表示エリアも結構大きい。ときどきは便利なんですが、最近は滅多に使われないので、『トラックバック　（0件）』の表示エリアをまるごと削除してしまうスクリプトを書いてみました。ウェブリブログの表示が少しスッキリします。
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XecDfyI1v8abog9oStIYjr95asQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XecDfyI1v8abog9oStIYjr95asQ/0/di"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XecDfyI1v8abog9oStIYjr95asQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XecDfyI1v8abog9oStIYjr95asQ/1/di"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/at/webry/info/~4/XqTc27IInzM"&gt;</content:encoded>
      <dcterms:modified>2010-08-28T18:49:00+09:00</dcterms:modified>
      <guid isPermaLink="false">tag:sehbaer,2006:http://feedproxy.google.com/~r/at/webry/info/~3/XqTc27IInzM/article_7.html</guid>
    </item>
  </channel>
</rss>
