テストライブラリの導入

今日のバドミントン練習はエアシャトルでリフティングを25分した。連続最大回数は277回できた。初めてエアシャトルで200回を超えた。しかも夜なのに。やや高めに打ち上げれば安定的にリフティングできるようになってきた。連続回数が増えることはラケットとシャトルの距離感、ラケットコントロールが上達していることの証左でもあるので200回を超えたときは嬉しかった。

テストライブラリの追加

結合テストを改善するために2つのライブラリを新たに使うよう導入した。

testify は名前だけ知っていたが、実際に使ってみるのは初めて。testify は大きく3つの機能もっている。

  • アサーション
  • テストスィート
  • モック

うちらのチームで使うのはアサーション機能だけになる。モックも将来的に使う可能性はある。アサーションを使うと自分でエラーメッセージを書く手間を省ける。次のようなコードがあった場合、

if expected != actual {
    t.Errorf("expected %d, but got %d", expected, actual)
    return
}

次のようにエラーレポートを testify に委譲できる。このぐらいの利便性でしかないが、テストの規模が大きくなったり、量が増えていけば読み書きのコストを削減できるかもしれない。

if !assert.Equal(expected, actual) {
    return
}

httpexpect はまったく知らなくて初めて使ってみたが、感触がよい。これもデフォルトのエラーレポート機能は testify のアサーション機能を使っているようにみえる。これまでは http リクエストに対して自前のユーティリティ関数と組み合わせて次のようなコードを書いていた。

res, err := doHTTPRequest(body, UserPath, http.MethodGet, "")
if res.StatusCode != http.StatusOK {
    t.Errorf("expected to get %d, but got %d", http.StatusOK, res.StatusCode)
    return
}
var actual entry.User
if err := convertBody(res, &actual); err != nil {
    t.Errorf("failed to convert: %s", err)
    return
}

httpexpect を使うと次のように簡潔に記述できる上にエラーレポートを httpexpect に委譲できる。これはかなりテストコードを読み書きする工数を削減できると思う。

var actual entry.User
e.GET(UserPath).
    WithJSON(map[string]any{ ... }).
    Expect().
    Status(http.StatusOK).
    JSON().
    Decode(&actual)

mongodb のテストデータ管理

今日のバドミントン練習はエアシャトルでリフティングを45分した。連続最大回数は146回できた。調子は悪くなく安定的に30回前後は続くものの、50回を超えたぐらいで失敗してしまう。打ち上げる高さの違いかな?と気付いて少し高めに打ち上げるようにしたら100回を超えた。エアシャトルはラケット面に対して適切な角度でコルクを打たないとあらぬ方向に飛んでいってしまう。高く打ち上げるほど、重力で落ちてくるときにコルクが下を向きやすくなるため、うまくシャトルを打ち上げやすくなる。ラケットコントロールをうまくできれば、エアシャトルをより低い高さでリフティングできるようになるかもしれない。まだ私はそのレベルには満たない。

json からの mongodb にテストデータを追加する

結合テストの改善をしていてテストデータを json で管理したい。これまで go の構造体でテストデータを定義して mongodb の client で insert するといったことをしていた。それも役に立つのだけど、共有のテストデータがどこにあるのか、ソースコードに書いてしまうと時間とともに散らばっていって把握できなくなっていく。テストデータを管理するためのディレクトリを設け、そこに json で記述してどのテスト関数で使うかといったメタ情報も定義できるようにした。次のコードは mongodb に json からデータをインポートするための原理を説明するための疑似コードのようなもの。

go の構造体で定義したテストデータと json で管理するのとどちらがよいかというのは議論の余地はあるし、一概に言えないとは思う。

type testData struct {
	Documents    []bson.Raw `bson:"documents"`
}

func InsertData(
	t *testing.T, client *mongo.Client, b []byte,
) (func()) {
	var data testData
    err := bson.UnmarshalExtJSON(b, false, &data)
	require.NoError(t, err, "failed to get json files: %v", err)

	ctx := context.Background()
	col := client.Database(dbName).Collection("mycollection")
	r, err := col.InsertMany(ctx, docsToInterfaces(data.Documents...))
	require.NoError(t, err, "failed to insert: %v", err)

	return insertResult, func() {
		t.Helper()
	    col := client.Database(dbName).Collection("mycollection")
		for _, id := range r.InsertedIDs {
			filter := bson.D{{Key: "_id", Value: id}}
			if _, err := col.DeleteOne(ctx, filter); err != nil {
				t.Errorf("failed to delete %s: %v", id, err)
				return
			}
		}
	}
}

呼び出し側のイメージ。defer で teardown を呼ぶことでテスト完了時に追加したテストデータを削除してくれる。

teardown := mongotest.InsertData(t, mongoClient, b)
defer teardown()

...

bson.Raw として読み込める json データは bson パッケージのユーティリティを使って dump できる。

func dumpAsJSON(value any) {
	b, err := bson.MarshalExtJSON(value, false, false)
	if err != nil {
		slog.Error("failed to marshal as extended JSON", "err", err)
		return
	}
	fmt.Println(string(b))
}

バドミントンのセンスは距離感らしい

バドミントンのセンスは距離感らしい

今日のバドミントン練習はエアシャトルでリフティングを110分 (エア110分) した。1回あたりは20-30分で休憩する。最大連続回数は192回だった。もうちょっとで200回を越せそう。

ラケットとシャトルの距離感の考察

エアシャトルでリフティングをしていると、きれいに真上にあげられるときとシャトルにスピンがかかってしまうときがある。スピンしてしまうと、ラケットのスィートスポットでコルクをとらえるのが難しくなる。試しにエアシャトルをラケット面に並べてみた。中心部でシャトル3つ分の横幅しかない。この中心部分でラケットのコルクをとらえるとうまく弾ける。シャトルが回転していると、コルクが垂直方向から傾いた角度でラケット面に当たったりフレームに当たる確率が高くなる。ラケットの上部だとシャトル2つ分の横幅しかない。リフティングを失敗してしまうのは回転中のシャトルをはたいたり、あらぬ方向へ飛ばしてしまうことが多い。うまくラケットコントロールを行い、なるべくシャトルをスピンさせずに上げることができればリフティングが安定する。

今日は昼間と夜間にビルの軒下で練習した。風の影響も軽微だったので安定的に連続して50回前後はできていたと思う。121, 146, 192, 152, 122, 106, 102, 120 と連続して100回を越せたのが8回もあった。うち2回は夜になる。メビウスだと100回に1-2回ラケットコントロールをミスしてシャトルをうまく上げられないときがある。そのときにリカバリをうまくやれば続けられる。安定的に100回程度のリフティングができるからリカバリを連続で2-4回できれば200回を超える。この原理はエアシャトルも同様になる。仮にエアシャトルだと20回に1回うまく上げられないとする。200回を超すには連続で10回リカバリできないといけない。リカバリできるかどうかは運の要素もある。回転しているシャトルがフレームのどこに当たるかでリカバリ可能な場合とそうではない場合がある。10回連続でリカバリするよりも5回連続の方が、5回連続よりも2回連続の方が容易な状況と言える。つまり、ラケットコントロールが上達するとリフティングにおけるシャトル打ち上げのミスが減る。ミスが減るとリカバリ試行の回数が減る。リカバリ試行の回数が減ると連続回数が増えるという理屈になる。

今日エアシャトルで192回連続で続いたことはたまたまリカバリが連続的に成功した結果であり、リカバリを必要とせず安定的にどれだけ長くリフティングを続けられるかの方が重要ではある。よいときのラケットコントロールの感触を覚えておいて再現できるように努めていく。

次の動画によると、バドミントンのセンスとは「距離感」とのこと。練習しているうちに距離感は少しずつよくなる。そして速いプレーになると距離感をつかむのはもっと難しいとのこと。

距離感をつかむための練習としては次になる。私がいまひとり練習しているのはまさにこれになる。

  • シャトルのキャッチ
  • シャトルのリフティング
  • 一人でロビングを打ってみる

2人いればシャトルパスもおすすめとのこと。

中学校体育館の夜間開放

バドミントンができる体育館探し。抽選予約のためのアカウント登録 を終えて初めての抽選。15日ゼロ時に抽選が行われる。初回なので0時頃に待機してみていた。本当に0時まわってから抽選のバッチ処理が動いているようでサイトで更新していると2-3分後に抽選結果が表示されるようになった。最大4つ抽選申し込みできる。残念ながらすべて落選だった。15日以降は先着順で予約できる。抽選結果が出た後も空きがあれば先着で校区以外の中学校も予約できる。校区以外の夜間開放されている中学校のうち、私が住んでいるところから近い区で駅から徒歩10-15分程度で歩いていけそうな中学校をピックアップしてみた。

灘区

  • 原田中学校

中央区

  • 渚中学校

兵庫区

  • 兵庫中学校
  • 湊川中学校
  • 須佐野中学校

長田区

  • 駒ケ林中学校
  • 長田中学校

予想した通り、抽選確定後にみんな先着申し込みを検索しているらしく断続的に 504 エラーが出たりもしていた。私が検索して確認できた中では渚中学校と須佐野中学校に先着の空き枠が1つ2つあった。他の中学校はすべて埋まっていた。空きがある中学校もあるんだなと検索してみているうちに0時10分までにはそれらも誰かに先着予約されたみたいで埋まっていた。14日の深夜 (15日ゼロ時過ぎ) に街中の駅からアクセスのよい中学校の予約はすべて埋まると考えてよさそう。中学校によって貸し出し可能な日が平日/休日ともにあるところもあれば週末だけのところもある。11月はどこの体育館も予約できなかったが、今回は抽選申し込みと先着申し込みの雰囲気を把握できた。

田んぼの畝作り

今日のバドミントン練習は主にエアシャトルでリフティングを80分 (メイビス10分、エア70分) した。今日の連続最大回数は79回だった。メイビスなら10分以内に200回は続けられるようになってきた。ウォームアップにメイビスでリフティングを始める。今日は5回目ぐらいで250回続いた。リフティング練習を1時間もやれば1日の消費エネルギーは3,000カロリーを超える。

田んぼの宿題

8月に実家に帰って田んぼを耕した が、土がよく乾いていて畝を作れるような状態ではなかった。その後、雨を待って土が適度に水分を含む状態になるのを待っていた。帰れるタイミングもあって今日になった。前回から約2ヶ月たつとまた雑草が茂り始めていたところだった。雑草を駆除するだけでも3ヶ月に1回ぐらいの頻度で田んぼを耕さないといけない。昨日の夜から帰っていたため、朝7時半ぐらいからトラクターで耕し始めて11時頃には畝作りも終えた。

いずれコワーキングスペースで農業体験を始めたらトラクターで田んぼを耕すのもメニューに組み込みたい。多くの人はトラクターになんか乗ったことないだろうから1度はやってみたいと思う。3ヶ月に1回は雑草駆除のために耕した方がよい。気軽に縦横無尽に田んぼを耕せる機会を提供しやすい。

その後、粗大ごみを市の処分センターにもって行ってお昼ご飯食べてから帰途につく。

いつもと違う帰り道

先日の 毎日1つ新しいことを試して変化を楽しむ という学びを思い出したのと、時間に余裕があったからいつもと違う道を通ってみようと、明石海峡大橋を渡って垂水ジャンクションから降りて海岸線の下道を走りながら帰ってきた。垂水ジャンクションの出口は山側になるのでそこから海岸線までわりと距離がある。海岸線に下るのに20分ほどかかる。垂水から須磨の海岸線はそんなに混雑しないので下道でもそれほど時間はかからない。10分ぐらいかな。その後、若宮からまた阪神高速に乗る。湊川IC付近は常に渋滞する というのも知った上で軽い渋滞なら高速の方が早いだろうと予測した。やはり渋滞はしていたものの、それでも時速20-30kmで流れている程度の軽微な渋滞だったので20-30分で若宮-京橋間を走って帰宅した。垂水ジャンクションを降りずにそのまま高速道路を走るよりもずっと時間はかかっているのだけど、知らない道を走るというのも気分転換にはなる。

バドミントンの練習

ダイソーでベルトにひっかけるポーチ (300円) とベルト (100円) を購入した。エアシャトル も9個購入した。このポーチにシャトルを10個ほど詰めて、こまめにシャトルを拾わなくても効率よく練習できるようにした。

夕方から磯上公園でリフティングをしていたが、いまひとつ続かない。調子が悪い。田んぼ作業で疲れているせい?暗くなったので場所を変える。旧居留地にある新しい練習場所としてワイズロードの近くや三井住友銀行神戸本部ビルの前とか、転々としながら試してみたがいまいち。その後、バスの営業所の駐車場へ行った。まぁまぁできたが、風がやや吹いているのが気になって、次にみなとのもり公園へ行ってみたが、そこはもっと風が強くてリフティングできる環境ではなかった。最後に サンボーホール のビルへ行ってみた。前から試してみたいと思っていた。このビル前の広場も休日の昼間は子ども連れの家族がよく遊んでいる。日曜日の22時には誰もいない。

磯上公園よりもバスの営業所よりも風の影響が小さくてとてもよかった。この場所で20分ほどエアシャトルでリフティングして安定的に20-30回をこなすことができた。最高は79回と過去最高ではないが、3回以上は連続50回を越した気がするので練習をしてしての感触は悪くなかった。そこでエアシャトルのリフティングは風の影響を受けやすいことに気付いた。エアシャトルを安定的にリフティングをするにはメイビスよりも高く打ち上げないといけない。しかし、高く打ち上げるほど風による影響を受けやすい。そよ風がふくだけでも軌道がずれる。シャトルが落ちてくる位置を目視しつつ予測しつつラケットコントロールをする。しかし、ちょっと風が吹くだけで微妙にズレてしまい、ラケットのフレームなどに当ててしまう。昼よりも夜の方が暗いから風の影響による補正が難しい。サンボーホールがもっとも風が弱くてリフティングが安定することに気付いた。そして、この場所は日曜日の夜でも照明がついている。

ホームのビル はオフィスビルのせいか、休日は消灯している。これまで休日の夜に練習する安定的な場所がなかった。だから休日は公園で明るい時間帯に練習してきた。しかし、サンボーホールが休日でも照明がついていて風の影響を受けにくい構造なら休日の夜の練習場所になるかもしれない。偶然よい場所をみつけた。

照明の明るさや色合いとシャトル視認の考察

今日のバドミントン練習も引き続き主にエアシャトルでリフティングを70分 (駐車場10分、公園35分、ビル25分) した。土曜日なので昼間に駐車場や公園、ビルの軒下で練習した。20-30分もやれば集中力が途切れてくるので休憩と気分転換を兼ねて場所を移動している。今日の連続最大回数は122回だった。安定的に20-30回は続くようになってきた。メイビスフィールドだと10分やれば1度は200回以上続けられる程度に安定してきた。

エアシャトルのコルクが真下を向いているときにラケットのスィートスポットでとらえるとうまく上がる。失敗するときはラケットコントロールを誤ってシャトルを回転させてしまうことが多い。エアシャトルはコルクをラケットのガットでとらえないとうまく上がらない。回転しているとシャトルの裾をはたいたりコルクをフレームに当てて跳ね上がらなかったり、跳ね上がってもあらぬ方向へ飛んでいってしまう。軽い失敗で回転させてしまっても、ちょっと強めに打ち上げると重力で補正されてコルクが真下を向くように修正できるときがある。そのリカバリがうまくいくと連続回数が増えていく。

練習場所と照明と背景の考察

近所にバスの営業所があり、その駐車場が広くて明るかったので練習してみた。ここは24時まで照明がついている。周りは大きなマンションまたはビルに囲まれている。平日の22時台で20分ほど練習していたが誰も来なかった。広くて周りに気を遣う必要もなくシャトルも視認しやすかった。また今度行ってみようと思う。

先の駐車場の印象がよかったので広い駐車場なら練習しやすいのかな?と思って別のところへも行ってみた。基本的に駐車場は24時間照明がついていて明るいところが多い。しかし、駐車場ならどこでもいいわけでもなかった。次の駐車場はシャトルの背景が複数のビルと夜の闇で移り変わってしまい、背景の明るさが変わる影響でシャトルを視認しにくいことに気付いた。広くて明るければどこでも練習しやすいわけではないことに気付いた。

次に電球色なら昼白色の照明よりも目にやさしいから練習しやすいのではないかと考えた。旧居留地の有名な建物の隣のビル。写真ではわかりにくいが、次のビルの照明は橙色の電球色になる。試してみたら意外とシャトルを視認できなかった。その理由はシャトルの色が昼白色に映える赤色や黄色に着色されているため、電球色に照明に溶け込んでしまってシャトルそのものを視認しにくくなってしまうように思えた。もしかしたら白いシャトルなら逆にみやすいのかもしれない。今度また試してみる。

夜にバドミントンの練習をする場所探しで大事な要素がいくつかわかってきた。一見、明るさだけをみてよさそうに思えてもシャトルを使ってリフティングしてみると視認しにくい場合がある。実際に試さないとその場所がよいかどうかはわからない。今回の調査から考察したことをまとめる。

  • 照明の明るさと色
    • 暗すぎたらみえない
    • スペース全体が明るくてもシャトルを視認しやすいとはかぎらない
    • 照明が明る過ぎても眩しい
      • 照明がそれほど強力ではなくても目と照明との距離が近いと眩しい
      • 屋根の高いビルの軒下の視認性が高いのは目と照明との距離が遠いからだと気付いた
    • 電球色だと赤/黄色のシャトルを視認しにくい
  • 視界における背景色とシャトルとのコンストラクト
    • シャトルを目で追うときに背景の明るさや色が変わると視認しにくい
      • 背景が変わらない場所の方がその背景色に目が慣れてシャトルを視認しやすくなる
        • ビルの軒下の視認性が高いのはビルからみえる壁や背景が一様だから
  • スペースの広さ
    • 近くに壁や垣根、屋根があると避けようとして注意力を取られる
    • 周りに人が来ないことがわかっている場所の方が集中できる
      • 駐車場は断続的に車や人が来るので集中しにくい
    • 広い方が照明との距離を調整しやすい
    • 周りの背景があまり変わらない殺風景な場所の方がシャトルを視認しやすい

1日ひとつだけ、強くなる

昨日 はらさんに紹介してもらった梅原大吾の著書 の目次を眺めていくつか気になったところを読んでみた。1つの項目が2-3ページぐらいなのでタイトルで気になったところをすぐ読める。全体の3割ぐらいしか読んでいないけれど、それでも私には役に立ったので所感をブクログに書いてみた。

「格闘ゲーマーだって、正直飽きる」というタイトルがあってモチベーションコントロールについての梅原さんの考え方を読むことができた。私もプログラミングは好きだが、かといって飽きやマンネリがないわけではない。

この義務感というのは結構な曲者だ。時折「仕事でもないのに、そんな真剣にやってられるかよ」という人がいる。これは逆ではないだろうか。仕事が持つ義務感によって、かえって向上心を持つことが難しくなることは多い。義務感によってやらされているという、受け身の状態になってしまう。これが進行すると「最低限の基準さえ保っておけばそれでいいだろう」といた気持ちにまでなりかねない。

義務感によって受け身にならないこと。受け身というのは、外部からの刺激に依存したやり方だ。刺激を与えられている間はいいけれど、それがなくなればやる気もなくなる。

この悩みがあるときにひとりだと自分に言い訳をしてすぐ受け身の状態になってしまう。常に新しい取り組みや変化への挑戦をしていかないと、人間は怠惰で最低限の基準で受け身になってしまう。いまの私には耳の痛い話しでもある。そして、梅原さんの考え方を読んでいても、結局のところ、この状態を抜け出すにはモチベーションにとらわれない継続の仕組みを自分で見出すだけのように読めた。

評価してもらえない内的な成長を、どれだけ意識できるかで、モチベーションは大きく変わってくる。

プロであれアマチュアであれ、やるべきことは結局ほとんど変わらない。僕は、少しずつ自分のペースを取り戻していった。何か打ち込んでいることや、続けていることがあるのなら、成長のループを継続することを考えてほしい。毎日の歩みがいかにわずかであっても、安定した継続というのはそれだけで自信になるからだ。

本書のタイトルにもなっている「1日ひとつだけ」という言葉の背景として、梅原さんは1日を思い返して自身の成長を1つだけメモしているという。日記を書くことの意義とも共通する。日記の意義の1つはふりかえりを自然に行っていることになる。そして、外からみてわからない内的な成長を自分で気付いて成長を実感したり、自身の基準で肯定することが継続のためのモチベーションコントロールによいと梅原さんは実践している。この考え方は私が日記を3年書き続けていることから得た気付きとも合致する。よい時期によい本と出会えた。

実家へ帰る

先日トラクターで 真夏の硬い田んぼ を耕すのはやりにくかった。雨が降って適度に乾いた状態の田んぼを耕すために実家へ帰る。今日は親が外出しているというので20時から帰って明日、田んぼ作業をすることにした。

ひとりではできないこと

今日のバドミントン練習はエアシャトルでリフティングを30分した。連続最大回数は80回だが、ほとんどの試行は20回も続かずに失敗してしまう。難しい。

隔週の雑談

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

課題管理と adr の関係の考察

数年前から adr の話題や導入した会社の記事などをみかけるようになった。私はこれまで課題管理をうまくやっていれば adr はそれほど重要ではないとあまり重視してこなかった。しかし、世の中的に認知されて流行っているものはなにかしら意義があるのだろうと最近は少し見直してきているところもある。このスライドによると2017年から流行り始めたらしい。

  • 開発に関する情報を一元管理する、または全文検索ことにビジネスチャンスはある
    • 検索のニーズや要件は多様で言語によっても違い、技術もまだまだ発展的でもあるからずっとビジネスの種になる気はする
    • gitlab issues のコメントの全文検索は有料機能なので slack 通知したチャンネルを全文検索している
      • 課題管理システムのプラグインでテキストをシステム間連携することで検索システムを別途構築できる可能性がある
      • 検索できなくてもデータのアーカイブをするという視点でもビジネスニーズに応える?
  • ベクトル検索 を検索がまだ一般的にはなっていない?
  • wiki と adr の違いの1つとして wiki になにを書いてよいかわからない問題がある
    • 文章を書けるようになるのは経験や習熟を必要とする
    • adr のようなテンプレートがあることで経験の浅い開発者も書きやすくなる狙いはある
    • 課題管理システムの wiki に adr のラッピングをして別機能としてみせるのはよいかもしれない
    • 業務の引き継ぎにも adr は役に立つのではないか?
    • adr 一覧をみたり、そこから検索することで検索効率や精度は上がるという想定
  • 大きい会社でも巨大な課題管理システムと wiki が1つだけあって一元管理しているという噂は聞く
    • ある会社では wiki は誤っている可能性があるから信用するなという教訓があった
      • wiki の情報は更新されていない可能性があるから参考にしながら必ず裏をとって業務をしなさいという話し
    • wiki を編集したら必ずレビューが必要になるプロセス
  • notion のプロジェクト管理の使い勝手はどうか?
    • テンプレートを使ってガントチャートやカンバンを作れる
      • 基本的に自分でカスタマイズできることの良し悪しがある
        • db をどんどん改良できるが、それだけに魔改造してしまう
        • 時間とともに複数人が改良すると保守できなくなっていく懸念がある
      • 中核機能をパッケージ側で提供することは堅牢性を担保する上で重要ではないか
    • タスク管理と wiki がシームレスなところはよい、はらさんは日報を書いてリンクしている
  • 会社のインフラに日々の開発情報を書いていくと退職後に参照できない
    • フリーランスのような働き方をするにはナレッジデータベースをローカルに作りたいという欲求がある
    • 組み込みの課題管理システムにより、自身のナレッジデータベースをローカルに残すという目的はよいかもしれない

仕事は楽しいかね? の考察

まとめを見返しながら、だいたいの項目は理解または支持できる。1つだけ次の項目が私には欠けていることに気付いた。

毎日1つ試し続ければ必ず上達や進歩ができる

  • 新しいことを始めると、いまやっていることを継続する時間がなくなったりしないか?
  • プロダクト開発ではがんばってもあまり成果が出ないような時期もある
    • リファクタリングやテスト追加などはまさにそう
    • そういったときも1つでも変化をもたらせれば日々の生活が変わるのか?
  • はらさんのお奨めは梅原さんの 1日ひとつだけ、強くなる。 世界一プロ・ゲーマーの勝ち続ける64の流儀
  • 本書を読んではらさんのよかったところは「試してみることに失敗はない」
    • それまでも試すことはやっていたはずなのに躊躇してしまう理由として失敗したら時間の無駄だと考えてしまっていた
    • 失敗したら嫌だと考えてしまうところがあったが、この考え方があるから vision pro を購入できる
    • やりたいことをすぐやってみるという思考につながった
  • 面倒くさいときもなるべくパソコンを使うようにしてなにかしら調べる
  • 私はオフィスにいれば、家よりはなにかしら作業するモチベーションになる
  • 目標達成や成果をあげるには環境がもっとも大事
    • 個人の感情を信頼しない
      • 人間は面倒だとすぐ怠けてやめてしまう
    • 環境を整えることでワークフローを洗練させて習慣化する
      • 日記になにか書かないといけないから調べものをする
      • 嫌々ながらでもやっているうちに習慣になってくるとワークフローが洗練していく
      • 人間の運用を変えていくなにかは普遍的な価値またはビジネスチャンスがある
    • 調子の悪いときにどうやって早く脱却するかが大事
      • ひとりでは言い訳を作ったり怠けてしまう
      • このときに他人の助けがいるのではないか?
        • 話しを聞いてもらうだけでも前へ進むきっかけになる

go の結合テスト向けカバレッジ計測の考察

以前リリースパーティーで go 1.20 で結合テスト向けのカバレッジ計測の機能が入ったことを聞いていた。次のブログ記事でやり方が紹介されている。

将来的に結合テストを作るときにカバレッジ計測のカスタマイズを施したバイナリを使って api server を起動する仕組みにすればこの機能を使えることに気付いた。

まずは単体テストを実行して任意のディレクトリ (tests/coverage) にカバレッジ計測のための中間データを生成する。

$ mkdir -p tests/coverage
$ go test -cover ./... -covermode atomic -args -test.gocoverdir="$PWD/tests/coverage"
$ go tool covdata textfmt -i=./tests/coverage -o coverage.out

coverage.out がさまざまなツールの入力となる統計情報となる。例えば、このファイルを使って次のようにしてソースコードのヒートマップの html を作成できる。

$ go tool cover -html coverage.out -o coverage.html

nikolaydubina/go-cover-treemap を使うと treemap でカバレッジのヒートマップを確認できる。

$ go-cover-treemap -coverprofile coverage.out > treemap.svg

カバレッジ計測向けのバイナリをビルドする。そのバイナリを起動するときに環境変数 GOCOVERDIR に単体テストのカバレッジの中間データが含まれるディレクトリを指定する。

$ go build -cover -covermode atomic -o bin/api ./cmd/api/...
$ GOCOVERDIR="$PWD/tests/coverage" ./bin/api -verbose

このバイナリを使って起動した api server に対してリクエストを呼び出すことでカバレッジを計測してくれる。結合テストからバイナリ起動した api server に対してリクエストしたときに GOCOVERDIR に中間データが追加されていく。結合テストを完了したら最終的なカバレッジの統計情報を生成する。 

$ go tool covdata textfmt -i=./tests/coverage -o coverage.out

textfmt のヘルプをみたら同じディレクトリじゃなくてもよいみたい。

$ go tool covdata textfmt -help
...
Examples:

  go tool covdata textfmt -i=dir1,dir2 -o=out.txt

  	merges data from input directories dir1+dir2
  	and emits text format into file 'out.txt'

練習場所のビル探し

今日のバドミントン練習はリフティングを昼夜あわせて85分 (メイビスで75分、エアで10分) した。フォア持ちとバック持ちを交互に切り替えリフティングで398回続けられた。目標の200回を越せるようになった。

バドミントンの練習場所探し

お昼休みに公園へ行って20分ほど軽く練習した。そのときに連続回数が198回だった。あと2回足りなかったのが悔しかったのと、夜にがんばったらできそうかなという見通しをもっていた。

夜は近所で練習場所によさそうなビルを探してまわってみた。まずは少しおしゃれな区役所のビルの軒下へ行ってみた。

たまたま時間帯が悪かったのか、この場所が風の通り道になっているのか、練習を始めて5分ほどやって風の影響が強くて難しそうだったのですぐに撤収した。人通りが少なく照明もよい感じなのだけど、バドミントンの練習は風が強いとどうにもできない。

付近を散策しながら旧居留地にある別のビルへ。従業員の通用口がやや近いところが懸念。従業員が出てきたときにこいつ何しているの?と思うかもしれない。私の視点からもややパーソナルスペース/練習スペースを狭く感じるところはある。風の影響は受けにくい構造にはなっている。ここで15分ほど練習して267回継続できた。初めて200回を超えた。その後、あまり回数が続かなくなったのでまた散策して別のビルへ。

ここも広くて明るくて夜は施錠しているようにみえる。ここは従業員と会うこともない。よい場所なんだけど、照明が明る過ぎて見上げたときにシャトルと照明が重なってしまうと眩しい。照明が明る過ぎても練習しにくいことに気付いた。ここでも20分ほど練習したのに200回を超えなくて次へ移動する。照明が目に入るせいかもしれない。

最後はホームのビルへ。他のビルで練習してみてホームのビルのよさを実感した。もっとも練習スペースが広い。そして照明を背中側にして練習するスペースも十分にある。そうすると、見上げても照明とシャトルが重なることはないので眩しくて失敗してしまう状況を避けられる。構造的に風の影響も受けにくい。ここで20分ほど練習していたら398回、266回、349回と200回超えを3回できた。

フォア持ちとバック持ちのリフティングをしていて安定的するようになってきた。うまくラケットのスィートスポットで打てば真上にシャトルが上がる。50回ぐらいならほとんど動くこともなく上げられる。だいたい100回に1-2回ぐらい、失敗してシャトルをラケットのフレームに当てたりしてシャトル操作が乱れる。ドタバタしてリカバリする。これまではそのときに焦ってしまってシャトルを落とすことが多かった。なぜ200回以上続くかというと、その稀に失敗したときのシャトル操作をリカバリできるようになってきたから。つまり5回ぐらいミスしたときにリカバリできれば200回は続くということになる。これはメイビスフィールドのシャトルを使ったときの話し。

次にエアシャトルを使って同様にリフティングをしてみると最高で50数回ぐらいしか続かない。これはラケットのフレームまたはフレーム近くのガットで弾いてしまうと、コルク部分がプラスチックなために反発せずに落としてしまったり、あらぬ方向へ飛んでいったりしてリカバリがとても難しい。つまり、ラケットコントロールをうまくやらないとエアシャトルでリフティングを継続するのはメイビスフィールドよりもずっと難しい。次の目標としてはエアシャトルで200回を越せるようにラケットコントロールの練習をするのがよいように思える。

テストとビルドタグ

go ではテスト用途のパッケージを httptestiotest といった、通常アプリケーションとしてパッケージを提供しているものもある。しかし、通常のパッケージにしてしまうと、アプリケーションをビルドしたときにテストコードもバイナリにも含まれてしまう。依存パッケージの管理やバイナリサイズを減らす上で不要なコードはビルド対象外になる方が望ましい。自分たちが書いたソースコードがアプリケーションに含まれることはサイズの視点では問題ないが、テスト向けの依存パッケージもアプリケーションに含まれると意図せずバイナリサイズが大きくなってしまったり、パッケージの依存解決に時間がかかったりしてしまう懸念がある。そのため、ビルドタグを用いてテスト用途のパッケージはテストのときしかビルドしないように制御する。

例えば integration というビルドタグを設ける。テスト用途の util パッケージを定義するときは次のようにソースコードを記述する。

//go:build integration

package util

ビルドタグを指定せずに結合テストを実行しようとすると次のようなエラーが発生する。

$ go test ./tests/...
# example.com/tsets/mypackage
package example.com/tsets/mypackage_test
	imports example.com/tests/util: build constraints exclude all Go files in path/to/tests/util
FAIL	example.com/tests/mypackage [setup failed]

結合テストを実行するには次のように明示的にビルドタグを指定して、テスト用途のパッケージをビルドしてテストが実行されるようにしないといけない。

$ go test -tags=integration ./tests/mypackage/...

iphone 16 初期セットアップ

iphone 16 初期セットアップ

今日のバドミントン練習はリフティングを35分 (メイビスで25分、エアで10分)、壁当てを5分した。近所のビルの軒下の照明は21時までと21時から24時までで明るさが異なる。段階的に照明を暗くしているようにみえる。フォア持ちとバック持ちを交互に切り替えながら行うリフティングはやや安定してきた気はするが、100回を超えたぐらいで失敗してしまう。当面は200回連続を目標に練習してみる。21時を過ぎてから風が強くなってきて集中力もなくなったので今日は練習を早めにきりあげた。

エアシャトルは高く上げた方が落下時に安定する。練習していてラケットコントロールを失敗してシャトルをビルの入口の天井に打ち上げてしまった。これはビル管理に怒られるんじゃないかと思って焦った。近くのコンビニで脚立を貸してくださいとお願いしたら店員さんが快く貸してくれた。やさしい世界。脚立を使って、横からラケットでシャトルを手繰り寄せて、ぎりぎり手が届いて回収できた。あと数十センチ中央側に止まっていたら回収できなかった。ほんと助かった。この付近では高くシャトルをあげないという学びを得た。

iphone 16 の機種変更と移行

前の機種変更から2年たったので移行することに決めた。色はグリーンがよかったのでティールというミントカラーを選択して pro ではなくスタンダードなデバイスにした。実際が届いてティールのカラーをみてみると、私のイメージのグリーンとはやや異なったけど、これはこれで悪くないとは思う。これまで使っていた 14 pro とサイズはほぼ同じで厚みが少し薄くなっていた。手にもった感じでは薄くなった分だけ掴みやすかったり包み込めたりして馴染むように思えた。デバイスの触感も悪くない。

さっそく ios のクイックスタート機能を使って移行した。1時間もあれば初期設定はだいたいうまくいった。私にとって重要な移行検証は次の3つだけ。

sim カードを移し変えるだけで電話の発着信もできた。スマホで電話の発着信テストをする方法 から111に電話すると、その後、着信を受けられて発着信のテストができる。Authenticator の初期設定を失敗して初回起動時にバックアップから復旧する選択肢を選ばないといけなかった。誤って新規セットアップをしてしまい、どうやって移行するのかがわからなくてはまった。アプリを一度削除してから再インストールして、再度初期設定することで icloud に保存されている Authenticator のデータを移行できた。

その後、コンビニで paypay を使おうとしてデータ通信できないことにも気付いた。レジに並んでいるときに気付いてよかった。iijmio 乗り換えガイド (初期設定) をみながら APN 構成プロファイルのインストールをする必要があった。これを設定しないと電話回線でデータ通信できない。電話の発着信ができているからデータ通信もできると私は誤解していた。全体を通して、私は少しはまって調べたりやり直したりしたが、スムーズに移行すれば1-2時間もあれば重要なデータを移行できる。あとは個別アプリの再ログインだったり、移行だったりをしていくだけ。銀行アプリなどもやや再設定は申請が必要で面倒だったりもする。

毎日の変化を感じる

今日のバドミントン練習は昼に30分、夜に40分した。リフティングは60分 (メイビスで40分、エアで20分)、キャッチは10分した。バック持ちのリフティング練習をしているうちに腕の筋が痛くなってきた。やり過ぎかもしれない。

フォア持ちとバック持ちを交互に切り替えながらリフティングをする。片方の持ち方だけでやれば200回はできる。しかし、交互に切り替えると50-100回ぐらいしか続かない。雑になってしまったり、遠近感を見誤ったりしてしまう。リフティングを失敗するときは前後の距離感が狂ってしまうことが多い。動体視力は10代後半がピークで40代から急激に衰えていくらしい。視力が衰えるのはもう仕方ないだろうからラケットコントロールを上達させる方がよいのだろう。ビルの軒下は風が通りにくいという特徴があって公園でやるよりも風の影響がなくてやりやすいときもある。あとエアシャトルも少し高めに弾くとコルク部分が重いせいか、直進的に落ちてきてリフティングしやすいことに気付いた。

仕事は楽しいかね?

プロダクト開発をしていると、開発がどんどん遅くなっていってがんばってもあまり進捗していないように実感する時期がくる。もしくは日々の開発業務がマンネリになってしまうこともある。昔からそういう状況のことを 射撃しつつ前進 と呼ばれていた気がする。そんな時期もあるから地道にコツコツと時間をかけて日々できることを積み重ねるしかないと私は考えていた。税理士さんと雑談していて「仕事は楽しいかね?」という名著があることを教えてもらった。要約動画がわかりやすいと紹介していただいた。

まとめは次になる。

  • 楽しく生きるには、遊び感覚で新しいことを試し続けること (価値観があう)
  • 試してみることに失敗はない (価値観があう)
  • 試すからこそ新しい発見がある (価値観があう)
  • むしろ試さないことが失敗である (価値観があう)
  • 大きな目標はなくていい (価値観があう、課題管理)
  • 毎日気になったことを1つ試すことを目標にすること (課題管理)
  • 毎日1つ試し続ければ必ず上達や進歩ができる
  • 成功者はシンプルに試す数がとても多い人 (価値観があう)
  • 今抱えている問題点を書き出して、それを解決するために今動き出すこと (課題管理)
  • 適切な時とか完璧な機会なんてものはない (価値観があう)
  • 現状を把握して1つずつ試す (課題管理)
  • 完璧な状態であっても試し続ける (価値観があう)

私の価値観にあるものも多いし、いくつか課題管理で普段やっていることにも当てはまる。動画をみていて「毎日1つ試す、変化を感じるのが大事」と言っているのが気になった。日々の生活における既存のいろいろをやっていると、他のことをする余裕がなくなってしまい、いま抱えていることの区切りがついてから新しいことをしようと私は考えるところがある。いま注力していることに余裕がなければ、新しいことはしないように私はしている。一方で最近は少し余裕が出てきたこともあり、バドミントンの練習を始めたことが日々の変化になっていて、たしかに気分がよい。毎日の変化をもっと小さいもの、簡単なものにして、なにかを為さなくても日々の変化を感じることを目的にすればいま以上に日々の生活を楽しめるのかなと学びになった。

エアバドミントンのシャトル所感

エアバドミントンのシャトル所感

今日のバドミントン練習はリフティング40分、キャッチ10分、壁当て10分で1時間ほどやっていた。フォア持ちとバック持ちのリフティングを主にやっていた。雨が降ったり止んだりでもビルの軒下なので問題なく練習できた。エアバドミントン のシャトルを購入した。屋外で行うスポーツだから風の影響を受けないよう、中空のようなデザインになっている。購入したシャトルは高耐久性のためにコルクの部分がプラスチックになっている。エアバドミントン向けのシャトルがすべてそうなのかどうかはわからない。

以前 メイビスフィールドとメイビスフィールドIIの違い について考察した。このエアバドミントンのシャトルはコルク部分がプラスチックなのでゴムのような弾力がないためにラケットのスウィートスポットで捉えないとどこに飛んでいくかわからない。メイビスフィールドよりもさらにシャトル制御が難しい。いまリフティングとキャッチの練習はメイビスフィールドを、壁当てはより反発力の高いメイビスフィールドIIを使っている。メイビスフィールドでリフティングをうまくできるようになってきたらエアバドミントン向けのシャトルに変えると難易度が高くなってステップアップによいように思えた。

テストの段取りが捗らない

今日は1日かけてテストケースの更新をするつもりが、開発した過去の issue を見返していて作業漏れに気付いてその修正で半日以上を費やしてしまった。すぐ対応はできたのでそれ自体はよかったものの、また作業が遅れ気味になってストレスが溜まるなぁという所感。夜に作業してもよかったものの、会社の事務手続きしていたらわりと時間が経ってしまって明日ごめんなさいしてもう1-2日時間をもらおうと思う。

法人税の中間申告

10月から11月末までの間に法人税の中間申告をしないといけない。いつも次の順番に連絡がくる。兵庫県のプレ申告データが届いていたので納付した。

  1. 兵庫県
  2. 神戸市
  3. 税務署 (法人税と消費税)

以前は紙の申告書類が送られてきたのを確認して、紙の書類で申告して納付したりしていた。いまは電子申告で行うようにしたので eltax や e-tax のメッセージボックスに前年度に納付した税金から算出したプレ申告データが届く。eltax のシステムはプレ申告データを使って申告書類を半自動生成してくれる。あとはその申告書類の納付税額にあうよう、前年度に納付した税金の情報を入力していけばよい。各種項目の数字のバリデーションチェックも実装されていて、久しぶりに手続きすると、どの項目にどの数字を記載していいか間違ったりするけれど、それを検出して教えてくれる。年に1回しかやらないことだからいろいろ忘れていて助かる。プレ申告データから申告書を作成すると自動的に「予定申告」という区分になる。「中間申告」と「予定申告」は別ものみたいだけど、eltax では「予定申告」に一本化しているのかもしれない。申告した後になって気付いて選択を間違えたかな?と思って焦った。

eltax は「納税メニュー」から「電子申告連動」を選択して申告したデータを検索してから納付情報を取得しないといけない。ここだけが e-tax と手順が違う。納付情報からペイジーで税金を納付する。同じことをあと3回やらないといけない。思い出しつつ、課題管理システムにもメモを残しつつ、やり方を思い出していた。

秋休み4

目次

昨日運動したり出掛けたりしてなんか疲れてしまったのか、普通にお休みしていた。いまひとつのりきれない。