自分の投票の影響を可視化する

衆院選投票日間近ということで妄想したこと。

概要

  • ある選挙での投票行動が、その後どのように政治に影響を与えたかの可視化を試みるツール
  • 過去の選挙と選挙区を選択すると、候補者、政党一覧に遷移し、それぞれ選択すると、その投票行動に紐づくその後の出来事をグラフ表示する
  • 選択すると記録しておいて、自分の投票履歴のような形で振り返れると素敵

目的

  • 有権者のやる気向上
  • 自分の気持ちがどう変遷したかのログ

課題

  • どうやって候補者、政党、出来事のDBを作るか
  • 出来事は粒度を荒くせざるを得ない
  • 紐付きは静的でいいと思ってるけど、どうやって紐付けるんだよ
  • ログと言ってもちょっと気長過ぎやしないですかね
  • 地方選挙までフォローとか無理ゲー

メモ 2013/01/13) neo4j使ってうまいことできないかな。

動的にコレクションやMapを作る場合

動的にMapを作る

関数の中で色々制御(型変換、要素を追加する or 追加しない etc)しながら 新たにコレクションやMapを作りたい場合、

(1 to 1000).foldLeft(immutable.Map.empty[Int, Int]) ((map, v) => if (v % 2 == 0) map else map + (v -> v))

のような書き方をすることがあるんですが、immutable な Map を作りまくる形になるのでやっぱり重いです。

上記のようなロジックを使っているプログラムで、immutable であることより、パフォーマンスを優先したかったので、

val arr = new mutable.ArrayBuffer[Pair[Int, Int]]
(1 to 1000).foreach(v => if (v % 2 == 0) arr += (v -> v))
arr.toMap

のようにしたところ、かなり早くなりました。(上記のサンプルだと要素数が少なすぎて微妙かもしれない)

ベンチをとってみる風

せっかくなので、ちょーざっくりですがベンチをとってみました。上記のサンプルと同様の10000件のデータ(1 to 10000)を使って20回試行したものの平均です。単位は msec です。specs2のテストとして書いて実行しました。

immutable.Map/110.85            => immutable.MapをfoldLeftで map + (v -> v)
mutable.Map/70.35               => mutable.Mapにforeachで map += (v -> v)
mutable.Map.foldLeft/73.2       => mutable.MapにfoldLeftで map += (v -> v)
mutable.ArrayBuffer/62.3        => mutable.ArrayBufferにforeachで arr+= (v -> v)
mutable.ArrayBuffer.toMap/99.8  => 上記 + toMap

実際に上記を適用したコードでは、1000msec → 200msec ぐらいの変化があったんですが、他の箇所にも手を入れたことによる結果かも。immutable.Mapとmutable.ArrayBuffer.toMapに思ったほど差がない。でもArrayBuffer早いですね。

ただ、sbt "test-only ***"で実行したとき、1回目だけ以下のような値になりました。(2回目以降は誤差 1msec くらいに収まる)

実行することでJITの最適化が効いたから?(よくわかってない)

immutable.Map/70.9
mutable.Map/79.45
mutable.Map.foldLeft/78.05
mutable.ArrayBuffer/59.35
mutable.ArrayBuffer.toMap/68.7

ベンチとしては色々中途半端でごめんなさい。

参考:http://d.hatena.ne.jp/chimerast/20110304/1299237142

比較対象のコレクションがmutable.ArrayBufferになっているのはこちらの記事を参考にさせていただきつつ、私のケースでパフォーマンスを求めたときに一番適しているのがmutable.ArrayBufferだと判断したためです。これとは別にMapだけでも少しベンチは取りましたがListMap以外は似たり寄ったりでした。ListMapは飛び抜けて重かったです。

SortedMap

ふつう

scala> SortedMap(2 -> "a", 1 -> "b", 3 -> "c")
scala.collection.SortedMap[Int,java.lang.String] = Map(1 -> b, 2 -> a, 3 -> c)

java.util.Comparator的な

scala> val m = SortedMap.empty[Int, String](new Ordering[Int] {
 |    def compare(a : Int, b : Int) = b - a
 | })
m: scala.collection.immutable.SortedMap[Int,String] = Map()

scala> Map(2 -> "a", 1 -> "b", 3 -> "c").foldLeft(m) ((mm, v) => mm + (v._1 -> v._2))
scala.collection.immutable.SortedMap[Int, String] = Map(3 -> c, 2 -> a, 1 -> b)

Node学園祭2012お疲れ様でした

f:id:hiraiva:20121118092131j:plain

去る2012/11/18にNode学園祭2012が開催されました。

http://nodefest.jp/2012/

私は去年に引き続きスタッフをさせていただきました。

お手伝い

カンファレンス実行委員の朝は早いーーー

という訳で朝8:00集合です。去年もそのくらいだったはず。といっても開場まで2時間しかないので、割りと忙しいです。朝イチ〜開場までが一番やること多いかも。

去年より圧倒的にスタッフの人数が少ないのにも関わらず、忙しくもあまりバタバタした感じがなかった気がする。去年は前日夜も準備しましたしね。会場設営が楽だったのもあるとは思うのですが、慣れでしょうか。

私の方は弁当の準備が終わると一段落できたので、昼間はいくつかセッションも聞かせていただきました。

スタッフの皆様には繰り返しにはなりますが、今回はご迷惑をおかけし本当にすいませんでした。特に嘉平さん本当にありがとうございました。

セッションハイライト的な何か

f:id:hiraiva:20121118160352j:plain

※この方はスピーカーではありません

大津さんのNodeコアの話

すごくタメになったしわかりやすかったです。言葉を選んで極力平易に解説してくださったのをすごく感じました。個人的に一番聞いておきたかったセッションです。もっと勉強しないとですな。

substackのscuttlebuttの話

f:id:hiraiva:20121118141623j:plain

ちゃんと理解できているか自信がないけど、"Node"の名前の由来に立ち戻ったようなことをやろうとしている、のだと思いました。自律的にネットワークを構成するブログノードみたいな妄想をしたことがあります。

substack本人もフラワームーブメントな感じがして素敵でした。オープンソースとヒッピー文化は深いところでつながっていると思うのですが、そういう意味でクラシカルなOSSの体現者といったところなのでしょうか。ご本人は結構若いので、西海岸ではそういった文化が脈々と受け継がれているのかもしれません。

Charlieのin productionな話

f:id:hiraiva:20121118134507j:plain

チャーリーすげースーツ似合いそう。VC相手にバリバリプレゼンしそう。node knockoutでもお世話になったnodejitsu CEOのチャーリーさんです。

個人的に色々話してみたかったんですが、後夜祭でもチャンスが掴めず。。。

今更ながらちょっと調べたら、1st roundが$750,000とのことで、ちょっと前にjoyentとの提携の話がありました。no.deからの移行組も含め、コミュニティベースでこれから実績をあげていくフェーズなんでしょうか。

まとめっぽい何か

f:id:hiraiva:20121118160353j:plain

※この方はスピーカーでありま(ry

私自身Node初心者ではあるのですが、今年は去年に比べてコアな話が多かったように感じました。Node.jsが生まれて4年くらい(でしたっけ?)、相変わらず凄い勢いでアップデートされていっている感じですが、アーリーアダプターの人には一通り情報が行き渡って熟してきている時期なのかもしれません。

あるプログラム言語(Nodeの場合は処理系と言った方が良さそうですが)が誕生し、成長していく様を見られるというのは貴重な体験なのかもと思いました。Rubyとかどんな感じだったんでしょうね。1.0になったら本格的な普及期へ移行するのかと想像しますが、0.1x.xxがしばらく続きそうな気もする。。

参加者の皆様、スタッフの皆様、スピーカーの皆様、法政大学の皆様お疲れ様でした!

今年も参加できて本当に良かったです!!

※本エントリには法政大学 二川様撮影の写真を使わせていただきました。ありがとうございました。

Node Knockout 2012に参加した話

はじめてNode Knockout(以下node ko)に参加したので色々書いてみます。

多分来年もある気がするので、今後参加しようかなと思う人の参考になれば。

Node.js Knockout 2012

http://nodeknockout.com/

記事投稿時はVote期間中です。

  • Node.js の48時間オンラインハッカソン
  • Node.jsで書かれていれば何でもOK(Webアプリじゃなくても)
  • 今年で3回目で参加チームは400over
  • githubにpush+PAAS(今年はnodejitsu)にdeployする形

参加

特に面倒なところはなかったです。githubアカウントで認証。

ハッカソンのタイムテーブルはUTCなのですが、サインイン後の画面に表示される時間は、見てる人のロケールの時間だとしばらく気付かずに、?となってたのは秘密。

ハッカソン開始

ハッカソンがはじまると、諸々のアカウント情報が送られてきて、開催側が用意したgitレポジトリをcloneすることで開発を始めます。

割と丁寧にデプロイ手順やらを書いたものが、サインイン後の画面やら、お知らせメールやら、cloneしたレポジトリのREADME.mdやらに書いてあります。手順自体も簡単。

結構至れり尽くせりな印象。

ハッカソン中

時間が進むごとに、node koサイト上で色々催しがありますが、見てる暇ありませんでしたうひい。

48時間の終了間際はデプロイが集中していたからか、nodejitsuが重かったです。deployがタイムアウトになってしまうこともあったので、来年もnodejitsuかどうかわからないですが、余裕をもってdeployした方がいいかも。

完成品がこちらになります

http://nodenova.nko3.jitsu.com/

たぶんハッカソン終了後しばらくすると見れなくなります。

我ながらコメントに困る出来だなあと。参加することに意義があるんです!(断言)

Vote

ハッカソンが終了して、少しすると、審査投票期間(JST 2012/11/18 9:00まで)です。参加者はnode koサイトにサインインすると、「このアプリ見てみない?」っていうのが表示されるので、色々見て回るのにとても丁度良かったです。デプロイされたアプリだけで200くらいあるはずなので。

また、この期間がはじまるとExpert Review(Webアプリでないもの用の審査)用に、プレゼンビデオをアップしてねと言われました。でも、Webアプリの人も結構アップしてた。

雑感

基本的に全て英語だけど、結構丁寧に色々書いてあるので、私の微妙な英語力でも手順で迷う事はあまりありませんでした。英作文疲れた。

Chromeに実装されて間もないWeb RTCのgetUserMediaを使ったアプリが人気だったように見えました。簡単そうなので、後でちょっとやってみよう。

結構みんな自由かつ果敢に攻めてきた印象。

  • ソーシャル連携しないと何もできないアプリ
  • 特定のデバイスと付き合ってくれる友達がいないと何もできないアプリ
  • 大きな構想のあるプロダクトまたはライブラリでnode ko終了後のアップデートを謳っている

こういうのも割と普通です。私ももっと自由かつ果敢になりたい。

どうでもいい背景

何も考えずにもぐらたたきにしようと思ったところ、 Rules に "Don't harm any animals (especially potbelliedpigs)." とあったため、チキンな私は「動物じゃないこれはロボだ!」という言い訳を用意するため、適当にストーリーまで作ったという。あとpotbellied pigsって何だ。