SlideShare a Scribd company logo
最近のSledgeについて
id:clouder
self-introduction
•id clouder
•本名 栗原 由樹
•livedoor 所属
•HTTP::MobileAgent
Imager::QRCode etc...
今日話すこと
•簡単な紹介
•livedoorでの最近の使い方
今日話さないこと
•インストール方法
•詳しい使い方
•Perlで出来た純国産
Webアプリケーションフレームワーク
•2003年2月13日リリース
•最新版はバージョン1.11
•http://sl.edge.jp/
Sledgeとは
•弊社では今でも現役バリバリです
•Sledgeを使ってるっぽい会社
Sledgeとは
今と昔のコードを
見比べてみる
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>
dispatcher処理(今)
Sledge::Engineを使用
<Location /webapp>
SetHandler perl-script
PerlHandler App
</Location>
dispatchはApp.pm
package App;
use strict;
use Sledge::Engine;
__PACKAGE__->setup;
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>
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 など
ファイルで環境を使い分ける
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ファイルで環境を棲み分け
テンプレート処理(昔)
Sledge::Templateベース
# テンプレートへの値の渡し方
$self->tmpl->param(foo => ‘bar’);
# テンプレートファイルの選択はguess_filename()に任せるか
$self->load_template(‘index.html’);
テンプレート処理(今)
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 { ... }
テンプレート処理(今)
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 );
}
);
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;
}
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;
}
}
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;
}
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]$/,
},
},
};
Validation処理(今)
PagesもしくはDataクラスからvalidate()する
# フォームのある各ページのPagesでvalidate()をコール
package App::Pages::Foo;
sub dispatch_index {
my $self = shift;
my $form = $self->validate;
if ( $form->success ) {
# 成功
} else {
# エラー
}
}
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 {
# エラー
}
}
という感じで
使ってます。
エンジニア募集中
現在livedoorでは一緒に働いてくれる
エンジニアを募集しています。
もし興味のある方は、
clouder at gmail.com
や
http://recruit.livedoor.com/
など、どこからでもよいのでコンタクト
を取ってくださいませ。
お待ちしております!
以上です
質問はありますか?

More Related Content

PDF
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
PDF
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
PDF
ネタじゃないScala.js
PPTX
サーバーレスで ガチ本番運用までやってるお話し
KEY
CMS for Cloud by Ruby
PDF
Swagger 入門
PDF
Jawsug chiba API Gateway
PPTX
明日からはじめられる Docker + さくらvpsを使った開発環境構築
[出張!雲勉 in Tokyo] Swagger で簡単APIドキュメント作成
ビズリーチの新サービスをScalaで作ってみた 〜マイクロサービスの裏側 #jissenscala
ネタじゃないScala.js
サーバーレスで ガチ本番運用までやってるお話し
CMS for Cloud by Ruby
Swagger 入門
Jawsug chiba API Gateway
明日からはじめられる Docker + さくらvpsを使った開発環境構築

What's hot (20)

PPTX
開発環境をDockernizeした話
PPTX
AWS Lambdaのテストで役立つ各種ツール
PDF
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
PDF
One Time Binding & Digest Loop
PDF
VSCodeで始めるAzure Static Web Apps開発
PDF
AWS Lambdaで作るクローラー/スクレイピング
PDF
【LT】 怖くない恐怖のScala.js
PDF
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
PPTX
フロントエンドの技術を刷新した話し。
PPTX
Node.js version16の新機能
PPTX
20161208 Classmethod Codenize Tools
PPTX
Serverless Framework 使ってる話(node.js)
PDF
実戦Scala
PPTX
AWSのElastic BeanstalkでWordPressを 構築レスで導入してみる。
PDF
怖いRails
PDF
Azure Load Testingを試してみた
PDF
おれおれブログシステムにServiceWorkerを導入してみた #serviceworker
PDF
進撃のSbt
PPTX
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
PDF
Realm meet up #17
開発環境をDockernizeした話
AWS Lambdaのテストで役立つ各種ツール
Node.jsとAWS入門(Elastic Beanstalk & AWS SDK for Node.js)
One Time Binding & Digest Loop
VSCodeで始めるAzure Static Web Apps開発
AWS Lambdaで作るクローラー/スクレイピング
【LT】 怖くない恐怖のScala.js
Seasar ユーザだったプログラマが目指す OSS の世界展開 #seasarcon
フロントエンドの技術を刷新した話し。
Node.js version16の新機能
20161208 Classmethod Codenize Tools
Serverless Framework 使ってる話(node.js)
実戦Scala
AWSのElastic BeanstalkでWordPressを 構築レスで導入してみる。
怖いRails
Azure Load Testingを試してみた
おれおれブログシステムにServiceWorkerを導入してみた #serviceworker
進撃のSbt
WebAssemblyとBlazor 、WebAssembly System Interfaceでコンテナライズの設計を解説
Realm meet up #17
Ad

Viewers also liked (8)

PDF
スカイアーチセミナー:[スカイアーチ AWS共催]AWS移行のプロが教える!導入への3ステップ(skyhopperのご紹介):150521
PDF
フリーエージェント時代の仕事術 先生:和田 裕介
PPT
Iss seminar 2010709#1-upload
PPT
Perl Beginners #7 おとなのWAF
PDF
とある Perl Monger の働き方
PPTX
セキュリティをあきらめない! ~WAFパフォーマンスを無限に拡張するネットワークデザイン~
PDF
AWS Black Belt Tech シリーズ 2016 - WorkSpaces
PDF
AWS Black Belt Techシリーズ Amazon WorkDocs / Amazon WorkMail
スカイアーチセミナー:[スカイアーチ AWS共催]AWS移行のプロが教える!導入への3ステップ(skyhopperのご紹介):150521
フリーエージェント時代の仕事術 先生:和田 裕介
Iss seminar 2010709#1-upload
Perl Beginners #7 おとなのWAF
とある Perl Monger の働き方
セキュリティをあきらめない! ~WAFパフォーマンスを無限に拡張するネットワークデザイン~
AWS Black Belt Tech シリーズ 2016 - WorkSpaces
AWS Black Belt Techシリーズ Amazon WorkDocs / Amazon WorkMail
Ad

Similar to Sledge recently in Yokohama.pm Aug, 2008 (20)

PDF
Introduction of Rhodes
PDF
DLR言語によるSilverlightプログラミング
PDF
成長を加速する minne の技術基盤戦略
PPT
Using Windows Azure
PDF
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
PDF
laravel x モバイルアプリ
PDF
僕の Serverless web application
KEY
activerecord-turntable
PDF
AndroidでActiveRecordライクにDBを使う
PDF
130412 kayac-cinnamon
PDF
多分モダンなWebアプリ開発
PPT
Inside mobage platform
KEY
Chiba pm#1 - ArangoDB for Perl
PDF
Backlogでの Perlのつかいかた
PDF
LambdaとMobileの美味しいかもしれない関係
PDF
アプリ屋もDockerをドカドカ使おう ~ Docker入門
PDF
試して学べるクラウド技術! OpenShift
PPTX
Docker friendly PHP / Laravel
PDF
Tizen 2.0 alpha でサポートされなかった native api
PPTX
自作アプリをデプロイしてみた with Docker
Introduction of Rhodes
DLR言語によるSilverlightプログラミング
成長を加速する minne の技術基盤戦略
Using Windows Azure
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
laravel x モバイルアプリ
僕の Serverless web application
activerecord-turntable
AndroidでActiveRecordライクにDBを使う
130412 kayac-cinnamon
多分モダンなWebアプリ開発
Inside mobage platform
Chiba pm#1 - ArangoDB for Perl
Backlogでの Perlのつかいかた
LambdaとMobileの美味しいかもしれない関係
アプリ屋もDockerをドカドカ使おう ~ Docker入門
試して学べるクラウド技術! OpenShift
Docker friendly PHP / Laravel
Tizen 2.0 alpha でサポートされなかった native api
自作アプリをデプロイしてみた with Docker

Sledge recently in Yokohama.pm Aug, 2008