Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
関数型Scalaの集い発表資料

何か作ろうと思ったけど無理だったので使ったライブラリ紹介

自己紹介

icon

  • なかやん・ゆーき / ぺんぎん / もみあげ
  • @pocketberserker / id:pocketberserker
  • Microsoft MVP for F# .NET (2015/04/01~ 2016/03/31)
  • そういえば Scala でアプリケーション作ったことない…

今日喋ること

  • 何か作ろうとしてときに使ったライブラリ紹介
    • http4s
    • doobie
    • scalaprops
    • argonaut
    • parboiled2
    • scalajs-react
    • (scalajs-dom)
    • scajajs-ace

本当は最低限作り上げてから臨みたかったけど時間が全然たりませんでしたorz

作ろうとしたもの

Q. Scala といえば?

A. 乙女ゲーム

つまり…?

_人人人人人人人人人人人人人人人人人人人人_
> クイズ式プログラミング養成乙女ゲーム <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

もみあげよ…お前は何を言っているんだ…

仕様?

いわゆるソーシャルゲームのクエスト部分がCodeIQのあれみたいなものになっただけ

  1. クエスト選択して
  2. 使用する言語選択して
  3. コード書いて
    • gist からの import でもよさげ
  4. 送信ボタン押す
    1. 正解したらクエストクリア
    2. 不正解なら席に戻ってやり直し
  • 正解不正解は Wandbox (オンラインコンパイルサービス)にコードを投げつければいいよね、とか

条件

  • DB使う
  • サーバは Scalaz もしくは shapeless に依存するライブラリ縛り
  • クライアントは ScalaJS 縛り

🚮

https://github.com/pocketberserker/my-lord

Scalaz

https://github.com/scalaz/scalaz

  • 関数プログラミングのための Scala ライブラリ
  • 便利な型をいろいろ提供している
  • ScalaJS でも使える(!)
  • (どーでもいい話)私はこのライブラリがなかったらScala触っていなかっただろう

scalaz-stream

https://github.com/scalaz/scalaz-stream

  • ストリーミング IO ライブラリ
  • 流れだよ!reactive で stream なんだよ!(錯乱)
  • iteratee や iteratee スタイルのものを置き替えを目指す
  • reactive-streams と競合してる気がするけどいったいどうなることやら…

ここで宣伝。

http4s

https://github.com/http4s/http4s

  • "最小の慣用的な HTTP のための Scala インターフェース"
  • Haskell の WAI, Ruby の Rack とかと同じようなやつ
  • サーバは blaze, jetty, servlet, tomcat あたりをサポート
  • argonaut, json4s, xml, twirl などもサポート
  • 作っている人たちはたぶん猫派

特徴?

  • 非同期ぜんてーな作り
  • それとなく Scalaz, scalaz-stream ちからが必要

昔に比べて機能は増えたが、oauth2 をまだサポートしてなかったりともう一息?

http4s-blaze-server

blaze というサーバを使って http4s のインターフェースを実装したもの。

  • HTTP/2 をサポート
  • http4sの実装が一番充実している

http4s-blaze-client

  • blaze のクライアント実装

http4s-argonaut

  • argonaut <-> http4sのEntity を相互変換しやすくするためのパッケージ
  • argonaut は後述

argonaut

https://github.com/argonaut-io/argonaut

  • Json ライブラリ
  • scalaz./ がなんとなくわかれば使えるゆるふわライブラリ(?)
  • 今回は Wandbox と通信するために必要だったので使った

(特に Json 使う理由がなければ msgpack4z つかったんじゃないかなぁ)

scalaprops

https://github.com/scalaprops/scalaprops

  • property based testing のためのライブラリ
  • 解説省略
  • エンコーダ、デコーダ (や独自定義しようとしていた Parser) のテストに使用

parboiled2

https://github.com/sirthias/parboiled2

  • マクロベース PEG パーサジェネレータ
  • "parboiled2 is a Scala 2.10.3+ library enabling lightweight and easy-to-use, yet powerful, fast and elegant parsing of arbitrary input text."
  • 様々な設定ファイルを解析するために使おうとしてた(もちろん間に合わなかった)
  • コンパイル時間が Booooooost しないか心配ではある

doobie

https://github.com/tpolecat/doobie

  • "pure functional JDBC layer"
  • ORM ではない
  • scalaz-stream を使って読み込む
  • 読み込むデータによっては HList を使って変換をかけたりもする

なぜ scalaz-stream を使うのか

http://tpolecat.github.io/doobie-0.2.2/04-Selecting.html

  • パフォーマンスの話
  • take くらいなら LIMIT を使えばいいという話もあるが、Process は一般的に使えてパワフルだ

scalajs-react

https://github.com/japgolly/scalajs-react

  • 噂の React を ScalaJS 上で使うためのライブラリ
  • いくつか独自の機能がある
  • Scalaz や Monocle を使った拡張が存在する
  • サンプル豊富

scalajs-ace

https://github.com/scalawarrior/scalajs-ace

  • ScalaJS で Ace Editor 使うための static ラッパー
  • ドキュメントがあまりないのでコードを眺めて気合で使おう!

まとめ

  • 非同期、非同期 IO は当たり前になりつつある(主観)
  • ScalaJS はどうなんだろうなぁ
    • ラッパー作るというのは TypeScript と同じで泥沼になるんじゃないかという予想
    • エコシステム氏〜
    • でも型安全からくる安心感はある
  • Scalaz, shapeless 縛りしててもなんだかんだ何か作れなくはなさそうな世の中であるらしい
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment