2006年1月アーカイブ

起き抜けCPANアップロード



Class-DBI-Loader 0.29アップロード。おもにClass::DBI::Pgの正しいバージョンを使わせるため。


起き抜けサムライ



昨日はまた遅くまで起きてて(といっても3時くらい)、今朝朝起きてメールを見たらテレカンの招集メールが来ていて時間をみたらちょうどそのテレカンが始まる時間でやんの。っていうか、招集かけるの遅いよ・・・その後ちょこっと話してからデータファイルをちょこちょこっと作成。


ふっと一息ついた所で何故かサムライソウルの耳コピを始めたり。基本はD/A/G。ちょっとおもしろい音が時たま入ってる感じ。さて、お遊びはおしまいで仕事しますよー。


東横インの謝罪



東横インの反省が深すぎて、謝罪アプレット登場。



http://www.toyoko-inn.com/index2.html



実は東横インは大好きでよく使っていたのだけど・・・もう少しやりかたを考えろよ>Web担当。だいたいJavaアプレットなんかおくなっつーのw


Senna-0.11



Senna.pmの0.11書いた。rev73以降のlibsennaを使う場合、こっちを使わないと



my $cursor = $index->search(...);
while (my $r = $cursor->next) {
....
}

が無限ループになっちゃうから気をつけようぜ。


ペストリー@イエンセン



一昨日は同窓会の後、Oの家に泊まり、昨日はそのままGのうちにお泊まりしてしまって今朝(わりと)早く徒歩で家路についたら、普段通る事のない道を通っているうちにデニッシュで有名なJENSEN(イエンセン)発見!デンマーク大使館御用達との噂には聞いていたが、店が開いている時間にここを通るのは初めて。


事務所で腹をすかせてぴーぴーいってるであろう相棒君のために多めに買って来たのだが、でてきてみたら風邪でお休みのため、とりあえずひとつはおいらがぱくぱく。


う、うめ~~~~~!うめええよう。この生地はうまい・・・!あーあ、これを食べれないなんてもったいない。


Clas::DBIをプロファイリング




http://d.hatena.ne.jp/nekokak/20060127/1138335790



Class::DBI v3.0.14で上記URLにあったシンプルなRetrieveをDevel::DProfでプロファイリングしてみた。



/usr/local/bin/perl
  -MNikkiSite::Data::Loader -d:DProf -e '
      for(1..10000) {
         my $it = NikkiSite::Data::Users->search({ uid => "daisuke" });
         while (my $rec = $it->next) { print $rec->uid, "\n"}
      }'

最初、1..100くらいでやってみたのだけど、これがロードタイムのほうが遥かに大きくて、base::importとかBEGINブロックとか、そういうのばっかりがカウントされるので、10000回まで大きくしてみた。

で、これをdprofppでみてみる:

daisuke$ dprofpp -f 'YAML|Params::Validate|DateTime|NikkiSite' -O 20
<snip>
Total Elapsed Time = 18.86988 Seconds
  User+System Time = 7.494887 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c  Name
 8.47   0.635  0.635 162584   0.0000 0.0000  Class::Accessor::Fast::__ANON__
 5.42   0.406  0.996  10000   0.0000 0.0001  Class::DBI::SQL::Transformer::_do_
                                             transformation
 4.95   0.371  2.363  10000   0.0000 0.0002  Class::DBI::sth_to_objects
 4.92   0.369  0.376 100802   0.0000 0.0000  Class::Data::Inheritable::__ANON__
 4.58   0.343  0.839  10185   0.0000 0.0001  DBIx::ContextualFetch::st::_untain
                                             t_execute
 4.54   0.340  1.699  10000   0.0000 0.0002  Class::DBI::transform_sql
 4.31   0.323  0.323  10186   0.0000 0.0000  DBI::st::execute
 4.06   0.304  0.789 130776   0.0000 0.0000  Class::DBI::Column::name_lc
 4.00   0.300  0.300  10106   0.0000 0.0000  DBD::Pg::db::_ping
 3.63   0.272  1.064 130096   0.0000 0.0000  Class::DBI::Column::__ANON__
 3.31   0.248  0.248  71077   0.0000 0.0000  DBI::common::FETCH
 3.23   0.242  0.241  20010   0.0000 0.0000  Class::DBI::_require_class
 3.03   0.227  0.328  20000   0.0000 0.0000  DBIx::ContextualFetch::st::fetch
 2.98   0.223  1.382  20000   0.0000 0.0001  Class::DBI::Iterator::next
 2.92   0.219  0.785  10000   0.0000 0.0001  Class::DBI::Search::Basic::_search
                                             _for
 2.82   0.211  1.039  20000   0.0000 0.0001  Class::DBI::Search::Basic::_qual_b
                                             ind
 2.39   0.179  0.179  40142   0.0000 0.0000  Class::DBI::ColumnGrouper::group_c
                                             ols
 2.19   0.164  0.277  10000   0.0000 0.0000  Class::DBI::_fresh_init
 2.13   0.160  0.254  10000   0.0000 0.0000  DBD::_::db::prepare_cached
 2.13   0.160  0.340  10000   0.0000 0.0000  Class::DBI::_my_iterator

ふーん、結構色々やってるなぁ。name_lc()とかはキャッシュするだけでカットできる(Class::DBI::Column::__ANON__も同じname_lcを使ってるからその分だけはやくできる)。あとのはもう、コールスタックを減らすくらいしか最適化の場所がないような・・・

というわけで、時間もないので一番簡単にわかるところで2行ハックして再度プロファイリング。

  # Class/DBI/Column.pm
  use strict;
  use base 'Class::Accessor::Fast';
  use Carp;

__PACKAGE__->mk_accessors(
qw/name name_lc accessor mutator placeholder is_constrained/
);

<snip>

sub new {
my $class = shift;
my $name = shift or croak "Column needs a name";
my $opt = shift || {};
return $class->SUPER::new(
{
name => $name
name_lc => lc $name,
accessor => $name,
mutator => $name,
_groups => {},
placeholder => '?',
%$opt,
}
);
}


さー、これで10000回走らせてプロファイリング



daisuke$ dprofpp -f 'YAML|Params::Validate|DateTime|NikkiSite' -O 20
Total Elapsed Time = 16.16692 Seconds
User+System Time = 7.034115 Seconds
Exclusive Times
%Time ExclSec CumulS #Calls sec/call Csec/c Name
8.15 0.573 0.573 162584 0.0000 0.0000 Class::Accessor::Fast::__ANON__
6.38 0.449 2.011 10000 0.0000 0.0002 Class::DBI::sth_to_objects
5.60 0.394 0.394 10186 0.0000 0.0000 DBI::st::execute
5.13 0.361 0.368 100802 0.0000 0.0000 Class::Data::Inheritable::__ANON__
4.49 0.316 0.316 10106 0.0000 0.0000 DBD::Pg::db::_ping
3.67 0.258 0.887 10000 0.0000 0.0001 Class::DBI::SQL::Transformer::_do_
transformation
3.67 0.258 0.383 20006 0.0000 0.0000 Class::DBI::ColumnGrouper::find_co
lumn
3.54 0.249 0.777 10185 0.0000 0.0001 DBIx::ContextualFetch::st::_untain
t_execute
3.43 0.241 0.651 130096 0.0000 0.0000 Class::DBI::Column::__ANON__
3.11 0.219 0.226 20010 0.0000 0.0000 Class::DBI::_require_class
3.06 0.215 1.535 10000 0.0000 0.0002 Class::DBI::transform_sql
2.94 0.207 0.566 10000 0.0000 0.0001 Class::DBI::_live_object_key
2.83 0.199 1.421 20000 0.0000 0.0001 Class::DBI::Iterator::next
2.66 0.187 0.953 20000 0.0000 0.0000 Class::DBI::Search::Basic::_qual_b
ind
2.66 0.187 0.316 10000 0.0000 0.0000 Class::DBI::_fresh_init
2.66 0.187 0.308 30064 0.0000 0.0000 Class::DBI::ColumnGrouper::primary
2.45 0.172 0.738 10000 0.0000 0.0001 Class::DBI::Search::Basic::_search
_for
2.32 0.163 0.163 40142 0.0000 0.0000 Class::DBI::ColumnGrouper::group_c
ols
2.00 0.141 0.230 10000 0.0000 0.0000 Class::DBI::Search::Basic::new
2.00 0.141 0.285 30000 0.0000 0.0000 Class::DBI::_attrs

ほい、name_lcは消えた。2行で10%違ったらたいしたもんだと思います。ふーん、なんかまだ色々できそうな予感。怪しいものとしてはColumnGrouperかな。


ばたばた



週末はバタバタしてて、あんまり返事とかちゃんとできなかったなぁ。みなさんごめんね。


prototype.js → Template




http://d.hatena.ne.jp/amachang/20060128/1138479278



ヤバす。これって、JSONと組み合わせると最強かも。イメージだけど、こんな感じ。



function handleAjaxResponse(request) {
var data = eval(request.responseText);
var template = new Template("...");
$(target).innerHTML = template.evaluate(data);
}

あ、というかテンプレートそのものをJSONに埋め込む事もできるじゃん。



function handleAjaxResponse(request) {
var data = eval(request.responseText);
var template = new Template(data['template']);
$(target).innerHTML = template.evaluate(data);
}

ヤバす。←しつこい


ぷち同窓会雑感




  • 16年ぶりくらいなのに皆顔かわらねぇ。

  • 意外とお互いよく覚えてる。

  • 知られたくなかった事ほど知られてる。

  • 意外なほど変な接点がある。

  • 今回会った人達が「一般」だとすると、俺の知り合いはやっぱり濃い。つーか、本当に。

結構片付いた。



足の踏み場は完全にできたぞー。トイレも掃除したし、風呂も掃除したし、洗濯もガンガン。なんていうか、今までは人間の住む所じゃなかったのが今はただかなり汚いだけの部屋になったぞ!(笑)


今日はこれから最後のゴミ出しに行ってからぷち同窓会。


カンカチート



羊の蒸し焼き?みたいなもんらしい。ググってもでてこなかった。塩胡椒、香辛料、唐辛子を塗り込んで蒸し焼き。


んー、んー。今日片付いたら、来週あたりなんかがーんと作るか!でも、片付かないに30000ギル。


ゴミを半分くらい出して、色々とお掃除用品買ってきた。


Class::DBI::Loader 0.28 / Class::DBI::Plugin::DateTime



MANIFESTがアップデートされてなかったアルよ。もう一回アップロード。


Class::DBI::Plugin::DateTimeはただいま修正中。has_interval()が全然動いてなかったよ。


なんでこんなに散らかっているんだ。



片付け中。すげぇ。なんでこんなに散らかっているんだ?ありえん。洗濯機回して、クリーニングに出して、本は本棚へ。大量にあるペットボトルを処理して、すでにゴミ袋5杯満杯。で、ただいま掃除から逃避中。うわー、クイックルワイパーとゴミ袋がない。買ってこなきゃ。


王様のブランチの部屋探しで六本木の物件やってる。あそこ知ってるー。知り合いが住んでたですよ。


おめでとう。



誕生日おめでとう


Class::DBI::Loader



昨日の0.26 に続いて0.27 を先ほどアップロードしますた。


焼き鳥@中目黒



中目黒で駅にもほどちかくていい感じの焼き鳥屋を教えてもらった。焼き鳥屋に入るのに並ぶくらい混んでるってのがネックだが、味とかはいい感じ。でっかいネタとわかりやすい味。別にどうってことはないといえばないのだが、気持ちは落ち着く。


その後向かいの通りのバーでスコッチをすこっち飲んだ。


さびしー。



ベトナム料理を食べに行ってきた。本当、あいかわらずうまい。この店はたまらんなー。かえり、もう一件寄りたかったのだけど行ってみたら満席。しょうがないので帰宅。でも飲み足りなくて飲み足りなくて、寂しくて寂しくて、メールしまくり。


誰も捕まらないのでしょうがなく駅でラーメン食って、帰ろうかなと思ったらタクシーおらん。終電直後だからか。しょうがないので歩く。てくてく。30分くらいかな。ひさしぶりに駅からバスとかではなく歩いたわ。


飲み足りないけどラーメンくっちゃったしなぁ。


Class::DBI::Loader + Class::DBI::Pg



Sebastianからメール来た!メンテナーになりました。パチパチパチパチ。とりあえず予定パッチは全部Pg系統:



  • Class::DBI::PgのPostgreSQL8.x系統への対応

  • Loaderでテーブル定義したあとのdisconnect


でもまだどこにレポジトリがあるか教えてもらってないや・・・orz


サムライソウル



最近こんな時間に起きてる事が多くて、フジテレビで時間稼ぎにやってる歌番組?でウルフルズの「サムライソウル」が毎晩かかっているのを見ているわけだが。なんかいい感じに聞こえてきた。これはちと歌いたい。っていうか、そのうち購入決定ですね。歌いたいですし。


あ、「めざにゅ~」始まった。


Xango, Class::DBI::Loader, Class::DBI::Pg



新バージョン、全部出した。Xangoのバグが一番馬鹿だった。


Class::DBI::Loader commit rights



コミット権限もらったよ。パッチかもーん!


SSO、書いた。



sso.mydomainにぶっとばして、ログインしてwww.mydomainにもどして、さらにクッキーでほげほげして、元に戻された先ではXMLRPCでsso.mydomainにてチェックして・・・そんな仕組みを書いてみたですよ。


いい感じー。


feed://ってなんじゃ?



日記才人のクローラーが全然動いてなくて、おかしいな、おかしいなと思ったんだけどよくみたらfeed://で始まるURLがあって、これがXangoの中でほげってた。多分Auto-Discoveryで見つけてきたんだろうけど、クローラーのロジック変えてとりあえずデータベースに登録しないようにしておいたよ。


とりあえずググってみて最初のリンク



http://www.25hoursaday.com/draft-obasanjo-feed-URI-scheme-02.html



ライブドアの日々。



さて、長い事ストーカーを恐れて自分の勤め先とかを敢えて書かずに来たのだが、ライブドアである。日本に帰ってくる時になんの会社か知らずに誘ってくれる人がいたのでサクッと入った先がLDで、結果的にそこに7ヶ月弱いた。自分が関係した会社の中でこんな騒ぎに巻き込まれた事はないので自分の中での整理の意味もこめて書いておこうと思う。


LDの仕事内容自体は嫌いではなかった。いわゆるポータル事業を担当している部署にいたわけだあが、エンジニア主導の開発であったり、自由な雰囲気等もふくめて仕事自体はとてもやりやすかった。エンジニアの面々も(狭い世界の話ではあるが)日本の中では相当な数のCPANモジュール作者もいたし、その他のスタッフも(一癖も二癖もある人も相当いたが)かなり「使い勝手のいい」人が多かった。若い人が率先して矢面に出てビジネスをしている雰囲気も好きだった。


結局あの会社を辞めたのは特に何が問題、というわけではなかった。要はお金で折り合いが着かなかっただけの話で、きっとそこさえなんとかなってたら未だにあそこで働いていた可能性は高い。実際、俺は友達をあの会社に誘った。今となってはちょっと後悔しているけどお金の事以外は色々と楽しい会社だと思ってたのは事実だし・・・。


ただ正直、



  • プロ野球→放送業→選挙と、ここまで堀江さんが暴走するとは思ってなかった

  • ここ数日明らかになっていっているような杜撰なお金の操作をしているとは思ってなかった


残念というかなんというか。なんで他のところで目立ちつつ、違法(すれすれ?)行為をしているのかなぁ。道義的にはもちろん悪い事はしてはいけないのだが犯罪に手を染める人というのはこっそり、誰にもバレないようにやるものなんとちゃうのか。そういう自覚がなかったのだとしたら・・・なんというか、ガキ?


某金融系の仕事の友達はいつもいつも「LDは株式市場を馬鹿にしている」というような事を俺に言っていたが、こうなってみると本当にそうだったんだなぁ、と。多分LDに在籍したことがなかったら今回の件は「馬鹿」と言って冷ややかな目で見ていたと思うんだけど、自分は現場にいた人だから連日の報道を見ていると本当、現場の人達が可哀想でしょうがない。比較的安い賃金の上かなり短い納期であのサービスを立ち上げている人達は上層部のワガママに付き合いながらがんばっているので、メディアも現場の人達はいじめないであげてほしいなぁと思う。


堅実に仕事しような。


あう。今見たら



今見たら色々問題あったなぁ。とりあえずシングルサインオンでも書くかな。


(追記)うーん、実はSSOよくわかってなかった。書こうと思ったら思考停止しちゃったよ。


ちょっといいもの書いた。



この1年くらいずっとその都度その都度Masonでスクラッチからサイトを書いていたのだが、日記才人も書いたし、その後数件書いたのでもう大分やり方がわかってきたし、仕事でサイトを何個も作る事になりそうだから俺用フレームワークを書いた。別にMaximum Flexibilityなんていらんから、俺のやり方に一番あっていながら、それでも10行くらい書くとサイトが一応立ち上がるよーなもん書いてみた。


ちなみにAppごとの設定はSledge風味な考えのもと、もう少し自分風に書いてみたのです。とりあえずPerlファイルは二つ、あとはApache用の設定ファイルとsite.confというYAMLファイルさえあればMasonサイトとしてまがりなりにも動くですよ。うほ。これでバリバリサイト作れますね!




これ、多分バッドノウハウだけど、DBIx::SearchBuilder::Handle::Pgで、8.1.2が動かない。うほうほ。問題はsequenceを解析する正規表現で、この表記が7.x系と8.x系だけで変わったと思ったら、どうも8.1.0 から8.1.2の間にも変更されてるっぽい。とりあえずまだちゃんと解析してないけど、なんちゃってでも一応マッチする正規表現を107行目に入れると動く。以下が俺の修正版:



# Regexp from DBIx::Class's Pg handle. Thanks to Marcus Ramberg
if ( defined $foo->{'COLUMN_DEF'}
&& $foo->{'COLUMN_DEF'}
=~ m!^nextval\(\(?'"?([^"']+)"?'(?:::text\)?)?::regclass\)!i )
{
return $self->{'_sequences'}{$table} = $1;
}

っていうか、今コメントみたらDBIx::Classからとってあるのね。ということはDBIx::Class 0.40もPostgres 8.1.2に対応してないと見た。


...And Let’s Leave All The Bad Blood



下のエントリにClass::DBI::LoaderのメンテナーについてのIRCログを宮川さんがコピペしてくれたわけだが、どうもDBIx::Classを押している人達というのは口が悪いと言うかなんというか。いいじゃん、別に普通にくれればさぁ。


ま、いいのです。どちらにしろ俺個人としては使えるソフトウェアであればどっちでもいいし、そんな事sriやtonyの諍いは大した事じゃないと思っているので(問題があるなら自分でハックしちゃうよ)、別にどっちかの肩を持ちたいわけではない。ただただ、Class::DBI::Loader::Pgを使うときに、Postgresql 8.x系だとCPANからそのままの状態だとつかえねぇんだよ!はやく直したいんだよ!


ということで、はよメールくれ、Sebastian。おいらは思想的にではなく、実務的にこれが必要なの。


日記才人引っ越しした



まだちょこちょこ引っ越し終わってませんが(svn引っ越ししないとなぁ)、一応動くはずっすー。


転送中!



ちょっと順番間違えちゃったけど、DNSが切り替えられそうなので今データを転送中。



-bash-2.05b$ scp nikki-site.dump daisuke@hogehogehoge:~/
Password:
nikki-site.dump 8% 27MB 78.8KB/s 59:47 ETA

・・・げ、300MBか。結構あるなー。これをロードしたらだいたいできあがりのよーな気がするぞ。


日本和装のCM



日本和装のCMの天海祐希がイカす。ちゃらちゃらとしたガキンチョとかと比べるとほんとに決まってるよなー。カッコいい。


Class::DBI::Loader / Class::DBI::Pg



なんかもうこの二つのモジュールはメンテされてないとか言うメールに出会ったのでSebastian Reidelにモジュールのオーナーシップをもらえないかメールしてみた。なんとな~く返事が返ってこないような気もするんだが、まぁやらないよりマシだろ。


あとついでにDBIx::Class::Loaderのドキュメントを読んだらちょっとがっくり。



Class::DBI::Loader and Class::DBI are now obsolete, use DBIx::Class and this module instead. ;)



まだ開発もされているし、使っている人もいるのにこういう事を平気で書ける神経がわからん。DBIx::Classのほうはそういう書方はしてないから、この作者だけなんだろうなぁ・・・まぁいいけどさ。


とりあえずオーナーシップ欲しいぜ、と叫んでみる。


selector.js

遅めの新年会



バタバタしているNジとうちのE嬢でイタ飯。相変わらずのウマさ。たまらんのう。ワインを2本頼んだのだが、そのうちほとんど俺が飲んでた。飲み過ぎー。写真は前菜の盛り合わせ。カプレーゼのモッツァレーラがぷるぷるふわふわ、ミントの香りが食欲をそそる。


東証の約定能力



「増強が間に合ってない」という発言が多いが、前にも書いた通りシステム的には「増強」ができるのはすでにスケーラビリティを確保してあり、ハードウェアを足せばすぐに増強ができるように設計/実装されてる時に初めて「増強」できる。


現在の約定能力450万件に対して、例えば1500万件にあげたい場合は確実に実装しなおしになるはずだ。逆に言うと、「増強」で済むのならすでにやっているはずである。こういう事は特に企業の上にいけば行く程わかってほしい、と思うんだよなぁ。


DNS移行メモ




  • (完了)RTのDNSが書き変わらない。なんでやねん。RT本体は別のVirtualHostで稼働を確認。

    • 新しいRTのほうが分かるようにテンプレートに若干手を入れてみた。



  • 日記才人の大元のDNSは切り替えた。これから伝播していくはず。

  • メールがまだ以前のサーバーに流れている。

  • 日記才人新サーバーに必要なモジュール、ライブラリの類いはインストールした。

うわああああお、白銀の世界ですか



びっくり!びっくり!びっくり!雪降るかもって聞いてたけど、これはすげーーーー。本当は今日ハイキング行くつもりだったけど、これはどちらにしろ無理だったなぁ。


金、携帯



7ヶ月分の賃金がようやく入る事が確定。やったぜ!これで金融商品を崩さなくても済む。


さっき「宴会社長(宴会部長+社長÷2)」という肩書きで呼ばれた。はっと思って携帯のアドレス帳を見たら半分くらいレストランの電話番号だった。とほほ。はいはい、宴会社長ですよ。


消えた



結構書いたのにFireFoxが落ちた・・・orz


昨日は久しぶりに英語で「おまえ、俺にそんな仕事やらせよーったってそんなのJob Descriptionにはいってねーし、それどころか俺はお前の会社でやとわれてねーから!」みたいな結構キツいメールを書いた。アメリカ人にはこれくらいいうとかんとなー。


使いこなしてない俺



subversionで ~/.subversion/configってファイルがあったのを今さっき初めて知ったよ・・・


そんなわけでこれは便利と色々設定!



[miscellany]
log-encoding = euc-jp
enable-auto-props = yes

[auto-props]
*.html = svn:keywords=Id
*.mc = svn:keywords=Id
*.pm = svn:keywords=Id
*.pl = svn:keywords=Id
*.sql = svn:keywords=Id


これでsvn add hogeするだけでsvn propset svn:keywords Id hogeもされるようになる。便利だ!


正直ワロす2



東証は400万件で止まるんだそうだ。NYSEは45億件で止まるんだそうだ。よんじゅうごおくだよ。話半分で聞いても20億件だよ?アメリカ人の話は話半分で聞く事にしてるけど、桁が3つくらい違うじゃん!アーホーかー。


システムを作ったF社はアホだ。心から言う。F社はアホだ。でもそこにン十億円単位で金をつぎ込む決定を下す東証経営陣はさらにアホだ。現場で頑張ってる東証の社員かわいそうじゃん。これってある意味ソフトウェアエンジニアリングの失敗例のケーススタディとかになりそうだよなぁ。設計思想から間違ってるシステムはどんなにアドホックにシステムを増強したって桁違いのパフォーマンス向上は見込めないし、金と時間ばっかりかかる。


アーホーかー


正直ワロす



堀江ブログに2400件超えのコメント。すげー。皆暇だなぁ・・・。しかしマスコミは明らかに騒ぎ過ぎ。重大な犯罪ではあるし、ある意味見せしめにならなくてはならないのだけど、フジテレビの「メール入手」とかはなんかなぁ・・・


いいじゃん、もうわかったよ。聖人君子ばっかの会社なんてねーんだから、はやく終わらせて東証にシステム増強させて仕事しようよ。


UTF Downgrade



id:naoya経由で



http://d.hatena.ne.jp/tokuhirom/20060114/1137253723



これってXS使うと早くなるのかなぁーとか思ったんだけど、どうなんだろう。再帰的に見て行くのが面倒くさいかな。基本的にはこれをばーっと実行していけばいいはずなんだけど:



SvUTF8_off(sv);

上記の件で



ひさしぶりにアメリカ人の友達からメールがきたと思ったら、「やあ!ライブドア騒動で記者達にもみくちゃにされてるかい?」という内容だった。はー。と思ったのもつかの間、なんとメールアドレスが某M$からじゃないか。あー、しかも他に仲の良かった同僚も一緒に転職したらしい。なんとまぁ。


これでM$で働いているエンジニア友達は3人になりました。わはは。


Scapegoat



ライブドア、突っ込まれるべき点はいくらでもあるとは思うんだけどやっぱりちょっと行き過ぎだよなぁ。本当に正直な話マンションの件はどこに行ったんだ。堀江ブログでがんばれがんばれ言う奴らも理解できんが、ここまでお祭り騒ぎsんでもいいんじゃないのと思う。


”L”ivedoor発音のアナウンサー



フジテレビのお昼のニュースで東証アローズから中継していた女性アナは帰国子女なのか、「ライブドア」と発音する時にやたらと最初のラの音の"L"がなめらかで、すごい違和感があった。


しかしライブドア、Web事業としての本体は俺は正直嫌いじゃないのだけど、やっぱりあの証券系の奴らは怪しいよなぁ。巨大な事業全体として金融、証券系がグループに存在することの強みってわかるけどね・・・。


subversionのリビジョン



libapreq2をチェックアウトしてみたら、



Checked out revision 369625.



さんじゅうろくまんきゅうせんにじゅうご!すげえコミット数だ・・・


とりとめのない。



決してプロレベルではないが、結構おもしろかった



http://www.muccoo.net/comic/



もう少し丁寧に描いてくれればもっとよかったんだけどなー。


さて、日記才人のコードも書いたし、案件Mでも着手するかー。


白夜行



白夜行の再放送を見てる訳だが、最後のほうになってようやくあらすじを思いだし始めた。そうかそうか、こういう話だったなぁー。最後どうなったのかまだよく覚えてないけど。


超暇



しょうがないので仕事してる。暇だなぁ。


あまりにも暇なのでスーパーマリオストライカーズでも買ってしまおうかと思ったのだが、まだ発売されてなかった。orz


なんか楽しい事ないかなぁ。


gogo



先が見えてないでむやみやたらに走りまくるのが不安ではあるけれど、それが悪い事だとはこれっぽっちも思ってなくて、これで落ちる所まで落ちてしまったらまた這い上がってやると思ってる。失敗なんて全然怖くないし、失敗しないと何も覚えられないと思う。


コード書きまくって、人と会いまくって、なにか問題なんてあったっけ。絶対に無駄にはならないし何度考えても俺は絶対にくいっぱぐれないと思う。


しかし、それとは別に。ぽっかりと。つまらんなぁ。


願望



夜中に携帯で「今から飲もう~」とか呼び出されてみたい。今までそんなのが一回もないってなんじゃそりゃとか。っていうか、よっぱらって日記ってなかなか書けないな。ただいまS嬢からもらったワインボトルをもう少しであけるところ。


やったぜ。



FreeBSDを走らせている某サーバーでカーネルを再構築してSHMMAXを桁外れにでかくしてみたら、今度は大成功!やったあああああ。これでpostgresql.conf内で



max_connections = 120

とか、なんの問題もなくできる(今の設定は40)し、何個ものpostgresインスタンスを走らせても大丈夫。で、これがどういうことかというと・・・・また引っ越します>サーバー。またDNSの書き換えとかで問題が起きそうだなぁ。ま、しょうがない。




しばらく遠ざかってたのだが、ひさしぶりに寝かせておいたままの株を見たらそれまで利益率3%弱だったのあ6%強まで跳ね上がってた。悪くない感じだな。何もしないでほうっておく分には良い事だ。


FreeBSD メモ




pkg_add -r cvsup
cvsup -h cvsup.jp.freebsd.org -g /usr/share/examples/cvsup/stable-supfile
make buildworld
make installworld
reboot
# edit /sys/i386/conf/GENERIC
make buildkernel
make installkernel
reboot

5 Steps Backward



IE嫌い。大っ嫌い!


Firefox上ではlocation.hashを変更する事によって遷移したページはちゃんとページ履歴に別ページとして認識されるのだが、IEではhashが違っても同じページと見なされるため「戻る」ボタンを押すとその前のページまでもどってしまう。


この間のハックはちゃんとFirefoxでは動くのに、なんでIEだと駄目なんだ・・・


なんなんだ、この寝れなさは



まんじりともせず午前4時過ぎに就寝。寝れるかと思ったら8時半に叩き起こされた。やっぱりドリエルか・・・


続々:訳あってOracle 8.0.5



キタコレ



http://www.akadia.com/services/scripts/show_all_objects.txt




http://www.akadia.com/services/scripts/show_table_columns.txt



show_table_columnsのほうは、8.0.5だとちょっとバグがあるので25行目を



--

からただの空白行に変えるといい感じ。


続:訳あってOracle 8.0.5



まだアクセスさえできねーから意味ないけど、こんなん見つけた:



http://www.samse.fr/GPL/ora2pg/ora2pg.html



訳あってOracle 8.0.5



訳あってOracle 8.0.5なんつーものを触ってます。生まれて初めてOracle。Oracle童貞。


っていうか、sqlplusを使ってデータベースに接続することもできません。.profileにとりあえず



export ORACLE_HOME=/u01/app/oracle/product/8.0.5
export ORACLE_SID=hogehoge
export PATH=${PATH}:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib

みたいにして、これでsqlplusを



sqlplus user/passwd @hostname

ってやってるんだけどでてくるエラーが



(c) Copyright 1998 Oracle Corporation. All rights reserved.

エラー:
ORA-01034: ORACLE not available


ユーザー名を入力してください。


ってな感じ。どういう意味だ、これ。ああ、商用データベースなんて嫌いだーーーー。


location.hashでのページング



多分これで決まりだと思うのだが、location.hashは結局なんのイベントも起こさないのでsetTimeoutみたいなのを使ってビジーループ風味に処理しないといけないっぽい。要は人間様が気づかなければそれでいいのだが、無駄にシステムリソースを食いそうでそれがなんか嫌なんだけどな。というわけで、ページングは今まで明示的にAjax.Requestを呼び出していたのだが、それただlocation.hashを変更するようにする。



element.onclick = function () {
...
location.hash = 'p=' + page++;
}

これを、PeriodicalExecuterに感知してもらって、そこからAjax.Requestを呼ぶ感じ。



function callback () {
if (needs_update) {
new Ajax.Request(...);
}
};
new PeriodicalExecuter(callback, 0.5);

一番のポイントはこの0.5という数を変更して、ユーザーがストレスと感じないようにしつつ、システムリソースを最低限にすることだろう。さてどうしたもんかな。


MacBook キタ━━━━(°∀°)━━━━ッ!!




http://www.apple.com/jp/macbookpro/



うわあああん、欲しいよ欲しいよ~~~。オフィス備品を整える前だったら「今すぐ購入」ボタン押してるところなんだが・・・くはー


キャンセル



今日のご飯は多忘(←「忙」ではない)な某氏の予定がかぶってしまったため、キャンセル。暇。


ドリエル効き過ぎ。



昨日効かないと書いたドリエルだが、効き始めに時間がかかるだけらしく効き始めたらすげー寝てしまった。っていうか寝過ぎ。


どうよ



今度こそ新作リストのページングなおったと思うんだけど、どうじゃ。今度はキレイにできたはず。Javascriptって意外と無駄な事してもパフォーマンス落ちないのね。


ああ、Windowsだと駄目だ・・・orz


高田馬場二郎



Dが二郎なんて軽く食えるぜ、みたいな事を言うのでGと3人で高田馬場の二郎へ。俺とGは小肉。Dは大肉。皆完食したけど、やっぱりおおすぎる。大正漢方胃腸薬買って帰宅。


しょうがないね。



押し過ぎ。とりあえず沈黙。


さびしんぼ爆発中



location.hashを使ったページングはビジーループでなんとかハックしてみたんだけど、どうだろう。できたかなー。というところでさびしんぼ爆発中なので酒でも飲むかな。うーん、迷うなぁ、どうしよう。


location.hash



あれー、確かlocation.hashを変更してその後「戻る」ボタンとかを押すとonloadとかをトリガーすると思ってたんだけどなぁ・・・どうも再現できん。なんでやねーん。


DBD::Pgとか日記才人とか



DBD::Pgメーリングリストを見てたらこのへんとか



http://gborg.postgresql.org/pipermail/dbdpg-general/2006-January/001942.html

このへんで



http://gborg.postgresql.org/pipermail/dbdpg-general/2006-January/001949.html

Class::DBI::LoaderとPgを使う時の注意点みたいなもんがあった。これを見ると、要はApacheのスタートアップ時にクラスの定義はしていいものの、DBへの接続をはったままだとオリジナルの接続を保持してしまい、しかもそれを使用してしまうこtになりかねないらしい。ということは以前に書いたこのエントリも変更しなくちゃいけない。



package NikkiSite::Data::Loader;
use strict;
use Class::DBI::Loader::Pg;
use Module::Pluggable
search_path => 'NikkiSite::Data',
except => [ 'NikkiSite::Data::Base', 'NikkiSite::Data::Loader' ],
require => 0,
;
use NikkiSite::Config;

BEGIN
{
my $config = NikkiSite::Config->instance;
my $ds = $config->param('DefaultDataSource');

my $loader = Class::DBI::Loader::Pg->new(
dsn => $ds->{dsn},
user => $ds->{user},
password => $ds->{password},
options => $ds->{options},
namespace => "NikkiSite::Data",
exclude => qr{(?:(?:vote|access)table_snap)|(?:message_old)|(?:votes|accesses)_\d{6}},
additional_base_classes => [ qw(NikkiSite::Data::Base) ],
);

foreach my $p (__PACKAGE__->plugins) {
eval "CORE::require $p";
warn if $@ && $@ !~ /^Can't locate /;
}

foreach my $class (map { $loader->find_class($_) } $loader->tables) {
$class->db_Main->disconnect;
}

}


ってな事をすればいいわけだ。というわけで変更変更。これで大分妙なエラーが減るはず。実際、結構なくなったような気がするぞー。


日記才人やっててよかったなぁ、と思うのはこういう時だ。スケジュールをギリギリに詰めて適当なハックのフィックスでとりあえず期日に合わせるのではなく、色々覚えられる。こういう仕事をやってなかったら俺はきっとプログラミングをちゃんと覚えられなかったろう。


Bose x Metallica



俺が大学3年~4年の夏休みに、3ヶ月マカロニチーズだけ食べて買ったBoseのステレオシステムでMetallicaを聞いてると本当によかったなー、と思う。これにお金をかけてよかったなぁと思う。良い買物したなぁ。たまらん。


ばたばた



昼頃に某案件に関してTさんとお話。その足で事務所に。事務所で椅子のセットアップとかやって、その後おそーーいお昼(16時くらい)を食べようと思って席に座ってオーダーして一口食べたところで電話。今すぐミーティングだってんで3分で食べて(こんな早食いしたの小学生の時以来のよーな気も)、走ってN事務所へ。


そのまま怒濤のミーティング三昧で、英語を日本語にしたり日本語を英語にしたり、いろいろ。ようやく終わったので今また事務所に帰ってきてPhish聞きながらこれを書いてる。


なんか疲れたなぁ。そういえば6時までに電話する場所があるんだった。忘れてた・・・


明日の夕食はポルトガル料理に決定。今夜はどうしようかなぁ。


カテゴリー復活。



復活させたよ。っていうか、一応復活は予定通りなんだけど奇しくも作業中に復活させてほしいという要望が。こんなのちゃんと見てる人がいるとは思わなかった。


更新報告の際にはまだ選択はできないけど、ちとまて。


ヤゴ



何気なくチャンネルザッピングして教育テレビを見てたらヤゴが画面いっぱいに現れたので「あ、ヤゴ」とつぶやいた途端それを打ち消すように「ギンヤンマの幼虫です」って言われた。


最近はヤゴとは言わないんだろうか。


お世話になります。



心を乱される物を読んでしまって、なんか寝られないのが明白なのでとうとうこの間買ったドリエルのお世話になってしまった。寝れるかなぁ・・・


(追記)効かないなぁ。酒と一緒に飲むか?みたいな・・・


Unforgiving IE + Safari



以下の構文はPerlでは普通~でなんの問題もなく走る。



my %hash = (
key1 => $val1,
key2 => $val2, # <-- ココ
);

最後のカンマは正直、後々でハッシュの中身を足す時とかに打ち忘れがなくてかえっていい感じになるくらいだ。


とーーーーこーーーーろーーーーがーーーー。


Firefox上では、以下のJavascriptは全く問題ない:



var hash = {
key1: 'val1',
key2: 'val2',
};

でもIEとSafariは駄目だという事がバグレポートでわかった。なんてこったい。くそー。というわけで新作リストはこれで直ったと思う。


右手



まだ右手いてぇや。実は結構真面目に痛めてたのかも。


肉、っていうかラム肉



ということで新宿「北牧場」でもりもりとジンギスカンを食べてきた。今日はこれが最初の食事ですっごいおなかがすいていたのでほとんど会話もなく、ガツガツと。男二人でそれはそれはモリモリと気持ちよく食ってたので最後に野菜がなくなってまだ肉が残ってた時に店主が気を利かせてモヤシを足してくれた。おなかいっぱい。


この店ちょっと煙いけどうまいわー。ちょっと忙しすぎて厨房回ってないけど、店の人達も基本的には好印象。




久しぶりに「肉」が食いたい。焼き肉食いたい。近郊の人で焼き肉食いたい人おらんかなぁ。


テンピュール オーバーレイ。



とうとう買ってしまった。まぁ去年いつか買うとは思ってたのだが。到着は12日の予定。


IEで使えないJavascript構文



知らなかったんだけど、



var list = new Array(...);
for(var i in list) {
...
}

って、IEでこける!なんということですか。まぁどちらにしろあまり良いやり方ではないとは思ってたのでちょうどIEでも動かないという事が分かったので



for(var i = 0; i < list.length; i++) {
...
}

という、Cスタイルループに変更したらなんとか動きそう。あ、あと<select>内で



<option onclick="javascript_function()">HOGE</option>

ってのが動かない。なんだこりゃ。しょうがないので、



<select onchange="javascript_function()">
<option value="opt1">HOGE</option>
</select>

とかやって、関数内でどのオプションが選ばれてるのか調べてディスパッチするようにしてみたぞ。


テンピュールオーバーレイ



布団オーバーレイを探してるのだけど、ぱっとみあたらんかった。今も探し中。


ボウリング



久しぶりにボウリングいってきた。Dとサシ。最初けっつきまづきながらも、終わってみるとハイスコア169。まぁまぁいいかな、という感じ。右手が痛くなるくらい投げてしまった。楽しかったー。


HTML::Mason + Ajaxなんか慣れてきた



なんかすげー慣れてきたぞ。俺的なソリューションとしてはJSONインターフェースを作って、そいつをHTMLに埋め込む事もできるようにするという手法が性に合うようだ。


確実にボトルネック



確実にデータベースがボトルネックだなー。セッションコードをPostgreSQLからSQLiteに変えたら計測結果のところで一番時間がかかるのがcreate_session() からhandle_request()に変わった。はやくカーネル再コンパイルできる状態にしたいなぁ。


正月あけたらこれですよ



突然仕事が3軒程舞い込んできた。超忙しくなりそうな予感。ちなみに一件は、事業に必要なブツのPlan Aが頓挫しそうなので、俺が某社の仕事をやる代わりにそのブツを某社が安く提供してくれる、みたいな感じの話。あー、もう、だね。自分が二人欲しい。


文化と文化の狭間。



アメリカ人と日本人の間で仕事するのは本当面倒くさい。


日本人で英語が喋れて言葉が通じる人もいるけど、8割方はそうでもないのに。自分で話してる事が相手に伝わってると思いがち。でもどんなに文法があってても伝えたい相手に思考法というか文化的背景が分かってないと全然通じない。っていうか同じ日本語で育った日本人同士でも話が通じない事もいくらでもあるのにカタコトの英語で通じるわけねーべ。


そういう日本人が英語喋ってるのに、相手が英語で喋ってるんだから我々の理屈が通じるはずだと思うアメリカ人がまたむかつく。わかってないんだっちゅーの。しかもそっちの理屈に応じる必要性もないのに、それが当たり前のような事をいいやがる。むかつくなー。


なんか尻切れとんぼだな。まぁいいや。


なんか



色々と誤解を生んでるみたいだなー。まぁいいけど。皆さんの想像は多分はずれてます!


カレー



教えてもらったので「カレー 晴れの日」でランチ。鯖竜田揚げと長芋のカレー。妙な組み合わせだと思ったものの、これがすこぶるうまい。揚げ方のほうもとてもうまいしね。ここは是非他のメニューも試してみたい。


pgcrypto



contribディレクトリにこんなものが!うれしいいい!ちゃんと使い物になるのかな。今インストール中。


ちなみに今Rage Against The Machineの"Killing In The Name Of"を聞きながらコード書いてるのですげーノリノリだぜ。


無料



元々昼飯抜きで某N社に行こうと思ってたのだが、目の前でバスを逃してしまったので時間をつぶさざるをえずに目の前のラーメン屋に入った。で、食券を買おうと思ったらなんと今日は先着200名様がラーメン無料!とのことで、席に座っただけでラーメンがでてくる。


今日はあまりやる気がないのかちと薄めの味のラーメンではあったが、タダにはかわりない。なかなか粋なことをしよる。


ヒーター



ウチが元々寒い所、あまりにも今日は寒いのでカーボンヒーターを買って来た。みかけはよわよわしいのに、あったけええええええ!昔うちにあったヒーターとかを考えると本当、技術の革新を感じさせるね。


(小さいが)念願のRT



日記才人からのバグ/要望/サポート依頼をRTで受け付けるようにした!これ、2001年くらいからずっとペンディングだったんだよなぁ。


・・・と思ったけど、RT側からの自動応答がうまくいってない模様。一応チケットは作成されるのでまぁいいけど、これはちゃんとメールを送ってくれないとこまるなー。


(追記:できた!)


電話してくれた



ハナコさんと飲んでたら俺のストーカーされっぷり状態を見かねたハナコさんがなんか意を決してストーカーに電話をかけてた。多分俺が話してたら罵詈雑言しか言わなかったであろうが、随分丁寧に応対してたなぁ。すげぇのう。


本当、もういい加減にしてほしいよ。


セッションデータソース変更



Postgresだと重過ぎるのでSQLiteに変更してみた。どうかな。


Cache::FastMmapで



http://www.nikki-site.com/user/lurkers.htmlを直した。これで正確に過去15分間にログインしていたユーザーをリストできる。


Sessions with Apache::Session::Wrapper



Apache::Session::WrapperはApache::SessionのとろいAPIを結構うまーくカバーしてくれるので重宝しているが、セッションがあったら使いたいけど作りたくない、っていう動作ができないという事に先ほど気がついた。no_createみたいなオプションないかなー、と思ったらないので、とりあえずDaveにメール送ってみたよ、というメモ。


Javascriptで$1とかどう使うんだ?



やりたいのはPerlでいうところの



$text =~ s/(pattern1)(pattern2)?/
$2 ? 'hoge1' : 'hoge2' /ex;

みたいな事なんだけど、Javascriptのreplace関数を使ってもpattern2にマッチしなかった時でも'$2'が負にならない。'$2'.lengthとかをみてもかならず2とかなるし・・・


ここは素直にpattern2がある場合とない場合を書くべきなのかな。(追記:とりあえずそういう方向で書いてみた)


マイ日記リストのRSS取得可能に



マイ日記才人のRSSをRSSリーダー等で読めるようにした!「設定」から、「マイ日記才人を公開する」設定にすると、認証無しでRSSを購読できるようになる。もちろん誰でも購読可能になるので、公開したくない人はおきをつけあれ。


今年は




  • 去年の後半は色々と人生を左右する決断をせねばならず、人間らしい生活が送れてなかった。っていうかそれが理由じゃないのかもしれないけど一応そういうことにしておく。俺の家の惨状たるや筆舌にしがたい。料理も作ってなかったし。今年は人間らしい生活を送りたい。

  • 結婚してぇ。もうマジ結婚してぇ。

  • もすこし痩せよう。

  • 金儲けしよう。


ってなわけで実家から帰ってきた。で、いきなり紹興酒ぐびぐび。


日記才人バグなおした



投票ランキングに入ってない人も投票されてたので直した。ログインしないでも見れるはずのページがみれなかった問題も直した。


運搬



さて、今日はこれからちとオフィスに色々と実家から持って行きますよ。できればセットアップもしたいんだけど、時間あるかなぁ。


・・・ということでサウンドシステムとかとりつけてきた。本当に取り付けただけなのですげーちらかってますが。とりあえず1999年に買ったBOSEのシステムはまだ動くという事がわかって安心。アメリカから運んできてから一回も電源をいれてなかったからなー。相変わらずいい音でしたよ。あとはAirMacにつなげて設定終了の予定。


あ、あれ・・・どうやってたんだっけ



日記の新規登録をどうするかとコードを書いていたら、なんかテーブルのスキーマで納得できないところが・・・いったいこの部分はどうやってたんだっけ・・・


連絡来なくてちと悲しいっす。



自分から連絡とった人以外から全然連絡がこなくてちと寂しい正月すごしてますよ。さて、今日はこれから日記才人の新規登録を書き終える予定です。それができたらwww.nikki-site.comを復活させて、あとはそれだけ唯一pendingのmylistのRSSを認証無しでも取得できるオプションを実装しようっと。


なんとなく三が日以内に終わりそうなよかーん。


暇な人いたらメッセで相手しておくれ・・・。ああ、さびしんぼだよ、悪いか。


拉致



ちょっと親戚めぐりに拉致られてきます


撃沈



夜中2時くらいまで日記才人の作業をやったりブラックジャックの文庫版を読んだりしてたら寝てしまった。なんか新規登録のところで妙な事が起きてるんだよなぁ。


とりあえずユーザーの新規登録もできた。あとは日記の新規登録ができたら、暫定でもなんでもwww.nikki-site.comを復活させようっと。


日記才人一応復活したよ



まだまだ足りないところもあるし、なによりDBサーバーへの接続数が低すぎるのでアクセスをさばけてないのだけど、とりあえず動いた。細かいところはおいおいやるよー。


とりあえず少し安心した。


sennaで日記才人検索



pg_sennaをハックしまくって、日記才人で日記を検索するようにしてみた。ただし、以下の事に注意してくださいませ:



  • 日記才人で更新報告、もしくは日記の情報更新を行わないと検索には載らない!これはデータベースで検索される内容がそれらの行為を行う事で更新される仕組みになっているから。

  • ページングまだできません。ちょっと待ってー

  • (追記) なんかpg_sennaがバグってた。コード変更したので今度こそ自動的にデータベースが更新されるはず

動いた!



いやー、sennaの新しいAPIにうまく対応できてなかった。今度はもうよくわかったぞ!


続き



どうもautoconfとautomake対応がうまくいってないらしい。うーむ。とりあえず強制的にインストールの後、テーブル構成を見直し。


正月からなんですが。



pg_sennaが全然インストールできない。コンパイルは普通に通るんだけどロードしようとすると



ERROR: could not load library "/usr/local/pgsql/lib/pg_senna.so": dlopen (/usr/local/pgsql/lib/pg_senna.so) failed: /usr/local/pgsql/lib/pg_senna.so: Undefined symbol "MemoryContextSwitchTo"

とか言われて話にならん。しょうがない、普通にSenna.pmとかでインデックス作ってやってみるかなぁ。


あけましておめでとうございます。



あけましてなのです。昨日から徹夜状態ですよー。しかも昼食べたミソタンタン麺の辛みがいまさら腹に来てて、結構苦しんでたりします。


2004年は日本にベースをうつした。2005年は固定収入にサヨナラした。2006年はとりあえず苦労をわざわざしょいこんでみた。俺がわざわざ高い車に若い時に乗ろう!と決めたのと同じで、今この若さでこの苦労をしょいこみたい。40代とかになって初めてそういうことを考えたくない。今やるから価値があるんだと思う。失敗したってかまわん、俺は絶対にくいっぱぐれないと確信してる。貧乏でも、絶対にのたれ死にはせん。


というわけで、今年の最後に俺の肩書きが「社長」なのか、それともそれ以外の全然違う物なのか、正直乞うご期待。失敗したら養ってくれ。


Author

Daisuke Maki (a.k.a lestrrat): Perl hacker, Director of Japan Perl Association, YAPC::Asia Tokyo Organizer (2009-2012), Fluent in Japanese, English. Ex-Brazilian (sorta)

#perl #c #ruby #java #mysql #english #japanese #opensource #stf #cooking #scotch #cigar


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

翔泳社よりモダンPerl入門(2010)を出版させていただいております。できれば内容をアップデートしたいので是非皆様・・・現在の在庫処理にお力をお貸しください!><

月別アーカイブ