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.

2009年02月

モダンPerl入門を執筆していた時もそうだったけど、どうも事務所にいるとそういう文章を書く的な作業ができない。スライドもそう。

そういう時はどうするかっていうと、Tully'sに行く。まぁ他のところでもいいんだけど、コーヒーの味に関してはTully'sが一番好きなのだ。多分ネットにつながらない、ってのもあるんだと思うんだけど、Tully'sに行くと1時間〜2時間くらいすごい集中して作業できて色々と物事がはかどる。11月から12月にかけては、ほぼ毎日朝8時半〜11時くらいまでの間をTully'sでなんらかしら打ちながら過ごした気がする。正直モダンPerl入門なんか、Tully'sがなかったら書き上がってないと思う。そういう意味では本当、オフィスに縛られてたらあの本はでなかったなぁ。

ちなみに逆にプログラミングは手に付かない。プログラミングはどうもネットの資料とかそういうのを見ながらやることが多いので、ネットにつなげられないと微妙なんだね。

あ、あとヘビーユーザーとして一言言いたいのだが、なぜTully'sの持ち帰り用のプラスチック蓋はあんなにコーヒーが漏れるの?他のコーヒーショップのであそこまで漏れるのはないと思うんだ。どうか改善してください><
    このエントリーをはてなブックマークに追加 mixiチェック

「ひまわりっ」という漫画がかなり好きなんだけど、そこで最近完全に主人公を食っているウィング関先生。今更かもしれないけど、今初めて気づいた。ウィング関のウィングって羽って意味だから・・・

ウィング関って関羽じゃねぇか!

それだけなんですけどね。きっとみんな知ってましたよね。
    このエントリーをはてなブックマークに追加 mixiチェック

Config::Generalは構文がプログラマーには美しくないのだけど、YAMLはインデントが必要!という事がわからないとコピペして設定を使い回す人が困るという問題があるんだよね、と一応前提を言って置いて・・・

soffritto::journal

なんでConfig::Generalをあきらめたかというと、

   connect_info dbi:mysql:myapp
   connect_info username
   connect_info mypassword

のあとにどうやってmysql_enable_utf8 => 1を書いたらいいか分からなかったから><

そういう場合はこうするとよいと思うのです:
use strict; use Config::General; use Data::Dumper; my $string = <<EOM; connect_info dbi:mysql:dbname=hoge connect_info username connect_info password <connect_info> mysql_enable_utf8 1 </connect_info> EOM my $cfg = Config::General->new(-String => $string); print Dumper({ $cfg->getall }); # 結果 $VAR1 = { 'connect_info' => [ 'dbi:mysql:dbname=hoge', 'username', 'password', { 'mysql_enable_utf8' => '1' } ] };
    このエントリーをはてなブックマークに追加 mixiチェック

HI3E00020001.jpgモダンPerl入門」が届きました。翔泳社様、ありがとうございます><

嬉しい限りなんですが、でももう怖くて本ひらけねぇ。間違いとかあったら嫌だー。こわいー。僕はテレビとかでBGMが怖い感じになるとチャンネルを変える人なのです。中味を読んで万が一いやな内容があったらいやだからもうしばらくあけないぞ!

なんて事は言っていても見ないわけにはいかないので見たわけですが、装丁とか、僕の予想をはるかに超えていてすごい嬉しいです。内容も実は結構良い内容だとは思っております。自信がないのは文章の書き方とかだけで、ここまでターゲットを絞ってMooseの実践的な使い方とかを解説した本は現在他には存在しないはずだし、その辺り興味のある方には我ながらちょうどいいと思います。

ちなみにこの本、執筆時には全てPODで書きました。=head1 チャプタータイトルみたいな感じ。表とかはas-is textでがつっと書いたよ!これをPDFに落とすの大変だったろうな、といまさらながら感じております。しかもPODで書いて、subversionにアップして編集の方とやりとりさせていただきました。技術書扱ってる人たちだからひょっとしてsvn使えるんじゃね?と思って聞いてみたらこれが本当にできてしまったという。すごいね!これは多分二度と使えない手なんじゃないかと正直思う(笑)

まぁともあれ、世間では来週発売のようです。皆様も是非お手に取っていただけると幸いです。

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

MojoMojoを使ってみて国際化についてちょっと研究してみた。CPANにはLocale::Maketext, Locale::Maketext::Lexicon, Locale::Maketext::Simple等々色々あって正直よくわからんかったのだが、今回調べてみてようやく把握した。

まず先に行っておくけど、Locale::Maketext::* 系のモジュールのコードは正直クレイジーなので、暇じゃなきゃあんまりソースコードを漁るのはお勧めしない。

国際化の大まかな流れは、文字列IDがあって、それに対応する言語の「翻訳」が存在する、という感じ。Catalystを使っているなら、Catalyst::Plugin::I18Nを使用して、MyApp::I18N名前空間以下に.poや.moファイルなどをおくのが主流。

問題はHTML::FormFuなど、他の国際化されたコンポーネントを入れ込む時や、プラッガブルな形で国際化ファイルを追加する時。一部はLocale::Maketextを使っていたり、一部はLocale::Maketext::Lexiconを使っていたり・・・Catalyst::Plugin::I18NはLocale::Maketext::Simpleを使っている。

まずそれぞれのおおまかな違い。Locale::Maketextが基本中の基本。これの大まかな動作としては、国際化用の名前空間を指定して、それ以下に言語毎の.pmを置く。例えば国際化用の名前空間がMyApp::I18Nだとしたら、日本語用の文字列ID → 翻訳文字列はMyApp::I18N::jaに入れる。このMyApp::I18N::ja内の%Lexiconというハッシュにこのルールをハッシュとして定義する。ちなみにこのモジュールを使う場合にはMyApp::I18Nのようなモジュールを作るわけだが、このモジュール、Locale::Maketextから継承する必要がある・・・っぽい。

これに対しLocale::Maketext::Lexiconは この%Lexiconのファクトリーと捉えるといいと思う。APIが非常にいけてないが(import()を使って定義を行うというひどいAPI)、この方式を使うと%Lexiconハッシュがtie()された物になり、後から追加するのが容易になる。Locale::Maketext は生のハッシュを使っているのでこのハッシュを自前で操作する必要があるが、Locale::Maketext::Lexiconを使えばその辺りのマージを自動的に行ってくれる。モジュールの継承はLocale::Maketextと一緒だが、こちらはハッシュを定義するのではなく、gettext形式の.poファイル、maketext形式の.moファイルなどを使える。

Locale::Maketext::SimpleはLocale::Maketext::Leixconの定義を簡単にしただけ。それ以上ではない。ただし、動的に翻訳ルールの追加はこのモジュールを通してはできないようにわざわざされている。

ざっくりとはこんな感じ。で、迷うのがあちこちに「Class」引数で名前空間を指定するとかそういう事が書いてある割に、Locale::Maketext::LexiconをLocale::Maketext::Simpleは.poファイルや.moファイルを使用する場合はそれらのファイルが存在するディレクトリを明示的に指定する必要がるということ。これ、ドキュメントにはなかなか書いてない(パスも指定できるよ!とは書いてあるけど、それが必須とは特に書いてない)。ちなみに Perlが認識できる auto/MyApp/I18N/*.po 等のパスにあればその必要はないけど、普通の人はautoにファイルなんていれないから、パスを指定するのがよいと思う。

というわけで以上がすごい悩んで二日ほどwarn()宣言をあちこちに入れながらわかった大筋。実際に投入する際にはもう少々BKが必要なのだが、そこまで書くとすげぇ長いのでまた今度。


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

このページのトップヘ