• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content

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!

endeworksでのWebAppの作り方

on

  • 3,183 views

 

Statistics

Views

Total Views
3,183
Views on SlideShare
3,172
Embed Views
11

Actions

Likes
2
Downloads
2
Comments
0

1 Embed 11

http://www.slideshare.net 11

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の作り方 endeworksでのWebAppの作り方 Presentation Transcript

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