【レポート】Scala福岡2016に参加してきました!#scalafukuoka
はじめに
こんにちは!おおはしりきたけです!今回は、5月28日(土)に開催された、「Scala福岡2016」に参加してきたので、レポートを書かせていただきます。今回のレポートは、実践トラックのレポートになります。
イベント概要
イベントの概要は以下になります
Scalaを福岡・九州で盛り上げていきたい、まずはイベントやってみようじゃないか。 というわけで福岡でScala勉強会を開催します!関数型、副作用がない、イミュータブルそれ何がおいしいの? 難しいことはおいといて、まずはみんなでScalaに触れてみよう。
イベントは2トラックに分かれており、片方は初学者トラックで各種ハンズオンを行います。 まずはScalaの主要WebアプリケーションフレームワークであるPlay Frameworkハンズオンを。 そしてSkinny Frameworkのハンズオンはなんと作者の方に直接行って頂けます。
Scala福岡2016のconnpassのイベントの説明から引用
開催日程 | 2016年5月28日(土) |
---|---|
開場と開始時間 | 開場:12:00(受付開始) 開始:13:00 |
参加費 | 参加費無料 |
主催 | Scala福岡 |
協賛 | 株式会社ヌーラボ、クラスメソッド株式会社 |
会場 | 株式会社ヌーラボ 福岡新オフィス 〒810-0041 福岡県福岡市中央区大名1丁目8-6 HCC BLD. |
定員 | 120名 |
ハッシュタグ | #scalafukuoka |
タイムテーブル
実践トラック
時間 | タイトル | スピーカー |
---|---|---|
13:00 - 13:40 | サーバーレスScala | 荒井祐輔(クラスメソッド株式会社) |
14:00 - 14:40 | Play Framework 2.5 でつくる Web アプリケーション | 吉澤毅(株式会社ヌーラボ) |
15:00 - 15:40 | エレガントなコードのための関数プログラミング入門 | 花田恒一 nobkz(株式会社グルーヴノーツ) |
16:00 - 16:40 | Option型を使いこなして初心者から中級者へ | 粕谷大輔 Daiksy(株式会社はてな) |
17:00 - 17:30 | LT | - |
17:30 - 18:00 | クロージング | - |
初学者トラック(ハンズオン)
時間 | タイトル | スピーカー |
---|---|---|
13:00 - 13:40 | Play Framework と Scala を使った開発を学べるハンズオン(前編) | 内田優一(株式会社ヌーラボ) |
14:00 - 14:40 | Play Framework と Scala を使った開発を学べるハンズオン(後編) | |
15:00 - 15:40 | Skinny Framework ハンズオン(前編) | 瀬良和弘(スマートニュース株式会社) |
16:00 - 16:40 | Skinny Framework ハンズオン(後編) | |
17:00 - 17:30 | LT | - |
17:30 - 18:00 | クロージング | - |
※LT&クロージングは、初学者トラック、実践トラックで共通です
イベント会場
イベント会場は、Nulabさんの福岡新オフィスで開催されました。2016年5月に移転されたばかりだそうで、執務室も見学させていただいたのですが、非常に働きやすそうなオフィスでした。
写真は2Fのエントランスです。エントランスの入口には、Nulabのキャラクターロゴが!こちらをキャラクターは、GithubのオクトキャットやTwitterの小鳥(初代)をデザインされたあのSimon Oxleyさんらしいです!凄いですね!
7Fには、Barカウンターもあります!懇親会はこちらの会場で行われました。
3F実践トラックの会場です。
4Fの初学者トラックの会場です。こちらはハンズオンの会場です。
ヌーラボさんのオフィスの3Fと4Fは、セミナールームとなっており、椅子はおおよそ96脚、机は24台くらいあり、勉強会等へ貸出可能とのことなので、福岡のIT勉強会を開催したい方には凄く良い会場だと思います。
サーバーレスScala
スピーカーは、クラスメソッド株式会社の荒井祐輔です。
セッション概要は以下
"Scala"と聞いてまず連想するのは、Akka Clusterを用いた大規模サービスや、Play Frameworkを使ったC10KクラスのWebアプリという方も多いのではないでしょうか。 そんなわけで今回は、AWS LambdaとAmazon API Gatewayを使って「気軽に」「明日から」「個人でも」Scalaでアプリを開発する方法についてお話させていただきます!
Scalaを始めるにあたって壁になりがちな"ある部分"をさくっと乗り越えるためのお話をします。
Scala初学者のぶつかる壁
- エコシステムが関数型の語法を用いる
- JSON Reads /Writes
- Iteratee /Enumerator
- 初学者に優しくないSlick3のモナり具合
- JVMアプリについて学ぶ必要がある
- DevOpsはEBやHerokuならある程度ラップされてるけど、あくまである程度なのでJVMへの理解を要求される。
- 公開したいならEC2やVPSのリソースが必要
Scala初学者が本当に思っていること
- 言語を学んだはいいが何をすればいいのかわからない
- 何をしようと思っても難易度が高い
- Railsのような親しみやすさがない
- とりあえず小さなアプリを作ってみたい
- そしてそれをさくっと公開してみたい
AWS Lambda
- Function as a Service
- 実行可能なコードを用意してLambda Functionを作成
- イベントソースを用意しファンクションを実行
AWS Lambdaの特徴
- 実行リクエスト秒数とリクエストに対する課金
- さらにAWSの無期限無料枠がある
API Gateway
- 複数のバックエンドリソースをintegrateしてREST APIとしてHTTPSで公開できる
- バックエンドリソースとしてLambdaなどが利用可能
- AWS Lambdaがバックエンドリソースとして扱えることも大きなポイント
AWS LambdaはNode、Python、Javaで動く。JVMなのでScalaでも動きます。
ここから、Scalaの関数をAWS LambdaとAPI Gatewayを使ってSlackbotを作るLiveコーディングが始まりました!
25分で、Slackのbotが完成しました!
デモが終わった最後に時間があれば話をしたいこと
- Apex
- AWS Lambdaのデプロイ管理ツール
- サーバーレスアーキテクチャの利点
- フルマネージドなら基本的に可用性を考えなくていい
- サーバーレスアーキテクチャでの永続化層
- フルマネージドならDynamoDB
- LambdaVPCを使うならRDSなど
- サーバーレスアーキテクチャの未来
- 大規模アプリを作る妄想をする
- Microservicesの先で、モノリシックの対極
まとめ
- 手軽に稼働するアプリをAWS Lambda/API Gatewayを利用してScalaで作ってみよう
- AWS Lambda/API Gatewayは、Scalaの学習環境としてもおすすめ
- Scalaでのサーバーレスアーキテクチャに興味を持っていただければ嬉しい
荒井のセッション資料や登壇内容は以下のブログで公開されていますので御覧ください。
Scala福岡2016に登壇し「Serverless Scala」についてお話させていただきました! #scalafukuoka
Play Framework 2.5 でつくる Web アプリケーション
スピーカーは、株式会社ヌーラボの吉澤毅さんです。
Scala を開発している Lightbend 社が提供する Web フレームワーク Play がどのような仕組みで動くのか、 Web 開発で基本的に必要になりそうな箇所を開発運用時にハマりそうなポイントとともに紹介したいと思います。
セッション資料
吉澤さんはTyptalkのプロダクトオーナーでTyptalkではPlay Frameworkが利用されている
Play Framewrokの概要
Play + Scala経験歴
- Javaを中心に受託
- Play2.0から本格的にScalaを触る
- だいたい4年位
- サービスを作るときに選定
- 本運用期間は2年
Play + Scalaを選んだ理由
- Java 8は当時なくてScalaに興味
- コレクションAPIが便利
- Optionがはじめから組み込まれていた
- 簡潔なコードにできる
- Java資産が利用できる
- 書いてて楽しかった
ステートレス
- セッション情報はクライアントサイドに文字列を保持
- キーを元にDB/Ehcache/Redisなどに保存する
- HMAC-SHA1による署名
- play.crypto.secret暗号鍵のキー
リバースルーティング
- コンパイルチェックに寄る安心感
- パラメーター、URL変更への自動追随
play framework側で検知してコンパイルエラーを返してくれる
テンプレートエンジン(twirl)
Scala記法で記述でき、View側もコンパイルチェックによる安心感を与えてくれる
HTTPリクエストハンドリング
- パラメーターの型合わせもコンパイルチェック
- content-typeによるハンドリング対応
- application/x-www-form-urlencoded
- application/json
Play付属ライブラリ
- Webアプリを作成する上で最低限のライブラリを保持している
- Play JSON
- Play WS
- HTTP client
- OAuth client
- Play Filters(CSRF,CORS...)
Dependency Injection
- JSR330標準仕様に準拠
- コンストラクタインジェクション推奨
- Play 2.4から導入されている
実装切り替え例
- trait(interface)による開発環境/本番環境の実装切り替えも個度で表現できる
- 開発中はローカル、本番はAWSなど切り替えることが可能
国際化対応(i18n)
- メッセージリソースはconf/messagesファイルにkey=value形式で記述
- ロケールを拡張子に付加して複数言語対応ができる
国際化対応のワンポイント
- 言語の適用はクライアント情報から
- 1.Cookie(PLAY_LANG)
- 2.AcceptLangage(HTTP Header)
- MessagesApi#setLangでCookieに反映ができる
Play Frameworkのオススメ機能
Hot reloading
- コンテナ再起動無しにコード反映
- sbtによる差分コンパイル
- クラスローダー差し替えしてくれる
- 開発モードではデフォルトで有効になっている
- dev/prod/testモード
Evolutions
- SQLでファイルにアップグレード/ダウングレードを記述
- ただし、Scalaでロジックは記述できない
- HTTPリクエスト時に検知
- 開発者用のDBを自動的に統一できる
マイグレーションメリット
- フィーチャーブランチ開発と相性が良い
- ブランチ間の移動がしやすい
- try&errorがしやすい
- ファイル名は連番で管理
- マージするときにコンフリクトを起こさせ、マイグレーション順を固定
マイグレーション本番環境例
- 本番環境では無効にしている
- 手動でオンラインスキーマ変更対応するために分割して実行するケースがあるため
- データの件数、ロックの違いに注意する必要がある
他のマイグレーションツール
Play Evolutionsが肌に合わない、コマンドラインから適用したい、Java(Scala)でマイグレーションしたい。そんな方には、Flywayがおすすめ!
Typesafe config
- Java ライブラリ Scala ラッパー
- HOCON形式(JSON Superset)
- 設定ファイルをincludeできる(上書き
- application.conf -> prod.conf ->beta.conf
ここがいいよPlayまとめ
- Restfulフレームワーク
- スケールアウトしやすい
- 過剰なまでの型安全
- アノテーションもほぼ無く書いてある通りに動く安心感
- 試しながら開発を進めていける
Play Frameworkのハマりどころ
Scala非同期処理
- Futureを使うことで、処理を非同期化することができる
- CPUコア数分同時に処理してくれる
- Java 8に追加されたCompletableFuture的なものを使える
- Futureを使う場合は、import先を変更すること
- Playはデフォルト24個までのリクエストを並列で受け取れるがそれ以上は待ちが発生その為、デフォルトスレッドプール調整が必要
- リリース前にかならずチューニング
- DB最大接続数を確認する
Play スレッドプールまとめ
- 適切にスレッドプールを定義しパフォーマンスチューニング
- DB最大接続数も確認が必要
- スレッドを過信しすぎずSQSなどのメッセージキューも考慮したほうが良い
ORM
- Slick
- Lightbend社によるORM
- Slick3.0から非同期アクセスを推奨
- ScalikeJDBC
- 素直にかけて大きなハマりはない
- 基本的にSQLで記述する開発できる。SQLで開発するのはチューニングしたいから
リバースプロキシ問題
- Nginxなどリバースプロキシを置いてIPアドレスを取得したい
- 信頼するPrivateネットワークを指定することで、手前のIPアドレスを取れる
Assetsパフォーマンス問題
- リクエストごとにスレッド消費
- リリースビルド時にS3にアップロードするスクリプトを自作した
Play情報周り
- Stackoverflowが第二のドキュメント
- 日本語周りはBlog等が古くなりがちだが、有志の方々による本家の翻訳が参考になる。
ここがダメだよPlay Framewrok
コンパイル速度問題
- コンパイルが遅いのは、Scalaお約束
- ViewやRouting数が多くなるとコンパイルが遅くなってくるので、サブプロジェクト等で考慮する。APIサーバーとしての利用検討
MBAとMBPでもコンパイル速度が異なるので、お金で解決するのもあり
互換性問題
- Playバージョン互換性問題がある。開発速度が早いのはメリットだが、バージョンアップの互換性は無い。
- Scalaバージョン互換性問題もある。マイナーバージョン毎にバイナリ互換性がない。結果としてライブラリが対応されない可能性もあるのでライブラリにPRを送ったりforkしたりする必要がある。
sbt-web
- grunt/gulpのようなビルドシステムがあるが利用はしていない。
フロントエンド問題
- JS/CSS修正もパッケージングが必要なので、フロントエンドも含めるとコンパイルに時間がかかる。エンドユーザーには即時に反映が必要なので、差し戻しをすぐに行えるようにしている。またAPIサーバーに特化させるかも検討している。
まとめ
- プロジェクトが大きくなるとコンパイル時間も増加する
- 破棄的アップグレードがある
- Playに依存し過ぎない
全体まとめ
- Scalaのデファクトになっている
- トレンドを取り入れてるので、開発が活発2.6/3.0も開発が進んでいる
- 型に守られながら楽しくWeb開発できる
- 小さいプロジェクトや社内ツールで始めるのがオススメ
- Scalaの機能を覚えていく機会にもなる
- APIサーバーとして使ってみる
エレガントなコードのための関数プログラミング入門
スピーカーは、株式会社グルーヴノーツの花田恒一 さんです。
セッション概要は以下。
Scalaは「スケーラブルな言語」であり、オブジェクト指向を用いて大規模な構造に耐えられるシステムを構築することもできれば、関数プログラミングを用いてより「エレガント」に書くこともできます。本セッションはScalaの「関数プログラミング」に焦点を当てながら、如何にして「エレガント」にコードを書いていくか?ということをテーマにしています。 対象としては、RubyやJavaのような基本的な言語の理解が分かり、なおかつ「関数プログラミング興味あるけれども、ちょっとまだ分からない」という方をターゲットにしています。本セッションにてある程度関数プログラミングを理解して頂ければと思います。 本セッションの流れとしては以下のように設計しています。
- なぜ関数プログラミングか? (5分程度)
- エレガントなコードとは? (5分程度)
- Scalaの「関数プログラミング」基礎実践 (15~20分)
- まとめ(3分程度)
本セッションでは、まず「なぜ関数プログラミング」をするのか?について考えて行きます。そこで関数プログラミングをする理由を一緒考えていければと思います。 次に、「エレガントなコード」についてとは何か?について定義して行き、本セッションの目的について説明します。 そして、Scalaの「関数プログラミング」についてコード例を挙げをそれをリファクタリングしながら説明して行きます。ここで、Scalaの基本的な言語の機能を紹介して行きたいと考えています。そして、最後にまとめます。 みなさんの、コードがより「エレガント」に書くヒントとなればと思います。是非ご参加ください。
セッション資料はこちらです。
はじめに
最初は命令型と関数型のコードを比較しようと思ったが、Scalaの言語紹介のほうが良いのではと思い、関数型言語についてと、関数プログラミングの紹介になりました。
何故関数型プログラミングか?
そもそも関数型とは?
- 関数が第1級
- 副作用がない?
- モナド?
関数型プログラミングは「〜ではない」ということを多く語っている。がよくわからないので歴史に立ち帰っててみる
初期のプログラミングとは?
- 数学的な文脈から生まれた
- そもそもコンピューターがなかった時代
初期のアルゴリズム
- Cambridge English Dictionary
- 順序が決まっている数学的な命令
- カジュアルだが、あいまいである
- アルゴリズムの厳密な定義が必要
- アルゴリズムの定義も自然で書かれていた
- 表現が自由である
チューリングとチャーチからアルゴリズムの2つの理論がでてきた
チューリングマシン
- 無限に長いテープ
- ヘッド
- テープを移動
- テープを読み書き
- 状態を持つ
- 読み込んだ値と状態によって、次の動作を決定する。
コンピューター・アーキテクチャに近く、第二次世界大戦中に発展した。現代のコンピューター設計に影響を与える
チャーチル
- チャーチルは数学の観点からアルゴリズムを考えた
- アルゴリズムは関数のサブクラス
- 関数は入力と出力がある。アルゴリズムも同様
関数の利点
- 計算の順序は問わない
- どの順序を選んだとしても答えは変わらない
- 計算の手続きを考えなくていい
ラムダ計算
- チャーチルが考えた
- 計算可能な関数を表現する言語を提供
- 基本的な算術や再帰などを表現できた
- ただし、スグには影響を与えなかった。
50年台になるまではラムダはコンピューターに取り入れられなかった
Lispの誕生
- IPLの発明
- リストの概念を作った
- Lispの発明
- ラムダ計算に基づく
- ガベージコレクション
イギリスでも70年台ごろに関数型言語がでてきた。SASLの設計
1973年にC言語で書かれたUnixが出てきた。1990年代関数型が老害化される。VB、C++、JavaやAIでも関数型が使われなかった。
2000年台になると新しい関数プログラミング言語
- 2002:F#
- 2003:Scala
重要な点
- 関数型言語はプログラムの表現の1つ
- 関数型言語はラムダ計算が基礎であること
- 関数プログラミングはどんどん拡張されてきた
- 理学でありハッキリしている面がある
関数型のメリット
- 副作用がないことによるもの
- テストが楽になる
- 置き換えに寄って、コードがより簡潔になる
- 関数を組み合わせにより構築ができる
- より抽象化ができる
- 型によって安全になる
ここから本編
エレガントに書くために
- 関数型のメリットは数学のエレガントさに由来する
- Scalaも関数型の力によってよりエレガントに書ける
- for式はループだけの式ではない
- OptionにもflatMapやMapが実装されている
for式とParser
- for式は、モナドの計算をサポートする
- Scalaでは実装しても、特に嬉しくないものもあるまずは読めるようになることが大事
- グラフィックスの合成、イベントの合成、ジェスチャーなどで応用ができた。
関数Scala
- 数学的基礎がある
- Scalaで関数プログラム
他の機能
- Trait
- implisito
- 抽出詞
- マクロ
Scalaでエレガントに書くための関数プログラミング入門
エレガントに書くには
- Scalaはエレガントにかける
- 関数プログラミング
- ラムダ式
- for式
- Hasketやる必要あるのか?そんなことはなくとりあえずScalaをやっておくと良い。Scalawoやっておくと他の言語を学びやすくなるかも
式(Expresison)
- 値を返すもの
- 副作用がなければ、置き換えが可能なもの
- 値を帰さないのは文
- 関数型言語の基本要素は式
- Scalaの式としては、手続き型言語のぶんであったものの殆どが式例えばifもif式式でないものもあるimportなど
- Block式
- val a = while(false)はUnitが返却される
副作用の問題
- 副作用があるとコードが置き換えられない。参照透過性
関数周り
- メソッド定義
- 可変長引数は*をつける
- カリー化することもできる
- Scalaで独特なのは中置の記法1 to 10 は 1.to(10)を同じ
無名関数(ラムダ式)
- 無名関数はapplyメソッドを持つオブジェクト
Place holder
- アンダースコアで書けばラムダ式を簡潔にかける記法
- メソッド値を関数オブジェクトにできる
Option型を使いこなして初心者から中級者へ
スピーカーは、株式会社はてなの粕谷大輔 さんです。
セション概要は以下。
Scalaの初心者から中級者になるポイントは、いくつかあります。Option型を使いこなすことで、関数プログラミングのポイントをおさえてScala中級者への扉を開けてみましょう。
セッション資料です
粕谷さんは、はてなでMackerelの開発を行っている。
大阪でScala Kansai summit 2016が10月8日に開催される。はてなでは8月15日〜9月9日までHatena Summer Internshipがはじまる。インターンは、Scalaで行っており、Scala教科書(基礎)をベースにやっており、githubで公開されている。
Option型
- nullの不便さからの卒業できる
- 値が存在かもしれないという文脈を表現(Some or None)することができる
Option型はScalaを学習する上で大きなポイントである。
- Nullを返すようなメソッドの戻り値をOption(null)でNoneが返却される
- ScalaもMapはOption型で返ってくる。
- undefチェックが型によって強制される。
Option型の値へのアクセス
以下の3つでアクセスできる。
- get
- getOrElse
- match
getはあんまり使わないNoneのものをgetするとNoSuchElementExceptionが出るので、getOrElseをよく使う。計算途中のものは値を取得する
Option型の計算
Optionは「値がない可能性」を文脈に持つ型なので、Option型のまま使ったほうが良い。両方がOption型の場合はflatMapを使って計算を行う。Option型の計算はネストが深くなってツライので、for式を利用する
for式
- ループの制御構文
- Scalaのforはメッチャ高機能
- for式はループ要素に対して、ifで条件を指定できる。また、yieldを使うことでfor式自体が値を返すことができる。
- Scalaではforの入れ子はネストできる。for式はコレクションのメソッドが呼ばれる
- foreach,withFilter(filter),flatMap(map)
- これらのメソッドが実装されているコレクションは、for式で置き換えられる
for式はコンパイル時にコレクションのメソッド呼び出しに変換される。その為特定のクラスを継承している事などが要件になく、特定のメソッドが実装されていればいい。
変換ルールは4種類ある
- mapを定義している方では1このジェネレーターで構成されたfor式を使える
- mapの他にflatMapも定義している方では複数のでジェネレータから構成されるfor式を使える
- foreachを定義している方では、forループを使える(ジェネレーターは1個でも複数で最寄り
- withFilterを定義している方では、for式の中でifで始まるフィルター式を使える
まとめ
- Option型とは、要素数が0または1のコレクションである。よってfor式に置き換える事が可能である。
- mapやflatMapなど相互理解が違和感なく使えるようになるとScalaの理解度が高まっていると思う。for式を使いこなせるとScala中級者!!
ライトニングトーク
ライトニングトーク(LT)では以下のタイトルでお話がありました。
- サルでも分かるScala勉強会@藤田(株式会社ヌーラボ)
- Scalaでbacklogの通知bot作ったで@Abe Asami
- Scalaで関数@ひむら
- Scala VS Java 8@加藤(株式会社キャム)
- 諦めないで!クライアントワークでScala導入ノウハウ@大橋(クラスメソッド株式会社)
- ScalaをdisるLT@きしださん
懇親会
懇親会は、7Fのカフェスペースで行われました。飲み物とピザが提供されました!
まとめ
スタッフも含めると100名を超える参加者がおり、福岡でもScalaは注目度が高いということが分かりました。私自身はScalaをやっているわけではないのですが、今日の登壇者の皆さんのセッションが凄く分かりやすく、Scalaが少しだけ理解できた気がしました。特にOption型、for式という部分については、元々全くわからなかったのですが、クラスメソッドのScalaやっているメンバーと議論ができるようにコップ本を読もうと思います!
最後に足元が悪い中参加して頂いた皆様、セッション、ハンズオンに登壇して頂いた皆様、すばらしい会場を提供して頂いたヌーラボ様ありがとうございました。