SlideShare a Scribd company logo
1
0から学んだ
ポストモダン
Perl
YAPC::Asia Tokyo 2013
グニャラくん
(末永 匡)
Perlについて
ほとんど知らない
この僕が
2
社内用Web
アプリケーション
フレームワークを
作ることになって
3
いろいろ
壁に
ぶち当たりつつも
4
Perl
mongerに
近づけたお話
5
本発表の概要
• 前半
「俺が考えるWebアプリケーションフ
レームワークとは」
• 後半
「酒と泪と俺とPerl」
6
7
自己紹介
8
自己紹介
• グニャラくん
• 「東横イン評論家」
でGoogle検索1位
9
まともに
Perl
書いたこと
なかった
10
Perlのイメージ
11
Perlといえば(1)
12
Perlといえば(2)
13
そんな僕が
いまや
14
GitHub認定?
• Perl monger?
• 単なる
Old style
engineer
15
なぜか?
16
Perlを
使う会社に
転職したから
17
所属
• 株式会社ディー・エヌ・エー
• ソーシャルゲーム開発部門に所属
• 海外向けソーシャルゲーム開発部署に配属
18
ある日
指令が
下った
19
20
国内向けWeb
ソーシャルゲーム
を海外移植せよ
Web S.G.の移植
• DeNA社内Webアプリケーション
フレームワーク MobaSiF
• 2003年から稼働
• たくさんのゲームがMobaSiF上で稼働
21
MobaSiF
• /home/xxxx/以下の固定パス
• Apacheが動作していることが前提
• 職人芸的mod_rewrite
• ゲーム・プラットフォーム・フレーム
ワークが密結合
22
海外向けに
単一のゲームだけ
切り出すのは
面倒だな…
23
さらに
困難な
事情が
24
日本ローカル
• ベトナム人エンジニアに説明しづらい
• What is DoCoMo? / What is Emoji?
• スマフォ向けだから使わないのだが
• コメントや設定ファイルが文字化けし
て破壊される
• ソースコードはEUC、テンプレートはShift-JIS
25
困った
26
27
そういえば
こんな仕事も
やってたな
28
フレームワーク調査
• JSON on HTTPやWeb APIを各言語
でどうやって実装するのか
• http://blog.wktk.co.jp/archives/234
29
よっしゃパパ
Plack上で
MobaSiF互換
層作っちゃうぞー
30
旧GunyaSiF誕生
• Plack上に構築されたMobaSiF互換レ
イヤ
• ソースコード/テンプレートはUTF-8
に移行
• テンプレートはXslate/TTerseに移行
31
旧GunyaSiFの成果
• Mac上でVMなしに開発できるように
• Mobageお手製パッチ済みFlash生成
用Mingライブラリの64bit対応
32
結構簡単に
できた
Plackスゲー
33
そこから
しばらく
ゲーム運用
したあと
34
上長に
呼ばれる
35
36
お前
ゲーム向け
フレームワーク
作れ
フレームワーク作りへ
• 誰かがやらねばならないことだし
• 前職で従事していた「ニコニコ大百
科」というサービスも、フレームワー
ク手作りだったし
37
GunyaSiF
爆誕
38
フレームワークの中身
• Amon2ベース
• 複数アプリケーションをホスト
• 継承できる環境設定ファイル
• 社内の各種APIへの対応
39
どうでもいい
40
もっと
一般的な
話をします
41
Web
アプリケーション
フレームワークに
俺が求める機能
42
実は
43
ほとんどない
44
Plackスゲー
• Plack/PSGIの時点で、ある程度Web
アプリケーションをつくる土台がある
45
こんなのはいらない
• ルーティング
• Router::Simpleでよい
• O/Rマッパー
• Tengでよい
46
アプリケーション
側で
好きなモジュール
使えばいい
47
大事なこと
• 必要な部品はCPAN上にある
• それをいかに組み合わせるか
48
Web
アプリケーション
フレームワーク
を再定義すると
49
50
Web開発に必要な
モジュールセットの提案
と
モジュールを結びつける
グルーコードの実例
WAFの作り方
• 適切なCPANライブラリを選ぶ
• グルーコードを書く
51
グルーコードをどう書くか
• グルーコードはOld Style Perlで十分
• Mouse/Mooなにそれ?
• アクセサが必要なものは汎用的なモジ
ュールくらい
• 追い出したモジュールはCPANにアップロードする
52
blessで
十分!!!
53
54
これが
ポストモダン
Perl
CPANには
多くのWeb向け
モジュールがある
55
ただ
56
57
足りないと思う
モジュールが
いくつかある
足りない
モジュール
その1
58
Plack::App::
phpMyAdmin
59
phpMyAdminスゴイ
• 実用上テーブルビューワは欲しい
• P::A::PHPCGIで動かすのもいいけど
• ファントムファイル表示など、値がフ
ィルターできればなおよい
60
GunyaSiFでは
どうしたか
• スクラッチで書いた
• LDAP認証とか妙に凝った
• 正社員かどうかによってテーブルごとに閲覧権限を設
定できたり
• キモすぎてCPANに上げられない…
61
足りない
モジュール
その2
62
js/css
自動コンパイラ
minifier
63
デザイナーにやさしい
• Sprocketsによるアセットパイプライ
ンとか、Gruntとか
• Sass/SCSSくらいは対応したい
• Coffee/JSXにも対応したい
64
Sass/SCSS
対応
65
Text::Sass
• Text::Sassでイケるじゃん、と夢見て
いたころが僕にもありました
• Filesys::Notify::Simpleと組み合わせ
れば自動コンパイルできるはず
66
67
イケません!!!
README on
Text::Sass
• This is most definitely a work-in-
progress. It only implements a
subset of the specification
• (snip)
• No support for @import of sass
68
うう…
ツラい
69
GunyaSiFでは
どうしたか
• CSSはCompassを採用
• Rubyだけど
• 開発時は、CSSへのHTTPアクセス時に動的にコンパ
イル
• JS MinifyはClosure Compilerを採用
• Javaだけど
70
前半まとめ
71
前半まとめ
• WAF = Web向けCPANモジュールの
集合 + グルーコード
• グルーコードはポストモダンPerlで
• 足りてないモジュールもあるよね
72
73
酒と泪と
俺とPerl
74
Perl
まじめに
さわり始めた
感想
75
…
76
普通じゃん!
77
Perlへの感想
• 普通
• perlbrew/plenv
• cpanm/Carton
• Plack
• 他言語で便利なものがちゃんとある
78
モジュールの管理方法
• GunyaSiF開発時はCarton 1.0前
• Carton採用してたが、carton execめ
んどいのでcpanm化
• Carton.lockからcpanfileを出力するスクリプトを書
いた
• cpanfile.snapshotになったから今は不要…なの?
79
Perlで
ハマったところ
80
Data::Dumper
• 開発中に使うモジュールランキング第
1位(俺調べ)
• Rubyでいうところのpp
• んな大事なモジュールが壊れてるわけ
ない
81
壊れてました…
82
壊れているという惨事
83
id:gfxに泣きついた
• Data::Dumper が壊れているという惨
事
• http://d.hatena.ne.jp/gfx/
20130305/1362496416
• Perl 5.13で導入された
isWORDCHAR()がなかった
84
P::M::MemoryUsage
• Plack::Middleware::MemoryUsage
• packageごとのメモリ使用量
• リクエストを処理する前後の増分
• B::Size2(::Terse)を使ってる
85
壊れてました…
(SEGVする)
86
id:gfxに泣きついた
• B::Size2をデバッグしたときのメモ
• http://d.hatena.ne.jp/gfx/
20130201/1359701228
• SvMAGIC()の中で落ちてた
87
(元)同僚
スゴイ人が多くて
とても助かる
88
なぜ
こんなに
地雷を踏んだか
89
だいたい
Perl 5.10
のせい
90
なぜ
Perl 5.10を
選んだか
91
バージョンの選び方
• CentOS 6系のsystem Perlのバージ
ョンは5.10.1
• 枯れてるからそれ使おう
92
間違い
93
ライブラリは進化する
• CPANライブラリのバージョンも固定
しないんだったら、環境として枯れて
いない
• むしろ、リスクを増大させてしまった
94
バージョン新しくしよう
• 最新のPerlにフォローアップすべし
• セキュリティパッチが提供されている
• ハッシュ衝突攻撃のパッチを当てるのも面倒だった
• 便利機能や性能向上などいろんな恩恵もある
95
そんな
おっちょこちょい
な僕でも
96
CPAN
Authorに
なれました
97
98
CPAN参加への動機
• コミュニティに還元したい
• コミュニティから受けた恩恵は計り知れない
• 設計上の密結合化の防止
• グルーコードはつなぐモジュールがな
いと意味がない!
99
CPANの感想(1)
• 意外とカンタン
• 敷居低くてカジュアルに参加できる
100
CPANの感想(2)
• Minilla普通に便利ですね
• その代わり、隠蔽されている部分について知識がない
と、イレギュラーな場合に死ぬ
101
CPANの感想(3)
• モダンなXSモジュール作成法がよく
分からない
• typester先生のプレゼンはある
• https://speakerdeck.com/typester/xsnimatuwaruhua
• Module::Build::Pluggable::XSUtilはなんかつらかった
• http://blog.wktk.co.jp/archives/331
102
CPANの感想(4)
• Plack::Middleware名前空間のモジュ
ールを上げると、どこかのIRCに通知
が出るらしくコワイ
103
後半まとめ
• Perlは最新版に近いものを使おう
• CPANへの貢献はカジュアルに!
• 機能がかぶろうが、名前空間がちょっとおかしかろう
が、TMTOWTDIの精神で
104
まとめ
105
まとめ
• 汎用的な処理はCPANモジュールとし
て公開することを前提に書こう
• グルーコードを書いて世の中に面白い
Webサービスをどんどん出していこう
106
ご静聴ありがとう
ございます!
107
108
ストーリーから
浮いてる
スライド
(未使用)
109
フレームワークの苦労
• フレームワークだけ書くのつらい
• MobaSiFだって、大百科用フレームワークだって、ア
プリケーションを作りながらフレームワーク書いてい
た
• アプリ開発者のニーズと乖離する
110
C言語でWebApp(1)
• C言語でWebAppの開発に必要なN個
のこと
• http://blog.wktk.co.jp/ja/entry/2013/09/10/
clang-webapp
111
ジョークエントリ
では
ないんです
112
C言語でWebApp(2)
• 前職で作ったフレームワークはいたる
ところにC言語が使われていた
• メンテナンス性が最悪だった
113

More Related Content

0から学んだポストモダンPerl @ YAPC::Asia Tokyo 2013