新しいblogに移行しました

新ブログ "All Yout Bugs Are Belong To Ass" に移行しました!

2011-04-15

[Forth]スタックに乗ってる文字列を複製してみる

えーとforthについてはほぼ初心者の域をでないのですが、時折触ってみては「いつかは使いこなしたい」と思っている言語のひとつです。

そんなforth学習の一環として、手始めに
・ワード定義
・スタック操作
・文字列操作(?)
あたりを一気にやってみたので、メモを残しておきます。
: ddup ( a b -- a b a b )
    over over
;

s" ほげ" ddup
type type cr
bye

$ gforth hoge.fth 
ほげほげ

2011-04-14

[Linux]さくらVPSにてMongoDBを一般ユーザ権限で動かす

MongoDBにすこし興味が出たので、このページを参考に、さくらVPS(CentOS 5.5)で動かしてみました。root無くても動かせそうだったので、ユーザ権限で動かすことにしました。

ユーザ権限で動かすので、その用意。

$HOMEにいろいろどっ散らかるのはイヤなので、$HOME/srcを作って、そこにMongoDBを置くことにしました。
~ $ mkdir ~/src

MongoDBの入手

こちらのサイトにLinux 64-bit向けのtarボールがあるので、おすすめ(recommended)と書かれてるバージョンのをwgetで引っ張ってきます。
~ $ wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.8.1.tgz

インストール

$HOME/srcにtarボールを移動して、そこで解凍します。
~ $ mv mongodb-linux-x86_64-1.8.1.tgz ~/src/
~ $ cd ~/src
~/src $ tar zxvf mongodb-linux-x86_64-1.8.1.tgz
~/src $ ln -s ~/src/mongodb-linux-x86_64-1.8.1.tgz ./mongodb
以上でインストール自体は完了です。なまら簡単だべ?

データストアの置き場所を用意する

MongoDBでは、デーモンプログラム"mongod"の起動オプション"--dbpath"で、データストアのパスを設定できます。
今回は、$HOME/src/mongodb/data/db をデータストアにします。
~ $ mkdir ~/src/mongodb/data/db -p
これだけです。

mongodを起こす

ではmongodを起こします。
~ $ ~/src/mongodb/bin/mongod --dbpath ~/src/mongodb/data/db
フォアグラウンドで起き上がってきて、ログをだくだく吐き出したら、無事に起動できています。止めるときはCtrl+Cすれば止まります。

mongod起こした状態でweb管理インターフェースを見てみる

mongodを起こすと、ログの中に
Thu Apr 14 11:14:40 [websvr] web admin interface listening on port 28017
のような記述が見受けられます。見ての通り、「Web管理インターフェースがポート28017で待ち受けている」ということです。試しにブラウザでVPSの28017番ポートにアクセスしてみると、以下のようなページを見ることが出来ます。
セキュリティ的にはこんなのを外部から見れるようにしておきたくないので、mongod起動時のオプション"--nohttpinterface"を付加して、この機能を止めておきましょう。
あとはdaemontools経由で起こすなりしてやれば良いというわけですね。

2011-04-13

[Perl]Plack::Middleware::*を作ってみる

いい加減Plackが当たり前のこの頃ですが、いまだにPlack::Middleware::*を作ったことが無かったので、練習してみました。
なお、あまり気にせずに書いていたら、内容がほとんどPlack::Middlewareのドキュメントと似たものになってしまいました。

基本型

以下が、だいたい定型となるコードです。
package Plack::Middleware::OreOre;
use strict;
use warnings;
use parent qw/ Plack::Middleware /;

### enableでオプションを受け取る時に使用
# use Plack::Util::Accessor qw/ oreore watewate soregashisoregashi /;

our $VERSION = '0.01';

sub call {
    my ( $self, $env ) = @_;

    ### ここに処理をかく ###

    $self->app->( $env );
}

1;
__END__
Plack::Middleware::*を作るには、Plack::Middlewareを継承する必要があります。
で、callというメソッドですが、ここに実際の処理を書いてあげて、最後に$self->app->( $env )としてappを実行するようにします。もしHTTPレスポンスを返したい場合は、途中でPlack::Response形式のarrayrefをreturnしてあげればOKです。
もしenableするときにオプション値を取りたい(enable "OreOre", foo => 'bar'; とか)場合は、Plack::Util::Accessorを使う必要があります。
多分、これだけあれば大抵の機能をPlackに組み込むことができそうです。

ごく単純な例

ある特定パスにアクセスされた時に、他のページにリダイレクトする、というだけの単純なPlack::Middleware::Hogehogeをつくってみました。
package Plack::Middleware::Hogehoge;
use strict;
use warnings;
use parent qw/ Plack::Middleware /;
use Plack::Util::Accessor qw/ jump_url listen_path /;
our $VERSION = '0.01';

sub call {
    my ( $self, $env ) = @_;
    return [ 301, [ 'Location', $self->jump_url ], [''] ] if $env->{ PATH_INFO } eq $self->listen_path;
    $self->app->( $env );
}

1;
__END__
この場合、実際に使うときは以下の様なpsgiになります。
use Plack::Builder;

my $app = sub { [ 200, [ 'Content-Type', 'text/html' ], ['<h1>hoge!</h1>'] ] };

builder {
    enable "Hogehoge", listen_path => '/yahoo', jump_url => 'http://www.yahoo.co.jp/';
    $app;
};
これをplackupすると、/yahooにアクセスしたときだけYahoo!Japanにリダイレクトされ、それ以外は"hoge!"とかかれたページが表示されます。

ようやく少しはPlackの使い方に慣れてきました!

2011-04-07

[Perl]WebService::Simpleでレスポンスが文字化けしたら

XML::Simpleのパフォーマンスの話

WebService::Simpleは内部的にXML::Simpleを使っている。古い話だけど、XML::Simpleといえばこちらにもあるように「遅い」と評されることがあって、それはここに原因と対策がまとめられていて、掻い摘んで説明すると

・XML::SimpleはデフォルトでXML::SAX::PurePerlを内部的にパーサとして使用している。
・XML::SAX::PurePerl*が*遅いのであって、XML::Parserを使えば速度が改善される。

ということになる。そのためには
$XML::Simple::PREFERRED_PARSER = 'XML::Parser';
という具合に、XML::Simpleが内部的に使用するパーサにXML::Parserを指定すれば良い。

本題

のっけから脱線したけど、これはWebService::Simpleのparse_response()の結果が文字化けを起こすという現象にも、同様の事が言える模様。

use WebService::Simple;

my $ws = WebService::Simple->new(
    base_url => 'http://example.com/api',
    param => { api_key => '***' },
);

my $res = $ws->get( 'hoge/fuga', { q => 'piyo' } );
my $xml = $res->parse_response;

例えば、こんな具合で生成されたWebService::Simpleのオブジェクトがあって、parse_responseの戻り値が文字化けしていたとする。そんな時はまず、

use WebService::Simple;
use WebService::Simple::Parser::XML::Simple;

$XML::Simple::PREFERRED_PARSER = 'XML::Parser';

my $ws = WebService::Simple->new(
    base_url => 'http://example.com/api',
    param => { api_key => '***' },
    response_parser => WebService::Simple::Parser::XML::Simple->new( xs => $xs ),
);

my $res = $ws->get( 'hoge/fuga', { q => 'piyo' } );
my $xml = $res->parse_response;
この様な具合でresponse_parserを食わせてみると、文字化けが治ったりするかもしれない。