上京エンジニアの葛藤

都会に染まる日々

システム設計の面接試験を読んだ

1月は毎日少しずつ「システム設計の面接試験」を読んでいました。
とても良い本だったので感想をまとめておきます。

目的は面接対策ではなくて、X を眺めていたら設計を勉強するにはこの本が良いとあったので、興味本位で手に取っただけでした(ちょうど Kindle のセール対象だったのもある)。

印象に残った点

トラフィックで大規模なサービスの設計について考える機会を与えてくれる

各章ごとに様々な課題が与えられて異なるサービスを設計していくのですが、どれも高トラフィックで大規模なサービスです。
また、どの課題も考慮すべき点が違っていて幅広い知識が求められていることを実感します。

自分は過去に比較的規模の大きいサービスに携わっていたこともあり、書籍の内容全てではないですが、ある程度現場での実践を通じて学んでいました。しかし、現在は toB SaaS に携わっており、以前と比べると遥かにトラフィックも低く、規模も小さく、サービスの性質が全く違います。

そのため、書籍内容をそのまま反映するとかなりオーバーエンジニアリングになります。
今の自分のようにそこまでスケーラビリティを考慮しなくても良いような環境で開発している方にとっては、普段あまり経験することがないことを実践に近いケースで考えることができる良い機会を与えてくれると思いました。

レートリミッターの設計が面白い

特に面白かったのはレートリミッターの設計の章です。
普段、外部サービスの API を利用する時は紹介されているような複雑なレートリミッターのアルゴリズムが実装されていることはありましたが、自分で実装した経験はありません。
このようなアルゴリズムについて詳しく紹介されている本を見たことがないのでおもしろく、参考文献もたくさん載っているので深掘りたいと思っています。

まとめ

普段向き合うことが少ない課題に対して、考える機会を与えてくれるのでとても良い本だと思います。
内容も広く浅めなので、幅広く知識のインデックスを貼ることができます。
特に大規模なサービス開発にあまり関わることがない人にとっては、そこまで考慮しなくても良いことがたくさん書かれているので新たな知識を得ることができると思います。

ALB のアクセスログを JSON に変換するコマンドラインツールを作ったので紹介する

概要

albconv という ALB のアクセスログJSON に変換するコマンドラインツールを作ったので、紹介です。 github.com

demo albconv

きっかけは ALB のアクセスログを少し解析する必要があり、量も少ないので手元で確認しようとしたところ、ログフォーマットがスペース区切りで扱いにくく JSON に変換したいと思って作りました。

実際はログの量も膨大で Amazon Athena などを使って解析することが多いと思うので、必要な場面が多くなさそうですが、ちょっと確認したい時とかでは意外と使えるんじゃないかと思っていたりします。

使い方

Mac ユーザーは Homebrew に対応しています。

brew install okkun-sh/tap/albconv

Linux, Windows ユーザーは binary を直接 DL して使えると思います。
Releases · okkun-sh/albconv · GitHub

基本的には jq と合わせて使うことを想定しています。

albconv alb.log.gz alb2.log.gz | jq '[.[] | select(.type == "http")] | length'
2

複数ファイルのインプットも対応しており、アウトプットはファイルの入力順になります。

補足

複数ファイル指定時はファイル読み込み、JSON 変換を並列にするなど Go のメリットを活かした実装を意識しました。しかし、現状の実装はメモリに全て載せることになるため大容量のファイルを読み込もうとすると、メモリ不足が発生するかもしれません。(負荷テストなどはしていません)

こうした方が良いなどの意見や PR お待ちしています!

感想

Go でコマンドラインツールを公開するのが初めてだったのですが goreleaser でのリリース体験がとても良かったので、他にもコマンドラインツール作りたい気持ちになりました。

iPad 用のペーパーライクフィルムが想像以上によかった

買ってよかったものを書いた後に届いたんですが、iPad 用のペーパーライクフィルムがめちゃくちゃよかったです。

僕が買ったのはこれです。Amazon のレビューが高いのを適当に選びました。

先日の記事で書いた通り、物理本で読むときは書き込みながら読んでいたので、電子書籍でも同様に書き込みながら読みたいため Kindle ではなく、PDF を iPad + Goodnotes の構成で読んでいます。

okkun-sh.hatenablog.com

iPadiPad Pro 11-inch (第2世代) を使っており、Apple Pencil で書き込んでいます。

画面フィルムは貼っていないため、ツルツルしている画面に書くことになり、書き味があまり良くないと感じていたところ、ペーパーライクフィルムというものを見つけて気になったので買ってみました。

名前の通り、紙に書くような書き味に近く、再現度が高いです。画面がぼやけた感じになるかと思ったんですが、今回選んだフィルムはあまり気になりませんでした。

またフィルムも失敗することなく綺麗に貼ることもできたので、買ってよかったと思います。

買ってよかったもの2023

今年も残り僅かですね。

恒例の今年買ってよかったものです。(今回書くのが初めてかも知れない...)

骨盤職人

職業柄1日中デスクワークで、ここ数年腰痛に悩まされていました。そして、昨年息子が産まれ、中腰でのおむつ交換、抱っこという育児をしているうちにさらに悪化していました。スタンディングデスクやクッション型のマッサージ機など色々試してみましたが、あまり改善されませんでした。

ある日 X を見ていたところ、骨盤職人が良いというのが流れてきました。特にその時は臀部に張りを感じていたので、ちょうど良さそうだと思い早速買ってみたところ、ピンポイントで刺激しながらほぐすことができてかなり楽になりました。
初めは慣れていないのか結構痛いです...

また骨盤だけでなく、腰、背中、ふくらはぎ、足の裏など複数箇所に使えるところが良いです。サッと取り出して使える手軽さも気に入っていて、この手の商品は如何に楽に使用できるかも大切だと感じました。マッサージクッションなどは AC アダプターを繋いで準備しないといけないので、それだけでも面倒に感じてしまいます。

妻も同じく腰痛に悩まされていましたが、だいぶ楽になったそうです。

ScanSnap iX1600 & DURODEX パーソナル断裁機 200DX

自炊セットですね。
購入のきっかけは、近いうちに引っ越しを考えており、あまりにも本が多く、これを持って移動したくなかったからです。

ここ2年ぐらい物理本を買わないようにしているのですが、読書をする時は書き込みながら読みたいので、iPad で Goodnotes を使って読んでいます。PDF があればそれを買うのですが、無い本も多く (Kindle ならあることが多い) 、そうなると自炊で PDF を作り出すしかありません。
レンタルなども考えたのですが、将来的に持っておいて良いだろうと判断しました。

手始めに150冊ほど自炊しましたが、まとめてやる作業ではないですね。作業量が多すぎて気が狂いそうになりました。
慣れないうちは裁断が甘く、一部ページが連なった状態でスキャンをして何度も途中停止しました。その度に裁断し直していたので作業スピードが上がらず辛かったです。

ただ、かなりの量の本を減らせて、本棚も捨てることができそうなので買ってよかったと思います。

DAVE THE DIVER

store-jp.nintendo.com

昨年 steam で PC 版が出ていてプレイしたかったんですが Switch 版が出るのをずっと待っていました。

このゲームは少し太った主人公のデイヴが朝、昼は海に潜り、漁に出て、夜は獲った魚で寿司屋を運営するというなんとも不思議なゲームです。

グラフィックがドット調で海洋生物も上手く表現されていて、登場するキャラクターも個性豊かで愛らしいです。本当に細かいところまで作り込まれていて素晴らしいゲームだと思いました。
のんびりプレイできる点も良いです。

最近無料 DLC も配布されたらしく、まだプレイできていないので年末年始にでもゆっくりやろうと思います。

prtimes.jp

ジョン・フルシアンテ・ファイル

2019年に再度レッチリに復帰した John Frusciante のムック本です。一番好きなギタリストということもあるので、より彼のことを知ることができて大満足な一冊でした。ファンにはたまらない1冊です。

また、東京ドームでの来日公演にも行きました。間違いなく人生で一番感動したライブです。 あの時の Can't Stop, Eddie は忘れることはないでしょう。

ちなみにこのムック本、数年前にも出ていたりします。
今見ると両方プレミアが付いているようでした、すごい人気ですね...。

Ubisoft 90’s ロゴ キャップ

夏頃にキャップが欲しいと思い、探していたところ公式が出していて安かったので買いました。

Ubisoft のゲームは FARCRY シリーズしかプレイしたことがなく、熱狂的なファンではないのですがノスタルジックな 90's のロゴのデザインが気に入っています。
浅めのキャップで使い勝手が良く、今年の夏はほとんどこれを被っていた気がします。
おすすめです。

以上です。

最近は物が多すぎて断捨離をしていたりするので、来年はあまり物を増やさないようにしたいと思っています。

localstack のボリュームマウントは /var/lib/localstack にしよう

タイトルの通りですが結論だけ先に書きます。

localstack のボリュームマウントは /tmp/localstack ではなく /var/lib/localstack にしましょう。

詳細

docker-compose を使ってローカル開発をしていたところ、ある日 localstack が立ち上がらなくなりました。

sample-localstack-localstack-1  | ERROR: 'rm -rf "/tmp/localstack"': exit code 1; output: b"rm: cannot remove '/tmp/localstack': Device or resource busy\n"
sample-localstack-localstack-1  | Traceback (most recent call last):
sample-localstack-localstack-1  |   File "<frozen runpy>", line 198, in _run_module_as_main
sample-localstack-localstack-1  |   File "<frozen runpy>", line 88, in _run_code
sample-localstack-localstack-1  |   File "/opt/code/localstack/localstack/runtime/main.py", line 28, in <module>
sample-localstack-localstack-1  |     main()
sample-localstack-localstack-1  |   File "/opt/code/localstack/localstack/runtime/main.py", line 20, in main
sample-localstack-localstack-1  |     infra.start_infra(asynchronous=False)
sample-localstack-localstack-1  |   File "/opt/code/localstack/localstack/services/infra.py", line 235, in start_infra
sample-localstack-localstack-1  |     files.rm_rf(config.dirs.tmp)
sample-localstack-localstack-1  |   File "/opt/code/localstack/localstack/utils/files.py", line 214, in rm_rf
sample-localstack-localstack-1  |     shutil.rmtree(path)
sample-localstack-localstack-1  |   File "/usr/local/lib/python3.11/shutil.py", line 738, in rmtree
sample-localstack-localstack-1  |     onerror(os.rmdir, path, sys.exc_info())
sample-localstack-localstack-1  |   File "/usr/local/lib/python3.11/shutil.py", line 736, in rmtree
sample-localstack-localstack-1  |     os.rmdir(path, dir_fd=dir_fd)
sample-localstack-localstack-1  | OSError: [Errno 16] Device or resource busy: '/tmp/localstack'
sample-localstack-localstack-1 exited with code 1

コンテナ起動時に上記エラーログが出力されていて、どうやらボリュームマウントに指定している /tmp/localstack の削除に失敗しているようでした。

ボリュームマウントを削除しようとしている理由を調べていたところこのリリースノートがにたどり着きました。

github.com

v1 系のリリースでディレクトリ構成が変更され /tmp/localstack のボリュームマウントは非推奨になり、/var/lib/localstack に移行して下さいとのことです。

LEGACY_DIRECTRIES=1 にすることで旧バージョンを利用することができたようです。

私は LEGAY_DIRECTORIES が廃止される v2 を利用していましたが起動はできていました。
しかし、ボリュームマウントは機能してなかったようです。
(SQS しか使っていなかったので永続化させる必要がなく気付いていませんでした...)

localstack の image バージョン は latest を指定しており、今回たまたまローカルの docker image を削除して build したタイミングで v3 系を pull し発生するようになったようです。

ちなみにドキュメントにも記載されています。 docs.localstack.cloud

ちゃんとドキュメントやリリースノートを読んで利用しないと調べるのにも時間がかかるしハマってしまいますね。