2012-02-07
Test::Moreで標準出力を抑制する方法
Test::Moreの標準出力を抑制するには次のようにします。
my $builder = Test::More->builder; open my $out_fh, '>', undef; $builder->output($out_fh); $builder->failure_output($out_fh); $builder->todo_output($out_fh);
ただたんにSTDOUTをundefに対してopenしてもだめで、Test::Builderオブジェクトの、標準出力を変更してあげる必要があります。
2012-02-06
cpanmを使って指定したディレクトリにCPANモジュールをインストールする
cpanmを使って指定したディレクトrにCPANモジュールをインストールするには-Lオプションを使用します。
cpanm -L extlib DBIx::Custom
カレントディレクトリのextlibというディレクトリにDBIx::Customがインストールされます。
2012-02-05
Test::ModuleVersionというモジュールを作っている
Test::ModuleVersionというモジュールを作っている。
Perlでモジュールのバージョン管理をやろうと思うと意外に難しい。たとえば、開発環境と本番環境でモジュールのバージョンはぜひあわせておきたいものだ。バージョンが異なることで、見えないバグが含まれていたり、後方互換性がなかったりする。だから、開発環境と本番環境では、すべてのモジュールのバージョンはあわせておきたいものだ。
開発環境と本番環境でアーキテクチャがまったく同じ場合はモジュールの管理にgitを使うのが便利。でもアーキテクチャが違うとたとえば、同じバージョンのOSでも32bitと64bitなどの場合は、モジュールをそのまま移動させただけでは使えないものがある。XSを使って、つまりC言語を使ってコンパイルされたモジュールは、動かなくなるだろう。
そして、実際に業務で必要になる場面にでくわした。それで、どんな解決方法がシンプルなのかということを、考えてみた。ひとつは、多くの人がいまチャレンジしようと試みている方法がある。それはローカル環境に、CPANのミラーを作成する方法。でもこれって意外と大変。そもそもCPAN自体がシングルバージョン管理システムなので、うまくやるためには、意外と難しいトリックが必要になったりする。
それで僕が考えたのはこんな方法。
- 開発環境でインストールされているモジュールを調べて、モジュールのバージョンをチェックする自動試験を生成する。これで、この試験を本番環境に持っていけば、モジュールのバージョンの差分を自動試験によって確認することができる。
- 次にモジュールのバージョンが異なっていた場合は、ぜひともバージョンがあったモジュールをインストールしたい。そのURLがわかればうれしい。調査したところ、metaCPANのAPIをうまく利用すればできることがわかった。
- 最後のそれらのURLの出力をcpanmにパイプで流せば、開発環境とバージョンが一致したモジュールが本番環境にインストールされる。
試してみたところ、これはかなりお手軽で有用性の高い方法だと感じている。それを実現するのが、Test::ModuleVersionだ。もう少し仕様と動きが安定したら、使い方を解説しようと思う。
2012-02-04
metaCPAN APIを利用してモジュールの情報を取得する
モジュール名とバージョンを指定して、ファイルを自動的に取得するということは、今までのCPANだととても困難だったですが、metaCPANの登場によってこの状況は変わりそうです。変わりそうというのは、まだmetaCPANのAPIがベータバージョンだからですね。
それでも、metaCPANのAPIは今でも便利です。APIはバージョンごとに管理されるようなので、後方互換性も保たれるような予感です。
情報の取得
以下のようにして情報を取得できます。
実際にアクセスしてみると、JSON形式で情報が返されます。download_urlを見てみると、実際にファイルのある場所のURLがわかります。
少しだけ解説
これはWebAPIでJSON形式のデータです。qで検索条件を設定できます。nameがDBIx-Custom-0.2107のものを検索しています。fieldsで、取得したいデータの項目を指定することができます。これはカンマ区切りで指定することができるようです。
またすばらしいことにmetaCPANという名前だけあって、CPANとBackPANにある両方の情報を統一的に扱うことができます。つまり、たとえCPANからディストリビューションが削除されたとしても、metaCPANを使えば、その情報にアクセスすることができます。
metaCPANでCPANがさらに便利になる。最近ますます便利になってきているPerlですね。
2012-02-03
サブルーチンの再定義の警告を抑制する
開発中にバグがあって、急遽修正しないといけないときは、モンキーパッチを当てることがときどきありますね。モンキーパッチというのは、サブルーチンやメソッドの定義を上書きして、正しい動きにしてあげることです。
でもサブルーチンの再定義を行うと、警告が発生します。この警告を表示しないようにするにはredefine警告をとめるように、コンパイラに指示してあげます。
no warnings 'redefine';
これで警告が表示されなくなります。これはレキシカルなスコープを持ちます。以下はモジュールのメソッドを上書きするサンプルです。
2012-02-02
イベント Perl Beginners #1
日時
日時 :2012/02/24 19:00 to 21:00 定員 :15 人 会場 :品川区五反田文化センター 第4会議室 (東京都品川区西五反田6丁目5−1)
概要
(上サイトより) Perl Beginnersについて いわゆる"勉強会"と呼ばれる類のイベントです。Perl初心者の方をターゲットにしております。 是非、Perl Beginnersのブログ もご確認ください。 参加費用について イベントそのものは無料で参加いただけます。 二次会については、基本割り勘とさせていただく予定ですが、詳細が固まり次第、本ページを更新していきます。 ビギナーズセッション Perl初心者(でなくても良いですが)に登壇していただいて質問して頂き、それに対して聴衆の方々が回答していく、という形式のセッションとなります。 時間が15分間割り当てられますので、その範囲内でご自由に質問・発表をしてください。 現在、ビギナーズセッションは発表者を募集しております。 発表してやっても良いよ!と言う方は、@ytnobodyまでご一報ください! LT 5分間でPerlに関しての発表をしていただきます。 特にお題などは設けておりません。 現在、LT発表者を募集しております。 発表してやっても良いよ!と言う方は、@ytnobodyまでご一報ください!
参加はPerl Beginners #1から。
2012-02-01
Encode::UTF8Mac - Mac OS XのファイルシステムのエンコーディングUTF-8-MACを正しく扱う / Perlモジュール徹底解説
Mac OS XはUTF-8をファイルシステムのエンコーディングとして採用していると思いきや、実は少し異なり、Mac OX X独自の仕様になっています。これを正しく扱うためにはEncode::UTF8Macというモジュールを利用すると簡単です。
use Encode qw/encode decode/; use Encode::UTF8Mac; # エンコード my $byte = encode('utf-8-mac', $string); # デコード my $string = decode('utf-8-mac', $byte);
useを使ってEncode::UTF8Macを読み込むと、Encodeモジュールのエンコーディングとしてutf-8-macを利用できるようになります。このエンコーディングを利用すれば、Mac OS Xのファイル名を正しく扱うことができます。
Encode::UTF8Macを利用する方法は、Text::IconvなどのMac OS X独自の方法を利用しないで、標準的なEncodeモジュールを利用できるという点でおすすめです。