Posts for: #Reflection

リフレクションにはまった半日

23時に寝て5時に起きて6時半に起きた。ストレッチで伸ばしたせいか、いつもよりよく眠れた。先週は主に旅行へ行っていて非日常でリフレッシュした。今朝は朝ご飯に野菜サラダを作って食べて7時半には家を出れた。

非同期の ldap 検索の api

先日送った go-ldap の pr を完了した。送ったときはチャンネル用いた検索 api だったのだけど、それから設計を議論して非同期検索を主とした api として生まれ変わった。レビューに1ヶ月を要したものの2人のメンバーから approve をもらって無事にマージされた。

この一歩は大きくてこの機能を突破口にうちらの要件に足りない機能を実装していく。プロトコル部分の修正が過去の draft 実装から参考にできるのであれば今週中にはまた pr を送りたい。

mongodb の unmarshal 実装

mongodb-driver での bson の marshal/unmarshal を実装する。mongo-driver/bson に unmarshal について2つの interface が紹介されている。

type Unmarshaler interface {
	UnmarshalBSON([]byte) error
}

type ValueUnmarshaler interface {
	UnmarshalBSONValue(bsontype.Type, []byte) error
}

bson の byte 列を unmarshal するにあたり、構造体そのものには UnmarshalBSON() を、構造体のメンバーには UnmarshalBSONValue() を使う。これでうまくいきそうに思えたのだけど、interface を介したデコード処理で意図した振る舞いにならないことに気付いた。mongodb-driver は decode/unmarshal 処理を reflect を使って実装している。要件の詳細は省く (interface を使いたい背景がある) が、再現コードが次になる。

type MyInterface interface {
	MyFunc() error
}

type MyType struct {
}

func (t *MyType) MyFunc() error {
	return nil
}

var tMyInterface = reflect.TypeOf((*MyInterface)(nil)).Elem()

func some(v reflect.Value) {
	f := v.Convert(tMyInterface).MethodByName("MyFunc")
	fmt.Println("got", f)
	fmt.Println("=========")
}

func main() {
	t1 := &MyType{}
	some(reflect.ValueOf(t1))
	// the zero value of an interface is nil
	var t2 MyInterface
	some(reflect.ValueOf(&t2).Elem())
}

このコードを実行すると次のエラーになる。

panic: reflect: Method on nil interface value

ドキュメントにも interface の nil の値を呼び出すと panic するよと書いてある。

Method returns a function value corresponding to v’s i’th method. The arguments to a Call on the returned function should not include a receiver; the returned function will always use v as the receiver. Method panics if i is out of range or if v is a nil interface value.

https://pkg.go.dev/reflect#Value.Method

お仕事探しのふりかえり

2時に寝て7時に起きた。とくに可もなく不可もなく淡々とリリース前の開発の詰めや検証をしていた。大きな改修を先週末に終えていたので後始末的なタスクが主だった。

お仕事探し終了

いくつか選考して次のお仕事を決めた。8月からお仕事探しをしていた。いくつか求人プラットフォームのステータを更新し、途中まで選考が進んでいた会社には辞退メールを送った。昨年は1ヶ月ほどで次のお仕事をたまたまみつけたけど、今回は2ヶ月ぐらいかけて求職活動をしていた。探す期間が短いとどうしても妥協したり近視眼的な考えに陥ってしまいやすい。心に余裕があることの利点を考慮して2ヶ月ぐらいかけるのがちょうどよいのかもしれない。私は基本的に辞めると決めて関係者と調整してから次を探す人間なので転職活動に失敗すると無職になるリスクが高い。自分の会社に所属していると、最悪の場合、契約終了時に次のお仕事がなくても無職になるわけではない。この安心感が人生において重要なものだとわかるようにもなってきた。

今回は3つの経路を使ってお仕事探しをしていた。

  • 人脈
  • スカウト
  • エージェント

以前にも書いた が、私のような人間は普通の求職活動をしても、他者と比べて秀でたところがなく競争に勝つのが難しい。コミュニティやいくつかの会社で働いてきた人脈を駆使して、自分という人間を知っている人からお仕事をもらうしか生き残りの戦略はないのかもしれない。次のお仕事は課題管理を徹底的に実践して他社のお手伝いをする。うちの会社が今後ビジネスをやっていけるかどうかの分水嶺になるかもしれない。できるだけの準備をして臨む。

第3期のふりかえり

23時に寝て5時に起きた。本当は夜に打ち合わせの資料を作らないといけなかったが、なんかだらだらやってそのまま寝て朝起きてから資料を作り始めた。今日は祝日だから業務委託のお仕事は完全に休むと決めた (非稼働日もデイリースクラムには参加するし、なんだかんだで軽いチケット整理や作業などはしている) 。その分の余裕が資料の作成を先延ばしにした気がする。

隔週の雑談

顧問のはらさんと隔週の打ち合わせ。今日の議題は会社の第3期 (前期) のふりかえりにした。半分ぐらいは資料はできていたものの、5時半ぐらいにはオフィスに行って6時過ぎから残りの部分を作り始めた。8時前には完成した。いつもは2-3日前には資料を提示するようにしていたが、今日は祝日でだらだらモードで1時間前 (打ち合わせは9時から) となった。はらさんも直前で資料に目を通してもらったが、こういうのはよくなかったと後で反省した。

資料を作っていて、ふと思い浮かんだ気づきの1つをあげる。

会社の銀行口座と自分の銀行口座残高がダブルでただひたすらに減額しているさまを見るのって普通にメンタルに良くないんですよね。しかも事業も全然伸びていきませんし…。

ソフトウェアエンジニア社長として起業してから会社清算するまでの4年間の振り返り (完結編)

前期は3ヶ月ほど仕事をせずに遊んでいた。数字だけをみたら6ヶ月ほど遊んでいてもよい余裕はあったと言える。それでも3ヶ月ほど経ってから次のお仕事を探して、いま受託開発をしているのは 銀行口座の残高がダブルで減り続ける恐怖に抗うのが難しい からと言える。会社が倒産するわけでも、生活に困るわけでもなく、銀行口座の残高が減り続ける毎日が怖いという話し。「死の恐怖は死そのものよりも怖ろしい」と誰かの名言があるが、その経営者バージョンかもしれない。難しい判断は心身ともに落ち着いていて余裕をもった状態で下すのが望ましいと、誰もが頭では理解できるだろうが、実際に銀行の口座がずっと減り続けている状態でそう在れるかというのは別問題だという話し。無計画に仕事せずに遊ぶのは、うちの会社の場合は3ヶ月程度が限界だと分かった、というのが今期の財務における収穫と言える。

そんな1年を通したふりかえりを雑談してたら2時間ほど経過していた。また2週間後に第4期の展望をやることにした。