D-7 <altijd in beweging>

Day to day life of a Perl/Go/C/C++/whatever hacker. May include anything from tech, food, and family.

2006年07月


最後の客だったのでバー「カエサリオン」の田中さんと話してきた。彼と俺は全く違う業界にいるし、歩んできた人生も全く違うのだが、でも色々聞いて色々とためになった。彼はっもうかれこれ20年以上いわゆる水商売をしている。ひいて俺は技術者としては10年、社長業としては半年くらい。その差を、田中さんのカクテルを飲みながらゆっくり聞けた。


彼の作るカクテルは年月によって干涸びてるのではなく、より艶やかになっている。それはカクテルの出来だけではなく彼の客との距離の取り方、話しかけるタイミング、そういったものが全て合わさってそうなっている。それを少し感じられた。


このごろようやく他人の意見を聞けるようになったと思う。


俺は天才ではないし、たいした才能も持ってないと思うので正直社長業なんてどうかと思う日も多い。けれども俺が思うに自分で世界を変えて行ける人ではなくとも、先人の言葉に耳を傾けていける社長ではありたい。正直、この先どうなるのかはわからんが、世界一の企業にならんでもいい、しっかりと足を地に着けた仕事をして行きたい。


ただひとつだけ納得いかないのはカエサリオンの酒は微妙に割高感が残る事。うまいんだが・・・。なんでだ。まぁ、人生の教訓を得られるのでいいとする。酒としては割高感が残るが、過ごした時間は払ったお金の分だけの価値はあった。


俺がつきあっている人たちはこういう事にはお金を使わない人たちだけれども、今までもこんな感じで無駄に見える事に投資してきて必ずいい事があったから、別にいいや。


楽しかった。



    このエントリーをはてなブックマークに追加 mixiチェック



http://use.perl.org/articles/06/07/23/2232250.shtml



search.cpan.orgがダウンしてるとなんとなくやる気がでない罠。あがっててもでない、という噂もちらほらありますが。


っつーか、なんか、ファイルディスクリプター扱うとか、そういうレベルのコーディングって嫌いじゃないけど、脳がうごかん。がんばるぞ。



    このエントリーをはてなブックマークに追加 mixiチェック


この間からDateTime::TimeZoneをほげほげしてたんですが、結局のところDT::TZをいくらXS化して、インスタンス毎のに数個あるSVを小さくしたところでメモリフットプリントはほとんど変わらない、という現実にぶちあたりました。


前回このコードをいじってた時にも同じような事にぶちあたったので色々悩んだのですが、多分XSコードからPerlに構造体を渡す時にSVを作ってるからなんじゃないかと、はたとおもいあたったのです。



typedef struct hoge {
IV poop;
} hoge;

IV
get_poop(self)
SV *self;
PREINIT:
hoge *myhoge;
CODE:
myhoge = get_hoge(self);
RETVAL = myhoge->poop;
OUTPUT:
RETVAL

ってした時に、もちろんIVはint32とかなのでSvIVよりは小さいんだけど、結局裏でRETVALはnewSViv(myhoge->poop)されてるからSV分のメモリをくっちまうわけなんだな。ただこのpoopをPerl側で使う部分が少なければ少ない程、一旦確保したメモリ領域を再利用できる可能性が高いので、効率はよくなる。そんなわけでアクセッサーを使う機会が多いとC structで対処する分のメモリ使用削減率というのは結局SVが作られてしまうのでガクンと落ちる訳だ。


同様に、newSV*()を呼ぶ回数が増えればそれだけCコードに変換した分の効率アップ分が削ぎ落とされる。


ということはXS化でもっとも恩恵を受けるにはアルゴリズム全体をCで書く事なんだろうな。DateTimeの場合は日付/時間計算を全部Cからできたら最高だと思われる。



    このエントリーをはてなブックマークに追加 mixiチェック



"私には無理だと思って, CPUを無駄に使うチョイスをとるぐらいなら, SWIGでサクッと仕事を終らせたほうがよさげです. "


http://chasen.org/~taku/blog/archives/2006/07/_swig_1.html



この辺りは実は僕も否定する気がないのです。例えば工藤さんにSWIGを使えというのが前回私が書いた趣旨ではないのですね。僕としてはそこ以前に、「ライブラリはライブラリ作者が、バインディングはその言語を理解し、使用している人が書くべきだ」という観点の元に立っています。


先に言っておくと、以下は理想論というか、僕がメンテナーだったら、程度の妄想なので現状の例えばmecabの配布方法を変えろ、ってことではないので、その辺を含めて読んでください。


工藤さんはC/C++で優れたライブラリを書く人です。でも工藤さんが、python, php, ruby, perlでそれぞれの言語にあった書き方をするのは不可能だと思うのですね。そして機械的にコードを作成するのもいいんだけど、その前にオープンソースのプロジェクトとしてはそれぞれの言語の人たちと連携を取ってその道のエキスパートにバインディングを書いてもらうのが一番正しいような気がするのです。


つまりライブラリと一緒にバインディングを提供する必要もないんじゃないか、という立場にたっているので、そもそもSWIGを使う理由が僕には思い当たらないのです。ライブラリ作者がバインディングの作成をコントロールする、という概念自体が僕にはなじめないものなのです。


今思いついたのですが、もう一つのアプローチとしては、インターフェースはライブラリ作者が定義するが、実装はバインディングの作者が担当する、というのもありかもしれません。そうすれば僕が勝手にText::MeCabかいちゃったーみたいな感じではなく、バインディング開発者とライブラリ開発者を分けつつもAPIの統合と開発者同士の対話が生まれて僕も工藤さんもハッピーな形でできるのかもしれません。とりあえず思いつきですが。


で、まぁ色々書いているのですが、結局のところ工藤さんが僕とかに「CPANのText::MeCabの配布をやめろ!」とか言わない限りはせいぜい「emacsよりviのほうがいいんだよ!」みたいなレベルの意見なのです。何事もケースバイケースなので、一概にSWIGが使えないとはいいません(それでもあの生成されるコードは気持ち悪いと言いたい(笑))。工藤さんもXSに対してその立場だと思うのでそこらへんはバランスの問題ですね。


ここからは全く関係ない蛇足ですが、逆に言うと、オープンソースのプロジェクトは是非そういう、第三者が使うということやバインディングを作る人がいるという事を前提に作ってもらいたい、という願望はあります。ここでいうユーザーやバインディング開発者は、決して決してライブラリの作者ほどにライブラリに愛着はないし、開発するにあたって作者と同じ愛着を持つ必要性はないと思うのです。mecabに関してはmecab.hを見ただけでバインディングを作れたので問題はなかったですが、たまに「おまえ、これは他人に使ってもらう気あるのか、ゴルぁ!」という叫びをこらえきれないライブラリとかがあるのですね。


バインディングを作る人は決してそのライブラリ自体の「エキスパート」である必要はないし、だいたい作者以外はそれほど細かいところに興味を持たないのが前提で書いて欲しいと切に願います。



    このエントリーをはてなブックマークに追加 mixiチェック


タイ料理で辛いもの食って腹が痛いのをわかっているのに、ネパール料理屋でカレー。カボチャと鶏肉のカレー、うま。店をでようと思ったら傘を持って行かれてた。どうしようか悩んでたら店のおっちゃんが傘を一本持ってけとくれたのでそれをさして事務所へ。



    このエントリーをはてなブックマークに追加 mixiチェック


昨日のタイ料理でおなかが痛い。うう、しくしく。



    このエントリーをはてなブックマークに追加 mixiチェック


珍しく夢を見た。なにげなくギターを取り出してピアノマンを歌いだしたら、部屋の隅のほうのピアノのところにビリー・ジョエルがいて、「あ、それ俺の曲じゃん」とか言って歌いだすという。夢の中で結構聞き入ってる自分がいた。



    このエントリーをはてなブックマークに追加 mixiチェック


add_duration()を高速化するべく、_handle_offset_modifier()をCで書き直してるのだが1秒ずれる。



t/19leap_second.........NOK 121
# Failed test 'UTC time end of leap second day'
# in t/19leap_second.t at line 750.
# got: '1997-07-01T22:59:58'
# expected: '1997-07-01T22:59:59'
t/19leap_second.........NOK 144
# Failed test 'dt is 2006-01-01T00:00:00'
# in t/19leap_second.t at line 893.
# got: '2005-12-31T23:59:60'
# expected: '2006-01-01T00:00:00'
t/19leap_second.........NOK 146
# Failed test 'dt is 2006-01-01T00:00:00'
# in t/19leap_second.t at line 908.
# got: '2005-12-31T23:59:60'
# expected: '2006-01-01T00:00:00'
# Looks like you failed 3 tests of 148.
t/19leap_second.........dubious
Test returned status 3 (wstat 768, 0x300)
DIED. FAILED tests 121, 144, 146
Failed 3/148 tests, 97.97% okay

Leap second のハンドリングが変なんだろうけど、どこだ一体・・・



    このエントリーをはてなブックマークに追加 mixiチェック


タイ料理食べに行って、そのあといつものバー。今日は客が俺一人。まぁ日曜だしな。ってことでジントニック、メンタ、ビール、スコッチ3杯。人生と下半身について語って帰宅。



    このエントリーをはてなブックマークに追加 mixiチェック


PerlGuts Illustrated. 昔からあるんだけど、いつもURLを忘れるんだよな。



http://gisle.aas.no/perl/illguts/




    このエントリーをはてなブックマークに追加 mixiチェック


実はPOEを見捨てたくて、Event, IO::Pollとか見てるんだけど、ちゃんとしたフレームワークはないのねぇ。自分で作るんでいいんだけど、なんかないかなぁ。



    このエントリーをはてなブックマークに追加 mixiチェック


チューニングはだいたい終わったとおもうだよ。Devel::DProf、使いまくってボトルネック探しまくった。



    このエントリーをはてなブックマークに追加 mixiチェック


うちになぜか10人も集まって麻雀。本物組とDS組で別れてたのだが、DSでは7万点も取ってHろゆきをハコったのだが、本番のほうでは半荘3回の間で2回しかあがれず、しかも最後は大三元に振り込んではこられるという始末。一応いい訳させていただくと、振り込んだのはピンズであって役牌じゃねーぞ。ちきしょう。


寝たのは午前9時くらい。



    このエントリーをはてなブックマークに追加 mixiチェック


読者のあなた達(特にリアルでの知り合い)、この日記は基本的に技術と飯の日記です。時々見える女の影とかは全部幻ですから、スルーしなさい。



    このエントリーをはてなブックマークに追加 mixiチェック



http://svn.sourceforge.net/viewcvs.cgi/perl-date-time/modules/DateTime-TimeZone/branches/xs/



心臓に毛の生えているハッカーなあなた、是非試してみて。



    このエントリーをはてなブックマークに追加 mixiチェック


ほい、ということでプロファイルをとってみた。



daisuke@beefcake DateTime-TimeZone-XS$ perl -Mblib -d:DProf test.pl
timethis 50: 43 wallclock secs (24.05 usr + 6.99 sys = 31.04 CPU) @ 1.61/s (n=50)

daisuke@beefcake DateTime-TimeZone-XS$ dprofpp
<snip>
Total Elapsed Time = 12.00626 Seconds
User+System Time = 2.216263 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
197. 4.368 4.368 38300 0.0001 0.0001 DateTime::TimeZone::spans
77.5 1.719 2.324 19202 0.0001 0.0001 DateTime::TimeZone::new
41.5 0.921 4.453 38300 0.0000 0.0001 DateTime::TimeZone::_spans_binary_
search
19.1 0.424 0.424 19603 0.0000 0.0000 Params::Validate::_validate
15.5 0.345 0.332 19202 0.0000 0.0000 DateTime::_calc_local_components
12.6 0.281 1.890 19200 0.0000 0.0001 DateTime::_handle_offset_modifier
5.96 0.132 2.166 19202 0.0000 0.0001 DateTime::_calc_local_rd
5.05 0.112 6.284 19150 0.0000 0.0003 DateTime::set_time_zone
4.29 0.095 0.095 432 0.0002 0.0002 DateTime::TimeZone::xs_register
3.47 0.077 0.077 1196 0.0001 0.0001 DateTime::TimeZone::find
2.30 0.051 0.146 432 0.0001 0.0003 DateTime::TimeZone::register
2.21 0.049 0.211 20 0.0025 0.0106 DateTime::BEGIN
1.67 0.037 0.061 786 0.0000 0.0001 DateTime::TimeZone::BEGIN
1.53 0.034 0.071 299 0.0001 0.0002 DateTime::Locale::_register
1.31 0.029 0.317 4 0.0074 0.0792 main::BEGIN

おーっと、spans()を呼び過ぎだ。これは元のPurePerlコードが$tz->{spans}を直接扱うので、例えばspanリストのサイズとかを必要とする時にscalar @spansみたいな事をしないといけないからだと思ったので、



IV spans_len(self); /* spansのリスト数を取得 */
IV span_at(self, i); /* i個目のspan要素を取得 */
SV *max_span(self); /* 最大のspanを取得 */

というメソッドを追加



daisuke@beefcake DateTime-TimeZone-XS$ dprofpp
<snip>
Total Elapsed Time = 7.434086 Seconds
User+System Time = 0 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
0.00 1.490 2.259 19202 0.0001 0.0001 DateTime::TimeZone::new
0.00 0.543 0.588 19202 0.0000 0.0000 DateTime::_calc_local_components
0.00 0.504 0.504 19603 0.0000 0.0000 Params::Validate::_validate
0.00 0.157 0.041 19202 0.0000 0.0000 DateTime::_calc_local_rd
0.00 0.130 -0.462 38300 0.0000 - DateTime::TimeZone::_span_for_date
0.0000 time
0.00 0.099 0.099 1196 0.0001 0.0001 DateTime::TimeZone::find
0.00 0.096 0.096 38300 0.0000 0.0000 DateTime::TimeZone::max_span
0.00 0.076 -0.423 19200 0.0000 - DateTime::_handle_offset_modifier
0.00 0.068 0.113 786 0.0001 0.0001 DateTime::TimeZone::BEGIN
0.00 0.066 0.066 38300 0.0000 0.0000 DateTime::utc_rd_as_seconds
0.00 0.056 0.056 432 0.0001 0.0001 DateTime::TimeZone::xs_register
0.00 0.052 0.108 432 0.0001 0.0002 DateTime::TimeZone::register
0.00 0.051 0.051 140900 0.0000 0.0000 DateTime::TimeZone::span_at
0.00 0.040 0.108 7 0.0057 0.0154 DateTime::Locale::BEGIN
0.00 0.040 0.319 4 0.0099 0.0797 main::BEGIN
daisuke@beefcake DateTime-TimeZone-XS$

おお、消えた。スバラシ。



    このエントリーをはてなブックマークに追加 mixiチェック


2年前?くらいに一度挫折したDateTime::TimeZoneのXS化なんだが、もう一回やってみた。1000行弱のパッチで、今回は全てのタイムゾーンを



DateTime::TimeZone->new(name => 'Asia/Tokyo');

みたいにしてロードした場合にこれまでのPurePerl版と比べて5MBほどのメモリ消費量の差がある。ただ、なぜか速くない。なぜだろうなぁ。



    このエントリーをはてなブックマークに追加 mixiチェック


    このエントリーをはてなブックマークに追加 mixiチェック


さんまの握り(20%オフ)、キムチ、納豆1個。飲むまいと思ってたがなりゆきでビール。



    このエントリーをはてなブックマークに追加 mixiチェック


久しぶりに飲み過ぎました。よっぱらいすぎです。まともにタイプできません。



    このエントリーをはてなブックマークに追加 mixiチェック

このページのトップヘ