YAPC::Asia2009の特別研修「Perl, Unicode, and AJAX」は自由な感じの研修でした

  • 小飼弾id:dankogai)さんのAjaxの基礎講義でした。
    • ただ、ダブルブッキングだったらしく、16時前にdanさんは抜けました。(一通りの説明したので研修を疎かにしてはないです)
    • ということで、16時からはMaki(id:lestrrat)さんとEmerson Millsさんがいろんな話をしてくれました。
      • これが何でも聞ける形式で面白い時間でした。こっちのコーナーが一日だったとしても面白かっただろうなぁと。
  • 今回の研修は前日のMooseの研修と違い、ほぼ自由な感じでした。なので質問とかどんどんしてなかったら多分何も得られてなかっただろうなと思います。
    • その分、関係ないことも色々質問できて楽しかったです。
      • IRCの話とかそういうの。
  • 研修と関係ないことメモ。
    • danさんは<script>のことをチートと言います。
    • danさんはemacs使います。
      • ただ、今回はsyntaxの拡張とか入ってなかったみたいです。
      • 設定がtab=8だったのでbackspaceとspaceを駆使してインデントしてました。
    • Emersonさんはvi使い
      • Emacsの操作忘れてた人に「viは使えないの?Emacs使って辛い思いしてもいいの?」と言ってました。
    • Emersonさんが昔教わったこと
      • functionをfなんて名前にすると昔は怒られたよ。何のfunctionなのか名前をしっかりつけましょう。
  • 以下メモ

今日の流れ

今までのwebアプリ
  • クライアントがサーバにHTTPでリクエスト投げる
    • サーバはレスポンス返す
  • webページのHTMLを使って表示
  • 以上のことはAjaxでも変わらない
実習 - 環境変数(%ENV)をHTMLでテーブル表示
  • Content-Typeを忘れない
    • ないとInternal Error
  • use strict; use warnings;は必ず入れる
    • 入れないとtypoしても動いちゃうから良くない
  • htmlタグが多くてうざったいよね
    • これがphpが流行った理由でもある
    • ここでAjaxの話が出てくる
Ajaxで何が変わったか?
  • HTMLの部分はクライアントに任せる
    • CGI側でHTMLタグを書く必要性がないというメリットがある
    • レスポンスはデータを送るだけ
      • phpのようにHTMLタグの中に変数を埋め込むという所をやらなくて済むようになった
    • MVCのviewの部分をクライアントに渡せば良くなった
実際サーバから送ってたデータとは何?
  • サーバからXML,JSON(P),Palin Text,YAMLなどを返す
    • XMLは急速に使われなくなった
      • パースが面倒、結局HTMLタグを書くのと同じようなことをしないといけない
      • データ量が多い
    • JSON
      • (セキュリティはともかく)とりあえずevalすれば使える
XML vs JSON
  • XML
    • XMLだと一つのデータを送るのにもタグが必要
    • 本来のAjaxでしか使えない(XMLHttpRequest)
      • LWPでのリクエスト
      • ドメイン超えができない
  • JSON
    • JSONならハッシュ構造にするだけ
    • クロスサイトで使える
      • <script>があった場合ブラウザは問答無用で実行してくれる
      • セキュリティの面では良くないけど、柔軟なことができる
    • JSONP
      • callback({...})の{...}の部分がJSON
    • ブラウザのセキュリティホールを付いたような一種の裏技
実習 - JSONP環境変数を表示するためのサーバサイド
  • Content-Typeは決め打ちでいい
  • use JSON::XS;をしましょう
    • 楽をしてね
実習 - JSONPのクライアントサイド
  • danさんのrunJSONを呼び出すような関数を作る
    • 中で無名関数で<script>を動的に生成してJSONPを呼び出している
  • 適当にhtmlを作る
    • 出力部分のHTMLタグにidを設定
  • JSONPはcallbackで呼び出すため、コールバック関数はグローバルオブジェクトでないといけない
  • IEでおかしくなる場合があるのでwindow.setTimeoutでrunJSONを呼び出している
  • DOMでappendChildしていくのが面倒な人はライブラリを使うなどで工夫してください
  • Ajaxの良い所
  • なぜJSONでなく、JSONP
    • JSONPのデメリット
      • GETしか使えない
      • サーバ側で悪質なスクリプトを作ってあるとセキュリティ的に問題
    • ただし、クロスサイトで使えるのメリットが大きい
    • 文字コードは常にUTF-8
実習 - JSONPをdumpする
  • JSONが深い場合は再帰しないといけない
    • functionで自分自身を呼ぶ時はarguments.callee
  • アメリカのどっかの大統領が言ってた
    • 自分が木こりだとして自分が8時間仕事をするとしたら6時間は斧を研ぐものだ
  • 自分がブログにAjaxで作成したツールのエントリー書く時は10分から15分くらいでできる
    • それはdumpとかこういうAjax関係のツールを作ってるから
Ajaxのまとめ
  • メリット
    • 文字コードUTF-8
    • CGI側でHTML書かなくて済む
    • クライアント側を他の担当の人にできる
  • デメリット
    • 検索エンジンに乗らない
      • 簡単なJavaScriptなら実行されるようになってきた
    • 非同期なので表示されない時がある
    • セキュリティが良くない場合がある
    • 一番のデメリット:JavaScriptオフの環境では動かない
      • ケータイ
  • デメリットの解決策
    • JavaScriptが動かない環境ではサーバ側で実行してから返す
Ajaxでサイトを作る時の注意点(CAVEAT)
  • exception
  • サーバの負荷が大きい
    • HTML時代は最小単位が1ページだった
    • Ajax時代は最小単位がDOM
      • 1ページでたくさんのデータを返す場合がある
  • サーバとクライアントで言語が違う
    • いい点でもある。サーバはJSONを返せばいいだけだから、より自由になる
CPANの良い点とJavaScriptの問題点
  • jrockwayの基調講演の話
    • ライブラリがあるじゃないか
    • 人が書いたものが使える
  • JavaScriptはライブラリがどこにあるかわからない
    • Perlに限らず他の言語でもいいものを書いてる人はたくさんいる
  • perlで何かしたい場合はCPANを見ればいい
    • ここにあがってなければ安定板がないとほぼ思っていい
  • 対してフレームワークは色んな所で配ってる
    • 何でフレームワークが必要かって言うとHTML書くのが嫌
      • Ajaxにしておけばサーバのコードが少しで済む
その他、途中で出た質問とか
  • CGI::Simpleに対してのCGI.pm
    • CGI.pmはそんなに重くないよ
    • ただソースが黒魔術
    • mod_perlにも入ってるし
  • Perlのorと||
    • 優先順位の関係で||だと初期化されるけどorだと初期化されない

時間がちょっと余ったので質問コーナー

Perl6が出たらCPANはどうなるの?
  • CPAN6が予定されている
    • perl6が実際に使われるのは2年後だと思う
    • 来年Rakudo *
  • Perl5はそのまま続くと思っていい
    • Perl5は別プロジェクト
  • Perl6からinlineでPerl5が呼び出せる
    • CGI.pmを動かすというのをYAPC::Asiaでやった
Perl6のパフォーマンスについて
  • (Emerson)「YAPC::AsiaでJonathanのトークを聞いたんだけど、Hello, world実行するのも「よいしょ。」って感じ」
    • デバッグが入ってるからと言ってるけど、それでも「よいしょ。」って感じ
  • parrotのvirtual machine自体遅い
    • Rakudoのパースを改良しても速度的には速くならないかも
    • parrotは地味
      • JPAのお金が集まればそっちにもまわしたいくらい
Catalystなどのフレームワーク自体は使いにくいのだけどどう思いますか?
ページ自体の文字コードUTF-8でないのにJSONPUTF-8で文字化けしないのはなぜ?
型が嫌いと言っていたけど、MooseとかPerl6は型がカッチリしてない?
  • anonymousのクラスも作れたりするのでカッチリしすぎてるわけではない
    • Perl5じゃそれはできない
      • まぁ、MooseX::Declare使えばできるけど、MooseX::Declare使うとPerl5がサイボーグになっちゃう
  • クラスを使うということが型にはまるということ
    • useなんちゃらはuseしたものの型にはまる

EmersonさんとMakiさんに変わって。

  • danさんが帰ったので時間を埋めるために二人のTips系+面白トーク+質問+雑談
周りの人がPerlの拒否感あるのだけど、そういうのに対してをどう答えればいい?(たとえばwebアプリを作る時)
  • Makiさん
    • perlは大好きだけど、perlでやらなくていいことならperl以外でやればいい
    • perlならcpanが使えるから色々できるということでperlを使ってる
    • 受注だと想定していないことを、あとで「足せ」って言われることはよくある
      • win-winになるためには落とし所が重要。それがPerlだと楽。
    • この前あった例:作ったページに対して「OAuthでtwitter入れて」と後から注文された
      • でも、プラグイン入れておしまい
  • Emersonさん
    • 大きく.NET,JavaPHP,Ruby,Perl,Ptyhonに分かれる
      • .NET,Javaは裏側で企業がサポートしているイメージがあるのか人気だけど、実際はそんなサポートしてないよね。
    • Perlに関しては日本で活発
      • ただ、Perlの日本語ドキュメンテーションが少ないのが残念
    • コミュニティを考えるとPerlのコミュニティが一番大きい
Perlの日本と世界
  • Makiさん
    • アメリカで5年くらい働いたけど、その時はCとPerlJavaだけしか聞いてない
  • Emersonさん
    • 大学の「とりあえず作ってみよう」の授業でpythonがよく使われる
    • PHPを書いてる人が増えてのに危機感を感じてる
    • Rubyは日本ではほとんど使われてない
      • 外国からRubyの本拠地にわざわざくる人もいるんだけど、その人たちが日本に来てガッカリしているのを見るが面白い
何かwebページを動的に作るとき
  • Makiさん
    • YAPC::Asiaで使ったツールはCGI.pmで2ファイルとかで作った
    • どの言語でやっても同じくらいで作れると思う
      • 慣れてるやり方でやるのが一番だと思う
メモリが開放されない?
  • Makiさん
    • Perlは一度手に入れたメモリをプロセスが終わるまで開放しない
      • 集計してるならberkreyDBとかの外部ファイルに書き出すのがいい
Moose
  • 実用に耐えられるよ
  • 自分でやる分にはメモリも気にしてない
twitterの問題はPerlなら問題なかったと思う?
  • Makiさん
    • DBの書き込みなどの問題だと思うからPerlの層ではないと思う
      • DBとのやり取り部分での問題なら「Railsはやり方が一つ、Catalystなら他のやり方もある」ってのは言えるけど、問題は起きちゃうと思う
      • ただ、解決への道筋がどのくらいあるかは違うかな。Perlは解決策が色々ありそう
    • 他の言語やってる人と話すと感じること(主観だけど)
      • 他の言語の人は理想とか完璧について言ってる感じがするのだけど、Perlは現実的というか、Perlでなくてもいいって言う人が結構居る
  • Emersonさん
    • パフォーマンスを出したいならコンピュータサイエンスとか関係ない
      • ある先輩から言われたらことは「アルゴリズムを考えろ」ということ。これがとても役に立った。O(n)とかそういうやつ
mod_perlがマゾ
  • Makiさん
    • mod_perlApacheへのAPI
      • アプリ側がApacheの巨大なのを隅々まで見ないといけないのがナンセンス
      • Apacheの中で名前空間がずっと使われるがデメリット
      • 変数の値を覚えておかないといけない
  • (それと比べてFastCGIは?)
    • FastCGIのプロセスが立って、apacheがそのプロトコルを話す
      • メモリ管理がデメリット
    • Copy on Writeでメモリ共有がメリット
    • 若干楽
  • どちらでやるにしろ定期的に殺した方がいい
    • その運用方法はどちらもある

Emersonさんの講義

  • ちょっと質問が尽きたようなのでネタとかtipsとか
ER図書いたらDBIx使ってすごく簡単にschema作れるよ
  • まずER図について(DBの正規化について)
    • ある先生からいわれたこと
      • これをオブジェクトだと思え
  • MySQL Workbenchというツールがある
    • http://dev.mysql.com/downloads/workbench/5.1.html
    • SQL作る際には一番いいツール
    • ER図を書くだけで、ほぼ完璧にそのSQLを書いてくれる
    • 色々できるけどWebアプリなら簡単な機能だけ使えば十分
    • 注意点
      • primary keyのところでテーブル名をお尻に付けたがるからそこだけ変える
    • 必要なテーブルを作ったらn対1のmany側のテーブルを先に選んで1の方に線を伸ばす
      • これだけで外部キーとかもできる
    • ExportでSQL発行
  • その後DBIx::Classを使う
    • DBIC::Schema::Loader(DBIx::Class::Schema::Loaderのこと。Perlのパッケージ名の略語は適当に決めてるらしい。規則性あるのかと思ってたから「へぇ」って思った)
      • さっきできたSQLを食わすだけで、ORMのデータクラスを作ってくれる
    • dbicdeploy
      • DBICx::Deploy(なぜかCとXが逆。意味がわからない)
      • やっぱりMySQLは嫌だって場合は他のDBのLoaderもできる
Mason
  • HTML::Mason
  • Amazonで使ってた
  • WIKITTで使ってる
  • テンプレートツール
  • tips:二つの関数の呼び出し方
    • <%def>
      • privateの定義
    • <%method>
      • publicの定義
  • 例えばメールフォームで<%method>ccformを定義すると以下のように書ける
    • $m->comp(form.mi:ccform)
  • あとselfという概念もある
  • テンプレートになりたかった時期があったみたいで、Dispatchなどもあるけど無視してください
    • Catalystとかの方が全然いいから
  • まぁ、Masonなんて多分使わないよね

また質問コーナーに戻りました。

Perlは速い?
  • Makiさん
    • どう評価するかによるから何とも言えない
    • 開発コストとのトレードオフ
      • 結局Cで書いた方が速いでしょ?
  • Emersonさん
    • 誰かが言ってたけど、memcachedにはどれも負けるよ笑
      • mencachedは既にデータが入ってるからね
Perl6の実装について(複数実装があるのはなぜ?とか)
  • Makiさん
    • Perl6は仕様ありきなので複数実装されててもおかしくはない
      • 2003年とかにはPerl6が始まってた
    • Pugsはいち早くHaskellで開発をはじめた
      • 開発者が恋人に捨てられたか何かで開発が止まったんだっけか?
    • Perl5とPerl6という名前がミスリード
      • Perl6でできることをPerl5でやろうとして追いつこうとしててPerl5も進化してる
    • Perl5はまだまだ終わらないよ
      • Perl4の時もライブラリをPerl5で動かしたりもしたし
    • HyperOperaterが並列にできるようになったらPerl6も使えるかも
      • 仕様では並列処理なので
      • (Emerson)MySQL使ってて一気にページが取れるのにmapで順次に処理するのがもったいない気がするからHyperOperaterに期待
Perlの調べ方(例えば特殊変数がわからない)
  • Makiさん
    • 独学でperldoc全部読んだからなぁ…
      • 特殊変数ならperlvarにいくとか。perlvarがあるってことは覚えておかないとダメだけど
  • どうやって調べていいかわからなくなったらIRCに行こう
    • shibuya.pm
    • jpa-perl
    • soozy
      • ここはやめておこう。濃い人が怖い
      • 下ネタとかそういう話題が欲しい時はここ
      • ここはid:yappoさんが
IRCやったことないのだけど、みんなリアルタイムで見てるの?ログ取って後から見てるの?
  • Makiさん
  • ZNCでプロキシ立ててる
    • 後でログを全部舐めてる
  • リアルタイムでもたまに見てる
    • ちなみにid:miyagawaさんはみんなも知ってる通り寝ないから、結構リアルタイムでいる
      • (Makiさん、Emersonさん)あれで何で死なないんだろうね?不思議。
      • (そう言えば前日の研修でSartakがhttp-engineかどこかのチャンネルでmiyagawaさんとやりとりしてたのを思い出した)
Perlのドメインについて
  • perl.orgが本体
    • と言っても、ほとんど行かないよ
  • 結局CPAN知ってればいい
    • perl5.10.1もCPANから落とす
  • ちなみにperl.comはオライリーのもの
Moose本体に何かが入ることはある?
  • MooseX::Typeが入りそうだったけどこの前却下されてたから大きいものはしばらく入らないと思う。