第1回 Scala座

9/4 に、第1回 Scala座に行ってきました。

資料などはこちらUstreamこちら

  • 開会の挨拶
    • Scala
      • 全国レベルのScalaの勉強会!
      • 大きなイベントは関東が多い
        • 悔しい! → 名古屋で開催!
  • これまでのScala、これからのScala
    • これまで編
      • Scalaって
      • Less typing を目指した言語仕様
        • 型推論とか
        • メソッド名短め
      • 型推論
        • ネストした型パラメータもちゃんと推論してくれる
        • 無名関数の型も引数含めて推論してくれる
      • ファーストクラス関数とクロージャ
      • パターンマッチ
        • switch 文を超強力で柔軟にしたもの
        • オプション型便利
          • List の headOption, reduceLeftOption とか
            • List が空だと None を返す
      • trait による Mix-in
        • 実装を持てるインタフェース的な
      • Read-Eval-Print Loop (REPL)
        • 対話型評価環境
        • テスト書く → REPLで確認 → コードに書く → テストする → (黄金の回転!)
        • Scala は公式 LL!
      • Scala Way
        • 関数型的にも、手続き型的にも書ける
          • val と var
          • immutable と mutable (コレクションライブラリ)
          • 高階関数と for/while
          • パターンマッチと if/else
          • Option と null
        • 手続き型風から関数型風へ
          • 「すごく・・・ださいです・・・。」→「すごく・・・短いです・・・。」
          • 高階関数を使う
          • ケースクラスの導入
          • Option の導入
            • パターンマッチ, getOrElse
          • 高階関数作る → 制御構文的に使える
        • #librahack も簡単
          • タイーホされるので(ry
      • 事例
        • みんな大好きついったーのバックエンドも一部 Scala で動いてます
        • 他にも沢山
    • これから編
      • 2.8 について
        • 7/15 正式リリース
        • 名前付き/デフォルトパラメータ
          • caseクラスの copy (2.8から) とかで便利に使える
        • コレクションライブラリ再設計
          • 殆どのAPIがtraitに
          • Mapなどが元の型を保持するようになった
            • Map を map すると Map になるようになった
              • 2.7 までは ArrayBuffer が返ってた
          • 便利なAPIが追加
            • collect
              • 部分関数を受け取って、filter と map をまとめてやる
            • scanLeft
              • foldLeftの途中も返す版
                • (これでフィボナッチも簡単)
scala> val fib:Stream[Int] = Stream.cons(0, fib.scanLeft(1)(_+_))
fib: Stream[Int] = Stream(0, ?)

scala> fib take 20 foreach (x => printf("%d ", x))
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
        • package object
          • package にメソッドや変数を定義できる
          • package 毎に Predef を定義できる
            • implicit conversion との組み合わせが便利
        • @specialize
          • プリミティブ型に対する boxing/unboxing を回避
            • プリミティブ用にメソッドをオーバーロード
            • 高階関数使うときとか
        • 限定継続サポート
        • etc...
      • 2.8 以降の話
        • 2.8.1
          • 9 〜 10月
          • Bugfix
        • 2.9
          • 12 〜 1月
          • parallel collection
            • 並列化コレクション
  • Scalaでプレゼンテーションの試み
    • Scala で自作プレゼンテーションソフト
      • ドキュメントも Scala で書く
        • DSL を提供
        • Ant でビルド
        • ドキュメントにプログラム(GUI付き)を貼り付けれる
  • ScalaDaysに行ってみて
    • Scala Days 2010
    • 発表
      • PEGEX について
        • kmizu さん
        • パターンマッチライブラリPEGEXについて
        • School Days ネタ通じず
        • 英語の聞き取り能力大事
          • 話す方は身振り手振りでなんとかなる
      • A Case Study in DSL Development
        • Scala の機能を活かしてDSLを作った
        • Python によるDSLと比較
        • かなりトリッキーなDSL
      • Automated Refactoring for Scala
      • Lightweight Language Processing in Kiama and Scala
        • 言語処理ライブラリの話
      • Lightweight language support for type-based, concurrent event processing
        • 型情報を使ってScalaのActorライブラリを最適化
          • コードサイズは殆ど同じ
          • 劇的に性能改善
      • Named and Default Arguments in Scala
        • 名前付き引数とデフォルト引数についての話
        • 継承やジェネリクスが絡むと複雑
        • 型チェックは呼び出し側で行われる
      • Automatic refactoring for Scala programs
      • An Experiment with Automatic Resource Management
      • Type-safe SQL embedded in Scala
      • Scala at LinkedIn
      • Migration a Struts/Java vE-Mail Application to Lift/Scala
        • Struts のコードを Scala Lift でどうするか
        • 例外処理をどうするか
      • The Scala IDE for Eclipse
      • sbt
        • Scala用のビルドツールsbtの設計・実装の話
        • 設定ファイルをScalaで書ける
        • immutable か基本
        • DSL
      • Processing with Spde
        • Processing の Scala 版である、Spde の話
        • 無名関数などを活用して、Processing よりも簡潔にコードを書ける
      • Sneaking Scala Into Your Organization
        • 自分の会社でScalaを使うには
        • Scalaの学習曲線の急さをどう緩和するか
        • どの部分でScalaをまず採用するか
        • Web Testing の DSL
      • The Future of Scala
        • グループ毎に Scala の未来について議論する
        • 都合により参加できず。
    • Scala Days 延長戦
  • ScalaでAndroidアプリ開発
    • Androidアプリが動くまで
      • ソース → .class ファイル → .dex ファイル → .apk ファイル → インストール、実行
        • 数十秒かかる
    • メソッド名を間違えた場合
      • 動的型付け言語の場合
        • インストールまでして、実行時に初めてエラー
      • Scala の場合
        • ソースからのコンパイル時にエラー
    • Java と比べて、無名関数とか暗黙の型変換とか便利
      • Java っぽく書くことも出来る
    • デメリット
      • アプリサイズが大きくなる
        • 同機能のJava実装と比較して 4 〜 5 倍程度
      • protected static メンバにアクセス不可
        • 現状は Java 側でラッパーを用意しておくしかない
      • Google Maps API (maps.jar) 使うとコンパイルエラー
        • 次期バージョン (2.8.1) で修正される予定
    • 環境
      • sbt + sbt-android-plugin
        • apk 作成に加え、インストールまで面倒見てくれる
      • ensime
      • 自分にあったツールを使いましょう
  • Web Flavor
    • コンセプト
      • Better CGI
        • Java Servletのラッパ
        • 低レベルの機構を隠蔽
        • 必要以上に複雑にしない
      • 何でもScala
        • 設定ファイルもScala
      • 直感的
        • 既にある概念は他から持ってくる
    • 仕様
    • 開発
      • Model作成 → Controller作成 → View作成
  • GAEでLiftやってみた
    • → GAE で関数的 Web フレームワーク Lift を使う
    • 事例
      • 事例 1 Lift + GAE
        • もともと Grooby で依頼
          • → いや、Scala
            • 業務的には不具合があるとまずい
              • 型がある方が安全 (実行時エラーを減らせる)
        • クライアント側は flash とか OCaml とか
        • テスト + 証明
      • 事例 2 ScalaCUI システム
        • ネットワーク機器管理
        • Web インタフェースも作ってる
    • Lift について
      • 関数的Webフレームワーク
        • 他のWebフレームワークと比べて最も特徴的な部分
      • Ajax、セッション管理、テンプレート、ORマッピングなど、Webアプリで必要なものは大体ある
    • プロジェクトの作成
      • maven があれば非常に簡単
        • コマンドで一発
    • ビルド、テスト、デバッグ
      • ビルド、テストはmavenで一発
      • ローカルで確認できる
      • GAEサーバへのデプロイもコマンドで
    • 関数的な部分
      • ボタンを高階関数で抽象化
        • ボタン生成メソッドの引数に、ボタンを押されたときの処理をする関数(/クロージャ)を書ける
      • Box モナド
        • Option 型の代わりの様なもの
          • Box 型は失敗時に情報を持てる
            • 後ろに ?~ でエラーメッセージが指定できる
          • Option 型と同様に、for 式で Haskell の do の様に使う
            • ただしクラスファイルの名前がものすごく長くなる
        • guard は自分での拡張
          • MonadPlus 的な
            • 2.8 じゃないとちょっと難しい
    • やっててよかった関数型言語
      • OCamlHaskell を知っていると、Scala や Lift の関数的な部分が習得しやすい
      • いろんな言語を勉強するのは非常にいいこと
    • その他の便利な関数型言語
      • F# (.NET)
        • Scala より型推論がかなり強力
      • haXe (flash, php, js, C++)
        • AcitonScript に似た言語
        • 型推論とかもある
    • まとめ
  • 関数型言語Scalaで実装する型推論
    • Scala による型推論の実装 〜僕と一緒に型推論しませんか〜
    • 型は便利だが、書きたくない
      • 型推論素敵
    • Scala では、引数の型、型パラメータは書かないといけない
      • 型推論はもっとがんばれる
    • Hindley-Milner型システム
      • ちょっとだけ本気を出した型推論
        • 型推論四天王では最弱の存在らしい
      • 型注釈がなくても型が推論できる
      • OCamlHaskell の型推論のベース
      • 実装はそれほど難しくない
      • 作ってみた
        • Scalet
    • Scalet
    • 実装
      • 評価機
        • パターンマッチって素敵ですよね
      • 型の定義
        • case クラスって素敵ですよね
      • 型推論
        • 前提を列挙 → 制約を生成 → 単一化 (方程式を解く)
    • Hindley-Milner型システム
      • 証明もされてる
        • これで推論した型がただ一つに定まる
        • 停止する
        • 完全性と健全性
      • なぜ Scala にないか (想像)
        • 構造的部分型にしないといけない
          • Java との互換性を保つのが難しい
    • 証明
  • ToDo 的な
    • Scala 2.8 から入ったらしい継続について調べる
      • 継続は力 (違