catalystのres->bodyにファイルハンドルを渡す

Catalyst::Plugin::Static::Simpleで静的にサーブしているpdfとかの文書ファイルに(ベーシックとか)なんか適当な認証をかけたくて悩んでた。

そういうファイルはApacheとかに任せれば解決するんだろうけど、残念ながらApache動かせないというシチュエーション。

散々悩んだあげく別にStatic::Simple使わなくていいじゃんということに気づいてしまい、おもむろにStatic::Simpleのソースを読み始めた。

どうせFile::Slurpでもしてbodyに出力してるんだろうなぁと思ってたんだけど違った。

if ( Catalyst->VERSION le '5.33' ) {
    # old File::Slurp method
    my $content = File::Slurp::read_file( $full_path );
    $c->res->body( $content );
}
else {
    # new method, pass an IO::File object to body
    my $fh = IO::File->new( $full_path, 'r' );
    if ( defined $fh ) {
        binmode $fh;
        $c->res->body( $fh );
    }
    else {
        Catalyst::Exception->throw( 
            message => "Unable to open $full_path for reading" );
    }
}

最近のバージョンはファイルハンドルをres->bodyに渡せるのか。IO::Allとかもいけんのかな?

どう書くの「出力の一時停止と再開」をperlのthreadで

書いてみた

最初に書いたのがこれ。

use strict;
use threads;
use threads::shared;

$| = 1; 

my $f : shared;
my $ob = threads->create(\&observe);
my $pr = threads->create(\&print_a); 

$ob->join();
$pr->join();

sub observe {
 my $i;
 while(1){
   $i = <STDIN>;
   chomp($i);
   exit if $i eq 'q';
   if ($i eq 'p'){
     $f == 1 ? $f-- : $f++;
   } 
 }
}

sub print_a {
 while(1){
   if($f == 1){
     print "a";
     sleep 1;
   } 
 }
}

Term::ReadLineがよくわからなかったので、あえて使わずに書いてみたら相当ダメな感じになってしまったので、Web+DB Pressを引っ張りだしてきて書き直して投稿。

Catalystの7章

最近Jemplateを使っているので、RESTとJemplateでAjaxの章をもう一度やった。

サンプルは一カ所修正。

#__PACKAGE__->config->{serialize}{default} = 'JSON';
__PACKAGE__->config->{default} = 'text/x-json';

ProductName Catalyst: Accelerating Perl Web Application Development
Jonathan Rockway
Packt Publishing / 3545円 ( 2007-11-30 )


c++で文字列の繰り返し

perlだと

say "abc" x 3 # abcabcabc

と書けるところをc++だと

string ret = "";
for(int i=0;i<3;i++) ret += "abc";
cout << ret << endl;

と書かないといけないのか?

YAPC::Asia 2008 二日目

今日の午前中はずっとDeNA room。すべて良かったので、メモもとらずにずっと聞いてた。

そのなかでも特にYuval KogmanのMooseが興味深かった。近いうちに触ってみようMoose。Mooseがヘラジカって知らなかったから、昨日の弾さんのスライドで、なんで変な角の仏僧が出てきたのかわからなかったけど、、、、

今ならわかる。

午後はIngyのjavascript話、今書き換えている職場のCatalystプロダクトでJemplateを使ってみる。講堂でリアルデバイスの話を聴いて、お芝居見た。で、ArcheType RoomでPOEとErlangの話を聞いて終了。Erlangわからん。

最後までいたかったけど、所用で泣く泣く帰宅。

今年も楽しい時間を過ごせて最高でした。スタッフの皆様おつかれさまでした。

YAPC::Asia 2008 一日目

ラリーウォールのトークにちょっと遅れた。 午前中は講堂。午後はArcheType Roomにいた。

  • perl5.10使おうと思った。
  • Atomとかそっちの話は面白い。
  • String::TTいいかも
  • Gainerでperlを使う場合はoutにGainerもってく場合がよい
  • Gainer over HTTPは楽しそう。
  • Danさんのcontext oriented languageはなるほどと思った。

したはメモ(内容はいい加減がところがあるかも)。あと、いつものようにmarkdownでメモを取っておけばよかった。

2008-05-15  kzfm  <kerolinq@gmail.com>

* YAPC2008: LT
- jrockway
String::TT
strip

- wakapon
すべてperlで
perlapi,XSUB
最終兵器

- cho45
Text::MicroMason
埋め込みのテンプレートエンジン

- clkao
prototype::signature

* YAPC2008: Yusuke Kawasaki
Gainerの話
DOM manipulation
三連星

wiimote over HTTP

wiimote in
Gainer  out

* YAPC2008: Kazutake Hiramatsu
Parrot compiler Tools
PCT
RkudoはPCTを使って実装
PCTを使えばParrotで動く俺言語を作れる

Register based VM
Register (In, Nn, Sn, Pn)
PIR
PASM

#30日OS入門をやる

I0 // Integer #0
PIRはPASMの構文糖衣

PGE,PAST,POST,NQP

svn co
cd parrot
perl Configure.pl
make
make test

perl tools/dev/mk_language_shell

NQP は Perl6を書くために必要なちっちゃいPerl6のようなもの
四則演算と括弧ができるやつはyaccを使うよりも短く出来る。

#parrotでschemeってのがあるのであとでみる

* YAPC2008: Takeru Inoue
Practical AtomPub Servers

AtomPub RFC5023
mixi station API

Collections and Members
Entry and Meta Resouces

強い権限
作ろうとするサービスがRESTに適しているか
データモデル

#AtomPubとS3の対比が分かりやすい。

methodのoverrideでuriを変えられる。

* YAPC2008; No REST for the Wicked
DTRT
X-Your-Header
Pretty URI not equal REST
pretty for computer not for you

Catalyst::Action::REST
Catalyst::Controller::REST::DBIC::Item
Use Case
example: soccer game 

my $data = $c->req->data;とかやれる
Catalyst::Controller::REST::DBIC::Itemを使うと
CUIで簡単に制御できる。

##コレクションのまとまり->controller
##Action->Chainedにすることでcontrollerと似たことが出来る。

* YAPC2008: dan kogai
perl as a second language
autobox
組み込みでないことを利点にするならば。
オブジェクト=自分が何をするか知っているデータ。
構文糖衣
context oriented language
printはリストコンテキスト

B::Deparseで空気を読む
DWIM = Do What I Mean

* YAPC2008: tokuhirom
5.10
Switch
~~
regexp: named captures
perl -E

perlの\343\201\246\343\201\231\343\201\250

家の3.4.2だと全然問題ないのだけど、職場のSQLite3で.mode csvで出力したら見事に日本語が化けた。化けたというかなんというか、"\343\201\246\343\201\231\343\201\250"みたいな感じで出力されてしまう。

use Encode;
use Devel::Peek;

my $text = 'てすと';
my $utf8 = decode('UTF-8', $text);
Dump $utf8;

これを実行したときの、

SV = PV(0x9a81834) at 0x9a2d66c
  REFCNT = 1
  FLAGS = (PADBUSY,PADMY,POK,pPOK,UTF8)
  PV = 0x9adab48 "\343\201\246\343\201\231\343\201\250"\0 [UTF8 "\x{3066}\x{3059}\x{3068}"]
  CUR = 9
  LEN = 12

この"\343\201\246\343\201\231\343\201\250"なんだけど、オクテット?

print "\343\201\246\343\201\231\343\201\250"

で「てすと」と表示されるんだけど。

この文字列をファイルから読んで、ちゃんとした文字列(てすと)にしたかったのだけど、わからなかった。packすればよさそうな気がしたんだけど、、、

よくわかってないなぁ。

TWIPS

RTF::Writerで画像の大きさを設定するのに使われてた。

Twip

Microsoft Windows の標準のシステム解像度である 96dpi の環境下では 15Twips で 1ピクセル、120dpi の環境下では 12Twips で 1ピクセルの長さと等しい。

ややこしい。

FSWIKIをプラグインからコード変換できるように

FSWIKI3.8.2の話だけど。

RTF::Writerの出力プラグイン書いてて、最初にソース全体をsjisでエンコードしたかったので、WIKI/Parse.pmのparseメソッドをちょっと変えた。

ProductName Rtf Pocket Guide
Sean M. Burke
Oreilly & Associates Inc / 937円 ( 2003-07 )


というメモ

sub parse {
       my $self   = shift;
-      my $source = shift;
+      $self->{source} = shift;

       $self->start_parse;
-      $source =~ s/\r//g;
+      $self->{source} =~ s/\r//g;

-      my @lines = split(/\n/,$source); 
+      my @lines = split(/\n/,$self->{source});

これで、プラグインのほうでstart_parseメソッドに文字コードの変換処理を書いとけばパース処理が始まる前に変換されてよい。

ProductName 入門Wiki―みんなで投稿/編集できるWebの作りかた
竹添 直樹
毎日コミュニケーションズ / ?円 ( 2006-07 )


Caatalystの6章と7章読んだ

なんとなく今日も読んでいる。

  • 6章は、独自のモデルを作ろう
  • 7章はRESTとAjax

ProductName Catalyst: Accelerating Perl Web Application Development
Jonathan Rockway
Packt Publishing / 3545円 ( 2007-11-30 )


6章はファイルシステムをCatalystのモデルにするサンプルだが、Catalyst::Model::Adaptorを知ってしまうとあまりそそられなかった。

7章はJemplateが楽しそうなんだけど、ググっても、実際に使われているという例が出てこないのが気になった。なんかデメリットでもあるんだろうか?