ScalaMatsuri 2016 二日目 最速レポート【パートA】
ScalaMatsuri 2016 2日目 最速レポート【パートA】
こんにちは!昨日に引き続き今日も ScalaMatsuri 2016 にやってきました。
この記事は2日目レポートのAパートです。一緒にやってきたおおはしりきたけがBパートを書いています!
目次
- 朝会 (アンカンファレンス)
- Apache Kafkaを使ったマイクロサービス基盤 (Kenji Yoshidaさん)
- Scalaz入門 (Kenji Yoshidaさん)
- ScalaとSparkによる日本語テキストマイニング (Eduardo Gonzalez さん)
- IntelliJ IDEA で Scala をマスターする (Alexander Podkhalyuzin さん)
- DDD & Scala パネルディスカッション
- Scalaの研修 & Teaching パネルディスカッション
朝会 (アンカンファレンス)
概要
まず最初に朝会を行いました。 賑やかな感じでアンカンファレンスで行われるセッションを決めていきます!
中には SBT や scalaz の contributor の方や、ScalaTest の author の方、さらにはKotlin エバンジェリストの方(!)もいらしていて、朝一からすごい盛り上がりでした。
Apache Kafkaを使ったマイクロサービス基盤
発表者: Kenji Yoshidaさん
スライド
ピックアップワード
- Apache Kafka
- MQ
レポート
- Apache Kafka とは
- 独自のバイナリープロトコル
- 名前は Franz Kafka に由来する
- 脚註: 「変身」など
- Scala と Java で作られているOSS
- LinkedIn が 2011 年にOSSにした
- LinkedIn Yahoo Twitter 等でも使われている
- 雑に言うと、メッセージキュー(MQ)
- サーバー側がどこまでよみ込んだのか、直接管理しない
- 一定期間 or 量までは読み込みでQ消えず、何回か読み込める
- Topic と Partition
- シーケンシャルにDiskに書いて、シーケンシャルにDiskから読む
- Kafka は Amazon Kinesis と似ています
- 0.8 までは認証のない MQ でした
- Kafka 使いたいけど(最初は)社内ですら公開できなかった
- つくったのは、マイクロサービス基盤
- マイクロサービス基盤の要件
- Resiliency
- At Least Once
- not "exactly once"
- 作り始めた
- 最初は RabbitMQ でやあったが、Kafka に方向転換
- 完成後に Kafka 0.9 が出たが、かなりバージョン差分が広く辛かった
- 無停止アップデート zookeeper はそのままでOK
- Kafka Pros
- 一度読み込んでも消えないから、複数の subscriber がいる場合に強みになる
- 実際の利用
- HTTPの受付・返答をで Kafka を隠蔽している。
- 認証がない(なかった)ので、むき出しで使えない。
- HTTP周りはPlay, Kafkaとの境界レイヤはAkkaで
- At Least Once を死守すること(AkkaのResiliency死守)が山場だった
- reactive-kafka
- 脚註: 具体的な設定値の説明。同氏スライドをご参照ください。
- HTTPの受付・返答をで Kafka を隠蔽している。
- いろいろの罠
- 脚註: 罠へのリンクが貼ってある、同氏スライドをご参照ください。
- つらかった所
- ソースを読みたい人間なのですが、Kafka はつらい。
- try や loan pattern や maybe を理解していない(コミット履歴、pull req から)
- 他にも、初歩的なミスや不明瞭な設計が多く非常につらい。
- Topic や Partition を作り過ぎるとつらい。
- topics * partitions
- 数の設計が重要だとは気づいたが、ベストプラクティスがわからない。
- Counfluent の Blog を読むべき。
- Spark における Databricks に近い。
- ソースを読みたい人間なのですが、Kafka はつらい。
- Full GC で止まる
- dwangoの場合 10 ~ 20KQ / s だと Full GC リスク。
- メモリ 1G で 3秒くらい止まる
- 4G にしたら 12秒くらい止まった
- いきなり 10KQ/s のオーダーになることは考えづらいが、それが必要になった場合はどうするか未確定。
- GC との戦い
- Java7 から GC ログのローテートができる
- チューニングを頑張る。 Full GC を起こさずにマイナーGCのみになるように頑張る(りたい)。
- ConsumerのActor関連が効率が悪そうです。
質疑応答
- Cloud の SaaS の MQ を検討したりもしましたか?
- クラウドはあまり検討していません。
- MQを独自実装してしまうこともある。独自実装は検討しましたか?
- Kafka 自体は(一部辛い部分もあれど)多くの論文などに支えられた高度な実装のため、スクラッチする場合はそれを理解する必要があります。
Scalaz入門
発表者: Kenji Yoshidaさん(+α)
Github Repository
ピックアップワード
- Scalaz
レポート
- いきなり振られましたが、まったく用意していないです。
- 原作者の方よりも Scalaz にコミットしている。
- 関数型とオブジェクト思考のハイブリッドがScala、なかでもScalazライブラリはHaskellを影響を強く受けている。
- 一番の特徴は Haskell で言うところの「型クラス」を使っていこう、というスタイル。
- 型クラスの継承関係を図形化すると、複雑な図になります。
- 脚註: 同氏の Github.IO に図の記載があります。
- 型クラスについて
- 脚註: こちらの Gist を参照ください。
- mixin による拡張だと、インスタンスの生成に関われない(公開APIが隠蔽しているとか)の場合に拡張できない。
- implicit conversion はある種型クラスの特殊系で(他の型への変換を定義した型クラス)あり、これをコンパイラが特別視して処理してくれているにすぎない。
- implicit conversion は、引数にもとの型のインスタンスが必要です。型クラスであれば、その必要はありません。
- Scalaz をなぜ学びたいのですか?
- まず関数型プログラミングを知って、必要に応じて Scalaz の話が出てくるべき。
- まず FP in Scala を読むべきだと思います。型クラスの理解には前提とする知識が他にも必要です。
- もういちど型クラス
- 型クラスは共通の処理をくくりだす、というモチベーション。
質疑応答
- IO モナドが難しい。DB アクセスとかを噛ませるとさらに。
- IO モナドが本質として難しいというよりも、非同期とか失敗とか副作用とか考慮しなければいけないことの複雑さが難しさの原因となっています。
- Scalaz はいつ使うと幸せですか?
- \/ や Foldable (Monoid) がどうでしょうか?ループ処理とものだと思います。
- Monoid は、例えば畳み込みで足される対象のものです。(独習Scalazより)
- ContravariantFunctor で継続モナドの話をしてくれると思いました。
- たしかに、Scalaz の継続は ContravariantFunctor のインスタンスです。しかし、Scalaz の継続は(短時間で説明するには)抽象度が高く複雑です。
ScalaとSparkによる日本語テキストマイニング
発表者: Eduardo Gonzalezさん
スライド
TBD
ピックアップワード
- Apache Spark
- データマイニング
レポート
- Spark の基本的な使い方を説明しようと思います。
- Spark によるテキスト言語処理。その前には事前処理をしなければなりませんので、そちらを紹介します。
- 機械学習の前提となる語彙
- Feature: 一つの項目に対する一つのパラメータ
- 機械学習はほぼ Feature Engineering です。
- パラメータは割り出します。例えばEmailの長さ(length)とか。
- Label: 予測したいターゲット
- 例えば、Emailの例であればSPAMかどうか。
- Document: IDが付いているテキスト
- Model: 学習の結果
- Model をもとに予測をしたりします。
- Corpus: ???
- Feature: 一つの項目に対する一つのパラメータ
- Spark は汎用分散処理基板で、RDDをランタイムに処理することができます。
- Spark は Main 関数の中で用います。
- SparkContext を new します。
- SparcConf で並列とかの設定ができます。
- ソースは text です。RDDです。
- SparkContext で開いたソースは、flatMap とか map とか reduceByKey とかできるわけです。
- 最後に
collect
とかforeach
とか、 アクション と呼ばれるものが実行される際に実際に計算されます。- lazy(遅延評価)です。
- マイニングツールとして
- LDA ……
- Word2Vec …… その言葉がどの意味空間のベクトル
- CountVectorize …… 頻度を割り出す
- HashingTF-IDF …… TFIDFを割り出す (脚註: 頻度/ドキュメント内の頻度)
- 入力のLDAデータは文章のようには見えない……列が頻度、行がそれぞれの文
- 英語のワードセグメンテーションはわりと簡単。
- スペースで区切って、少し事前処理をしなければならない。
- 日本語は闇
- 形態素解析(瀕死タグ付けや発音などから解析)
- MeCab
- C++
- デファクト
- Kuromoji
- Java
- MeCab
- Spark とか Hadoop のうえで MeCab を使うには (JMeCab)
- 全ての環境・ノード毎にインストールが必要になる
- Maven に入っていないのでアンマネージドjarで依存解決する
- ローカルマシン上の実行では気にならないが AWS 上とかで使うならつらいですね
- このように DevOps がかなり煩雑
- Spark を Kuromoji と使う
- DevOps 簡単!
- buiuld.sbt に追加して sbt assembly するだけ
- 形態素解析(瀕死タグ付けや発音などから解析)
- Kuromoji を使ってみよう
- JavaConverter をインポートして書いていきます
- Kuromoji を使って形態素解析をすると、けっこういけてます
- リマインドがリマとインドになったりするので、カスタム辞書を作ろう
Tokenizer.builder().build()
- Words と Index がとれました -> Corpusにしよう
- Corpusにしよう
- ワードの出現頻度を数えよう
val documentWords: RDD[Array[Sring]]
- これを Index と 回数の配列である
RDD[Seq[(Int, Double)]]
を corpusRDD[Int, Vector]
に変えましょう。
- 機械学習させましょう(1)
- LDAモデルを作ること、機械学習ですが、これは一行で終わります。
- ほとんどが事前条件の定義でした
run(corpus)
- これで Topic を見つけられます……さて
- Topic0 です : に ……
- Topic1 の ……
- etc……
- ダメみたいですね
- LDAモデルを作ること、機械学習ですが、これは一行で終わります。
- ストップワードの除去
- じゃあ出現頻度 popular top 50 のワードは無視します。
- 頻出しないワードのみがボキャブラリーになります
- こんどはうまくできました
- LDA Model
- LDA Model は Topic の予想のために使われる。
- Word2Vec
- Google 謹製
- 300次元のベクトルまでがある?(※聞き取れず)
- ある異なる複数の意味空間において、ベクトルの成分が similar であることはままある。
- おじ→おば おとこ→おんな 王→女王
- Word2Vec を使う
- 事前処理不要(!)
- あるいみ空間においてのシノニムを探したりできる。
- あるいみ空間において似てる単語を探すことができる。
- このデータセットにおいて "日本" と "中国" は類似しています。
- また一方のデータセットにおいて "マイクロソフト" と "6月" は類似しています。
- ※ マイクロソフトの四半期の一つが6月だからです。
- Spark 1.4 から Word2VecModel が
- corpus に入っていないワードからなる文章をいくつか用意します
- 文章同士の類似度を算出可能
質疑応答
- Vector Concatnation には数学的証明があり、その上で数学的に正しい手法といえますか?
- 論文に掲載されているのを拝見したことがあります。"ある一定の効果がある"ということは真実です。しかし、数学的に証明されてはいません。また、Word2Vec が生成するベクトルが"よいベクトルか?"は別の(Word2Vec以外の)システムを判定器としてある程度判断可能かと思います。
- Spark を使うにはキャッシュが重要だと思いますか?
- そのとおり、RDD 周りではキャッシュが重要です。今回は省略した箇所もありますが、毎回ロードさせるようなことはしてはいけません。
- MeCab の開発が滞っているように感じますが、なぜですか?
- MeCab も Kuromoji も実データに基いて開発されているので、"より良い辞書データ"さえあれば、もっとよいプロダクトになっていくだろうと思います。
IntelliJ IDEA で Scala をマスターする
発表者: Alexander Podkhalyuzin
ピックアップワード
- キーボードショーカット
- ワークシート
レポート
- (脚註: スライドはなく Intellij IDEA を使ったデモンストレーションです)
- 基本はマウス使わないです。ダイアログ以外全部キーボードでいけるので。
- IntelliJ IDEA の activator を叩いてみましょう
- Enter action or option name -> "hello scala" でいいでしょう。
- Destruction Free Mode を使いましょう。余計な情報を排除して、あなたのコーディングに集中するのです。
- 脚註: エディタ以外のペインが表示されていないもの
- ショートカットが使えれば、この画面でなにも困ることもないということです。
- Implicit を探したいですか?
- じゃあ Shift 二連打から jetbrains の ImplicitCollector.scala を読んでみましょう
- 冗談です。
- Shift 二連打はあまり好きじゃないです。何を検索したいか?をはっきりさせましょう。
- 脚註: Shift 二連打以外のショートカットも覚えましょう。
- Navigation Bar を呼べばそこから新規ファイルをつくったり出来ますよ。(Destruction Free Mode のままで)
- 脚註: 紹介されたショートカット抜粋
- Recent Files => Command-E
- Recent Edited Files => Shift-Command-E
- Invoke => Command-F12 (Consider using Navication Bar)
- Local Changes => Command-9
- プレゼンテーションモードは最強のDistruction Free Mode と言えるでしょう。
- Worksheet は知っていますか?
- light work sheet を呼んでみましょう
- REPLに等しいか、それ以上のものです。
- 物理的なワークシートも作ります
- Navigation Bar から New File で Work Sheet を作れます
- コードの断片とか、保存しておきたいならこれでいいでしょう
- Intention Actions が使えます
.map(_ + 1)
を明示的な関数に変えたり"aaa" + x + "bbb"
を Interpolator String にしたりfor(stat; stat; stat)
をブレーススタイルにしたり
- Second Completion (Smart Completion?) を使う
- Implicit Class まで探してくれる
- Smart Completion を使う
- 戻り型に一致させてくれます
- デバッグ時の Mark Object を使うと、オブジェクトに名前付け(Labeling)できどのブレークポイントで止めても追える。Watch式につけた名前を入力。
- ある得敵のオブジェクトにラベリングしておくことは、かなり複雑なデバッグケースで活躍するでしょう。
サプライズ
- このセッションで1つの新しいことを学んだ人は挙手して下さい。
- 若干名
- 2つのことを学んだ人は?
- 若干名
- 3つのことを学んだ人は?
- そこそこ
- では2つのことを学んだ人、おめでとうございます!あなたたちに景品をさしあげます!
- (脚註: JetBrains のノートだったようです)
DDD & Scala パネルディスカッション
ファシリテーター: かとじゅんさん
ピックアップワード
- CQRS
- Event Sourcing
- Akka Persistence
- Akka Persistence Query
レポート
- CQRS
- Command and Query Responsibility Segregation - Query が参照透過であることは保証しなければならない。
- Domain Model は Commands のみを受け取る。
- Commands を受け付けた Domain は Event を発行し Read Model を更新。
- Read Model は View Model に近いもので、取得したい情報を予めKVSなどにおいておくもの。
- (具体例) Akka Persistence が Repository かつ Aggregation Root かつ Event Publisher
- Event の履歴が膨大になってしまった場合の対応はスナップショットで対応。
- 以降も侃侃諤諤と議論されました。途中から聴くのに熱中してしまい、これ以降のレポートはありません(すみません)
- 後日セッション動画が公開される予定と伺っています。このセッションの動画はぜひ見ていただきたいです!
Scalaの研修 & Teaching パネルディスカッション
ピックアップワード
- 新人研修
レポート
- 2015 年から dwango は Scala で新人研修してます。
- Github.IO でテキスト公開してます。
- はてなではこのテキストを公開しています。
- 前年度の Hiring は、Haskell などの言語経験者を優先した側面があります。まず、関数の予備知識がある対象でデバッグ(脚註: 研修のデバッグ)を行い、今年からはさらに間口を広げる予定です。
- 基礎から体系だてて組み立てるよりも、実践的なユースケースを先に学ばせると効果的だ。
- 自分自身前もって「言語の昨日として何があるか」くらいは学習しておかなければならない。
- 入り口として、プロジェクトの「実践的なタスク」を割り当てます。これはペアプロで行わせます。
- このタスクに必要な知識は、このタスクの完了時についてます。「遅延型学習」といいます。
- 学習ステージが有ります
- ステージ1 Better Java。C#とかと同程度の使い方。
- ステージ2 関数型とは何か。
- ステージ3 純粋関数とは何か。
- 最初は Better Java でいいというのは、学習の entry point としてとてもよい。
まとめ
二日目はパネルディスカッションが多々あり、色々な方々の意見が聞けてとても楽しかったです!
来年もぜひ参加したいと思います。ではまた!