2008年11月29日

Yakohama.PM で発表した Shika と HTTP::Engine と Data::Model と

流石に3日連ちゃんで発表するのは、どこのYAPC::Asia状態だよ!?と思っていて当初は控えていたのですが、案外体力的にも行けそうだったので当日になって飛び入りで発表させて頂きました。
Yokohama.pm++

本日の発表は、既にtokuhiromが書いてるけど、Shikaについてです。
http://svn.coderepos.org/share/docs/yappo/20081128-yokohamapm3/shika.pl
軽量化MooseなんだったらなぜMouseじゃないのか?Shikaを使う利点は何か?今のステータスはどういう物か?等を話してきました。
前日の昼にスタートしたプロジェクトの事を勉強会で発表するなんて早漏すぎだと思われるかもしれないけれども、Shikaのようなものの需要はだいぶ前から構想されてたのでちょうどいいのです。
必然的にHTTP::EngineをCGIでそこそこ使える時代になってきそう。

ちゃんとフォーローしときますがMooseが駄目だとかそういう話ではないです。あくまでも用途とMooseで出来る事にちょっとしたギャップがあっただけ。

本当はShikaの話は5分で終わってData::Modelのプレゼンしようと思ってたけどShikaだけで時間つかっちゃいましたw
id:nekokakによるDBIx::SkinnyのプレゼンがそのままData::Modelの資料として転用出来そうなので、それをコピペして改変してどっかで発表出来ればなと思っています。
たぶんORMconあたり。
ちなみにDBIx::SkinnyよりData::Modelの方が速いとかとか。

「僕たちはMOPを使いたいんじゃなくて気持ちよくコードを書きたいだけ」という事を再認識しました。

Posted by Yappo at 02:31 | Comments (0) | TrackBack

2008年11月28日

HECon#1 と Shibuya.pm で発表してきたの資料

perl weekという事でHTTP::EngineカンファレンスとShibuya.pmで発表してきました。

http://svn.coderepos.org/share/docs/yappo/20081126-hecon1/hecon1.pl
http://www.nicovideo.jp/mylist/8698529
HEConはhidekさんの絶大な協力によりつつがなく終わる事ができました。Yacafi::Engineに感動しっぱなしでした。
dannさんも切望してるのでHECon#2なんかもあったりするかもしれません。

http://svn.coderepos.org/share/docs/yappo/20081127-shibuyapm10/shibuyapm10.pl
http://www.nicovideo.jp/mylist/9691133
shibuya.pmでは、主に今やってる事の紹介などをしてきました。

なんかしらの勉強会をやると世の中が動くとは孔子もいってましたが、良い感じのプロジェクトも始まりましたが、そのお話は後日ということで。

週末にはSUTEKI hackathonが開催されるので、今回発表したもの周りのコードをぐいっと進めたい所ですね。

Posted by Yappo at 15:05 | Comments (0) | TrackBack

2008年11月26日

HTTP::Engine で進捗表示しつつアップロード

HECon前の前菜に最適だったので。
404 Blog Not Found:perl - LWP::UserAgentで進捗表示しつつダウンロード
というかHECon1は参加条件緩めたしまだあと10名程来れるので是非是非きて下さい。発表枠も1-2枠くらい余ってます。Shibuya.pmの前夜祭的な参加もおkす。

で、何をやったかというとファイルアップロードされるとプログレスバーを表示する。
ServerSimpleやPOE向きの実装。
これを使う事によりアップロードされまくってる感が増大します。しかも簡単なhackで済んでるところも素敵ですね。

こんな感じにコンソール出力されます。

$ perl ./http-engine-progressbar.pl
HTTP::Server::Simple: You can connect to your server at http://localhost:1978/
Upload[15774168]: 100% [=========================================================================================================]D 0h00m04s

use strict;
use warnings;
use HTTP::Engine;
use Term::ProgressBar;

my $engine = HTTP::Engine->new(
    interface => {
        module => 'ServerSimple',
        args   => { port => 1978 },
        request_handler => sub {
            my $req = shift;

            return HTTP::Engine::Response->new(
                body => q|<form method="post" enctype="multipart/form-data">
                          <input type="file" name="upload_file" />
                          <input type="submit" />
                          </form>|
            ) unless $req->param('file');
        },
    }
);

{
    my $progress;
    my $content_length = 0;
    my $read_size      = 0;
    $engine->interface->request_builder->meta->make_mutable;
    $engine->interface->request_builder->meta->add_before_method_modifier(
        _read_init => sub {
            my($self, $args) = @_;
            return unless $content_length = $args->{content_length};
            $read_size = 0;
            $progress = Term::ProgressBar->new({
                count => $content_length,
                name  => "Upload[$content_length]",
                ETA   => 'linear',
            });
        },
    );
    if (1) {
        $engine->interface->request_builder->meta->add_around_method_modifier(
            _read_chunk => sub {
                my $next = shift;
                my $size = $next->(@_);
                $read_size += $size;
                $progress->update($read_size);
                return $size;
            },
        );
    }
    $engine->interface->request_builder->meta->add_after_method_modifier(
        _read_to_end => sub {
            return unless $content_length;
            $content_length = 0;
            $read_size      = 0;
        },
    );
    $engine->interface->request_builder->meta->make_immutable;
}

$engine->run;

Posted by Yappo at 12:04 | Comments (1) | TrackBack

2008年11月21日

TypePad Connect + Yacafi で掲示板作った

TP Connect BBSという掲示板CGIを作りました。
Connectはコメントにリプライとか付けられるので、とりあえず適当なpermalinkさえあれば掲示板になるんじゃないかと思って作ってみました。

ソースコード見れるようになってるので見れば判るのですが、掲示板名だけ若干サーバにファイルを作りますが、uriの中に掲示板名仕込んでいるのでディスクレスな掲示板運用も可能です。
Yacafiのサンプルもかねて見たのでどうぞご利用下さい。

Posted by Yappo at 21:20 | Comments (0) | TrackBack

TypePad Connect Betaつけた

bkなspamコメント対処しててmt-comment.cgiがぶっ壊れてたですがTypePad Connectを付けた事により全部解決した!

4年前のMTでも難なくくっついたZE!

トラックバック版もほすぃ

ちなみに2.6xxxなMTで使うには貼付けるhtmlのjavascirptでTPConnectのとこを以下のようにする。
しなくても良いけど、管理ページでタイトルでなくて悲しくなる。

TPConnect.tpc_url = '<$MTEntryPermalink$>'; TPConnect.tpc_title = '<$MTEntryTitle$>'; TPConnect.tpc_message = '';

Posted by Yappo at 17:04 | Comments (0) | TrackBack

2008年11月19日

Shibuya.PM tech talk #10 の申し込み間に合わなかった人への提案とust時代の勉強会の関わり方

昨夜に募集開始されたShibuya.PM tech talk #10ですが、夜に募集開始したのにも関わらず3時間足らずで定員オーバーとなりました。
wassrとか等を見ると行きたいけど間に合わないよーという話もチラホラでてます。

そこで提案なのですが折角ネット中継されるので「Shibuya Perl Mongersテクニカルトーク#10 パブリックビューイング」という催しを同時開催するのはどうでしょうか?
ustで見れるから会場に来なくてもいい。という話ではなく、やはり現地にきたら現地に来たなりの何かが得られるので、というか一人で見るよりも同じ目的の人間が集まってワイワイ見た方がたのしいじゃんすか。
定員で参加出来なくて「現地で得られるもの」的な収穫は半減するかもしれないけど、そういったパブリックビューイング的な会場に数人数十人集まれば得る物は出てくると思うんですよね。
会場次第では現地と違ってわいわい酒飲みながら見れるし、一人で見るのと比べると懇談会まで開催出来ちゃう!

勉強会といっても地理的条件やら会場のキャパシティやらで参加希望者全員が参加出来るなんて事は稀なので、こういった形で勉強会をスケールアウトして行くと現地の開催者の人手的な負担もかけずに規模を拡大出来そうです。
パブリックビューイング会場が増えれば各拠点でust配信してustreamer的な何かで全拠点の映像を出してプロジェクターで出力したり、発表の質問とかも会場ごとに出したりと双方向的な何かもできるかもですね。

僕は発表するので参加出来ないですが、誰か「Shibuya Perl Mongersテクニカルトーク#10 パブリックビューイング」やらないか?もちろんどこかしらの会社さんの会議室等を利用する感じになるでしょうが。。。

ustじゃやだやだやだという人は前夜祭的な日程で開催されるHECon #1に是非お越し下さい。発表枠もまだまだあるよ!

追記:早速賛同してくれる方々が現れましたよ!
大阪:Shibuya.pm ustream中継 新大阪サテライト会場 - 葉っぱ日記
京都:Shibuya Perl Mongersテクニカルトーク#10 京都サテライト開場のご案内 - antipop
札幌:?
恵比寿:?

Posted by Yappo at 11:05 | Comments (1) | TrackBack

Shibuya Perl Mongersテクニカルトーク#10

来る11月27日(水)にShibuya Perl Mongersテクニカルトーク#10が行われます。
具体的に話す内容は決まってませんが大筋のテーマに沿ったものになるます。
Perlを第二言語にしてもらえる予備軍の人向けの話は他の人にゆづるかんじで。

Posted by Yappo at 00:55 | Comments (49) | TrackBack

2008年11月18日

Math::Pari を Mac 環境で入れる方法

Crypt::RSA を Mac で使いたくて Crypt::RSA を install 仕様としたら Math::Pari でこけた。
なにやっても入らない macports しても無駄。fuckfuckfuckfuckだったのですが、ようやく入れる事が出来た。
GCC の インライン最適化を仕様として全オブジェクトファイルに_overfllowというシンボルを作ってリンクできなかったかんじ?

cd /tmp
wget ftp://megrez.math.u-bordeaux.fr/pub/pari/unix/OLD/pari-2.1.7.tgz
pari-2.1.7が必要
tar zxvf pari-2.1.7.tgz
sudo cpan> look Math::Pari
で 2.010800 を入れようとして shell に。
おもむろに vim Makefile.PL して GCC_IN がついてる行をコメントアウト。
vim libPARI/Makefile.PL もして同上。
perl ./Makefile.PL paridir=/tmp/pari-2.1.7 machine=none
make
make test
make install

Crypt::RSAもちゃんとはいった。。。あーつかれた。もう疲れてRT送る気力無い。いつか送る。

Posted by Yappo at 20:31 | Comments (1) | TrackBack

2008年11月17日

CodeReposのコミッタが500人越えました

509人になりました。kanさんがしゃぶしゃぶ奢ってくれるという噂の栄光の500人目のコミッタはeveresさんに確定しました。

< kan_> 来月あたりにやりますかね -codereposbot:#coderepos- CodeRepos::Share: Committers/aratafuji created (aratafuji) - http://coderepos.org/share/wiki/Committers/aratafuji?version=1 < kan_> coderepos忘年会兼で
との事なので来月になる模様です。

1981忘年会を越える規模になるかどうか要注目ですね!
ちなみにしゃぶしゃぶ会場は100人はいらないけど、100人越える貸し切りだと上の店舗使えるらしい。

Posted by Yappo at 15:36 | Comments (1) | TrackBack

2008年11月14日

HTTP::Engine 0.0.18

色々とbug fixやらがたまってきたので 0.0.18 として shipit しました。
仕様はほぼほぼ固まっているのでドキュメントを充実させて1.0.0を出すために0.9.1_xx系統をやって行きたいとは思ってます。

川崎さんにmod_fastcgi + apach2な環境のテスト作ってもらえたら嬉しいなぁ。なんて。

Posted by Yappo at 19:27 | Comments (2) | TrackBack

update of Yacafi #1

Yacafiが色々と拡張されました。

TemplateはMojo::Templateを改造したMENTA::Templateを移植して使っています。MENTA::Template について - TokuLog 改めB日記も参考にしてください。
Template機能を使わない状態で--packした場合には不要なコードが消えるようになってたりします。

アクションは、今まで./yacafi.cgi?action=fooだったらdo_fooを呼ぶようにしてたんですが、./yacafi.cgi/fooという形をとるようにしました。./yacafi.cgi/foo/bar/bazでdo_foo_bar_bazが呼ばれます。./yacafi.cgi/foo_bar_bazも同様です。

その他実際に動いている様子をhttp://tech.yappo.jp/demo/yacafi/yacafi.cgi/http://tech.yappo.jp/demo/yacafi/yacafi-template.cgi/で確認出来ます。

ファイルアップロードCGIつくるための方法は無いですがおいおい考える事にする。

Posted by Yappo at 16:56 | Comments (1) | TrackBack

HE conference#1開催します

株式会社KDDIウェブコミュニケーションズさんの御好意のお陰でHEconが開催される事となりました。
http://soozy.org/index.cgi?HEcon1
主にHTTP::Engineや、それに類する技術についての勉強会です。(場合によってはHyperEstraierも可)
11月まつのPerlMongers3連日の初日にあたる2008年11月26日(水)20時から麹町で行われます。
定員は30名までなので席のあるうちにお早めにどうぞ。

基本的にHTTP::EngineのAUTHORの方は全員参加という事でひとつ。

Posted by Yappo at 16:19 | Comments (1) | TrackBack

2008年11月12日

Yacafi という軽量CGIフレームワーク書いたよ

MENTA というウェブアプリケーションフレームワークをかいてみた - TokuLog 改めB日記やらNanoA というウェブアプリケーションフレームワークをかいてみた - id:kazuhookuのメモ置き場やらと軽量CGIフレームワーク作りが流行ってるようなので昼飯食った後に20分くらいで書いたよ。

Yacafi(Yet another CGI application framework interface)と言います。
http://svn.coderepos.org/share/lang/perl/Yacafi/trunkからsvn coできるけど、Yacafiはモジュール一個だけあれば動くようにしてあるのでhttp://svn.coderepos.org/share/lang/perl/Yacafi/trunk/lib/Yacafi.pmからwgetとかしてきても使えるよ!

特徴

Yacafi は使い捨て等の軽めのCGIを、いわゆる MVC 的なノリで開発する事が出来ます。
Yacafi.pm と index.cgi 以外のファイルを編集する必要もありません。
いわゆる MVC のノリで開発すると、ディレクトリ掘ったりとかファイルが増えてしまい使い捨てCGIなのに、ちょっと面倒くさくなっちゃうというデメリット(?)が回避できます。
配布する時は 、Yacafi.pm と index.cgi をサーバにアップロードする等することも出来ますし、perl index.cgi --pack というコマンドラインを実行する事によって、 Yacafi.pm と index.cgi を合成したMENTAインスパイアの1つのファイルにまとめて配布する事も可能です。

Yacafi.pm を見れば判りますがblessすら使ってません。全部クラスデータ的なとこに突っ込んでます。

MENTA や NanoA は、いわゆる普通の Web Application Framework を使うかの如く CGI の開発をしつつ軽量性に重点を置いているのに対して、 Yacafi は軽量な使い捨て CGI の開発を行い易くなるような所を重点に置いている違いがあります。

how to

使い方はhttp://svn.coderepos.org/share/lang/perl/Yacafi/trunk/example/index.cgiを参考にして下さい。
といってもとても簡単で

use strict;
use warnings;
use Yacafi;
dispatch;

sub do_index {
    view 'index';
}

sub view_index {
    'hello yacafi!';
}
といったコードだけでディスパッチャ機能付きのCGIが作れます。

ディスパッチする方法としては今の所、index.cgi?action=foo といった形でactionの値を使って、その値に対応するコントローラ関数のdo_*関数を呼び出します。
action=fooならdo_fooとといった感じです。
do_*関数の戻り値は view 'view_name'; と行った感じでViewを呼び出す事を推奨します。
別途

sub do_foo {
    return {
        headers => { 'Content-Type' => 'text/plain' },
        body    => 'hello raw view',
    };
}
のようにして生データも返せます。

viewの定義としてはview_を頭に付けた関数名を書いて下さい。
barというviewを作りたければ sub view_bar { 'hoo' } です。
コントローラ関数等からは view 'bar'; として呼び出せます。
view 'bar', %options といったように引数も渡せ、sub view_bar { my %args = @_; 'aaa' } といった感じで受け取れます。
view関数の戻り値は、ブラウザに返したいコンテンツをそのまま返して下さい。
テンプレート周りが欲しければ別途用意してください。
上記 do_foo のような形式の HASH リファレンスを直接返す事もできます。

modelの定義も出来ますが今の所ノープランでviewと同じ挙動です。

export関数

query('param_name') といった感じでクエリパラメータの取得ができます。MENTAから主にコードをパクっています。

redirect $uri; といった関数を使ってリダイレクト可能です。status codeを変更したければ redirect $uri => 301; のようにして下さい。

サニタイズ目的で filter 関数が使えます。 filter "<script>alert('hello');</script>", => 'html'; の用にお使い下さい。
複数のフィルタを同時に使う事が出来ますが今の所 html しか用意していません。
必要なら

    filter->{uri} = sub {
        my $uri = shift;
        # 処理
        return $uri;
    };
といった感じで拡張して filter "http://", => 'uri'; のように呼び出せます。

TODO

TODOは、せめてファイルアップロード機能くらいはつけたいです。あと、pre_request, post_request的なフックも。

Posted by Yappo at 17:15 | Comments (0) | TrackBack

2008年11月07日

HTTP::Engine And Mojo Benchmarking

Update: Mojo作者のSebastianもベンチマークとってくれたよ! (new benchmark by Sebastian)
Mojo vs. HTTP::Engine - Sebastian Riedel - Perl and the Web
sri++
And if there is time, i make benchmark of FCGI.

本気bar効果でMojoが注目されてるのでHTTP::Engineとの速度差を簡単にとった。
そもそもMojo単体のWeb Serverの使い方が良くわからないので Mojolicious の CLI を見てそれっぽい Mojo::Server::Daemon を使った。

on New MacBook 2.4G

Mojo's source code

use strict;
use warnings;
use Mojo::Server::Daemon;

my $daemon = Mojo::Server::Daemon->new;
$daemon->port(8082);
$daemon->run;

HTTP::Engine's source code

use strict;
use warnings;
use HTTP::Engine;
use HTTP::Engine::Response;

HTTP::Engine->new(
    interface => {
        module          => 'ServerSimple',
        args => { port => 8081 },
        request_handler => sub {
            my $req = shift;
            HTTP::Engine::Response->new(
                body => 'Congratulations, your Mojo is working!',
            );
        },
    }
)->run;

Mojo's Apache Bench Result

bash-3.2$ ab -n 2000 -c 2 http://127.0.0.1:8082/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 200 requests
Completed 400 requests
Completed 600 requests
Completed 800 requests
Completed 1000 requests
Completed 1200 requests
Completed 1400 requests
Completed 1600 requests
Completed 1800 requests
Completed 2000 requests
Finished 2000 requests


Server Software:
Server Hostname:        127.0.0.1
Server Port:            8082

Document Path:          /
Document Length:        38 bytes

Concurrency Level:      2
Time taken for tests:   4.229 seconds
Complete requests:      2000
Failed requests:        0
Write errors:           0
Total transferred:      318000 bytes
HTML transferred:       76000 bytes
Requests per second:    472.91 [#/sec] (mean)
Time per request:       4.229 [ms] (mean)
Time per request:       2.115 [ms] (mean, across all concurrent requests)
Transfer rate:          73.43 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.2      0       3
Processing:     2    4   0.7      4      11
Waiting:        1    3   0.6      3       9
Total:          2    4   0.8      4      11

Percentage of the requests served within a certain time (ms)
  50%      4
  66%      4
  75%      4
  80%      5
  90%      5
  95%      5
  98%      6
  99%      7
 100%     11 (longest request)

HTTP::Engine's Apache Bench Result

$ ab -n 2000 -c 2 http://127.0.0.1:8081/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 200 requests
Completed 400 requests
Completed 600 requests
Completed 800 requests
Completed 1000 requests
Completed 1200 requests
Completed 1400 requests
Completed 1600 requests
Completed 1800 requests
Completed 2000 requests
Finished 2000 requests


Server Software:
Server Hostname:        127.0.0.1
Server Port:            8081

Document Path:          /
Document Length:        38 bytes

Concurrency Level:      2
Time taken for tests:   1.912 seconds
Complete requests:      2000
Failed requests:        0
Write errors:           0
Total transferred:      230000 bytes
HTML transferred:       76000 bytes
Requests per second:    1045.86 [#/sec] (mean
Time per request:       1.912 [ms] (mean)
Time per request:       0.956 [ms] (mean, across all concurrent requests)
Transfer rate:          117.45 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.2      0      10
Processing:     1    2   0.6      2      12
Waiting:        0    2   0.5      2       7
Total:          1    2   0.7      2      14

Percentage of the requests served within a certain time (ms)
  50%      2
  66%      2
  75%      2
  80%      2
  90%      2
  95%      3
  98%      4
  99%      4
 100%     14 (longest request)     

H::Eはlazy_requestがきいているお陰か、速度が倍くらい違う。
YappoはMojoでのベンチマークの仕方も判ってないから不公平感があるかもしれない。
sriが計測したベンチマークのコードとかどこかに無いかしら?

Posted by Yappo at 19:40 | Comments (1) | TrackBack