読者です 読者をやめる 読者になる 読者になる

はてな退職の辞

はてなを8月末で退職することになりましたので、お知らせします。

はてなに入社してから10年経ち、年齢も40を越えてきたタイミングでそろそろもう一つチャレンジしようかなという想いから、わがままを言わせてもらいまして今回の退職という形にすることになりました。退職理由として、はてなになにか不満や問題があったわけではなく、あくまで僕が新しいことをしたいという意図を汲んでもらって社長をはじめとする経営陣からも円満に送り出してもらっています。はてなのエンジニア層もこの数年で質量ともに充実し体制もだいぶ形が整っており、安心して後を任されるようになっています。

はてなでの10年間では、いろいろな経験をさせてもらいました。前任の伊藤直也さんから引き継いだCTOを6年勤めたのをはじめ、アプリケーションエンジニア、インフラエンジニアから、ディレクター、事業責任者、サポート部長、総務部長、法務部長など、エンジニアらしからぬポジションも勤めた時期もありました。ウェブサービスを作り、会社を育てていく、ということの様々な側面を体感することができ、今後の大きな糧になると考えています。

僕が中心となって立ち上げてきたMackerelについては、サービス開発や導入実績も順調で、チームの雰囲気も非常に良い状況です。既に直近1年は僕の手からは離れており、CTOという立場で側方から支援をするという体制になっていました。今後、はてなを退職した後もなんらかのかたちでサポートしていきたいと考えています。

はてなのCTOの後任については、 id:motemen (大坪弘尚)にバトンを渡すことになりました。彼が新卒だった頃からずっと一緒に働いてきた信頼できるエンジニアで、彼が作ったghqには僕も朝から晩までお世話になりっぱなしです。第一線バリバリのアプリケーションエンジニア出身のCTOとして今後のはてなのエンジニアリングに僕とはまた違った味を加えてもらえるものと期待しています。

僕自身の今後については、また別の機会にお知らせできるかと思います。

ひとまずしばらくまったりしていく予定です。いろいろお誘いいただければそそくさと顔を出そうかと思いますので、皆さま今後ともよろしくお願いします。

Go本体にContribute成功した話 と Gerritの話

来月ぐらいにはGo 1.7がリリースされそうなのですが、CONTRIBUTORSに名前が載せられそう( https://github.com/golang/go/blob/release-branch.go1.7/CONTRIBUTORS#L915 )なので記念エントリです。

f:id:stanaka:20160728104134p:plain

内容自体は、4月にあったGoCon 2016 Spring( http://gocon.connpass.com/event/27521/ )での発表済みです。

tl;dr

  • 一部のディストリの最新版でlinux/386でビルドしたバイナリが起動すらできない、というバグがあった
    • 問題はruntimeのアセンブラ部分だったけど、なんとかパッチ書けた
  • パッチ提出→コードレビュー→やりとり→マージまで、3日程度とスムーズに進行できた
  • Gerritを初めて使ったけど、GitHubとはまた違った思想を感じられて面白い

コントリビュート成功までの流れ

対処

Golangのレビュープロセス

  • コントリビュートの方法は丁寧なドキュメントがある https://golang.org/doc/contribute.html
  • git-codereviewというサブコマンドが用意されてる
  • 基本的には1コミットにすべて集約して、GitHubで言うところのPull Request相当に
  • レビューシステムは Gerrit を利用している
    • 1コミットに集約されたものにコメントをつける → コミットを更新する、の繰り返し
    • 過去のコミットとそれへのコメントも見易い
    • 慣れるとGithub Pull Request方式よりよい、という人もいるらしい
    • 行単位にコメントする際に、最初はDraftとして保存されて、全部入力し見直したあとで確定できるのは確かに便利
    • UI的には装飾がすくなくて、とにかく密度高め
    • 参考: Gerrit vs Github: https://gist.github.com/mbbx6spp/70fd2d6bf113b87c2719

感想

  • 広く使われている言語処理系のコア、しかもアセンブラで書かれているようなところに手を入れる機会はそうないので、パッチがマージされたはうれしい
  • 分かりやすいissueを発見したら、がんがんPull Request投げましょう
  • Gerritはかなり特徴的なシステムで、GitHubばかり使っている身にはいろいろ新鮮で面白い

「僕たちは「新しい技術」で生き残る」に採録されました

今年の2月に登壇させていただいた dots. CONFERENCE SPRING 2016 の内容が本になりました。

f:id:stanaka:20160727140703j:plain

僕の部分は7ページほどにまとめられていて、ざっと次のような内容です。

  • はてなでの10年を越えるサービスの運用にまつわる技術的環境の変化
  • その間の中長期のパフォーマンス管理のためのPV/CPU(%)という指標の導入
  • 次の10年を戦うための指針

他にも人工知能、IoT、ヘルスケア、FinTech、デザインなどの各分野で一線で活躍されている方の講演がコンパクトにまとめられており、なかなか読み応えがあります。 いまの時代のビジネスとテクノロジーがうまく切り取られた本となっていますので、横断的に業界を把握したい方にお勧めできますので、是非ご一読ください。

f:id:stanaka:20160727140707j:plain

「Soft Skills」でエンジニアの生き方を学ぶ

SOFT SKILLS ソフトウェア開発者の人生マニュアル

SOFT SKILLS ソフトウェア開発者の人生マニュアル

少し前にSoft Skillsを読み終わりました。Soft Skillsは、

d.hatena.ne.jp

で紹介されていた本です。翻訳が出る前に原著を買ったのを積んでおいたら翻訳が出てしまったので、あわてて原著を読み終えました。

内容はいわゆる自己啓発的なものなのですが、これまでのエンジニアのキャリア論として、ここまで網羅的かつ実践的に書かれた本はこれまでなかったのではないかと。いくつか個人的に面白かった/興味深かった箇所を書き出してみます。

  • Fake it till you make it (Chapter 16)
  • ブログを書いて知名度をあげるとよい (Chapter 22)
  • 学習するには人に教えるのが一番 (Chapter 33)
  • チャットはとにかく時間の無駄 (Chapter 37)
  • ポモドーロテクニック (Chapter 38)
  • マルチタスキングはとにかく良くない。集中が大事 (Chapter 41)
  • バーンアウトしたらどうするか (Chapter 42)
  • 時にはハードワークが必要 (Chapter 47)
  • 失敗を恐れる必要はない (Chapter 70)

著者は33歳でのアーリーリタイアに成功した、かなりストイックな人ですので、全般的に頑張れる人がより効率良く頑張るための話になっています。 ですが、いろいろ使える知識/ノウハウ/考え方がちりばめられているので、そこまでストイックになれない人にも一読の価値はあると思います。

Section 5. Financialの給料交渉の話(Chapter 50)と不動産投資の話(Chapter 52)は、いかにもアメリカっぽい話で現地の様子が伺えて別の面白さがあります。不動産投資は、ローンの金利はともかく利回りと不動産価値の上昇への期待値が日本の状況にはあまり合わない気がしますが。また給料交渉の話は全般的にアメリカらしい話なのだけど、最初の数字はとにかく相手に言わせたほうが良い、というのはどこでも通用するテクニックでしょう。

また Section 6. Fitness では、とにかく筋肉を付けるのがよいと書かれており、かなりのストイックさが求められて、これを実践できる人はかなりの少数派かと思われます。

ちなみに今回、僕は原著で読んでみたのですが、以下のようにだいぶ読みやすいので英語の本をあまり読んだことがない人のとっかかりにも良いのではと思います。

  • 全般的に平易な英語で書かれている
  • エンジニアなら興味が持てる内容が多い
  • かなり細かくChapterが分かれていて、1日1Chapterずつ読んでいく、ということがしやすいし、興味がないChapterを飛ばすこともできる

出版社のサイトから4つのChapterは無料で読めるので試しに読んでみてはいかがでしょう。 https://www.manning.com/books/soft-skills

ErgoDoxを買いました & ErgoDox現状確認会やります

ErgoDoxを買った!

局所的に流行っているErgoDoxを買いました。ErgoDoxとはなにかとか、購入方法の話はこのあたり(ErgoDoxを購入して人生がバラ色になった - YAMAGUCHI::weblog)をどうぞ。

セパレートキーボードの特徴を生かして、間にMagic Touchpadとコーヒーを置いてます。 Touchpadがあるので、Macbookを普通に使っている時のようにタッチパッドを操作できます。 またコーヒーカップを間に置くことで、ついうっかりこぼしてしまうような事故も減らすことができます。

ちなみに、僕もErgoDox EZのフルセット(ErgoDox EZ Bundle: Blank)で買いました。 フルセットでもキー上の刻印有無やキースイッチの種類(押圧力やクリック感などが変わるそうです)が選べます。 ErgoDoxはキーマップを自由に変更できるのが魅力なので刻印はむしろ邪魔ということで刻印なし、 キースイッチはあまり強いこだわりもないので標準のもの(Brown 55g)にしておきました。 ErgoDox以前はHHK Proの無刻印モデルをずっと使ってきたので、無刻印に抵抗はないです。

4/6に発注して、3週間ほどたった4/26に届きました。2月ぐらいに買った人は1、2ヶ月かかったそうなので、だいぶ量産も起動にのってきていそうです。 こんな感じで届きます。

2週間ほど使ってみて

もう2週間ほど使ってみています。最初はタイプスピードが1/5ぐらいになってしまってましたが、だんだんHHKに近付いてきてます。とにかく手を開いた状態でタイプできるので、肩、胸まわりが楽なのが最高ですね。 HHKをずっとつかっていたのですが、あれは窮屈なフォームだったのだな、と。

セパレートキーを使うのは今回が初めて、というのと、ErgoDoxはキーが直列的な配置になっているため、タッチタイプ矯正機ともなっています。 Cのキーをひとさし指で押している癖があることが判明したり、YとUも時々打ち間違えたり、Bを右手で打つ癖があったことに気付いたりしてました。 6もたまに左手で押してました。 タッチタイプは、我流でしたからね。

まだまだタイプミスは多く、パスワードのようなミスが許されないところでは自信がないので、Macbook側のキーボードに避難しています。

キーマップ

ErgoDoxはキーマップを好きなようにカスタマイズできます。 最初はMassdropのErgodox Configuratorを使っていましたが、もっと細かい設定をしたかったので すぐに自前でファームウェアをビルドするようにしました。 ビルドは、CIサービスだけでErgoDoxのファームウェアをビルドして公開する - YAMAGUCHI::weblogをそのまま流用させてもらいました。

現状のキーマップはGitHubにあげていますが、見所を上げてみます。

レイヤー3つ定義していますが、良く使うのはメインとメディア、カーソルとマウス用の2つです。

メインレイヤー

  • メインのレイヤーはMacBookのUSキーボード風味となっています。
  • Tab/CTRL/Shiftあたりはそのままです。右端の=[]あたりは、キーが足りないので下に周してみています。
  • スペースは両方の親指で押したいので、押しやすい特等席に。
  • ESCの位置が悩みどころで ` と入れ替えるべきかどうか、悩んでます。
  • Commandキー(LGui)も親指で押せるように
  • Slackのチャンネル移動用にShift+Option+上下(SOptUp/SOptDn)をそれぞれワンボタンで設定しており、Slackのチャンネルを快適に切り替えられます。
  • 左側の右上の「6」と右側の左下の「B」は、完全に僕の手癖に合わせた妥協的キーマップです。ついついタイプミスしてしまうのをカバーします。
/* Keymap 0: OS X layer
 *
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 * |   `    |   1  |   2  |   3  |   4  |   5  |   6  |           |  `~  |   6  |   7  |   8  |   9  |   0  |   -    |
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 * | Tab    |   Q  |   W  |   E  |   R  |   T  |  L0  |           |  L1  |   Y  |   U  |   I  |   O  |   P  |   \    |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * | CTRL   |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |   ;  |   '"   |
 * |--------+------+------+------+------+------|  L2  |           |   B  |------+------+------+------+------+--------|
 * | LShift |   Z  |   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |   ,  |   .  |   /  | RShift |
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 *   | Esc  |SOptDn|SOptUp| LAlt | LGui |                                       | LGui |   [  |   ]  |  =   | +L2  |
 *   `----------------------------------'                                       `----------------------------------'
 *                                        ,-------------.       ,-------------.
 *                                        | Left | Right|       | Down |  Up  |
 *                                 ,------|------|------|       |------+--------+------.
 *                                 |      |      | Home |       | PgUp |        |      |
 *                                 |Space |Bkspc |------|       |------| Enter  |Space |
 *                                 |      |      | End  |       | PgDn |        |      |
 *                                 `--------------------'       `----------------------'
 */

メディア・カーソルレイヤー

二つめのレイヤーはメディア、カーソルとマウス用です。

  • このレイヤーへは、トグルで切り替えて使うのではなく、メインレイヤの右下のボタンと同時押しで使うことを想定しています。HHKのFnキーのような挙動です。
  • Fnキーを押しながら、右側でカーソル移動や左側でマウス操作がキーボードでできます。
  • マウス操作のほうはマウスカーソル移動やクリックだけではなく、ホイールの上下もサポートしており、キーボードから手を話すことなく、ちょっとしたマウス移動やスクロールができるようにしています。ホイールによるスクロールはたまにやりたい時があるのでなかなか便利です。
  • VolUpやVolDnのようなメディア操作系は、MacBook側のキーボードを使ってしまうので、あまり効果発揮できてないです。
/* Keymap 2: Media and mouse keys
 *
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 * |        |      |      |      |      |      |      |           |      | Prev | Play |Next  | Mute |VolDn | VolUp  |
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 * | TAB    |      | Lclk | MsUp | Rclk |      |      |           |      |      |      |      |      |      |        |
 * |--------+------+------+------+------+------|  L0  |           |  L0  |------+------+------+------+------+--------|
 * | CTRL   | Btn4 |MsLeft|MsDown|MsRght| Btn5 |------|           |------|      | Home | PgDn |  Up  | PgUp |  Play  |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * | LShift |WhRght|WhDown|WhClk | WhUp |WhLeft|      |           |      |      | End  | Left | Down | Right|        |
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 *   |      |MsAcl0|MsAcl1|MsAcl2| LGui |                                       |VolUp |VolDn | Mute |      |      |
 *   `----------------------------------'                                       `----------------------------------'
 *                                        ,-------------.       ,-------------.
 *                                        |      |      |       |      |      |
 *                                 ,------|------|------|       |------+------+------.
 *                                 |      |      |      |       |      |      |Brwser|
 *                                 | Lclk | Rclk |------|       |------|      |Back  |
 *                                 |      |      |      |       |      |      |      |
 *                                 `--------------------'       `--------------------'
 */

ちなみに、このキーマップのカスタマイズは、なんとHHKでも改造すればできるらしいので、是非だれか挑戦してみてほしいです。

[TMK] Alt Controller Board for HHKB

ErgoDox現状確認会

などなどというようにカスタマイズはしがいがあり、面白いバインドもあると思いますので、6/10にErgoDox現状確認会をやります。

eventdots.jp

ぼくの考えた最強のキーマップ、カスタマイズされたErgoDox、その他様々なエルゴノミクスキーボードを肴にわいわいできる会にしたいと思っています。 持ってない人もいますぐ発注すれば、間に合う可能性もなくはないと思いますので、是非!!

Coursera 機械学習コースを修了 & MackerelでAnomaly Detection

はてな社内での勉強会で、Courseraの機械学習コース( https://www.coursera.org/learn/machine-learning/home/welcome )を皆で履修するというのを去年秋に始めていました。

developer.hatenastaff.com

前回は途中脱落してしまったのですが、気をとりなおして年明けからのコースでは無事に修了しました。(スコア100%になってますが復習がてら間違ったQuizやりなおしたりしてます。)

このコースの良さは各所で語られていますので、個人的な所感のみを書いておきます。

  • 日本語字幕もあるけど、英語で頑張ったほうがいいんじゃないか
    • 機械学習系は新しい情報も多いので英語の用語に慣れておいたほうが、後々応用が利きそう
    • 他のコースは日本語字幕ついていないことも多いので、英語での講義に慣れることができるのも良い
  • Octaveでのコーディングも悪くない
    • ベクトルや行列での計算が一発で決まるので大変気持ち良し、行列やベクトルを意識できたのは良かった
    • あと通常のforループによる実装だとマルチコアへの最適化も大変だけど、行列計算で書ければマルチコアでの並列化が処理系側だけでできる(このあたり通常はよくできた実装のライブラリを使うのが通常だろうけれど)

ちなみにはてな社内でも徐々に修了者が増えていて、おそらくいま7名ぐらいがコース終わっていそうです。

blog.sushi.money hakobe932.hatenablog.com

また来週( 4/18 )から新しいコースが始まるので、是非トライしてみてはいかがでしょう。

MackerelでAnomaly Detection

ということで、せっかくなのでちょっと試してみました。Weekly 9のAnormaly Detacionの応用です。

例えば、サービスの応答時間が悪化してアラートが発生した時に、根本原因を探るために各サーバーのCPUやミドルェアの各メトリックを見ながら、似たような異常を示しているグラフを探すことはよくあります。現状だとこのような探索は基本、職人芸になっていると思いますし、原因となっているグラフをいかに早く探し出せるかがノウハウの一つになっていると思います。

Anomaly Detectionというのは、このような探索を自動化しようという話で、Mackerelのメトリックを対象に実装してみました。

具体的な動作としては、次の通りとなります。

  • Mackerelの対象サービスと障害発生時間帯を指定するして起動
  • そのサービスに含まれる各ホストのメトリックを対象時間帯とその前の平常な時間帯にわたって取得する
  • 平常な時間帯のメトリックから微分計算及び、Gaussian Distributionを計算
  • 対象時間帯のメトリックの各データポイントから外れ度合いを計算
  • 外れ度合いの大きい順に各メトリックの埋め込みグラフ一覧をhtmlとして出力

実行結果のhtmlを開くと下のスクリーンショットのようにあやしい順にグラフがずらずらと並んでいる様子が見れます。

スクリプトはもうちょっと良くしたいですね。できればMackerel本体にも組み込んでいきたいです。

gist.github.com

GoのFacebook Messenger Platform APIライブラリを作った

先日からLINE BOTで遊んでいたところ、今朝のfacebookのDeveloper Conferenceのf8でMessenger Platformが公開されたので、合わせてGoのライブラリを作ってみました。

github.com

いつものechobotはこんな感じです。

f:id:stanaka:20160413144318p:plain

Callback URLはhttps必須ですので、herokuなどで動かすのがお手軽でしょう。LINE BOT APIとは異なりIPアドレスホワイトリスト設定は不要なので、Fixieアドオンなどなしで普通にheroku上で動かすことができます。FB_TOKENとVerify用のFB_VERIFY_TOKEN環境変数として設定します。

また、最初にcallbackのverifyが必要ですので、その処理が入ってます。この処理はVerifyが終われば消しても問題ありません。もちろんCallback URLを変更する際は再度verifyが必要です。

facebook Messenger Platformは最初にfacebook appやpageを作ったりいろいろ手順が必要ですので、公式ドキュメントに沿って進めるのが良いでしょう。あと別の人がbotに話しかけてもcallbackが飛んでこなったりすることもあるようで、まだ細かい挙動や条件がよくわからないところもいくつかありますが、そのあたりの熟れてないのを味わうのも初物の面白さなので、いろいろ触って楽しむのがいいんじゃないかと思っています。

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/url"
    "os"

    fbmsg "github.com/stanaka/facebook-messenger"
)

var debug bool
var fb *fbmsg.FacebookMessenger

func callbackHandler(w http.ResponseWriter, r *http.Request) {
    b, err := ioutil.ReadAll(r.Body)
    if err != nil {
        fmt.Printf("Something wrong: %s\n", err.Error())
        return
    }
    if debug {
        log.Println("RecievedMessage Body:", string(b))
    }

    m, _ := url.ParseQuery(r.URL.RawQuery)
    fmt.Println(m["hub.verify_token"])
    if len(m["hub.verify_token"]) > 0 && m["hub.verify_token"][0] == os.Getenv("FB_VERIFY_TOKEN") && len(m["hub.challenge"]) > 0 {
        fmt.Fprintf(w, m["hub.challenge"][0])
        return
    }

    var msg fbmsg.CallbackMessage
    err = json.Unmarshal(b, &msg)
    if err != nil {
        fmt.Printf("Something wrong: %s\n", err.Error())
        return
    }

    for _, event := range msg.Entry[0].Messaging {
        sender := event.Sender.ID
        if event.Message != nil {
            fmt.Printf("Recieved Text: %s\n", event.Message.Text)
            err := fb.SendTextMessage(sender, event.Message.Text)
            if err != nil {
                fmt.Printf("Something wrong: %s\n", err.Error())
            }
        }
    }

}

func main() {
    debug = true
    fb = &fbmsg.FacebookMessenger{
        Token: os.Getenv("FB_TOKEN"),
    }

    http.HandleFunc("/fbbot/callback", callbackHandler)

    port := os.Getenv("PORT")
    addr := fmt.Sprintf(":%s", port)
    http.ListenAndServe(addr, nil)
}