Write and Run

it's a simple way, but the only way.

GitHub Projects (beta)のデータをSQLでクエリ・更新できるツールを作った

これは KOBA789 日記 Advent Calendar 2021 - Adventar 21日目の記事です。

GitHub Projects (beta)

みなさん GitHub Projects (beta) は使っていますか? 私はめっちゃ使っています。

しかし beta ということもあってまだまだ使いづらかったり機能が足らなかったりすることがありますよね?

マウスでポチポチしながら、SQL で操作できたらラクなのになぁと妄想したりもします。というわけで作りました。

ghsql

GitHub Projects (beta) のデータを SQL でクエリ・更新できるツールを作りました。SELECT はもちろん、UPDATE や DELETE もできます(INSERT は未実装)。

github.com

インストール

まだ crates.io とかには公開してないので、git clone して cargo install --path . してください。

使い方

Personal Access Token や Installation Access Token などを環境変数 GITHUB_TOKEN に設定してください。

コマンドの引数は以下の通りです。

USAGE:
    ghsql <OWNER> <PROJECT_NUMBER> --github-token <github-token>

SQL の例

テーブル名は items 固定です。

とりあえず全部列挙:

SELECT * FROM items;

もちろん件数も数えられる:

SELECT count(*) FROM items;

StatusIn Progress なやつだけ列挙:

SELECT * FROM items WHERE Status = 'In Progress';

リポジトリと Issue 番号を指定して StatusDone に更新:

UPDATE items SET Status = 'Done' WHERE Repository = 'owner/repo' AND Issue = 123;

StatusDone なアイテムを全部削除:

DELETE FROM items WHERE Status = 'Done';

もちろん、Iteration にも対応しています。

イテレーション(Iteration 10)の積み残しを全部次のイテレーション(Iteration 11)に持ち越し:

UPDATE items SET Iteration = 'Iteration 11' WHERE Iteration = 'Iteration 10';

その他

思いついた勢いで一気に作ったので、気合いでごり押した設計と実装になっています。

終わりに

もうアドベントカレンダーも終盤じゃん。そろそろ書かなくていいかな。

穴を開ける、柱を立てる

これは KOBA789 日記 Advent Calendar 2021 - Adventar 18日目の記事です。

日記

今日は大学の後輩の部屋にツーバイフォー材を立てるのを手伝いました。DIY 大好きマンにはお馴染みのアレです。

ホームセンターに木材を買いに行き、軽トラを借りて持って帰ってくるという、いつものやつをやりました。

プロジェクターを設置したいということだったので、私が引っ越す前に使っていたプロジェクターとその固定金具一式を押しつけました。10年前に買った物体だし、今の部屋にはデカい有機 EL ディスプレイがあるしで、邪魔だったんですよね。

プロジェクターを適当な木ねじだけで吊るすと強度にやや不安があるので、柱に貫通穴を空けてボルトを通しました。引越し前の私が使っていた、実績のある構造です。

今持ってる電動ドリルはちょっと非力なので、マキタのやつとか欲しいですね。まぁ年に数回しか使わないんですけど。ドリルを買いにきた客が本当に欲しいのは穴ではなくマキタ。

終わりに

明日も書く。 久しぶりに暇な日曜日なので新しい DBMS でも作ろうかな。

SWDやCMSIS-DAPとにらめっこした

これは KOBA789 日記 Advent Calendar 2021 - Adventar 17日目の記事です。12月って16日がないらしいです。

日記

SWD や CMSIS-DAP とにらめっこしていました。SWD や CMSIS-DAP というのは、Arm マイコンデバッグをするときに使うやつです。にらめっこの結果として rust-dap のバグを見つけたので PR を出しました。

rust-dap は CMSIS-DAP v2 に対応してるし実装小さくて移植しやすいしで最高です。実際に手元の bluepill に移植して活用しています。

これは私がやっつけ移植した bluepill 対応版(fork): GitHub - KOBA789/rust-dap: CMSIS-DAP Rust implementation

自分が使うソフトウェアが自分の慣れた言語で書かれている安心感は何物にも代えがたいですね。多少バグってても自力で直せるので身軽です。

そうそう、CMSIS-DAP ではどうやってフラッシュへの書き込みをしているんだろうと思って調べたところ、なんとフラッシュ書き込み用の小さなファームウェアを RAM 上に展開してそれを呼び出して書き込ませるという仕組みでした。その小さなファームウェアのことを Flash Programming Algorithm と呼ぶらしいです。またひとつ賢くなりました。

終わりに

(12月に18日があれば)明日も書く。

ひさしぶりに「データ指向アプリケーションデザイン」を読んだ

これは KOBA789 日記 Advent Calendar 2021 - Adventar 14日目の記事です。

日記を書くには早すぎる時間なんだけれど、久しぶりに「データ指向アプリケーションデザイン」を読んだら気持ちが高まりすぎてしまったので、書く。

データ指向アプリケーションデザインと私

「データ指向アプリケーションデザイン」(以下、本書)は "Designing Data-Intensive Applications" の和訳であり、2019年に発行された書籍です。

原著の方は2017年には発行されていたらしいのだけれど、恥ずかしながら当時は知りませんでした。和訳が出たということで話題になっていたのを見て知り、買って読みました。

初めて読んだときの衝撃といったらすごいものでした。学術的なバックグラウンドがほぼ皆無な私が趣味・業務内の試行錯誤のみから思索してぼんやりと仮説を立てていたものについて、その答えが根拠とともに載っていたのです。

私の感覚は間違っていなかったんだという安堵感と同時に、なぜ文献にあたらずにひとりだけで問題に向き合っていたのかと後悔し、また列挙されている参考文献の多さを見て、私と興味を共有する人々が世界中にはこれほどいるのかと嬉しくなったのを覚えています。

その感動をより多くの人と分かち合いたくて、すぐにその場で追加でもう1冊追加で買い(布教用というやつです)、とりあえず当時の職場の CTO の机の上に置いたりもしました。

ペーパーバック版は大きくて持ち歩きづらいので、友人とのふとした会話の中で参照するには不便です。そのため電子版も買ってスマートフォンに入れてあります。電子版は全文検索が効くので、紙の本をシークするときの索引としても便利ですね。

ひさしぶりに読んだ

そんな本書ですが、今朝2年ぶりくらいに読み直しました。きっかけは若干仕事で必要だったからなんですが、勢いで頭から第Ⅱ部(400ページくらい)まで読みました。思い入れのある1冊の割にはレビュー(?)をしたことがなかったことに気づきました。せっかくなので書きます。

12ページ目くらいで早速 Twitter のタイムラインの話が出てくるあたりで泣きそうになりました(一度読んでるはずなんですけどね)。データシステムに興味があれば、誰しも一度はスケーラブルなタイムライン機能の設計を考えるものです。読者のハートをガッチリ掴んできます。

日常的にデータシステムと向き合っていれば、システムの信頼性を高めるにはどうすべきか、スケーラブルにするにはどうすべきか、という勘が多少なりとも育まれます。しかし、実際に信頼性の低いコードやスケーラブルでない設計を目の当たりにしたときにその問題をわかりやすく説明できるでしょうか。あるいは妥当な修正案を出せるでしょうか。必ずしもそうとは限りません。

本書ではそうした勘を言語化するための強力な武器になります。課題を分解し、概念を定義し、例を交えて読者に整理されたメンタルモデルを与えます。いずれも現場に向き合ったことがあればスッと心に染みる課題ばかりです。課題が分解され整理される様を追いながら解説にうなずき続けることになるでしょう。読者の悩みを読者より雄弁に語ります。

REST と RPC の話が個人的に好きなので一部を引用します。

RESTの魅力の一部は、それ自身がネットワークプロトコルであるという事実を隠そうとしていないことにあります データ指向アプリケーションデザイン P.145

私が今よりもさらに未熟だったころ、RPC に夢を見すぎて実際に本書で指摘されているような RPC の問題に直面したことがあります。本書では、リモートサービスの呼び出しをローカルの関数呼び出しのように見せかけるアイデアには「根本的な問題がある」とすら書かれています。私もそう思います。具体的にどういう問題があるのかは P.144 を参照してください。

関連して、8章の内容も好きです。特に8.2の、非同期パケットネットワークって不便だよね、というあたり。皆さんご存じの通り、IP ネットワークは非同期パケットネットワークの一種です。なのでいろいろ困ったことが起きます(具体的な困りは P.302 あたりを読んでください)。

でも TCP を習う時って信頼性のあるプロトコルだって説明されませんか? UDP と比較して TCP には順序保証とか到達確認とかがあるってだけなんですが、10年くらい前に勉強したときは、TCP はめっちゃ信頼性がある印象を受けました。信頼性あるなら普通に RPC 乗っければいいって発想になりますよね? 私だけ? まぁ結論としてはそれは幻想なんですが。

第3章、ストレージの話が grep や tail を用いた素朴なストレージエンジンの実装から始まっているのも感動的です。私の書いた記事ではいきなり B-Tree から始めてしまいましたが、誌面の余裕さえあればシンプルなテーブルヒープから始めた方がわかりやすいし、インデックスのありがたみや意味が実感できるよな、と思ったりします。

ストレージエンジンに(当然)魔法なんかなくて、実にエンジニアリングらしいチマチマしたトレードオフの選択でそれっぽい性能特性が得られてるだけなんですよね。その出発点として、まずは(直感的にダメそうでも)素朴な実装から始めてみるというのは理解に大いに役立ちます。ちなみに直感的にダメそうでも特定ケースでは問題なかったりしますし、現実がそのうまくいく特定ケースにハマることはよくあります。自戒を込めて。

この調子で書いていくといくらでも語れそうなのでこのへんにしておきます。あ、Avro のライターのスキーマ・リーダーのスキーマとかも地味ですがおもしろいですよね。まずい、話が終わらなくなる。

終わりに

明日も書く。

2021-12-13

これは KOBA789 日記 Advent Calendar 2021 - Adventar 13日目の記事です。

冒頭に書くこともなくなってきたし、2021年も消化試合の様相を呈して参りました。

日記

久しぶりに電磁リレー回路 CAD zuse のメンテをしました。

WebGL の足回りに golem というライブラリを使っていたのですが、メンテが止まっているっぽいので依存から外して、その下のレイヤーの glow というライブラリを直接使うように書き換えました。

経験がある人には伝わると思いますが、OpenGL ってやつは API が超 stateful です。WebGLOpenGLAPI デザインをほぼ完全に引きずっているので同様です。

あるオブジェクトを操作するにはまずそのオブジェクトを bind して、そのあとに続く関数呼び出しではその直前に bind したオブジェクトを操作する、みたいなデザインです。

golem というライブラリはこういった面倒な bind 操作をうまく隠蔽してくれていてとても便利だったんですが、作者が力尽きていそうなので仕方なしですね。

メンテのために久しぶりに電磁リレー回路 CAD に触ってみたらまだまだ遊べそうだなと思いました。年末年始の休みで時間とって拡張できたらいいなと考えてます。

終わりに

EKS めんどくさい!!!(心の叫び)

明日も書く。

2021-12-12

これは KOBA789 日記 Advent Calendar 2021 - Adventar 12日目の記事です。

まだ大したこと書いてないのにもう折返しです。

日記

Kindle Unlimited に加入しました。

せっかく61鍵もある大きな MIDI 鍵を買ったので、打ち込みに使うだけじゃなく多少弾けるようにもなりたいなと思って教則本っぽいやつを読んでます。 教則本みたいなやつ、前提知識の量のバラツキもあるし、説明の合う・合わないもあるので立ち読みしてから書いたくなりますが、オンラインだとそうもいきません。

Kindle Unlimited だとそういう心配なく読み漁れるのでいいですね。今のところ一冊目でだいぶしっくり来てるのであまり活かせてませんが。

終わりに

そろそろだいぶめんどくさくなってきたけど明日も書く。