プログラマーのためのCPU 入門 CPU は如何にしてソフトウェアを高速に実行するか

前から気になっていたのですが、ここのところ取り組んでいた仕事も一段落して少し時間に余裕ができたので読んでみました。

ソフトウェアプログラマであっても高級言語でコードを書いているとあまり意識しないであろうCPUの基本的な動作について解説されているのですが、前半は単体のプロセッサ、後半はマルチプロセッサならではのトピックの解説になっています。さらに本文だけではカバーしきれない内容が付録として収録されており、付録だけで40ページ以上ありますし、参考資料へのリファレンスもめちゃくちゃ充実しています。

内容はとてもわかりやすく、CPUの基本的な動作だけでなく、なぜそうなっているのかが主にパフォーマンスの観点から説明されています。現代のアプリケーション開発者が本書を読んでCPUを意識したコードを書くかといえば正直そういうことはあまりないかとは思うのですが、とはいえ自分の書いたソフトウェアを実行してくれるCPUがどのように動いているか知っておいて損はないと思いますし、基本的な考え方はソフトウェアと共通する部分も多く、CPUが身近に感じられるのではないかと思います。

Kindle版はないのですが、ラムダノートさんのWebサイトで書籍+PDF付きPDF単体のものが購入できます。一度の注文の合計金額が9000円以内だと送料がかかってしまいますが、紙の書籍にデフォルトでPDFが付いてくるのは良いですね。

林陵平のサッカー観戦術

個人的に戸田さん亡き後プレミアリーグの日本語解説ではベン・メイブリーさんと双璧と思っている林陵平さんの書籍が発売されたとのことで早速読んでみました。

大人気で物理版は売り切れの書店も多いということで、自分も近所の書店では入手できなかったのでKindleで購入したのですが、林さんの解説と同じで、読んでいるだけで林さんのサッカーに対する情熱が伝わってくるかのようで楽しく読むことができました。

内容的には思っていたよりはライトな感じで最近海外サッカー(特にプレミアリーグ)を見始めた人向けにはとても良さそうです。戦術トレンドや注目選手の紹介(個人的にはネトはちょっと怪我が多すぎるかなぁという気がしますが…)など旬な内容に振り切っている部分も多いので読むなら今すぐ読むべきですね。

しかし林さんのサッカー観戦術はスパルタンすぎて常人にはとても真似できなそうですw

人生が整うマウンティング大全

発売前から「マウントフルネス」「マウンティングエクスペリエンス」などキャッチーなフレーズでSNS上で話題を集めていたマウンティング大全、Kindleで買おうかと思っていたのですが、自宅近くのさほど大きくない書店でもビジネス書の新刊コーナーに積まれていたので購入して読んでみました。

…読んでみたのですが、うーん…。個人的にはネタ本の域を出ないかなという感想でした。確かにフフッとなってしまう部分もあり、笑って読むには良いかもしれませんが、ネタ本ならネタ本でもっと思いっきりネタに走っても…という気もしました。

個人的に内容に期待していたのでちょっと残念な気持ちです。事前情報があまりにキャッチーだったので期待しすぎてしまった部分もあるかもしれません。

systemdの思想と機能 Linuxを支えるシステム管理のためのソフトウェアスイート

systemd普段使っているけど何もわからん状態なので近所の書店のポイント2倍デーで購入して冬休みに読んでみました。

タイトルはもとより前書きにも書かれている通り、systemdの具体的な使い方というよりは普段Linuxを使っている人が体系的にsystemdを理解するための本という感じで、対象としてはニッチだとは思うのですが、読者層の設定から内容までコンセプトが明確で、著者の方(Software Designでsystemdの連載をされていたそう)の知見や情熱に裏打ちされた良書だと思います。

systemdの基本的な概念や機能の概要を知ることができたのはもちろんですが、Linuxの様々な機能が今はsystemdで処理されているんだなーということもわかってよかったです。

2023年の振り返り

仕事関係

昨年末から春先まで3ヶ月ほど仕事が超絶忙しく、どうにか区切りがついたと思ったら下半期になって突然ボスがいなくなってしまったり、トラブルが続いたりと、なんだかんだ一年を通じて消耗が激しかったです。

命を削った甲斐もあってか現職4年目にして初めてプロモーションなるものを経験させていただいたり、新たに接点ができた方もいたり、英語での採用面接の機会が増えたりと悪いことばかりでもなかったものの、もう歳なので無理すると再起不能になりかねないので働き方について少し考え直さなくてはと思ったりしました。

また、春頃の話なのですが、スタッフエンジニアの書籍でインタビューを受けさせていただいたりしました。こちらも自分のキャリアを振り返る良い機会になりました。

takezoe.hatenablog.com

あとは3月に米国本社のお偉いさん方、12月には新ボスや海外の同僚が東京オフィスに来ていたので自分も久しぶりにオフィスに顔を出したりしていました。

OSS活動

特に前半は仕事が酷い状態だったのと、その後もモチベーションが上がらずあまりOSS活動はできなかったですが、Trinoにいくつか改善やバグ修正のパッチを投げたり、GitBucketの機能追加をしたりと地道に活動しています。また、Jacksonに初めてPRを出して取り込んでもらえたのも嬉しかったです。

takezoe.hatenablog.com

新しいところではIntelliJプラグインを作ったりもしていました。自分で使う用に作ったものですが、こういうちょっとしたものでも自分で作れるとなかなか便利です。UIのあるものも作れるようになると楽しそうですが、Eclipseプラグインをゴリゴリ作っていた頃の気力はもうないですね…。

takezoe.hatenablog.com

Scalatraについてはついに3.0を正式にリリースすることができました。Scala 3とJakartaに対応したのが目玉でフレームワークの機能的には変わっていませんが、ドキュメントやサンプルを直すのが大変でした。SPAが普及してサーバーサイドはAPIのみというケースが多い昨今、JSON周りはもう少しなんとかしたい気持ちもあるのですが、互換性を持たせつつ改善するのはなかなか難しそうなので非互換でもAPI開発用の新機能を入れてもいいかなという気持ちがあります。

takezoe.hatenablog.com

アーセナル

昨年のシーズン序盤から首位を走り続け、19年ぶりの優勝か!?と期待されたアーセナルでしたが終盤の急失速で結局2位でフィニッシュ、CL出場権は取り戻したものの無念極まりないシーズンになってしまいました…。ベンゲル時代に見慣れたこの光景に「また次のチャンスは10年後かも…」とネガティブ思考になってしまうアーセナルファンはきっと自分だけではなかったはずです。

夏にはハヴァーツ、ライス、ティンバー、ラヤとさらなる大型補強で弱点だった層の薄さを解消し、新シーズンは万全の体制でCLとリーグ優勝に挑むと思いきや、開幕から全然機能しない新システムにトライした挙句ティンバーとパーティーの怪我で早々に頓挫、厚くなったようで実はあまり変わっていない選手層と上位はキープしているものの前半戦から四苦八苦している状況ですので、あまり期待しすぎずに応援したいと思います。

しかしこれまでもサッカー雑誌でアーセナル特集が組まれることは多かったのですが、ここ10年以上は自虐ネタっぽい特集ばかりでしたが、昨シーズンの躍進で強豪っぽい特集記事がたくさん出たのは嬉しかったです。

その他

仕事で疲弊していたので読書もあまりできなかったのですが、System Design InterviewやGrokking Functional Programmingは面白かったです。

takezoe.hatenablog.com

takezoe.hatenablog.com

引っ越してから自宅の作業環境を着々と整備してきたのですが、今年はついに最後に残っていた椅子を買い替えました。10年以上前に買ったバロンチェアを使い続けていたのですが、あちこち崩壊してきたのでエルゴヒューマンに買い替えました。オフィスチェアも値上がりしていてなかなか厳しい世の中ですが、これで作業環境はほぼ完璧になりました。あとは最近老眼が来ているのか細かい文字が見えにくくなってきたのでディスプレイはもう少し大きいものにしてもいいかも。

また、健康診断の結果がめちゃくちゃ悪かったり、腰痛がさらに悪化したりなど健康問題が多発してしまい、定期的に体を動かさないと…ということで毎日20-30分ウォーキングを数ヶ月続けていたのですが、少し仕事が忙しくなった時期に途切れてしまい、その後再開できていません。

今年は全体的に色々とストレスフルな感じで良くない出来事も多かったので、来年は良いことがあるといいなぁと思っています。

Presto/Trinoのサブクエリ重複実行問題について

Presto/Trinoは分散クエリを高速に実行するためにストリーミング型のアーキテクチャを採用しているのですが、このためクエリ内に重複箇所があっても複数回並列に実行されてしまうという問題があります。わかりやすい例だと、CTEで定義したクエリを複数回参照した場合、参照した回数分そのクエリの処理が実行されてしまいます。複数回実行されるクエリが重く、参照回数が多い場合、このコストはかなり厳しいものになります。

調べてみたところ、Presto由来のクエリエンジンでいくつかの対策が行われていたのでまとめてみました。

openLookeng

openLookengというのはHUAWEIオープンソースで開発しているビッグデータプラットフォームのようなのですが、クエリエンジンはPrestoをベースとしているようです。こちらではCTEに専用のオペレータを導入し、複数のコンシューマのキューにデータをプッシュできるようになっています。

gitee.com

CTE専用オペレータが導入されていることからCTE以外の共通部分には適用できないのではないかと思いますが、直感的なわかりやすさはあると思います。

PrestoDB

PrestoDBではRaptorXというキャッシュ活用プロジェクトの一環としてクエリフラグメントの出力をワーカーのディスク上にキャッシュするという機能が実装されていました。同一のスプリットが同一のワーカーにアサインされた場合にキャッシュが利用されるというもののようです。

github.com

クエリをまたいでキャッシュを共有できるというのはメリットだと思いますが、実際のワークロードでのキャッシュヒット率がどのくらいか気になるところです。ディスクの消費も激しくなると思うのでユースケースによっては使いづらいのではないかと思いますが、インハウスのデータウェアハウスなど、テーブル数やデータ量がある程度限定されており、ワークロードが予測可能な環境であれば有効かもしれません。

Amazon Athena

AmazonのAthenaではクエリの共通部分をリライトすることでマージしてしまうクエリフュージョンという最適化が実装されているようです。

www.amazon.science

www.amazon.science

この方法は対応可能なケースに制限はあるものの、他の方法と違ってクエリのリライトのみで実現できるためアーキテクチャ非依存であるという利点があります。実際AthenaだけでなくRedshiftなどでも同様の最適化が実装されているようです。Trinoにプルリクエストが出されているのですが、まだマージされていません。実際に動かしてみたのですが、ペーパーで書かれている機能がすべて実装されているというわけではなさそうです。

github.com

ベンチマークだと逆に遅くなってしまうケースもあるようですが、オプションで有効・無効を切り替えられるようになっているので入ってくれると嬉しいですね。

まとめ

問題意識としては同じだと思うのですが、Pretso一族の中でも対策は様々でした。このあたりは各プロダクトが想定するユースケースにもよるところもありそうです。その中でもAthenaのクエリフュージョンはクエリのリライトのみで対応できるので副作用も小さそうですし、比較的気軽に試すことができそうです。

また、Athenaのペーパーにはクエリフュージョンだけでなくスプーリングもロードマップにあると書かれています。それなりに大きな変更になりそうですが、実現の暁にはコミュニティにもなんらかの形でフィードバックされるといいですね。

今年のTrinoへのコントリビューションをまとめてみた

前半は仕事が忙しすぎてOSS活動どころではなかったのですが、後半から少し余裕ができたのでTrinoにも細かい改善やバグ修正などいくつかPRを送って取り込んでもらうことができたので記録のためにまとめてみました。

年末までにまだ増えるかもしれないので増えたら追記します。