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月22日金曜日

あなたがYAPC::Asiaでプレゼンテーションをするべき10の理由

YAPC::Asiaのプレゼン締切が近づいているそうです

応募の締切は2月25日の月曜日、あと2日です。応募しようかどうか迷っている人に向けて、背中を押すエントリを書いてみたいと思います。ちなみに私はアメリカのYAPC::NAでPerl業界(って何)にデビューしました。YAPC::Asiaの中の人に断りなく勝手に書いています。

1. YAPC::Asiaに行く目的が増える

YAPC::Asiaに行ってただ座っているのはつまらないものです。参加することに意義がある、と昔の人は言いました。人の講演を聞いて「楽しかった」「なんかすごかった」という感想を持って帰るのもいいですが、20分くらい立ってプレゼンテーションをしてみましょう。得るものが増えること間違いなしです。だいたい、ずっと座っているとエコノミー症候群になります。

2. 解決方法を一緒に考えてもらえる

「こういうものを開発しました」「こういう問題を解決しました」というのがプレゼンテーションのよくあるパターンですが、「ここがまだ未解決です」というスライドを一枚つけ加えましょう。知らない人が「こうやればいいんじゃない?」という提案をしにきてくれます。自分が知っていると思っていたことも、「それ○○でできるよ」と新しいことを教わったりもします。

3. 友達ができる

はっきり言って友達は増えます。カンファレンスのディナーなどに行っても「あなたのプレゼンテーション見ました、握手してください」みたいな人が近づいてきます。「サインしてください」と言われるかもしれないのでぜひサインは練習しておきたいものです。

4. 仕事のスカウトがくるかもしれない

別に転職を目指してプレゼンテーションをするわけではありませんが、「ウチの会社に興味はありませんか」というお誘いはカンファレンスの当日、そして後日、いろいろあります。私がYAPC::NAで発表したときは何を評価されたのか「○○万ドル出すからどうだ!」と極端な迫り方をされました。

5. 飲み会のお誘いがくるかもしれない。勉強会のお誘いもある。

「飲みに行きましょうよ。私のおごりで」と親切な人に誘ってもらえることがあります。真面目なほうでは、「今度こういう勉強会をやるのでしゃべってもらえませんか」と言われたりします。

6. 自慢できる

「YAPCという世界各国で行われている国際会議で発表をしました」というのは友達に自慢できると思います。さらに、履歴書に書くことがなくて困っている人はYAPC::Asiaで発表すると一行くらい書くことが増えます。

7. 練習するには規模が最適

これからの人生、一万人の前で講演する機会がない、とは言い切れません。いきなり一万人の前でスピーチをするよりは、YAPC::Asiaで数百人の前で話しておくほうが気楽というものです。できるだけ少ない人の前で話したいという方は、全参加者が集まるライトニングトークよりも聴衆が二部屋に分かれる(こともある)一般トラックのほうがおすすめです。

8. これから3か月の生活が充実する。

人の欲は尽きないものです。2月に話す内容を決めてプレゼンテーションを完成させたとしても、YAPC::Asiaの行われるまでの3か月はきっとその発表を少しでも良く見せるためにいろいろな改善を加えたくなることでしょう。自分の作ったアプリケーションも自ずと質が向上します。

もっとも、上級者はプレゼンテーションの中身を決めてから発表に合わせて開発を進めるようですが(参考)。

9. やらないで後悔するよりは、やってみてから考えよう

何事においても、やろうかな、やめようかな、どうしようかな、と迷っている場合はとりあえずやってみるのがいいと思います。Fukuoka.pmもできましたし、うかうかしていると次回のYAPC::Asiaは東京で行われないかもしれません。

10. これであなたも有名人

カンファレンスで発表すると本人が思っている以上に有名になります。名前はもとより顔も多くの人に覚えられます。街を歩いていても「あのときの方ですよね」と声をかけられます。あなたの生活が一変します。セレブになれるといっても過言ではないでしょう。

追記

11. 参加費用が無料になる

というコメントをmiyagawaさんからいただきました。

参加費用がタダなのはもとより、YAPC::Asiaのチケットは例年売り切れるのが早いので、2月から座席を確保できるというのは大きなメリットです。

2008年2月17日日曜日

ミネアポリスについて

前後の脈絡はなにもないが、この週末をすごしたミネアポリスという都市のことを書くことにする。

基礎知識

ミネアポリスはアメリカの北のほうにあるミネソタ州の都市である。日本人にはあまり馴染みがない都市だったが、昨年夏に起きた橋の崩落事故のおかげで 有名になった。ほかには留学関係でも知られているし、ノースウェスト空港のハブ空港(ミネアポリス・セントポール空港)もあるためここで乗り換えたことのある人もいるかもしれない。

気温

私が訪問した時期のせいもあるが、地元の人が口を揃えて言うのは気温のことだ。2月の中ごろまでは最高気温が-10℃以下は普通のこと。幸か不幸か私が訪問した週末は特別で、金曜日までの最高気温が-10℃以下だったのに対し、土曜日と日曜日は0℃まで上がった。

かといって一年中寒いわけではなく、春は10℃、夏は30℃にもなるらしい。

地元の人はみな厚手のコートを着て重装備をしているのかと思っていたらそういうこともなく、慣れているのだろう、軽装の人が多かった。ミニスカートの人もいたのには驚いたが。

街の様子。雪はそれほど積もっていない。

華氏マイナス20度(摂氏マイナス30度のこと)になったら長ズボンをはこう。ビール会社の広告。

交通

市内の公共交通機関はバスが中心(だが観光客が乗りこなすのは無理だと言われた)。ダウンタウンと空港を結ぶ路面電車もあるが、これも観光客にはあまり役立たないし、空港の往復はタクシーが普通らしい。

ダウンタウンはそれほど大きくないので徒歩で移動ができる。ビル間をスカイウェイと呼ばれるガラス張りの陸橋のような通路が網羅しているため、厚着することなく他のビルへと訪問ができる(曲がりくねっているので道路を歩くのに比べて時間は倍くらいかかる)。

アメリカでは大都市にしかいない流しのタクシーもたくさんいた。

スカイウェイの外と内

治安

ホテルのあるダウンタウン地区については、治安はとても良さそうだった。夜10時以降でも人は普通に通りを歩いているし、治安の悪さの指標となる落書きも見なかった。

食べ物

名物料理というもの特にはないらしい。街を歩くとアメリカ料理・イタリア料理・メキシコ料理などなどのレストランがバランスよくあるようだった。中華料理店は見なかった。日本料理屋はやたらとあったが、Ichiban Steak House(一番ステーキ)やTemple Restaurant and Shinto Lounge(寺と神道)などなので、「正しい」日本料理がでてくるかどうかはわからない。これはミネアポリスの問題ではなく、アメリカ全体でこんな感じだけれど。

観光

郊外に行くと滝がある。あと美術館。車で1時間のところにカジノもあるそうだ。

空港の近所にあるMall of Americaというショッピングモールが全米最大だというので行ってみた。たしかに大きい。フロアをゆっくり一周したら1時間かかった。同じようなモールはアメリカのあちこちにあるし、ただ大きいだけで有名になっているという話もあるが、空港に向かう前にちょっとのぞいてみるくらいの価値はあると思う。モールの中に遊園地もある。

銃持ち込み禁止

銀行、ホテルやレストランの前に「銃は持ち込み禁止です」という看板があった。アメリカ中部に来たぞという気持ちになる。

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でメンテナンスを担当しているモジュール数

2008年2月2日土曜日

ユーロスターでパリからロンドンへ

今回は技術的な話を抜きにして旅行の話である。パリとロンドンの間にはユーロスターという国際列車があり、1時間から2時間の間隔で運行している。所要時間は2時間半以下。新幹線でいうと東京から名古屋よりも短い時間だ。

切符のとりかた

ユーロスターのオフィシャルサイトで予約ができる。自分の乗りたい日付と時刻を選び、座席の等級を選び(3種類ある)、クレジットカードの情報を入力しておしまい。値段は等級とその列車の混雑具合によって変動するが、片道1万円から2万円の間から。

もちろん当日に駅で買うこともできるが、窓口はいつも混雑しているし、高いチケットしか残っていない場合もあるのできれば事前に購入しておきたい。

発券のしかた

ネットで予約したら出発前に切符を発券してもらわなければならない。私はパリ発、ロンドンの往復だったため、ユーロスターのパリ駅で往復の切符を発券した。窓口に並ぶ必要はなく、自動券売機で行う(購入に使ったクレジットカードが必要)。

出国・入国関係

出発地で出国と入国の手続きを行う。たとえば、フランスからイギリスに向かうときは、改札口の中にフランスの出国窓口、さらにイギリスの入国窓口がある。隣り合った窓口なのにもかかわらず、フランスの係員はフランスなまりの英語を話すし(travelがトアベユになる)、イギリスの係員はきれいなイギリス英語を話す。

食事関係

フランス発の朝食はフレンチトーストだった。フレンチトーストにロールパンがついてきたのはなんか変だけれど。

味は……別に普通でした。