理系学生日記

おまえはいつまで学生気分なのか

perl

Coro の Perldoc 読んでみた

空前の非同期ブームが襲来した 2009 年でしたけれども、ぼくは Coro をほぼスルー、後で勉強しよう後で勉強しようとか思って結局勉強しなかったクソでした。このままではマズい。死ぬ。そういうわけで、新幹線の中でちょっと Perldoc 読んでた。何がよくわか…

WebService::ReadItLater 書いた

薄い。 package WebService::ReadItLater; use base 'WebService::Simple'; use WebService::Simple::Parser::JSON; use strict; use warnings; use Carp; use JSON; our $VERSION = '0.01'; __PACKAGE__->config( base_url => 'https://readitlaterlist.com…

WebService::Simple の POST でハマる

WebService::Simple(v0.16) で POST するときにハマってしまったことがあります。 前提 WebService::Simple は、コンストラクタにパラメータを設定しておけば、後段で get や post を呼び出すときにそのパラメータを自動的に付加してくれる便利機能がありま…

WebService::LivedoorReader の進捗

まだできあがってないのでアレなのですが、Moose を使って WebService::LivedoorReader を書き直しています。 絶対にしたいと思ってたのが、メソッドチェーンで(ある程度)つなげるようにしたい!! ってことで、これはなんでかっていうと、気分だけの問題です…

LDR の discover API は subscribe_id を返すときと返さないときがある

LDR にはサイトの URL をパラメータとして渡すことでそのサイトの Feed の URL を返す API (/api/feed/discover) がある。 この API を叩くことによって、feed の URL はもちろん、ページのタイトルだったり、そのページの Feed を LDR に登録している人数だ…

Perl で Expect

対話的なプログラムを自動化するのに expect があるという話を前に同僚から聞いていましたが、Perl でやるとどうなるんだろうとか思ってると、そのまま Expect っていうモジュールがあった。 インタラクティブなコマンドのクソ面白くない例としてパスワード…

Moose における再帰構造を持った型制約

Moose では ArrayRef[hoge] という形で、型 hoge の配列リファレンスという型制約が定義できる。 hoge には Int や Str、あるいは Moose で定義したクラス名などが入るが、'ArrayRef[hoge]' 自体も入れることができる。これを繰り返すと当然ながら ArrayRef[…

WebService::LivedoorReader ちょっとだけ進めた

git によって僅かばかりやる気がでたので、WebService::LivedoorReader をちょっとだけ進めた。 とはいえ、前回作っていた状態とほぼ変化はなく、機能的にはむしろ退化したりしてる。コンストラクタは内部にて WWW::Mechanize を構築する程度で、今後何をパ…

AnyEvent で並列ダウンローダを作ってみた。

Youtube からのダウンロードは以下のような 2 ステップに分かれます。 HTML から flv ファイルの URL を抽出 実際に flv をダウンロード こういう形でいくつかのステップに分かれる場合に AnyEvent ではどう書くのかを検証したかったこともあり、チャレンジ…

iTunes の Artwork と歌詞設定

Art Work と歌詞の設定にはいろいろと苦労させられる部分とかありますけど、世の中ベンリなもんですから、いろいろとソフトがありまして、ぼくは以下のを組み合わせて使っています。 -Artwork Gofer -iGCover -Lyrics Master Art Work の方は Artwork Gofer …

AnyEvent でいくつものイベントを一つのイベントループで補足したいとき

$cv を Condition Variable だとすると、$cv->begin と $cv->end を組み合わせると良い。 $cv は AnyEvent::Condvar のインスタンスであるが、以下のように内部でいくつのイベントを待っているかのカウンタを持っており、begin はカウンタのインクリメント、…

AnyEvent で外部コマンドを実行するときの注意点

AnyEvent::Util に run_cmd ってのがあるので、これを使うと良いのではないかと思う。 run_cmd は AnyEvent の Condition Variable ($cv) を返す。外部コマンドが実行を終えると、run_cmd 内部ではこの $cv に対して send が呼ばれる*1。外部コマンド実行後…

qw/STRING/ では変数展開がなされない件

恥ずかしながら変数展開でハマったお話。 my $a = 'aaa'; print "$a\n"; # prints "aaa" print qw($a), "\n"; # prints "$a" ダブルクオテーションで囲むと当たり前だが変数は展開される。しかし、qw で囲んだ場合は変数展開がなされません。どの演算子(?)が…

Youtube からのダウンロードスクリプト

どうも Youtube の仕様が変わったみたいで、これまでのダウンロードスクリプトが使えなくなってしまいました。取り急ぎ今の Youtube に対応できるようにガーって書いて、まぁなんとか動くかという状態。 今みたいな感じでファイル一つずつ指定するとかマジめ…

Data::AsObject

そういや、Data::AsObject っていうアクセサモジュールがでてました。 Data::AsObject Released - Data Structures Made Easy - Mechanical Revolution | The Tech Blog of Peter Shangov これがなかなか良い感じに使えそうです。 use strict; use warnings;…

LDR 用のモジュールを作り直します

つくりなおすっていったら作り直すんだ。 こんな感じのものを作るために、今度はちゃんとテスト書くんだ。 my $ldr = WebService::LivedoorReader->new( user => 'xxx', pass => 'yyy' ); # LDR に 'http://d.hatena.ne.jp/kiririmode/rss2' を登録 $ldr->di…

Livedoor Reader でピンを立てたエントリを Read It Later へ送るスクリプト書いた

このエントリで作りたかったものをようやく作りました。 LDR の API を使って、未読の全 URL を取り出してみる - 理系学生日記 Read It Later については、この辺りが参考になる。 「Read It Later」を使ってiPhone/touchで後で読む | iPod LOVE オフライン…

Test::Base での上手い書き方はないものか

簡単なアクセサのテストを Test::Base で書くとして、ちょっと困ったことがありました。 Read アクセサとして、単なるスカラー値と、リファレンス(例えば aref) を戻すのがあって、その戻り値が正しいかという基本的なテストをしたい。Test::Base::run の中…

Sub::Exporter

Exporter.pm のモダン版と言われている Sub::Exporter の POD を初めて読んでみました。POD の中で Sub::Exporter を使う "Biggest benefit" と言われているのが Export する対象(coderef) を操作できることです。POD の例で分かりやすいのは以下のようなも…

perlxstut Example 5

書いてあることをそのままするだけなので当然なんだけど、テストがうまく通ると嬉しいなー。 というわけで、statfs(2) を Perl から呼び出すための XS。Mac の場合は sys/param.h と sys/mount.h の include が必要。 void statfs(path) char * path INIT: i…

ハッシュに対する Accessor を作った

こんなハッシュリファレンスを、 my $h = { a => { b => 'bbb', c => { d => 'ddd', e => 'eee' } } }; こんな風にアクセスしたいと思いました。 my $o = Class::Accessor::Hash->new({ data => $h }); $o->a->b; # 'bbb' $o->a->c->d; # 'ddd' でとりあえず…

PPCODE と CODE の違い

Perl XS でちょっと複雑なことをしようと思うと、CODE または PPCODE セクションに C レベルのコードを記述する必要がありますが、この CODE と PPCODE セクションの違いはなんだろうということで調べてみました。詳細は perlxs の "The PPCODE: Keyword" や…

DBIC でリレーションが自動設定されない訳

実は明日 7/24 が第何回だかの勉強会の日で、ぼくのテーマは O/R マッパなわけで、準備してねーこれはヤバいとか思って家でちょっとしたプログラムを動かしてみてたんですけど、ヤベーうまく動かないみたいなことになりました。 何が困ったかっていうと、DBI…

LDR の API を使って、未読の全 URL を取り出してみる

Livedoor Reader には非公開の API があるそうです。 livedoor ReaderのAPI一覧 - ニフラムで消せる相手は自分くらいです なので、取り急ぎ Perl から使ってみようということになりました。 将来的に何がしたいのか http://readitlaterlist.com/ を使うと、…

Devel::Declare を使ってみた

最近ちょっと話題になってた Devel::Declare を触ってみました。 POD に書いてあることを素直に行っていくと、例えばですが Perl の文法が普通は許さないこんなプログラムが書けるようになります。method という語でメソッド定義は、普通の Perl ではできな…

DBIC に出てくる Carp::Clan を用いたスキップについて

DBIC のソースを読んでたら、不意に出てきた Carp::Clan。気になって調べてみました。 Carp との違い 一番分かりやすい Carp との違いは、どのサブルーチン内でエラーが起こったかまでが、エラーメッセージとともに出力されることです。 #!/opt/local/bin/pe…

CGI::Application::Plugin::Session を使ってみた

やたら長いモジュール名になりますけども、CGI::Application::Plugin::Session を使うことで、ほとんど何も意識しないでもセッション管理ができるようになりました。 今のところ、Driver には mysql を使い、Serializer には Data::Dumper を使ってます。CGI…

Exporter を使ったプラグイン機構

CGI::Application では、Plugin を読み込むことで、CGI::Application に新たにメソッドを生やすことができます。CGI::Application を継承した MyApp。 package MyApp; use base qw(CGI::Application); # use CGI::Application::Plugin::DBH qw(dbh_config); …

CGI::

ぼくが DBI から DBIx::Class に移行した理由

2009-06-18 この話で、とりあえず MySQL 使ってみっかってことになって、最初は DBI を使ってアクセスしてたんですけど、その部分全部消して、DBIx::Class 使ったアクセスに書き換えました。 別に DBI でも良いだろって思ってたんですけど、それでも乗り換え…