slamdataについて

これは、purescriptアドベントカレンダーの6日目です。


slamdataってなんだよ?というのを書きます。自分もそれほど詳しくないですが。

簡単に要点を先にまとめると

  • purescriptを実際に使ってるベンチャー(?)企業
  • 社員の人が、purescript自体やいくつかのライブラリにも貢献している
  • 以前"Scalaのすごい人がいる"というので紹介したPrecog http://d.hatena.ne.jp/xuwei/20121018/1350524933 という会社とCTOが同じ
  • precogのときと大体同じような、MongoDB使って、そこにリレーショナルデータをツッコむ?とか、データ解析のプラットフォーム提供?のようなことしてるらしい


さて、slamdata社のコードは、なぜか結構オープンソースになってます。

https://github.com/slamdata

メインのサーバーサイドの方のScalaのコードが、Scalazをかなりフルに活用していて、ほとんどHaskellっぽいScalaになってて、かなり面白いです。
が、今回はそちらではなく、フロントのpurescriptのほうを見てみましょう。

https://github.com/slamdata/slamdata

まず、コレ書いてる2014年12月6日時点での、bower.jsonをそのまま全部引用

https://github.com/slamdata/slamdata/blob/e9ccf911742dc8/bower.json

{
name: "slamdata",
version: "1.0.7",
homepage: "https://github.com/slamdata/slamdata",
description: "Front end for slamengine",
main: "index.js",
keywords: [
"slamdata",
"slamengine",
"nosql"
],
authors: [
"Hardy Jones <hardy@slamdata.com>",
"John A. De Goes <john@degoes.net>"
],
license: "AGPL-3.0",
private: true,
ignore: [
"**/.*",
"node_modules",
"bower_components",
"test",
"tests"
],
dependencies: {
c3: "~0.2.4",
d3: "~3.4.8",
entypo: "*",
fontawesome: "~4.1.0",
foundation: "~5.3.3",
icomoon: "0.0.2",
jre-linux-x64: "http://installbuilder.bitrock.com/java/jre1.7.0_67-linux-x64.zip",
jre-osx: "http://installbuilder.bitrock.com/java/jre1.7.0_67-osx.zip",
jre-windows-x64: "http://installbuilder.bitrock.com/java/jre1.7.0_67-windows-x64.zip",
nvd3: "~1.1.15-beta",
purescript-argonaut: "~0.2.10",
purescript-arrays: "~0.2.1",
purescript-arrows: "~0.1.1",
purescript-c3: "~0.1.0",
purescript-control: "~0.2.1",
purescript-datetime: "~0.1.0",
purescript-either: "~0.1.3",
purescript-events: "joneshf/purescript-events#~0.1.2",
purescript-foldable-traversable: "~0.1.3",
purescript-foreign: "~0.2.0",
purescript-http: "~0.2.0",
purescript-identity: "~0.1.0",
purescript-lens: "~0.3.3",
purescript-lists: "~0.3.4",
purescript-maps: "~0.1.1",
purescript-maybe: "~0.2.1",
purescript-monoid: "~0.1.4",
purescript-node-uuid: "~0.4.1",
purescript-oboe: "~0.3.0",
purescript-parsing: "~0.1.4",
purescript-path: "~0.2.4",
purescript-react: "joneshf/purescript-react#simplify",
purescript-showdown: "~0.0.1",
purescript-strings: "~0.4.0",
purescript-strongcheck: "~0.5.0",
purescript-timers: "0.0.5",
purescript-tiny-emitter: "~0.1.0",
purescript-transformers: "~0.3.0",
purescript-tuples: "0.2.2",
purescript-validation: "~0.0.3",
purescript-webstorage: "~0.2.0",
purescript-xhr: "~0.2.0",
react: "~0.11.1",
react-treeview: "joneshf/react-treeview#master",
reactable: "joneshf/reactable#master",
showdown: "~0.3.1",
slamengine-jar: "https://github.com/slamdata/slamengine/releases/download/v1.0.2-SNAPSHOT-138/slamengine_2.11-1.0.2-SNAPSHOT-one-jar.jar",
purescript-moment: "~0.0.2",
moment: "~2.8.4",
purescript-navigator: "~0.1.0"
},
devDependencies: {
underscore-contrib: "~0.3.0",
tiny-emitter: "~1.0.0"
},
resolutions: {
d3: "~3.3.13"
}
}

結構多くのライブラリつかってますね・・・。他の実用的なプロジェクトのbowerのファイル満たこと無いだけで、実際に実用的なある程度の規模のコードを書こうとしたら、このくらいは普通かもしれません。

そして、リポジトリ内のファイルの言語毎の占める割合

だいたい4分の3がpurescriptです。本当にかなり本格的に使ってますね。

あとは、git cloneしてきて、

"find . -name *.purs | wc"

で、行数を数えると、以下のようになりました

$ find . -name *.purs | wc
      43      43    1728

1728行と、思ったよりは多くなかったです。

さて、ここまで書いたはいいけど、このあと具体的に、どこを見ていけばいいか迷いますね・・・。

具体的にどういうコードが書かれてるのか?は、大雑把に眺めた感じの推測ですが、普通にGUIの関連する部分のコード書いてるようです。あと、1日目に紹介されていたpurescript-reactなんかが結構使われてますね。

そして、そういうGUIのコードで、当たり前のように、Lensなどの関数型のテクニックが使われていて、とても不思議な感じです。例↓

https://github.com/slamdata/slamdata/blob/e9ccf91174/src/SlamData/App/Workspace/Notebook/Block.purs#L9


さて、だいぶ中途半端で物足りない感がありますが、purescriptもslamdataのコードも、元から詳しくないので、書けるのはこの程度でしょうか・・・。
実際ビルドして、動かしてみる、とかまでやったらよかったのでしょうけど、そこまでやる気にはなれませんでした、すいません。
誰か、もっと面白そうな事例とかコードあったら教えて下さい。
そして、purescriptのアドベントカレンダー、そろそろ途切れるみたいなんですが、誰か・・・