札幌Java Conference2012 - 午前中

2012/11/17に開催された札幌 Java Conference 2012 に参加してきましたのでその忘備録の午前中分です。

  1. Lambda への道(桜庭さん)
  2. つくって学ぶデータベース〜まずスモールデータからはじめよう(きしださん)


@skrb 桜庭さん - Lambda への道

Java SE8で追加される予定のラムダ式自体の紹介+ラムダ式が入った経緯とその真価についての話でした!
ついにJavaにもfilter, map, reduceが入るのかー。最近の流れに乗ってる感じ!
  • なぜラムダ
  • クロージャがなぜなくなったか
  • ラムダ式、APIの話
自己紹介あった
  • Java in the Box
  • 連載もってるよ ÏTPro java技術最前線

Lambda のバックグラウンド

  • クロージャを2005年に開始、Java7で検討するぜー発言
  • 仕様が2006年に出た - BGGA
    • この時点では本物のクロージャだった
    • ・・・大激論!
    • Gafter と Joshua Block の間で決別
    • ちなみにJoshuaはGoogleでDARTを作っているらしい
    • 2008まで収集がつかなかった
  • JavaのリードのReinholdがクロージャの中止を宣言
  • 2009年にProject Lambdaとして復活
    • 7に間に合わなくて8に入ることになった
    • 何故復活した

何故Lambdaは復活した?

  • 目的があった
    • 時代はマルチコア
    • 2000年代後半にマルチコアになってきた
    • Fine Grained Parallelism
  • 小さいタスクをパラレルに動かしたい
    • 大きいタスクの並列化は無駄が多い
    • CPU の遊んでる時間を使うには小さいタスクが望ましい
      • SE7 の fork/join frameworkで実は実現できている
      • でも使い所がない
    • Iterator で使えるといいよね!
      • できればループの一つひとつをパラレルにやりたい
      • 従来のJava は for 文による外部イテレーター
      • forEachによる内部イテレーターを使って並列処理したい
        • 外部とのやり取りがなければ独立してる
        • でも以前だと書きづらかった
        • そこでLambdaですよ

Lambda

  • lambdaはFunctionalInterfaceを表すためのものになった
    • 実装すべきメソッドが1つだけのインターフェース
    • 実はComparatorもFunctional
      • equalsはObjectが実装を持っている
      • compareだけを実装すれば良い
  • 関数型インターフェースを実装した無名クラスのインスタンしエーション記法
    • (引数, 引数) -> { 処理 }
    • 引数の型は省略可能
      • SE7からのダイヤモンド演算子を使って実装
    • 処理が1行であれば波括弧と return を省略可能
      • (ここまで来るとかなり関数型っぽい)
      • (というか Scala っぽい)
    • 引数が1つであれば、丸括弧も省略可能
    • でも Clojure ではない
      • レキシカルスコープを持っていない
        • 新しいスコープを持たないという条件が必要
      • なのでJavaはクロージャではない
    • Effectively final(見なしfinal)が導入された
      • 実質的に代入していなければ final とみなしてくれる
      • (これ、混乱しそう・・・)
    • Default Methood が追加された
      • abstract のフィールドなし版みたいな感じ
      • IterableにforEachを追加したときにdefaultにしておくと全クラスに影響が及ばない
        • APIをいじりやすくなった
  • でも実はforEachはまだ並列に処理してくれない
  • Streamインターフェースが追加された
    • filter, sorted, map, reduce が追加された
    • Stream といいつつ Collection
    • このあたりが使えるとlambdaの意義が出てくる
    • (かなり関数型寄りな感じ!)
  • Collection#parallel メソッドを使うと並列化して実行してくれる!
    • (すげー!)
  • Developer Preview 見れるよ!

@kis きしだなおきさん - 作って学ぶデータベース〜まずスモールデータから始めよう

きしださんがデータベースをJavaで実装してみたよーって話でした!詳しいことはご自身のブログに書かれているっぽいです。すげい

(資料が手書きだ!すごい!)
"みんなデータベースとかひとつくらい実装してるじゃないですかw"
"みんなPostgresとかソース読んでるじゃないですかw"
  • きしだなおきさん
  • 「きしだ」でぐぐって一番上
  • 福岡のフリーランスの方

きょうのはなし

  • RDBてきなものを作った
  • 楽しかった
  • みんなつくってみるといいですよ

スモールデータ時代の到来

  • ビッグデータの流行
    • ひとつのデータを確実に扱えるようにするのが大事
    • スモールデータに注目
  • 10日かけて作った
    • (なんか野望みたいなところがあったのだろうか?)

1日目 - 3日目

  • 1日目
    • リレーショナルモデルとリレーショナル演算
    • (IDEで使っている文字がかわいい)
  • 2日目 - サブクエリと構造変更
    • 1日目の構造を変更したらサブクエリができるようになった
    • Query - Relation - Table という構造にしてみた
  • 3日目 - 頑張って実装したよ

4日目

  • 4日目 - インデックス
    • 山場
    • 大きくツリーインデックスとハッシュインデックスがあるよね
    • JavaのHashMapとTreeMapを使うよ
    • IndexをRelationの一つとして定義した
    • B木を実装するのはつらいから後回し
  • 5日目 - 集計処理でのインデックス
  • 6日目 - 更新・削除
    • そんなに難しくなかった
  • 7日目 - ユニオン
    • 更新・削除までで満足感高かった
    • ユニオンは利用者としては使わないけどDBは使いまくっている
  • 8日目 - insert時のトランザクション
    • トランザクションを実装するのが目的だった
  • 9日目 - MVCC トランザクション
    • マルチバージョン同時実行制御
      • データにバージョン番号をつける
      • 今実行している環境(コンテキスト)が必要
      • 古い更新データの保存
    • 見えるデータだけ見せる
      • データを更新している人以外の人から見えるデータも必要
  • 10日目 - 隔離レベル(分離レベルとも呼ばれたような)
    • めんどくさそうって思った
    • いままでわからなかった隔離レベルがわかった

これからつくるもの

  • "ぼくのかんがえる最強のデータベース"
  • ストレージとログ
    • WAL(Write ahead log)をやってみたい
  • クエリと実行計画
    • パーサーをどうするか
      • JavaCCとかめんどい
      • scala で書くか、簡単なPEGパーサーを作る?
  • 実行時最適化
  • Join 戦略
    • ネストループ結合とかインデックス結合とかソートマージ結合
    • 実は20とか30とか戦略はある
  • 実行計画の作成
    • 複数の戦略が使えるときにどうするか
    • ルールベースとコストベース
    • コストベースは実はルールベースを含んでいる
  • JDBC対応
    • めんどくさそう
    • 並列実行が必要、今は並行実行なのでロックが必要
  • ロック
    • 書き込みロックはあったほうがいい
      • インデックスで必要
      • 今のハッシュマップだと効率悪い
      • B木にしてやる必要がある
        • ブロックごとのアクセス、Diskと相性が良い
    • (インデックスにロックをかけるのにB木が必要だったのかー)
  • デッドロック検出
    • まじめにやるとロックグラフを作ってやる必要がある
    • 単純な戦略だと10秒たったら解放というのがある

コメント

このブログの人気の投稿

inotify でファイル監視しようず!

「SQL実践入門」がとてもわかりやすい

PostgreSQLで多次元配列を1次元配列に展開したい