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

113
1 0から学んだ ポストモダン Perl YAPC::Asia Tokyo 2013 グニャラくん (末永 匡)

description

Perl初心者だった私が、普通にPerl開発できるようになるまでの、1年間の涙と感動の軌跡をトークいたします。 - Apache/FastCGIベースのアプリケーションをPSGI/Plackに移行したり - モジュール管理をCartonにしたりcpanm生にしたりして悩んだり - Data::DumperやB::Size2::Terseの不具合で悩んだり - Amon2をベースとしたウェブアプリケーションフレームワーク作成したり - CPANにXSモジュールをアップロードしたり

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

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

1

0から学んだポストモダン

PerlYAPC::Asia Tokyo 2013

グニャラくん(末永 匡)

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

Perlについてほとんど知らない

この僕が

2

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

社内用Webアプリケーションフレームワークを作ることになって

3

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

いろいろ壁に

ぶち当たりつつも

4

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

Perlmongerに近づけたお話

5

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

本発表の概要• 前半「俺が考えるWebアプリケーションフレームワークとは」

• 後半「酒と泪と俺とPerl」

6

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

7

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

自己紹介

8

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

自己紹介

• グニャラくん

• 「東横イン評論家」でGoogle検索1位

9

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

まともにPerl

書いたことなかった

10

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

Perlのイメージ

11

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

Perlといえば(1)

12

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

Perlといえば(2)

13

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

そんな僕がいまや

14

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

GitHub認定?

• Perl monger?

• 単なるOld style engineer

15

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

なぜか?

16

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

Perlを使う会社に転職したから

17

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

所属

• 株式会社ディー・エヌ・エー

• ソーシャルゲーム開発部門に所属• 海外向けソーシャルゲーム開発部署に配属

18

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

ある日指令が下った

19

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

20

国内向けWebソーシャルゲームを海外移植せよ

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

Web S.G.の移植

• DeNA社内Webアプリケーションフレームワーク MobaSiF• 2003年から稼働

• たくさんのゲームがMobaSiF上で稼働

21

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

MobaSiF• /home/xxxx/以下の固定パス

• Apacheが動作していることが前提• 職人芸的mod_rewrite

• ゲーム・プラットフォーム・フレームワークが密結合

22

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

海外向けに単一のゲームだけ切り出すのは面倒だな…

23

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

さらに困難な事情が

24

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

日本ローカル• ベトナム人エンジニアに説明しづらい• What is DoCoMo? / What is Emoji?

• スマフォ向けだから使わないのだが

• コメントや設定ファイルが文字化けして破壊される• ソースコードはEUC、テンプレートはShift-JIS

25

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

困った26

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

27

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

そういえばこんな仕事もやってたな

28

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

フレームワーク調査

• JSON on HTTPやWeb APIを各言語でどうやって実装するのか• http://blog.wktk.co.jp/archives/234

29

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

よっしゃパパPlack上で

MobaSiF互換層作っちゃうぞー

30

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

旧GunyaSiF誕生• Plack上に構築されたMobaSiF互換レイヤ

• ソースコード/テンプレートはUTF-8に移行

• テンプレートはXslate/TTerseに移行

31

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

旧GunyaSiFの成果

• Mac上でVMなしに開発できるように

• Mobageお手製パッチ済みFlash生成用Mingライブラリの64bit対応

32

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

結構簡単にできた

Plackスゲー

33

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

そこからしばらくゲーム運用したあと

34

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

上長に呼ばれる

35

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

36

お前ゲーム向け

フレームワーク作れ

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

フレームワーク作りへ

• 誰かがやらねばならないことだし

• 前職で従事していた「ニコニコ大百科」というサービスも、フレームワーク手作りだったし

37

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

GunyaSiF爆誕

38

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

フレームワークの中身• Amon2ベース

• 複数アプリケーションをホスト

• 継承できる環境設定ファイル

• 社内の各種APIへの対応

39

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

どうでもいい

40

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

もっと一般的な話をします

41

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

Webアプリケーションフレームワークに俺が求める機能

42

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

実は43

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

ほとんどない

44

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

Plackスゲー

• Plack/PSGIの時点で、ある程度Webアプリケーションをつくる土台がある

45

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

こんなのはいらない

• ルーティング• Router::Simpleでよい

• O/Rマッパー• Tengでよい

46

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

アプリケーション側で

好きなモジュール使えばいい

47

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

大事なこと

• 必要な部品はCPAN上にある

• それをいかに組み合わせるか

48

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

Webアプリケーションフレームワークを再定義すると

49

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

50

Web開発に必要なモジュールセットの提案

とモジュールを結びつけるグルーコードの実例

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

WAFの作り方

• 適切なCPANライブラリを選ぶ

• グルーコードを書く

51

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

グルーコードをどう書くか• グルーコードはOld Style Perlで十分• Mouse/Mooなにそれ?

• アクセサが必要なものは汎用的なモジュールくらい• 追い出したモジュールはCPANにアップロードする

52

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

blessで十分!!!

53

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

54

これがポストモダン

Perl

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

CPANには多くのWeb向けモジュールがある

55

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

ただ

56

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

57

足りないと思うモジュールがいくつかある

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

足りないモジュールその1

58

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

Plack::App::phpMyAdmin

59

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

phpMyAdminスゴイ

• 実用上テーブルビューワは欲しい• P::A::PHPCGIで動かすのもいいけど

• ファントムファイル表示など、値がフィルターできればなおよい

60

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

GunyaSiFではどうしたか

• スクラッチで書いた

• LDAP認証とか妙に凝った• 正社員かどうかによってテーブルごとに閲覧権限を設

定できたり

• キモすぎてCPANに上げられない…

61

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

足りないモジュールその2

62

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

js/css自動コンパイラminifier

63

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

デザイナーにやさしい

• Sprocketsによるアセットパイプラインとか、Gruntとか

• Sass/SCSSくらいは対応したい

• Coffee/JSXにも対応したい

64

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

Sass/SCSS対応

65

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

Text::Sass

• Text::Sassでイケるじゃん、と夢見ていたころが僕にもありました

• Filesys::Notify::Simpleと組み合わせれば自動コンパイルできるはず

66

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

67

イケません!!!

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

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

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

うう…ツラい

69

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

GunyaSiFではどうしたか

• CSSはCompassを採用• Rubyだけど

• 開発時は、CSSへのHTTPアクセス時に動的にコンパイル

• JS MinifyはClosure Compilerを採用• Javaだけど

70

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

前半まとめ

71

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

前半まとめ

• WAF = Web向けCPANモジュールの集合 + グルーコード

• グルーコードはポストモダンPerlで

• 足りてないモジュールもあるよね

72

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

73

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

酒と泪と俺とPerl

74

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

Perlまじめに

さわり始めた感想

75

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

76

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

普通じゃん!

77

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

Perlへの感想• 普通• perlbrew/plenv

• cpanm/Carton

• Plack

• 他言語で便利なものがちゃんとある

78

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

モジュールの管理方法• GunyaSiF開発時はCarton 1.0前

• Carton採用してたが、carton execめんどいのでcpanm化• Carton.lockからcpanfileを出力するスクリプトを書

いた

• cpanfile.snapshotになったから今は不要…なの?

79

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

Perlでハマったところ

80

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

Data::Dumper• 開発中に使うモジュールランキング第1位(俺調べ)

• Rubyでいうところのpp

• んな大事なモジュールが壊れてるわけない

81

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

壊れてました…

82

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

壊れているという惨事

83

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

id:gfxに泣きついた• Data::Dumper が壊れているという惨事• http://d.hatena.ne.jp/gfx/

20130305/1362496416

• Perl 5.13で導入されたisWORDCHAR()がなかった

84

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

P::M::MemoryUsage

• Plack::Middleware::MemoryUsage• packageごとのメモリ使用量

• リクエストを処理する前後の増分

• B::Size2(::Terse)を使ってる

85

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

壊れてました…(SEGVする)

86

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

id:gfxに泣きついた• B::Size2をデバッグしたときのメモ• http://d.hatena.ne.jp/gfx/

20130201/1359701228

• SvMAGIC()の中で落ちてた

87

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

(元)同僚スゴイ人が多くてとても助かる

88

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

なぜこんなに

地雷を踏んだか

89

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

だいたいPerl 5.10

のせい

90

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

なぜPerl 5.10を

選んだか

91

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

バージョンの選び方

• CentOS 6系のsystem Perlのバージョンは5.10.1

• 枯れてるからそれ使おう

92

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

間違い93

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

ライブラリは進化する

• CPANライブラリのバージョンも固定しないんだったら、環境として枯れていない

• むしろ、リスクを増大させてしまった

94

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

バージョン新しくしよう

• 最新のPerlにフォローアップすべし• セキュリティパッチが提供されている

• ハッシュ衝突攻撃のパッチを当てるのも面倒だった

• 便利機能や性能向上などいろんな恩恵もある

95

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

そんなおっちょこちょい

な僕でも

96

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

CPANAuthorになれました

97

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

98

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

CPAN参加への動機• コミュニティに還元したい• コミュニティから受けた恩恵は計り知れない

• 設計上の密結合化の防止

• グルーコードはつなぐモジュールがないと意味がない!

99

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

CPANの感想(1)

• 意外とカンタン

• 敷居低くてカジュアルに参加できる

100

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

CPANの感想(2)

• Minilla普通に便利ですね• その代わり、隠蔽されている部分について知識がない

と、イレギュラーな場合に死ぬ

101

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

CPANの感想(3)• モダンなXSモジュール作成法がよく分からない• typester先生のプレゼンはある

• https://speakerdeck.com/typester/xsnimatuwaruhua

• Module::Build::Pluggable::XSUtilはなんかつらかった

• http://blog.wktk.co.jp/archives/331

102

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

CPANの感想(4)

• Plack::Middleware名前空間のモジュールを上げると、どこかのIRCに通知が出るらしくコワイ

103

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

後半まとめ

• Perlは最新版に近いものを使おう

• CPANへの貢献はカジュアルに!• 機能がかぶろうが、名前空間がちょっとおかしかろう

が、TMTOWTDIの精神で

104

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

まとめ

105

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

まとめ

• 汎用的な処理はCPANモジュールとして公開することを前提に書こう

• グルーコードを書いて世の中に面白いWebサービスをどんどん出していこう

106

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

ご静聴ありがとうございます!

107

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

108

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

ストーリーから浮いてるスライド(未使用)

109

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

フレームワークの苦労

• フレームワークだけ書くのつらい• MobaSiFだって、大百科用フレームワークだって、ア

プリケーションを作りながらフレームワーク書いていた

• アプリ開発者のニーズと乖離する

110

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

C言語でWebApp(1)

• C言語でWebAppの開発に必要なN個のこと• http://blog.wktk.co.jp/ja/entry/2013/09/10/

clang-webapp

111

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

ジョークエントリでは

ないんです

112

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

C言語でWebApp(2)

• 前職で作ったフレームワークはいたるところにC言語が使われていた

• メンテナンス性が最悪だった

113