新しいblogに移行しました

新ブログ "All Yout Bugs Are Belong To Ass" に移行しました!

2010-10-27

[Perl]遂にYAPC::Asia 2010へ参加してきました!!

いまさらなエントリです。はい。

既にYAPC::Asia 2010 2日目ライブレポートにある通り、去る10/15(金)~10/16(土)に開催された、念願のYAPC::Asia 2010に参加してきました!
イベントそのものについては公式サイトに譲るとして、僕自身の感想を残しておきます。

著名なPerlハッカーと話せる!

例えばdankogaiさんやlestrratさん、Yappoさん等、国内の著名Perlハッカーと話すことができます!
他愛もない話から、Perlに関するまあまあディープな話題まで、彼らは気さくに応じてくれました!
dankogaiさんとYappoさんに至っては初対面にも関わらず、です。
miyagawaさんは基調講演で、「Perlは人と人をつなぐグルー言語」という様な事を仰ってましたが、正にこれを体現した出来事でしょう。
そして、Perlの作者であるLarry Wallさんにも会うことができました!!

自分とは別の視野を直に吸収できる

当たり前なんですけど、各トークではそれぞれスピーカーの視点に則って発表されます。
ただ、普段周りにPerl使う人が少ない環境に置かれているせいか、これはかえって新鮮に感じました。

Perl Mongersの有り様について、考えを改めた

PMグループディスカッションを見て、考えが変わりました。
現在、国内にはShibuya.pmを筆頭にいくつかのPerlのユーザーグループがあって、それらは「Perl Mongers(略してPM)」と呼ばれたりします。
それまで僕はこれを「技術的にハイレベルじゃないといけない」という概念を持って見ていたわけですが、Tokyo.pmの前田さんが「活動当初は月1回の飲み会が目的だった。」「人と人とのつながりが大事」という様な事を仰るのを聞き、僕の中で、えらく敷居の低い身近なものへと姿を変えていきました。
要するに、「Perl使い同士で呑んだりダベったりする会」だよね?って。そういう気楽なものの方が長続きするだろうし、いいなあ、なんて思ったり。

相模大野/町田あたりでもこう言うのやれれば良いんですがねえ。。。

Perlで笑える

ライトニングトーク(LT)はとにかく小ネタの連続でした(gihyo.jpさんのコチラの記事が秀逸)。例えば…
・dameningenさんの「草植系」言語実装Werl
・nipotanさんの縛り付きシャッフル地獄「There are so many ways to shuffle it」
等など。無論、真面目なLTもありました。
しかし、爆笑系LTに共通して言えるのは、ハイレベルな技術に裏打ちされている内容だと言うこと。
Perlで笑わせるには、それ相応のPerl習熟度と、突飛もない感性が必要に思えます。

運営さんが素敵

参加者のマナーが良いこともあるのでしょうが、会場にゴミが落ちてない!
受付は滞り無く処理され、各種案内もしっかりしていました!
lestrratさんをはじめとするJPAスタッフの皆さま、本当にありがとうございました!!

Larry Wallと間近で会食!

閉会後、後夜祭に参加したのですが、すぐ近くにJim PickさんとLarry Wallさんが!!!
これはすげえや!!!

…ということで

初参加のYAPC::Asiaでしたが、誰かと連れ立って行った訳でもないのに十二分に楽しめました!

2010-10-16

[Perl]YAPC::Asia 2010 2日目ライブレポート

聞いた事そのままです。
感想とか後でまとめたいなー。

How Xslate works - gfx

電車遅延のため10分送らせてスタート。
The next generation template engine

gfx loves perl internal;)

Template engine for perl5
xsで書かれてる。
MakamakaさんがPurePerl版をかいてる
なぜ今更テンプレートエンジンか?すでに様々なテンプレートエンジンがあるのに。
→それぞれ一長一短。完璧なものがない。

Template::Text
なんでもできる。
プラグインもある。
だが遅い。
複雑。
XSSを産みやすい。

HTML::Template
早い。
機能が絞り込まれていて、良い。
Perlのインターフェースが使いにくい。
機能が貧弱。
XSSをとてもうみやすい。

Text::MicroTemplate
早い。簡単にインストールできる。PurePerlなので。
XSSに強い。
Perlのシンタックスなので、非Perlな人には辛い。

今のところ最高のものがない。XslateはCPANでは最速。

コロンで行を始めると、コードになる。
CUIではxslateコマンドを提供。
-TTerseオプションを指定すると、TTライクなテンプレート構文になる。

Cacheがあれば、最速。by Sam Graham

XSS対策

従来のテンプレートエンジンは全てエスケープ。
Text::micfoTemplate譲り。
アンエスケープ機能もあるけど、使うなw

テンプレート構文
Kolon デフォルト。
TTerse tokuhiromからの強い要請。パフォーマンス低下はない。
Clevery Smarty的なやつ。

拡張可能。

テンプレート継承
Kolonでのみ使える。
TTのラッパーのすごいやつ。

実行プロセス
まずテンプレート構文をプリプロセス。
中間コードをパースし 、ヴァーチャルマシンに食わせる。

Top Down Operator Precedence

Data::MessagePackをバイトコード保存に使用。

テンプレートエンジンは、HTML escapingがボトルネックになる。

WAFにも組み込んで見て!
お金ないから投票よろしく!w

質疑
こばやしさん
q なぜVMを実装することにしたのか?
A Perlそのものでは余計な処理が入るので。

dankogai
perl6でvmじっそうすれば?

他の言語向けのバインディングは?
>考えてません。

Ajax Application Testing - Yappo

Ficiaという写真共有サービスで使った、JSTAPdというツールの話
JavaScriptのテストツールはいろいろある。

各種ブラウザのjavascriptエンジンを使ってテストしたい。
Ajax のテストをしたい。
Cliのツールがいい。

ユーザが使うかもしれないブラウザでの自動テストが重要。

インストール
cpanm jstapd

テストコードはjavascriptでかく。
が、Test::More的なシンタックス。というか、まんまTest::MoreをJavaScriptに持ってきた感じ。
01test.tにjquery_jstapd.plという文字列リファレンスを食わせると、テストコード内でjQueryが使える。
tファイルには、JSTAPd::Suiteをuse.

conf.pl内にブラウザ起動のシステム構文>cliで自動テスト!

*.tファイルにはサーバサイドのテストコード。
*.jsにajaxのテストコード。
jstapDeferred使わないと、非同期な処理ではテストにならないので注意。

PSGI+Plack+Twiggyで構築。

質疑応答
刺身さん非Ajaxなテストはどう書けばいいの?
>普通に書いてください。

Perlで任意精度計算 - Daisuke Maki

普通は、整数部3桁、小数部7桁までしか表現出来ない。
本当に正確な値を求めたい場合に問題。
誤差から生じるエラー幅がどんどん桁が膨れ上がる。

任意精度計算とは任意のデータ量で任意のデータ幅を計算する。

旧暦について
地球から観測した月と太陽の緯度で決まる。
昔の人はこれをちゃんと計算してた。
月の満ち欠け 29.5日周期。
太陽周期 365.2日周期
これらを計算しないと旧暦を求められない。
高精度を要求される。これをPerlでやりたい。

print 1/86400;
これでは小数点以下18桁しか求められない。
正解は小数点以下59桁

Math::BigIntの問題点
文字列としてデータを渡さないといけない。
1value = 1objectなので、非常に遅い。
plainなperlと比較しても、600~700倍の時間がかかる

じゃあどうする? > goodbye perl!
Cでやらせます。→MPFRというライブラリを使う。

DateTime::Astroとしてあげ直した。
結果、Math::BigBit比54倍の処理速度。

perlからは文字列でデータを渡す。鉄則。
Perlでやらない方がいいものもある。
旧暦計算は楽しい。

XSからPPへ - Makamaka

xsをpureperlにする話。

XSをPPにすると
ポータビリティ向上。
xsの知識が得られる。
暇つぶしになる。

でも
遅い。
最高に車輪の再発明。
遅い。

テストは重要。動作を合わせるうえで。
エラーテストがあるとなお嬉しい。

ノウハウは、モダンPerl入門の8章に載ってます><

dankogai
Perl5をPP化してくださいw

Unix programming with perl - Kazuho Oku

テストが通るのと、コードが正しいかとは別。

Errno
use Errno;
$! is dualvar.

どうやってerrnoの一覧とその意味を?
man 2 mkdir

可搬性を重視なら、opengroupの資料を参照。

Fork
Dbiの場合、子プロセスにてInacfiveDesfroy変数を立ててからDisconnect。
親プロセスで開けたファイルハンドルは親プロセスで閉じておく。

Unix signals
ネットアプリケーションが止まる場合、SIGPIPEの処理がないからだったりする。
$SIG{PIPE} = IGNORE
タイムアウト時の処理をSIGALRMで。
$SIG{ALRM} = sub{ ... };
Gearman::Worker等で使われているノウハウ。

この辺の話は、Web+DB Pressでも。

Inside mbga platform - Toru Yamaguchi

途中からききました。

OpenSocial container 俗に言うYahooモバゲーの内部設計
Apache shindig を使用したOpenSocialコンテナ。

Inside Social API 
軽くてシンプルなのが要求される。
余分な機能は不要。
既存のWAFを使わず、Plackでおk。
Webserver ligttpd 
Routing Route::Simple
Config pl

Model
APIのロジックを記述。
原則的にやりとりするデータはscalar, array ref, hash ref.
軽量化の為、無駄なインスタンスを作らない。(オブジェクトにしない)
Object::Containerにモデルを突っ込んでおく。

接続情報はmemcachedにあるというモバゲーの流儀。
Object::Container++

DBI::DBHResolver
複数のデータソースへの接続を一元管理。

DBIx::Connector
DBIの薄いラッパー。

SQL::Abstract::*
SQL書くのはたいていこれで。
JOINする場合は、直接ヒアドキュメントで。

MySQL
日時によるパーティショニング
Triggerの積極利用。
Trigger+Q4Mでテーブルを動的に変更。 検証中。

Db接続のラウンドロビンは、負荷の不均衡を招くかも。
 

2010-10-05

[Perl]PlackのSyntax Sugar "Flea"を試してみた

最近ご無沙汰だったPlackに触るべく、何かネタがないかなー、とCPANをフラフラと彷徨っていたところ、Fleaというモジュールが目につきました。
面白そうだったので、さっそく試してみましたという記録です。
あくまで、Synopsisをなぞった程度なんですけどもねー。

※Flea = "ノミ"の意だそうで、podみててもノミを思わせるジョークがちらほらと見受けられます。

まず、トップに表示するhtmlをこさえます。

index.html

<html>
<head>
  <title>Flea ノミのように小さなPlack Syntax Sugar</title>
</head>
<body>
  <h1>Flea ノミのように小さなPlack Syntax Sugar</h1>
  <p>工事中</p>
</body>
</html>

で、psgiファイルを用意します。

flea.psgi

use Flea;
my $app = bite {
    get '^/$' {
        file 'index.html';
    }
    get '^/api$' {
        json {
            name => 'Flea',
            ja => 'ノミ',
        };
    }
};
通常のpsgiではちょっとあり得ないほどシンプルになってます。特にルーティングまわり。
podによると、このあたりはDancer譲りのようです。Dancer使ったことないので、よくわかってませんけど。

手元の環境は上位にロードバランサーがいるので、とりあえずそこからtcp4000番にバランシングするように予め設定しておきました。
で、起動ですね。今回はServer::Starter + Starmanで起こしてみました。(最速セットアップ案内 Catalyst on Starmanを参照。)
[root@nethard myflea]# start_server --port 4000 -- starman --worker 8 ./flea.psgi 
start_server (pid:901) starting now...
starting new worker 902
Setting gid to "0 0 10 6 4 3 2 1 0"

ではブラウザでアクセスしてみます。
ちなみに、/psgi以下に今回のアプリを組み込みました。
まず、'/psgi/'にアクセス。


おお!当たり前ですが、うまくできてしまいました!!
さて次は、'/psgi/api'にアクセス。JSONが出ればOKです。


こちらもうまくいきました!
小さなサービスを作るときの手段としては、悪くないかも。