【レポート】Scala福岡2017に参加してきました!#scalafukuoka
はじめに
前年に引き続き、2回目の開催となるScala福岡のイベントレポートになります。7月29日、最高気温35度の土曜日でしたが、とても暑い中でたくさんの人が参加されて盛り上がりました。
イベント概要
Scalaを福岡・九州で盛り上げていきたい、まずはイベントやってみようじゃないか。 ということで始まった、Scala福岡。大盛況に終わった初回に引き続き、第2回目の開催が決定しました。 イベントは2トラックに分かれており、片方はScalaの主要WebアプリケーションフレームワークであるPlay Frameworkのハンズオンと、比較的初学者向けのセッションを予定しています。 もう一方のトラックはScalaバリバリのスピーカーの皆様より実践的なお話をしていただきます。 Scalaやってる、やってみたいと思っている社会人、学生の皆様、是非お待ちしております! また、LTで登壇していただける方も募集中です。参加申し込み時のアンケートにてご連絡ください。
ということで、Scala〜な話しからLTまで取り揃えたイベントになっています!
タイムテーブル
3F セッション
時刻 | タイトル | |
---|---|---|
13:00 | 開場 | |
14:00 - 14:40 | Spark+Mahoutによるレコメンドエンジン開発 | 森正和(株式会社TechJIN) |
14:50 - 15:30 | Direct Manipulationとプログラミング環境をScalaで書いた話 | 花田恒一 (株式会社グルーヴノーツ) |
15:40 - 16:20 | 安全なPlay Frameworkのバージョンアップの仕方 | 粕谷 大輔(株式会社はてな) |
16:30 - 17:10 | Scala製機械学習サーバ「Apache PredictionIO」 | 竹添 直樹(株式会社ビズリーチ) |
17:20 - 18:00 | Scalaにまつわる誤解を解く | 水島宏太(株式会社ドワンゴ) |
18:00 - 18:10 | 閉場 | 7F じゃんけん大会会場へ移動 |
7F ハンズオン + セッション
時刻 | タイトル | |
---|---|---|
13:00 | 開場 | |
14:00 - 16:10 | Play Framework と Scala を使った開発を学べるハンズオン | 内田優一(株式会社ヌーラボ) |
16:30 - 17:10 | Akkaちゃんと遊ぼう! Akka Streams で作るリアルタイムサーバ | 和田祐介(クラスメソッド株式会社) |
17:20 - 18:00 | Backlog が一体いつから Scala を遣っていないと錯覚していた? ~Java から Scala への移行~ | 谷本陽介・松本裕二(株式会社ヌーラボ) |
18:10 - 18:40 | じゃんけん大会 | |
19:00 - 21:00 | 懇親会 & LT | grimrose - paradoxはじめてみました nocono_asami - 5分でわかる(かもしれない)Scala関西Summit 2017 matsumana - Apache Flinkで構築するリアルタイムストリーム処理パイプライン yoshiyoshifujii - Scalaとサーバレス相性いいよ koduki - Javaから使うScala OE_uia - Dotty最新版の話(仮) hirosk - お弁当,おにぎり,お寿司,お刺身 |
イベント会場
今回もnulabさんの福岡オフィスで開催されました。 3Fはセッション会場です。 7Fはハンズオンが主に行われました。普段はフリースペースとなっており、色々なソファやダーツが置かれて非常に過ごしやすそうな空間となっていました。
セッション内容
こちらでは主に 3Fのセッション の模様をお届けします。 Togetterはこちらです。
Spark+Mahoutによるレコメンドエンジン開発
資料
自己紹介
- 株式会社TechJIN
- CTO 統括マネージャ
- パッケージ開発をしている
- ビッグデータ/AIあたりも好き
- b→dashi の開発している
- 福岡でAIのコミュニティを立ち上げた
- Elixerのコミュニティを立ち上げた fukuoka.ex
本編
- Spark+Mahoutでレコメンドエンジン開発
- Scala/Spark/Mahoutで解析すると、マーケティングで使える
- だいぶ前からScala使ってる
- 初めてさわった関数型言語だった。分からないのでHaskelを勉強した。その時は脱落した。。
- 今は書けるようになった
- マーケティングの歴史
- 黎明期はマス広告中心
- マスマーケティング
- 2000年代以降、インターネットやスマホ
- デジタルマーケティング
- Web関連
- 統合マーケティング
- Web、メール、モバイル、ビジネスデータ、Webトラッキング
- SNSなども組み合わせてより精緻なターゲティングが可能になってきた!
- デジタルマーケティング
- 雰囲気と感で行っていた顧客把握からデータ中心での分析が可能になった
- データ中心の代表 レコメンドエンジン = オススメ機能
- レコメンド例
- ミュールを見てる → それに関連した商品を表示する
- 本当にミュールをレコメンドされて2足も買うの?と言われるが
- 好きな人は結構買うので、売上の貢献する
- Amazonは結構前からやってる
- 精度が高い
- 最近は機械学習で自動生成してきている
- 商品属性相関 - 似ている商品
- 顧客属性相関 - 似てる人が買ってる商品
- 売上げランキング
- どうやってレコメンドしている?
- AWSとかクラウドを使う機会は増えてきている
- 自分達も2011年くらいから使ってる
- 商品属性相関の大きな流れ:Webアクセスログを取得 - S3に取り込み - EMRで集計から相関計算をmahout - Auroraに出力 - WebサイトにJSONを変える
- EMRとは(ざっくり)
- 大量のデータを切る - クラスタにばらまく - 加工する - 集める
- 画面ポチポチである程度勝手にやってくれる
- Spark vs Hadoop
- ほぼ同じ機能
- Spark
- オンメモリで少なめのデータを高い頻度で回す
- Hadoop
- データ量重視で分散処理する
- Spark
- Scalaのコードを書くのとほとんど変わらない感じのコードで書ける
- しかし、複数クラスタで一気に処理される
- Scalaで使われる事が優先されている
- 1系と2系は結構メソッドセットが違うので注意
- Scalaのコードを書くのとほとんど変わらない感じのコードで書ける
- Mahout
- レコメンド向き機械学習エンジン
- 相関係数を出したいとかなら向く
- 商品別で商品を集計する①
- Webの行動履歴がインプット
- ユーザーと商品 の情報
- ScalaからSparkを呼び出す
- Webの行動履歴がインプット
- 商品閲覧の計算をする②
- Mahoutに入力する
- 商品1, 商品2, 相関係数 が出力される
- Mahoutに入力する
- レコメンドを表示③
- レコメンド例
- マーケティングに於けるレコメンド以外の領域
- 購入から日後にメール配信するとか
- BI機能
- 言語、DB、DWHなどシーンに応じて様々なテクノロジーを利用している
- イベント告知
- 8末に fukuoka.ex#2 あります!
感想
デジタルマーケティングに於いて代表的なツールであるレコメンドエンジンの仕組みについて非常に分かりやすく解説されていました。 Amazon EMRなどのクラウドの力を借りればある部分ではレコメンドエンジンが作れるかも!と思えました。
Direct Manipulationとプログラミング環境をScalaで書いた話
資料
自己紹介
- @nobkz
- テックパークという子供向けの技術的な事
- 子供向けプログラミング言語を作ってる
- Scala/Shen/Rust/Erlang
- ボードゲーム/デジタルゲーム/ika2(スプラトゥーン2)
- もともと音響屋
- 音響プログラミング言語 Flower など作ったりした
本編
- ジェスチャーを自作した人?
- パーサーコンビネータを使って実装をラクにしようという話し
- Direct Manipulation
- DMである例
- CLI によるファイル操作
- DMである例
- GUI によるファイル操作
- Visual Programing Langage
- Flower
- Viscuit
- 子供向け言語
- 子どもたちはキーボードの操作に慣れていないので敷居が高い
- テキストを使わなくてもプロクラミングできる
- DMである例
- ジェスチャー
- 特徴
- 重要なインタラクション
- ボタンを減らす
- 上手くインタラクションデザインすると使いやすくなる
- 欠点
- デザインが難しい
- 実装が難しい
- デバッグし辛い
- 種類
- タップ、ダブルタップ
- ピンチイン、ピンチアウト
- フリック
- ホールド
- など
- 可能性
- タップとスクロール、ダブルタップとどう判別する?など難しさがある
- 複数の可能性があるので
- タップとスクロール、ダブルタップとどう判別する?など難しさがある
- イベントを見分ける
- パーサコンビネータとして実装する
- パーサコンビネータ
- パーサ同士を組み合わせて新しいパーサを作る技法
- パーサ(Scalaのコードと共に説明なので、資料を参照してください)
- 入力文字列に対してパースして出力データを作成
- パーサは数値の他に文字列を返す
- パーサではエラーがでるかもしれない
- 無駄な文字があった場合など
- パーサのmap
- リストの数値は合計される
- 無駄な文字があった場合はエラー
- パーサのfratMap
- パーサを返す関数がある
- 無駄な文字があった場合はエラー
- パーサーを組み合わせる
- 足し算のパーサ
- ジェスチャーとパーサ
- パサーの入力が座標、パーサを介しての出力がジェスチャになる
- さらに高度なジェスチャー
- up, down, left, right
- history
- 複数の指
- 時間
- ジェスチャーとパーサコンビネータ再考
- MVCのCとにている
- 状態管理は難しい
- 特徴
感想
ジェスチャーの判定を実装する上で、複数のパーサを組み合わせて実装する方法を解説されました。UIを低レイヤーから実装するシーンで使える考え方になると思います。
安全なPlay Frameworkのバージョンアップの仕方
資料
自己紹介とPR
- @daiksy
- スクラムマスター
- マネージメントの仕事が多い
- その視点から見たフレームワークのバージョンUpについて話す
- mackerel (鯖の英語)
- ごまサバ美味しかった
- 初期からnulabさんに使って頂いている
- イカリング2
- 福岡でプロコンゲット!
- Scala Kansai summit 2017 開催します!
本編
- mackerel で利用している Play Framework(以下Play) のバージョンアップの話し
- 最初 Play 2.2.1 -> 2.3.1 までは問題なし
- ライフサイクルが短いのでソーシャルゲームはそんなにバージョンアップする必要性がない
- Playを2.4.xにするのは10年後も当たり前のように動いていないと行けないプロダクトなので
- Play 2.3のWSに入ってるデフォルト認証局情報が古く困る事象があった
- フルスタックなので、WSだけ入れ替えると影響があるかもしれない
- Play 2.3 -> 2.4.x
- コネクションプールがBoneCPからHikariCPになった
- 細かいチューニングをやり直す必要がある
- Slick 2.x -> Slick 3.x
- これが大変だった。
- コネクションプールがBoneCPからHikariCPになった
- Slick 2.x -> 3.x
- 3.xは非同期になる
- mackerel
- 毎週リリース
- 156週連続リリース継続中(長期休みを除く)
- これは継続したい!
- Slickのアップデートどうしよう
- 毎週リリースしながらDBIOを置き換えられる?
- 無理そう‥
- 度々チャレンジするがSlickがボトルネックに‥
- 毎週リリースしながらDBIOを置き換えられる?
- そこに救世主
- 竹添さんのブログ
- blocking-slick
- Slick 3.xでSlick 2.x互換のblockingAPIが使える
- 一旦これでPlay 2.4にして徐々にDBIOを置きかえよう
- PRを出したりして対応して頂けた
- 他にも色々問題があった
- どういう作戦でリリースして行こうか
- 少しずつPlay 2.4 likeなコードに書き換えていった
- しかし、大きなPRをマージする時がきた 2xxコミット/8xファイル …
- どうやってレビューする??
- 歯を食いしばってやった
- ペアレビューなど
- コンパイル言語の安心感ある
- あとはインフラ面への影響
- 5日間ステージング環境でメトリックを見る
- カナリアリリース
- 一部のサーバーだけ2.4にしてみる
- リリースした
- 何かおかしい
- ある処理時々失敗してる
- 復号化で失敗している
- ロールバックした方がいい?
- Play 2.4で暗号化されたらPlay 2.3で復号化出来ない。
- カナリアリリースが裏目に‥
- 全部2.4にするしかない
- Play 2.5リリースに向けてふりかえり(YWT)
- Y
- 厚いフレームワークのマイグレーション大変
- マイグレーションガイド読むだけでは駄目かもしれない
- W
- イグレーションガイド チェックリストや読み合わせ
- コンパイル言語だからこそやれた
- T
- マイグレーションガイド読み合わせ
- マイグレーションガイドを元にチェックリスト
- ステージングでカナリアリリース
- Y
- Play 2.5チャレンジ
- マイグレーションガイドを入念にチェック
- 移行作戦会議や手順を共有した
- Play 2.5移行
- 無事故で成功!
- さらに
- sbtバージョンアップしたらコンパイルが早くなった
- CPU使用率が減った
- 今後の課題
- 重厚なフレームワークへの依存度を下げたい
- ライブラリ単位で気軽にバージョンアップできるようにしたい
- 重厚なフレームワークへの依存度を下げたい
- まとめ
- テスト&CIは安心感ある
- マイグレーションガイド超重要!書いてある
- 大きな更新はステージング環境でのロールバック訓練も必要
- ある程度の知見がいるので、失われないうちにこまめに行うのがよい
- メンバーが変わってなかったので怪しい箇所への嗅覚があった
- tzkezoeさんありがとうございました
感想
重厚なフレームワークの良し悪しはあると思いますが、選定基準としてプロダクトのライフサイクルからバージョンアップが必要になるか、頻繁なバージョンアップが必要な場合は薄いフレームワークにするなども検討したいと思いました。 また、いくら準備しても失敗することはあります。ふりかえりの実施とそれを次に実際のアクションとしてきっちり実行したことで、2.5リリースで無事故リリース出来た素晴らしい事例でした。
Scala製機械学習サーバ「Apache PredictionIO」
登壇資料
自己紹介&PR
- 普段Scala本やOSS開発してる
- Scalaパズル
本編
- Scalaプログラマから見たPredictionIOの話し
-
PredictionIO
- ロゴがカエル
- カエルは天気を予測できると言われている
- 推測するものなのでカエル
- システムから見た機械学習の課題
- スケーラビリティ
- ガバナンス
- 開発・運用効率
- 特徴
- オープンソース
- SparkMLlib/OpenNLPサポート
- 学習データやモデルのストレージも管理
- 簡単に言うと
- AWSやGCPなど機械学習サービスを自前で構築する基盤ソフトウェア
- 細かいチューニング、クラウドロックイン回避、オンプレ活用 がメリット
- CPUバウンドな処理はクラウドだとコスト面で問題になる場合がある
- 歴史
- 2013年設立
- 2016年 Salesforce社に買収され、ASFに寄贈
- Apache Software Foundation
- OSSを支援する非営利団体
- OSSにインフラをていきょう
- 法的訴訟から会社を保障
- ソフトウェアの法的権利を保障
- 最近Reactで問題があり、ASFのプロダクトで扱えない
- インフラが使いにくい、ルールが多い‥
- 利用フロー
- テンプレートがあるのでCloneする(レコメンドとか
- それをカスタマイズしてエンジンとする
- 学習データをストレージに入れる [イベントデータ]
- pio build でコンパイル
- pio train で予測モデルを作る
- 5を別のストレージに入れる [モデルデータ]
- pio deploy でWebサービスが起動する
※ ブログで紹介しています
- ロゴがカエル
-
弊社での取り組み
- 転職サービス ビズリーチ
- マッチングに機械学習を使ってる
- モチベーション
- 機械学習のエンジニアが本業に集中できない
- 属人化
- コミッタ
- 機械学習とScalaのエンジニアがサポートしあいながらやってる
- Pythonサポートしたい
- JPOUG
- PredictionIO Meetup #3
- Scalaプログラマから見たPredictionIO
- なぜScalaで書かれてる?
- Spark使ってるからが大きい
- フラストレーションが溜まる
- 後方互換性を重視してる
- イケてないコードが多い
- 後方互換性重視の絵弊害
- Hadoop/Sparkクラスタは気軽のバージョンUpできない
- Scala的に微妙なコードが多い
- 機械学習界隈の人がSpark
- Scala警察の出番だ!
-
- Procedure Syntax
- バグの温床
-
- Unit is not Unit value
- 実害は無い場合が多い
-
- Auto Tupling
- コンパイルエラーの原因が分からないケースがある
- コンパイル時に意図せずコンパイルが通ってしまうケースがある
-
- Escape by return
- メソッドの戻り値の型推論が効かない
- 場合によっては例外にコンパイルされる
- その他: var/mutableコレクション/while
- Scala警察も全部見れないので‥
- コンパイルオプション
- Lintツール
- である程度自動化できる
- SparkがScalaの隙間産業を生み出している
- Spark MLlib
- Mahout-Spark
- など
- あなたもScala警察としてApacheコミッタになろう!
- Scalaエンジニアは価値が高いよ!
- なぜScalaで書かれてる?
感想
テンプレートを編集してデプロイするだけで、学習してWebAPIまで作成してしまうPredictionIOに興味を持ちました。テンプレートの編集をどうするかに掛かってるとは思いますが、実際に使えるWebAPIまでがコマンドラインで生成される世界になっていた事に気づけたセッションでした。
Scalaにまつわる誤解を解く
登壇資料
自己紹介
- @kmizu
- プログラミング言語も作ってる
- Japan Scala Association 理事
内容
- Scala神話
- 使ったことない人ー 十数人
- 導入するための障壁を下げたい
- 発表を止めて質問しても良いです!
- Scalaって使われてる?
- Twitter, Starbucks... ドワンゴ, はてな, サイバーエージェント...
- IEEEランキング
- Web系で8位
- Scalaは難しい?
- はい、しかし
- 資料と講師が居れば教育可能
- はい、しかし
- Scalaは圏論の知識が必要?
- 殆どのライブラリは圏論に関係していない
- Scalaは関数型プログラミングの知識が必要?
- はい、但し高度な知識は必要ありません
- 不変コレクションライブラリの使い方
- 不変オブジェクトの作り方・活用
- はい、但し高度な知識は必要ありません
- Scalaは記号メソッドが汎用されている(ので読みづらい?)
- 昔はそういったライブラリもあった
- 最近は変わってきている
- ScalaはJVM上の言語。Javaより遅いのでは?
- いいえ。ただし、プログラミングスタイルによります。
- JVMは関数型に最適化されていないので、関数型バリバリに書いた場合は遅くなる場合もある
- いいえ。ただし、プログラミングスタイルによります。
- Scalaのコンパイルは遅い?
- はい、ただし、和らげることはできます
- 金の弾丸
- Core i7クラス
- sbt を立ち上げっぱなしに
- IntelliJ IDEAを利用の場合
- sbt shell を使う
- Scala 2.12.2 に
- 金の弾丸
- はい、ただし、和らげることはできます
- Scalaを使えるメンバーがいないけど採用して大丈夫か?
- 最初にScalaを使えるメンバーが一人はいたほうが良い
- しかし市場に出ていない
- トレーニングサービスを活用してもよい
- 最初にScalaを使えるメンバーが一人はいたほうが良い
- impicitという機能が怖いらしい。どうすればいい?
- 利用する上での規約を定めればよい
- Scalaは後方互換を軽視している?
- いいえ
- マイナーバージョンが変化しなければ後方互換性は維持される
- メジャーバージョンが上がれば後方互換性は維持されない
- いいえ
- Scalaコミュニティは怖い人が多いんでしょ?
- いいえ‥ であるはず
- ガチな人もいっぱいいるけど優しいよ!
- いいえ‥ であるはず
- sbtって難しくない?
- はい。ただ、最初の一歩はむしろ簡単
- 既存プロジェクトのsbtで覚える
- sbt自体もユーザーフレンドリーになってきている
- はい。ただ、最初の一歩はむしろ簡単
- まとめ
- Scalaに関してよくある疑問に答えてみた
- Scalaと使うかどうか、よく考えて決めてください
感想
自分が持っているScalaのイメージと当てはまるものも多くありました。その昔、AndroidをScalaで開発しようとしましたが、コンパイルが遅いとか学習コストの面で諦めた事がありましたが、Scala自体の進化や方針、CPUの進化、Scalaを取り巻く環境の変化、それと用法/容量を守ればScalaは怖くない!って思えそうでした。
7Fのセッション
【Scala福岡2017 レポート】Backlog が一体いつから Scala を遣っていないと錯覚していた? ~Java から Scala への移行~ #scalafukuoka
懇親会
LT大会や抽選会も非常に盛り上ってました。
まとめ
遠方の東京や大阪から参加されている方々もいました。また、全体的に自分はScalaを使った開発は行ってなく理解できるか不安なところもありましたが、それでもかなり楽しめるイベントだったのが本当に良かったです。少しでもScalaに興味があるエンジニアなら楽しめるイベントだと思うので、来年もあるらしいので是非参加しましょう。