家計簿ソフト開発メモ

個人的なメモに近いです。

解決したい問題

家計の収支を把握することは非常に有意義である。これに異論を唱えるひとはほとんど居ないだろう。しかしその方法が意外に難しい。私は以前、Excelを使って家計簿を付けていたがあまりにも面倒なうえに、家計簿をつけること自体が目的化して止めた。家計簿をつけることに労力を割かれ、家計簿を応用するところまで労力が回らないのである。

人間が手作業でやっている作業は機械が自動化すればよい。しかし、家計簿の自動化は予想以上に困難だ。昨今はクレジットカードの履歴がネットで見れたり、ダイレクトバンキングサービスが始まったり、電子マネーが始まったりとさまざまなWeb化が推進されてきてそこは喜ぶべき点ではあるが、まだ完全ではない。外部サービスと連携するためのAPIを公開しているようなサービスはほとんどない。

電子化されていないペーパーレシートに至っては自動化はますます困難だ。フォーマットが統一されていないレシート上から日付、金額等を読み取るのは現代の技術を使っても難しい。であるから、レシートをカメラで撮って電子化…というサービスを実施しているところは人間の手作業によるデータ入力に依存しているらしい。しかも、このデータ入力作業の報酬として支払われる賃金はは非常に安いとのことだ。人をこき使うようなサービスは長く続かないだろう。

ペーパーレシートがコンピュータの世界とつながるためにはペーパーレシート側が譲歩するほかない。たとえば、ウォルマートではQRコードが付いたレシートを発行していて、それを読み取ると明細がWeb上で確認できるとのことだ。だが、こういったサービスも大手だから出来ることである。日本国内にあるすべてのレジ端末がクラウドにつながる日はまだまだ遠いだろう。

以上のようなサービスを踏まえたうえで、Money Fowardというサービスをもう一度考えてみるとこれはやはり革新的であると思う。1700社以上の金融機関と連携し、自動で残高情報を取得する。私が驚いたのは、投資信託などの金融資産まで集計してくれること。技術的に考えれば残高情報の取得と大差ない処理であるが、使う側からすれば大きなメリットになる。実際使っている人に話を聞くと「財布の中の1円までぴったり一致する」というから驚きだ。

しかしながらそれでも私がMoney Fowardを使わない理由はやはりセキュリティリスクである。ダイレクトバンキングと大差ないではないかと思う人も居るかもしれないが、まず複数の口座情報が同じ方法で一か所にまとめられているという点がリスクになるし、だからこそクラッカーからは狙われやすいだろう。

また、ダイレクトバンキングなどと大きく違うのはパスワードが復号できる状態で保存されていることである。ダイレクトバンキング(というか一般的なパスワードによるまともなログインシステム)は、サービスを提供している会社すらユーザーのパスワードを知らないようになっている。それでどうやってパスワードが正しいかどうか判別できるのかと疑問に思う方はハッシュとか一方向関数というキーワードで調べてみると良い。しかし、Money Fowardはシステムが何らかの方法でパスワードや乱数表を取得できるようになっている。であるから、最低限、そのシステムを設計・制作したプログラマであれば解読できるだろうと予測される。

さらにスマホアプリやらWebやらでサービスを展開しているというのも私はリスクになると思う。サービスを異なる環境で展開すればするほどユーザーの利益になるが、クラッカーが突くことのできる脆弱性も織り込まれやすい。

以上のようなことを考えると、少なくとも私はとある1社がクローズドで開発したシステムに銀行等々の口座情報を預ける気にはなれない。したがって、自分で同様の劣化版システムを作ってみようと思い立った。

要求仕様

  1. 口座から残高情報の自動読み取り
  2. 入出金履歴の自動読み取り
  3. 投資信託総額の自動読み取り
  4. キャッシュフローが把握できるビジュアルツール

1~3は家計簿として必須と言っていいだろう。FXや株式はやってないので除外。4番は具体的には以下のようなものを想定している。

  • 入出金履歴から月ごとの決まった入金・出金を抽出
  • 投資信託の運用履歴から暫定の年利を計算
  • 既に確定している将来の出費を登録
  • 以上より将来の資産残高を予測
  • 折れ線グラフで表示

という感じだ。おそらく、MoneyFowardにも同様の機能はあるだろう。こういうことをやるのは難しくない。あとは、グループを定義して、グループごとの入出金の割合を円グラフで表示するとかもやっても良いかもしれない。MoneyFowardではこれも自動的にやってくれるみたいだが、まあ大した手間ではないしユーザーにやらせても良いと思う。

レシートの読み取りは当然やらない。やれない。

対応する銀行/サービスは私が普段使用している、MUFG、新生銀行、三井住友信託銀行、楽天銀行、MyJCBに対応させる。とりあえず皆に使ってもらおうと思っているソフトではないし(一応GitHubか何かで公開しようとは思うが)、そもそも私が使っていないサービスについては対応しようがない。

実装方法

Play FrameworkでUIを作る。Seleniumでブラウザを操作してデータ取得を行う。本当であればスクレイピングツールでブラウザに依存せずにデータを取りたいが、ログインが絡むと面倒なので将来的な課題としよう(javascriptで情報を収集し、たくさんのパラメータをpostしている)。ブラウザを起動させるような実装にすると、Raspberry Piなどの組み込みっぽい製品で動かすのがしんどくなってくるので出来ればやりたくないのだが…。

データベースはH2で十分だろう。

暇をみつけてちょくちょく作業し、なるべく早期に使えるものにしたい。