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

Weitere ähnliche Inhalte

Andere mochten auch

Andere mochten auch (7)

Developing an Akka Edge4-5
Developing an Akka Edge4-5Developing an Akka Edge4-5
Developing an Akka Edge4-5
 
Akka actorを何故使うのか?
Akka actorを何故使うのか?Akka actorを何故使うのか?
Akka actorを何故使うのか?
 
Developing an Akka Edge6
Developing an Akka Edge6Developing an Akka Edge6
Developing an Akka Edge6
 
Reactive Design Patterns: a talk by Typesafe's Dr. Roland Kuhn
Reactive Design Patterns: a talk by Typesafe's Dr. Roland KuhnReactive Design Patterns: a talk by Typesafe's Dr. Roland Kuhn
Reactive Design Patterns: a talk by Typesafe's Dr. Roland Kuhn
 
Developing an Akka Edge1-3
Developing an Akka Edge1-3Developing an Akka Edge1-3
Developing an Akka Edge1-3
 
Zen of Akka
Zen of AkkaZen of Akka
Zen of Akka
 
Rakuten Technology Conference 2017 A Distributed SQL Database For Data Analy...
Rakuten Technology Conference 2017 A Distributed SQL Database  For Data Analy...Rakuten Technology Conference 2017 A Distributed SQL Database  For Data Analy...
Rakuten Technology Conference 2017 A Distributed SQL Database For Data Analy...
 

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

第4回 インフラ勉強会@福岡 Fluentdハンズオン
第4回 インフラ勉強会@福岡 Fluentdハンズオン第4回 インフラ勉強会@福岡 Fluentdハンズオン
第4回 インフラ勉強会@福岡 Fluentdハンズオン
学 松崎
 

Ähnlich wie PHP開発者がScalaに入門して苦しんだ話 (20)

RESTからGraphQL APIへの移行で学んだこと.pptx
RESTからGraphQL APIへの移行で学んだこと.pptxRESTからGraphQL APIへの移行で学んだこと.pptx
RESTからGraphQL APIへの移行で学んだこと.pptx
 
Laravel で API バージョニングを実装するなら
Laravel で API バージョニングを実装するならLaravel で API バージョニングを実装するなら
Laravel で API バージョニングを実装するなら
 
Responsableを使ったadr実装
Responsableを使ったadr実装Responsableを使ったadr実装
Responsableを使ったadr実装
 
OpenStack環境構築支援について
OpenStack環境構築支援についてOpenStack環境構築支援について
OpenStack環境構築支援について
 
楽天WEB APIワークショップ@東工大
楽天WEB APIワークショップ@東工大楽天WEB APIワークショップ@東工大
楽天WEB APIワークショップ@東工大
 
The new LINE Ads Platform
The new LINE Ads PlatformThe new LINE Ads Platform
The new LINE Ads Platform
 
DeviceConnect向けCordovaプラグインを作ってみた
DeviceConnect向けCordovaプラグインを作ってみたDeviceConnect向けCordovaプラグインを作ってみた
DeviceConnect向けCordovaプラグインを作ってみた
 
Reco choku tech night #09 -reinvent2018報告会-
Reco choku tech night #09 -reinvent2018報告会-Reco choku tech night #09 -reinvent2018報告会-
Reco choku tech night #09 -reinvent2018報告会-
 
Phpでrest apiを作った話
Phpでrest apiを作った話Phpでrest apiを作った話
Phpでrest apiを作った話
 
今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4
 
チームで「きちんと」Laravel を使っていくための取り組み
チームで「きちんと」Laravel を使っていくための取り組みチームで「きちんと」Laravel を使っていくための取り組み
チームで「きちんと」Laravel を使っていくための取り組み
 
楽ちんユーザー認証付Spa
楽ちんユーザー認証付Spa楽ちんユーザー認証付Spa
楽ちんユーザー認証付Spa
 
Jawsug chiba API Gateway
Jawsug chiba API GatewayJawsug chiba API Gateway
Jawsug chiba API Gateway
 
第4回 インフラ勉強会@福岡 Fluentdハンズオン
第4回 インフラ勉強会@福岡 Fluentdハンズオン第4回 インフラ勉強会@福岡 Fluentdハンズオン
第4回 インフラ勉強会@福岡 Fluentdハンズオン
 
フレームワークも使っていないWebアプリをLaravel+PWAでモバイルアプリっぽくしてみちゃう
フレームワークも使っていないWebアプリをLaravel+PWAでモバイルアプリっぽくしてみちゃうフレームワークも使っていないWebアプリをLaravel+PWAでモバイルアプリっぽくしてみちゃう
フレームワークも使っていないWebアプリをLaravel+PWAでモバイルアプリっぽくしてみちゃう
 
Cordovaの特徴と開発手法概要
Cordovaの特徴と開発手法概要Cordovaの特徴と開発手法概要
Cordovaの特徴と開発手法概要
 
SAP Inside Track Tokyo 2019 Data Intelligence の展望とMLプロジェクト事例
SAP Inside Track Tokyo 2019 Data Intelligence の展望とMLプロジェクト事例SAP Inside Track Tokyo 2019 Data Intelligence の展望とMLプロジェクト事例
SAP Inside Track Tokyo 2019 Data Intelligence の展望とMLプロジェクト事例
 
SoftLayer API で資産管理をお手伝い!
SoftLayer API で資産管理をお手伝い!SoftLayer API で資産管理をお手伝い!
SoftLayer API で資産管理をお手伝い!
 
SAP HANAは 単なるインメモリーデータベースじゃなくて (賢い)アプリの開発・実行プラットフォーム
SAP HANAは 単なるインメモリーデータベースじゃなくて (賢い)アプリの開発・実行プラットフォームSAP HANAは 単なるインメモリーデータベースじゃなくて (賢い)アプリの開発・実行プラットフォーム
SAP HANAは 単なるインメモリーデータベースじゃなくて (賢い)アプリの開発・実行プラットフォーム
 
ZappaでDBもパッケージしたサーバーレスAPIを構築してみた
ZappaでDBもパッケージしたサーバーレスAPIを構築してみたZappaでDBもパッケージしたサーバーレスAPIを構築してみた
ZappaでDBもパッケージしたサーバーレスAPIを構築してみた
 

Kürzlich hochgeladen

Kürzlich hochgeladen (12)

Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

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