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.

2011年01月

さきほどの記事に関してtokuhiromに指摘されたのでRPC::XMLにしてみた。基本的にはここに書いてある事と同じ
で自分がちょっと変更した部分は以下の通り:

  1. XMLRPCで prefix.method_nameって呼んでた名残があるので、prefixをとっぱらっちゃう
  2. $q->argsが返すのは RPC::XML::simple_type とかの値なので、これを直してあげないとXMLRPC::Liteで動いてたコードが動かない
  3. @ret = () で RPX::XML::resposeを作ろうとするとundefを返してくるので、その後の $content->as_stringがこける。レガシーコードを期待しているクライアント側との兼ね合いもあるので@retが空だったら [] を渡してあげる

use strict;
use Plack::Builder;
use Plack::Request;
use RPC::XML;
use RPC::XML::ParserFactory 'XML::LibXML';

my $app = sub {
    my $req = Plack::Request->new(@_);
    my $q = RPC::XML::ParserFactory->new()->parse($req->content);
    my $method_name = $q->name;

    # (1) 
    $method_name =~ s/^prefix\.//; 

    my $code = $webapp->can($method_name);
    if (! $code) {
        return [
            404,
            [ "Content-Type" => "text/plain" ],
            [ "RPC method $method_name not found" ]
        ];
    }

    # (2)
    my @ret = $webapp->$code( map { $_->value } @{$q->args} );

    # (3)
    my $content = RPC::XML::response->new( @ret ? @ret : [] );
    return [
        200,
        [ "Content-Type" => "text/xml" ],
        [ $content->as_string ]
    ];
};

builder {
    enable 'ContentLength';
    $app;
};

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

諸事情によりレガシーなXMLRPC::LiteベースのプログラムをPlack上にポートすることになったので色々悪戦苦闘してみた。とりあえず普通に動かすのは辛い、ということはなんとなくわかったので色々やった結果、こんな感じのコードを書けばとりあえずディスパッチは動くようになった。もしベターな方法があったら教えて下さい(XMLRPC::Lite以外のベターなライブラリでもOK!)

(追記:指摘を受けたのでRPC::XMLで書き直してみた

use strict;
use Plack::Builder;
use CGI::Emulate::PSGI;
use IO::String;
use XMLRPC::Transport::HTTP;

my $xmlrpc = XMLRPC::Transport::HTTP::CGI->dispatch_to( "MyApp" );

builder {
    my $code = CGI::Emulate::PSGI->handler(sub {
        $xmlrpc->handle;
    });
    sub {
        my $env = shift;
        my $io = $env->{'psgi.input'};
        my $content = do { local $/; <$io> };

        $env->{'psgi.input'} = IO::String->new($content);
        delete $env->{'psgix.io'};
        local %ENV;
        $code->($env);
    };
};
psgi.inputに関してはPOSTデータを読み込むのにSOAP::Lite側で Plack::TempBufferをsysreadしようとしていて、そうすると必ず 0 を返すのですな。open()で作れる疑似ファイルハンドルやなんかでお茶を濁そうとがんばって見たのだけど、結局IO::Stringのようにtieしないと動かないという結論に

なんで local %ENVしてるのかは忘れちゃった。

というわけでこうして動くサーバーは作れたのだけど、なんか他に良い方法あるのかなー
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

何かしら問題が起こって(もしくは問題が起こったのかどうか切り分ける段階で)それを解決する際に出てきてる表示が英語で読めなくてうろたえる、って経験ありますか。回りの人に聞いてるとよくある現象くさいですね。

自分は幸運にも海外育ちなので英語は全く問題ではありませんけど、同時にハッキリと言えることは仕事でプログラムを書いたり、パッケージをインストールしたり際にいちいち律儀に画面に出てくる英文を読んだりはしてない、ということです。

重要な事なのでもう一回言いますね:「いちいち律儀に画面に出てくる英文を読んだりしてない」です。

まず、大前提。その切り分けができなくてうろたえてる状態に陥ってるあなたは確実にそのソフトなり環境なりのエキスパートではないですよね?エキスパートだったら多分その状態についてすでに知っているか、調べる方法を知ってるはず。エキスパートじゃないから困ってる。ということは自分で解決するのはできるとしても多少時間がかかるでしょう。趣味のプログラミングはそれでもいいですが、仕事だったらその多少の時間がもったいないです。とっとと回りの人に聞いて、次回同じ状況に陥らないための方法とかをメモしながら作業したほうが早い。なので自分一人で困るのはやめましょう。

でも回りに聞くためにはある程度の切り分けができないとダメです。その現象がなんなのか具体的に分からなくとも、以下の2点が分かればもっと分かっている誰か(例:Google先生)に質問することが可能になるとはずです:

  1. それはそもそもエラーなのか?
  2. エラーならばどこの部分が具体的にそのエラーの状況を表しているのか?

この際、英文を読める必要はほとんどありません。エンジニアであればほぼ確実に出会ういくつかのキーワードを知っていればOKです。あくまで一例ですが、

  • "Error"
  • "Fail"
  • "Abort"
  • "Exited"
  • "Stop"
  • "Give up"
  • "Fatal"
・・・等々、この辺りのキーワードだけ覚えてください(実際にはもっと他にパターンがあるかもしれませんが、これだけでも6,7割はあたるはず)。あとはこのキーワードを使って、表示されてる文内を検索してください。その言葉の前後にエラーくさい(普通処理と異なる)出力がしてあれば、十中八九それがエラーです。

で、エラー文さえ入手できれば少なくとも「質問をする」という行為にたどり着くまでに収集可能な情報はほぼ全て揃ってます。あとはなるたけ状況を理解しやすいようにそこまえいたった背景をエラーメッセージとともに指定すればOKです。

ね、英文なんて読む必要ないでしょ?be動詞がどうたらとか、どうでもいい!エラー文の場所さえわかればいいんです。そういう勘がつけば、あとは少しずつ定型文の語彙を増やしていくだけで少なくともプログラム関連の英語に関しては結構実用的なノウハウがつくはずです。




ちなみにこれ、ちょっと前に Perl Casual で行ったライブコーディングの際にも話した内容と同じです。その際はPerlモジュールを扱う際にPODで記されたドキュメントをどうやって読むか、という話をしました。

PODも実はほとんど内容を読んでません。まずSYNOPSISでコードは読めるし、DESCRIPTIONはモジュール名を見てわからない時だけ読みます(でもそもそもモジュール名を見て内容がわからないモジュールは使えない事のほうが多いので、結局読まなくてよかった、みたいなこともあり得る)。

で、前述のごとくこういう状況でも自分はほとんどドキュメント自体は読んでません。キーワードだけ追ってます。

関数の使い方は "Returns"とか"Takes"とか "Parameter"とか"On error"とか、キーワードだけ見てます。戻り値が知りたいならReturnsの前後の文脈だけ読めばよく、引数はTakesの前後で大体事足ります。もしそれぞれの説明がわからなくても、誰かに「Takes XXX のXXXってどういう意味?」と聞けますよね。「この関数どうやって使うの〜?」という大雑把すぎて聞かれたほうにははた迷惑な質問に比べたらピンポイントで単語の意味やその部分の挙動について聞かれたほうがはるかに質問する行為のコストパフォーマンスがあがるはず。

というわけで、僕の言いたいことはまとめるとこうです:文学作品を書くわけじゃなし、技術資料を読むのに語学力なんて大していらない。まずはキーワードを覚えろ。覚えたらその回りの文章を読みほどくか、とっとと誰かに聞くべし。それを反復すべし。

読めなくても必要な情報だけ抜き出せるように練習するとぐっと楽になりますよ!
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

最近風邪ばっかひいてて、さすがに大晦日から三が日全部風邪でつぶしたのはとほほだったので2011年はちゃんと体を鍛えようということにしたのであります。

手始めに先週末、相方と水着を買いに行った。結構したけどまぁ万が一これで水泳しなかったらお金無駄になっちゃうね!ってことで自分にプレッシャー。

で、今日前々から調べてあった近くの某公立中学校のプールへ。一般開放してるらしいってことで気になっていたのだ。2時間400円なんだけど、10月から5月までの間は2時間分のお金を払うといくらでも泳げるらしい。

行ってみたらすごいいいプール。室内、温水、25メートルレーンが6つもある!最近の中学生はこんな贅沢なプールで泳いでるのか!監視もちゃんとしてるしすばらしい。税金払ってるんだからこれは是非使うべき。

何往復したのか数えてなかったけど、休憩も挟みつつ2時間弱泳いできた。開始20分くらいで上腕部の筋肉が痛くなり始めてもう体が鈍ってるのを痛感。さすがに4年泳いでないとこのざまか・・・悲しい・・・が、とにかく泳ぎ続けた。1時間くらい泳いでたら少しずつ勘が戻ってきてだんだん力を抜いて泳げるようになって良い感じ。

帰りにビールを買って帰宅。やっぱり水泳は性に合ってるわ・・・どこまで続けられるかな!
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

いまさらですがあけましておめでとうございます。
大晦日から1月の5日くらいまで風邪で寝込んでました。おかげで放っておかれた相方がプリプリしてしまい、その禊ぎのために三連休の間に鎌倉に行ってきました。

禊ぎなので湘南新宿ラインでグリーン車ですよ。新幹線以外のグリーン車って初めて乗ったけど、すごくいいですね。大人なので今度から中距離の移動をするときはグリーン車をうまく使いたいと思う。

鎌倉ではありがちだけど、鶴岡八幡宮、長谷の大仏さん、長谷寺というコースを回った。実はメインは鶴岡八幡宮の横にある国宝館。ここは小さいながら結構良い感じの仏像があるのですね。一本彫りの地蔵菩薩なかなかよかったのと、何故か北斎がの作品がぽこぽこあってなかなか楽しめた。

あと、実は長谷寺って初めていったんだけど、あそこの十一面観音菩薩ってでっけぇですな!あんなところにあんな立派な仏像があるとはしらなんだ・・・弁天窟にもよったりしてなかなか楽しめた。

帰りもグリーン車。便利。家に帰って豚しゃぶ。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

このページのトップヘ