myfinderの技術や周辺的活動のblog

2009年9月27日日曜日

Snow LeopardでShipItを使えるようにする

PerlモジュールのリリースツールShipItを勧められたので入れてみた記録。

1.必要なモジュールのインストール
ShipItを使うのに必要なモジュールをインストールする

$ cpan -i ShipIt
$ cpan -i AppConfig::Std
$ wget http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/cpan-upload-http-2.4.tar.gz
$ tar zxvf cpan-upload-http-2.4.tar.gz
$ cd cpan-upload-http-2.4
$ perl Makefile.PL
$ make
$ make install
$ cpan -i ShipIt::Step::CommitMessageWrap

2.「~/.pause」ファイルの準備
ホームディレクトリに.pauseファイルを作成

$ vim ~/.pause
$ cat ~/.pause
user xxxxxx
password xxxxxxx
mailto xxxxxxx@xxxxxx.xxx
$ chmod 600 ~/.pause

3.「.shipit」ファイルを用意する
ShipItを利用するには、プロジェクトのトップディレクトリに.shipitファイルが必要。
Module::Setupとかを使っていれば自動的に生成されているので特に気にする必要はない。

4.dry-runオプションで試してみる
いきなり実行するのはよくないので、「--dry-run」をつけて実行して結果を確認する。

5.おわり
ここまでで使えるようになっているはず

2009年9月21日月曜日

DBD::mysqlのインストールができないとお嘆きの方へ

もしこの記事を読んだ方が下記のようなエラーメッセージでインストールできないでいるのであれば、きっと後述の解決策でうまくいくでしょう

t/80procs.t ................. 1/29 DBD::mysql::db do failed: alter routine command denied to user ''@'localhost' for routine 'test.testproc' at t/80procs.t line 41.
DBD::mysql::db do failed: alter routine command denied to user ''@'localhost' for routine 'test.testproc' at t/80procs.t line 41.

このメッセージは、テストスクリプトがDBに接続しにいく際のユーザ名が設定されていないために出ているもので、ちゃんと指定すればテストにパスできます

1.cpanシェルからインストールする場合

> o conf makepl_arg "--testuser=root"
> install DBD::mysql

2.tar玉からインストールする場合

perl Makefile.PL --testuser=root

Snow LeopardでPerlの開発環境を整える

最近MacのOSをSnow Leopardに入れ替えてPerlの環境を確かめたところ、残念なことにバージョンが5.10.0だったりした
なのでPerl5.10.1をインストールしてlocal::libを使えるようにするところまでを記録しておきたい
※この記事はXcode(開発環境)が入っていることが前提

そろそろMac新しいの買いたい&以前までは割と考えずにモジュール入れまくってたから次はちゃんと管理したい
などという方のお役に立てば幸いかなと

1.Perl5.10.1の入手とインストール
このへんは弾さんの記事をみてやるとよい

2.環境変数の設定
~/.basrhcに/usr/local/binを見に行くよう設定

export PATH="/usr/local/bin:$PATH"

3.perl -vで確認

$ perl -v

This is perl, v5.10.1 (*) built for darwin-2leve

これでこのユーザの環境ではperl5.10.1が使えるようになりました。

4.local::libの設定
leopardの設定と同様です

5.local::libをSVNで管理する
local::libの中身をSubversionに入れておくと、インストールした内容の記録とか、ややあって戻したいときもすぐに戻せるので便利
手順は(自分の環境では)下記の通り

$ mkdir ~/Development/svn/local-lib
$ cd ~/local-lib
$ svn import -m 'init local::lib' ~/local-lib/ file:///Users/user/Development/svn/local-lib
$ mv ~/local-lib ~/local-lib.bak
$ rm -rf ~/local-lib
$ svn co file:///Users/user/Development/svn/local-lib .

6.もとに戻したい場合
元々のPerlを使いたい場合は/usr/bin/perlを明示的に利用するか、ユーザのPATH設定を削除すれば元の5.10.0を使いにいくようになる
また、local::libを撤収したい場合は、~/.bashrcにある環境変数の設定を削除し、~/local-libディレクトリを消せばOK

2009年9月13日日曜日

DBIx::Encodingというモジュールを書いた

YAPCおつかれさまでした。

YAPC中、今まさに課題になっているDB周りの問題を解消すべくDBIx::Encodingというモジュールを書きました。
このDBIx::EncodingはDBIのサブクラスで、executeとfetchの際に指定した文字コードでencode/decodeしてくれるものです。

そもそもDBの文字コード設定がUTF8なら余り悩むこともないのですが、世の中いろいろと事情があってDB側を変更できない事も多いでしょう。
そんなときにこのモジュールを使うと、DBI側で文字コードをencodeしてinsert/updateしてくれ、selectしたときにはutf8 flagを有効にした文字列を返してくれます。

使い方はSYNOPSISにもありますが、下記の通り

my @dsn = (
'dbi:mysql:host=localhost;database=mysql;mysql_socket=/tmp/mysql.sock;',
'root',
'',
{
RootClass => 'DBIx::Encoding',
encoding => 'cp932',
},
);
my $dbh = DBI->connect(@dsn) or die;

アトリビュートに設定を渡すか渡さないかでDBIx::Encodingを利用するかしないか決められるので簡単です。

SEE ALSO
生 DBI ユーザーのための DBI Cookbook (2)

※9/21追記
githubに移しました->こちら

2009年9月3日木曜日

「実践Common Lisp」読書録3

前回は属性リストを作る関数を定義してみた。
なので今回は属性リストを複数保持する変数を定義したり、その変数の中身をdumpする関数を定義してみる。

1.変数の定義
前回作った属性リストを複数保持するための変数を定義する。
変数の定義はdefvar(define variable)マクロを使う。

* (defvar db nil)


2.変数に要素を追加
この変数に要素を追加するにはpushマクロを利用する。

* (push (music "群青日和" "東京事変" 7) db)

((:TITLE "群青日和" :ARTIST "東京事変" :RATE 7))
* (push (music "喧嘩上等" "東京事変" 1) db)

((:TITLE "喧嘩上等" :ARTIST "東京事変" :RATE 1) (:TITLE "群青日和" :ARTIST "東京事変" :RATE 7))


3.変数の中身をみる
変数の中身を確認するだけであれば、単にREPLに変数名を渡せばよい。

* db

((:TITLE "喧嘩上等" :ARTIST "東京事変" :RATE 1) (:TITLE "群青日和" :ARTIST "東京事変" :RATE 7))

ただ、これだけだと先ほど変数に格納したときに出力されたものと何ら変わらなくて面白くない。
そこで、もう少し読みやすい形に出力してみる。

4.dbの全要素を整形して出力
変数dbにはいくつかのレコードが入っているが、これを一つ一つ処理するにはdolistマクロを用いる。
また、出力内容を整形する場合にはformat関数を用いる。
組み合わせると下記のようになる。

* (dolist (record db) (format t "~{~a:~10t~a~%~}~%" record))
TITLE: 喧嘩上等
ARTIST: 東京事変
RATE: 1

TITLE: 群青日和
ARTIST: 東京事変
RATE: 7

NIL

dolistはよいとして、ここで気になるのはformat関数である。
format関数は少なくとも2つの引数を取る。
最初の1つ目が、標準出力を表すtで、2つ目がフォーマット文字列である。
フォーマット文字列の詳細はこちらのページに任せる

5.format関数
format関数は「~{」と「~}」に挟まれた部分にある指示子を処理していく。
先ほどのフォーマット文字列では最後が「~%」となっていたが、これは一つ余分に改行コードを出力するもので、先ほどの出力結果と下記出力結果で多少違う事がわかると思う。

* (dolist (record db) (format t "~{~a:~10t~a~%~}~%" record))
TITLE: 喧嘩上等
ARTIST: 東京事変
RATE: 1

TITLE: 群青日和
ARTIST: 東京事変
RATE: 7
* (dolist (record db) (format t "~{~a:~10t~a~%~}" record))
TITLE: 喧嘩上等
ARTIST: 東京事変
RATE: 1
TITLE: 群青日和
ARTIST: 東京事変
RATE: 7
NIL

最後の~%の有無で、1レコード毎に入っていた改行部分が変化しているのがわかる。

今回はこのくらいで。
次回はファイル入出力の予定。

ではまた。

2009年9月2日水曜日

「実践Common Lisp」読書録2

引き続き「実践Common Lisp」やります。

今回はLispオペレータのさわりのあたり(リスト)を。

1.リスト
Lispのリストはlist関数で作る。
list関数は複数の引数からなるリストを返す関数(まんまですが)

* (list 1 2 3)

(1 2 3)

リストは入れ子にもできる。

* (list 1 (list 1 2) 2 3)

(1 (1 2) 2 3)


2.属性リスト
シンボルとその要素を交互に並べるリストを「属性リスト」といい、属性リストはgetf関数でシンボルを指定して値を返す事ができる。

* (list :a 1 :b 2 :c 3)

(:A 1 :B 2 :C 3)
* (getf (list :a 1 :b 2 :c 3) :a)

1

実行結果からわかるように、getf関数を使うと属性リストをハッシュのように利用できる。

3.属性リストを使って関数を定義する
例えば3つのフィールド(タイトル、アーティスト、レート)を受けとって属性リストを返す関数を定義してみる

* (defun music (title artist rate) (list :title title :artist artist :rate rate))

MUSIC

defunというのはdefine functionの略で、関数定義という意味になる。
この関数を用いて曲を表す属性リスト(レコード)を作りたい場合、下記のようにmusic関数を呼べばよい。

* (music "群青日和" "東京事変" 7)

(:TITLE "群青日和" :ARTIST "東京事変" :RATE 7)


次回はここで作成した属性リストを複数保持する変数を定義したり、その変数の中身をdumpする関数を定義するなどする。