Your SlideShare is downloading. ×
endeworksでのWebAppの作り方
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

endeworksでのWebAppの作り方

2,160
views

Published on

Published in: Technology

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,160
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
2
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • YAPC開催の主幹であるJPAの理事や、モダンPerl入門の著者である牧が代表をやっています。毎日僕のむかいでこの格好で鎮座しています。
  • endeworksのWebApp開発ノウハウの最新版の反映といえるpixisのコードを紹介していきます。
  • endeworksならではの裏技、必殺技みたいのは全く繰り出しません。普段あまり他の人がつくったCatalystアプリを見る機会もなさそうなので、あたりまえにやっていることを改めて話すことにも意味があるかなと
    思ってます。比較できないことで不安に感じたりしていた人が、このスライドをみてああ、俺は標準サイズなんだなと安心してくれれば幸いです。
  • コードの話をきくことはおおいけどそのまわりをとりまく環境については、あたりまえすぎてあらためて紹介されないので知りたい、という話をいただいたのでちょっと時間をつかって紹介したいと思います。
  • 各エンジニア、まあ二人ですがの端末でそれぞれ開発してます
  • まあこれぐらい当たり前のことを話していきます
  • バージョン管理も最近gitに移行して、二人でもうsubversionには戻りたくない、という話をしている。カピなんたらみたいのは使ってないです
  • mod_perl, lightyという変遷があって今はこれでおちついています
  • qmailで有名なdjbのソフトウェアでqmailと同様にdaemontoolsも癖があってとっつきにくいが、慣れるとなかなかわるくないです。
  • ある決まったディレクトリ、この場合は、/etc/servicesに存在するディクトリがひとつのサービス/デーモン
  • 弊社での作り方のポリシーというかコード規約というかの中で特徴的な部分と思われるところを挙げます。MooseもCatalystもということで弊社ではCatalyst 5.8はプロダクトユースでがんがん使っています。
  • APIモジュールというのはアプリケーションロジックをふくModelといったあつかい
  • 弊社で使うkey value storageはmemcachedです。pkの配列をとってきたら各pkについてまたデータをとってきます。
  • Transcript

    • 1. endeworksでのWebAppの 作り方 株式会社endeworks 船木大郎
    • 2. ENgineer DEsign WORKS システム開発・コンサルティング Webサイト作成・グラフィックデザイン
    • 3. 弊社代表
    • 4. エンジニア募集 • ブラウザゲームの制作 • 各種システム開発 お手伝いいただけるPerlエンジニア募集! モダンPerl先生に直接指導してもらえます 興味ある方いましたら、 taro@endeworks.jpまで
    • 5. 自己紹介 名前: 船木大郎 ハンドル: 33rpm PAUSE ID: TAWAN twitter: http://twitter.com/33rpm
    • 6. アジェンダ • WebAppを作る工程 • 開発のポリシー/コード規約 • pixisを紹介 • pixisの使い方
    • 7. あらかじめ言っておきたいこと
    • 8. 特別なことは なにもやっていません
    • 9. コードの話の前に
    • 10. WebAppを作る工程 • 開発 • テスト • デプロイ • 設置
    • 11. 開発環境 開発サーバと いったものは用意していない
    • 12. テスト t/*以下のテストコードを書いてテスト Test::FITesque が最近の流行り
    • 13. デプロイ gitのマスターリポジトリから git pull するだけ デプロイツールといったものは 使用していない
    • 14. 設置 Apache+FCGI
    • 15. FCGI • daemontoolsでプロセス管理 – プロセス監視機能があるのでプロセスがおち たまま気付かずにサービス停止ということが ない – 管理コマンドによる起動/停止/再起動が簡単
    • 16. たとえば • WebAppが依存するサービスが複数あって それを同時に再起動したい場合 – FCGIプロセス & memcached といった場合 svc –t /etc/services/*
    • 17. コードの話
    • 18. WebAppの作り方 • Catalystを使用 • Mooseを使用 • APIモジュール • キャッシングの仕方 • Registryモジュール
    • 19. Model CatalystのModelは使用しない
    • 20. なぜModelを使用しないのか • CatalystのModelは当たり前だけどCatalyst 依存 • ModelはWebという枠組みの外、たとえば コマンドラインやワーカーからも呼び出 したいことが多い • Catalyst::Model::DBIC::Schemaのような ORMをControllerからそのまま呼び出すこ とがない
    • 21. ではどうするか? Modelに相当するものは MyApp::API::* というネームスペースで作成
    • 22. APIモジュールでは何を行うか • 中身はORMにアプリケーションロジック を加えて抽象化したモジュール • キャッシングは全てここで管理する
    • 23. キャッシングのポリシー • ORMレベルでは行わない • 人間が明示的に保存/削除を行う。
    • 24. キャッシングの詳細 • テーブルのpkをkey、そのpkの行の全デー タをvalueとしてkey value storageに キャッシングをおこなう • 検索結果などの複数行のデータをキャッ シュしたい場合は全データを保存するの ではなくpkの配列を保存する
    • 25. DIコンテナは? アプリケーション全体で共有される インスタンスはRegistryというモジュールに 格納
    • 26. Registryモジュール メモリ上に key value storeするだけの singletonモジュール
    • 27. その他 • Result定義を基にテーブルを作成する • Formの作成はHTML::FormFuを使用
    • 28. Result定義を基にDB作成 SQLからではなく Resultモジュールの定義から テーブルの作成や初期データ作成を行う
    • 29. HTML::FormFu • 今は使用しているけどいろいろ不満もあ る • all-in-one過ぎて生成されるhtmlに融通が 効かない • Validatorはとてもよく出来ているのでレン ダリングはさせないでValidatorだけ使うと いうのが最近の流行り
    • 30. 具体的な実装であるpixis http://github.com/lestrrat/pixis/tree/master GitHubにて公開中 JPAサイトで利用されるほか endeworksのプロダクトでも使用している
    • 31. pixisとは Webサービスや SNSでありがちなアカウント管理や メッセージング機能を Catalystに加えたフレームワーク
    • 32. Pixisの動作環境 • Catalyst 5.8依存 • あとはMakefile.PLを見て
    • 33. Pixis::API::* Member, Messageといった Modelを抽象化して アプリケーションロジックを くわえたモジュール群が用意されています
    • 34. APIモジュールの中身 • 共通で呼び出されているRoleが見つかる with 'Pixis::API::Base::DBIC';
    • 35. Pixis::API::Base::DBIC • DBとキャッシュの橋渡しをするユーティ リティメソッドを集めたRoleクラス • MooseX::WithCacheを利用
    • 36. MooseX::WithCache • キャッシングのbackendを指定することで cache_get, cache_setといったメソッドが 利用可能となるRoleクラス use MooseX::WithCache; with_cache 'cache' => ( backend => 'Cache::Memcached', );
    • 37. P::A::B::DBICのメソッド • find() • update() • delete() • search()
    • 38. search() my @rows = $rs->search($where, $attrs); my @keys = $multi ? map { my $row = $_; [ map { $row->$_ } @$pk ] } @rows : map { $_->$pk } @rows ; return $self->load_multi(@keys); }
    • 39. Pixis::Registry • getとsetを持っているだけのコンテナーク ラス • Singletonクラスなので、どんなコンテキ ストからPixis::Registry->getと呼び出して も同じインスタンスが得られる • $c->model('foo')のようなもの
    • 40. Pixis::Registryの使い方 • 配列の最後の値をvalue、それまでの値を keyとして格納する Pixis::Registry->set( schema => master => $schema ); my $schema = Pixis::Registry ->get( schema => 'master' );
    • 41. インスタンスの初期化 • 各プラグインの中でRegistryにインスタン スをset していく • デフォルトでCoreプラグインは呼ばれる のでそれが参考になる • Pixis::Plugin::Coreモジュール内のbefore registerに渡された関数の中で初期化され ている
    • 42. pixisのプラグイン • ある機能が必要とするAPI, Controller, templateをまとめてloadする仕組み • 今はほとんどCoreプラグインとして書か れている
    • 43. その他機能 • Widget機能 • I18N機能
    • 44. Widget機能 • Widget TemplateとWidget Libararyを追加 することでTemplate内から下記のような 呼び出しが可能 <head> [% run_widget('Head') %] </head>
    • 45. I18N機能 • I18N/[lang].po内で変換マップを記述して おくことでTemplate内でこのような記述 が可能となる <h2>[% loc("Basic Settings") %]</h2>
    • 46. Pixisの使い方 現在公開されているPixisを使って 簡単にサービスを起動することができる
    • 47. pixisをcheckout $ git clone git@github.com:lestrrat/pixis.git $ cd pixis $ git branch roller $ git checkout roller $ git pull origin roller
    • 48. アプリケーション作成 • Catalystのヘルパースクリプトがとりあえ ずそのまま使える $ catalyst.pl MyApp
    • 49. pixisを読みこむ • MyApp.pmを書き変える package MyApp; use Pixis::Web; use namespace::clean -except => qw(meta); __PACKAGE__->config( name => 'MyApp' ); __PACKAGE__->setup();
    • 50. MyAppを起動 • MyApp → pixisの順でライブラリを読みこ むようにして起動する $ perl –Ilib –I[pixis_core_path]/lib script/myapp_server.pl -d
    • 51. MyApp特有の実装を行う • API, Controller, templateはMyAppに存在し なければpixisで対応するファイルをloadす る • MyAppにファイルが存在していればそっ ちが優先的にloadする
    • 52. DBのSetup script/pixis_setupdb.pl というスクリプトを用意 中身は Pixis::CLI::SetupDB を呼び出しているだけ
    • 53. pixis_setupdb.plの使い方 script/pixis_setupdb.pl [--drop] --dsn dsn --username username --password password
    • 54. Pixisの今後 • 携帯対応 • 機能がCore Pluginに集まってるので分離 する? • ヘルパースクリプト追加?
    • 55. ご静聴ありがとう ございました!