Loading…

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

Like this presentation? Why not share!

Like this? Share it with your network

Share

endeworksでのWebAppの作り方

on

  • 3,288 views

 

Statistics

Views

Total Views
3,288
Views on SlideShare
3,271
Embed Views
17

Actions

Likes
2
Downloads
2
Comments
0

3 Embeds 17

http://www.slideshare.net 11
http://s.deeeki.com 5
http://slideshare-download.seesaa.net 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

endeworksでのWebAppの作り方 Presentation 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としてkeyvalue 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. ご静聴ありがとう
    ございました!