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 楽しいです。

おわり。