ラベル Perl の投稿を表示しています。 すべての投稿を表示
ラベル Perl の投稿を表示しています。 すべての投稿を表示

2009年6月29日月曜日

[Perl] CPXXXANプロジェクト

CPXXXANは古いバージョンのPerlでも動くCPANモジュールのリストを作ってダウンロードできるようにするという発展途上のプロジェクトである。

Perlはこの数年でバージョン5.6、5.8、5.10と進化してきたが、未だに5.10より前の古いバージョンを使い続けている人もいる。しかし、5.6のユーザーが普通にCPANに行ってDBIモジュールをダウンロードしても動かない。最新のDBIは5.6に対応していないからだ。CPXXXANはこの問題を解決するべく開発されている。

CPXXXANという独立したソフトウェアがあるというよりは、Perlのバージョンごとに用意されたURLを通してCPANにアクセスするという言い方が近い。

さて、CPXXXXANを試してみよう。

試す前に環境のテスト

普通にCPANシェルを起動して最新のDBIを取得してみる。

% cpan

cpan shell -- CPAN exploration and modules installation (v1.94)
ReadLine support enabled

cpan[1]> get DBI
...
DBI-1.609/
DBI-1.609/Changes
DBI-1.609/dbd_xsh.h
...

最新版の1.609がダウンロードされる。

CPXXXANの設定

たとえばPerl 5.6.2を使っている場合、CPANのターゲットURLをhttp://cp5.6.2an.barnyard.co.uk/に設定する。

cpan[2]> o conf urllist http://cp5.6.2an.barnyard.co.uk/                     
Please use 'o conf commit' to make the config permanent!

cpan[3]>

ここで「o conf commit」とすると設定ファイルが上書きされるが、今は試して遊んでいるだけなので上書きはしない。

CPXXXANからダウンロード

上でCPANのURLを設定した後、

cpan[3]> reload index
...
Fetching with LWP:
http://cp5.6.2an.barnyard.co.uk/authors/01mailrc.txt.gz
...

としてPerl 5.6用に作られたインデックスファイルを取得する。

さてDBIをもう一度ダウンロードしてみよう。

cpan[4]> get DBI
Running get for module 'DBI'
...
DBI-1.604/
DBI-1.604/Changes
DBI-1.604/dbd_xsh.h
...

と、1.604がダウンロードされた。これが5.6.2で動作するDBIの最新バージョンである。

まとめ

さまざまなしがらみで古いバージョンのPerlを使わざるを得ない人は多い。「古いPerlはサポートしません」というのはモジュール作者の自由だが、このようなやり方で古いPerlのユーザーを救済するやりかたは美しい。正式公開が待たれる。

ちなみにこのプロジェクトの存在はPerl Seminar NYで教えてもらった。

2008年5月8日木曜日

そろそろShibuya.pmについて一言いっておくか

技術コミュニティってのが嫌いでした。最近はまともな人が多いのかもしれないけれど、10年前などはそれはもうひどいもの。メーリングリストが主なコミュニケーションの手段だった時代で、そこにあるのはくだらない喧嘩と、知識をひけらかす上級者、内輪受けのシグネチャ。私はメーリングリストは読まずに自分のディスクにためておいて、必要なときだけgrepで検索する日々でした。Perlもラクダ本で独習して人並み以上(たぶん)にはできるようになり、もう学ぶことはないものと思っていました。Perlをはじめとする技術文書や本を翻訳するアルバイトをしていたのもこのころです。

時は流れて5年前、Shibuya.pmことShibuya Perl Mongersができました。それもテクニカルトークをするとのこと。技術コミュニティのオフラインミーティング。メーリングリストと同じ雰囲気ならあまり行きたくないなあ、と思い実際に最初の集まりには行かずにおきました。そういう私がなぜ第2回の集まりに行くことにしたかといえば開催地の近所で飲み会だったかの用事が偶然あったからで、ただの気まぐれです。

ところがテクニカルトークに出席してみて驚きました。そこでは本に出ていない技術(Inline系のモジュールでした)、それも今すぐにでも使える技術が紹介されていました。本には枯れた技術しか出ていないのが普通ですし、日々進化を遂げるこの世界、既存のウェブサイトにすら出ていないことがたくさんあっても当然のことなので、驚く方がおかしいと言われればその通りですが、とりあえずびっくりしたのを今でも覚えています。さらにPerlを使ってネットサービスを行っている会社の紹介もあり、「企業系の開発はJavaかC++」だと思っていた私には新鮮な刺激でした。ちなみに私、このころはPerlよりはC言語が得意でした。

質疑応答にも感銘を受けました。「それ、○○でもできるんじゃないですか」(おお、TMTOWTDIだ)、「それは計算量が多くなると思うんですが大丈夫ですか」(ギークのくせに態度が横柄じゃないぞ)、「そこの13行めの正規表現ですけど」(あんな小さいの見えるのか)。

◇ ◇ ◇

さらに時はたち、私はNYに住むようになりました。NYにもPerlの集まりがあるため、主催者に連絡をして出席してみました。飲み会だけのNY.pm、真面目なPerl Seminar NY。参加する前は敷居が高く感じたものの、Perlの集まりはShibuya.pmで経験済みだったので気持ちは楽でした。

右も左もわからないニューヨークという土地に私の所属するグループができ、さらにその場に何年も前からいたかのように周囲が接してくれたことで、Perlの会合が新生活の心の支えになったのは言うまでもありません。日本のShibuya.pmから来ました、と言ったら「日本にもPerl Mongersがあるのか」という反応がよくありましたが。

NYでPerlの集まりに参加して面白かったのは、やっぱりここでもTMTOWTDIだったことです。「Maybe you can do it in that way?」みたいな。

日本にいたときはShibuya.pmでもYAPC::Asiaでも発表をすることはありませんでしたが、米国に引っ越して以来YAPC::NAをはじめ米国のあちこちで発表をすることとなりました。初参加のYAPC::NAなどで臆せずに数百人を相手にでき、どの発表も好評を博したのはShibuya.pmで学んだことの積み重ねがあったからです。

◇ ◇ ◇

Perlはコミュニティがすばらしい、ということがよく言われます。そうはいってもコミュニティに参加したことのない、参加する機会のない人にそういう言葉を繰り返しても説得力がないだけ。「コミュニティ? うさんくせえ」と思っていた私にPerlコミュニティがいかにすばらしいかを教えてくれたShibuya.pmは最高の存在です。Shibuya.pmなしにはいまの私はありえない、といっても過言ではありません。

そして、特筆すべきはShibuya.pmがまだ活動を続け、さらに拡大していること。主催イベントのYAPC::Asiaにいたっては参加者が500人を超え、アメリカのYAPCから比べれば冗談としか思えない数字です。

今年のYAPC::Asiaには行きたかったのですが、やむを得ない事情で参加できません。会場の雰囲気を感じにIRCくらいは見に行きますのでそのときはよろしくお願いいたします。

末筆ながら、Shibuya.pmの運営者のみなさま、テクニカルトークの発表者の方々にお礼を申し上げます。

2008年4月19日土曜日

Filter::SQLが使いやすくてしかたがない

Filter::SQL 作った - id:kazuhookuのメモ置き場にある、Filter::SQLが使いやすくて仕方がないという話。

前にも書いたけれど私はPerlのデータベースプログラミングに苦手意識がある。SQLもPerlも人並みにはできるけれど、その両方がまざったのはどうもだめだ。

だいたい、こちらはSELECTだけをすればいいのに

use 5.010;
use DBI;

my $dbh = DBI->connect("dbi:SQLite:dbname=foo.db");
my $sth = $dbh->prepare("SELECT * FROM table WHERE bar > 1");
$sth->execute;
while ( my $row = $sth->fetch ) {
say join "\t", @$row;
}

のような呪文を書かなくてはならないのは苦痛だ。connectはわかるけれどprepareやexecuteは人間のするべき仕事とは思えない。何よりもSQL文と出力を表示するところが離れているのが嫌だ。

SQLを書かずに全部Perlですませればいいかというと、必ずしもそうでもない。SQLを書かないようにするとSQL::Abstractを使ったりして

my ( $stmt, @bind ) = $sql->select( 'table', '*', { bar => { '>', 1 } } );

となるが、これも私の頭のキャパシティを超える。

PerlはPerl、SQLはSQLがそこそこ分離され「見た目にわかりやすい」ものをずっと探し求めていた。そこにFilter::SQLというモジュールの登場である。先の例はこう書き替えられる。

use 5.010;
use DBI;
use Filter::SQL;

Filter::SQL->dbh(DBI->connect("dbi:SQLite:dbname=foo.db"));
for my $row (SELECT * FROM table WHERE bar > 1;) {
say join "\t", @$row;
}

これです、私の長年求めていたものは。SELECTがそのまま書けて、さらにそのまま配列が返る。書きやすくて仕方がないし読むのもわかりやすい。SELECT文のまわりに引用符がいらないのも良い。SELECTの最後のセミコロンは一つのおまじないだけれど、prepareしてexecuteしてfetchするよりずっといい。DBIx::Simpleよりもさらにシンプルだ。

ソースを見てみるとFilter::Simpleを使った小さいモジュール。明快に書いてあってこんなことなら自分で書けばよかった、と思ったがそれを人はコロンブスの卵と呼ぶ。

追記(4月20日)

はてなブックマークでmiyagawaさんいわく

prepare,execute,fetchを一気にやるなら素のDBIでも selectall_hashref とか

コメントありがとうございます。どっちかというとselectall_araryrefのほうが近くて(Filter::SQLの内部で使われています)、上のスクリプトは

my $dbh = DBI->connect("dbi:SQLite:dbname=foo.db");
for my $row ( @{ $dbh->selectall_arrayref("SELECT * from table WHERE bar > 1") } ) {
say join "\t", @$row;
}

と書きかえられます。

SQL::Filterのほうが明らかにインターフェイスが優れていますが(私の好みの問題でもあります)、企業などでモジュールをインストールできないといった方はDBIそのままでもそれほど悪くない、ということだと思います。

SELECTするためにDBIを素で使うことがほとんどないのでselectall_arrayrefなんて忘れてました……ごめんなさい:)

2008年2月24日日曜日

Perlで順列組合せの問題を解く

(1) 青・赤・黄・緑の4色のボールがあります。これを順番に並べる方法はいくつありますか?

(2) この中から2色選んで順番に並べる方法はいくつありますか?

(3) この中から2色選んで順番を考えずに組合せを作る方法はいくつありますか?

こういう問題を学生の頃やらされました。nCrなどを見るとイライラするという方も多いでしょう。

最近こういう問題を解くはめになり、Perlでプログラムを書き計算する方法を調べてみました。もちろん数学の公式をネットで調べて当てはめてもいいのですが、既存のモジュールを使わない手はありません。

Math::Countingを使う

Math::Countingがこういうときはぴったり。

#!/usr/bin/env perl

use strict;
use warnings;
use Math::Counting;

# (1) 4色のボールを順番に並べる(4P4

print P(4, 4);
print "\n";

# (2) 4色から2色選んで順番に並べる(4P2

print P(4, 2);
print "\n";

# (3) 4色から2色選ぶ組合せ(4C2

print C(4, 2);
print "\n";

出力は(1)は24、(2)は12、(3)は6となります。

ただ、答えだけを見せられても、私などは結果が本当かどうか不安になります。そこで、確認のために別のモジュールの登場です。

Math::Combinatoricsを使う

Math::Combinatoricsは実際の順列組合せを表示することができます。

#!/usr/bin/env perl

use strict;
use warnings;
use Math::Combinatorics;
use utf8;
binmode(STDOUT, ":utf8");

my @balls = qw(青 赤 黄 緑);

print "(1) 4色のボールを順番に並べる\n";
print join("\n", map { join " ", @$_ } permute(@balls));
print "\n";

print "(2) 4色から2色選んで順番に並べる\n";
print join("\n", map { join " ", @$_ } (map { permute (@$_) } combine(2, @balls)));
print "\n";

print "(3) 4色から2色選ぶ組合せ\n";
print join("\n", map { join " ", @$_ } combine(2, @balls));
print "\n";

これを実行すると出力はこうなります。

(1) 4色のボールを順番に並べる
青 赤 黄 緑
青 赤 緑 黄
青 黄 赤 緑
青 黄 緑 赤
青 緑 赤 黄
青 緑 黄 赤
赤 青 黄 緑
赤 青 緑 黄
赤 黄 青 緑
赤 黄 緑 青
赤 緑 青 黄
赤 緑 黄 青
黄 青 赤 緑
黄 青 緑 赤
黄 赤 青 緑
黄 赤 緑 青
黄 緑 青 赤
黄 緑 赤 青
緑 青 赤 黄
緑 青 黄 赤
緑 赤 青 黄
緑 赤 黄 青
緑 黄 青 赤
緑 黄 赤 青
(2) 4色から2色選んで順番に並べる
青 赤
赤 青
青 黄
黄 青
緑 青
青 緑
赤 黄
黄 赤
緑 赤
赤 緑
黄 緑
緑 黄
(3) 4色から2色選ぶ組合せ
青 赤
青 黄
青 緑
赤 黄
赤 緑
黄 緑

ちゃんと(1)が24通り、(2)が12通り、(3)が6通りということがわかります。(2)の場合のインターフェイスがよくないですが、一から自分でやることをかんがえればずっと良いというものです。

2008年2月10日日曜日

Perlサーベイを読み解く

以前のエントリで書いたが、Perl Survey 2007というアンケートの結果が公開されている。年齢、プログラミング年数、Perlコミュニティへのかかわり、年収など考えられるすべての情報を網羅した貴重な情報だ。

生データを見ているだけでは何もわからないので、各要素の類似度(相関係数)を計算してグラフにしてみた。相関係数は数種類定義があるが、ここではスピアマンの順位相関係数を使った(細かいことは一番下に書いた)。

年齢と相関が高い要素トップ10

年齢の高いPerlプログラマは

  • プログラミング歴が長く(1位)、Perlプログラミング歴もそこそこ長く(6位)
  • Perlの開発に参加していることが多く(2位、3位)
  • 地元以外でのPerlモンガーズやPerlカンファレンスにこの1年間に参加したことがある(5位、8位)
  • という傾向が読み取れる。

地元の集まりに参加したことがあるかどうかはランク外。つまり、PerlモンガーズとPerlカンファレンスに参加したことがあるかどうか、は年齢とあまり関係ないものの、年齢が高い人ほど地元以外の集まりに出かけていることが多い。

Perlプログラミング歴と相関の高い要素トップ10

年齢のグラフより全体的に相関係数が高めである。Perlプログラミング歴の長い人は

  • Perl以外も含めたプログラミング歴が長く(1位)
  • Perlの開発に参加し(2位、3位)
  • Perlモンガーズやカンファレンスに参加し(5位、6位、7位)
  • CPANのモジュールを開発し(10位)
  • 男である可能性が高い(4位)

プログラミングに占めるPerlの量と相関の高い要素トップ10

一見Perlプログラミング歴と似た結果だが、Perlプログラミング歴で1位だった「Perl以外も含めたプログラミング歴」はランク外に落ちた(相関係数0.1以下)。つまり、プログラミング歴とPerlの使用率は何の関係もない。

年収と相関の高い要素トップ10

年収の高い人は、

  • Perlの開発に参加しており(1位、2位)
  • 地元以外のPerlモンガーズに参加していて(4位、5位)
  • カンファレンスで発表し(6位)
  • 男性であることが多い(3位)

年齢の相関係数0.35はそれほど高くない。すなわち年収と年齢はそれほど強い相関関係にないことに注目したい。言い換えるとPerlプログラマの年収は年功序列とはいえない。

注釈

  • 普通の相関係数(ピアソンの積率相関係数)ではなく、スピアマンの順位相関係数を使ったのはバラバラな指標(Perlの開発に参加しているか:yesとnoの2値、プログラミング歴:正規分布からほど遠い整数、CPANモジュール数:大多数が0)をまとめて扱いたかったからであるが、もっといい方法があるかもしれない。
  • コンピュータネットワークの発達していない地域で傾向が違うのは避けられないため、一人当たりのGDPが上位25か国(Wikipedia参照)の在住者のみを対象にした。ルクセンブルク(lu)、アイルランド(ie)、ノルウェー(no)、米国(us)、アイスランド(is)、スイス(ch)、オランダ(nl)、デンマーク(dk)、カタール(qa)、オーストリア(at)、フィンランド(fi)、カナダ(ca)、英国(uk)、ベルギー(be)、スウェーデン(se)、UAE(ae)、シンガポール(sg)、オーストラリア(au)、ギリシア(gr)、日本(jp)、フランス(fr)、イスラエル(il)、ドイツ(de)、イタリア(it)、中国(cn)。
  • 1985年以降に生まれた人は統計から除外した。
  • 年収(任意回答)を答えなかった人は統計から除外した。
  • 以上の結果、統計の対象になったデータは2368個。

リンク

Greg氏のHacking with Greg: Charlie Brown Plays With Stats。私がこの企画を温めていたら、先に似たことをされてしまった。yesとnoで答える項目だけの集計だが、これはこれで面白い。

So with the improvements in my mind I managed to adjust it in just a few minutes. And the results where astonishing!....-ly boring. Here's the top 5...

If 'Posted to Perl Mongers list ' Then 'Subscribed to Perl Mongers list ' (With 0.995 probability)
If 'Posted to other list ' Then 'Subscribed to other list ' (With 0.990 probability)
If 'Attended conference (non-local) ' Then 'Attended conference ' (With 0.970 probability)
If 'Attended Perl Mongers (non-local)' Then 'Attended Perl Mongers ' (With 0.965 probability)
If 'Contributed to Perl 5 ' Then 'Subscribed to other list ' (With 0.882 probability)

(拙訳)

これはすごい……つまらない。項目ごとの類似度を出して、そのベスト5を出したものは
「Perlモンガーズのメーリングリストに投稿したことのある人」は99.5%の確率で「Perlモンガーズのメーリングリストに入っている」
「その他の(Perlモンガーズ以外の)メーリングリストに投稿したことのある人」は99.0%の確率で「その他のメーリングリストに入っている」
「地元以外のPerlカンファレンスに参加したことのある人」は97.0%の確率で「Perlカンファレンスに参加したことがある」
「地元以外のPerlカンファレンスに参加したことのある人」は96.5%の確率で「Perlモンガーズの会合に参加したことがある」
「Perl5の開発に参加したことがある人」は88.2%の確率で「Perlモンガーズ以外のメーリングリストに入っている」

謝辞

スピアマンの順位相関係数を求めるスクリプトはSpearman's rho test download pageからいただいた。

その他

  • 統計は素人のため、ご提案、間違いのご指摘など歓迎します。
  • グラフが英語なのはGoogle Chart APIで漢字が使えないという制限のためです。
  • 相関がどれだけ有意かというのはまた別の問題です。参考程度にご覧ください。

統計の対象にした全項目

項目名解説
整数Year of birth生まれた年。ここでは年齢と同じこと
3値Sex性別。ここでは「男」が1、「女」が0、「その他」を0.5として計算した
範囲Income年収
整数Years programming PerlPerlプログラミング歴(年数)
整数Years programming (total)Perl以外も含めたプログラミング歴(年数)
Proportion of Perlこの1年に書いたプログラム、Perlは何%?
2値Subscribed to Perl Mongers listPerlモンガーズのメーリングリストに入っている
2値Posted to Perl Mongers listこの1年にPerlモンガーズのメーリングリストに投稿した
2値Subscribed to other listその他Perl関連のメーリングリストに入っている
2値Posted to other listこの1年にその他Perl関連のメーリングリストに投稿した
2値Perlmonksこの1年にPerlmonksに投稿した
2値Contributed to websitesこの1年にその他Perlのサイトに投稿した(フォーラム、Wiki、ブログ)
2値Attended Perl Mongersこの1年にPerl Mongersのミーティングに出席した
2値Attended Perl Mongers (non-local)この1年に地元以外でPerl Mongersのミーティングに出席した(地元以外:1000km以上)
2値Attended conferenceこの1年にPerlのカンファレンスに出席した
2値Attended conference (non-local)この1年に地元以外でPerlのカンファレンスに出席した
2値Presented at conferenceこの1年にPerlのカンファレンスやミーティングで発表した
2値Contributed to CPANモジュールを発表するなどCPANに貢献したことがある
2値Contributed to Perl 5Perl5に貢献したことがある
2値Contributed to Perl 6Perl6に貢献したことがある
2値Contributed to other projectsオープンソースソフトウェア(OSS)などにPerlで貢献したことがある
2値Led other projectsOSSなどのプロジェクトを開始した、もしくはリーダーをしたことがある
2値Provided feedbackPerl関係のバグレポートなどフィードバックを送ったことがある
整数CPAN modules maintainedCPANでメンテナンスを担当しているモジュール数

2007年11月27日火曜日

Perl Survey 2007

Charsbarさんが先にまとめておられるが、Perl Survey 2007というアンケートの結果が先日発表された。

結果は生データで配布されており、いろいろな人が分析結果を公開している。

Jason Porrittその1

「アンケートに答えたPerlプログラマの平均年収は米国平均で980万円。英国平均だと890万円。そのうちプログラミングの中でPerlを8割以上使うと答えた人に絞って年収を平均すると、米国で1000万円、英国で940万円」(Mint注:1ドルを116円20銭で換算。アンケート期間半ばの8月31日付のレート)。

微妙な差ともいえようが、米・英・豪・独・カナダの5か国すべてでPerlの使用率が高いほど収入が高いのは面白い。

Jason Porrittその2

「アメリカのPerlモンガーズグループメンバーの平均的な像は、36歳男、Perl歴9年、プログラミング歴18年」

日本のグループよりだいぶ平均年齢が高い。NY.pmを見る限り納得できる結果である。

「Perlモンガーズに所属している人はそれ以外の人に比べて8%収入が多い」

これは少し冗談っぽいトーンで語られているけれど、Perlモンガーズが都市部に多いからだろうか。同じような統計はまだできそうだ。だれかやらないかな。

Chris Lansdown

最初の図は年齢と収入の関係。年齢に応じて収入が上がるのは40歳くらいまでらしい。

次の図はプログラミング歴とPerlの使用率の相関を示した図。プログラミング歴が7年から10年あたりの層がPerlを使用してプログラミングを行うことが多いようだ。CGIブームでPerlを始めた人がPerlを使い続けているということなのかな。

アンケートの主催者はまた来年も行う予定だそうなので、来年こそは回答します(すみません忘れてました)。

2007年10月3日水曜日

Brian D. Fox

brian d foyはPerlの物書きとしてつとに知られている。さてこの人、最近Mastering Perlという本を出したのだが、日本のアマゾンではBrian D. Foxとして紹介されていた(画像参照)。
foyをfoxとtypoするのはありがちな話かもしれないが、最近のオンライン書店では出版社からデータのフィードが来てそれをそのまま載せているものだと思っていた。typoが発生するということは、アマゾンでは係のおじさんが表紙を見ながら著者名を打ち込んでいるのだろうか。


追記(10月21日)
Karenさんがアマゾンに連絡してくれて直ったらしい。ところでbrian氏も文句を言っているが、「はしがき」を書いたRandal Schwartzの名前が著者の前に書かれているのはなんだか妙である。

2007年4月26日木曜日

DBIx::SimpleとSQL::Abstract

前回のエントリでPerlからSQLを使うのって面倒、ということを書いたらさっそくmiyagawaさんから「つDBIx::Simple」というお返事が。これのperldocに書いてある通りSQL::Abstractを組み合わせたらSQLも書かなくてよくなって、かなり良さげ。

Inline::CはPerlの中でCを使う自由を与えてくれたけど、Perlの中でSQLを使わない自由もあっていいと思う。だってSQLなんてバッドノウハウのかたまりじゃない? 言いすぎ?

あとはPerlの正規表現でSELECTができるラッパーがあれば最強なんだけれど、ありませんかねえ(と書いたらまだ誰かが教えてくれるかも)。ちなみに、前回書いた/i、つまり大文字小文字を区別しないマッチはSQL::Abstractがこんなふうにやってくれる。たとえば、
$sql = SQL::Abstract->new(convert => 'upper');
%where = (keywords => 'MaKe iT CAse inSeNSItive');
はこうなる。
WHERE upper(keywords) like upper('MaKe iT CAse inSeNSItive')

普通のWHERE文はこんなふうに表現できる。
my %where = (
requestor => 'inna',
worker => ['nwiger', 'rcwe', 'sfz'],
status => { '!=', 'completed' }
);

慣れないブログを始めて1週間足らず。はてなブックマークやLivedoor Readerに登録してくださった方々、そして来訪してくださった皆様に感謝申し上げます。