• Like

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.

endeworksでのWebAppの作り方

  • 2,126 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,126
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
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

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. ご静聴ありがとう
    ございました!