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

  • 2,681 views
Uploaded on

MTLブログ掲載用

MTLブログ掲載用

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,681
On Slideshare
0
From Embeds
0
Number of Embeds
3

Actions

Shares
Downloads
0
Comments
0
Likes
4

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. Media  Technology  Labの紹介 RECRUIT   黒田 樹  
  • 2. Media  Technology  Labs
  • 3. MediaTechnologyLabs(MTL)   はリクルートのR&D部門 リクルートのシードを担う  実証実験機関R&D   カンパニー 事業開発 人材! ! 進学! 準カンパニー! ! 住宅! ! 結婚! ! 自動車! ! ライフスタイルetc.!
  • 4. 最小2人構成で、プランナー&エンジニアーがタッグを組んで、サービスを企画&開発&運用していく。  (スタートアップ)  毎月1回MTL内ビジネスコンテストを実施。  
  • 5. h5p://a5acca.fm
  • 6. h5p://a5acca.fm A5acca  最高!
  • 7. Play2.0+Javaで  サービスを本番稼働させた話   @i2key     ※以後の発表内容は会社は関係なく  私の個人的な見解・思考・思想に基づくものになります。  
  • 8. @i2key  元SIer  Java屋  最近ObjC
  • 9. 皆様  
  • 10. 音楽は好きですか?  
  • 11. 普段どんな曲を  聴いていますか?  
  • 12. あなたのプレイリストは懐メロばかりになっちゃあいませんか?
  • 13. 学生の頃に比べると明らかに、新しい音楽へ出会う機会が減っている。
  • 14. 毎日が忙しく、音楽 に出会う場 (クラブ、フェス、ライ ブハウス、カラオケ 等) にいかなくなった。h?p://jigokuno.img.jugem.jp/20090624_1292358.gif
  • 15. 毎日が忙しく、音楽に出会う番組(ドラマ、音楽番組、CM等)を見なくなった。 h?p://jigokuno.img.jugem.jp/20090922_1475978.gif
  • 16. •  時間がないので音楽を探すのはオンラインば かり。 –  しかし、オンラインは思いのほか能動的に動かない と探せない。(TVやラジオの反対) –  音楽番組を見てたころは、いつの間にか流行の音 楽が耳に入っていたなぁ。
  • 17. 音楽のランキング番組を見てたように、受動的に音楽聴きたいなー。
  • 18. どうせ聴くなら、友達が聴いてる曲を知りたい。  
  • 19. そんな思いを解決してくれます。  そう、この「A5acca」ならね。
  • 20. 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
  • 21. h?p://livedoor.blogimg.jp/coodoo/imgs/5/a/5ae655d9.jpg
  • 22. h?p://jigokuno.img.jugem.jp/20090119_824857.gif
  • 23. デモンストレーション
  • 24. Play導入の経緯
  • 25. System  Integrator   元SIer  Architect
  • 26. 官公庁系システム
  • 27. 数百億円規模
  • 28. エクセル駆動開発 推進 \エクセル方眼紙バンザーイ/     エクセル方眼紙から  どーんとJavaソースを自動生成して   ばーん
  • 29. 人 海 戦 術
  • 30. 大規模開発脳  
  • 31. モジュールRP1029Logic.javaへのコミットログが多すぎるから、このモジュール作成者の品質に不安がある(キリッ  この開発者の作成したモジュールの横並び確認をしなければ!!  
  • 32. サイクロマチック複雑度は??サイクロマチック複雑度と分岐網羅(C1)のテストケース数は大体近似できるから、それ以下だったら試験不足です。  はい、やりなおしー。  
  • 33. 凝集性がぁ〜。  
  • 34. モジュール間結合度が〜。  
  • 35. バグ密度は??    件/kstepで出してください。  試験密度も添えてね。  
  • 36. え?当然、  カバレッジ100%でしょ?  
  • 37. バグ改修はエクセル(方眼紙)を修正して、そこからソースコードを再生成してくださいネ。  
  • 38. h?p://to-­‐a.ru/6CN9s2/img1
  • 39. 大規模開発のためのパラダイムで  小規模開発の現場に入ってしまったため、  前職と同等のアーキテクチャで  サービス開発をはじめてしまった。  
  • 40. 非機能要件からのアーキテクチャ設計  from  非機能要求グレード(IPA)抜粋 •  可用性   –  継続性(稼働率)、耐障害性、災害対策、回復性  •  性能・拡張性   –  TX処理量、性能目標、リソース拡張性、性能品質保証  •  運用・保守性   –  通常運用(運用時間・バックアップ・運用監視)   –  保守運用、障害時運用、運用環境、サポート体制  •  セキュリティ   –  前提条件・制約条件、セキュリティリスク、アクセス利用 制限(認証、利用制限)、データ暗号化、不正追跡・監視、 ネットワーク、Web対策  
  • 41. 初代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独自拡張 (機能毎に実装)
  • 42. 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独自拡張 (機能毎に実装) 非機能要件をカバー
  • 43. 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独自拡張 (機能毎に実装) 非機能要件をカバー
  • 44. 反省点 •  大規模開発の設計思想を取り入れすぎたことによ り、フットワークの低下が発生。   –  インタフェースドリブンにし過ぎ   •  大規模開発では関係が疎になったモジュー ル設計のほうが、責務の所在が明確化し、 品質が安定するが、開発者が少ない開発 ではオーバーヘッドでしかない。   –  スピード感・イライラ感   •  確認にTomcat起動はキツい・・・   –  前工程での仕様フィックスを前提とした実装   •  テーブル定義の動的な変更に弱い   – Railsのマイグレーションとかうらやましい  
  • 45. 300人で2年かけて作っていた世界     から     2人で2ヶ月で作る世界  
  • 46. 300人で2年間で受託開発  開発モデル   ウォーターフォール(工程毎に品質評価会議)  開発方法論   契約による設計(高凝集性で低結合度)    ロールの過度な分割(業務SE、業務プログラマ、方式エンジニア)    インタフェースドリブンな実装(複数社がモジュール開発・結合)    疎結合による責務の所在の明確化     テスタビリティの向上によるモジュール品質の担保   全社的に統一したフレームワークで品質・生産性の平準化    ゴール感   リリースがゴール  価値観   お客様に納品するためにはバグは許されない。   品質が大事で、   納期も大事で、コストも大事で   要件を全部満たすことも大事   h?p://www.town.kaminokawa.tochigi.jp/f_sangyousinkou/P2_ph_2.jpg
  • 47. 2人で2ヶ月で  自社サービス開発  開発モデル   ウォーターフォールではなく  アジャイルでもない何か    開発方法論   アジャイルのプラクティスもろもろ   要件の変更が多く   仕様フィックスはリリース直前    ゴール感   リリースははじまり  ゴールは、サービスのヒット、マネタイズ    価値観   リリース遅延=機会損失   ユーザに使ってもらってFBを即反映   バグってたら、急いで直してリリース   h?p://image.space.rakuten.co.jp/lg01/83/0000069883/72/imgcd88f518zikbzj.jpeg
  • 48. つまり、自社サービスは  よく変更が入�るし、  よくリリースするし、  速く開発したい  品質は少しぐらい悪くても  すぐ直せればいいよ
  • 49. Javaなんてやってないで、   Railsやろうぜ!   Rubyをキメルと気もちいぜ!  h?p://naglly.com/funny_japanese_t_thirt_13.jpg
  • 50. 2.0 いずれ開発言語をJavaからScalaに移行したい
  • 51. 小規模   フットワーク  大規模  高品質
  • 52. REST  APIサーバとして   Play!2.0を採用  やることは、リクエストを受け 取って、JSONを返すだけ
  • 53. いいか?   リファレンス以上の内容は   出てこないぞ?  h?p://naglly.com/funny_japanese_t_thirt_13.jpg
  • 54. 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独自拡張 (機能毎に実装)
  • 55. 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独自拡張 (機能毎に実装)
  • 56. 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独自拡張 (機能毎に実装)
  • 57. 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独自拡張 (機能毎に実装)
  • 58. 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独自拡張 (機能毎に実装)
  • 59. 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独自拡張 (機能毎に実装)  }   }
  • 60. 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独自拡張 (機能毎に実装)
  • 61. 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独自拡張 (機能毎に実装)
  • 62. 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独自拡張 (機能毎に実装)
  • 63. 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));                  }}
  • 64. Play!で   iOS開発が   こんなに便利!!h?p://img5.blogs.yahoo.co.jp/ybi/1/83/95/dreamjapan04/folder/1564969/img_1564969_39575309_0?1201531988 (ステマ)  
  • 65. iPhone  –  Server間  のI/F仕様の  ドキュメントレス化  (ソースが設計書)  
  • 66. @i2key @vulcaniz iOS Playでスタブ   Play   Controller(空)   Controller(実装)   Model(属性) 渡す Model(属性+Validate)   Model DynamoDB(永続化)   もろもろ
  • 67. テストが楽  動かしながら実装できるのは楽  Managerからやって積み上げる感じ  その後コントローラー    Junit準備がいらないからいきなり試験かけて楽      DynamoのNoSQLがらく(SQLかくのだるい)  
  • 68. TIPS  h?p://gigazine.jp/img/2007/09/29/potechi_gomamayo/potechi_gomamayo03.jpg
  • 69. Amazon  EC2  microでPlay!2.0が起動しない。    java  -­‐Xms512M  -­‐Xmx1536M  でPlay!2.0はデフォルト起動される  
  • 70. conf/routesの定義を変更しても反映されない。     つ $  clean  
  • 71. ステージングモードでの  バックグラウンド実行がCTRL  -­‐  Dが必要になっていて、スクリプトで自動化できない。    $  play  start  &      ではなく  $  play  clean  compile  stage  $  target/start  &  
  • 72. 負荷試験でエラーでまくった  
  • 73. Thrown(  akka.pa5ern.AskTimeoutExcepVon:  Timed  out)  
  • 74. h?p://t3.gstaqc.com/images?q=tbn:ANd9GcRanRMXzrPAKMq1JheavSmik2E5pYk3pK69vCisdXBXfiSKaCuKpLWRnd3v
  • 75. 完全に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      
  • 76. 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                                  }                          }
  • 77. 以上!!