Sledge recently in Yokohama.pm Aug, 2008

4,049 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
4,049
On SlideShare
0
From Embeds
0
Number of Embeds
538
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Sledge recently in Yokohama.pm Aug, 2008

  1. 1. 最近のSledgeについて id:clouder
  2. 2. self-introduction •id clouder •本名 栗原 由樹 •livedoor 所属 •HTTP::MobileAgent Imager::QRCode etc...
  3. 3. 今日話すこと •簡単な紹介 •livedoorでの最近の使い方
  4. 4. 今日話さないこと •インストール方法 •詳しい使い方
  5. 5. •Perlで出来た純国産 Webアプリケーションフレームワーク •2003年2月13日リリース •最新版はバージョン1.11 •http://sl.edge.jp/ Sledgeとは
  6. 6. •弊社では今でも現役バリバリです •Sledgeを使ってるっぽい会社 Sledgeとは
  7. 7. 今と昔のコードを 見比べてみる
  8. 8. dispatcher処理(昔) .cgiファイル #!perl use strict; use App::Pages::Root; App::Pages::Root->dispatch(‘index’); もしくは Sledge::Dispatcher <Location /webapp> SetHandler perl-script PerlHandler Sledge::Dispatcher::Properties PerlSetVar SledgeMapFile /path/to/map.properties </Location>
  9. 9. dispatcher処理(今) Sledge::Engineを使用 <Location /webapp> SetHandler perl-script PerlHandler App </Location> dispatchはApp.pm package App; use strict; use Sledge::Engine; __PACKAGE__->setup;
  10. 10. dispatcher処理(今) App/{CMS,Admin}.pmなど機能別に使い分け # App/CMS.pm package App::CMS; use strict; use Sledge::Engine; __PACKAGE__->setup; # modperl.conf <Location /webapp-cms> SetHandler perl-script PerlHandler App::CMS </Location>
  11. 11. Config処理(昔) Sledge::Configを使用 # lib/App/Config/_test.pm package App::Config::_test; use strict; use vars qw(%C); *Config = %C; $C{TMPL_PATH} = '/path/to/view'; $C{DATASOURCE} = [ 'dbi:mysql:appdb','root', '' ]; _test.pm や _production.pm など ファイルで環境を使い分ける
  12. 12. Config処理(今) 独自に実装しYAML形式で記述 # config.yaml test: tmpl_path: /path/to/view datasource: - dbi:mysql:testdb ... production: tmpl_path: /path/to/view datasource: - dbi:mysql:proddb ... 1ファイルで環境を棲み分け
  13. 13. テンプレート処理(昔) Sledge::Templateベース # テンプレートへの値の渡し方 $self->tmpl->param(foo => ‘bar’); # テンプレートファイルの選択はguess_filename()に任せるか $self->load_template(‘index.html’);
  14. 14. テンプレート処理(今) Sledge::Viewを利用 # PagesのベースクラスでSledge::Plugin::Viewをuseする package App::Pages; use strict; use Sledge::Plugin::View; sub create_view { App::View::TT->new( shift ) } # App/View/TT.pmを用意(JSON.pmやRSS.pmなど使い分け) package App::View::TT; use strict; use base qw( Sledge::View ); sub process { ... } sub render { ... }
  15. 15. テンプレート処理(今) Sledge::Plugin::Stashを利用 # テンプレートへの値の渡し方 $self->stash->{ foo } = ‘bar’; # テンプレートファイルも stash に $self->stash->{ template } = ‘/path/to/index.html’; # もしくは __PACKAGE__->register_hook( AFTER_DISPATCH => sub { my $self = shift; $self->stash->{ template } = $self->guess_filename( $self->page ); } );
  16. 16. Validation処理(昔) ページ毎にApp::Validator::PageNameを作成 # App::Validator::Baseで validate を定義 package App::Validator::Base; sub validate { my($self, $page) = @_; $self->normalize($page); my($status, $stuff) = $self->do_validate($page); $page->tmpl->param(errors => $stuff) if $status == FAIL; return $status, $stuff; }
  17. 17. Validation処理(昔) ページ毎にApp::Validator::PageNameを作成 # App::Validator::PageNameでdo_validate()を定義 package App::Validator::PageName; sub do_validate { my($self, $page) = @_; ... if (成功) { return SUCCESS, undef } else { return FAIL, $errobj; } }
  18. 18. Validation処理(今) Data::FormValodatorを利用 # App::PagesやApp::Data::Baseなどにvalidate()を定義 sub validate { my($self, $name) = @_; unless ($name) { $name = join '_', $self->prefix, $self->page; $name =~ s{/}{_}g; $name =~ s{^_}{}; } my $profiles = $self->path_to('etc', 'dfv.pl')->stringify; my $dfv = Data::FormValidator->new($profiles, { missing_optional_valid => 1, msgs => &dfv_messages_handler($name), }); my $form = eval { $dfv->check($self->r, $name); }; $self->stash->{form} = $form; $form; }
  19. 19. Validation処理(今) ちなみにetc/dfv.plは普通な感じです use strict; use Data::FormValidator::Constraints qw(:closures); return +{ page1 => { required => [qw(username password)], constraint_methods => { username => qr/^[a-zA-Z0-9]{4,8}$/, }, }, page2 => { required => [qw(foo bar)], optional => [qw(baz) ], constraint_methods => { foo => qr/^[01]$/, }, }, };
  20. 20. Validation処理(今) PagesもしくはDataクラスからvalidate()する # フォームのある各ページのPagesでvalidate()をコール package App::Pages::Foo; sub dispatch_index { my $self = shift; my $form = $self->validate; if ( $form->success ) { # 成功 } else { # エラー } }
  21. 21. Validation処理(今) PagesもしくはDataクラスからvalidate()する # Dataオブジェクト経由validate()をコール package App::Pages::Foo; sub dispatch_index { my $self = shift; my $obj = App::Data::User->new($self->r); my $form = $obj->validate; if ( $form->success ) { # 成功 } else { # エラー } }
  22. 22. という感じで 使ってます。
  23. 23. エンジニア募集中 現在livedoorでは一緒に働いてくれる エンジニアを募集しています。 もし興味のある方は、 clouder at gmail.com や http://recruit.livedoor.com/ など、どこからでもよいのでコンタクト を取ってくださいませ。 お待ちしております!
  24. 24. 以上です 質問はありますか?

×