• Like
  • Save
Play勉強会資料(MTLブログ用)
Upcoming SlideShare
Loading in...5
×
 

Play勉強会資料(MTLブログ用)

on

  • 2,991 views

MTLブログ掲載用

MTLブログ掲載用

Statistics

Views

Total Views
2,991
Views on SlideShare
1,795
Embed Views
1,196

Actions

Likes
4
Downloads
0
Comments
0

3 Embeds 1,196

http://mtl.recruit.co.jp 1194
http://translate.googleusercontent.com 1
http://www.pinterest.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

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

    Play勉強会資料(MTLブログ用) Play勉強会資料(MTLブログ用) Presentation Transcript

    • Media  Technology  Labの紹介 RECRUIT   黒田 樹  
    • Media  Technology  Labs
    • MediaTechnologyLabs(MTL)   はリクルートのR&D部門 リクルートのシードを担う  実証実験機関R&D   カンパニー 事業開発 人材! ! 進学! 準カンパニー! ! 住宅! ! 結婚! ! 自動車! ! ライフスタイルetc.!
    • 最小2人構成で、プランナー&エンジニアーがタッグを組んで、サービスを企画&開発&運用していく。  (スタートアップ)  毎月1回MTL内ビジネスコンテストを実施。  
    • h5p://a5acca.fm
    • h5p://a5acca.fm A5acca  最高!
    • Play2.0+Javaで  サービスを本番稼働させた話   @i2key     ※以後の発表内容は会社は関係なく  私の個人的な見解・思考・思想に基づくものになります。  
    • @i2key  元SIer  Java屋  最近ObjC
    • 皆様  
    • 音楽は好きですか?  
    • 普段どんな曲を  聴いていますか?  
    • あなたのプレイリストは懐メロばかりになっちゃあいませんか?
    • 学生の頃に比べると明らかに、新しい音楽へ出会う機会が減っている。
    • 毎日が忙しく、音楽 に出会う場 (クラブ、フェス、ライ ブハウス、カラオケ 等) にいかなくなった。h?p://jigokuno.img.jugem.jp/20090624_1292358.gif
    • 毎日が忙しく、音楽に出会う番組(ドラマ、音楽番組、CM等)を見なくなった。 h?p://jigokuno.img.jugem.jp/20090922_1475978.gif
    • •  時間がないので音楽を探すのはオンラインば かり。 –  しかし、オンラインは思いのほか能動的に動かない と探せない。(TVやラジオの反対) –  音楽番組を見てたころは、いつの間にか流行の音 楽が耳に入っていたなぁ。
    • 音楽のランキング番組を見てたように、受動的に音楽聴きたいなー。
    • どうせ聴くなら、友達が聴いてる曲を知りたい。  
    • そんな思いを解決してくれます。  そう、この「A5acca」ならね。
    • h?p://www.google.co.jp/imgres?num=10&um=1&hl=ja&biw=1623&bih=832&tbm=isch&tbnid=aaEe9GiNRXBbqM:&imgrefurl=h?p://seiga.nicovideo.jp/seiga/im1343303&docid=pxtVREKFNTjFM&imgurl=h?p://lohas.nicoseiga.jp/thumb/1343303i&w=450&h=600&ei=-­‐WD-­‐T8GwPOfEmQWCn52OBQ&zoom=1&iact=hc&vpx=445&vpy=130&dur=1282&hovh=259&hovw=194&tx=88&ty=102&sig=102960426298510789252&sqi=2&page=1&tbnh=  160&tbnw=119&start=0&ndsp=33&ved=1t:429,r:2,s:0,i:73
    • h?p://livedoor.blogimg.jp/coodoo/imgs/5/a/5ae655d9.jpg
    • h?p://jigokuno.img.jugem.jp/20090119_824857.gif
    • デモンストレーション
    • Play導入の経緯
    • System  Integrator   元SIer  Architect
    • 官公庁系システム
    • 数百億円規模
    • エクセル駆動開発 推進 \エクセル方眼紙バンザーイ/     エクセル方眼紙から  どーんとJavaソースを自動生成して   ばーん
    • 人 海 戦 術
    • 大規模開発脳  
    • モジュールRP1029Logic.javaへのコミットログが多すぎるから、このモジュール作成者の品質に不安がある(キリッ  この開発者の作成したモジュールの横並び確認をしなければ!!  
    • サイクロマチック複雑度は??サイクロマチック複雑度と分岐網羅(C1)のテストケース数は大体近似できるから、それ以下だったら試験不足です。  はい、やりなおしー。  
    • 凝集性がぁ〜。  
    • モジュール間結合度が〜。  
    • バグ密度は??    件/kstepで出してください。  試験密度も添えてね。  
    • え?当然、  カバレッジ100%でしょ?  
    • バグ改修はエクセル(方眼紙)を修正して、そこからソースコードを再生成してくださいネ。  
    • h?p://to-­‐a.ru/6CN9s2/img1
    • 大規模開発のためのパラダイムで  小規模開発の現場に入ってしまったため、  前職と同等のアーキテクチャで  サービス開発をはじめてしまった。  
    • 非機能要件からのアーキテクチャ設計  from  非機能要求グレード(IPA)抜粋 •  可用性   –  継続性(稼働率)、耐障害性、災害対策、回復性  •  性能・拡張性   –  TX処理量、性能目標、リソース拡張性、性能品質保証  •  運用・保守性   –  通常運用(運用時間・バックアップ・運用監視)   –  保守運用、障害時運用、運用環境、サポート体制  •  セキュリティ   –  前提条件・制約条件、セキュリティリスク、アクセス利用 制限(認証、利用制限)、データ暗号化、不正追跡・監視、 ネットワーク、Web対策  
    • 初代Architecture h?ps API  KEY Twi?er facade 認証 APNS contro C2DM エラー ller dao Port 処理 制 SSL   変 御 facade O/R   換 JSON   制 Mapper   JSONP   御 dao RDS XML   Pooling HTML   DIコンテナ Tomcat Apache   JVM Amazon  Linux  (MTL  Amazon  Image) ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装)
    • MTL  Java  Server  Architecture h?ps API  KEY Twi?er facade 認証 APNS contro 非機能 エラー ller 機能要件   dao C2DM Port 処理 制 SSL   変 御 facade 要件   換 O/R   JSON   Mapper 制   JSONP   御 dao RDS XML   Pooling HTML   DIコンテナ Tomcat Apache   非機能要件   JVM Amazon  Linux  (MTL  Amazon  Image) ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装) 非機能要件をカバー
    • MTL  Java  Server  Architecture h?ps API  KEY Twi?er facade 認証 APNS contro 非機能 エラー ller dao C2DM Port 処理 制 SSL   変 御 facade 要件   換 O/R   JSON   Mapper 制   JSONP   御 dao RDS XML   Pooling HTML   DIコンテナ Tomcat Apache   非機能要件   JVM Amazon  Linux  (MTL  Amazon  Image) ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装) 非機能要件をカバー
    • 反省点 •  大規模開発の設計思想を取り入れすぎたことによ り、フットワークの低下が発生。   –  インタフェースドリブンにし過ぎ   •  大規模開発では関係が疎になったモジュー ル設計のほうが、責務の所在が明確化し、 品質が安定するが、開発者が少ない開発 ではオーバーヘッドでしかない。   –  スピード感・イライラ感   •  確認にTomcat起動はキツい・・・   –  前工程での仕様フィックスを前提とした実装   •  テーブル定義の動的な変更に弱い   – Railsのマイグレーションとかうらやましい  
    • 300人で2年かけて作っていた世界     から     2人で2ヶ月で作る世界  
    • 300人で2年間で受託開発  開発モデル   ウォーターフォール(工程毎に品質評価会議)  開発方法論   契約による設計(高凝集性で低結合度)    ロールの過度な分割(業務SE、業務プログラマ、方式エンジニア)    インタフェースドリブンな実装(複数社がモジュール開発・結合)    疎結合による責務の所在の明確化     テスタビリティの向上によるモジュール品質の担保   全社的に統一したフレームワークで品質・生産性の平準化    ゴール感   リリースがゴール  価値観   お客様に納品するためにはバグは許されない。   品質が大事で、   納期も大事で、コストも大事で   要件を全部満たすことも大事   h?p://www.town.kaminokawa.tochigi.jp/f_sangyousinkou/P2_ph_2.jpg
    • 2人で2ヶ月で  自社サービス開発  開発モデル   ウォーターフォールではなく  アジャイルでもない何か    開発方法論   アジャイルのプラクティスもろもろ   要件の変更が多く   仕様フィックスはリリース直前    ゴール感   リリースははじまり  ゴールは、サービスのヒット、マネタイズ    価値観   リリース遅延=機会損失   ユーザに使ってもらってFBを即反映   バグってたら、急いで直してリリース   h?p://image.space.rakuten.co.jp/lg01/83/0000069883/72/imgcd88f518zikbzj.jpeg
    • つまり、自社サービスは  よく変更が入�るし、  よくリリースするし、  速く開発したい  品質は少しぐらい悪くても  すぐ直せればいいよ
    • Javaなんてやってないで、   Railsやろうぜ!   Rubyをキメルと気もちいぜ!  h?p://naglly.com/funny_japanese_t_thirt_13.jpg
    • 2.0 いずれ開発言語をJavaからScalaに移行したい
    • 小規模   フットワーク  大規模  高品質
    • REST  APIサーバとして   Play!2.0を採用  やることは、リクエストを受け 取って、JSONを返すだけ
    • いいか?   リファレンス以上の内容は   出てこないぞ?  h?p://naglly.com/funny_japanese_t_thirt_13.jpg
    • A5acca  Architecture h?ps API  KEY Manager Twi?er 認証 APNS contro Model エラー C2DM ller Port 処理   SSL   変 制 換 御 Manager   JSON       制 Dynamo   Dyn 御 Model DB   amo HTML   AWS  SDK Playframework  2.0 Apache   JVM Amazon  Linux  (MTL  Amazon  Image) ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装)
    • A5acca  Architecture h?ps API  KEY Twi?er ←AOP的な   Manager 認証 APNS contro Model エラー C2DM ller Port 処理 ことがしたい   SSL   変 制 換 御 Manager   JSON       制 Dynamo   Dyn 御 Model DB   amo HTML   AWS  SDK Playframework  2.0 Apache   JVM Amazon  Linux  (MTL  Amazon  Image) ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装)
    • A5acca  Architecture h?ps API  KEY public  class  Global  extends  GlobalSeSngs  {   Manager Twi?er 認証  @Override   APNS contro void  onStart(ApplicaVon  app)  {    public   Model     C2DM エラー ller ogger.info("A?acca  is  ready!!");              L Port 処理            //  Init  DynamoDB.     SSL   変 制            AmazonDynamoDBClientFactory.init();   換 御 Manager   JSON    }       制  @Override   Dynamo   Dyn 御  public  AcVon  oModel nRequest   DB   HTML                                      (Request  request,  Method  acVonMethod)  {amo AWS  SDK                            //リクエスト実行時に処理を織り込める     Playframework  2.0     Apache            return  super.onRequest(request,  acVonMethod);   JVM  }   Amazon  Linux  (MTL  Amazon  Image)  :             } ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装)
    • A5acca  Architecture     //メソッド単位にもインターセプターを設定可能   @With(VerboseAcVon.class)          public  staVc  Result  index()  {  h?ps API  KEY                CommonResult  result  =  new  CommonResult();   Twi?er Manager 認証                result.setStatus("OK");                  return  ok(Json.toJson(result));                     APNS    contro Model    }   C2DM エラー   ller Port 処理   SSL   変 制   換 御 /**   Manager   JSON    *  インターセプト用のAcqon例.       制 Dynamo   Dyn 御  */   Model DB   HTML   public  class  VerboseAcqon  extends  Acqon.Simple  {   amo   AWS  SDK                public  Result  call(H?p.Context  ctx)  throws  Throwable   Playframework  2.0 Apache                                  //  必要に応じて前処理を実装 JVM //  ラップしているAcqonを呼び出し Amazon  Linux  (MTL  Amazon  Image) return  delegate.call(ctx);                  }   ビジネスロジック   ミドルウェア } OS FW FW独自拡張 (機能毎に実装)
    • A5acca  Architecture h?ps API  KEY Manager Twi?er 認証 APNS ←エラーハン   contro Model エラー C2DM ller Port 処理   SSL   変 制 Manager   ドリングしたい 換 御 JSON       制 Dynamo   Dyn 御 Model DB   amo HTML   AWS  SDK Playframework  2.0 Apache   JVM Amazon  Linux  (MTL  Amazon  Image) ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装)
    • A5acca  Architecture public  class  Global  extends  GlobalSeSngs  {            :  h?ps API  KEY  @Override   Manager Twi?er 認証  public  Result  onError(Throwable  paramThrowable)  {   APNS    contro //エラー処理記述//   Model エラー    return  Results.ok(Json.toJson(result));   C2DM ller Port 処理  }     SSL   変 制   換 御 Manager   JSON    @Override       制  public  Result  onHandlerNotFound(String  paramString)  {   Dynamo   Dyn 御   Model  Logger.warn(“404  ERROR");   DB   amo HTML      return  Results.redirect("/");   AWS  SDK  }       Playframework  2.0 Apache    @Override   JVM  public  Result  onBadRequest   Amazon    L  inux  (MTL  Amazon  Image) paramString2)  {                                  (String  paramString1,  String      Logger.warn(”404  ERROR");   ビジネスロジック    ミドルウェア esults.redirect("/");    return  R OS FW FW独自拡張 (機能毎に実装)  }   }
    • A5acca  Architecture h?ps API  KEY Manager Twi?er 認証 APNS contro Model エラー C2DM ller Port 処理   SSL   変 制   ←Object  –  JSON   換 御 Manager JSON       制 Dynamo   Dyn 御 Model DB   amo Mappingしたい HTML   AWS  SDK Playframework  2.0 Apache   JVM Amazon  Linux  (MTL  Amazon  Image) ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装)
    • A5acca  Architecture h?ps API  KEY Manager Twi?er 認証 APNS contro Model エラー C2DM ller Port 処理   SSL   変 換 制 御 return  ok(Json.toJson(result)); Manager   JSON       制 Dynamo   Dyn 御 Model DB   amo HTML   AWS  SDK Playframework  2.0 Apache   JVM Amazon  Linux  (MTL  Amazon  Image) ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装)
    • A5acca  Architecture h?ps API  KEY Manager Twi?er 認証 APNS contro Model エラー C2DM ller Port 処理   SSL   変 制            ↑   換 御 Manager JSON       制 Dynamo   Dyn 御 Model DB   amo HTML   Apache   入力チェックしたい Playframework  2.0 AWS  SDK JVM Amazon  Linux  (MTL  Amazon  Image) ビジネスロジック   ミドルウェア OS FW FW独自拡張 (機能毎に実装)
    • A5acca  Architecture h?ps API  KEY Manager Twi?er 認証 APNS contro Model エラー C2DM ller Port 処理   SSL   変 制 public  staqc  class  Hello  {   換 Manager 御                @Required  public  String  name;     JSON          制      @Required  @Min(1)  @Max(100)  public  Integer  repeat;         Dynamo   Dyn    御      public  String  color;   Model       DB   HTML   }   amo AWS  SDK   public  staqc  Result  sayHello()  {   Playframework  2.0 Apache                  Form<Hello>  form  =  form(Hello.class).bindFromRequest();   JVM                if(form.hasErrors())  {   Amazon    Lreturn  badRequest();                         inux  (MTL  Amazon  Image)                }  else  {   ビジネスロジック                ミドルウェア =  form.get();   FW          Hello  data   OS FW独自拡張 (機能毎に実装)        return  ok(Json.toJson(data));                  }}
    • Play!で   iOS開発が   こんなに便利!!h?p://img5.blogs.yahoo.co.jp/ybi/1/83/95/dreamjapan04/folder/1564969/img_1564969_39575309_0?1201531988 (ステマ)  
    • iPhone  –  Server間  のI/F仕様の  ドキュメントレス化  (ソースが設計書)  
    • @i2key @vulcaniz iOS Playでスタブ   Play   Controller(空)   Controller(実装)   Model(属性) 渡す Model(属性+Validate)   Model DynamoDB(永続化)   もろもろ
    • テストが楽  動かしながら実装できるのは楽  Managerからやって積み上げる感じ  その後コントローラー    Junit準備がいらないからいきなり試験かけて楽      DynamoのNoSQLがらく(SQLかくのだるい)  
    • TIPS  h?p://gigazine.jp/img/2007/09/29/potechi_gomamayo/potechi_gomamayo03.jpg
    • Amazon  EC2  microでPlay!2.0が起動しない。    java  -­‐Xms512M  -­‐Xmx1536M  でPlay!2.0はデフォルト起動される  
    • conf/routesの定義を変更しても反映されない。     つ $  clean  
    • ステージングモードでの  バックグラウンド実行がCTRL  -­‐  Dが必要になっていて、スクリプトで自動化できない。    $  play  start  &      ではなく  $  play  clean  compile  stage  $  target/start  &  
    • 負荷試験でエラーでまくった  
    • Thrown(  akka.pa5ern.AskTimeoutExcepVon:  Timed  out)  
    • h?p://t3.gstaqc.com/images?q=tbn:ANd9GcRanRMXzrPAKMq1JheavSmik2E5pYk3pK69vCisdXBXfiSKaCuKpLWRnd3v
    • 完全にTomcat脳というかJ2EE脳だったので、Play(Ne?y+Akka)の仕組みを理解していなかった。    Hozumiさんの日記  Ne?yの基本 h?p://d.hatena.ne.jp/fatrow/20110208/ne?y    解決策は以下  h?p://www.playframework.org/documentaqon/2.0.1/AkkaCore      
    • play  {          akka  {                  event-­‐handlers  =  ["akka.event.slf4j.Slf4jEventHandler"]                  loglevel  =  WARNING                                    actor  {                              deployment  {                                  /acqons  {   AcVon  Invoker  Actors                                          router  =  round-­‐robin                                          nr-­‐of-­‐instances  =  512                                  }     Booooooooost!!                                /promises  {                                          router  =  round-­‐robin                                          nr-­‐of-­‐instances  =  24                                  }                          }                          retrieveBodyParserTimeout  =  3  second                          acqons-­‐dispatcher  =  {                                  fork-­‐join-­‐executor  {                                          parallelism-­‐factor  =  256.0                                          parallelism-­‐max  =  512                                  }                          }
    • 以上!!