2022年のふりかえり
【億万長者の挑戦】正体隠して1億円稼げ!無一文からの90日間ビジネスサバイバル | Ep1. 起業チャレンジ!覆面ビリオネア - YouTube のBBQフェス回を観た後でこれを書いています。面白かった。大変だなぁと思って観てたけど、割と問題点が明確(個人の能力や振る舞いに起因している)で意外と対応しやすいかもとボーっと考えてました。
お仕事
> 「TDのサービス開発・運用を全体的にみたときに頑張ったほうが良さそうなところ」をサポートする
今年前半は、去年の振り返りで書いてたこれに取り組んでました。上手く改善できた点もあれば、力不足で至らなかった点もあったなぁという感想。色々と現場で情報収集してみるとlow-hanging fruitが転がっていて、その辺の優先順位と依存関係を整理して着手してもらう、というのは割と効果的だったような気がするし、あとは技術的な問題を整理して道筋を立てるのもある程度上手くいった感はある。逆に、組織間の異なる価値観や優先順位のなかで落としどころを探りつつ大きな方向性を調整、みたいなのはまだまだ自分のレベルが低いなぁと反省。Senior Principal Software Engineerという大層なtitleと、この辺の能力のギャップで悩んでいた気もします(多分 "Senior" がつく前から)。あと、ふと気が付くとTreasure Dataで9年半弱過ごしてました。TD、初期のころは「技術的な正論(と自分が信じるもの)で殴りあう」「システムの安定性改善よりも機能追加の速度が劇的に速い」というスリリングな環境(個人的には非常に楽しめた)でしたが、現在は組織的・システム的に成熟してきていて色々サポートも厚く、かなり働きやすい環境になってきました(エンジニアにはお勧め)。ただ、自分の年齢的な残り時間も踏まえるとこの辺で次の挑戦をすべきかなとも考え始めました。
で、今年後半(10, 11月辺り)、某分散DB勉強会で以前御一緒していた山田さんがCTOをされているスタートアップ 株式会社Scalar | Making Data Management More Reliable に移籍しました。開発内容(OLTPなDB transactionまわり)・会社の雰囲気・仕事の進め方は僕と非常に相性が良いと感じていて、もう半年か一年位在籍しているかのような感覚です(実はまだ試用期間中…) 一日の過ごし方は、10am過ぎに10分弱のdaily standup meetingがあり、その後は開発に専念、で相談事があるときは必要に応じて都度ミーティングを入れる感じです。二週間に一度、DB/分散系/Byzantine fault系の論文読み会があり、アカデミックな経歴を持つメンバーに質問できるので非常に有難い。
社内論文読み会に初参加したけどその筋の人達に説明貰えるし気軽に適当な質問できるし、これは福利厚生的に非常に良い…
— komamitsu (@komamitsu_tw) October 18, 2022
また、二週間のスプリント単位で進めていて、最終日に成果報告的なデモ(あれば)と振り返りをしています。 皆さん謙虚さと穏やかさが凄いので、僕のような雑なエンジニアでもなんとか快適にやっていけてる。
趣味プログラミング
新規物は作っておらず、GitHub - komamitsu/fluency: High throughput data ingestion logger to Fluentd, AWS S3 and Treasure Data にUNIX domain socket対応入れたり、OCamlで書いたRaftを盆栽的手入れしたりしてました。特に今年後半はデータベーストランサクションまわりのお勉強で時間が解けがち。来年も前半はしばらくそんな感じかなぁ。でも来年は、自作Raftにgroup commit入れたり、missing logのキャッチアップの最適化
If desired, the protocol can be optimized to reduce the number of rejected AppendEntries RPCs. For example, when rejecting an AppendEntries request, the follower can include the term of the conflicting entry and the first index it stores for that term. With this information, the leader can decrement nextIndex to bypass all of the conflicting entries in that term; one AppendEntries RPC will be required for each term with conflicting entries, rather than one RPC per entry
は入れておきたいです(chaos test的にノード落とした後、ここで時間食うので)。ちなみに、現在EPaxosの論文読んでるけどconflict多めなときに性能でなさそうな印象がある…
ゲーム
スプラトゥーン2と3はなんとなくだらだらとやってました。あまり長くプレイしてるとストレスが溜まったり、惰性でプレイするようになって面白くないまま時間が溶けることがあるので、早めに切り上げるようにしてます。Slay the Spireも細々とアセンション上げを続けてるけど、サイレントで手数多めな構成でタイムイーター戦でボコられる、という負け筋を何とかしたい… Into the BreachとInscryptionはほぼ積読状態で来年はちゃんとプレイしたいなぁ。現在はDeath Strandingをプレイ中で、最近のゲームプレイしてないマンとしては「最近のゲーム凄い…」という感想(浅い…)。
本
古本屋で見つけた宮部みゆきの1990年代あたりの作品(火車・魔術はささやく、等)をなんとなく数冊買って読み直したり、森博嗣の初期作品に手を出したり。チームトポロジー読んだけど、用語集・事例集的な資料としてはアリ、でも心には響かなかった。他にも適当に活字を読んだ気がするけど全体的にあまり覚えてないですね…
マンガ
アフターゴッド、日本三國、血と灰の女王、は相変わらずWeb連載を読んでます。良い。あと、葬送のフリーレンは引き続き購入中。紛争でしたら八田まで、は地政学的な読み物として買ってはいる…が物語としては個人的にはしっくりこない(ので、それ系の専門書籍に切り替えたほうが良いのかも)。あと、ベルセルク・ゴールデンカムイ・NEW GAME!は無料期間があったので一気に読み返しましたがベルセルクはやはり蝕の後あたりまではやはり凄い。
アニメ
幾つかメジャーどころはリアルタイムで観てました。リコリス・リコイル、SPY×FAMILY、チェンソーマン(評判悪い情報をたまに目にするけど、緩急の緩な場面はよくできてると思う。戦闘シーンは騒がしくて辛いけど)とか?あと、8-9月で初コロナでダウン・自宅待機してたときに今更ながら、輪るピングドラムを観ました。凄い。ぼっちざろっく、もとても良かった。バンド活動欲が刺激される。
映画
基本、アマプラのもうすぐ見放題終了カテゴリに出てきた作品をたまに観る、という消極的姿勢でした。裏切りのサーカス、ゼロ・ダーク・サーティ、女神の見えざる手、マネー・ショート、J.エドガー、とかは面白かった。話題作・最新作も幾つか観たけどあまり印象に残ってない…(呪術廻戦 0 は良かった)
と、今年について思い浮かぶことを適当に書き出してみました。来年もがんばるぞー
2021年のふりかえり
今年も完全にリモートワークで引きこもってて同僚とのランチや勉強会の懇親会での雑談が無いので、去年に引き続き生存確認的な意味合いも込めて雑に今年の振り返りをしたいと思います。
お仕事
Treasure Data 9年目です。
去年から Digdag – Open Source Workflow Engine for the Multi-Cloud Era ベースで開発・運用されているWorkflowサービスのチームに移ってました。
Digdagはタスク間の依存関係や個々のタスクの状態の更新、スケジュールされたタスクのキューイングなどをPostgreSQLでがっつり管理しており、排他制御や楽観的ロックがにぎやかで処理性能や潜在的な性能面でのボトルネックが把握しづらい感がありました。特に、どこまでならスケールアウトできるか?という点はサービスを運用する以上把握しておきたい。で、今まで取得できていなかった遅延測定のためのメトリクスを足したり、指定された時間範囲で実行されたワークフロー群の遅延情報のサマリを取得するツールを書いたり、各種設定&クラスターサイズごとのベンチマークを自動的にとるツールを書いたり、ということを細々とやらせてもらってた。最終的には、開発側で気づいていなかった遅延がある程度存在していて(Digdag単体での性能限界の指標になる)その遅延を劇的に減らせたし、どこまでスケールアウトで対応できるか把握できたので良かった気がする。
あとは割と自由に安定化やバグ潰し、改善系のタスクに取り組ませてもらいました。
で、今年の9月辺りにWorkflowチームから移動してレポートラインがCTOのNahiさんに代わり「TDのサービス開発・運用を全体的にみたときに頑張ったほうが良さそうなところ」をサポートすることになりました。前VPoEと話してた時に「お前はPrincipal Engineerなんだから特定のサービスだけ見てないで、TD全体を見て技術的な問題点見つけて飛び込んでいけ」(実際はもっと丁寧で穏やか)的な提案をされてて、確かにそのほうが貢献できるっちゃあできるなぁと思っていたので、Workflowチームのタスクが一区切りしたタイミングで移動。今回はUKのチームをサポートしつつAWSのCDK、Redshift、Aurora、Lambdaあたりと格闘してました。来年はどうなるのか楽しみ。
先月、太田さん・古橋さんが日本にいるタイミングで社内BBQがあって参加したけど、みんな元気そうで良かった。ビール取りに行く際に誰かとすれ違うたび近況報告会が始まるので非常に楽しいものの肉を食べる時間が無かったのはちょっと残念。
趣味のプログラミング
既存のプロジェクトのメンテナンスをしていたくらいで特に新しいことしてない… 古いRailsで書かれてた親類向けのWebアプリをKotlin + Ktor + Exposedで書き直して、すべての運用をAnsible上にのせたけど、技術的には粛々とやってただけな感じ。去年つくったNES emulatorが開発体験的にはかなりアツかったので、来年はOSやろうかなぁ。もしくは以前作った自作Raftが論文読みつつ書いてて今見直すと設計的にかなりイケてないので、一から書き直したい気持ちもある… まぁ来年適当にやるでしょう。
ゲーム
Outer Wilds
不親切度が高くて万人受けしなさそうですが、個人的には良かった。エンディングまでたどり着けたときはかなり感慨深かった。攻略サイトはガンガン見ました。
Slay the Spire
積んであったのに気が付いて始めてみたら、面白かった。アイアンクラッドとサイレントでアセンション 0の心臓を倒して、いまディフェクトで挑戦しているけど、ディフェクトでの勝ちパターンというか軸がまだつかめてない。来年はアセンション20を目指したい。ただ、時間が溶けるのがやばい…
スプラトゥーン2
引き続きスプラトゥーン2をボケ防止的にちょこちょこやっててSとAを行ったり来たりしてます。勝ち負けで一喜一憂しなくなって味方の面白ムーブで逆転負けしてもそれを楽しむ境地に達しつつあるので、かなり精神面で成長した気がする。
World of Tanks (Blitz)
スプラで心折れたときに少しやってみた。復活しない点は生存重視な自分としては相性が良いものの、スピード感があまりないので最近はやってない。あと戦車愛が無いのでそれほど刺さらなかった。
漫画
漫画アプリで少しづつ読んで読み終えたのはファブル、東京スワン、センゴク、オールラウンダー廻、BECK、ホーリーランド、クレイモア辺り。ファブルは頭一つ抜けて面白かった。連載中のだと、葬送のフリーレン、血と灰の女王、アフターゴッド、日本三國、SPY×FAMILY、腹腹先生、推しの子、働かないふたり、マイホームヒーロー、ハコヅメ、等は購入したりWebで読んだり。怪獣8号は最近メリハリが無い感あるので、読み続けるか迷い中。マイホームヒーロー、ハコヅメは漫画アプリで読んでるけど後で購入しそう。
あと、
www.amazon.co.jp
は本好きとしてはとても良かった。
アニメ
去年ほど観てない。Vivy -Fluorite Eye's Song- は結構よかった。あと、ODDTAXIも。最近は、攻殻機動隊 STAND ALONE COMPLEX を見返してるけど素晴らしい。
2020年の振り返り
普段、年末の振り返りブログを書いてない勢なのですが、今年は同僚とのランチや勉強会の懇親会での雑談が無くなってしまったので、生存確認的な意味合いも込めて今年の振り返りをしたいと思います。
お仕事
Treasure Data 八年目です。前前職であるNaver Japan(→NHN Japan→現LINE)が在籍期間一年半、前職であるDwangoが一年だったのでこうしてみるとTD長いですね…
仕事内容としては去年から続いていたdata ingestion pipelineの開発・運用を今年三月くらいまで続けてました。割と大量のingested dataをKinesis Stream二層使いでaggregationして、AWS Aurora, S3, Bloom filterを使ってdeduplicationするもので、skewed dataについても考慮してあるのでなかなか面白いものだったと思います。
その後、他チームで既に立ち上がってたプロジェクトを手伝うのかなと思ったら、いつの間にかがっつりmanagementをすることになって驚いていたのですが、これはこれでTDでは今までにない経験だったのである意味面白かったです。大枠の設計が決定済みのプロジェクトを引き受けるのはあまり得意ではないのだなぁと自覚できました。もっと精進しないといかんですね。
で、九月辺りから正式に Digdag – Open Source Workflow Engine for the Multi-Cloud Era をベースとしたworkflowサービスのチームに移りました。TDではかなり重要な役割を担っているところですが、将来的なscalabilityやstabilityの面で興味があったので参加しました。
会社的にはArmがNvidiaに買収されることとなり来年は色々変化がありそうな予感がしていますが、基本的に変化大好き人間なので楽しんでいきたいと思います。
プログラミング
こっちは個人的なprojectですが、今年頭にdistributed consensus algorithmの一つであるRaftをOCamlで実装して GitHub - komamitsu/oraft: Library of Raft consensus algorithm implemented in OCaml(開発メモ:What I learned from implementing Raft consensus algorithm in OCaml | by Mitsunori Komatsu | Medium)、今年末にNES(ファミコン)のemulatorをKotlinで実装してみました(開発メモ:
Development of NES (Famicon) emulator from scratch is fun, and tough | by Mitsunori Komatsu | Dec, 2020 | Medium)。いずれも「原理は理解しているけど実装してみたことがない」もので、まぁ実際に作ってみると意外な発見が多くて非常に面白かったです。他のネタも溜まってるので来年も何か作ってみると思います。
ゲーム
今年はついにSwitchを買ってしまいました。長男がSuper Mario Maker 2をやりたくて限界っぽく、またCOVID-19で自宅での娯楽を増やそうかと思ったのがきっかけです。で、六月辺りにSplatoon2を買ってしまいました。現状A帯にいて新しいブキに手を出してはB帯に落ちてるんですが、これはゲームというよりも精神修行に近い気がします。初動のホコ割りで味方二人が吹っ飛んでもう一人も溶ける試合が数試合続くと「仕事の方が楽しい…仕事したい…」となるので、Splatoon2逃避的に仕事に打ち込めるという利点もあります。ちなみによく使うブキは、96ガロン・スシベッチュー・わかば、辺りです。あと最近ゼルダBotWを始めました。これも「もうSlpatoon2やりたくない…ゼルダBotWの世界でパラセールしてたい…」というモチベーションで頑張ってます。他にはSteamでMindustryを買ってやってました。採掘や資源移動を頑張って効率化して余裕こいてると予想外のボス敵が壊滅的な打撃を与えてくる、というのは安定運用中のサービスでヤバイ障害が発生して死にかけるのに似ていて良いと思います。
漫画
いろいろ読みましたが「働かないふたり」は久しぶりに全巻揃え中の漫画です。Splatoon2で打ちのめされ殺伐とした心を癒してくれます。あと最近Amazon Unlimitedで「大東京トイボックス」を一気読みしたのですがアツくて良かったです。「New Game」よりもリアルで無駄に可愛くなく良いのですが、根底を流れるテーマが意外と重めなのでもうちょっと軽い開発話を読みたいところ。
サーロインステーキの焼き方メモ
試行錯誤の末、最近焼き方が安定してきたのでまとめておく(下記はレア向けになっているので、ちゃんと焼きたい場合は時間を倍にしてもok)。
- 肉は出来るだけ厚めなもの
- 調理の一時間前には冷蔵庫から出す
- 肉の両面に塩胡椒を振り擦り込む。塩は肉の重さの1%弱
- 片面から筋の部分を2cm程度おきに切っておく
- そのまま放置
- フライパンを熱し、サラダ油を適当にひく
- 肉の片面を蓋をして強火で1分間焼く
- 反対側を蓋をして45秒焼く
- 肉をアルミホイルで包み、フライパンの上に乗せた蓋の上に3分間乗せる
- フライパンを強火で熱し、肉の両面をそれぞれ30秒ずつ計1分間焼く
既存の秘密鍵・証明書からJavaのTrustStore & KeyStoreを作る手順メモ
すぐに忘れそうなので、メモメモ。
KeyStore
openssl pkcs12 -inkey server.key -in server.crt -export -out keystore.pkcs12 keytool -importkeystore -srckeystore keystore.pkcs12 -srcstoretype pkcs12 -destkeystore keystore.jks -destkeypass keypassword -deststorepass storepassword # 内容を確認 keytool -list -v -keystore keystore.jks
TrustStore
keytool -import -file server.crt -alias mytruststore -keystore truststore.jks # 内容を確認 keytool -list -v -keystore truststore.jks
IntelliJでRobocodeのRobot開発メモ
毎回忘れて色々試しては時間を食っている気がするのでメモ。
1. Robocode自体のインストール (See http://robowiki.net/wiki/Robocode/Download)
2. IntelliJで適当にprojectを作り、`Project Settings` -> `Modules (Dependencies)` に `JARs or directory` として上記1でインストールしたRobocode配下にある `libs/robocode.jar` を追加
3. http://robowiki.net/wiki/Robocode/My_First_Robot 辺りを参考に適当なRobotを作成
4. IntelliJ上で `Build Project` しておき class files を出力させておく
5. Robocodeの `Options` -> `Preferences` -> `Development Options` に上記4の class files が出力されている root directory を指定
6. あとは普通にRobocode上の `New` 以降で作成した Robot が指定できるようになっているはず
JVM Tool Interfaceを少しさわってみたメモ
ふと、JVM(TM) Tool Interface 1.2.3 に触れたことがないことに気がつき、少しさわってみたのでメモ。
OpenJDKのソースコードの jdk/src/share/demo/jvmti の下に幾つか例があるので、それを試してみることに。ちなみに概要は上記URLのドキュメントの各APIの説明の直前まで眺めれば良さそう。APIの種類が多いので少し圧倒されるけど、実際に何か作る際に目的に合ったものを見れば問題無いかと。
今回見てみたのは versionCheck / mtrace の二つ。
- versionCheck
Agent_OnLoad()でJVMTI_EVENT_VM_INITイベントにコールバック関数をセットして、その中でjvmtiEnvから引っこ抜いたバージョン番号をstdoutに表示するだけのシンプルなもの
Mac OS X上でのビルドは以下のような感じ。ちなみにagent_util/agent_util.cはjdk/src/share/demo/jvmtiが依存しているヘルパー関数群。
$ pwd /Users/komamitsu/src/openjdk/jdk/src/share/demo/jvmti/versionCheck $ clang -I${JAVA_HOME}/include -I${JAVA_HOME}/include/darwin -I../agent_util -c ../agent_util/agent_util.c *.c $ clang -dynamiclib -L${JAVA_HOME} -o libversionCheck.so *.o
これを利用する場合は以下のように指定する
$ java -agentpath:/Users/komamitsu/src/openjdk/jdk/src/share/demo/jvmti/versionCheck/libversionCheck.so Main Compile Time JVMTI Version: 1.2.1 (0x30010201) Run Time JVMTI Version: 1.2.3 (0x30010203) Hello world
- mtrace
Javaのメソッド呼び出し回数をトレースするもの。Agent_OnLoad()で色々コールバックを設定するが、面白いのはJVMTI_EVENT_CLASS_FILE_LOAD_HOOKで都度ロードされたクラスファイルの各メソッドを、同梱されているMtrace.javaのメソッドを最初に呼ぶように書き換えている(と思う)。Mtrace.javaのメソッドは当該Cライブラリファイルの関数(この中でメソッド呼び出し回数をカウント)をnative methodとして呼ぶように紐づけられているが、その際、JNIのFindClass()とRegisterNative()を使っている。ちなみにjava_crw_demo/java_crw_demo.c はクラスファイル操作系ヘルパー関数群。
$ pwd /Users/komamitsu/src/openjdk/jdk/src/share/demo/jvmti/mtrace $ clang -I${JAVA_HOME}/include -I${JAVA_HOME}/include/darwin -I../agent_util -I../java_crw_demo -c ../agent_util/agent_util.c ../java_crw_demo/java_crw_demo.c *.c $ clang -dynamiclib -L${JAVA_HOME} -o libmtrace.so *.o $ mkdir -p classes $ javac -d classes Mtrace.java $ jar cf mtrace.jar *
使い方で少しハマった点としては、FindClass()でMtrace classを探す際、ロードされる前に探しに行くとJVMがクラッシュしてしまう(FindClass()の戻り値がNULLになることを期待してたけど...)。なので -Xbootclasspath/a でmtrace.jarを先にロードする必要あり
$ java -Xbootclasspath/a:/Users/komamitsu/src/openjdk/jdk/src/share/demo/jvmti/mtrace/classes/mtrace.jar -agentpath:/Users/komamitsu/src/openjdk/jdk/src/share/demo/jvmti/mtrace/libmtrace.so Main : Class java/lang/String 8084 calls Method charAt (I)C 3941 calls 3941 returns Method length ()I 832 calls 832 returns Method equals (Ljava/lang/Object;)Z 543 calls 543 returns :
なお、途中で、調査のため-Xcheck:jni -verboseを有効にしたら捗った。特に-verbose指定時に以下のエラーが出たのでJDKのバージョン違いに気がつけた(途中JDK8 -> 7にして試してた)
[Loaded java.lang.ClassFormatError from /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/jre/lib/rt.jar] [Loaded java.lang.UnsupportedClassVersionError from /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/jre/lib/rt.jar]