Posts for: #2023/02

集中のち寝不足

1時に帰ってきてそのまま寝ないで6時10分の新幹線に乗ってから2時間半ほど寝た。これはこれで時間の使い方が有意義な気がする。午前中は翌日の定例会議の準備を着々と進めて、ci/cd 環境の改善、午後からリファクタリングなどをやっていた。15時をまわると眠くなってきて散歩したりして気分転換しつつも体調悪いなと思って17時半にお仕事を終えてホテルへ戻って2-3時間ほど寝てた。その後、晩ご飯食べるかなと出掛けたものの、あまり食欲もなくて、2時間ほど付近を散歩して運動していた。たまにはそういうのもいいか。飲食店が多い地域なので外から眺めているだけでもわりと楽しい。

ssh 経由のデプロイ

これまで ci/cd でテストして docker イメージをビルドしてコンテナレジストリに登録するところまでやっていた。実際にテスト環境にデプロイするときは、テスト環境にログインして更新用のスクリプトを私が手動実行していた。そんなに頻繁にテスト環境を更新する必要がなかったのでそれでも十分ではあるものの、ci/cd の完成形を目指すなら自動化すべきという考え方もあってデプロイの部分を作ることにした。

もっとも簡単な方法として Using SSH keys with GitLab CI/CD をみながら、ssh でテスト環境にデプロイすることにした。すでに更新用のスクリプトがあって、テスト環境にログインして実行すればできる状態なので ssh さえ使えればすぐに移行できるという話しでもある。openssh-client を使うためにベースイメージを alpine から ubuntu にしてパッケージをインストールしないといけない。実行時間がややかかるというコスト以外には気にならないかな。ssh の秘密鍵を file 種別でもつのか通常の環境変数でもつのかで扱いが異なって、それに少しはまったぐらいですぐできた。今後は docker イメージのビルド単位に自動的にデプロイされるようになる。

interface{} の型エイリアスとしての any

go のコードをリファクタリングしていて json.Marshal の引数が any となっていることに気付いた。

func Marshal(v any) ([]byte, error) {
    ...
}

go 1.18 以降で interface{} の型エイリアスとして any が定義されているらしい。任意の型を扱えるシグネチャとして、メソッドの振る舞いのみを規定する interface{} を使うというのは型システムとしては正しい。他言語でいえば object に相当するものが go はオブジェクト指向言語ではないのでそれがない。そういう間違っていないけど、わかりにくいなと思っていたものに any という名前の型エイリアスが導入されてとてもしっくりきた。プログラミングしていて、実務的にどうかというところをちゃんと改善していくところがみえるのは楽しい。

type any = interface{}

資料作りを丸半日

23時に寝て何度か起きて7時に起きた。起きたものの、なんかしんどくてお昼前まで寝てた。

課題管理勉強会の資料作り

出張前の定例作業になりつつある。本当は余裕をもって事前に資料作りしておけばよいのに、日々の余裕がないから出張直前の日曜日に資料作りしている。これはよくない兆し。次の課題管理勉強会は エンジニアリング組織論への招待 を取り上げる。Chapter 1 の思考のリファクタリングから、私が関心のあるところ、もしくは課題管理で解決できそうな話題などを重点的に取り上げる。たたき台はできた。構成や進行をさらに練りたいので少し寝かせてからもうちょっと考える。読み返していると忘れていたことを思い出したり、課題管理と密接な内容を再発見したり、本の内容をずっと覚えているとかないから自分の勉強にもなる。本当は参加者同士で内容の議論ができるといいんじゃないかと思うけど、少人数の勉強会ではないから発言しにくい空気がある。もしくは発言するのは一部のメンバーに限られてしまう。とくにリモート参加が多いと勉強会は盛り上がらない。それは オンライン飲み会が盛り上がらない理由 と同じ。

12時頃にオフィス来て、途中に休憩を取っているけど、ひと段落して気付いたら23時まわってた。明日は始発で新幹線に乗る。このまま起きたまま夜通し出張の準備をして新幹線で寝る作戦に移行する。

go の学び直し 静的解析編

23時に寝て2時に起きて5時ぐらいにも起きて7時に起きた。昨日は podcast 収録でたくさん話して疲れてしまってそのまま帰ってすぐ寝た。すぐ起きるんだけど。

ストレッチ

今日の開脚幅は開始前157cmで、ストレッチ後159cmだった。朝出かける前に開脚のストレッチしたら数値よくなるかな?と思ってやってみたらいつもより少しよくなった。ストレッチはいつも通りとも言えるし、腰の張りがまだまだ残っていることも確認できた。疲労が溜まっているんよな。毎週ストレッチしているからこの程度の疲労で済んでいるとも思える。お正月に実家から戻ってきてから1月の東京出張と35日は終えた。来週はまた2月の東京出張とその週末に49日がある。ここまで体力がもてばその次の法要は初盆なので少し空く。体力的に第4四半期の山場と言えるかもしれない。ただがんばる。

go の学び直し

Gopher塾 #3 - 静的解析を使ったGoの開発ツール制作 入門編 - DAY 1 に参加した。

過去にも Python とマクロ、インポートフックと抽象構文木Java のアノテーションプロセッサを試す など、メタプログラミングのアプローチやコード生成などを実務で使ってきたので静的解析にも関心がある。講義内容の詳細は書かないけど、静的解析のような難しい話題に対して4時間という短い時間でとてもよい講義になっていたと思う。go の静的解析の要点や提供されているツールなどを一通り学ぶことができた。もちろん、実用するには試行錯誤や習熟を必要とするけど、取っ掛かりとして十分な内容に思えた。

skeleton というツールを使って静的解析のための analyzer プロジェクトのひな形を作る。

$ go install github.com/gostaticanalysis/skeleton/v2@latest
$ skeleton myanalyzer
$ tree myanalyzer
myanalyzer
├── cmd
│   └── myanalyzer
│       └── main.go
├── go.mod
├── myanalyzer.go
├── myanalyzer_test.go
└── testdata
    └── src
        └── a
            ├── a.go
            └── go.mod

意図的にテストが落ちるようになっていてすぐ動作確認できる。

$ go mod tidy
$ go test                                          
--- FAIL: TestAnalyzer (0.05s)
    analysistest.go:448: a/a.go:5:6: diagnostic "identifier is gopher" does not match pattern "pattern"
    analysistest.go:512: a/a.go:5: no diagnostic was reported matching "pattern"
FAIL
exit status 1
FAIL	myanalyzer	0.349s

いろいろ説明を端折るけど、試しに FuncDecl の ast ノードに対して関数の行数をカウントする処理を実装してみた。analysis パッケージの Pass を使うと便利なユーティリティが提供されていて、静的解析をするときに面倒な処理をショートカットできて簡単に実装できることが理解できた。ここで作った analyzer は go vet で実行できるそうなのでプロジェクトの独自ルールを analyzer で実装して ci でチェックするといった運用もできる。応用範囲は広そう。

case *ast.FuncDecl:
	fmt.Println(n.Name, n.Pos(), n.End())
	start := pass.Fset.Position(n.Pos()).Line
	end := pass.Fset.Position(n.End()).Line
	fmt.Println("the number of lines:", end-start)

雑談の多い日

0時に寝て4時に起きて6時に起きた。本当はもっと早く起きて勉強会の資料作りやろうと思っていたけど、疲れと寒さでうまく起きれない。高速バスよりはずっと楽だけど、それでも土日に実家帰ってくると疲れが溜まる。次の週の週末になると蓄積度が違う。

隔週の雑談

顧問のはらさんと隔週の打ち合わせ。今日の議題はこれら。

年末にはらさん主催の忘年会に参加した。参加者は10人前後いたと思う。そのときにはらさんが「会社でオンライン飲み会やっても盛り上がらない?」といった話題があった。その意見には私も同意でおそらく参加者が5人以上いるとオンライン飲み会は盛り上がらない。オンライン飲み会の難しさは1つの部屋だとせいぜい3-4人ぐらいでないと話せない。1つの部屋に10人とかいると、実質話しているのは3人ぐらいで残りのメンバーは聞いているだけになる。それが盛り上がらない要因だと思う。オフラインの飲み会なら、例えば4人テーブルに3グループに分かれて、それぞれのグループが3つの会話が成立するから盛り上がる。そして、隣の会話が薄く聞こえたり、ちょっと休むときに隣のグループの会話に混じったりもできる。これと同じことをオンラインでもチャンネルを分けてやればよいというのは理屈の上で正しい。しかし、オンラインで能動的に別のチャンネルに入り直すのは複数の意味で障壁が高い。まずツールの操作が分かりにくいし、幹事が仕切るわけでもないので運用ルールも曖昧。仮に幹事がいても仕切れるのは1つのチャンネルだけで、他のチャンネルが意図した運用をしているかどうか、チャンネルを出たり入ったりしないと監視するのが難しい。オフラインの飲み会に近い状態にするのは、オンラインミーティングツール側で自動的にうまいこと配慮しないといけないのではないかといった話を、はらさんとしていた。

はんなりPodcast

はんなりプログラミング のコミュニティが はんなりPodcast(仮) を始めたらしい。私もちょくちょくはんなりさんのイベントに参加するので運営の方々とも懇意にさせていただいている。たまたまゲストで呼んでいただいた。感謝。内容はまた公開されてから書くので今日は収録の雰囲気だけ書いておく。かいせんさんとおがわさんとは、オンライン上でもよくやり取りしているので気軽に話すことができた。逆に私が調子に乗り過ぎて内容とは逸脱したことや自分の話したいことをわーっと話し過ぎてしまったのではないかという反省もあとになって思う。いま1人で働いているからこうやって自分の話しを聞いてくれる機会というのは貴重でそれはそれで楽しかった。ついつい自分の話しばかりし過ぎないように注意しないといけない。

オフィスアワー的なハドル

2時に寝て7時に起きた。お仕事は時間かけた割に成果でなくて、遅くに帰ってきて晩ご飯食べてダンまちみたら寝るのも遅くなった。

ハドルと雑談

今日から午前中はハドルミーティングに滞在するようにして、メンバーが気軽に雑談しやすい雰囲気を作ってみる。大学で言うところのオフィスアワー。初日だったせいか、どんなものかとお試しでチーム外の開発者が来てくれたりもした。メンバーの1人もお昼前にとくに用ないけど試しに来てみましたと軽く雑談した。ハドル中じゃなかったけど、別のメンバーも午後にコードレビューの詳細について聞きたいといったメッセージが届いてハドルをした。リモートワークしていても気軽に話しかけていいんやでと表明することで、いくらか話しかけるのをためらう心理的障壁が下がったことは確認できた。普通に誰でも考えて起きること。あとはこれを一定期間、1ヶ月とか2ヶ月とか続けてみてどのぐらいの雑談ができるかを記録して、効果がありそうなら次のアクションを考える。とくに用事もないけど、暇だから気分転換に雑談に来ましたというのが高頻度で起これば心理的安全性にとってもよいことじゃないかな。私が逆の立場なら、用事もないのに会社の人に話しかけるのは仲のよい同僚しかいなかったと思う。他のメンバーも気軽にハドルに滞在するようになれば、物理的にオフィスに出社しなくても雑談しやすい雰囲気は作れるかもしれない。

テックブログ公開

0時に寝て何度か起きて6時半に起きた。起きてから8時までだらだらしてた。寒くて起きれない。2月入ってしまった。早いなぁ。

テックブログのレビュー/公開

先週に草稿は書き上げていた ものの、レビューが滞っていた。他社のテックブログを勝手に書いて公開するわけにはいかないので慎重にレビューをお願いしていた。私がそういう特性の人間なのか、課題管理システムを長年使い続けてきたからそうなったのか、その両方なのか。私は Unit Bias が大きい方の人間だと思う。自分の中で完了したタスクをクローズせずに放置しておくのが精神的に耐えられない。すぐに対応しない残作業があるなら新しい issue に作った上で古い issue をクローズすることもたまにある。放置するのは嫌なので今日は関係者にどんどん確認してレビューを進めた。

公開して知人にシェアしてみたものの、あまり反応がよくないので大して関心を唆る読みものにはなっていないようだ。扱っている内容が悪いわけではなく、私の構成や文章力が拙いのだと思う。悔しいのでもう1回ぐらい、この記事に関連するテックブログを書いて関心をもってもらうような読みものにしたい。関西人だからかぶせてかぶせて天丼にしていく。