さて、前回の続き、今回もPerlによる超手抜き家計簿の実装法を紹介する。

前前回は、レンタルサーバーにSSHログインして自作のPerlスクリプトを起動すると、任意のテキスト・ファイルにTwitterのタイムラインが書き出されるところまで書いた。

前回は、同じプログラムをメールで起動し、結果をWebサーバーで見る、そして.htacessを使ってパスワードロックする方法と、iPhoneから定型メールを送るアプリKaelMail(AppStore)、パスワードが掛かったサイトをカンタンに表示する1Password(AppStore)の紹介をした。

今回は、Twitterを使った家計メモを、実際の家計簿に組み立てるための設計について書く。
現状では、テキストファイルの中身はこんな感じである。

 CoCo壱番館 チキンカツカレー 870円
 ファミマ野毛 コーヒー 120円
 ランドマーク郵便局 切手 400円

いわばツイートの生ログであって、お金を使った場所、金額がダラダラ入っているだけで、いつ使ったかも分からない。
いつ使ったかは、実はツイートの時刻を取れるので、それを使えばいいとも思うが、実際にはちょっと前に使ったお金を思い出して入れたい場合もあるだろう。
また、お金を使う前に財布にいくら入っていたかもわからないので、残高も出せない。

計算を実装する前に、ある程度ユーザー・インターフェイスを設計しないといけない。
この設計が結構、予想外に難しいことがある。
まあ、自分で作るプログラムを自分で作るので、あまり凝る必要はないし、自分ちゃんは気心がしれているので、苦労は比較的少ない。



家計簿の解決すべき問題は以下のようだろうか。
・お財布の残高を一定金額にリセットするにはどうすればいいか?
・お店の名前を省略するには?
・品物の名前を省略するには?
・金額は必須入力するとして、金額がないツイートをプログラムが無視するには?
・買い物をした日付、時刻の入力はどうするか?
・日付を省略したら今日にしたい
・時刻を省略したら現在にしたい

で、こうしてみた。

・行頭、スペース、行末で囲まれたものを「語」とする

・「語」が数字+"円"で構成されている場合「金額」とする
・「金額」がないツイートは無視する

・「語」が"YYYY-MM-DD"で構成されている場合「日付」とする
・「日付」がないツイートはツイートした日を「日付」とする

・「語」が"HH:MM"で構成されている場合「時刻」とする
・「時刻」がないツイートはツイートした時刻を「時刻」とする

・「日付」だけ指定して「時刻」がないツイートは、朝5時を時刻とする。

・「金額」「時刻」「日付」でない最初の「語」を「店名」とする
・「店名」がないツイートは「店名」を"?"とする

・「金額」「時刻」「日付」でない二個目の最初の「語」を「品名」とする
・「品名」がないツイートは「品名」を"-"とする

・「店名」が「残高設定」のツイートのうち最後のものの「金額」を「残高」とし、それ以前のツイートは無視する
・それ以降の「店名」が「残高設定」以外のツイートが発生したら、「金額」を残高から引く
言葉で書くと分かりにくいが、実際の運用ではこうなる。

2012年03月12日の午前9時に、財布の中身を5000円にしたとする。
この瞬間に「残高設定 5000円」とツイートすると、それ以前のツイートは無視されるので、この時点で家計簿を取得するとこうなる。

 日付    時刻  店舗   品目 金額  残高
 2012-03-12 09:00 残高設定 -  5000円 5000円

同日12時に、ココイチでカレーを食べた。900円だった。
この瞬間に「ココイチ カレー 900円」とツイートすると、家計簿はこうなる。

 日付    時刻  店舗   品目   金額  残高
 2012-03-12 12:00 ココイチ カレー   900円 4100円
 2012-03-12 09:00 残高設定 -    5000円 5000円

ところが、10時に駅で150円のコーヒーを飲んだことを忘れていた。
ここで「10:00 コーヒー 150円」と入れてみると、家計簿はこうなる。

 日付    時刻  店舗   品目   金額  残高
 2012-03-12 12:00 ココイチ カレー   900円 3950円
 2012-03-12 10:00 コーヒー -     150円 4850円
 2012-03-12 09:00 残高設定 -    5000円 5000円

間違えて「品名」をコーヒーにしてしまった。
この場合はTwitterの機能でさっきの「10:00 コーヒー 150円」を消せばよい。
ここでもう一度家計簿を取得するとこうなる。

 日付    時刻  店舗   品目   金額  残高
 2012-03-12 12:00 ココイチ カレー   900円 4100円
 2012-03-12 09:00 残高設定 -    5000円 5000円

そのあとで改めて「10:00 ドトール コーヒー 150円」などと入れる。

 日付    時刻  店舗   品目   金額  残高
 2012-03-12 12:00 ココイチ カレー   900円 3950円
 2012-03-12 10:00 ドトール コーヒー  150円 4850円
 2012-03-12 09:00 残高設定 -    5000円 5000円

さて、13時に財布を見てみると3850円しかなかったとする。
100円どこかで落としたのかもしれないし、誰かに盗られたのかもしれないし、何かお菓子を買い食いした後でアタマを強く打ったのかもしれない。
どうしても何に100円使ったか思い出せない。
この場合は「残高設定」で3850円にする(今日の家計簿はここからにする)でもいいけど、それだとここまで真面目に入力してきたのがもったいないので、使途不明金を100円起票しても良い。
この場合は「100円」とツイートすると、「店名」も「品名」も不明になる。
家計簿はこうなる。

 日付    時刻  店舗   品目   金額  残高
 2012-03-12 13:00 ?    -     100円 3850円
 2012-03-12 12:00 ココイチ カレー   900円 3950円
 2012-03-12 10:00 ドトール コーヒー  150円 4850円
 2012-03-12 09:00 残高設定 -    5000円 5000円

これでなんとか家計簿としての最低機能は整っているだろうか。現状での不足点は以下の通り。
・入金が管理できない
・財布しか管理できない(銀行口座、カード、パスモ、タンス口座がない)
・費目や備考などがない
・ツイッターから入力している。非公開とは言え不安
・Webで見ている。パスワードロックしているとは言え不安

まあ、一個一個解決していこう。
ということで、今回は一行もプログラムを書かないで終わってしまった。
スミマセン。

Subscribe with livedoor Reader
Add to Google
RSS