Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

PHP開発者がScalaに入門して苦しんだ話

431 views

Published on

PHP開発者がScalaに入門して苦しんだ話

Published in: Technology
  • Be the first to comment

PHP開発者がScalaに入門して苦しんだ話

  1. 1. PHP開発者が Scalaに入門して苦しんだ話 ナイル株式会社 西村一馬
  2. 2. 自己紹介 名前: 西村一馬 所属: ナイル株式会社 開発室 現在はApplivAdの開発リーダー 去年中旬にApplivAdにチーム異動してプロジェクトを引き継いだ ApplivAd以前はずっとPHPでの開発に従事 環境構築にRubyやPythonを使うことはあったが、Java経験は無し
  3. 3. ApplivAdの紹介 自社メディア Applivに広告を出稿するシステム 主機能: 広告管理、配信&トラッキング処理、配信最適化、成果集計 Appliv (Webブラウザ版) Appliv (アプリ版) 広告リクエスト トラッキングシグナル 広告JSON返却 広告JSON返却 広告リクエスト トラッキングシグナル
  4. 4. ApplivAdの紹介 実装言語: Scala (Play Framework + slick + etc....) 社内のScalaプロダクトの中では一番大規模(だと思っている) Appliv (Webブラウザ版) Appliv (アプリ版) 広告リクエスト トラッキングシグナル 広告JSON返却 広告JSON返却 広告リクエスト トラッキングシグナル
  5. 5. ずっとPHPオンリーだった自分にとって Scalaは難易度の高い言語
  6. 6. 発表タイトル「苦しんだ」ですが、 現在進行形で苦しんでいます(汗)
  7. 7. 自分と同じようにLL言語の経験しかない人が Scalaを始める時のヒントを紹介 ※厳密な説明ではないです。最初はこう捉えておくとよいと思う、ぐらいにお聞きいただければ と
  8. 8. 目次 ▷ はじめに 新しい言語の勉強、どう進める? ▷ 実行環境 簡単な実行環境 デバッグ方法 ▷ 知っておこう言語仕様 関数リテラル map Future Implicit parameter ▷ まとめ
  9. 9. はじめに ▷ 新しい言語の勉強、どう進める?
  10. 10. はじめに ▷ 新しい言語の勉強、どう進める? 自分の場合 さらっと基本構文を確認 動くサンプルに触れながら大枠を掴む 細かいところはOJT
  11. 11. はじめに ▷ 新しい言語の勉強、どう進める? 自分の場合 さらっと基本構文を確認 動くサンプルに触れながら大枠を掴む 細かいところはOJT それだけでは厳しかった…。
  12. 12. はじめに ▷ Play Frameworkアプリケーションの動くサンプル プロダクト(ApplivAd)のソースコード BizReachが公開しているハンズオン (https://github.com/bizreach/play2-hands-on) etc...
  13. 13. はじめに ▷ Play Frameworkアプリケーションの動くサンプル プロダクト(ApplivAd)のソースコード BizReachが公開しているハンズオン (https://github.com/bizreach/play2-hands-on) etc… ▷ あとになって感じたことだが、実はScala初心者にとってはPlay Frameworkは結構ハードル高い要素が散らばっている
  14. 14. はじめに ▷ 実際にBizReachのPlay2ハンズオンのサンプルコードをみてみよう (https://github.com/bizreach/play2-hands-on/blob/master/play2.4- slick3.0/play2-hands-on/app/controllers/UserController.scala)
  15. 15. UserControllerのlistアクション
  16. 16. UserControllerのcreateアクション
  17. 17. はじめに ▷ いくつもの謎 "Action.async { ... }" のあたりの構文どうなっている? "implicit rs" is 何? rsが使われているように見えないんだけど… "implicit rs => " が矢印で終わっているけどどうなってる "map"って何ですか?
  18. 18. というわけでこれから基礎知識紹介
  19. 19. 実行環境
  20. 20. 簡単な実行環境 ▷ JavaとScalaをインストールしましょう(省略) ▷ 簡単なプログラムを走らせる方法 REPL(対話式の実行環境) スクリプトファイルを書いて実行
  21. 21. 簡単な実行環境 ▷ REPL コンソール上で"scala"を実行 対話モードになってscalaコードを実行可能になる
  22. 22. 簡単な実行環境 ▷ スクリプト実行(個人的にはREPLよりもこっちの方が好き) Scalaのスクリプトファイルを記述 "scala scriptfile.scala"で実行
  23. 23. デバッグ ▷ println phpのvar_dumpほど高機能なものはない とりあえずはこれで十分
  24. 24. 知っておこう言語仕様
  25. 25. 関数リテラル ▷ 普通の関数定義 ▷ 関数リテラル def 関数名(引数:型, …) : 戻り型 = 内容 def 関数名(引数:型, …) = 内容 (引数:型, …) => 内容 : 戻り型 (引数:型, …) => 内容
  26. 26. 関数リテラル ▷ サンプルコード
  27. 27. map ▷ List等のコレクションクラスや、Option、そして次に紹介するFuture などは、何らかのクラスを包み込むクラスである ▷ これらのクラスにはmapというメソッドが実装されている mapは引数に関数f を取り、包み込んだ中身に f を適用する List[Int], List[String], List[Hoge], Option[Int], Option[String], Option[Hoge], Future[Int], Future[String], Future[Hoge], etc...
  28. 28. map ▷ 例: List(1,3,5,7)に対して f(x) = x + 10 という関数を適用する ▷ 例: Some(5)に対して f(x) = x + 10
  29. 29. Future ▷ “いつか返ってくる値”を表現する ▷ slick(DBライブラリ)でレコード取得した結果はFutureに包まれて返っ てくる ▷ Futureが返り値になっているメソッドを呼び出した際には、Futureの 結果を待たずに次の処理が実行される ▷ 結果を使った処理を行う際には、非同期処理の実装が必要
  30. 30. Future サンプルコード 上記のようなDBからItemレコードを取得するfindByIdメソッドを想定する (仮に以下のようなダミー実装をしておく。)
  31. 31. Future このとき、次のように書いてしまうと期待した結果を得られない 問題点 ・resultの結果が返ってくる前にprintlnが実行されてしまうという点 ・そもそもprintlnの対象がItemインスタンスではなくFutureインスタンス
  32. 32. Future どうすればよいか => map を使う 上記のプログラムの結果: “Item(2,hoge2)”
  33. 33. ここで一つ謝らなければならないことが
  34. 34. 実は前スライドのプログラムは そのままでは動作しません
  35. 35. その理由はimplicit parameterにあり
  36. 36. implicit parameter ▷ 暗黙の変数 ▷ 関数呼び出し時の引数を省略できる ▷ 実はFutureのmapは以下のような実装になっている ( https://github.com/scala/scala/blob/2.12.x/src/library/scala/concurrent/Future.scala#L287 ) ▷ "implicit executor: ExecutionContext"という引数が存在 ▷ Futureのプログラムを動かすためには "import scala.concurrent.ExecutionContext.Implicits.global" によりmapにexecutorを渡せるようにする必要あり
  37. 37. というわけで 改めてFuture+mapのサンプルコード (implicit parameter対応Ver.)
  38. 38. 明示的に指定していないが、 implicitなExecutionContextが 渡されている
  39. 39. ここまで紹介した知識を基に 改めてBizReachハンズオンの サンプルコードをみてみよう
  40. 40. UserControllerのcreateアクション
  41. 41. 結構読めるようになった…?
  42. 42. 以上
  43. 43. ありがとうございました

×