Plackã¨DBIx::Skinnyã¨Text::MicroTemplate::Fileã§wikiä½ã£ãã®ã§ã½ã¼ã¹ãå ¬éãã¦ã¿ã
2010/04/19 22:41 追è¨
ãã³ã¡ã§kamipoããã¨a666666ããã«ãTMTã§å¤æ°ãã¨ã¹ã±ã¼ããããããªãå ´åã¯encoded_string()使ãã°ãããã¨æãã¦ããã£ãã®ã§ä¿®æ£ã
ãããã¨ããããã¾ãã
GitHub - hirafoo/piki: PlackとDBIx::SkinnyとText: :Fileで作ったwiki
psgiã¨ãplackã¨ãstarmanã¨ãã¢ãã³ãªã¢ã¬ã½ã¬ã¨ãã«å
¨ç¶ã¤ãã¦ããã¦ãªãã®ã§åå¼·ãã¦ãã
ä»ã¾ã§ä½ã£ã¦å
¬éãã¦ã¿ãã¨ãã¯è§£èª¬é·ã
ã¨æ¸ãã¦ããã®ã ãã©ä»åã¯ç¥ã解説ãããªãäºãæ¸ããã
ä½ã§wiki
èªè¨¼ã¨CRUDã使ããã°åºæ¬ã¯ããã ããã¨ãããã¨ã§ä»ã¾ã§ã¯BBSä½ã£ã¦ãã®ã ãã©ãè¸ãç¡ãã®ã§ã
ãã¨ãä½ã£ããã®æãã ããªãããã¡ã¤ã³åã£ã¦å
¬éããã§ãã½ã¼ã¹ã ãæãã°ããã¨æ°ä»ãå§ããã
developmentç¨ã®ç°å¢ããä½ã£ã¦ã¾ãã
æè¿ä½è£ãç¡ãã¦é±æ«ã«æãã¨ãã¾ã§ãããã¨æ¬¡ãããã®ãæ¥é±æ«ãªã®ã§ãproductionç¨ã®è¨å®ã¯ç¥ã
ã¾ãPlack::Middleware::StackTraceã¨Plack::Middleware::Staticãå¤ãã¦ãdaemontoolsç¨ã«é©å½ãªrunæ¸ãã°ããã
devã ã£ã¦èµ·åã¯starman使ã£ã¦ãã®ã§ãéãã¯daemonizeãããã©ããããããã¨ã
ãã ãplackupã¯PLACK_ENVãdevelopmentã ã¨éçã³ã³ãã³ãã¸ã®ãªã¯ã¨ã¹ãããã°ããå人çã«ã¯devã ã¨ãã¦ãããã¯ãã°ã£ã¦æ¬²ãããªãã®ã ãã©ä»æ¹ãªãã®ã§ -E nolog ã¨ãã§ã
Plackã¯WAFã§ã¯ãªã
WAFã¨è¨ãã¨æããã¾ããPSGIã¯ä»æ§ãPlackã¯å®è£
ã
ã¨ã¯ããããã使ãã°ç°¡åã«WAFãä½ããã
ã³ã³ããã¼ã©ã«ãã¸ãã¯
ãæ¸ãã¨ããã®ã¯æã®éª¨é ãèªããç§ã¯é¦¬é¹¿ã§ããã¨å®£è¨ããã«çããè¡çºã
ã¨ã¯ããä»åã¯æéãç¡ãã大ãããã¸ãã¯ãå¿
è¦ç¡ãã®ã§å
¨é¨ã³ã³ããã¼ã©ã«è¼ããã
ãããã§Model以ä¸ã«ç½®ããSchema以å¤ã®pmããã ã®é£¾ãã§ãã
Skinny
ããªã¬ã[in|de]flateãä½ãä»çµã¿ãç¨æããã¦ãã®ã§é常ã«æ¥½ãã¯ã¼ã«ã§ããã
DBICã ã¨è²ã
é¢åã§ã¢ã¸ã¥ã¼ã«ä½¿ã£ã¦ãã®ã«ã
DBIx::Skinny::Schema::Loader
ã使ãã°ã¹ãã¼ãå®ç¾©ãæ¸ããã«æ¸ããããã¢ããªèµ·åæã®ããªã¬ã®å®è£
ã®é½åä¸ãã¹ã«ã¼ã
Schema.pmã«dsnæ¸ãã¦ãªãå ´åã使ãããã ãããªãã¨æãã¤ã¤ã
HTTP::Engineã¨ä¼¼ã¦ãã
Plackã¯HTTP::Engineã¨ããä¼¼ã¦ããã®ã§ããã£ã¹ãããã£ãããã³ãã©ããã®ã³ã¢é¨åã¯こめったーã¨å¤§å·®ç¡ãã
è¦ã¯ãªã¯ã¨ã¹ãåãã¦ãã£ã¹ããããã¦ãã³ãã«ãã¦ã³ã³ããã¼ã©ã«æ¸¡ãã¦ã¢ãã«å¼ãã§ãªã¯ã¨ã¹ãè¿ãã°ãããããwebappã®åºæ¬ã
DBä½ã
rubyã®DataMapperã§ä½ã£ã¦ãã®ã ãã©ããããActiveRecordã«å£ã£ã¦ãã¼ãã«ãè¤æ°å½¢ã§ä½ãã
DBIx::Classãªããã¼ãã«åã¯è¤æ°ãããã°ã©ã ã§å¼ã¶ã¨ãã¯åæ°ã£ã¦åºæ¥ãã®ã ãã©Skinnyã§ã¯ã¡ãã£ã¨ããã£ããããããåºæ¥ãªãã£ã½ãã£ãä¸ã«æéãç¡ãã®ã§railsã«éããã
ã¾ãæåã£ãããã¼ãã«åãåæ°å½¢ã§ä½ãã£ã¦è©±ã§ã¯ããã
ãã£ã¹ãããã£
åå㯠HTTPx::Dispatcher ã使ã£ããä»åã¯ãããã®å¾ç¶ã® Router::Simple ã使ã£ãã
ãã§ãåç´ã«ã«ã¼ãã£ã³ã°ã ã欲ããã®ã ãã©ãããã¯æ¸ããã¨æãã°YAMLã«ã§ãæ¸ãããã©ããã¯ãªãããããconfigãã¨ããã¨ããããªããããããã¯ã©ã¹ä½ã£ã¦ã¤ã³ã¹ã¿ã³ã¹ä½ãã®ããªã¼ããã¨ãã£ã¦ourå¤æ°ã«æãããã®ãå¤ãããèããã®ãããã¦pmã«æ¸ãã¦ã¯ã©ã¹ã¡ã½ããã§åå¾ããããã¨æãã¨
my $dispatch = MyApp::Web::Dispatcher->get_dispatch;
ã¨ãé æªãå½åã«ãªãããã¼ãã³ã°ã»ã³ã¹ãç¡ãã®ã§æ¯åããããã¨ããã§è¦å´ãã¦ããããã§åä¸å¸ã«ç¸è«ãã¦ã¿ãã
ãããªã¨ãã®newã ã
ã¨ã®ãè¨èãé ãããèããã¨ãã¯ç¢ºãã«ï¼ã¨æã£ãâ¦ããçµå±ã¤ã³ã¹ã¿ã³ã¹ã¨ãã«ã¼ãã£ã³ã°ãæã¤ã¡ã³ãå¤æ°ã¨ãã«ãååã¯è¦ãããã§ã
çµå±ãããªãã¾ããã
sub new { my $class = shift; my $router = route(); bless { router => $router }, $class; } -later- my $rule = approuter->{router}->match($env); # approuter() ã¯ä¸ãnewããçµæãè¿ã
routerã£ã¦åå使ããã¨æã£ããã Router::Simple::Declare ãããããrouterã£ã¦é¢æ°ãexportãã¦ãããã®è¾ºã§è²ã
èããã®ãæããã
ãã¼ãã³ã°ã»ã³ã¹æ¬²ããã§ãã
è¨å·
$ã¨ã;ã®å¤ãã(è¦ã¥ãã|é¢å)ã ã¨æã£ã¦ããã®ã¯ä¿ºã®ãããªä¸ã£ç«¯ã ããã¨æã£ããã社å
ã®è©±ãèãã¦ããããåã人ãhackerãããã ã£ãããã§ããããããåã人ãhackeræ°ããããµããã¨ã®ãã¨ã
rubyãããrubyãpythonããããããã§ãã
ãã¨Text::MicroTemplateã§æ¯åãã¥ã¼å´ã§
? my $params = shift;
ã¨ãããããªãã£ãã®ã§ãTMTãèªãã ããcallerå´ã®é¢æ°ã¨ãã使ãããã ã£ãã®ã§è©¦ããã使ããã
å°ç´°å·¥ããçµæã
ã³ã³ããã¼ã©
sub post_create_account { model->insert(account => { name => p->{name}, password => p->{password}, }); +{ template => "create_data" }; }
ãã¥ã¼
? if (p->{content}) { <?= p->{content} ?> ? }
ã¨ãã«ãä»ã¾ã§p㯠warn Dumper ã®ã¨ã¤ãªã¢ã¹ã ã£ãã®ã ãã©ãä»åã¯ppã«è²ãäºã«ã
ãã¼ã㨠vars::declare 大好ãã§ãã
Text::MicroTemplateã§èªåã¨ã¹ã±ã¼ããå¤ãããã£ã
wikiã¨ããç¹æ§ä¸ãhtmlãã¢ããªå´ã§çæãã¦ãã¥ã¼ã«æ¸¡ãã¦è¡¨ç¤ºãããããããTMTã¯èªåã¨ã¹ã±ã¼ãããã®ã§å°ãã
é¨åçã«å¤ããã¨ãããã©é¢åã ã£ãã®ã§æåããTMTã®ã³ã³ã¹ãã©ã¯ã¿ã« escape_func => undef ãã¦éããã
å½ç¶ãå
¨å¤æ°ãã¨ã¹ã±ã¼ããããªãã®ã§ããããããããªããããæéãªãã®ã§çµäºã
escape_func ãããã©ã«ãã®ã¨undefã®ã¤ã³ã¹ã¿ã³ã¹1åãã¤ä½ãã°ããããã
ãã¨ãã¥ã¼ã®ä¸ã§ãã«ããã¤ããªå¤æ°åºããã¨ãããæ¯ådecodeããç¾½ç®ã«ãªã£ããä½ããééãã¦ããã
DBIx::Skinnyã®rowãªãã¸ã§ã¯ããnfeezeãããã¨ããã¨æ»ã¬
my $obj = model->search("page")->next; my $serialized = Storable::nfreeze($obj);
æ»ã«ã¾ããã»ãã·ã§ã³ã«accountã®ãªãã¸ã§ã¯ãå
¥ãããã¨ãããæ°ä»ããã
ä»æ¹ãªãã®ã§ãªãã¸ã§ã¯ãã®å¤ãhashrefã«ãããã®ã§ä»£ç¨ã
my $hashref = $obj->get_columns; my $serialized = Storable::nfreeze($hashref);
WAFãä½ããªãã®ã
ã¨è¨ãããäºãããã確ãã«ç°¡åã«ä½ãããããã£ã¹ãããã£ããã³ãã©ã¾ã§æ¸ãããªãã»ã¼ããã«è¿ãã®ã ãã©ãä½ã£ãã¨ããã§ãªãªã¸ãã«ã¯è¶
ããªããããã£ã¨ä¿ºãã使ããªãã®ã§è¶
誰å¾ãªã®ã§ä½ããªãã
çµãã
ãã¼ç²ãããç©åãæ¥ãã§ãplackã£ã¦ã©ããã£ã¦ä½¿ãã®ï¼ããå§ãããã¨ãããä»å使ã£ããã®ã¯å
¨é¨åãã¦è§¦ã£ãã
次ã
åºã¦ããã¢ãã³ãªã®ã追ãã®ã¯å¤§å¤ã ãã©æ¥½ãããç¥ããªãäºãåãããªãäºãããã®ã楽ããã
ã¨ã¯ããããã ã¨æä¾ãããç©ã使ãã ããªã®ã§ããã¾ãæé·ããªãã®ã§ããã£ã¨è²ã
åå¼·ããã¨ã
æå¾ã«ä»ååèã«ããã¨ããã
http://advent.plackperl.org/
http://github.com/miyagawa/plack-dispatching-samples