2008-12-01から1ヶ月間の記事一覧

HTTP::Engine::Middleware

HTTP::Engine::Middleware http://coderepos.org/share/browser/lang/perl/HTTP-Engine-Middleware/branches/functional/wrapでrequest_handlerをwrapしていく感じ。後はrequestにメソッド生やす系。 組み立て部分は、以下の部分。App/Mobirc/Plugin/Compone…

HTTPx::Middleware::Unicode

MobircのMiddlewareの仕様にあわせてCatalyst::Plugin::Unicodeをそのまんま移植してみた。 package HTTPx::Middleware::Unicode; use Mouse; use utf8; sub wrap { my ( $class, $next ) = @_; sub { my $req = shift; decode_params($req); my $res = $nex…

Middlewareにもconfig渡したくなりそう

Middlewareにもconfig渡すようにしてみると、使いやすいんじゃないかという気がした。イメージ的には、以下のようなイメージ。こうすると、handlerもconstructorに渡したくなるような気もする。。 sub build_request_handler { my ($self, $handler, $args) …

merbがなかなか良さそうな件

趣味でPerlのWAF作りをはじめてから、何故かRubyのコードばかり読んでいる今日この頃なんですが、merbはなかなか良さそうですね。幾つか面白い機構があるので、それは暇みつけて書いていってみよう。merbはrailsよりは大分コードもわかりやすいですし、読み…

merbでのmap.resourcesのネスト

railsよりはとても読みやすくて、構造も現状のHTTP::Routerにとても近い。map.resourcesのbuilder部分は、以下のファイル読めばOK。 merb-core/lib/merb-core/dispatch/router/resources.rb resource.options(:name_prefix => singular, :resource_prefix =>…

MooseX::Declare

MooseX::Declareくらい綺麗にかければPerlでOOするのが面倒だとは思わないだろうなぁ。 http://search.cpan.org/~flora/MooseX-Declare-0.03/lib/MooseX/Declare.pm use MooseX::Declare; class BankAccount { has 'balance' => ( isa => 'Num&#…

HTTP::Router::Builder + HTTP::Router::Plugin

ResourceとResourcesの違いが大分わかったのと共通化できる部分があるので、ざっくりリファクタリング。あと、connect, resourceなどroute作る系メソッドが増えるのに対応するために、connect, resourceなどをPlugin化。後は、map.resourcesのネスト、belong…

HTTP::Router@freenode

http://d.hatena.ne.jp/ikasam_a/20081210/1228920888 HTTP::Routerを作り出したikasam_a++ですね. 最近はid:ikasam_aとfreenodeの#http-routerで話してます。RailsのRoutesっぽいものが欲しいなぁと思っていたので、これは素晴らしい!ということで最近HTTP…

Railsのroutesのマッピング

RailsがどのようにRotingするのかをまとめてみた。 map.resource map.resource :products products POST /products {:controller=>"products", :action=>"create"} formatted_products POST /products.:format {:controller=>"products", :action=>"create"}…

HTTP::Router::Builder

今のBuilderに足りないのは、map.resourcesのネスト。これが終われば、RailsっぽいRoutingができる。#collection, memberはサポートしてみた。formatも追加してみた。ということで不足してるのはmap.resourcesのネスト。map.resourceとmap.resourcesってrail…

HTTP::Routerを使ったDispatcherを書いてみた

http://github.com/dann/request-dispatcher/tree/master/lib/Request/Dispatcher.pmこれでフレームワーク側のDispatcherはとてもすっきりしました。Dispatchクラスの必要なメソッドをオーバーライドして実装するだけです。 http://github.com/dann/angelos/…

JPerl Advent Calendar 7日目

typesterさんからバトンを受け取ったので、「コマンドラインスイッチと特殊変数を使いまくる」という記事を書いてみました。 http://perl-users.jp/articles/advent-calendar/2008/07.html「使いまくる」といえるほどの記事ではないんですが、1ライナーにな…

メモリー計測スクリプト

tokuhiromさんの簡易シェルでメモリーの使用量をはかるっていうアイデアがいいなぁと思って試してみました。 http://d.hatena.ne.jp/tokuhirom/20081206/1228567506ただ、GTopが手元のUbuntuでインストールできず(GTopが2からインターフェースが変わってGTo…

アプリの使ってるモジュール郡のメモリ測定

Devel::FindNamespacesと組み合わせてみたら面白いんじゃないかと思ってやってみた。 #!/usr/bin/env perl use strict; use warnings; use Devel::MemUsed; use Devel::FindNamespaces; foreach my $module ( Devel::FindNamespaces->find(shift) ) { my $pi…

依存モジュールのメモリー測定チェック

さっきのエントリで書いたMakefile.PLのrequiresをチェックして、依存モジュールをuseしたときのメモリ使用量チェックするスクリプト書いてみた。 #!/usr/bin/env perl use strict; use warnings; use Devel::MemUsed; use Module::Depends; my $deps = Modu…

HTTP::Router++

WAFを作っていて、HTTP::Router側にほしいなぁと思っていた機能を幾つかいれてみた。HTTP::Router側にmap.resourceとかmap.connectとかの記述からRoute作るBuilderの機能とRouting Tableのデバッグ用機能。実装はちょっともっとDRYになるように修正したいな…

WAFのMouse化

試しにHTTP::RouterのMouse化してみて、WAF全体をMouse化してみた。HTTP::RouterをMouse化してみた感じでは、MooseX::Attribute::Helpersがないとやっぱり少しコード量が全体に増えちゃうかなという感じだけど。結局のところ、色々と依存モジュールを減らし…

Util::Any

http://d.hatena.ne.jp/ktat/20081206/1228501682 http://search.cpan.org/dist/Util-Any/これはいいなぁ。Perlだと 標準の便利関数が不足しててモジュールが乱立する Perlモジュールはとても小さな再利用単位 ということもあって、細かいモジュールを幾つか…

Moose to Mouse

Yappoさん、tokuhiromさんらが作っている(乗っ取ったw)Mouseは良さそうですね。MouseベースのHTTP::Engineも期待大です。最終的な実行速度はMooseもそんなに変わらないと思うのですが、startupコストが高いのは、テストの実行速度が遅くなってしまって、LL…

angelosangelosをMouse化してみた

早速Mouse化してみました。sedで一括置換してから、MooseX系をざっくり削って完了。 find ./ -type f -name '*.pm'|xargs sed -i 's/Moose/Mouse/g' MooseX::AttributeHelpersが使えないのが少し記述量が増えるくらいで、後のMooseX::Config…

mouse to moose

moose to mouseは若干削る物が出てくるけれど、mouse to mooseはそのまんまいけそうなので、当面ごたごたしてる間はmouseでやっていくことに。mooseがチューニングされるまではまだ結構時間かかりそうですし。

Railsで学ぶフレームワーク作り - Dispatcher編 その5 Routeの構築部分 freezeメソッドの解析

route.freezeがカオス!前回書いていたたんですが、ようやく何をやってるのか(何故このような処理をしているのか)を理解しました。freezeメソッドは、以下のようになっています。 def freeze unless frozen? write_generation! write_recognition! prepare_…

RailsとRackのcode reading

Railsはとてもユニークなフレームワークで驚かされるところがあるので、一応主要なところはざっと目を通したいなとは思ってます。ただ、黒魔術多めで、思想を理解するのに時間がかかるなぁという印象です。黒魔術使っているところ以外はとても綺麗でよみやす…

HTTP::RouterをWAFに組み込んでみた

Railsをインスパイアして、conf/routes.yamlをロードすると、以下のようなディスパッチテーブルを生成するWAFを、HTTP::Routerを使って作ってみた。conf/routes.yaml --- - type: resource controller: Bookdispatch table .-------------------------------…

rackで学ぶフレームワーク作り#1 - Rackアプリの実行の流れ

bin/rackupのコードを読んでみる。これがRackアプリを起動するスクリプト。ruファイルを読み込んで、Rack::Builderでapp生成して、CGIとかのHandlerでrunというのがrackupの実行の流れ。ru(config)よんでRack::Builderでmiddlewareとか組み立てる。 if confi…

Railsで学ぶフレームワーク作り - Dispatcher編 その1

フレームワーク作りの参考にRailsのコードを読んでみる事にしました。 Rails使ってたのは1.0のころなので、もうすっかり忘れてますが。actionpack/lib/action_controller/dispatcher.rb がいかにもって感じなので、そこから読んでみることに。確かRailsもRac…

Railsで学ぶフレームワーク作り - Dispatcher編 その2 Routing::Routes

前回DispatcherだとわかったRouting::Routesのrecognizeメソッドの実装をみていきましょう。 def recognize(request) params = recognize_path(request.path, extract_request_environment(request)) request.path_parameters = params.with_indifferent_acc…

Railsで学ぶフレームワーク作り - Dispatcher編 その3 route設定の初期化部分

route設定の初期化してるところから読んできますか。routing, initあたりでackで調べると、それっぽいメソッドありますね。以下のメソッドのようですねrailties/lib/initializer.rb def initialize_routing return unless configuration.frameworks.include?…

Railsで学ぶフレームワーク作り - Dispatcher編 その4 Routeの構築部分

config/routes.rbをみると、以下のようなブロックで囲まれています。ここがディスパッチルールの設定部分ですね。 ActionController::Routing:Routes.draw do |map| map.connect ':controller/:action/:id', :controller => 'blog' end Rout…

今日の結論

Routeの実装をみたときの絶望感はすごいですね。にわかperlerが踏み込んではいけない領域な気がします。これrubyistな人は読んでるんですかね...今日の結論は、railsは表面的なクラス構造は綺麗だけど、深層に入るとカオス過ぎ。 rails--