ご報告

すでに一週間経過しておりますが、6年2ヶ月勤めた株式会社KDDIウェブコミュニケーションズを退職し、株式会社フリークアウトに転職しました。長い間お世話になり、社内外でいろんな人と出会えました。ありがとうございました。今後共よろしくお願いします。あと次のエントリはYAPCの感想になるはず。。あとage++
f:id:ka2u:20121006104124j:plain

安全なWebアプリケーションの作り方読んだ

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践


GW中に山のように積み上がっている本を、一冊でも読み終わらせようと決めて、途中まで読んでしばらくおいてあった徳丸さんの安全なWebアプリケーションの作り方を読んだ。

内容に関しては、Webアプリケーションを作成するときに発生しやすい脆弱性について、なにがどうやって発生するのかと対処法を中心に、認証、認可、ログ、アカウント登録などの場面で発生しやすい脆弱性、文字コード関連、携帯電話、サーバ環境による脆弱性、プロジェクトにおけるセキュリティの扱いまで含まれている。個人的には、認証、認可、アカウント登録などをWebアプリケーションで、それら一連の流れを安全に行うにはどうすればいいか、ひとつの指針として使えると思う。

プロジェクトによって要求されることは違ってくるとは思うが、これを読んでおけば大きくハズレた脆弱性を含んだアプリケーションを作ってしまわないで済むと思う。ただ、本当はこういったことを気にしないで、すべての人が安全に実装できるようになるといいんだけどね。本当にやりたいこととは別なので。

Webエンジニアのためのデータベース[実践]入門読んだ

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

読んだ。この間Facebookに転職された松信さんが書いた本。

データベースの基礎から、障害対策、パフォーマンス、新しいバージョンのMySQLを使うことのメリット、NoSQLとの比較、MySQLの信頼性、MySQLソースコード解析、大規模な環境での運用まで、やはりMySQL中心ではあるが他のデータベースを扱かっている人でも有用な部分はたくさんあると思う。他にもSSDのランダムアクセスでの優位性がなんどか強調されていて、適切に使うととても効果が高いことがわかる。

データ量が少なかったり、アクセスが少ない場合はそんなに問題にならないが、ある程度の規模を越えるとこの辺知らないと、 なかなか厳しいんではないかと思う。Webエンジニアだけでなくて、 ちょっと前の知識しかないインフラエンジニアとかも読んだほうがいいと思う。

Emacs実践入門読んで設定見直した

読んだ。いままではバッファロー本をすすめていたが、今後はこちらをすすめる。
経歴はvim -> emacs -> vim -> emacs という感じでvimでもemacsでもそれなりにコード書いている。

一点だけ、やってみてELPAはまだ使い物にならないなと感じた。Mac OS Xでhomebrewでいれたemacs 23.3.1で試したがpackage.elでpackageの削除ができない。それに扱えるpackageが少ないので結局auto-installや手動でのインストールをすることになる。Emacs24で標準になってpackageが充実したら使おう。

まあ、設定に関しては好みがあるので、使いそうなものだけ選んで設定するのがいいと思う。一例であり全てしたがう必要はない。

Kindleで英和辞書を使う

最近Kindleで英語の本を読んでいるが、内蔵の英英辞書だとすこしきついので英辞郎を加工してKindleで使えるようにした。

使わせてもらったのはこちら。
http://fallabs.com/enghelper/

英辞郎のデータが当然必要になるが、基本的に書いてある通りに実行していけば使えるようになる。環境は

  • Mac OSX
  • Ruby 1.9.3

やってみると、使ったマシンがMacBook Airだったためか、結構時間がかかった。Kindle用の辞書作成にだいたい1時間半くらいかかった。途中でメッセージが出るには出るがプログレス的なものではないので処理が進んでいるのかわからず、何度か途中で止めてしまったりもした。無事にデータが作成できたらWindows上でKindle用に変換して、Kindleのディレクトリに置いてKindleの辞書設定で選択するだけ。

使ってみた感想はやっぱり読む速度が向上した気がする。ただ、おれが無印Kindleを使っているからか、カーソルを移動させて選択する際に、目的の単語に到達する前の単語を検索してしまい、その後目的の単語を検索するので、単語の表示に少し時間がかかる。Kindle Touchを使えばこういうことはないんだろう。Kindle Touchが欲しくなるな。

JSON::RPCをPlack::Testでテストするの法

app.psgiの中でこんな感じにSYNOPSISみたいに書いて

use strict;
use warnings;
use JSON::RPC::Dispatch;
use Router::Simple::Declare;
  
my $router = router {
    connect 'test' => {
        handler => 'Test',
        action => 'test'
    };  
};
 
my $dispatch = JSON::RPC::Dispatch->new(
    prefix => "MyApp::RPC::Handler",
    router => $router,
);
 
sub {
    my $env = shift;
    $dispatch->handle_psgi($env);
};


適当にhandler書いて
MyApp/RPC/Handler/Test.pm

package MyApp::RPC::Handler::Test;
 
use strict;
use warnings;
 
sub new {
    my $class= shift;
    my $self = bless {}, $class;
    return $self;
}

sub test {
    my $self = shift;
    return "Test Test";
}

1;

99_rpc.tとかで

use strict;
use warnings;
use HTTP::Headers;
use HTTP::Request;
use JSON;
use Plack::Test;
use Plack::Util;
use Test::More;
use URI;

my $app = Plack::Util::load_psgi('app.psgi');

test_psgi $app, sub {
    my $cb = shift;

    my $coder = JSON->new;
    my $headers = HTTP::Headers->new( Content_Type => 'application/json' );
    my $uri = URI->new('http://localhost');
    my $post_content = $coder->encode( {
        jsonrpc => '2.0',
        method  => 'test',
        params  => { hoge => 'foo' },
        user_id => 'bar',
        id      => 1,
    } );
    my $req = HTTP::Request->new(
        POST => $uri, $headers, $post_content);
    my $res = $cb->($req);
    ok $res->status_line, 'test';
};

done_testing;

とかやると、以下のようにエラーになる。

Can't call method "request" on an undefined value at /path/to/perl5/perlbrew/perls/perl-5.14.2/lib/site_perl/5.14.2/Plack/Test/MockHTTP.pm line 29.

で、まあちょっと調べてみるとどうやらPlack::Test::MockHTTPの中では、PSGI response array refを要求してるけどhandle_psgiはPlack::Responseを返している様子。なのでapp.psgiの最後で

my $res = $dispatch->handle_psgi($env);
$res->finalize;

してやると無事にテストが通った。

まあ、JSON-RPCの002_basic.t見ろって話ですか。あれもしかしてみなさん、周知の事実ですかそうですか。