晩酌セット

目次

昨日はテンションがあがらなくて前泊をやめて久しぶりに始発の新幹線にのって東京へ向かう。ゼロ時頃まで作業をして帰って晩ご飯を作って食べて、お風呂入って、適当に時間を潰したり仮眠したりしているうちに5時頃になって出掛けた。新幹線でもなるべく寝ておこうと思ったものの、あまり寝付けなくて仮眠程度だったと思う。過去の経験だと、始発でいくと夕方には眠気と疲労でしんどかったりするものが、休日明けのせいか、まったくしんどくなかった。なんか体調管理もおかしい。

いつも通りマイルストーン最終日の定例会議に出席して、そのスケジュールにあわせて issue を2つ fix して、可もなく不可もなく特徴のない1日の働き方だった気がする。

お昼ご飯を食べる余裕がなくて夜にまとめて食べた。この前チームランチで行った ハルピン という中華料理屋さんを気に入っていて、その後も出張のときに必ず1回は行くようになった。晩酌セットというのがあって小皿3品 + 餃子3個 + 飲みもの1杯で1330円というコース。たとえば、小皿の1つは次のよだれ鶏のようなもの。

餃子はこんな感じ。

私はこの晩酌セットに単品で料理をもう1つ頼む。今回は定番料理の鶏肉のカシューナッツ炒めを食べた。おいしかった。

2000円ちょっとで一杯飲んでいくつか料理も味わえて満足、且つコスパもよい。今後も2泊するうちのどちらか一方の晩ご飯はこのお店になる可能性が高い。

前泊のドタキャン

朝から起きてはいたものの、午前中は漫画読んでだらだらしていて、お昼からオフィスへ行って作業していた。軽くコードを書いてリファクタリング後の機能拡張の issue を2つ fix した。先週いっぱいリファクタリングして内部設計を改善したので、その先にある機能拡張は容易ですぐに対応できた。本当は今晩から移動して前泊する予定だったが、今晩のホテルを予約してなくて新幹線も遅れたりしている状況だったので明日の早朝に変更した。スマートEX 便利。

近況報告の資料作り

昨日やろうと思っていたものの、休んでいたので今日作っていた。issue の数字だけみればまずまずの実績ではある。意図していた機能開発も動くレベルでは実装できていて完璧ではないが悪い状態ではない。先週と今週は3連休が2回続いて、9月は祝日が2日あって稼働時間が少ないことを考慮すると、十分と言える気もする。今月は若いメンバーの開発したモノをレビューしたりリファクタリングする時間を多くとった。その過程で 相手に責任を投げてしまわない働き方 の考察をする機会にもなった。若いメンバーがそうなるためには経験や時間を必要とするのはわかりつつ、自律的な働き方への取り組みとしてマネジメント側からできることはあるのか、もしくはただ待つだけなのか、そういう話題も近況報告のスライドに入れてみた。

故障した fitbit の発送

サポートとやり取りして デバイス異常になってしまった fitbit を返品することになった。メールで添付されてきた返品票を印刷して、壊れたデバイスと一緒に梱包してファミリーマートへ持っていった。発送用の QR コードもメールに添付されていた。ファミリーマートの 宅配便・配送 サービスで読み取ったレシートをレジへ持っていって、店員さんから配送用のラベルを受け取って梱包物に貼り付けて発送できた。先方で返品確認してから交換用デバイスを送ってくれる予定。

秋休み3

目次

昨日はいろいろ活動して疲れてしまったのと、雨降りもあってだらだらしていた。

よい土曜日

土曜日はだらだらしがちなのが、今日は朝から起きて活動できた。お昼に少しコードを書いて、夕方にストレッチして、夜はカフーツさんへ行ってきた。よい一日になった。

みなとのもりの運動

前回の所感 。起きてからシャワーを浴びようとしたときにふと軽く走ってこようと思い立って9時過ぎから公園へ出掛けてトラックを3周ほどジョギングしてきた。公園に近いマンションに引っ越したことのメリットを活用できた。運動するとそれだけで報酬系を刺激して気分がよい。これまでは起きてもしんどくて出掛ける余裕がなかった。ジョギングへ出掛けられるぐらいには体力が回復してきたのかもしれない。来週も朝からジョギングへ出掛けてみたい。

ラケット選び

うちらの業界で言えば未経験者が「どのプログラミング言語を学べばよいですか?」という質問の答えになる。私なら一番無難なのは typescript で、データ分析や汎用用途で学ぶなら python、バックエンドが好みなら go といったようにお奨めする。こういう答えのない問いは経験者にこれと決めてもらうのがよい。ラケット選びのサイトをみてもパラメーターがいくつかあるのは理解できたが、最初にどのラケットを選択してよいかがわからない。経験者のやまとさんに相談してみた。エントリーモデルの、価格帯は1万円前後のものでよいという。振った感じで合う合わないがあったりするから、お店へ行って店員さんに相談したり試し打ちさせてもらったりするのがよいとのこと。相談に乗ってくれる近所のバドミントンショップを教えてもらった。モチベーションを上げていく意図で道具を揃えていくのもよいと思う。

ストレッチ

水曜日にバドミントン をしたことによる筋肉痛が残っていた。腰や背中のあちこちが痛かった。あと右腕や右肩もバドミントンでラケットをたくさん振ったことによる影響で張りや硬さがみられた。運動した張りをストレッチでほぐすようなサイクルになれば健康にもよさそうにみえる。今日の開脚幅も開始前149cmで、ストレッチ後153cmだった。

カフーツさん訪問

ストレッチを終えてからビールとおつまみをもって久しぶりにカフーツさんへ行ってきた。先週末にだらだらしてしまったからその反省も踏まえて出掛けることにした。ちょうどバドミントンのイベントをよく手伝ってくれている方がいて、あちこち友だち探しをしているようにみえるのでその一つとしてカフーツさんを紹介していて 以前にもキャンプ飯部 に参加していた。知っている人がいないとなかなか参加しにくいと伺っていたので一緒に参加してきた。しかし、参加者内で女性1人なってしまって、これはこれで居心地が悪そうにもみえた。他に女性の参加者が何人かいそうなカフーツさんのイベントを紹介した方がよかったなと反省した。

書店というビジネスの在り方について、いとうさんと議論していて、この本を読めと 取り戻す旅 という本を貸してくれた。本当は自分で買ってよいのだけど、なんとなくそのまま借りてみた。読んで内容がよかったら買ってみようと思う。本書では Culti Pay(カルチペイ) という取り組みをしていて みんなの銀行 を介して著者に投げ銭のようなこともできるという。新しい価値観に触れるという意図でも読み終えた後でやってみようと思う。

最低限のリファクタリングを終えた

昨日のリソース管理のリファクタリングでもっとも煩雑なところの作り直しは終えたので今日は別の機能拡張を実装していた。夕方に散髪へ行ってきた。気付いたら前に散髪してから3ヶ月以上たっていた。生活に余裕が戻ってきた。

fitbit 故障?

水曜日あたりに急にバッテリー切れになった。だいたい3-4日はもつのであれ?と思いながら充電していたものの、丸一日放置しても電源が入らない。fitbit のサポートは電話対応しかしていない。9時まで待って電話したらつながって、サポートの担当者とトラブルシューティングをしていたものの解決しない。購入して1年間は保証期間なので交換対応もしてくれるという。その手続きのためのメールをもらいつつ、充電ケーブルに接続した状態で夜まで放置していたら急に電源が復旧した。復旧した、bluetooth のペアリングをやり直して、ファームウェアをアップデートした。よかったと思えたのも束の間、腕につけていると2時間ほどでバッテリーが50%を切っている。歩いていないのに歩数もすごいことになっていてデバイスが異常な状態になっているようにみえる。

75,000 歩を達成して妖霊(ジン)の靴バッジを獲得しました!

バドミントンの練習場所の確保

毎月1-2回バドミントンを始めて半年ぐらいたった。やっていると楽しくなってきて趣味の1つとして継続的に取り組もうと考えている。募集のタイミングをみてバドミントン教室にも通ってみようと思うし、どこか練習させてくれるコミュニティがあれば出稽古へ行ってもよい。そこで練習をしたい。個人的には体育館でなくても構わないけれど、バドミントンを練習するには練習相手が必要になる。練習相手をみつけるために練習場所を確保する必要がある。したがって体育館を安定的、且つ定期的に予約できるのが望ましい。磯上体育館はおそらく月に1-2回が限度だと思う。

たまたまながいさんと話していて ICTを活用した中学校体育館の夜間開放 を教えてもらった。三宮.dev の仲のよいメンバーを構成員として団体登録の利用申請を出した。アカウント登録に10日ほどかかるという。このサイトに料金は書いていないので無料なのかな?磯上体育館の抽選の過密さ (土曜日の昼間時間帯は申込みが100を超える) から考えると、他の団体も知っていて中学校体育館も予約や抽選でなかなか当選しないといった予感もしている。

pipe による関心の分離

目次

go の Pipe は go 言語プログラミングのよいところをいくつか同時に実感できる、実用度の高いユーティリティだと思う。go 言語は writer や reader をインターフェースとして定義している。細かいメソッドの違いでいくつかの writer/reader インターフェースを区別していたりもするが、基本的には write/read のメソッドをもっていればよい。

type Writer interface {
	Write(p []byte) (n int, err error)
}

type Reader interface {
	Read(p []byte) (n int, err error)
}

この汎用的な writer/reader のインターフェースに従っていれば、さまざまな要件に対して抽象化ができる。オンメモリでデータを扱うこともあるし、OS のファイルシステム上のファイルとして扱うこともあるし、オブジェクトストレージ上のオブジェクトとして扱うこともある。そういった具象オブジェクトの如何によらず writer/reader のインターフェースに従うことでデータ処理とリソース管理を分離できる。これはプログラミングパラダイムにおける 関心の分離 と呼ばれていることを実現する。

バッチ処理において複数データを読み込みながら処理を行い、処理中にエラーが発生したら、そのエラーデータを特定のファイルに書き込みしたい。エラーが発生したときだけ特定ファイルを生成する。そういった要件は次のように実装できる。

func write(w io.WriteCloser) {
	defer w.Close()
	/*
		if true {
			return
		}
	*/

	records := [][]string{
		{"first_name", "last_name", "username"},
		{"Rob", "Pike", "rob"},
		{"Ken", "Thompson", "ken"},
		{"Robert", "Griesemer", "gri"},
	}

	cw := csv.NewWriter(w)
	for _, record := range records {
		if err := cw.Write(record); err != nil {
			log.Fatalln("error writing record to csv:", err)
		}
	}
	cw.Flush()
	if err := cw.Error(); err != nil {
		log.Fatal(err)
	}
}

func read(r io.ReadCloser) {
	rr := bufio.NewReader(r)
	line, _, err := rr.ReadLine()
	if err == io.EOF {
		return
	}
	/*
		writer, err := os.Create("./test.txt")
		if err != nil {
			log.Fatal(err)
		}
		defer writer.Close()
	*/
	writer := os.Stdout
	if _, err := writer.Write(append(line, []byte{'\n'}...)); err != nil {
		log.Fatal(err)
	}
	if _, err = io.Copy(writer, rr); err != nil {
		log.Fatal(err)
	}
}

func main() {
	r, w := io.Pipe()
	go write(w)
	read(r)
}

Pipe を使うことで読み込みの処理と書き込みの処理を分離できる。ここでいう読み込みはバッチ処理、書き込みはエラーデータの保存処理に相当する。普通に実装すると、バッチ処理中にエラーデータの保存処理も記述することになる。業務のコードだと本質ではないリソース管理が煩雑になってしまう。2つの処理に分割するため、どちらか一方は非同期で実行する必要がある。ここで goroutine のシンプルさが際立つ。さらに pipe を使えば、reader 側は writer が Close するまでブロックするから終了処理の同期も自然なコードで実現してくれる。

非同期/並行処理の難しいところを go のインターフェースによる抽象化、簡潔な goroutine 記法、pipe に隠蔽された自然な同期処理の3つで簡潔に表現している。複雑さに対してこれほど簡潔なコードはそうそうないと思う。このコードを他の言語で実装しようとしたらもっと複雑になるはず。このサンプルコードとともに若いメンバーにリソース管理のリファクタリングをコードレビューで指摘したものの、そのメンバーには理解できなくて実装できなかった。そして、その処理を私が作り直すことになったというのが、今日のお仕事だった。本当は難しい非同期/並行処理をいくら簡潔にしても、その経験がないと人間には理解できない。まさに本質的複雑さを表しているように思える。

プログラミングとバドミントン

よく働き、よく遊ぶみたいな一日だった。

リファクタリングの最後の集中力

昨日から集中力を維持してずっとリファクタリングしている。やや複雑な機能をリファクタリングしているため、今週いっぱいはかかる見通し。本当は私が一から書き直した方が早い。しかし、若いメンバーに指導する意図もあるため、既存のコードを読んで誤りを訂正したり、仕様を確認したりしながら手直ししていく。射撃しつつ前進 の成果は着実にみえてきて、しんどいけど、コードの品質はどんどん改善している。マネージャーと 1on1 でリファクタリングの状況も伝えながら開発のイテレーションをもう1つ増やした方がスケジュール的にはよさそうかなぁみたいな共有もしていた。

体育館でバドミントン

前回の所感 。17時でお仕事を終えて最初で最後?の しみん福祉スポーツセンター の体育館を借りてバドミントンをしてきた。18時から21時の3時間枠で料金は3,000円。磯上体育館が2時間で700円なのと比べると割高になる。しかも、磯上体育館の方が駅に近いため、他地域から来られる方も参加しやすい。今後はこのスポーツセンターの体育館を借りるのはやめようと考えている。体育館予約にはリスクがあって3ヶ月前に予約しないといけないため、予約しても本当に参加者が来るかどうかわからない。一番悲惨なのは予約したけれど、誰も来なかったというパターン。いまのところ、そういう状況は発生していない。

閑話休題。今日は新しい人も2人きて全部で5人参加した。初めて行ったスポーツセンターの体育館は広くて設備そのものはとてもよかった。

前回来られた方に教えてもらった KALIDIAバドミントンチャンネル の動画を ipad にダウンロードしてもっていった。体育館で参加者と一緒にみながら次の練習をやってみた。動画をみたら簡単そうにみえるけど、実際にやってみると、狙ったところに打てないことに気付く。こういう地道な練習をしないとスキルが上達しない。もっと練習のパターンを増やしていきたい。

初めて来られた若い方がテニスをずっとされていたらしく、バドミントンも上手だった。前回もうまい人が来てくれて練習方法を教えてくれた。うまい人のプレーをみていると、あんな風にできたら楽しそうとか、思い通りにラケットやシャトルの操作ができなくて悔しいとか、感情的にモチベーションがあがってきた。あと久しぶりに運動して汗をかいてよい気分転換になった。

業務としてのリファクタリングへの集中力

目次

今週からメンバーが開発した、少し大きめの機能の品質改善のためにリファクタリングをしていく。本当は週末に進めておこうと思っていたものの、どうにもやる気がなくてまったく手をつけられていなかった。不思議なもので休日は朝起きられなかったりオフィスへ行ってもまったくコードを書けなかったのに、平日なら普通に朝8時までに起きてオフィスへ行って集中して作業できた。2日休んでいるので体力を回復していたというのはある。それでも休日と平日の業務としてのプログラミングへの集中力の違いは何なんだろう?とやぎさんに相談したら 反脆弱性[上] という本にその答えが書いてあったと教えてもらった。この本を読まないとその答えは得られない。しかし、いまの私は本を読む元気がない。誰か読んだ人がいたら私にわかりやすく教えてほしい。

私が書いたコードに対する不備や欠陥は責任感からリファクタリングをする一定のモチベーションになる。しかし、他人が書いたコードのリファクタリングはそのモチベーションがいくらかレベルダウンするのではないか?という仮説もある。他人のコードを読んで理解するのはコストがかかるし、本質的には他人のコードを読むことはできても理解することはできない。コードの出典に起因するストレスもあるのかもしれない。

秋休み2

目次

昨日に引き続き、やる気が出なくてなにもせずお休みしていた。

秋休み1

目次

お昼はだらだらしていて夜にオフィスへ行ったものの、全然やる気が出なくてとくに作業は進められなかった。

連休の初日

昨日も2時頃までコードを書いていて帰って寝たらお昼ぐらいまで寝ていた。ストレッチ終えてからコードを書こうと思っていたものの、モチベーションがあがらなくてだらだらしていた気がする。

ストレッチ

今週もデスクワークの時間が長かったせいか、軽く腰の張りを感じた。トレーナーさんからも運動不足からカラダの硬さがみえるといった指摘があった。先週はレビューの時間が多くてあまり時間を時間を取れなくて業務があまり進捗しなかった。そのストレスもあってなのか、また生活の余裕がなくなってきた。今日の開脚幅も開始前149cmで、ストレッチ後153cmだった。