我が家の家計簿システムについて

この記事はカレーのち ぴょこりんクラスタ Advent Calendar 2018のために書いたものです。 ちなみにこのAdvent Calendarが何なのかについては、主催者による紹介記事をみてください。

サマリ

  • 我が家の家計簿(支出しか記録してないけど)システムについて紹介する
  • 家計簿システムの機能
    • 月ごとの累計支出額計算
    • 月ごとの各自の負担分の計算
    • 支出状況の可視化

はじめに

お金を貯めたい、でも貯まってる感がない。ボーナスでなんとなく貯まることもあれば、 財形で別口座に逃がしているという謎の安心を感じることもある。 そう、俺たちは雰囲気で家計をやりくりしている。

例えば、こんなことはないだろうか。

  • 今月は飲み会多かったけど飲み会だし大したことない
  • 今月は自分へのご褒美だから出費は多少増えているけど費用対効果は高いのでOK
  • 今月はボーナス出たからだいたいプラマイゼロかプラスになっているはず
  • 毎日コーヒーを買うくらいの自由はあるし、まあそんなに高くないから大丈夫でしょ

こんな感じの理屈で自分を納得させたことは数え切れないほどあるはずだ。 これらの共通点は定量性のなさだ。定量的に把握できないから、雰囲気でやりくりすることになってしまう。

お金を使うことは問題ではない。いくら使っているかわからないのが問題である。 いくら使っているのかわからないと、毎月赤字なのか黒字なのかわからない。だから、お金が貯まらない。 そんな状況を脱出するためには、まず自分が何に対して使っているのか知らなければならない。

収支を知るための道具の1つに、家計簿がある。 今回は、家計簿への支出の記録・集計・可視化のために何をやっているかをまとめる。

家計簿システムの要件と実現方式

以下の表にまとめる。

# 分類 要件 実現方式 理由など
1 記録 家族が各自支出を入力できる Zaimの共通アカウントを用意して、それぞれのスマホからZaimアプリで入力する 使ったことがあったから
2 記録 過去データの取得 自作の取得ツール ZaimにはRead onlyだけどAPIがあるから。手動は絶対に続かない。
3 記録 過去データの保存 SQLiteの利用 慣れてるPythonから特別なライブラリ不要で使えて、あとで加工も簡単にできそうだから。何より新しくデータベースをインストールして依存関係を増やすのが嫌だから。
4 集計 各自の支出分と負担分を算出する 自作の計算ツール Zaimの共通アカウントにはそういう機能がないため
5 可視化 集計結果の表化 Google Spreadsheet + 自作のアップロードツール どこからでもブラウザがあれば見られるから。あと、最悪Zaim乗り換えても、Google Spreadsheetは乗り換えないから。
6 可視化 集計結果のグラフ化 Redash SQLiteをデータソースとして選択できて、それなりに開発がされてそうだったから。あと、ブラウザから結果を見るのはもちろん、SQLクエリも書けるから。

我が家の家計簿システムの概要

我が家の家計簿システムの概要は以下の図のとおり。

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

使い方は以下のとおり。

  • 記録・集計
    1. 各自がZaimのアプリから逐次支出を記録
    2. 毎日1回、Zaimのサーバからデータを取得して、SQLite3に反映
    3. 毎月最終日には、その月分の支出をまとめてGoogle Spreadsheetにアップロード
  • 可視化された結果の確認
    1. 月の初日に、各自の支出額、負担額を確認
    2. 週1回くらい*1に今月の支出状況の確認

家計簿システムのソースコード

github.com

Google Sheets APIのサンプルを流用して作ってるので、Apache License。 個人情報っぽいところは全部落とした・・・はず・・・。 正直申し訳ないのは、githubに上げたにも関わらず他人が使えるような状態じゃないところで、 ある意味技術ポエムと言うべきものになっている*2

道具の紹介

ここでは使ってるもの、作ったものについて紹介する。

Zaim

Zaimとは、有名な家計簿アプリの1つ。 我が家では、家族用アカウントを作って、それぞれのスマホから入力するようにしている。 見た目はわかりやすいし、入力にも困らないので、他*3を試すことなく使い続けている。

だいたいにおいて困らないZaimだけど、いくつかいまいちな点がある。例えば以下。 - APIがRead Onlyなところ。定期的な固定出費(例えば家賃とか)を自動入力したい。 - 誰が入力したかわからないところ。そのせいでカテゴリをかなり細かく分けざるを得なかった。 - カテゴリの追加が面倒。

Google Spreadsheet

もはや説明はいらない。本当に便利でありがたいですね。 家計簿以外に何かを集計したり、作業リスト代わりにしたりと、我が家では大活躍。

SQLite

SQLデータベースエンジンの実装の1つ。データベースエンジンと言っても、単にライブラリPythonさえあれば使えるので、今回のような小規模利用で依存関係増やしたくない場合にちょうどいいと思う。

Redash

データ可視化ツールの1つ。きれいなグラフを作ってくれるし、Dockerイメージも配布されているので導入も簡単。 案外、SQLiteがデータソースに選べる可視化ツールはあまりなくて、選択肢は実質これくらいだったような気がする。

自作ツール

ファイルとやってくれること

以下のとおり。

  • get_zaim_auth_key.py: ユーザが直接実行する
    • ZaimのAPIキーを取得してくれるが、完全自動じゃない(いまいち)
  • db_build.sh: ユーザが直接実行する
    • 現在あるデータベース(固定でzaim.db)を消す
    • SQLiteファイルを作成する(実際に処理をするのはdbgen.py)
    • Zaimから過去データを吸い上げてSQLiteファイルに格納する(実際に処理するのはzaimapi.py)
  • dbgen.py: ユーザが直接実行しない
    • SQLiteファイルを作成する
  • gspread.py: ユーザが直接実行しない
    • Google Sheets APIを叩いて、Zaimから取ってきたデータをアップロードする
  • zaimapi.py: ユーザが直接実行しない
    • Zaim APIを使ってデータを取得する
    • 取得したデータをSQLiteに格納する
  • zaim.py: ユーザが直接実行することもある
    • Zaim APIを使ってデータを取得し、SQLiteを更新する(実際に処理するのはzaimapi.py)
    • 各自の負担分を計算する
    • (指示されたときだけ)Google Sheets APIを使って、データをアップロードする(実際に処理するのはgspread.py)
  • kakeibo.sh: ユーザが直接実行する
    • zaim.pyをキックして出力をログファイルに残す(ずっと残り続けるのでいまいち)
    • 最終日かどうかを判定して、Google Sheets APIを叩くかどうか決める
  • packages.txt
    • pipで使っているパッケージ群

使い方の流れ

以下、全てcloneしたディレクトリ直下にいることを前提とする。 カテゴリ作成と認証が面倒だけど、最初1回だけなので耐える。

Zaimでのカテゴリ作成

負担分を明確にするには、誰が何のために払ったかを明確にする必要がある。 Zaimのいまいちなところは誰が払ったかわからないところなので、そのための情報を カテゴリにいれる。つまり、入力者分だけカテゴリを作らなきゃいけないので重労働が発生する。 さらに、個人出費も記録できるようにするため、さらにその倍カテゴリを作らなければならない。これは苦役である。

githubソースコード上は、alphaさんとbetaさんの2人で記録するという体にしてある。

ZaimのOAuth認証~DB作成まで

一部蛮族的操作が必要なのはすまない気持ちでいっぱいだが、初回1回だけなので耐える。

  1. Zaimの開発者アカウントを作成する(単にログインすればよい)
  2. ここを参考にZaimアプリケーションを登録し、Consumer IDとConsumer Secretを入手する
  3. 入手したConsumer KeyとConsumer Secretを、.credentials/zaim_secret.jsonに以下のように記入する gist.github.com
  4. get_zaim_auth_key.pyを実行すると、認証用URLが表示される。ブラウザでアクセスする。
  5. ログイン後、get_zaim_auth_key.py内のcallback_urlで設定したURLへリダイレクトされるが、リダイレクト先をちゃんと作ってないとアクセスに失敗する。 失敗しても慌てず、ブラウザのURLを見て、oauth_tokenとoauth_verifierをメモする。
  6. .credentials/zaim_secret.jsonを更新する gist.github.com
  7. db_build.shを実行し、SQLiteファイル(zaim.dbという名前で作成する)を作成する。このスクリプトは指定日(YYYY-MM-DDで指定)から今日までの全部のデータを取得するので、 自分が取得したい日を引数で指定する。

Google Spreadsheetの認証~Zaimからデータ取得~Google Spreadsheetへのアップロードまで

  1. これとかこのあたりを読んで、 sheet IDとか、client_secret.jsonを入手しておく。入手したら、gspread.pyのSPREADSHEET_IDとCLIENT_SECRET_FILEを変更する。
  2. ./zaim.py --spreadsheet --noauth_local_webserverを実行すると、Zaimからデータ入手したあと、SQLiteを更新する。
  3. --spreadsheetオプションを付けているので、SQLite更新後、Google Spreadsheetにアップロードしようとするが、初回はOAuthのトークンがないので、 トークン取得処理が走る。ここのサンプルコード実行時みたいに、認証URLが出るので、指示に従う。
  4. 認証がうまくいくと、"YYYY-MM"という名前のシートができていて、以下が入力されているはず。
    • それぞれが支払った金額
    • それぞれが分担する金額
    • 清算金額
    • Zaimで入力したデータ

Redashを用いた可視化

こんな感じのものが日々更新されていく。以下の画像は雰囲気だけの例。

f:id:nbisco:20181209091906p:plain
redashでの表示例

  1. Redashコンテナを起動する。自力で入れてもよいが、依存関係解決がけっこう大変だと思うので、コンテナがおすすめ。
  2. データソースにzaim.dbを指定する。
  3. 自分の好きなようにSQLで集計する。

日々の動作

kakeibo.shを実行する。cronとかに登録しておくと楽でよい。 入力漏れとかでシートを作り直すときは、ブラウザでシートを消してから実行する必要がある(これもいまいちだけどたまになので残っている)。

これを作って変わったこと

  • プラス
    • 自分たちのやりくりの実力がわかるようになった
    • いくら使うかだいたいわかるので、先々の計画が立てやすくなった
    • 何を減らすべきかを雰囲気でなく数字で考えられるようになった
  • マイナス
    • "あっ、こんなになんで使っちゃったんだろう(悲しみ)"みたいな気持ちになってしまうことがある。強い心が必要。

おわりに

支出が追いかけられるようになり、自分たちが雰囲気に流されることは減ったが、 それでも使うときは使っちゃうし、記録できてもダメなときはダメという感じである。 ただ、先々の計画が立てやすくなったのは本当によかった。

*1:最近は気が向いたときになってしまっている・・・

*2:自分の書いた記事に技術ポエムじゃないものが果たしてあっただろうか

*3:例えばマネーフォワードとか

ハリーポッターの感想の変遷

この記事はカレーのち ぴょこりんクラスタ Advent Calendar 2018のために書いたものです。

まとめ

年齢とともに感想は変わるし、名作は何度読んでもおもしろい。

中学生

大学生

  • 爆発したりしない分刺激が足りない
  • 実用的な魔法がそろってて文化の違いを感じる
  • ハリーポッターが生意気だしきちんと教育すべき
  • どうしてスネイプ先生主人公じゃないの???

社会人

  • よく考えてみればポッターはまだ10歳、年齢の割にしっかりしてるし、多少生意気だったり調子に乗るのは仕方ない
  • ダーズリー家に入れた判断は正しかった、こんな調子でちやほやされるとろくなことがなさそう
  • マルフォイ見てると、バック・トゥ・ザ・フューチャーのBiff一味を思い出す。成敗されないところが違う点だな。

おわりに

好きなシーンは何回読んでも変わらなくて、スネイプ先生がダンブルドアの前でエクスペクトパトローナムするところです。 10年たったらまた読もう。

グローバル変数を横から覗く

この記事はカレーのち ぴょこりんクラスタ Advent Calendar 2018のために書いたものです。

サマリ

Linux/proc/${pid}/memを使って、グローバル変数を読み書きするものを作りました。 ptraceを使わなくても読み書きできます。使い方は以下のとおりで、WRITE_VALUEを省略すると リード、WRITE_VALUEを書くとライトします。1、2、4、8バイトの変数に対応できますが、 配列の途中とか構造体のメンバ変数はまだダメです。ELFバイナリを読むので、 C/C++などで作ったバイナリでないと動きません。

# ./gvtool.py </path/to/binary> <PID> <GLOBAL_VARIABLE_NAME> {<WRITE_VALUE>}

ソースコードはこちら。 github.com

動作はこんな感じです。

背景など

プログラムをチューニングする場合、パラメタをどこに置くかは結構悩ましい問題ですが、 ともかく手を抜くことを考えた場合、グローバル変数にえいやと書いてしまうことがあります*1

そのグローバル変数gdbなどのデバッガで書き換えながらいろいろ動作させるんですが、 デバッガを使うのが億劫なケースがたまにあります。例えば、他のプログラムと連動するようなものをチューニングする場合です。 デバッガを使う場合は、変数書き換え時に逐一プログラムをbreakする必要があるので、 タイミングによっては連動する他のプログラムが異常終了してしまうことがあります。 また、デバッガはインタラクティブに動かす必要があったりで、自動化がちょっとやりにくいというのもいまいちですね。

そういうちょっとした面倒さを解決するために、今回このgvtool.pyを作りました。 pet.py*2がELFを読むためのもの、gvtool.pyが/proc/${pid}/mapsを読んだり/proc/${pid}/memを読み書きするためのものです。

どうやって実現しているか

概要

要はメモリのある一部を書き換えるだけなので、メモリアドレス(=先頭アドレスとオフセット)さえわかればいいわけです。 つまり、シンプルに以下の3ステップでできます。

  • ELFバイナリのシンボルテーブルからアドレスのオフセットを求める
  • /proc/${pid}/mapsで先頭アドレスを調べる
  • 先頭アドレスとオフセットがわかったので、/proc/${pid}/memを読み書きする

ELF: Executable and Linkable Format

Linuxで採用している実行可能なバイナリのフォーマットです。 ELFには、シンボルテーブルと呼ばれる、変数の名前とメモリ空間上のオフセットを 保持しているセクションがありますので、そこを直接読みます。

シンボルテーブルのエントリのフォーマットは、 身近なところだと/usr/include/elf.hに載ってます。64bitだと以下のようになっていて、 ここのst_valueのところがアドレスオフセットになります*3

typedef struct
{
  Elf64_Word    st_name;        /* Symbol name (string tbl index) */
  unsigned char st_info;        /* Symbol type and binding */
  unsigned char st_other;       /* Symbol visibility */
  Elf64_Section st_shndx;       /* Section index */
  Elf64_Addr    st_value;       /* Symbol value */
  Elf64_Xword   st_size;        /* Symbol size */
} Elf64_Sym;

シンボルテーブルはデバッグ情報ではないので、-gをつけてコンパイルしていなくても読めます。

/proc/${pid}/maps

Linux Kernelが提供する、プロセスのメモリマップを教えてくれる疑似ファイルです。 例えばこんな感じで見えます。左から、

  • メモリの開始アドレス
  • メモリの終端アドレス
  • パーミッション
  • ファイルのオフセット
  • バイス番号
  • inode
  • ファイルパス

です。詳しくはここ

/home/bisco% cat /proc/$(pidof a.out)/maps
5591a7f3e000-5591a7f3f000 r--p 00000000 00:15 103135   /home/bisco/test/a.out
5591a7f3f000-5591a7f40000 r-xp 00001000 00:15 103135   /home/bisco/test/a.out
5591a7f40000-5591a7f41000 r--p 00002000 00:15 103135   /home/bisco/test/a.out
5591a7f41000-5591a7f42000 r--p 00002000 00:15 103135   /home/bisco/test/a.out
5591a7f42000-5591a7f43000 rw-p 00003000 00:15 103135   /home/bisco/test/a.out
5591a9395000-5591a93b6000 rw-p 00000000 00:00 0        [heap]
7f32b4401000-7f32b4423000 r--p 00000000 00:15 46396    /usr/lib/libc-2.28.so
7f32b4423000-7f32b456e000 r-xp 00022000 00:15 46396    /usr/lib/libc-2.28.so
7f32b456e000-7f32b45ba000 r--p 0016d000 00:15 46396    /usr/lib/libc-2.28.so
7f32b45ba000-7f32b45bb000 ---p 001b9000 00:15 46396    /usr/lib/libc-2.28.so
7f32b45bb000-7f32b45bf000 r--p 001b9000 00:15 46396    /usr/lib/libc-2.28.so
7f32b45bf000-7f32b45c1000 rw-p 001bd000 00:15 46396    /usr/lib/libc-2.28.so
7f32b45c1000-7f32b45c7000 rw-p 00000000 00:00 0
7f32b45cf000-7f32b45d1000 r--p 00000000 00:15 46385    /usr/lib/ld-2.28.so
7f32b45d1000-7f32b45f0000 r-xp 00002000 00:15 46385    /usr/lib/ld-2.28.so
7f32b45f0000-7f32b45f8000 r--p 00021000 00:15 46385    /usr/lib/ld-2.28.so
7f32b45f8000-7f32b45f9000 r--p 00028000 00:15 46385    /usr/lib/ld-2.28.so
7f32b45f9000-7f32b45fa000 rw-p 00029000 00:15 46385    /usr/lib/ld-2.28.so
7f32b45fa000-7f32b45fb000 rw-p 00000000 00:00 0
7fff149b7000-7fff149d8000 rw-p 00000000 00:00 0        [stack]
7fff149d8000-7fff149db000 r--p 00000000 00:00 0        [vvar]
7fff149db000-7fff149dd000 r-xp 00000000 00:00 0        [vdso]

グローバル変数は、heapでもstackでもなく、bssという領域にあります。 bssという領域は読み書きできるので、上から5番目の領域にいそうだな、ということが何となくわかりますね。

シンボルテーブルに載っているオフセットは、x番目の領域のオフセットではなく、先頭からのオフセットです。 a.outのグローバル変数にアクセスしたければ、a.outの先頭アドレス(例で言うところの0x5591a7f3e000)がわかればよいです。 この先頭アドレスに、 シンボルテーブルから得られたオフセットを足せばメモリアドレスがわかります。

/proc/${pid}/mem

Linux Kernelが提供する、プロセスのメモリ空間へアクセスするための疑似ファイルです。 setuid-rootなバイナリ(例えば実行者がrootとか)であれば、 プロセス${PID}をbreakすることなくメモリの読み書きが可能になります。 書き込みが可能になったのはKernel 2.6.38-rc8(2011/03/08)からであり、 昨今の大抵のディストリビューションで使えます。

以下、LKMLより抜粋。デバッグ用途で使ってくれとのことみたいですね。

  This patch series enables safe writes to /proc/pid/mem.  Such functionality is
  useful as it gives debuggers a simple and efficient mechanism to manipulate a
  process' address space.  Memory can be read and written using single calls to
  pread(2) and pwrite(2) instead of iteratively calling into *ptrace(2)* 
  In addition, /proc/pid/mem has always had write permissions enabled, so clearly it
  *wants* to be written to

まとめ

  • /proc/${pid}/mem/proc/${pid}/maps、シンボルテーブルの情報があれば、動いているプログラムのグローバル変数を読み書きできる

*1:そんなことはしないのが一番だと思いますが

*2:Python Elf Tool

*3:バイナリの種類によっては意味が違いますが、ここでは触れません

ゴルフを始めるときに買ったもの

この記事はまたまた!ぴょこりんクラスタAdvent Calendarのために書いたものです。

はじめに

今年からゴルフを始めた。結局最初に何が困るかと言うと、何を買えばよいか、である。この記事では自分が買ったもの、買えばよかったなと思ったものを書いておく。

買ったもの(最低限これだけあれば大丈夫)

  • ゴルフクラブセット
    • 安くてもいいのでひとそろい買う。何でもよいのでひとそろい持つことが重要。Amazonの最安とかでよい。
    • 材質が選べる場合、男性であればスチール製(重くしなりにくいので、ブン回しがちな男性向け)、女性であればカーボン製(軽い)がよさそう。男性がカーボン使ってもよいけど、しなるので打ちにくいかもしれない。
  • ゴルフボール
    • ロストボールが安く売ってるので、まずはそれを1ダースくらい買っておく。どうせ変なところに打ち込んでなくすので、量があるのが正義。
    • 黄色とかピンクとか派手なのがあって驚いたけど、実際派手なやつは目立ってわかりやすいしよい。
  • ゴルフシューズと専用袋
    • 紐で締めるものよりも、ダイヤルで締めるやつが圧倒的に楽なのでおすすめ。
    • スパイクなので、専用袋があったほうがよい。ビニール袋は破れちゃうから。
    • 歯が金属じゃないほうがいいらしいが、理由を聞き忘れた。
  • ゴルフ用ポロシャツ
    • ゴルフ用とは言うもののユニクロでも大勢に影響はない。
    • 真っ赤なやつとか派手なものでも全然気にならない。ゴルフファッションは現実と違うのだ。
  • ゴルフ用パンツ
    • ユニクロのチノパンでも見た目はまあ大丈夫だけど、動きやすさとか材質の違いとかあるので、ゴルフ用のほうがよさそう。
  • ゴルフ用帽子
    • サンバイザーがおしゃれ感あるけど、日除け兼ボール当たったとき用に帽子のほうがよい。
  • ティー
    • ボールを載せるやつ。長い(ドライバ用)のと短い(アイアン用)のがあるので、どちらも買う。これも安いやつでよい。すぐになくなったり折れたりするので、数を持っておく。

買ったもの(あるとよいもの)

  • 宅配便用ゴルフバッグカバー
    • ゴルフバッグをかついでゴルフ場に行くのは大変困難なので、宅配便を使って送る。その際にあると汚れたりしないし、伝票いれるところあるしで便利。
  • ゴルフ用レインコート
    • ゴルフは雨でもやるので、雨だとわかっているなら買っておく。専用品は蒸れにくいので、専用品を買うべき。一般品を買うと蒸し風呂のなかでプレイすることになってしまうらしい。

買ってないけどあるといいもの

  • 小物入れ
    • ゴルフボールとかティーを持ち歩く用。ポケットにいれてもよいが、個人的にポケットに物をあまりいれたくないので欲しい。

買わなくても何とかなるもの

  • グリーン用ボールマーカー
    • 他の人がパター打つ際、ボールが邪魔にならないようにどかすことがあるんだけど、そのときに自分のボールがどこにあったかをマークしておくもの。 たいていのゴルフ場に簡易なものがあるのでそれを使ってもよい。
    • 自分専用のものだとわかりやすいという利点はある。

おわりに

ものを揃えるのにお金がかかるけど、やってみると楽しいのでみんなやりましょう。

Google SpreadsheetにPythonから書き込んでみる

この記事はまたまた!ぴょこりんクラスタAdvent Calendarのために書いたものです。

はじめに

家計簿にZaimを使っているんだけど、いろいろ数字をこねたくなったので、Google Spreadsheetにデータを放り込みたい。 csvで落としてきて、それをGoogle SpreadsheetへAPIを使って書き込むようにしたときの話。

手順1: APIキーの発行

まずはAPIキーを発行しなければならない。意外に古い情報しかなくて、 このへんのを複数見ながらえいやでやった。大きな差分はないけど、 Google Drive APIではなくSpread sheet APIがあるのでそちらを選ぶようにする。 参考にしたのは以下の3つで、いちばん上のものが最も参考になった。

手順2:サンプルコードを動作させる

だいたいの野良サンプルにおいて、gspreadというPythonのライブラリを使っているけど、 更新が止まっていていまいちなので、本家のサンプルをまずは動かす。 Python2.6 or greaterとなっているので、何も考えずに従えばよい。

https://developers.google.com/sheets/quickstart/python

サンプルを何回か読むと意味がわかってくると思う。 何か指示するときはjsonを作ってPOST(多分)し、結果をjsonで得る、とそんな感じだ。

手順3:薄いラッパーをかぶせる

いくつかGoogle spreadsheet用Pythonライブラリがあるみたいだけど、 意味がわかってしまえばそんなに難しくはないので、自分でラッパーを作る。 直接APIを触ろうとすると、全体の流れがわかりにくくなるし、何より似たような定形文で 画面が埋まるのはよろしくない。

ラッパーと言っても大層なものではなく、渡したパラメタをjsonに埋めていく、とそんな程度のものである。 ラッパーは以下参照。サンプルコードをほとんど流用していることがわかると思う。 おそらくいちばん面倒であろう認証のところを隠してくれているので、そもそもやることがあまりないというのが 実情である。自分で作ったのはcreate_new_sheetメソッドとappend_dataだけ。 あまり隠せてないけれど、目的達成には十分。

gist.github.com

手順4:動かしてみる

動かしてみるとめちゃめちゃ遅い。数分くらい待たされるんだけど、これはいったい・・・?という感じで、 リアルタイムに使うのは厳しいかもしれない。APIキー登録のときに、どういうアプリケーションで使うのかと聞かれて、 daemon or cronみたいな項目をえらんだせいで後回しになっているのかもしれない。Web appを選んだらよかったかもね。

おわりに

google spreadsheetには書き込めるようになったけど、Zaimからのダウンロードが自動化できていないのでまだ微妙な感じ。 ただ、コピペよりはいくぶんましになったと思う。

リッツパーティをセルフホストした話

この記事はまたまた!ぴょこりんクラスタAdvent Calendarのために書いたものです。

はじめに

リッツパーティをセルフホストした。つまり何が言いたいか。このパーティに客はいない。

作ったもの1:スモア

スモアとはバーベキューでよくやる手作りデザートのことで、焼きマシュマロをクラッカーで挟んだもののことを言う。焦げ目のついたマシュマロとチョコレートの溶けたものがおいしさを生む、コスパ優秀なお菓子である。なお、炭火の上でやる場合は1ミスは覚悟したほうがよい。マシュマロは簡単に溶けて落ちるからだ。クラッカーのみをかじる侘しさは想像に難くないだろう。

調理にコツがいるスモアであるが、トースターなりオーブンなりがあれば割と簡単(焼き具合の微調整はいるけれども)に量産できてしまうので、リッツパーティにはうってつけのお菓子である。感覚的には、トースト1枚軽く焼くくらいの設定がちょうどよい感じ。 リッツは穴が開いていて、マシュマロなりチョコレートなりが溶け出している場合があるので、手に取る際には注意されたし。あんな小さな穴から出てる分だけであっても、出来立ては熱く、やけどしがちである。

作ったもの2:チーズのせたやつ

甘いものだけというのも何だったので、ハムを千切って載せた上にとろけるチーズと黒胡椒をまぶしたやつを作った。黒胡椒の辛みとハムの塩気がたまらない一品で、コーヒーではなくビールを用意すべきだったと少し後悔した。

完成品

写真力がかぶと虫くらいしかないので、どことなくまずそうに見えるのはご容赦ください。味はよかった。

f:id:nbisco:20171210124018j:plain

今年飲んだおいしいお茶

この記事はまたまた!ぴょこりんクラスタAdvent Calendarのために書いたものです。

はじめに

今年飲んでおいしかったお茶について書く。だいたいにおいて貰い物である。

麦茶

夏といえば麦茶というくらいのありふれた飲み物で、味には大差ないようなイメージがあるが、それは間違い。 おいしいものは本当においしいし、いまいちなものはいまいち。

これまで、麦茶パックは質より量重視で安いものを買っていたけど、これを飲んでからはずっと同じものを買い続けている。 口当たりがよく、また、香ばしさが段違い。食事にもお菓子にも合う。

www.k-daichi.com

紅茶

紅茶なんてこれまでほとんど飲まなかった。コーヒーにしますか?それとも紅茶にしますか?と聞かれて ノータイムでコーヒーと答えるくらいにはコーヒー派だったけど、これを飲んでからは 紅茶も悪くないと思うようになった。淹れるのが面倒っちゃ面倒だけど、苦くなく、また、香りがきつくなく、 すっきりと飲める。牛乳を入れてミルクティにするのがおすすめ。

www.whittard.co.uk

おわりに

世の中まだまだ知らないおいしいものに溢れている。食わず嫌いはやめよう。