SRE 本は二度以上読む価値がある

@tamagawa_ryuji 氏からこの度和訳して発売された「SRE サイトリライアビリティエンジニアリング」をご恵贈いただきました。

英語の原本は昨年発売されており、Google のサービス運用について実践的な知見が得られる貴重な書籍ということで、去年のうちに英語版を社内で購入し、輪講しています。今回和訳本を頂きましたので、二度目となりますが早速拝読しました。

SRE (Site Reliability Engineering) という言葉を聞きなれない方のために簡単に解説しておくと、Google において古典的なシステム管理者の概念に代えて導入された、システムとその上のサービスの信頼性に責任を持つエンジニアとその仕事のやり方の体系的な概念です。

初めて読んだ際は、SRE とそれにまつわる Toil や Postmortem といった概念や SLO の定義の仕方について Google の知見を学ぶのに精一杯でした。二度目となる今回ですが、以下のような点で読む価値が確実にあると感じた次第です。

続きを読む

iOS でクライアント証明書認証

長年 Android を使っていたんですが、最近 iPhone にしまして。

cybozu.com にリモートからアクセスする際、クライアント証明書で認証する「セキュアアクセス」という機能があるのですが、Safari で使うには証明書を読み込ませておかねばなりません。

Android では PKCS#12 形式のファイルを選択するだけで読み込めたのですが、iPhone だとユーザーインタフェースがないのですね。 調べてみると、会社の iPhone をまとめて設定するために使う「構成プロファイル」という機能があり、この一機能でクライアント証明書を設定できるようです。

構成プロファイルは .mobileconfig という拡張子の XML ファイルで、以下のように自作できます。

続きを読む

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 は公式の解説がほとんどありません。 必然、先人の資料や本体のコードを読み漁ってなんとかするわけで、以下の資料を大いに参考にいたしました。

続きを読む