2006-09-01 [長年日記]
@ [rails] 入力エラーが発生した場合に挿入されるHTMLのカスタマイズ
railsでは入力エラーが発生すると、問題となっている項目を赤い枠で囲むために下記のようなdivタグを挿入します。
<div class="fieldWithErrors"><input type="text" name="" ... /></div>
で、これをdivタグではなくspanにしたかったので何とかオーバライド出来ないものかぐぐってみたところ、config/environment.rbに下記のように書けばいいらしいことが判明(情報源)。
ActionView::Base.field_error_proc =
Proc.new {|html_tag, instance| %(<span class="fieldWithErrors"></span>)}
これでばっちりspanタグに出来ました。それにしてもrailsってこんなHTMLの挿入までやってるんですねぇ。
2006-09-08 [長年日記]
@ Development Environment Conferenceに行ってきました
申し込み受付開始からわずか4分で定員に達したらしいのですが、運よく申し込めたので会社の人と参加してきました。たぶん資料は後々公開されると思うんで、適当に要約。
1.はてなと私の開発環境 by 伊藤直也さん
Windows + coLinux + emacs(meadow) + screen + zsh + perlshについて。emacsでよさげなelispはelscreenとsessionだそうです。この辺はだいぶ前から開発環境の定番なので特に真新しい発見はなかったですが、perlshは便利そうなので会社の開発サーバにもインストールしてみようと思いました。
2.Agile Web Development with 萌ディタ Reloaded by malaさん
続いてはLivedoor Readerで有名なmalaさんの、キーボードから萌ディタ、AutoHotkeyのお話。なん30個ぐらいショートカットキーを登録できる特殊なキーボード(?)を使っているのだとか。あとは窓使いの憂鬱とキーボードランチャーにはbluewindを使っているらしい。萌ディタはフックが簡単に登録できるのと、名前がいけてるから使っているらしい。でも残念なことに開発はもう停滞しているそうで。。。
3.Windows Environment & Vim by sencondlifeさん
はてなの舘野さんことsecondlifeさんの、vimの話 + ウィンドウズの便利ツールのお話。僕自身emacsユーザなのでvimのことは全然わかりませんでしたが、手軽さという点ではvimの方がいいのかも?と思えてきました。あとはRubyのリファレンスマニュアルをWindowsのヘルプにする話とか。確かにあれは便利そう。
4.Binary Hacks in Action by 高林哲さん
objdumpやstrace、gdbでこんなことができるんだよー、という紹介。objdumpはよく知っていましたが、straceでシステムコールとかプロセスの生成とか色々調べられるんだなーと勉強になりました。あとgdbで実行中のプロセスにアタッチしてバイナリパッチを当てる、なんていう高度なテク(ある意味ローテク?)まで紹介していました。いやーホントgdbってすごいデバッガだなぁと思い知らされました。
5.Vox/Plaggerの裏側見せます by 宮川達彦さん
Six Apartの宮川さんによるVoxやPlaggerの開発環境をさっくりと。VoxではXenにCentOS入れて、開発者ごとに仮想環境作って開発しているらしい。さらにフレームワークとしてCatalystを使っているとか!(6AさんでもCatalyst使うんですね)
個人的に参考になったのはsvk。Subversionを使っていると新機能の開発はブランチ切ってそっちで開発しますが、トランクの修正をブランチにマージするのがsvkでは簡単にできるらしい。トランク->ブランチのマージって取り込むリビジョン番号間違えると面倒なことになるのでけっこう神経使うので、さっそく来週にでもsvk導入してみようと思いました。Plaggerはブログでも少し触れられているようにかなりXPチックなテストドリブンな開発になっているようです。やっぱり単体テストがあると精神衛生上いいですよね。
6.オレポータビリティ by 青木峰郎さん
Rubyの青木さんの、さまざまなマシン、OS(Windows, Linux, Solaris, AIX, True64Unix...)とつき合っていくための処世術。色々な環境があるので、インストールするのは最小限のソフトウェアだけで、なるべくカスタマイズもしないというスタイルだそうです。ただしRubyだけは(テストのため?)安定版の全バージョンを入れて、全部のRubyインタプリターでスクリプトを実行する、みたいなツールを作っているらしい。確かに色々な環境だとなかなか足並みを揃えるのが難しいので、この人の言っていることはもっともだと思いました。
個人的には最後の青木さんの「なるべく余計なモノはインストールしない、カスタマイズしない」が僕のスタイルで、僕自身はzshやscreenとかも特に使ってないです。仕事ではけっこう色んなLinuxサーバにログインして作業することが多いのですが、そういうところだとそもそもzshってインストールされていなかったり、サーバが何台もあるとそもそもインストールするのも面倒だったりなので、どうしてもデフォルトのbashを使ってしまいます。それにそういうサーバはアカウント自体他の人と共有だったりするので、自分なりに色々カスタマイズとか出来ないんですよね。なのでzsh使えね=screenも使えねみたいな悪循環になってます*1。
ただ、今日の話を聞いてまぁそろそろそういうのをかなぐり捨ててもいいのかなぁという気がしてきたので、土日でちょっとzshとかscreen試してみようかと思ってます。
あと、会場中にはかなりvimユーザが多かったようですが、emacsの設定の話がもう少し聞けたら嬉しかったなぁと思いました。特に伊藤さんの.emacsはなんかすごいらしいので。
とにかく、今日の話を聞いて、ホント自分の環境ってもっと改善できるよなぁと思ったので早速明日秋葉原にキーボードでも買いにいこうかと思います(違)。
追記: 宮川さんの名前が間違っていたのと(失礼しました)、Voxの開発環境についてちょっと追記しました。
*1 この二つはセットで初めて威力を発揮すると思ってるので
2006-09-12 [長年日記]
@ [perl] 引数のハッシュ渡しとハッシュリファレンス渡し
よく「引数の数が多い場合はハッシュの名前つき引数で渡すべき」という話の延長で、1.ハッシュそのもので引数を渡すか、2.リファレンスを渡すかで意見が分かれたりします。
# 1. ハッシュ渡しの場合
method1(arg1 => 'test', arg2 => 'test');
# 2. リファレンス渡しの場合
method1({ arg1 => 'test', arg2 => 'test' });
2.だと{}つけるの忘れて「あーなぜか引数がうまく渡らねぇー」みたいによくはまるので、個人的には1.のスタイルが好きなのですが、2.を支持する人たちは「1.だと毎回ハッシュのコピーが起きて遅い」と言います。ではそんなに遅いのだろうかとちょっと気になったのでためしに以下のようなベンチマーク(引数7個、メソッド呼び出し3000回)を取ってみたところ、「メソッドに渡された引数を実際に参照する」というところまで考えれば、そう大差ない結果となりました。
#!/usr/bin/perl
use strict;
use CGI;
use Benchmark qw(:all);
sub hash_args {
my %args = @_;
# とりあえず引数を連結してみる
my $str = '';
for (sort keys %args) {
$str .= "$_ = $args{$_} ";
}
return $str;
}
sub hashref_args {
my ($args) = @_;
my $str = '';
for (sort keys %$args) {
$str .= "$_ = $args->{$_} ";
}
return $str;
}
$ARGV[0] ||= 3000;
my $cgi = CGI->new;
timethese($ARGV[0], {
HASH => sub {
hash_args(
aaa => '文字列のテスト',
bbb => 2,
ccc => $cgi,
ddd => [ 1 .. 10 ],
eee => 1,
fff => 'あいう',
ggg => 'かきく',
);
},
HASHREF => sub {
hashref_args({
aaa => '文字列のテスト',
bbb => 2,
ccc => $cgi,
ddd => [ 1 .. 10 ],
eee => 1,
fff => 'あいう',
ggg => 'かきく',
});
},
});
$ perl ~/tmp/args.pl 3000
Benchmark: timing 3000 iterations of HASH, HASHREF...
HASH: 1 wallclock secs ( 0.22 usr + 0.00 sys = 0.22 CPU) @ 13636.36/s (n=3000)
(warning: too few iterations for a reliable count)
HASHREF: 0 wallclock secs ( 0.23 usr + 0.00 sys = 0.23 CPU) @ 13043.48/s (n=3000)
(warning: too few iterations for a reliable count)
勝手な予想ですが、リファレンスで渡しても結局 $args->{hogehoge} みたいな感じでポインタをたどることになるので、全体的に考えればそんなに変わらないのではないかと。とにかくこれでハッシュ引数渡しを引け目なく推奨できそうです。
2006-09-13 [長年日記]
@ [emacs] M-x align が便利すぎる件
僕も初めて知りました。これはマジで便利。
my %hash = (
a => 'aaa',
xyz => 'xyz',
);
↓
my %hash = (
a => 'aaa',
xyz => 'xyz',
);
2006-09-18 [長年日記]
@ [apache] mod_fcgidをstatic linkしてapache2.2をインストール
mod_fcgidをDSOじゃなくてstatic linkする方法。本家のドキュメントに書いてありますが備忘録がてら一応。
(httpd-2.2.3.tar.gzとmod_fcgid.2.0.tar.gzを解凍) $ cp -R mod_fcgid.2.0 httpd-2.2.3/modules/fcgid $ cd httpd-2.2.3 $ ./buildconf (ここからはhttpd-2.2.3のコンパイル) $ export CFLAGS="-O3" $ ./configure --prefix=/usr/local/mod_fcgid \ --with-program-name=mod_fcgid \ --with-mpm=prefork \ --enable-shared \ --enable-so \ --enable-fcgid \ --disable-asis \ --disable-cgid \ --disable-proxy \ --disable-proxy-connect \ --disable-proxy-http \ --disable-proxy-balancer \ --disable-proxy-ftp \ --disable-proxy-ajp \ --disable-userdir \ --enable-modules='cgi' \ --enable-mods-shared='rewrite include host-alias' $ make # make install
んでインストールが完了したら、static linkされているか確認してみます。
$ /usr/local/mod_fcgid/bin/mod_fcgid -l |grep mod_fcgid mod_fcgid.c
あとは適当にmod_fcgid.conf(httpd.conf)をでっちあげればOKです(下記はrailsアプリ用の設定)。
AddHandler fcgid-script .fcgi SocketPath /dev/shm/mod_fcgid DefaultInitEnv RAILS_ENV production IPCConnectTimeout 5 IPCCommTimeout 60
2006/11/12追記: mod_fcgiのバージョンを2.0にしました。また、--enable-mods-shared='rewrite include host-alias'の部分から、actionを削除しました(しかも本当はactionsというモジュールでした...)
2006-09-26 [長年日記]
@ [perl] DBIでCan't connect to local MySQL server through socket '/tmp/mysql.sock'
MySQLの通信用のソケットファイルをデフォルトの/tmp/mysql.sockから/tmp/mysql-4.0.sockに変えていたのですが、DBIでconnectする時に何も指定しないと「Can't connect to local MySQL server through socket '/tmp/mysql.sock'」というエラーになります。
ぐぐって見るとこんなページにはconnectする際のDSNにport=/tmp/mysql-4.0 とあるのですが、これでも解消しませんでした。んで、DBD::mysqlのドキュメントにmysql_socketというオプションがあったので、
DBI:mysql:database=test;host=localhost;mysql_socket=/tmp/mysql-4.0.sock
という風に指定するとうまくつながりました。DBD::mysql 2.9003なんですが、昔はportでも大丈夫だったんですかねぇ。
2006-09-28 [長年日記]
@ [web] subversion でぐぐると本家より@ITが上にくる
SEOの為せるわざなんですかね。本家のURLがわからなくてぐぐったのですが、本家本元より上に来るってちょっとどうなんでしょうか。
@ [debian][vmware] etchでVMwareが起動しない
なんかapt-get dist-upgradeしていたらいつのまにかVMwareが下記のエラーと共に起動しなくなりました。
/usr/local/lib/vmware/bin/vmware: error while loading shared libraries: libexpat.so.0: cannot read file data: Error 21 /usr/local/lib/vmware/bin/vmware: /usr/local/lib/vmware/lib/libpng12.so.0/libpng12.so.0: no version information available (required by /usr/lib/libcairo.so.2) /usr/local/lib/vmware/bin/vmware: /usr/local/lib/vmware/lib/libpng12.so.0/libpng12.so.0: no version information available (required by /usr/lib/libcairo.so.2)
ぐぐってみると $ LD_PRELOAD=/usr/lib/libdbus-1.so.3 vmware でlibdbus-1.3をみるようにすると起動する、とあったのですが、私の環境ではこれではだめでここの315の人の言うように、libdbus-1-2を削除したらなんとか起動しました。
つーかdbusって何?って感じですがとりあえず動いているので深追いはしないことにします。