これは、purescriptアドベントカレンダーの6日目です。
slamdataってなんだよ?というのを書きます。自分もそれほど詳しくないですが。
簡単に要点を先にまとめると
- purescriptを実際に使ってるベンチャー(?)企業
- 社員の人が、purescript自体やいくつかのライブラリにも貢献している
- 以前"Scalaのすごい人がいる"というので紹介したPrecog http://d.hatena.ne.jp/xuwei/20121018/1350524933 という会社とCTOが同じ
- precog自体は、なくなったらしい?そのあたり詳しく知らない
- こんな記事 10 Lessons I Learned from Doing My First Real Startup をCTOが書いてたので、読むとよいと思う
- precogのときと大体同じような、MongoDB使って、そこにリレーショナルデータをツッコむ?とか、データ解析のプラットフォーム提供?のようなことしてるらしい
さて、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などの関数型のテクニックが使われていて、とても不思議な感じです。例↓
さて、だいぶ中途半端で物足りない感がありますが、purescriptもslamdataのコードも、元から詳しくないので、書けるのはこの程度でしょうか・・・。
実際ビルドして、動かしてみる、とかまでやったらよかったのでしょうけど、そこまでやる気にはなれませんでした、すいません。
誰か、もっと面白そうな事例とかコードあったら教えて下さい。
そして、purescriptのアドベントカレンダー、そろそろ途切れるみたいなんですが、誰か・・・