2012年11月30日金曜日

お財布をプレーンテキストで管理する

mohとは?

家計簿を付け始めて何年か、いろんな方法を試してきた。主に電子的なやり方でやってきていて(紙ですることも検討はしてみた)、最近はGnuCashからExcelに戻って、簡単な表を作って、あまり細かい項目は書かずに大雑把な合計だけを書くようにしていた。

だけど、自宅PCがMacに変わった。わざわざMS Officeを買う必要もないかと思いLibreOfficeで家計簿をつけてみることにしたのだけど、これが失敗。以前Excelで使っていた表をインポートすると、なんだか表の表示が崩れてきてしまう。

では、ということでNumbersを試してみたけど、データのインポートがうまくいかない。なんだか同じ列なのに金額だったり日付だったり異なった種類のデータとして解釈されてしまう。GnuCashは操作がしにくい感じがするしなあ。

ということで、家計簿ソフトを自作することにした。howmとhowmoneyを参考に、howmのメモに書き散らした支出入の記録から会計簿を作成するようにした(howmに依存はしていない。多分org-modeとかでも使えるはず)。また、GnuCashを参考に、一応二重簿記になっている、と思う。

インストール

まずOCamlをインストールして欲しい。最初はRubyで書こうかと思ったけど、なんとなく再帰で処理するところがしっくりこなくて、OCamlで書いた。

次にhttps://github.com/yoriyuki/moh (2013/8/27追記:masterブランチはRubyで実装されるようになったので、OCaml版はhttps://github.com/yoriyuki/moh/tree/OCamlから。)からmoh.mlをダウンロードして適当なところに置く。財務データが置かれているディレクトリのトップに置くと便利かも。

これでインストールはおしまい。

使い方

データの準備

当然、mohを使うには家計簿を付けなくてはいけない。家計簿はフリーフォーマットのプレーンテキストファイルで、財務データ以外のデータを含んでいても構わない。また、ひとつのファイルにまとまっている必要はなく、複数のファイルに分散していて良い。

例えば、~/kakeiboに財務データを置くことにしたとすると、~/kakeibo/foo/bar/kakei1などといったファイルに書き込めば良い。

財務データは1行で書かれている必要がある。例えば、

[2012-11-30]\$ Wallet  -> Expense 昼食 セブンイレブン 焼肉弁当 700

と書くと、財布から700円を昼食として支払ったことを表す。「セブンイレブン コンビニ」はコメント。

Wallet,Expense,Incomeは特別な口座で、略記法が用意されている。上は

[2012-11-30]\$ 昼食 セブンイレブン 焼肉弁当 700

と書ける。

もし、40万円給与をもらったとすると、

[2012-11-30]\$\$ 給与 400000

と書ける。

レポートの作成

ここで、

ocaml moh.ml -d XXX Wallet 20120101 20121231

とすると、XXXのサブディレクトリを再帰的に探索して財務データを抽出し、集計してレポートとして表示する。上は、Walletの年次リポートを作成している。-dが省略されれば、カレントディレクトリをトップトップとして扱う。

今後

いろいろ足らないところはあると思う。Githubで公開しているのでどんどん改良してくだされば嬉しい。