daily reflection

毎日の振り返り

2013-07-25

なぜ蕎麦にラー油を入れるのか。

と言われても困るのだが、今日は本当に時間がなかったので会社のビルの隣にできた鳥そばの店で昼食を。太麺のそばをラー油がたっぷり入ったつけ汁で食べるのだが、どうにも馴染めなくて、ちょっと食べては「(食べ方が)あってる?」、また食べては「あってる?」といったカンジで、まわりをキョロキョロしてしまう。麺が太すぎて蕎麦の味がわかんないし、ラー油が強くて蕎麦をすするとむせるし、うーん、という感想でした。

一日ひたすら仕事してて書くことないので、たまには食レポを。

2013-07-24

妻の誕生日

今日は妻の誕生日。仕事がもう少し落ち着いていれば夜に外食をと思っていたが、リリース週なのでお預け。初めて会った時から18年経ったことを思うと感慨深い。

そんな誕生日の日に、何故か私の服を買ってもらった。夏物バーゲンだそう。そういえば最近は着る服でモメなくなった気がする。

JavaScriptテンプレート

サーバから取得したJSONを表示する部分でJavaScriptテンプレートを使うことに。最初はjquery-tmplにしようと思ったが、開発が止まってるようなので、たまに目にするHandlebars.jsを使い、$.ajaxでサーバから取得したJSONを画面に展開する部分を作成した。

https://github.com/masayuki038/erl-shib/blob/25d43399e9e8cb5bcf5c238b93dd369f6e8b797a/priv/index.html#L55-L76

最初に誤ってhandlebars.runtime.jsをダウンロードしてしまい、Handlebars#compileメソッドがないと怒られた。どうやらプリコンパイルできるらしいので、runtimeはそっち向けなのかな。

クライアント側で柔軟にJSONを使ってレンダリングできると、サーバ側はJSONを返すことに集中できるので作りやすい。

Mnesiaのdisc_copies

作っている最中はmemoryに書き込めれば良いかな、と思っていたが、履歴のJSONを画面にレンダリングする際、都度hiveクエリを発行するのが面倒なので、disc_copiesに変更した。create_schemaを初回起動時のみ実行する、という処理をどう書いて良いか分からずググってみたら、ちょうど良いコードが。

Erlang: side effect(s) to calling mnesia:create_schema more than once?』
http://stackoverflow.com/a/1845391/1352781

create_schemaの戻り値を見れば良かったのか。そういえば未だに例外を出すべきなのか、それとも戻り値にok以外の値を設定するか、判断に困ることがある。何か良い指針があれば読んでみたいところ。

2013-07-21

分散DB本読書会第二回

仕事の方が何とか調整ついたので急遽参加。「読書会」と名のつくものはPofEAA以来なので何と8年振り…。開催地の北品川に向かうも、京急で20分くらい待つことに。北品川に到着後、開催地までの道のりも、ナビが無かったら辿り着けなかった。多分。

第一回は参加できなかったので、今回が初参加。読んでいくスピードが思ったよりも速くて大変だったが、一人で読んだら確実に全部は読まないので、都合が合う限り参加していきたい。今回は予習できなかったので、次回はきちんと予習しよう。

erl-shib

今週末は外出が多かったのであまり進まず。ようやくクエリのヒストリをJSONで出力する処理ができた。それに加え、これまでヒストリにクエリの結果を含めていたが、ヒストリをJSONで出力することを考えると結果は別出しの方が良いので、その対応を。

これまでヒストリを作っていた場所に手を入れるため、etagsで該当箇所をピックアップ。find-tagsの次の候補にジャンプするキーバインドがデフォルト(C-u M-.)のままで使いにくいんだけど、割り当てたいキーが思い浮かばないので一旦そのままに。

Erlang側で文字列をリストやバイナリのままにしてjiffy:encodeすると、対応するJSONの値は数値の配列が出力されてしまう。JSON側で文字列として出力するためには、atomに変換する必要がある。そこで、前回見つけたrecord_to_structの中でガードを使って、値がバイナリの場合は一旦リストに変換してatomに、値がリストの場合はatomに変換するようにした。

https://github.com/masayuki038/erl-shib/blob/35d277001054204868c56581519e37685b9b624d/include/history.hrl#L10-L13

あとはJSONとして出力したヒストリを画面に表示する部分。どうせならJavaScriptのテンプレートエンジンを試してみたい。

2013-07-19

ヘルニア

今日は首の調子が悪くて、久々にリタイア寸前というところまで来た。元々この時期はキツいんだけど、それに加えてドキュメントを書く作業が続いているからかな。取り合えずストレッチを深めに。明日も調子悪ければ、少し離脱した方が良いかも。

erlang_iso8601

jiffy:encodeでErlangのrecordをJSONに変換する際に失敗する件。Erlang:localtime()を呼び出すと、{{%Y, %m, %d}, {%H, %M, %S}}というタプルが返ってくる。このままだと前回のrecord_to_struct(RecordName, Record)マクロで展開できないので、一つの値に変換したい。JSONのdata typeには日付型がないので、あまりJSONの仕様に囚われる必要もない。

Erlangで日付型を賢く扱う方法を探してみたところ、以下のページが見つかった。

Erlang 日付ライブラリ シラベモノ

このページにあるライブラリをいくつか見てみたが、先ほどの{{%Y, %m, %d}, {%H, %M, %S}}で扱うか、もしくは文字列で、というのが基本線らしいので、erlang_iso8601で日付を文字列に変換してからjiffy:encodeして無事JSONに変換できることを確認した。

2013-07-16

jiffy:encode

思ったよりも早く帰宅できたので、erl-shibのヒストリまわりの実装を。ヒストリをMnesiaからRecordとして取ってくるところまでは実装していたので、それをJSONで返すインターフェースを、と思ったが、Recordをjiffy:encodeでJSONに変換するところで困った。Recordは各値しか持ってないので、[{key, value}, ...]のkeyの部分が無くて簡単に変換できない。

ちょっとググってみたところ、これを解決するマクロがあった。
maru/apps/maru_models/include/jsonerl.hrl

lists:zip/2は2値をタプルで繋いでくれる。Recordのフィールド情報と実際の値をzipすることで[{key, value}, ...]を作れる。なるほど。

Erlang -- lists#zip/2

どうも何か困ったことに遭遇すると、ろくに考えもせず、すぐググってしまう。仕事じゃないんだし、ベストな解じゃなくても良いので、もうちょっと意思的に自分の頭で考えるようにしよう。

2013-07-15

cowobyでファイルダウンロード

erl-shibでHQLの結果をダウンロードする部分を作成。cowobyでファイルをダウンロードさせるコードを書くのは難しくないんだけど、細かいところでいくつか躓いた。

  • クエリIDの型の違い(文字列とバイナリ文字列)
  • io:formatとio_lib:formatの違い
  • サーバ起動時にmnesiaを起動してなかった
  • fetchAllの戻り値がバイナリではなくバイナリの配列だった

csvとtsvで結果をダウンロードするところまで完了。fetchAllで返ってくる各レコードのフィールドセパレータはタブになっているので、tsvの方はそのまま出力しただけ。csvの方はreモジュールのreplace関数を呼んでタブを,に置換するのみ。この違いだけ実装したいんだけど、どういうやり方が最適なのか分からず、今はベッタリ書いてる。

あとはヒストリまわり(表示、展開、削除)とクエリ実行時の制御、そしてジョブの実行状況の出力までできれば一段落。

Richard Stallman: Snowden leak a chance for privacy, time to fight Big Brother

Richard Stallmanの動画を初めて見た。例のスノーデンの問題でプライバシーまわりの話をしている。ゆっくり喋っているので聞き取りやすい。ついでにDamien Katzのインタビューも見てみたけど、こちらはDamienの声がちょっと小さくて聞き取りにくかった…。

2013-07-14

Hadoop vs MPPデータベース

構造化したデータキューブをMPPDBに入れるっていうのをやったことがないな、と。このあたりは弱いので勉強しておかないと。DWHの本で面白そうなのがあれば読んでみたい。

erl-shib

最近、Erlangshibのクローンを作っている。今日は設定情報をファイルに出すところを。設定ファイルの読み込みにはeconfigを使ってみた。.iniファイルなんてもう使うことないと思ってたけど、セクションで分けられるのは案外便利。

また、HTMLの一部を動的に書き換えたかったので、テンプレートのライブラリを追加することに。ErlangでHTMLのテンプレートライブラリを探してみたところ、Djangoのテンプレート言語を使えるerlydtlが定番っぽいけど、書き換えたい部分はほんの一部なので、シンプルさを買ってsgteにした。

あとはHTML側(index.html)に$host$、$port$と書くと値が埋め込まれる。compileした内容(Compiled)をETSかどこかに保存しておくと良いのかな。それは後でやろう。