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

Post on 18-Dec-2014

5.388 views 4 download

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

1

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

PerlYAPC::Asia Tokyo 2013

グニャラくん(末永 匡)

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

この僕が

2

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

3

いろいろ壁に

ぶち当たりつつも

4

Perlmongerに近づけたお話

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

CPANAuthorになれました

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