2009年4月16日木曜日

Remedieは15分でインストールできるのか

あらかじめ書いておきますがネタです。

[O] これから15分で Remedie を始めるための資料には

インストール自体は15分で終わらない場合が多いでしょう。

とある。

タイトルと中身が矛盾しているが、環境によりけりということのようだ。そこで、果たして本当に15分でインストールできるかどうか、PerlとRemedieを一からインストールしたときの時間を計ってみた。

0. 準備

Xcodeとgitを入れておく。

正確に時間を計測するために~/.cpanを削除。

% rm -rf ~/.cpan
%

1. ActivePerlのダウンロード(30秒)

ブラウザでActivePerlのサイトからダウンロードしてもいいが、時間を計測するためにcurlを使う。

% cd /tmp
% time /usr/bin/curl -sO http://downloads.activestate.com/ActivePerl/MacOSX/5.10/ActivePerl-5.10.0.1004-darwin-9.4.0-287188.tar.gz
/usr/bin/curl -sO 0.32s user 1.59s system 8% cpu 23.030 total
% time tar zxf ActivePerl-5.10.0.1004-darwin-9.4.0-287188.tar.gz
tar zxf ActivePerl-5.10.0.1004-darwin-9.4.0-287188.tar.gz 1.45s user 1.17s system 63% cpu 4.144 total
%

2. ActivePerlのインストール(15秒)

お遊びなので/tmp/activeperlに入れる。

% cd ActivePerl-5.10.0.1004-darwin-9.4.0-287188
% time ./install.sh --prefix /tmp/activeperl --license-accepted --no-install-html --no-manifest-check
....
./install.sh --prefix /tmp/activeperl --license-accepted --no-install-html 3.57s user 2.56s system 58% cpu 10.523 total
%

ついでにパスの設定も行う。

% export PATH=/tmp/activeperl/site/bin:/tmp/activeperl/bin:/usr/bin:/bin
%

3. Remedieのダウンロード(10秒)

% cd /tmp
% time /opt/local/bin/git clone git://github.com/miyagawa/remedie.git
....
/opt/local/bin/git clone git://github.com/miyagawa/remedie.git 0.44s user 0.30s system 9% cpu 7.754 total
%

4. 必要なモジュールのダウンロード(18分)

時間を節約するため、依存関係の処理をいちいち聞かないで勝手に処理してくれるように設定。

% export PERL_AUTOINSTALL="--defaultdeps"
%

いざcpanコマンドを実行。途中で5か所プロンプトが出るがリターンを押せばよい。あらかじめ5回リターンを押してもいいはず。ちなみにyesコマンドはLeopardにはついてこないので使わない。

% cd remedie
% time cpan -i .
....
M/MS/MSCHWERN/ExtUtils-MakeMaker-6.50.tar.gz is just needed temporarily during building or testing. Do you want to install it permanently? (Y/n) [yes] リターン
....
*** Press return to continue (or wait 60 seconds) リターン
....
*** Press return to continue (or wait 60 seconds) リターン
....
Do you want to build the XS Stash module? [y] リターン
Do you want to use the XS Stash by default? [y] リターン
....
cpan -i . 582.42s user 125.23s system 66% cpu 17:48.14 total
%

起動。

% bin/remedie-server.pl 
HTTP::Engine::Interface::ServerSimple : You can connect to your server at http://localhost:10010/

まとめ

全部で19分。この記事を書くためにActivePerlとRemedieを10回以上インストールしたが、15分を切ることはできなかった。回線の太さよりもmakeのスピードに依存しそうなので、速いコンピュータなら15分でできるかもと思う。

2009年4月15日水曜日

Remedieをインストール

家の前の川に飛行機が飛んできたのは1月のことだ。家にいながらこれにまったく気づかなかったその夜、消防車や救急車の音で窓の外が騒がしいので見てみたら、川の中に飛行機があって驚いた。とりあえず写真を撮ってブログのネタにした。

飛行機が川に不時着したのはすごいできごとだが、何よりも驚いたのは日本の人たちが事故のことを何時間も前から知っていてTwitterで話題にしていたことだった。

前にも書いたが私はテレビをほとんど見ない。ニュースは新聞が主な情報源で、インターネットでニュースにアクセスするとしても動画はほとんど見ないテキスト派だ。

そういう原始人のような生活から脱却するために、奮起してRemedieを入れてみた。

1. gitをインストール

MacPortsを使っているので簡単インストール。

# port selfupdate
# port install git-core

2. Remedieのダウンロード

[O] これから15分で Remedie を始めるための資料を見ながらやった。

% cd tmp
% git clone git://github.com/miyagawa/remedie.git

3. 必要なPerlモジュールのダウンロード

まずはRemedieのパッケージにREADME.mkdnというファイルがあるのでそれを読む。「cpan -i .」というコマンドを実行するべしとあるのでそのとおりにするとPerlのモジュールが大量にインストールされる。

% cd remedie
% cpan -i .

インストール済みのモジュールがそれなりに多いせいでトラブルもなく5分くらいで終了。

README.mkdnというファイル名は初めて見たが、mkdnはMarkdownの略だそうだ。Markdownはお手軽マークアップ言語。

4. テストがFAILするので微調整

cpan -i .の最後のほうでRemedie自身のテストが行われる。私の環境だとテストが3個Failした。

Test Summary Report
-------------------
t/99_fail.t (Wstat: 256 Tests: 1 Failed: 1)
Failed test: 1
Non-zero exit status: 1
t/plagger/plugins/CustomFeed-Script/base.t (Wstat: 1024 Tests: 4 Failed: 4)
Failed tests: 1-4
Non-zero exit status: 4
t/plagger/plugins/Discovery-Sites/base.t (Wstat: 256 Tests: 4 Failed: 1)
Failed test: 2
Non-zero exit status: 1
Files=41, Tests=236, 57 wallclock secs ( 0.16 usr 0.16 sys + 31.11 cusr 3.77 csys = 35.20 CPU)
Result: FAIL
Failed 3/41 test programs. 6/236 subtests failed.
t/99_fail.t

一番最初のt/99_fail.tはFailになるように設計されているので無視する。

t/plagger/plugins/CustomFeed-Script/base.t

これはやや複雑で、私のperlが標準のパス(/usr/bin/perl)にないから起こる。t/samplesディレクトリにあるスクリプトを書き替える。

% perl -pi.bak -e 's{/usr/bin/perl}{/usr/bin/env perl}' t/samples/*.pl

つまり、/usr/bin/perlではなくて自分が使っているほうのPerlを呼び出すようにする。

t/plagger/plugins/Discovery-Sites/base.t

このテストは実行するたびにFailしたりしなかったりする曲者である上にVeohなんて初めて使ったから自信がないのだが、t/plagger/plugins/Discovery-Sites/base.tをこのように書き替えたらエラーが出なくなった。

変更前

like $context->update->feeds->[0]->entries->[0]->thumbnail->{url}, qr/ll-images/;

変更後

like $context->update->feeds->[0]->entries->[3]->thumbnail->{url}, qr/(ll-images|img\.youtube|thumbnails\.cbsig|www\.mtv\.com)/;

5. 再テスト

同じコマンドを再度実行し、t/99_fail.t以外は大丈夫なことを確認する。

% cpan -i .
(略)
Test Summary Report
-------------------
t/99_fail.t (Wstat: 256 Tests: 1 Failed: 1)
Failed test: 1
Non-zero exit status: 1
Files=41, Tests=250, 60 wallclock secs ( 0.16 usr 0.16 sys + 31.77 cusr 3.91 csys = 36.00 CPU)
Result: FAIL
Failed 1/41 test programs. 1/250 subtests failed.

6. Remedieを起動

% ./bin/remedie-server.pl
Mouse::Meta::Class::__ANON__::SERIAL::1: You can connect to your server at http://localhost:10010/

7. フィードを追加

Remedieのページ(http://localhost:10010/)にアクセスすると真っ黒の画面が出るので、「New」を押してフィードを登録する。

まずは地元のテレビ局ny1.comを登録してみる。NY1のサイトに行ってRSSのURLを見つければいいのだけれど、もしかしてと思い直接「ny1.com」を入れてみる。

ちゃんとRSSのURLを見つけてくれた。これには感動。

というわけで今年度の目標は、日本在住の人よりも早くNYのニュースをキャッチすることです。

2009年4月14日火曜日

リチャード・ストールマンの講演に行ってきた

Richard Stallmanといえばフリーソフトウェアの神様のような存在だ。今回その神様がニューヨークで講演をするとのことで、先日、本人を見に行ってきた。批判の多い人でもあるしそれほど興味の対象でもなかったのだが一度くらいは顔を見ておこうと思ったのだ。話を聞いてみるとやはり氏は偉大な思想家だった。

会場はニューヨークにあるYeshiva Universityの講堂で、参加者は200人くらい。募金などもない完全無料のイベントで、講演後はパーティーまであった。スポンサーがいるのだろうか、ありがたいことである。

講演の内容はソフトウェアの自由と著作権の歴史について。

  • フリーソフトウェアの「フリー」は自由という意味。
    • 無料という意味ではない(有償のフリーソフトウェアはありうる)
  • フリーソフトウェアのユーザには以下の自由があるべきだ
    • プログラムを実行する
    • プログラムの内部を解析する(=ソースコードを読む)
    • プログラムを手を加えずに再配布する
    • プログラムを改変して再配布する
  • フリーでないソフトウェア(proprietary software)はユーザの自由を制限し、ユーザ同士を分断する

著作権の話はアメリカ特有の話が多かったが、要点を拾いだすとこうなる。

  • 古代には著作権の概念はなかった
  • 現代では著作権の保護期間は延長される一方
    • 一部企業の政治活動も関係している(ディズニーなど)
  • 著作権は本来著作者に独占的に使用する権利を保証して技術の進歩を促進するためのもの
    • アメリカ合衆国憲法第1条
  • ところが現代では著作権を保護しすぎて視聴者の権利が阻害されている
    • DRM(デジタル著作権管理)、DVDの暗号化

質疑応答から

質問「最近はどの言語でプログラムを書いていますか」
Richard「時間がなくて実はコードはほとんど書いてないのです」

質問「これだけフリーなOSがある中、どうしてみんなMS Windowsを使っているのでしょう」
Richard「多くの職場で求められるスキルはWindowsですから学校でもWindowsしか教えません。Windowsの教育を受けた人が社会に出て職場にWindowsを導入するというサイクルができています」

その他

GNUの発音はグニューかグヌーかヌーかというような話が昔からあるがRichard本人はグニューと発音していた。本来ヌーとGなしで発音するはずのgnuのぬいぐるみもグニューと呼んでいた。

学者タイプの人によくあるように、言葉の使い方に厳しい。質問者「オープンソースソフトウェアが……」Richard「フリーソフトウェアと言ってください」なおcreatorという言葉もお好きではないそうで、authorかartistと呼ぶべきとのことだった。

2009年3月29日日曜日

世界各地のYAPCはおいくら?

春が来た。コンピュータ関係のカンファレンスは春から秋にかけて行われるため、今年はどこに行こうかと考える時期でもある。ふと思い立って北米・ヨーロッパ・アジア(日本)のPerlカンファレンス、YAPCについて参加費を計算してみたくなった。

生データ

まずは通貨換算をする前の生データから。


YAPC::NAYAPC::EUYAPC::Asia
1999USD 60

2000USD 75GBP 40
2001USD 85EUR 99
2002USD 85EUR 89
2003USD 85EUR 99
2004USD 85GBP 65
2005USD 85EUR 89
2006USD 100GBP 75JPY 4000
2007USD 100EUR 100JPY 4000
2008USD 100DKK 900JPY 3500
2009USD 150EUR 100

USD=米ドル、JPY=円、EUR=ユーロ、GBP=英ポンド、DKK=デンマーククローネ。

ヨーロッパのYAPC::EUは大体100ユーロ前後、北米YAPC::NAは100ドル前後でどちらもゆるやかに増加している。

円に換算してみる

開催初日の為替レートをもとに計算してみた。


YAPC::NAYAPC::EUYAPC::Asia
19997286円

20007911円6087円
200110377円10862円
200210206円10585円
20039999円13366円
20049351円12804円
20059297円12109円
200611607円16630円4000円
200712355円15886円4000円
200810821円19779円3500円
200914681円13011円

グラフはこちら

まず目を引くのがヨーロッパの値上がりである。これはヨーロッパ通貨の値上がりによるところが大きい。デンマークで開催された2008年などは参加費が20000円近くに達している。

それにしてもYAPC::Asiaの安いこと。開催日数やノベルティの違いなど各国のYAPCを単純比較はできないが、それにしても低価格だ。会計報告を読むとスポンサー収入の違いかと思う。

マクドナルドで比較

円換算だと各国の物価・購買力が統計に現れないので、2008年のYAPC参加費をビッグマックの個数で比較してみよう。たとえば、YAPC::NA 2008の参加費用はアメリカのビッグマック(USD 3.57)28個分にあたる。

参加費(現地通貨)参加費(円)ビッグマック
YAPC::NAUSD 1001082128個分
YAPC::EUDKK 9001977932個分
YAPC::AsiaJPY 3500350012.5個分

円換算だとYAPC::EUはYAPC::NAの倍近い価格だが、ビッグマック換算だと大差がないことがわかる。Asiaと他のYAPCは差が縮まったが、それでもNAとEUの半額以下である。

YAPC::EUについて

上の数字を見るとYAPC::EUは高価格に見えてしまうのはやむをえないが、若手参加者に対する配慮が一番大きいことを特筆しておきたい。

  • 学割制度が充実している。2009年のYAPC::EUは学割40ユーロ。一般価格に比べ半額以下である。
  • YAPC::EUの参加者有志がSend-a-Newbieというサイトを始めた。航空券・宿泊費などの補助が必要な25歳未満のYAPC::EU参加者にお金を出し合って応援しようという趣旨である。

参考URL

2009年3月25日水曜日

アメリカ人「日本人なのにアニメを見ないのは人生の無駄づかいだな」

日本人だからアニメを見るだろうと言われても困るのである。

海外のアニメファンにとって日本といえばまずアニメという連想が働くらしく、日本人の私は親しげに話しかけられる。日本人は全員アニメが好きだと思っているアメリカ人さえいるが、アニメが好きかどうか以前に私は映像作品自体をほとんど見ない。DVDを買ったことはないし最後に映画を見たのは10年前のことだ。

 ◇ ◇ ◇

友人にP君という人がいる。ユダヤ系のアメリカ人で超真面目な男であるが、日本のアニメが大好きである。このP君、私が唯一の日本人の友達なのでいつも構ってほしがる。

P君「ナルトのDVDは全部持ってるし英訳の単行本もあるんだけど日本語の単行本がほしい。どこで買えるのかな」

日本語の単行本のほうが話が先に進んでいるから日本語で読みたいらしい。ニューヨークにある紀伊國屋書店で聞いてみればいいのでは。

P君「デスノートのあの部分には矛盾があると思うんだが、なぜかというと、……」

ごめん、デスノートという言葉自体初めて知った。

P君「ユーギオーの続編は出ないのかな」

続編もなにも、私は本編を知らない(註:米国では一年だけテレビ放映されたそうです)。

 ◇ ◇ ◇

あまりに話が噛み合ないので申し訳ないと思い、提案をしてみた。

私「最近のアニメは知らないけど、20年以上前のアニメならわかると思うよ」

目を光らせるP君。

P君「じゃあ君、ジャイガンターは知っているね」

私「そんなの知らないよ」

P君「日本語だとタイトルが違うのかな。ちょっとiPhone貸してみて。YouTubeで検索してみよう」

鉄人28号! これなら知ってる。異国アメリカでジャイガンターという名前になっていたとは。

P君「ジャイガンターは僕たちが生まれる前からアメリカのテレビで放映してたよ。主人公の少年はジミーだ」

ショータローじゃないのか。本当に詳しいなこの人。

 ◇ ◇ ◇

P君「それにしても、日本人のくせにアニメ見ないって本当に信じられない。人生の無駄遣いしてるよ」

そこまで言うか。

ちなみにP君の夢は日本を訪れて秋葉原と三鷹の森ジブリ美術館に行くことである。

2009年3月3日火曜日

MacPortsのselfupdateを忘れた→はまる

MacPortsは各portのバージョンや依存関係といった情報をローカルなファイルに保存している。そのportがインストールされていなくても、である。これがちょっとした問題になることがある。

結論を先に書くと、selfupdateは定期的に実行しなければいけない。

例1:ローカルの情報が古いと旧バージョンのportがインストールされる

caml-sqlite3というportを例に説明してみる。現時点でcaml-sqlite3の最新版は1.3.0だ。

ところが、私の環境でcaml-sqlite3を入れようとすると1.2.0を取りに行く。

# port -v fetch caml-sqlite3
---> Fetching caml-sqlite3
---> ocaml-sqlite3-1.2.0.tar.gz doesn't seem to exist in /opt/local/var/macports/distfiles/caml-sqlite3
---> Attempting to fetch ocaml-sqlite3-1.2.0.tar.gz from http://www.ocaml.info/ocaml_sources/

こうなるのは、私のLeopard上にあるPortfileが古いからだ。このファイルはMacPortsをインストールしたときに作成されている。

# grep version /opt/local/var/macports/sources/rsync.macports.org/release/ports/devel/caml-sqlite3/Portfile 
version 1.2.0
distname ocaml-sqlite3-${version}
#

例2:portがインストールできないこともある

上の場合は旧バージョンの1.2.0がまだ1.3.0同様ダウンロードできるのでまだ良いが、portによっては旧バージョンがダウンロードできない場合もある。p5-errorがその例だ。

# port install p5-error
---> Fetching p5-error
---> Attempting to fetch Error-0.17012.tar.gz from http://ftp.ucr.ac.cr/Unix/CPAN/modules/by-module/Error
(略)
Error: Target org.macports.fetch returned: fetch failed
Error: Status 1 encountered during processing.
#

port installの裏側ではError-0.17012.tar.gzを取りに行っているのにサーバ側には最新版(0.17015)しかないためにダウンロードが失敗している。

解決方法

上の問題を解決するにはselfupdateというコマンドを実行する。

# port selfupdate

出力はこれのどちらかになるようだが

  • selfupdate done!
  • The MacPorts installation is not outdated so it was not updated

どちらにしても/opt/local/var/macports/sources/rsync.macports.org/release/ports/以下のファイルが更新される。

selfupdateを行った後に先のcaml-sqliteでもう一度試してみると無事1.3.0をダウンロードしてくれる。

# port -v fetch caml-sqlite3
---> Fetching caml-sqlite3
---> ocaml-sqlite3-1.3.0.tar.gz doesn't seem to exist in /opt/local/var/macports/distfiles/caml-sqlite3
---> Attempting to fetch ocaml-sqlite3-1.3.0.tar.gz from http://www.ocaml.info/ocaml_sources/

selfupdateは定期的に実行する

今までselfupdateはその名前からして/opt/local/bin/portのバイナリを更新するだけのものだと思っていたが、実はそうではなかった。MacPortsのWikiにこうある。

Selfupdate is the command used to automatically download new Portfiles so that your local copy of MacPorts is aware of new MacPorts software or upgrades to existing software that have been committed to the MacPorts infrastructure. Additionally, this command is used to update the MacPorts software itself - think of it is a Software Update, like its name suggests.

(抄訳)selfupdateコマンドを使うと更新のあったPortfile群をダウンロードできる。さらに、selfupdateの名前のとおり、インストールされているMacPortsのバイナリ自身を更新する。

Selfupdate is a command that can safely be scheduled to automatically run, as it doesn't actually update your installed software, it just "teaches" MacPorts about new updates. Take a look at using crontabs to run your selfupdate.

(抄訳)selfupdateコマンドは更新情報をダウンロードするだけのものなので実際にソフトウェアの更新を行うわけではない。そのため自動的に実行しても安全だ。

実行しても安全というか、実行しないと更新情報が同期できないのだ。

私のcronの設定

rootのcrontabをこのように設定した。

# 毎日午前1:23にselfupdateを実行
23 1 * * * /opt/local/bin/port selfupdate

どこか気持ち悪い

上記をまとめると、

  • MacPortsを安心して使うにはport selfupdateの実行が不可欠
  • selfupdateはcronで定期的に走らせるのが一番

となるのだがどうにも気持ち悪い。

ウェブの世界に例えると、ローカルに保存されたPortfileはHTTPのキャッシュに近いが、自分でキャッシュの更新(selfupdate)をしない限りブラウザが永遠に古いキャッシュを参照しているという状態になっている。Yahooで昨日の検索結果が表示されるのは構わないが、昨日の天気予報が出てくるのはいやだ。

サーバの更新情報をローカルに保存する仕組みの是非はともかく、ユーザが何もしないとその情報が更新されないのが腑に落ちない。MacPortsは他のところがうまくできているので、不思議でならない。サーバ側で走らせるデーモンをrsyncだけにしたかったのだろうか。

2009年2月16日月曜日

私が博士課程に進学しなかった理由

幻影随想: ブログでバイオ 第41回「私が博士課程に進学しなかった理由」という記事がおもしろい。私が同じ問題で悩んだのはかれこれ一昔前の話だが、私が博士課程に進学せずに企業に就職した理由を書いてみたい。

1. リスクの話

もともと私はあまり考えずに行動するクセがある。穴があれば入ってみるし穴がなければ掘ってみる。考えずに行動して困るのはいつものことで慣れっこなのだが、リスク管理は大事である。後悔しなくてすむよう、選択を間違えた場合のことを少し考えた。

博士課程を1年で中退して企業に就職するのと、企業を1年で退職して博士課程に入るのとどちらがやりやすいだろうか。私の結論はとりあえず企業に就職、向いていないと思ったら大学に復学することだった。博士課程を中退したら第二新卒とやらの就職活動をせねばならず、なにかと大変そうだ。逆に企業をやめて博士課程に入るのは、同じ研究室に入り直すのならば簡単、出身大学の同じ学部でもなんとかなると思っていた。

もちろん、修士課程から1年のブランクを経て博士課程に戻り、元同級生に追いつくのは言うほど簡単ではない。将来間違いなく戻ってこられるよう、修士の段階で研究の成果は出しておくように努めた。

2. 大学だけが研究の場所ではない

研究は好きだった。ただ、「研究をするために博士課程に残る」という考え方は説得力がなかった。企業で研究者になっても良いし、仕事が終わってから自分の研究を家で細々とやっても楽しい。幸い私の専門分野は実験器具がいらない情報系だったため、自分の研究はどこでもできた。大学にあって家にないものといえば図書館と研究仲間・先生だが、大抵の論文はオンラインで手に入るしインターネットで世界中の研究者と議論もできる。

3. 海外の大学に行ってみたかった

私は国産品主義の日本びいきなのだが、残念なことに私の研究分野はアメリカが一歩進んでいた。先輩を見ても優秀な人はほとんど海外の大学に留学・就職していた。さらに残念なことに私は英語がそれほどできるわけではないので修士の時点では留学は遠い存在だった。もちろん英会話が苦手でもそれなりの論文を英語で量産すれば自然に道は開けるのだろうが、英語をきちんと学べる環境が大学にはなかった。特に英語でアカデミックな内容を議論する場がなかった。

企業に入れば無料英語研修もあるだろうし、なによりも留学費用が稼げる。会社の負担で留学をさせてくれるありがたい企業もある。

4. 博士課程の3年は長過ぎた

世間の基本は博士課程3年。博士課程はちゃんとした研究をして論文を書けばいつでも修了できてよさそうなものだが、3年間は勤め上げなければいけないことになっている。大学・学部によっては2年で出してくれるところもあるが、私の学部はどれだけ論文を書こうと3年がルールだった。3年という時間は貴重な20代の中では長過ぎる。

もちろん3年間正しく拘束されて一つの研究を仕上げるのが博士課程の意義であるし、さらにこの間には人脈を作ったり博士論文目的以外の研究をしたりできるので別に3年間を無意味に過ごすわけではないが、余分に3年を大学で過ごそうという気にならなかった。

実際には

修士課程を修了する少し前から会社に入った。研究も面白かったが仕事はさらに面白く、結局大学に戻ることはなかった。研究も私的に続けたが飽きて数年でやめてしまったので、結果的に就職したことが正しい選択だったのだろう。

留学は社会人3年目くらいまでは考え続けていたが、海外で勉強をするくらいなら海外で就職するほうが楽しいだろうと思い直し、アメリカで仕事を見つけ今に至っている。

余談だが、ニューヨークに住むようになったあと、私が修士を取った分野の研究をしている大学の先生と偶然知り合った。「うちでドクター取らない?」と本気だか冗談だかわからない調子で勧誘された。ちょっと心が動いた。