青色申告にhledgerを使い始めた話(テキストベース会計のススメ)

今年は青色申告用の会計簿にhledgerを使っている。

去年はマネーフォワード クラウド会計を試したのだがあまり良い体験ではなかったのは前の記事で書いた通り。

vector.hateblo.jp

そういうわけで、別の会計ソフトを使うことにしたのだがその際の要件が下記のようになっている

  • 青色申告決算書に必要な集計済み情報が出力できる。ただしe-Taxに手で転記してもいいので国税庁のテンプレートにしたがった出力そのものができる必要はない
  • 経営の把握という意味での本来の会計機能は不要(フリーランスで収入に対する経費の割合が低いのであまり把握する意味がない)
  • UIが悪くないこと。ExcelやテキストベースなどでもOK
  • オフラインで使えること。税務と違い会計はそうそう仕組みが変化しないため、一度作業できるようにしたらそのまま何年も使い続けられるものが好ましい。クラウドサービスは頻繁に変更が入ったり、値上げしたり、サービス終了するリスクがある
  • できれば無料であること、ついでにExcelも持っていないのでExcelでないものでも使えること

そういう条件で調べるとPlain Text Accountingというやり方とソフトウェアがあるのがわかった

Plain Text Accounting とは

plaintextaccounting.org

こんな感じで複式簿記が付けられる。

2025-01-01 大家
  expenses:地代家賃         50000
  assets:cash

2025-01-03 JR東
  expenses:旅費交通費      200
  assets:cash            -200 ; ←この-200は付けても付けなくても同じ

ExcelCSVみたいに行志向ではなく、一つの記録が複数行になる。理由としては1行が長すぎると情報量的に手入力しづらい、幅が広くなりすぎる、追加情報を記述しづらいなどがありそう。その場合Yamlでもいいような気もするが、こういう形式が普及しているというならそれでいい

日本はともかく、英語圏では一定のユーザーがいるらしく情報もフォーラムも整っていてソフトも複数あるということで手を出してみた。

Hledger

おおむね3つ人気ソフトがあるらしい。Ledger (検索不能なためLedger Cliと書かれる), hledger, Beancountの3つだ。 Ledgerが一番古く2003年からある、自分はこれから試したがhledgerの方が便利な機能が多そうだったためhledgerを使っている。Beancountは試していない

ちなみにフォーマットは似通っているが、それぞれ拡張(といいつつ取引先の記述などの基本的な部分含む)はまったく互換性がないので、同じファイルで複数ソフトの相互利用は難しい

それぞれC++, Haskell, Pythonで書かれており、自分で手を入れられるように慣れてる / 使いたい言語で選ぶ人もいるらしいが、どれも活発にメンテされているのでそこまで気にしなくてもいい気もする

青色申告のためだけの会計簿の付け方

  • 1年単位でファイルを作る。hledgerは複数年にまたがった使い方もできるが、個人事業主の場合 1年単位で把握できれば良く、事業主借 / 事業主貸も年始に0にリセットするし現金や口座残高も専用口座がない場合は適当に設定するものであるため連続性は不要
  • 数年にわたる減価償却費がある場合だけは注意が必要。また減価償却費の計算もhledgerは実施できないため自分で計算して計上する必要があることに注意
  • hledgerにはcsvなどをインポートする機能もある、ただそのルールは自分で記述する必要がある。それなりに使えるがスクリプト言語などに慣れている人は慣れた言語で変換スクリプトを書いたほうが早いかもしれない
  • フォルダはgitなどで管理すると良い。Dropboxなどなんとなくでリビジョン管理してくれるソフトがあるのであればそれでもいいだろう
  • 消費税については自分はまだやっていないのでやるときに考える予定

2025.ledger

; 大項目にはデフォルト設定的に英語のassets / expensesなどの名前を使ったほうがいい
; とはいえ長いのでaliasで短縮する。このaliasはhledger独自機能
; 資産 / 経費 / 収入 / 負債
alias a = assets
alias e = expenses
alias r = revenue
alias l = liabilities

2025-01-01
  expenses:地代家賃         50000
  l:事業主借

; 取引先はhledgerでpayeeと呼称される
; | を使うと左側がpayee, 特に | を付けないと全体がpayeeになる
; 取引先を指定せずにメモだけしたい場合は "2025-01-03 | 新宿から池袋" のようにする

2025-01-03 JR東 | 新宿から池袋
  expenses:旅費交通費      200
  l:事業主借

2025-01-20 電気代 | 100000を按分
  e:水道光熱費     30000
  l:事業主借

; 収入
2025-01-25 取引先A
  a:bank       100000
  r:sales

; ちなみに日付の順番はバラバラでいい
; 自分は収入と支出や毎月固定の支出などは位置をなんとなくでグループ化しても見やすい
2025-01-01 取引先B
  a:bank       150000
  r:sales

2025-02-25 取引先A
  a:bank       100000
  r:sales

2025-02-01 取引先B
  a:bank       150000
  r:sales

cliでの操作はこんな感じ

$ export LEDGER_FILE=2025.ledger

# ざっくり
# 青色申告 損益計算書 / 貸借対照表

$ hledger bal
              500000  assets:bank
               50000  expenses:地代家賃
                 200  expenses:旅費交通費
               30000  expenses:水道光熱費
              -80200  liabilities:事業主借
             -500000  revenue:sales
--------------------
                   0  

# 月ごとの収入・支出
# 青色申告 月別売上(収入)金額及び仕入金額

$ hledger bal -M
Balance changes in 2025-01-01..2025-02-28:

                      ||     Jan      Feb 
======================++==================
 assets:bank          ||  250000   250000 
 expenses:地代家賃    ||   50000        0 
 expenses:旅費交通費  ||     200        0 
 expenses:水道光熱費  ||   30000        0 
 liabilities:事業主借 ||  -80200        0 
 revenue:sales        || -250000  -250000 
----------------------++------------------
                      ||       0        0 

# payeeごと
# 青色申告 売上(収入)金額の明細 / 仕入金額の明細
# ※Income StatementのExpensesには資産計上して減価償却するものが含まれないため注意

$ hledger is --pivot payee --sort-amount
Income Statement 2025-01-01..2025-02-25

          || 2025-01-01..2025-02-25 
==========++========================
 Revenues ||                        
----------++------------------------
 取引先B  ||                 300000 
 取引先A  ||                 200000 
----------++------------------------
          ||                 500000 
==========++========================
 Expenses ||                        
----------++------------------------
          ||                  50000 
 電気代   ||                  30000 
 JR東     ||                    200 
----------++------------------------
          ||                  80200 
==========++========================
 Net:     ||                 419800 

最後に

そういうわけで自分は最小限の手間で記帳し集計できる環境が整い快適である。学習コストが莫大にかかったためあまり人に勧める方法ではないが、

  • CLIでの作業に抵抗がない
  • 英語がわかる (Plain Text Accountingの資料はほぼすべて英語のため)
  • 一人で記帳している

という方は試してみてもいいかもしれない。

会計ソフトは確定申告を簡単にしない

『会計ソフトを使えば確定申告が楽になる』という謳い文句を信じた方も多いでしょう。私もその一人でした。しかし、マネーフォワード クラウド確定申告を実際に使って気付いたのは、会計ソフトが税務の本質的な課題を解決しない現実です。

2024年分についてe-Taxの代わりにこのサービスを使ってみたのでその経験を語りたいと思います

仕訳帳入力の難

仕訳帳入力について基本的にクレジットカードの明細などをスクレイピングで取得するMFお得意の方法が想定されているようです。 私は件数が非常に少ないのと専用カードや口座は作っていないので手入力したのですが、そうすると劣化ExcelのようなUIで非常に使いにくい。お金払ってこれかという気持ちになる

青色申告の難

せっかく会計をつけたのに青色申告決算書に完全に自動反映をというわけではなく、いくらか手入力があります。 面倒な点でいうと「売上(収入)金額の明細」などの項目は自分で取引先ごとの総額を計算して上から手入力して言う必要があります。なぜ…

確定申告の難

確定申告では多数の項目を入力する必要があります。やっていると途中で気づいたのですが「これe-Taxと入力項目同じでは?」 そう、e-Taxを似たような別のUIで実現しているだけで、ここではマネーフォワードは何も効率化してくれていないのです。

さらに私の場合海外ETFについて外国税額控除を申請しているのですが、これの明細出力にはマネーフォワードはまったく対応していません。結局、煩雑なエクスポートとe-Taxでのインポート(xtx形式なので確定申告書作成コーナーでは使えずWindows版をインストールして悪戦苦闘するなど)作業をするはめになりました。

最初からe-Taxを使っていれば半分くらいの時間で終わっていたのに…

会計ソフトへの期待が間違っている問題 ── 会計と税務は「別物」──

このあたりで自分の認識が間違っていることに気づきました。会計ソフトは会計を効率化してくれるソフトであり、確定申告は90%の作業が税務です。 そして会計ソフトの税務はおまけなので劣化版e-Taxにしかならないですし、e-Taxがやっていない効率化などは税務判断になってしまう可能性があるため積極的ではありません。

会計ソフトの『確定申告機能付き』という宣伝文句は、ESTA代行サイトが『手数料で楽に申請』と謳いながら、結局は自分で入力させる構造と本質的に同じです。検索上位の代行サイトは手数料を取るだけで、結局は自分で公式サイトと同じ情報を入力させる。同様に、会計ソフトの税務機能も「入力フォームを提供する」以上の価値を発揮しないわけです。どちらも『手間を省く』という幻想を売り、実際には形式上の効率化しか提供しません。

会計ソフトも自社を使ってほしいため税務は支援しませんとは言わないのでなかなか気づくことがないわけですが。

どうすればよかったのか

会計ソフトは帳簿作成ツールと割り切りましょう。そのため任意のソフトを使うことができ青色申告機能については気にする必要はありません。青色申告に必要な損益計算書を作る機能はほぼすべての会計ソフトについているため、その出力をe-Taxで手動で転記(勘定科目ごとのまとめなど、20項目くらいの数字)すれば済みます。自分の場合記録の数が少ないこともあり、2025年についてはオフラインの簡易的なソフトを使っています。

確定申告については税務の学習コストを明確に認識して気合をいれてやるしかありません。複雑な控除を申請する場合、国税庁ガイドラインやQ&Aを自ら読解する時間を確保しなければならないです。これを効率化したい、代行してほしい場合はソフトやサービスでの選択肢は存在せず、税理士に頼む必要があります。

申請自体はe-Taxでやりましょう。Webの確定申告コーナーの使い勝手はそこそこです。Windows版は全然違うし使いづらいのでやめておきましょう

つまり

我々が確定申告と認識していたものは「会計」と「税務」に分かれていた。会計は事実を整理する作業だが、税務は法律を適用する行為でした。後者は自分でやるか税理士に頼むかの二択しかありません。

厳しい現実ではありますが、『会計ソフトは帳簿作成、税務は自分か専門家』という線引きを明確にすれば、無駄な期待を捨て、時間を有効活用できます。2025年の確定申告では、この割り切りがあなたのストレスを軽減するはずです。

URLを好きなブラウザで開けるBrowser Picker代替を自作した

Windowsで色々な行うようになって不便なのが規定のブラウザの切り替えである。 コンテキスト(URLの中身、現在起動しているブラウザなどなど)によってSlack, DiscordなどのアプリからURLをクリックした場合に起動するブラウザやプロファイルを変更したい。

そういうツールがないか調べたところ Browser Picker というものがあり、やりたいことの8割はできるのでこれでいい感じだった。ただ一点、細かい不満があるとすれば起動が遅いことである。リンクをクリックしたあと、一瞬遅れてブラウザが起動するのでもっさりを感じる。.netC#で書かれているからだろうか

我慢できないほどではないが、いい機会なので自分で作ってみようと思ったのが以下のものである

github.com

アーキテクチャ

Visual C++ 2022でWindows APIをゴリゴリに使う形でやっている。C/C++もある程度わかるのでいけるかと思ったが、Linux / UNIXっぽいものに慣れた人間としては別の宇宙というか学習コストが高すぎる。ChatGPT の助けを借りながらこの小さいアプリケーションを作るのでさえ苦労した。

解決したこと

自由にロジックが書けるのでやりたいことは全部できるようになった。またBrowser Pickerで感じていた動作のもっさりは完全になくなり、ネイティブにブラウザでURLが開かれるのと遜色ないスピードとなった。

現状の問題点

おそらくこれはWindows 11の制限なのだが、レジストリをどう設定しても設定アプリからHTTP/HTTPSにこのアプリを選択することができない。どうもHTTP/HTTPS/MAILTOなどのリンク系の関連付けにはアプリがWindowsにインストール / 登録されている必要があるのかもしれない。

妥協案

もうBrowser Pickerはいらないので、レジストリのBrowser Pickerの起動コマンドを自作ツールの実行ファイルに書き換えたところ、あっさり動いた

[HKEY_CLASSES_ROOT\BrowserPicker\shell\open\command]
@="\"C:\\BrowserLauncher\\BrowserLauncher\\x64\\Debug\\BrowserLauncher.exe\" \"%1\""

釈然としないが、このちょっとした自分用ツールでインストールの仕組み(や、もしかしたら署名関係など)まで導入するやる気はないのでこのままである

Windowsもう少しこの辺自由度高いとうれしい

NUROがダメになったので回線品質をモニタリングした

NUROにもかかわらず今まで問題なく耐えていた自宅サーバー仲間の友人宅がついにダメになったということで、みんなでモニタリングしてクソ回線を可視化してバトって遊ぶことになった

こういう場合監視ツール何にするかが問題となるのだが、全員Mackerelを使っていたのでそれを利用することに。雑にGitHubで "mackerel speedtest" で検索したところそれっぽいGolangスクリプトが発見されたのでちょっといじって使えるようにした。

github.com

結果

見事にピークタイムになるとDownload速度が低下し、pingとjitterが暴れる様子が観測できた。今回の回線ではパケロスは検出せずでしたがこのjitterだとゲームにも向かなそう

こういう時に難しいのは観測先サーバーがボトルネックになっていないかという点なのですが、自分もNTTのIPoEでXpassなプロバイダから同じサーバーで試したところ無風だったのでやっぱNUROではないかという

その他

  • MackerelはSlackにアラートを送れるのでクソ回線アラートでみんなでワイワイ盛り上がれる
  • Mackerel無料だと1日分しかメトリクスを保存できなかったような気もするが遊びなのでOK
  • ↑のレポジトリにあるやつをcronで叩けば投稿してくれるのでモニタリングして遊ぶと楽しいと思います

追記 一日分のグラフ出た。これはひどい

どうやったらSREになれるのか

@rosylilly とSREやISUCONについて話しました。 SRE(インフラエンジニア)になるキャリアパスというものが昔とかなり異なってきていて、いまはどうなっているのか、どういった教育が必要なのかなどについて議論ができました。そういったことについて語る機会はなかなかなかったのでおもしろい話になったんじゃないかと

anchor.fm

メルカリを退職しました

5月末でメルカリを退職しました

前回の報告はあっさりしていたんですが、今回は結構ちゃんと語ってます。 というのもPodcastをやってみたい欲が出てきたところで、同じチームのメンバーだった友達も同時期に退職することになり、これ話したらおもろいんちゃうのということで録ってみたからです。

anchor.fm

よかったらきいてみてください

新しい会社の方はまだなにもわからないので落ち着いたらぼちぼち

意識低める個人用Webアプリ開発 2022

今でもちょこちょこ色々自分用のなにかをつくるということは多く、時間もあるので色々と試してみたところナイスな手法が多く見つかったのでまとめておきます。

前提

自分が開発するやつはだいたい何かをスクレイピングして、そのデータをうまいこと集計したりしてHTMLとして見れるようにしたいというのがあります。 スクレイピングするのでサーバーが必須だし、cron的な定期バッチを実行できる必要があります。

またデータをためこんでそこにクエリを投げたい、できれば即時で結果を返してほしい。そのためふつうのRDBMSが都合がよい。DynamoやらFirestoreやらは集計とインデックスが貧弱であり、BigQueryなどはクエリ投げてから結果が出るまでがちょい遅い。

前提その2

自宅サーバーがある。今回のやつで上げるのはVPSとかでもいいんだが、フルマーネージドではないLinuxサーバーがある。

フルマネージドなサービスは増えていてFaaSやらGAEやらCloudRunやらあるわけですが、だいたいがHTTPサーバーをつくることしか考えておらず、Cronバッチ的な処理をしようとした瞬間に体験が最悪になります。いきなりピタゴラスイッチ的に複数サービスやらPub/Subやらを組み合わせろみたいな話になり、ベンダロックインなあれこれが必要になる。

開発マシン=本番環境にしてしまう

最初ローカルで開発して、サーバーでgit pullして環境を構築して…とやっていたんですが。よく考えれば本番を直接いじればいいことに気づきました。 どうせユーザーは自分だけであるし、debugモードもONで良い。

デプロイのコストがゼロになるというのは革命であり雑に開発していくモチベーションとなります。

問題は開発環境である。現代人はみんなIDEを使っていると思うのですがリモート環境でIDEを使うのは面倒で。X11リモートデスクトップとかしてもいいんだけどそれも体験が悪いしセットアップがたいへん。最初vimでがんばっていたが良い製品を思い出しました↓

JetBrains Gatewayを使う

JetBrains GatewayとはIntelliJとかを作ってるJetBrainsの新しいIDEというかGatewayIDEのバックエンドをどこかローカルじゃないリモート環境で動かせるというもの。これによりsshごしとかdockerごしといった開発でのわずらわしさを解消できるがIDEの豊富な機能とUIはそのまま使えるという夢のようなものです。利用にはIntelliJとかRubyMineとかのライセンスが必要。

www.jetbrains.com

で、実際使ってみての感想ですが、まあ使えると言った感じです。当たり前ですがIDEでのタグジャンプやら補完やらは完璧に動作します。

ただ挙動が不安定なところが多くありました。つなぐところやPCをスタンバイから復帰させたときプラグインのインストールなど随所があやしい。ベータなのでしょうがないといえばそれまでですが。

それから動作が遅いです。起動がまず遅い。起動後も全体的にもっさりしています。LAN内サーバーにsshしていて別マシンへの接続としては考えうる限り最速なんですが…

その辺耐えられる人にはいいと思いますし、今後どんどん改善されていくと思います。自分も耐えることにしました。

GitHubのprivate repositoryを使う

昔はprivateにするためだけにBitbucketとか使ってたんですが今はGitHubでOKです。いいね

SQLiteを使う

Web開発でSQLiteとかおもちゃやろと思ってたんですが、よくかんがえたら自分しか使わないおもちゃ作ってるんだった。1台でしか動かさないならセットアップの手間がほぼゼロでバックアップとかもかんたん(ファイルコピーするだけ)。最高ですね。これでよかったんや

Jenkinsを高級Cronとして使う

ふつうのcronを使うというのは現代ではやめましょう。環境変数が変、正常終了したのか、エラー起きていたとしたらそのときのログどうするかなどなどあまりにも面倒すぎる。Jenkinsはめっちゃ古臭いツールですがその辺のログ管理や成功失敗判定や実行時間など全部を標準で記録してくれていて、なんと定期実行と同じ環境変数や手動で実行することもできます!!! Cronで3分後とかに指定して3分待って結果みるとかしなくていいわけです。

Jenkinsは有名なツールのためインストールも簡単でUbuntuだとaptのsourceを追加してapt installではいります。

Rundeckでもいいのかもしれないが試してないので知らん。