Goの import cycle に立ち向かう

Goでは、パッケージの循環参照が禁止されている。 循環参照というのは、パッケージAとBがお互いに参照しあってるという状態だ。 循環参照を持ったままビルドすると、次のエラーが出て失敗する。 import cycle not allowed なぜ循環参照が禁止されているのか …

Go + GStreamer でお手軽 WebRTC 体験

P2Pベースで低遅延で映像や音声を送れるWebRTCという技術がある。 映像というのは目に見えるものなので、コードを書いて映像が動くとテンション上がる。 しかし、その分映像や音声データの取り扱いはむずかしい。 WebRTCもそうで、「へぇ〜こんなことができ…

RFC4175 (RTP Payload Format for Uncompressed Video)のコードを書いた

春休みの自由研究(?)として、生の動画データをRTPに乗せて送るプログラムを書いていろいろと学んだので書き残す。 RAW Video (Uncompressed Video)とは 直訳すると「生の動画」。その名の通り何の圧縮もしてない動画データのこと。 RAW Videoにもいくつか…

gRPC for .NET Coreを試して統合サポートのありがたみを感じた

.NET Core 3.0にgRPCのサポートが追加された。 元々gRPCのC#対応はされていたはず、何が違うのか?答えはgRPC公式のブログに書いてあった。 https://grpc.io/blog/grpc-on-dotnetcore/ Unlike the existing C-Core based implementation (Grpc.Core), the ne…

GoのCLIツールとgo get

goでネストしたパッケージの下にCLIツールを作る場合、go get時の挙動がよくわからなかったので試した。 gocmdtest ├── go.mod ├── go.sum └── tools ├── gocmdtestx │ └── cmd │ └── gocmdtestx.go # package main └── gocmdtesty └── cmd └── gocmdtesty.g…

quic-goはどのようにUDPをコネクション指向で扱っているか

TCPは接続相手ごとに1本のコネクション(1つのsocket)を持ち、そこを通路として通信する。 しかし、UDPは異なる。1つのsocketであらゆる通信相手からのパケットを受け取る。 では、UDPで実装されたQUICはどのように接続相手ごとのコネクションを保持してい…

sync.Mutexを使って初歩的なミスで詰まった思い出

go

Goでコードを書いてて、排他制御のためsync.Mutexを使っていた。 テストしてると、ある時点でロック獲得待ちのままずっと止まってしまい「あれ・・・???」てなったので覚えてるうちにメモ。 原因:Lock()するメソッドの中でさらにLockするメソッドを呼ん…

PHPからhandy-spannerに接続する

Google Cloud Spanner、すごいサービスなんですが公式でローカルエミュレーターがないのでローカル環境でのテストが大変。 そこで、@kazegusuriさんがhandy-spannerというSQLite3をバックエンドにしたCloud Spannerのローカルエミュレーター的なものを作って…

context.Contextの親子とキャンセル処理の順序

go

非同期処理をキャンセルする機構としてよく使う context.Context Contextは親子関係が作れて、親をキャンセルするとその子孫も一緒にキャンセルされる。 一緒にといっても、親のキャンセルがトリガーなので、親がわずかに先にキャンセルされると考えるのが自…

Goでcallback patternを考える

go

プログラミング言語ではおなじみのcallbackについて、Goでどのように実装すると良いか考えた。 Goではcallbackよりもchannelが良い? まず、非同期な処理からの結果を通知するしくみとして、Goだとchannelが使える。 しかし、chnanelは双方向だったりcloseで…

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回めということもあって、前回との比較や数値を中心にみて…