http.Response を返すような関数は作らないのが賢明

Go 1.7 から本体に入った context パッケージは便利、というより今や必須の道具です。以下のように書くことで、一定時間で処理をキャンセルできたりします。

func slowOperationWithTimeout(ctx context.Context) (Result, error) {
    ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond)
    defer cancel()  // releases resources if slowOperation completes before timeout elapses
    return slowOperation(ctx)
}

defer cancel() とありますが、このようにしないとリソースリークするので context 使うときはこう書くのがパターンです。

さて、以下のプログラムですが、返ってくるデータが小さいうちは問題なく動きますが、大きなデータになると resp.Body の読み込みで必ずエラーが返るようになります。

続きを読む

「みんなの Go 言語」は忙しいプログラマこそ読むべき本

@songmu 氏からご恵贈いただいた「みんなの Go 言語」(みんGo)、早速拝読しました。

書評としてはタイトル通り、なのですがそれではあんまりなのでもう少し。

本書でも述べられている通り、Go 言語は早ければ一日で大体学べてしまう学習効率の良さが魅力です。最大の魅力と言っていいかもしれません。コンパクトな言語仕様に実務で必要な周辺ツールが揃っているため、初学者から歴戦のプログラマまで活用範囲が非常に広いのです。

さて、その Go 言語をさらに活用するための本書。お手に取ってみればわかりますが 150 ページ弱で薄い本です。読むのに半日あれば十分でした。本の内容も余計なことは書かれておらず、「こんな便利な機能があるよ」くらいなあっさり風味で淡々と役に立つ情報が並べられています。

ああ、わかっているなと。

Go 言語の最大の魅力と思う学習効率の高さを、文字通り形にした本、それが「みんなの Go 言語」です。

私はかなり Go を使いこなしているプログラマです。社外に公開している Go のプロジェクトだけでも 7 つあり、社内でもさらに多くのツールを Go で作成しています。つまり一通り Go に関する知識を持っている状態で「みんGo」を読んだのですが、本書の四分の一くらいは新規に知るツールやテクニックでした。逆に言うと四分の三は日々実践で使っている知識なわけで、有用度合いが非常に高いです。

知らなかった四分の一についても、すぐに試してみたいものがたくさんありました。特に第2章「マルチプラットフォームで動作する社内ツールの作り方」は知らない知識の山でした。Windows でビルドしてこなかったもので(ごめんなさい mattn さん)。。

最後に、第三章を執筆した @fujiwara さんにぜひ拙作の cybozu-go/cmd をお試しいただけると嬉しいなと思いました。この章のテーマであるログ、タイムアウト、シグナル、goroutine の停止を Go 1.7 の context で解決するツールですので。宣伝失礼。

素晴らしい本をありがとうございました!

Windows の Path をコマンドラインから設定する

メモです。C:\Go\bin にパスを通したいとして、以下のようにするとマシン全体の Path に追加できます。

  1. PowerShell を管理者権限で起動する
  2. 以下を文字通りに入力する

    [Environment]::SetEnvironmentVariable("Path", $env:Path+";C:\Go\bin", "Machine")

  3. コマンドプロンプトを別途開いて go を打ってみる

GUI が諸事情で使えない人はどうぞ。

memcached の二つのプロトコルと API デザインの難題について

yrmcdsという memcached のクローンを開発・メンテナンスしています。yrmcds は memcached を機能拡張しているので、クライアントライブラリも独自に開発する必要があり、libyrmcds という C/C++ 用クライアントライブラリとそれを基にした php-yrmcds という PHP の拡張モジュールも開発・メンテナンスしています。

この時点でもう関心ない人が大半だと思いますが、ここから書くのは世界中でたぶん私くらいしか苦労してないし、することもない話です。苦労したので書き残しておくか、くらいな駄文です。 You've been warned!

続きを読む

PHP7 で yrmcds クライアントの拡張を動くようにした

先日 PHP のメジャーバージョンである [PHP7][] がリリースされました。 性能向上のために内部構造が大きく変更されているため、PHP5 向けの拡張モジュールは大幅に書き直しが必要です。

拡張モジュールを開発したことがある人はご存知の通り、PHP の内部 API は公式の解説がほとんどありません。 必然、先人の資料や本体のコードを読み漁ってなんとかするわけで、以下の資料を大いに参考にいたしました。

続きを読む

先頭行だけ grep してファイル名を表示したい

/usr/local/bin にある #!/usr/bin/python3 をみつけたい、場面です。

こんな感じ。

find /usr/local/bin -type file | xargs awk '/python3/ {print FILENAME} {nextfile}'

1行目だけ検査したらさっさと nextfile で次に移るので OK というわけ。

nextfile Stop processing the current input file. The next input record read comes from the next input file. FILENAME and ARGIND are updated, FNR is reset to 1, and processing starts over with the first pattern in the AWK program. If the end of the input data is reached, the END block(s), if any, are executed.

追記

FNR (行番号)を if で判定して nextfile することで、任意の行数を処理できます。
あと、grep といいつつ awk なタイトル詐欺ですみません。