MonthSeptember 2009

2009-09-29の買い物

向田邦子全集〈1〉小説1 思い出トランプ

向田邦子全集〈1〉小説1 思い出トランプ

向田邦子全集〈2〉小説2 あ・うん

向田邦子全集〈2〉小説2 あ・うん

2009-09-27の買い物

北山にあるなんとかいう店(名前忘れた)が最近大丸に出店したとのことで見てみたら、このところ欲しい欲しいといっていた南部鉄の急須の、とてもかわいいのがあったので、思わず購入してしまった。これは、内部がテフロン加工されてるので、なにもしていないものよりは扱いは楽なもの。他にもあれこれ欲しいなあ。

f:id:antipop:20090927190610j:image:w400

HUgE (ヒュージ) 2009年 11月号 [雑誌]

HUgE (ヒュージ) 2009年 11月号 [雑誌]

2009-09-26の日記

だいぶ時間が経ってからの思いだし書きなので適当。

わりと早い時間に起床して、滋賀へ。浜大津行きの電車に初めて乗ったのだけど、御陵までは地下鉄、そこから地上に上がって、浜大津駅の手前ではちょっとだけ路面電車になるという変則的な路線で、趣深い。また、浜大津からの電車も、狭い駅間でちょこちょこ走る感じで、かわいかった。

琵琶湖畔でRさんを待ってでかける。琵琶湖、1年ぶりぐらいにきたけど、やっぱいいなあ。水辺にやたら羽虫がわらわらいるのには、文字通り閉口するけど(口の中に入りそうなので)。それにしてもやたら日差しが強くて暑い。9月ももう終わりだというのに。

f:id:antipop:20090926105726j:image:w400

いい店があるというので、膳所まで歩く。初めて訪れた場所だが、商店や飲食店が緩やかな坂沿いに並んでいて、人通りも多くて活気があり、なかなかに感じのよい場所であった。「オープンセサミ」というデリで食事。オーガニックな感じでわりとおいしいものの、僕にはちょっと量が少ないのであった。

今日の主目的である石山寺へ。それまでは普通に街中といった感じだったのが、石山寺駅直前でなにやら突然風光明媚な風情になって驚く。琵琶湖から流れる大きな川がいい感じ。お寺まではしばらく距離がありそうだったのでバスに乗ったものの、案内があると思ったらまったくなくて、乗り過ごしてしまい、意味のない感じに……。

さて、石山寺。紫式部が『源氏物語』の着想を得たという話でつとに有名なわけだが、和泉式部ファンの僕としては、敦道親王との恋路がうまくいかないことに悩んだ彼女が、しばらく籠もっていたお寺として、一度訪ねてみたいところなのだった。が、紫式部については、謎のロボットなどもあったりするような扱いなのに、和泉式部については何の言及もない感じで、ちょっと残念。しかしまあ、山中いっぱいにあれこれと趣向をめぐらせた風情は楽しくて、きてよかったなあと思う。

f:id:antipop:20090926132601j:image:w400
f:id:antipop:20090926134938j:image:w400

帰りに、お寺のそばの食事処でしじみめしを食べる。期待してたけど微妙な感じで、わりと残念。

2009-09-25の日記

ひと待ち中に、津村記久子『ミュージック・ブレース・ユー』を読む。

AnyEventでtail -f

AnyEventの練習をしてみようってんで、とりあえずtail -fぽいのを書いてみる。こんなんでいいんだろうか……。よくわからない。

#!/usr/bin/env perl
use strict;
use warnings;
use AnyEvent;
use AnyEvent::Handle;
$| = 1;
my $file = shift or die qq{usage: $0 filename};
open my $fh, '<', $file or die qq{can't open file: $file};
my $cv = AE::cv;
my $handle = create_handle();
sub create_handle {
new AnyEvent::Handle
fh => $fh,
on_error => sub {
my ($handle, $fatal, $message) = @_;
$handle->destroy;
undef $handle;
$cv->send("$fatal: $message");
},
on_eof => sub {
$handle->destroy;
undef $handle;
$handle = create_handle();
},
on_read => sub {
my $handle = shift;
$handle->push_read(line => sub {
my ($handle, $line) = @_;
print "$line\n";
})
};
}
warn $cv->recv;

PSGI/Plack勉強会

PSGI/Plack勉強会を開きました(ひとりで)。資料はGitHubにあげてあります。いろいろまとめ書き足りてないのですが、自分的には納得したので満足してしまいました。

以下にもコピペ。

PSGI/Plackとは?

  • PSGI = Perl Web Server Gateway Interface Specification
    • WebサーバとWebアプリケーションとの間のインタフェイス仕様
  • Plack = PSGIのリファレンス実装
    • PSGI実装のひとつ(とはいえ、やたら気合いの入った感じになってるけど)
    • PSGI != Yet Another WAF
    • PSGI != Plack

PSGI策定の背景

  • 各Webアプリケーションフレームワークがバラバラに実装していた、WebサーバとWebアプリケーションとのインタフェイスを統一したい。
  • そのためには、仕様と実装の区別を明確に行う必要がある。
  • そこで、仕様としてPSGIが定められ、そのリファレンス実装としてPlackが開発されている。
  • インタフェイス仕様と実装を切り分けることにより、Webアプリケーションフレームワーク開発者は、より本質的な実装に注力できる。

PSGIプロトコル概略

ref: http://github.com/miyagawa/psgi-specs/blob/master/PSGI.pod

.------------------------------------------------------------.
|                        Application                         |
'------------------------------------------------------------'
|
.------------------------------------------------------------.
|                           WAF                              |
'------------------------------------------------------------'
| passes $app as a coderef
.------------------------------------------------------------.
|                    PSGI implementation                     |
'------------------------------------------------------------'
|                   | request as an $env   |
.------------------. .------------------. .------------------.
|     mod_perl     | |      FastCGI     | |    Pure  Perl    |
'------------------' '------------------' '------------------'
|                   |                      |
.------------------------------------------------------------.
|                         Request                            |
'------------------------------------------------------------'

PSGIにおけるアプリケーションとは

  1. 環境変数PSGIによる拡張あり)をハッシュとして受け取り、
  2. レスポンスをPSGIに定められた形式の配列リファレンスで返す

という仕様を満たすコードリファレンス(詳細は後述)。

Plack

  • PSGIのリファレンス実装
  • 現在、以下のバックエンドに対応
    • Apache2
    • CGI
    • Coro
    • Danga::Socket
    • FCGI
    • Mojo
    • ReverseHTTP
    • ServerSimple
    • Standalone
    • nginxにも限定的に対応
    • 今後、GAE, mod_perliteにも対応予定とのこと

Hello World

  • ハンドラ = coderefを.psgiファイルに定義する
  • plackupを使い、plackを起動する

config/hello_world.psgi

my $handler = sub {
return [
200,
[ "Content-Type" => "text/plain", "Content-Length" => 11 ],
[ "Hello World" ],
];
};

plackの起動

perl -Imodules/Plack/lib modules/Plack/scripts/plackup -app config/hello_world.psgi

Hello World (2)

plackupの行っていること:

  1. config/hello_world.psgiをロード。
  2. Plack::Loaderにより適切なサーバ実装が選択される。
    • この場合、Plack::Impl::StandAloneが使われる。plackupへの–implオプションで変更可能。
  3. 選択されたPlack::Impl::*に$handlerがわたされ、アプリケーションが実行される。

Plackを使ってWAFを作ろう (1)

最低限必要なもの:

  • 環境変数を受け取り、レスポンスをPSGI形式で返すコードリファレンス
  • 受け取った環境変数(リクエスト)を元に、あれこれする箇所(WAFの勘所)
  • psgiファイル

Plackを使ってWAFを作ろう (2)

環境変数を受け取り、レスポンスをPSGI形式なコードリファレンスとしてハンドラ。

package MyWAF::Handler::PSGI;
use strict;
use warnings;
use Carp qw(croak);
use UNIVERSAL::require;
sub handler {
my ($class, $app) = @_;
qroak qq{no such app: $app} if !$app->use;
    sub {
my $env = shift;
$app->run($env);
};
}
!!1;

Plackを使ってWAFを作ろう (2)

受け取った環境変数(リクエスト)を元に、あれこれする箇所(WAFの勘所)。

package MyWAF;
use strict;
use warnings;
sub run {
my ($class, $env) = @_;
# $envからリクエストオブジェクトを生成
# どのコントローラ、アクションにdispatchするかを決定
# コントローラ実行
# ビューをレンダリング
return $response->result;
# レスポンスを以下のような形式の配列リファレンスとして返す
# [
#     200,
#     [
#         'Content-Type' => 'text/html',
#         # ...
#     ],
#     [ 'Hello World' ]
# ]
}
!!1;

Plackを使ってWAFを作ろう (3)

早速使ってみる。MyAppを作成。

package MyApp;
use strict;
use warnings;
use base qw(MyWAF);
!!1;

Plackを使ってWAFを作ろう (4)

Plackアプリケーションを起動するためのpsgiファイル。

use MyWAF::Handler::PSGI;
my $handler = MyWAF::Handler::PSGI->handler('MyApp');

Plackを使ってWAFを作ろう (5)

MyAppをCGI上で動作させる。

#!/usr/bin/env perl
use strict;
use warnings;
use Plack::Impl::CGI;
my $app = do 'config/myapp.psgi';
Plack::Impl::CGI->new->run($app);

Plackを使ってWAFを作ろう (6)

MyAppをmod_perl上で動作させる。

<Locaion />
SetHandler  perl-script
PerlHandler Plack::Impl::Apache2
PerlSetVar  psgi_app /path/to/myapp.psgi
</Location>

Plackを使ってWAFを作ろう (7)

続きはGitHubで。

RidgeのPSGI/Plack対応

id:hakobe932が対応つつあります。

  • Ridgeのplackブランチ

まとめ

  • PSGIの仕様はシンプル。
  • Plackという実装もあるので、サーバ実装の差異にまつわる面倒なことをお任せできて、簡単にWAFを作れる。
  • お膳立ては整っているので、いけてるWAFにするのはWAF開発者のセンス次第。

2009-09-23の日記

『アイの物語』を読んで盛り上がってきたので、こちらも購入。

詩羽のいる街

詩羽のいる街

2009-09-22の日記

朝8時頃起床。読みかけの『アイの物語』を読了。大変面白かった。

しばらくして、昼食の材料を買いに行く。今日は炊き込みご飯と鮭のムニエル。どちらもバターを使う。鮭は、火を強くし過ぎてしまって、ムニエルというよりは焼き魚みたいな見た目になってしまったものの、けっこうおいしい。簡単だし、これはいいなあ。炊き込みご飯もいい感じ。

f:id:antipop:20090922123859j:image:w400

食後は、プログラミング関連のお勉強。ビールを一本飲んだら眠くなってきて、ちょっと昼寝。夕方、昼食の残りで、同じものを食べる。引き続き、あれこれ。

22時前にRさんが帰ってきて、Kyoto Music Festivalへ行く準備。まずはLab Tribeへ。Kさん、Rさんのお友達のUさんらと合流。しばらくしてMetroへ行ったり、またLab Tribeへ戻ったり。途中、けっこう疲れてきたので、近くのK6で一杯いただく。せっかくなのでWORLDまで足を伸ばす。ちょうどMEGが終わって卓球が回し始めたところ。いい感じ。

休憩を取りに上がると、Kさんが出てきたので、近くの鉄板焼屋さんで食事。しばらくしてRさんも上がってきた。途中でUさんと合流して、一杯飲んでから帰宅。

2009-09-21の日記

午前8時頃起床。しばらくネットを眺めたり、コードをちょっと書いたり。

昼、MacBookの修理のため、心斎橋のアップルストアへ。面倒くさい気分。三条京阪から淀屋橋で、御堂筋線に乗り換えて2駅で心斎橋。アップルストアはすぐに見つかった。予約した時間から少し待って呼ばれる。「キーボードとタッチパッドが反応しなくなって……」というと、即座に「バッテリーが原因ですね」といわれた。なんでバッテリーが関係あるんだ……?と訝しく思っていると、「やっぱり膨張していますね」といって、明らかに膨らんだバッテリーを取り出して見せてくれた。その膨張したバッテリーが、内部を圧迫して、キーボードやタッチパッドの動作を阻害していたとのこと。キーボード周りの回路の問題だとばかり思っていたので、まったくもって予想外。やたら「申し訳ございません」と繰り返すので、こちらが恐縮してしまう。しかしまあ、こうしてキーボードが反応しないという現象がなければずっと使い続けていたかもしれず、そのうち燃えたりしていたかもしれないと思うと、ちょっと怖くなったりもした。

用事を済ませたら、即帰路につく。大阪はあんまり落ち着かない。行きの電車の中で読み始めた『アイの物語』の続きを読む。途中、木津川、淀川、宇治川を通ったのを眺めて楽しんだ。あんまり京都から出ようという気もないのでたまにしか電車に乗らないのだけど、そういう風景は好きだなあ。

帰宅して、ご飯を炊き、昨日のカレーの残りを食べる。引き続き『アイの物語』を読む。途中、しばらく夕寝をしたりしつつ、ひたすら本読み。面白い。今日はKyoto Music Festivalの初日なのだけど、あんまり興味を引くひとも出ないし、なんだかまったくクラブとか行くようなテンションでもない(しかもむちゃくちゃひとが多いだろうし)ので、家でだらだらする。ちょっと雨も降ったりして、あまり天気もよくないし。

2009-09-20の日記

2度寝して、11時頃起床。MacBookが壊れてしまって、修理に時間がかかるかもなーってんで、手元のX41を使える状態にするべく、あれこれと。面倒くさい。

夕方頃、カレーでも作るかーってんで、材料を買いに行く。野菜はまだ残ってるので、ルーや肉とか。まあカレーとか、市販のルーでちゃちゃっと作るだけなら特に面白味もない感じだなあ。どこかで味噌を入れると深みがでてよいみたいな記述を見た気がしたので入れてみたのと、たまねぎを、普通に切ったのを入れたのとは別に、一個すりおろしたものも入れてみたのが工夫といえば工夫ではあった感じ。とりあえずおいしかったのでよかった。

f:id:antipop:20090920201156j:image:w400

夕食後は、ビールをひたすら飲みつつ、ちょっとコードを書いたり。

© 2020 栗林健太郎

Theme by Anders NorénUp ↑