endeworksでのWebAppの作り方

2,495 views
2,426 views

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,495
On SlideShare
0
From Embeds
0
Number of Embeds
22
Actions
Shares
0
Downloads
4
Comments
0
Likes
2
Embeds 0
No embeds

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についてまたデータをとってきます。
  • endeworksでのWebAppの作り方

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

    ×