Goでコードを書いてて、排他制御のためsync.Mutexを使っていた。 テストしてると、ある時点でロック獲得待ちのままずっと止まってしまい「あれ・・・???」てなったので覚えてるうちにメモ。 原因:Lock()するメソッドの中でさらにLockするメソッドを呼ん…
Google Cloud Spanner、すごいサービスなんですが公式でローカルエミュレーターがないのでローカル環境でのテストが大変。 そこで、@kazegusuriさんがhandy-spannerというSQLite3をバックエンドにしたCloud Spannerのローカルエミュレーター的なものを作って…
非同期処理をキャンセルする機構としてよく使う context.Context Contextは親子関係が作れて、親をキャンセルするとその子孫も一緒にキャンセルされる。 一緒にといっても、親のキャンセルがトリガーなので、親がわずかに先にキャンセルされると考えるのが自…
プログラミング言語ではおなじみのcallbackについて、Goでどのように実装すると良いか考えた。 Goではcallbackよりもchannelが良い? まず、非同期な処理からの結果を通知するしくみとして、Goだとchannelが使える。 しかし、chnanelは双方向だったりcloseで…
ソケット通信は双方向で遠隔という複雑な条件下のためさまざまなエラーが発生する。 Goでソケット通信を書いていて、言語の力のおかげで記述は楽になっているが、下層で同じOSの機能を使っている以上エラーは避けられない。 そもそも、どんなときにどんなエ…
goroutineを利用したプログラムではよく -race オプションをつけてデータ競合 (race condition) がないかチェックして開発する。 しかし、今日 -race をつけると挙動が変わるという現象に遭遇したのでそれを調べたメモ。 次のようなコードで再現可能。 packa…
2019年もあと少し、ふりかえりの時期となった。 去年の記事は 2018年に(技術的に)やったこと - castaneaiのブログ であり、去年は Google Cloud Platform を触り始めてクラウドを初めてまともに使ったことがハイライトだった。 では、2019年はどうかという…
Agonesを使ってGoからゲーム用サーバーの割当をしてみようと思って、GoでAgones Client APIを使ったものを組んでみた それで早速 go run してみたら、次のようなビルドエラーが出てしまった。 # k8s.io/client-go/rest ../../go/pkg/mod/k8s.io/client-go@v1…
9月22日に開催された技術書典7 にサークル参加しました。 前回の技術書典6 から続いて2度めの参加です。 前回は「はじめて本を出してみて、楽しかった(つらかった)こと」を色々書きましたが今回は2回めということもあって、前回との比較や数値を中心にみて…
きっかけ Docker 上の PHP でとあるテストを行っていたところ、いきなり Segmentation fault で落ちるという事件が発生。 このレベルで落ちたときは gdb をつかって調査するのだが、gdb で開いたら "No debug symbol found" と言われてしまった。 TL;DR [1] …
GoLand 上で指定した Go のバージョンでプログラムを動かしたい。 複数バージョンの Go を管理する goenv があるのでこれを使ったが、GoLand のエディタ上では自動的には認識してくれない。そこで goenv で指定したバージョンを GoLand にも認識させる作業が…
Agones とは、Kubernetes でゲームサーバーをいい感じに管理できるやつ。 minikube で試す Kubernetes 自体がでかい概念でむずかしいけど、minikube であればノートPC単体で動かすことができるので、早速やってみた。 Install and configure Agones on Kuber…
4月14日に開催された技術書典6 にサークル参加しました。Google App Engine を使った Webアプリ開発入門の本です。 (▼PDF版は今でも販売中です!) castaneai.booth.pm 作って、頒布して、いろいろな学びがあったのでつらつらと書いていく。 本を作るきっか…
TVTest というソフトがあって、PT3などのチューナーがあればすぐにTVを視聴できる。しかし、TVTest は Windows 専用である。 ということで、Mac で楽に見る方法はないだろうかと探した…けどなかったので作った。 Mac OS用のアプリを作ったのは初めてで、Swif…
Go のエラー処理はけっこう独特。なにをもってエラーかというと、次の interface を満たすだけ。 type error interface { Error() string } めっちゃシンプル。でも、これだけで本当に実際にエラー処理やっていけるのか。 特定のエラーを判別する エラーによ…