理系学生日記

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

忍者TOOLS

perl

Web::Scraper と Mac::Growl で雨が降り始めたら Growl で通知する

ぼくは基本的に PC の前にいて、PC の方を向いています。部屋のレイアウト的に、ぼくは家にいる時間の大部分を窓と反対方向を向いて過ごすことになります。 しかし今日のように、いつ雨が降り出すか分からないような状況で洗濯物を干していると、雨が降り始…

Catalyst ソースリーディング2

setup_components Catalyst::setup から呼び出される setup_components は、その名前の通り、Catalyst のコンポーネントのロードを行う。 sub setup_components { my $class = shift; my $config = $class->config->{ setup_components }; my @comps = sort …

Catalyst ソースリーディング1

$ catalyst.pl myapp で、作成された myapp.pm をまず見てみます。 use Catalyst::Runtime 5.80; use parent qw/Catalyst/; use Catalyst qw/-Debug ConfigLoader Static::Simple/; __PACKAGE__->config( name => 'myapp' ); __PACKAGE__->setup(); Catalyst…

Parallel::ForkManager 使って並行ダウンローダ作った

Parallel::ForkManager はじめて使ったけど、これスゴい使いやすいなって思いました。 3 並列でダウンロードさせるにはこんなかんじ。 $ youtube-downloader -v -p 3 -f ~/tmp/url.txt ソースこれ。 #!/usr/bin/perl #-*- cperl -*- use strict; use warning…

Youtube からのダウンロードモジュール作った

何度もスクリプト組むのがたいへん面倒になったので、ダウンロードモジュールをこさえた。 http://github.com/kiririmode/p5-WebService-Youtube-Download URL を与えると、だいたいこんな感じでダウンロードできるようになる。 WebService::Youtube::Downlo…

モジュール名からモジュールのソースファイルをシームレスに開く elisp Ver.2

モジュール名からモジュールのソースファイルをシームレスに開く elisp - 理系学生日記で多少便利にはなったんだけど、以下の点に不満があったりしました。 getenv で PERL5LIB 環境変数の値が取得できない場合がある*1 perldoc でエラーが発生した場合に、…

モジュール名からモジュールのソースファイルをシームレスに開く elisp

タイトルの通り、モジュール名を読んでモジュールのソースファイルを開く elisp を作ってみました。これによって、ソースを読みつつ気になったモジュールがあると、そのモジュールのソースもシームレスに覗くことができるようになりました。 動機 最近ヒマな…

Pin の Read It Later への転送スクリプト

WebService::{LivedoorReader,ReadItLater} の書き直しに伴い、Livedoor Reader の Pin 立てたエントリを Read It Later に送るスクリプト書き直した。 Livedoor Reader でピンを立てたエントリを Read It Later へ送るスクリプト書いた - 理系学生日記 これ…

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 が呼ばれるend 経由での send">*1。…

YAPC

世界最大の Perl の祭典 YAPC に、会社休んで行ってきた!!! だいたいこんな感じで講演を回りました。レポートはありません!!!!! 基調講演 Webエンジニアのためのmixiアプリ開発ガイド PSGI - Perl Server Gateway Interface Inline::x86 JIT Assembler XS書…

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 から使ってみようということになりました。 将来的に何がしたいのか Pocket を使うと、オフライン状態(地下鉄…

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 でも良いだろって思ってたんですけど、…

クローズドな図書館を作ろうプロジェクトは頓挫しました

そういえばこんなプロジェクトがありました。 友人間で本を貸し借りするのは法律的にどうなのか - 理系学生日記 これは、同期の間で共有できる知識を含んだ本とかあるハズだから、そういうのが簡単に貸し借りできるシステムを作ったら良いんじゃないかと、ぼ…

screen に LDR の未読数を表示する

screen の backtick を初めて知りました。 そもそも screen ってよっぽどターミナルの切替えが面倒くさいときしか使っていなくて、この間 Mac OS を再インストールしてからは .screenrc すら作っていないとか、そんな感じ。今日はそのへんの設定してたら、ba…

CGI::Application の文字化け

前と同じところ詰まったけど、結局、UTF-8 で書いた日本語入りのテンプレートなのに、HTTP のヘッダでの文字コード指定が間違っているという前回と同じ過ち。 CGI::Application において、ヘッダをクライアントへ送出する直前に呼ばれる cgiapp_postrun にて…

IT 勉強会カレンダーを iCal でちょっと使い易くする

IT 勉強会カレンダーにはぼくもお世話になっています。ぼくはこのカレンダーを iCal に登録している。ところが、iCal だとちょっと困ったことが起こってしまいます。勉強会カレンダーには、その勉強会に関する URL まで配信してくれていますが、iCal ではこ…

POE の処理の流れを把握してみる

メモ書き程度に。 準備 POE の多くのクラスは、POE::Kernel に対する mix-in となっています。つまり、POE::Kernel パッケージに属するメソッドなのに、Kernel.pm にないんだけど…!! ということがよく起こる。これをなんとかするために、とりあえず TAGS フ…

PoCo::Client::Twitter で POE を学ぶ

使ってみたいと思っていたフレームワークに POE がありました.ぼくは一言で POE を言い表せられるほど POE に詳しくないですけど,ドキュメント的には POE - portable multitasking and networking framework for Perl http://search.cpan.org/~rcaputo/POE…

Gmail の フォロー返しスクリプト修正

先日のエントリでコメントを頂いて,Twitter からのメールのヘッダに様々な情報があることを知りました. gmail 宛に届く follow メールに対して自動で follow 返しする - 理系学生日記 なんでみなさん知ってるんだろう,どこにドキュメント化されてんのかと…

gmail 宛に届く follow メールに対して自動で follow 返しする

以前に nipotan さんが,以下のようなスクリプトを作っていました. Twitter でイチイチ follow するのが面倒くさい - にぽたん研究所 しかしながらぼくが twitter に登録しているのは gmail のアドレスですから,こういうのできないよなーと思って思考停止…

指定した文字の数を数えるワンライナー

なんか先輩がログファイルから指定した文字の数を数えるということをされていて,Perl だったらどうやるだろうとか思ったりした.直感的にはこんな感じだけど,なんかもっと良い方法がありそう. $ cat count-char.dat aaaaaaaaiiiaabcxbfjdjal;djifa;jfdlsd…

Perl の組み込み関数一覧を作るワンライナー

Perl の組み込み関数ってどうやって取得するかなーとしばし悩んだ後,特段何も思いつかなかったので,perldoc perlfunc から取り出してみることにしました.これだと -X とかは出ませんけど,まぁそういうのは良いかなーって思ってました. $ perldoc -otxt …

Cricket のソースコードを読む際のポイント

Cricket Home Cricket では,各監視対象に関するデータをコンフィグファイルから一旦 config.db というファイル名の Berkeley DB に書き出すことになっています.そのため,この config.db をどう操作するのかさえ理解していれば,随分とソースコードは読み…