2016 年上半期振り返り

カンファレンス

せっかくゴーコン行ったのに書き忘れてたなぁ ...

Go Conference 2016 Spring gocon.connpass.com

OSS

半年で 13 件のプルリクエストを出しました。

Search · author:tchssk created:2016-01-01..2016-06-30 · GitHub

数字にするととても少なく感じるなぁ。下半期はもう少しやりたいですね。

後半は GitHub - goadesign/goa: Design-based microservices in Go がほとんどだったけど、これはとても気に入っているので今後も貢献して行きたいと思っています。日本ではあまり使われていない (ような気がする) けど、ドキュメントの翻訳でもしたら利用者増えるだろうか。

仕事

twitter.com

ツラい。

Shibuya.go#2 に行ってきた

先週にGopher Night に行ったばかりですが、また Go のイベント (Shibuya.go#2) に行って来ました。

shibuyago.connpass.com

RDBを叩くだけのRuby製バッチプログラムをgoにしただけで20倍速くなった件

by ajiyoshi さん (Voyage Group)

https://dl.dropboxusercontent.com/u/31719381/shibuya.go.pdf

Ruby のバッチを Go にリプレースした話。ORM は使わず variadico/scaneosql.Rows.Scan() する関数を生成しているということでした。構造体にメソッドを生やすときは埋め込みじゃなくてユーザ定義型でも大丈夫な気がした。

type Int struct {
    sql.NullInt64
}

func (i Int) Method() {
// Do something.
}

じゃなくて

type Int sql.NullInt64

func (i Int) Method() {
// Do something
}

こういう感じ。

Slackのプロキシサーバ( github.com/cubicdaiya/slackboard )をGoで書いた話

by cubicdaiya さん (Mercari)

speakerdeck.com

Slackboard という Slack 用プロキシサーバの話。 Warning や Critical みたいに通知レベルを設けて出力時に色をつけられるのが便利そうでした。

stretcherの実装について

by fujiwara さん (Kayac)

speakerdeck.com

Pull 型のデプロイツール Strecher の話。ちょうどデプロイ周りのスクリプトを綺麗にしようと思っていたので興味深々でした。「実装について」とタイトルについているだけあってコードの細かい話が多かったです。知らないライブラリやコードの書き方がいくつかあって、非常にお得感のある発表でした。

Redisの調査についてとrmlp (LT)

by Konboi さん (Kayac)

speakerdeck.com

Redis の調査のノウハウとログ整形ツールの話。 LT だからというのもあると思いますが非常にテンポのいい発表でした。ときどき小笑を挟んで来てズルい。

Sparc Solaris向けにGoのクロスコンパイル環境を作った話 (LT)

by snowcrush さん

https://tanstaafl.0pt.jp/slides/solaris-gccgo/

Go のサポートに Solaris は含まれているが Sparc は含まれていないらしいです。珍しい環境だと情報も少なくて大変そうでした。Solaris ユーザはいますか、という問いかけに手を挙げたのは 1 人だけ (!) でした。

イベント全体の感想

会場のみならずピザと飲み物まで提供して下さって Voyage Group さんは太っ腹ですね。広々としたシンプルな会議室でしたが、エントランスや他の部屋は装飾が施されていてオシャレな雰囲気でした。機会があれば覗いてみたいですね。

Gopher Night #1 に行ってきた

Eureka さん主催の Gopher Night #1 に行って来ました。

eure.connpass.com

社内の画像変換サーバーを Goで置き換えた話

by ieee0824 さん (Livesense)

www.slideshare.net

仕事のコードを Go にリプレースしたという実践的な内容でした。画像関係のライブラリなども紹介されていました。何をするにもだいたい既にライブラリがあるということで、 Go はライブラリがない、というのはもう過去の話ですね。

ExcelとGo

by shibukawa さん

www.slideshare.net

Excelスプレッドシートから Go のコードをジェネレートする話。ネタといいつつもちゃんと AST 取得したりしている凝り様。どこの会社にも何人かいる Excel エキスパートおばちゃんが Gopher 化する可能性を期待させる LT でした。

asynchronous workloads via beanstalkd

by Louis さん (Orb)

スライド見つからず。 beanstalkd でキューイングするライブラリの話でした。

DB.SetConnMaxlifetime()

by methane さん (KLab)

docs.google.com

sql/database のコネクションプール周りのパッチがマージされるまでの経緯を説明されていて個人的にすごく面白かったです。 この機能は Go 1.6 から入っているらしいので試してみようと思いました。 (まだ 1.6 にしていないのでまず upgrade しなければ ...)

SensorBeeのご紹介

by disktnk さん (Preferred Networks)

スライド見つからず。 SensorBee という IoT 向けのストリーム処理エンジンの紹介でした。途中、ラブライブの映像に笑い男を合成するデモがあり、当日一番とも言える盛り上がりを見せました。

例えば、正規表現を避ける

by songmu さん (Hatena)

例えば、正規表現を避ける

正規表現は便利だけど strings パッケージの関数などで代替できる場合も多いという話。これは普段から心がけているので頷いてしまう内容でした。後半はコマンドラッパーの horenso について。これは cron などで実行するコマンドをラッピングしてレポーティングを行うコマンドだそうです。便利そうなので今度使ってみようと思いました。

go-plugin の紹介

by morikawa さん (Eureka)

スライド見つからず。 hashicorp/go-plugin のコードリーディングをした感想という感じでした。冒頭、 hashicorp 嫌いな人いたらすみません、という前置きで笑いが起きました。みんな大好き hashicorp 。

イベント全体の感想

写真を撮り忘れてしまったのですが、会場となった Eureka さんのセミナースペースは広くて綺麗でした。ただ私の尻が薄いこともあって椅子の座面の固さがちょっと辛かったです。発表では Gopher くんの可愛さに触れている方が多く Gopher くん (と Go) 愛されてるなと思いました。Eureka さんは Go を盛り上げようと色々イベントを企画されていて素晴らしいですね。 Go 盛り上がってる ʕ◔ϖ◔ʔ

f:id:tchssk:20160318132045j:plain

2015 年振り返り

転職

とにかく今年はこれなくして語れない一年でした。とあるプロジェクトにアサインされたのをきっかけに前職の SIer を続けていく気持ちが完全に途切れてしまい、 1 月から転職活動を始めました。利用したのは CodeIQPaiza という、いわゆるコード転職を実現するサービス。私は Java プログラマだったので両方とも Java でエントリしたのですが、嬉しいことに数十件スカウトが来て、最終的にはその中の一社に入社しました。

Go

転職後は主に Go を書いています。 Java プログラマだった者としては、オブジェクト指向とは違う (と私は思っている) Go の考え方に最初は戸惑いましたが、今ではかなりお気に入りの言語になりました。入社したとき既に本番で稼働していた Java のシステムを Go にリプレースしたのがハイライトでした。

DevOps

気付いたら CI ツールの導入を主導する立ち位置になっていました。あと社内で Git の質問に答えたりしているうちに社内 Git おじさんと化していました。

社外活動

OSS

何件か Pull Request を送りマージされました。来年はもっと貢献していきたいです。

ISUCON

会社の同僚と記念参加。予選敗退してしまいましたが、思っていたよりも悪くないスコアだったので、来年出ることがあれば決勝の緊張感を味わってみたいです。

カンファレンス

Docker Meetup Tokyo #5 くらいしか行けず。 Go Conference 2015 Winter の抽選に外れてしまったので来年こそは GoCon 行きたいです。

Advent Calendar

Vim Advent Calendar 2015Go その2 Advent Calendar 2015 にエントリしました。 Vim の記事に予想外のはてブが付き、社内の人に「見たよ」と言われる事案が発生しました。

総括

Life changing な一年になりました。自分の望んでいた仕事ができるようになり、とても充実しています。

来年の豊富

もっともっとコードを書く。

サクラエディタ上に Vim を実装した話

この記事は Vim Advent Calendar 2015 の 9 日目の記事です。

はい、タイトルは盛りました。正直「実装」と言えるほどのものではないので最初に謝っておきます。すみませんすみません。

サクラエディタ (以下サクラ) というのは Windows 用のテキストエディタなんですが、とある事情でこのエディタを Vim ライクなキーバインドで使えるようにしたことがありました。これはその時の思い出話になります。

自己紹介

当時、私はとある零細下請け SIer で働くシステムエンジニアでした。回ってくるのは客先常駐の堅い現場ばかり。ネットに繋がっていない PC で作業することが殆どでした。

サクラエディタとは

サクラエディタ

サクラエディタはMS Windows上で動作する日本語テキストエディタです.

行く先々の現場では必ずと言っていいほどサクラが使われていて、私もほとんどのショートカットキーを覚えるほど使い込みました。特に気に入っていたのは正規表現ライブラリが付属している点で、テキストの整形なんかはコマンドラインよりサクラでやることが多かったです。

そんなふうに永らくサクラユーザだった私は、ある日たまたま読んだ記事でとあるエディタと運命的な出会いを果たします。

Vim との出会い

そう、 Vim です。たしか 2012 年くらいだったと思います。もともと Solaris の vi を仕事で使っていたことがあったので、モードの概念や特徴的なキーバインドに抵抗はありませんでした。ちょうど、珍しくネットを使える現場に配属されたところだったので仕事でも Vim を使うようになりました。私はすぐにその強力なエディタの虜になりました。

Vim との別れ

そんな幸せな時間もつかの間、またネットのない現場に異動させられてしまいました。用意されていたのは当然サクラエディタ。まぁ、何とかなるだろうとその時は思っていました。私はヘビーな Vim ユーザではなかったからです。一応自分の vimrc はありますが、キーバインドはデフォルトを崩さない派ですし、入れているプラグインの数も多くありません。以前使っていたエディタに戻るだけじゃないか。そんな風に考えていました。

... ダメだ ...!

カーソル移動ひとつとってもホームポジションを離れなければいけませんでした。耐えられない。Vim でなければ満足できない。もはや私は Vim 依存症だったのです。

f:id:tchssk:20151209202759p:plain

Powered by 悪循環画像ジェネレータ

どうにかしてサクラを Vimキーバインドで作業できるようにしたい。私は模索を始めました。

サクラの仕様調査

サクラにはキーバインド設定のインポート / エクスポート機能があります。 Vim のモード毎に設定ファイルを作って切り替えれば擬似的にモードを再現できると思いましたが、設定ダイアログからしかインポートができないことがわかり、この方法はボツに。

次に思いついたのはマクロを使う方法。サクラのマクロ機能ではサクラ独自記法の他に、 Windows Script Host (VBScriptJScript) が利用可能です。そして特定のキーが押された時にマクロを実行するよう設定することができます。これを使えば何とかできるかもしれない。

謎のモチベーションと勢いでコードを書き続け、半日ほどで何となく動くものができました。

サクラ上に Vim を実装する

Vim の特徴のひとつにモードがあります。これを再現できなければ話になりません。しかしサクラのマクロ (というより VBS) には、スクリプトをまたいで使いまわせるグローバルな変数などありません。どうやってエディタ上に状態を保持させるか。

これは制御用のファイルを作ることで解決しました。処理は以下の流れです。

  1. あるキーが押される
  2. キーに割り当てられたマクロ (VBS) が実行される
  3. マクロが制御ファイルから現在のモードを判定
  4. マクロがモードに応じた処理を実行

制御ファイルは 0 バイトファイルです。状態はファイル名に持たせていました。なのでモードが変わるたびにファイル名も変わります。

Set fs = CreateObject("Scripting.FileSystemObject")

For Each f In fs.GetFolder("..").Files
    If InStr(1, f.Name, "mode") = 1 Then
        Select Case Replace(f.Name, "mode=", "")
            Case "n"
                Editor.Right
                f.Name = "mode=i"
            Case "i" Editor.InsText("a")
        End Select
        Exit For
    End If
Next

これは当時を思い出しながら書いてみたコードです。 InStr() で判定しているように、制御ファイルは mode= で始まるファイル名となっています。mode= のあとはモードによって書き換わるようになっています。ノーマルモードは n 、挿入モードは i というように決めて、 Select Case の分岐でモードに応じた処理がされるようにしていました。

その後

コツコツと機能を追加して、ビジュアルモードなども使えるようにしました。半年ほどしてその現場を離れることになり、少し名残惜しさもありましたがコードはすべて削除しました。ネットが使えないので持ち出すことはできないですし、そもそもネットが使えたら書くこともなかったコードです。あれはそういう蜃気楼のようなコードだったのです。

ですが、上記のコードを書いたついでに一部分だけコードを再現してみました。

github.com/tchssk/sakura-vim

使えるのは以下のキーです。

h 左に移動
j 下に移動
k 下に移動
l 右に移動
w 次の単語に移動
b 前の単語に移動
gg 1 行目に移動
x カーソル位置の文字を削除
a カーソル位置の後に文字列を追加
i カーソル位置の前に文字列を追加

最初はもっと再現しようと思っていたのですが辛くなってきたのでやめました。こんなコードは必要に迫られなければ書けたものではありません。

ちなみに今は Web な会社に転職して「本物の」 Vim で毎日 Go を書いています。 Go 楽しいです。

おわり。