Go

クライアント証明書はオプションだったのか

Go

GoでHTTPSサーバをシュッと書いて、curl --cacertで動作確認したら普通に動いたんだが、そういえばcurlはクライアント証明書送ってないんじゃないかって疑問が出てきた。 結論から言うと、サーバからクライアントへの証明書要求はオプションであって、Listen…

MySQL Protocolに入門する

ふと気になった。 ローカル開発環境でMySQLに接続するときにはTCPかunix domain socketを使用していた。ここで、例えばAPIにアクセスするときにはさらにHTTPなどのプロトコルを使用することになるが、MySQLでは一体何のプロトコルを使用しているんだろうとい…

go vetでprintfuncsオプションを使った

Go

go vetコマンドはPrintfのようなメソッドに対してフォーマットで表示する変数の数とその引数の数が一致しない場合(以下参照)にチェックしてくれる。 fmt.Printf("%v, %v\n", "test") しかし、例えば標準logパッケージをラップするパッケージを作った際に、同…

SchemeインタープリタをGoで書いた

Go

背景 Structure and Interpretation of Computer Programs(SICP)を読んでいた。第4章でメタ循環評価機という話題が上がる。これはSchemeのインタープリタをSchemeで書くという、一見矛盾しているようなそんなものである。一旦、そのまま本を読み進めScheme…

GoのバイナリをデプロイするためにGitHub ReleaseからDLするツールをGoで書いた

Go

GoのバイナリをデプロイするためにGitHub Enterprise(以下、GHE)のReleaseにアップロードしておいたバイナリをダウンロードするツールをGoで書いた話をする。 背景 複数の開発が並行していてGitHubのブランチと本番・ステージ環境が対応付けできなかったり、…

RFC2822のフォーマットでテキストを作成するパッケージを書いた

Go

前にgmail APIを叩いた時にRFC2822について調べたが、絶対にフォーマットを忘れる自信があったので簡単なパッケージとしてまとめた。 特にメールのヘッダーに日本語を使いたい時のフォーマットなんて覚えて置ける自信がまるでなかったので。 ブログで記事と…

Goでgmail APIを叩いて下書きを作成する

Go

Go Quickstart | Gmail API | Google Developers 上記を参考にした。サンプルコードは最後に記載する。実装してる途中でメールの題名に日本語を設定できず、RFC2822について調べる必要があったのでメモしておく。 RFC2822 https://www.ietf.org/rfc/rfc2822.…

Goでbase64エンコードを実装する

Go

base64を自分の理解のために実装してみる。 手順はこちらの記事がわかりやすいです。RFCで読むならこちら。 実装したコードは以下の通りです。ほとんど標準パッケージ。 package main import ( "fmt" "os" ) const encodeStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZa…

Emacs × Go でタグジャンプ

helm-gtagsを使ってて、RubyとかPHP書いてたときにはうまくタグを作れてたんだけどGolangでうまく作れてなかった。以下の記事を見つけて試しにやってみたらうまくいった。 Using GNU GLOBAL · GitHub /usr/local/etc/gtags.confを上記の通り修正して以下のコ…

golangでpanicをrecoverしたときにスタックトレースを表示する

Go

golangではそもそもpanicしないようにコードを書くべきだしpanicが発生するならここで発生するのだと把握した上でコードを書くべきだ、という認識はある。とはいえ、golang書き始めてまもないので「念のために」recoverをコードに書いておきたかった。 具体…

negroniの実装をちゃんと理解できていなかったので自分で書き直してみる

Go

以前、ミドルウェアをうまく扱うパッケージとしてnegroniを紹介したが、改めてコードを読むとちゃんと理解できていなかったので自分で書き直してみる。車輪の再発明。GitHubに上げるまでもないのでここに残す。 GitHub - urfave/negroni: Idiomatic HTTP Mid…

deferでのrecoverのよくわからない挙動がよくわからない

Go

deferで呼び出した関数でrecoverした場合にはpanicは発生しない。 https://play.golang.org/p/Z0oJ2I26wq8 package main import "fmt" func main() { defer recoverFunc() panic("Panic happens!") } func recoverFunc() { if err := recover(); err != nil …

Goでgraceful restartをミニマムに書く

Go

前回の記事でgraceful shutdownをミニマムに実装した。その続きでgraceful restartをミニマムに標準パッケージのみで実装してみる。 takayukinakata.hatenablog.com 参考にしたのは以下のパッケージ。 github.com 実装 前回と同様、理解のために最低限の実装…

Goでgraceful shutdownをミニマムに書く

Go

graceful shutdownの仕組みがわかってなかったので自分でミニマムに実装してみる。 コード量が小さく読みやすかったので以下のパッケージを参考にした。 github.com github.com 実装 自分でミニマムに実装したコードは以下の通り。アクティブな接続が返って…

Goで始めるMiddleware その2

Go

前回記事を書いたがもう少し詳しく書く。 takayukinakata.hatenablog.com なぜGoでMiddlewareを書きたいのか 前回書き忘れていたところ。 おそらくだがフレームワークを使用している場合には、フレームワークがよろしくやってくれるので自分でMiddlewareをど…

Goの標準logでやってるintをasciiにする変換処理を見てみる

Go

Goのlogパッケージでやってるintをasciiにする変換処理が何やってるか最初わけわかんなかったけど、多少理解できたからメモしておく。対象のコードは以下の通り。標準で年月日をログの先頭に付与できる機能(2009/01/23 01:23:23 log-messageみたいな感じ)が…

Goで始めるMiddleware

Go

そもそもMiddlewareとは何かと言うと、私の認識ではアプリケーションの処理の前後で何らかの処理を行ったりするもの。例えば、ログを追加したりリクエストのAPIキーを認証したりする。以下の図がわかりやすい。 Laravel 5.0 - Middleware (Filter-style) | M…