詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

A Tour of Go のその先: 『みんなのGo言語【現場で使える実践テクニック】』

著者の一人であり、同僚でもある songmu さんに『みんなのGo言語』をいただきました。Go言語界隈の有名人がずらりと顔を並べていて豪華。拙作のツールも大きく取りあげていただいて、ありがたいです。

自分もGoという言語が好きで、趣味ではよく書いている(最近はおろそかだけど)んだけど、執筆陣はリアルワールドでGoを使いこなしている歴歴。オムニバス形式の各章がそれぞれの著者の背景を反映してバラエティに富んでおり、A Tour of GoEffective Goを終えた人が、入門一歩先のGoをつまみ食いするのにとても良い本だと思った。

思ってみれば、Goは簡素な文法をもつようデザインされていて、要所を押さえた標準のツーリング等々を見ても、その使用者に与えられている道具というのが意図的に限られている言語だった。そしてそのことが、コードだとかプロジェクトの構成だとかの、書かれたものとしてのGo言語全体の複雑度を下げることに貢献しているのだけれど、一方でGoはさまざまの実用的な目的のために使われる言語でもあり、使用者はその乏しい表現力の中でいかに現実的な課題を解くのか、という問題に直面することにもなる。

そこでGoで本格的なプログラムを書くには、言語そのものへの知識に加えて、その周辺に醸成されているイディオム的な語彙を身につけることが他の言語に比較して重要になると思う。そういうものってのは常にドキュメントされているものではないわけで、Go的なやり方を知るためには例えば自分はGo公式のソースコードを読んできた(この本でも何人かの著者が紹介している)けれど、今回この本が登場したことで、より分かりやすい形での指南役が増えたのは喜ばしいことだと思う(あと『Go言語によるWebアプリケーション開発』の鵜飼さんによる巻末付録とかもいい)。

すでに語られているし、個別の内容にはあまり触れる必要はなさそうだけど……、songmu さんによる1章、fujiwara さんによる3章、suzu_v さんによる6章はGoを書く人なら全員読む価値があり、mattn さんによるマルチプラットフォーム、deeeet さんによるコマンドラインツール、lestrrat さんによる reflect パッケージはそれぞれ各論のすばらしい解説になっている。自分はLL的なバックグラウンドをもっているのだけれど、そういう観点から見たGoというのも各所で語られていてよかった。

今後Goの入門系の書籍であればウェブアプリケーションとか、並行処理に特化した話題も気になってくるところですね。読みたい〜。

みんなのGo言語【現場で使える実践テクニック】

みんなのGo言語【現場で使える実践テクニック】

はてなの3代目CTOに就任しました

はてな退職の辞 - stanaka's blog にある通り、id:stanaka の引退に伴い、2016年8月1日付で私の勤務する株式会社はてなのCTOに就任いたしました。初代のはてなCTOが id:naoya でしたので、3代目のCTOということになります。

はてなで働きはじめたのは2006年、アルバイトの学生としてでした。まだはてなの本社が東京にあったころの話です。もともとはてなはユーザとして使っていて、すごいエンジニアが面白いものを作っている憧れの会社だったのを覚えています。入社すると社内で使っているグループウェア(はてなグループ)のメンバーにしてもらいましたが、そのグループ日記やキーワードにそれまでのはてなのサービスづくりにまつわる議論ほかもろもろのログが残っていて、全てにアクセスすることができたのは印象に強く残る経験でした。

はてなが京都に本社を移転した2008年より正社員として働きはじめました。これまで、うごメモはてな、はてなランド、はてなブログ、Mackerel、その他大小さまざまのサービスにアプリケーションエンジニアとして関わり、その間はてなにおけるサービスの設計や開発フローが進化してゆくのを目の当たりにしてきました。2012年からはチーフエンジニアとなり、プログラムを書くかたわら、エンジニアの採用・教育・評価などに関わっています。それから気づけばエンジニアの数は倍増していて、かつてとはエンジニア組織内外の力学とか、コミュニケーションのあり方が変わってきているのを感じます。

id:stanaka とは、新卒のころ、うごメモはてなの開発の際に一緒に仕事をする機会がありました。開発環境セットアップからミドルウェアの選定までいろいろな面で技術的な判断と実作業をされていて、当時から頼れるお兄さん的存在に見ていたことを思い出します。最近では私が Mackerel のディレクターをしていた際、プロデューサーおよび創案者としてサポートしてもらい、新しいプロダクトをともに作り上げる経験も積ませてもらいました。

アルバイトを含めると10年間はてなという組織の中にいて、その変化を見てきたことになります。エンジニアの数は10人から40人、社員全体なら100人にまで成長し、はてなのテクノロジー企業としての主戦場もウェブだけにはとどまらなくなってきました。組織構造も試行錯誤の中いろいろと進化を遂げてきましたが、いっぽうで変わらなかった良い点もたくさんあります。

その中のひとつで気に入っているのが、エンジニア的な美徳のひとつでもあると思いますが、我々は技術的・知的に誠実であるべきであるという考え方です。初代社長の id:jkondo 以下、会社の最初期からはじまった(のであろう)この態度が会社全体に浸透していることはつねづね強く実感することですが、こういった文化が今も存続していることは必然的なようにも、ただ運が良かったようにも思います。はてなという会社が持つ良き文化をこれからの成長にあっても維持し増大させていくために、エンジニア側の視点から貢献していくのがCTOとしての仕事のひとつになると思っています。また前任の id:stanaka が Mackerel で会社の新しい事業を拓いていったように、技術の分野からビジネスに貢献することもゆくゆくは目指していきたいと思っています。当面は引き継ぎを行いつつ、チーフエンジニアとして携わっていたエンジニア向けの教育と社内の情報共有の強化をいっそう進めていくつもりです。

CTOという仕事は自分にとっては未知の分野であり、大きなチャレンジになると思います。今後とも、はてなとはてなのエンジニアをよろしくお願いいたします。

Alloy をコマンドラインから実行できるツールを書いた

先日触れた Alloy は、エントリの最後に書いたようにインクリメンタルなモデリングを行うためのものだけど、基本的に提供されているインターフェイスが GUI なのが少し不便だった。全てのコマンドを実行するショートカットキーがなく、メニューから選ばなくてはならないので、新しく加えた制約がそれまで成立していたアサーションを壊しはしないかチェックするのがけっこう面倒であった。

http://motemen.hatenablog.com/entry/2016/06/alloy-oauth2-modeling

こういうのは自動化すべきであった。で、Alloy が Java の API を提供している ことに気がついたのは件のエントリを書いた日のことだった……。

すぐには使いたい場面はなくなってしまったのだけど、この API を使ってコマンドラインツールを書くことにした。Alloy の jar の中にはソースコードが同梱されていたので、edu/mit/csail/sdg/alloy4whole/ExampleUsingTheAPI.java なんかを参考にしたら簡単だった。

勉強がてら Kotlin と Gradle を使って書いた。

https://github.com/motemen/kt-alloy-cli

git clone して ./gradlew distTar すると、Alloy の jar をダウンロードした上でアプリをコンパイルし、./build/distributions/kt-alloy-cli.tar に成果物をまとめて出力する。これをどこかに展開し、alloy-run のようなコマンドから参照すればよい:

#!/bin/bash
exec path/to/bin/kt-alloy-cli "$@"

引数として Alloy で書かれたソースコードを与えると、ファイル中のすべてのコマンドを順に実行する。run の場合充足例が見つかれば ok、check の場合反例が見つからなければ ok。

% alloy-run oauth2/oauth2.als
1..3
ok 1 - Run show for 6 but 1 AuthorizationServer, 1 Client
ok 2 - Run allUserAgentsAreEventuallyAuthorized for 6 but exactly 1 AuthorizationServer, exactly 1 Client, 2 UserAgent
not ok 3 - Check userAgentsAreProperlyAuthorized for 6 but exactly 1 AuthorizationServer, exactly 1 Client, 2 UserAgent

オプション引数に -V を与えると、反例が見つかった場合、GUI を開いてインスタンスを提示してくれる。

出力は TAP 互換になっているので Perl の prove からも使える。

% prove --exec=alloy-run oauth2/oauth2.als
oauth2/oauth2.als .. Failed 1/3 subtests

Test Summary Report
-------------------
oauth2/oauth2.als (Wstat: 0 Tests: 3 Failed: 1)
  Failed test:  3
Files=1, Tests=3,  3 wallclock secs ( 0.01 usr  0.01 sys +  6.06 cusr  0.25 csys =  6.33 CPU)
Result: FAIL

どうぞご利用ください。

抽象によるソフトウェア設計−Alloyではじめる形式手法−

抽象によるソフトウェア設計−Alloyではじめる形式手法−

  • 作者: Daniel Jackson,中島震,今井健男,酒井政裕,遠藤侑介,片岡欣夫
  • 出版社/メーカー: オーム社
  • 発売日: 2011/07/15
  • メディア: 単行本(ソフトカバー)
  • 購入: 8人 クリック: 274回
  • この商品を含むブログ (35件) を見る

はてなで一緒に働きませんか?