GoでTCPソケットを読み書きするときに起こるエラー

ソケット通信は双方向で遠隔という複雑な条件下のためさまざまなエラーが発生する。 Goでソケット通信を書いていて、言語の力のおかげで記述は楽になっているが、下層で同じOSの機能を使っている以上エラーは避けられない。 そもそも、どんなときにどんなエ…

go run -race の有無で挙動が変わる例

go

goroutineを利用したプログラムではよく -race オプションをつけてデータ競合 (race condition) がないかチェックして開発する。 しかし、今日 -race をつけると挙動が変わるという現象に遭遇したのでそれを調べたメモ。 次のようなコードで再現可能。 packa…

2019年の技術的ふりかえり

2019年もあと少し、ふりかえりの時期となった。 去年の記事は 2018年に(技術的に)やったこと - castaneaiのブログ であり、去年は Google Cloud Platform を触り始めてクラウドを初めてまともに使ったことがハイライトだった。 では、2019年はどうかという…

Agonesを使った実装でgo buildできなかったので、go modulesでk8s関連のバージョンを揃えたらなおった話

Agonesを使ってGoからゲーム用サーバーの割当をしてみようと思って、GoでAgones Client APIを使ったものを組んでみた それで早速 go run してみたら、次のようなビルドエラーが出てしまった。 # k8s.io/client-go/rest ../../go/pkg/mod/k8s.io/client-go@v1…

#技術書典 7 にサークル参加しました(gRPC本を出しました)

9月22日に開催された技術書典7 にサークル参加しました。 前回の技術書典6 から続いて2度めの参加です。 前回は「はじめて本を出してみて、楽しかった(つらかった)こと」を色々書きましたが今回は2回めということもあって、前回との比較や数値を中心にみて…

Building PHP with Debug symbol on Docker

きっかけ Docker 上の PHP でとあるテストを行っていたところ、いきなり Segmentation fault で落ちるという事件が発生。 このレベルで落ちたときは gdb をつかって調査するのだが、gdb で開いたら "No debug symbol found" と言われてしまった。 TL;DR [1] …

GoLand で goenv のSDKをつかう

go

GoLand 上で指定した Go のバージョンでプログラムを動かしたい。 複数バージョンの Go を管理する goenv があるのでこれを使ったが、GoLand のエディタ上では自動的には認識してくれない。そこで goenv で指定したバージョンを GoLand にも認識させる作業が…

Agones を minikube でさくっと試す

Agones とは、Kubernetes でゲームサーバーをいい感じに管理できるやつ。 minikube で試す Kubernetes 自体がでかい概念でむずかしいけど、minikube であればノートPC単体で動かすことができるので、早速やってみた。 Install and configure Agones on Kuber…

#技術書典 6に初サークル参加(App Engine本を出しました)

4月14日に開催された技術書典6 にサークル参加しました。Google App Engine を使った Webアプリ開発入門の本です。 (▼PDF版は今でも販売中です!) castaneai.booth.pm 作って、頒布して、いろいろな学びがあったのでつらつらと書いていく。 本を作るきっか…

Mirakurun を用いたMac用TV視聴ソフト「Meruru」を作った

TVTest というソフトがあって、PT3などのチューナーがあればすぐにTVを視聴できる。しかし、TVTest は Windows 専用である。 ということで、Mac で楽に見る方法はないだろうかと探した…けどなかったので作った。 Mac OS用のアプリを作ったのは初めてで、Swif…

Go のエラー処理を整理

go

Go のエラー処理はけっこう独特。なにをもってエラーかというと、次の interface を満たすだけ。 type error interface { Error() string } めっちゃシンプル。でも、これだけで本当に実際にエラー処理やっていけるのか。 特定のエラーを判別する エラーによ…

go modules のつかいかたメモ

npm などのパッケージマネージャはよく使うのだけど、それに比べて go modules は最初「?」となることが多かったのでメモ すべてのはじまりは go mod init まず、始まりは go mod init である。これは npm init のように最初やる必要がある。 go mod init …

セマフォのctx引数ミスで永遠に待ってしまう例

Go のコードレビューしてて次のようなコードに遭遇した。sem.Acquire() にわたす ctx が context.Background() になってしまっていて、WithTimeline が切れても ctx.Done にいってくれない、ということがあった。 解決策としては、 sem.Acquire() に同じ ctx…

python 3.7 aiohttp をつかって並列リクエスト

最近あまり python を触ってなくて、久しぶりに見に行ったら async/await keyword が増えてた。さっそく http で並列リクエストしてみる。 asyncio をベースにした http library aiohttp を使った。 import aiohttp import asyncio async def req(url): asyn…

node_modules/ and Docker volume mount 問題と対策

最近のプログラミング言語はたいていパッケージマネージャーがある。 よくある実装だと、vendor/ や node_modules/ といったディレクトリに必要なライブラリが全部入る。 しかし、この方式はDockerで開発する際に問題がある。 この記事では、実例のひとつし…