家計簿システムをアップデートした話

この記事は、ニューノーマル ぴょこりんクラスタ Advent Calendar 2020 のために書いたものです。 このAdvent Calendarが何なのかについては、主催者による紹介記事を見てください。

はじめに

我が家はZaimを使って家計簿をつけている。 Zaimは結構使いやすいと思うのだけど、以下の機能がない。

  • 集計:誰が何に対してどれくらい払ったかを集計する機能。複数人でZaimを使う場合、 基本的にはアカウントを共有することになるので、誰が払ったか集計できない。
  • 算額計算:担当分と支払い分の差額を表示する機能。
  • 定期ポスト:Amazon Primeとかの固定料金・定期支払に対して、自動で登録する機能。

幸いなことにAPIを公開してくれているので、手作りツールで この機能を補っていたのだけど、ちょっと複雑なことをしようとすると、 サーバログインしてスクリプトを叩いたりする必要があったり、 おしゃれ棒グラフは細かい数値が見れなかったりで、案外使い勝手が悪かった。 そこで、Goの勉強も兼ねてブラウザで触れるインタフェースを取り付けることにした。

前回からの改善点まとめ

結局何が不満で、どう変えたのかをまとめるとこんな感じ。

不満点 改善点 備考
先月のデータ再集計にサーバにsshでログイン不要にしたい 誰でもブラウザから再集計できるようにした たいてい当月中に更新しきれないので、毎月手作業で再集計していた
月1以上の頻度で可視化したい スプレッドシートに月1でアップロードするのではなく、アクセス時に毎回計算させるようにした 算額調整をしたい場合があり、現時点での精算額を見たかった。
赤字か黒字か知りたい 月ごと、年ごとにわかるようにした 家計簿つけてたのに赤も黒もわからないというのはちょっと・・・
定期支払いの編集にサーバにsshでログイン不要にしたい ブラウザからできるようにした 自分だけが使うわけではないので・・・
スプレッドシートは携帯で見るにはつらい 情報を落としたり整理して見やすくした

出来上がりはどんなもの?

画面構成は以下の通り。

  • トップ画面(今月のサマリ)
    • 通年サマリ
    • 定期支払い
      • 定期支払い入力

トップ画面(今月のサマリ)

一部抜粋した画面は以下の通り。

f:id:nbisco:20201212164126p:plain
トップ画面の概要

ポイントを以下にまとめる。

  • アクセス時に集計して表示するので、逐一集計支持をしなくてよいようにした。
  • 今月の収支を一番上に持ってきて、赤字か黒字かをわかるようにした。
  • 特によく見たいと思う精算額とジャンル単位の細目を2番目に持ってきた。個別項目を見るのは、ジャンル単位の集計結果が思ったより大きいな、と感じたときくらいであまり見ないので最下にまとめた(画像からも省略した。本当は担当金額の下にある)。
  • DB更新リンクをクリックすると、Zaimから情報を落としてきて、DBのデータを最新のものにできるようにした。ただ、あくまでDBのデータ更新するだけなので、画面は手動リフレッシュする必要がある。

通年サマリ

自分たちはこの1年赤字なのか黒字なのかを知りたくて作った画面。 ほぼトップ画面と同じだが、DB更新リンクがない。基本的に年単位でまるごとDB更新なんてしないし、 Zaimサーバに無用な負荷をかけないようにするため。

登録済定期支払い

f:id:nbisco:20201212164255p:plain
定期支払リスト

Amazon primeとか家賃とか、自動入力している項目を確認する画面。 右端の鉛筆マークをクリックすると編集画面に飛ぶようにしている。

クレカの履歴とかを連動させようかと思ったが、APIでは直接入力したデータしか 見られないようで*1、割り勘ができなくて困ったので、 手入力というか自動入力するようにしている。

Zaimに反映リンクは、文字の通り入力されている内容をZaimへ送信する機能。 二重登録をしないように、Zaimへ情報送信するスクリプトで何とかしている。

登録済定期支払いの追加・編集

f:id:nbisco:20201212164347p:plain
定期支払を追加する

ともかく入力はできるが、カテゴリやジャンルを正確に手打ちする必要があり、 ちょっといまいち。そのうち直すつもりだけど、使う頻度が少ない機能は改修が億劫になりがちだ。。。

ソフトウェアの作りについて

システムの構造

新しく作ったのはブラウザから触るところだけで、裏では元々使っているスクリプトをそのまま使うようにしている(下図)。冷静になってみると、これはまさに技術的負債の発生の瞬間なのではと言う感もある。よく言えば既存資産の活用である。

f:id:nbisco:20201212172316p:plain
家計簿システムの概要

Goで作った部分は家計簿データを読むだけにしたということもあり、表示時に毎回計算しているので、 通年サマリはちょっと時間がかかってしまう。まあ今のデータ量だと気になるほどではないので、シンプルさを優先した。

使った要素技術

ウェブフレームワークには、よく使われてそうなGinを使い、データベースとのやりとりにはgo-sqlite3で、 直接SQLを投げ込むようにしている。sqliteにしたのは、シングルバイナリでシンプルに管理したかったから。

当初はORMを使おうと思ったが、構造体の先頭を大文字にしないと他パッケージから使えないという初歩的な落とし穴にはまり、しかも原因がしばらくわからなかったので、トラブルなく動いたほうを選んでしまった。

文字が見やすくて、かつ導入が簡単なものにしたかったので、Javascriptなしにして、CSSsakuranormalize.cssというシンプルなものを使っている。

ソースコード

個人的なところを落とすのが大変だったのでアップロードは断念。。。

感想

  • 家計簿そのものについて
    • こういう出来映えの粗い感じのものでも、 普段の作業が楽になったので作ってよかった。 収支が可視化されるとつらいかなと思ったけど、 わからないときよりは安心感というか、 わかることで冷静になる部分もあるように感じた。
  • Goについて
    • Goは書きやすくてよい。テンプレ表現をもう少し覚えれば日常的に使える気がする。

*1:Suicaで試したらダメだった