VimConf2016の延長線で出来たネタ

本記事はVim Advent Calandar 2016の13日目の記事です。

前置き

まずはこの動画を見てください(※私の動画ではないです)。

この動画は先日行われたVimConf2016でt9mdさんが発表されたときの動画です。


vim-mode-plus for Atom editor

私はVimConf2016に参加して、リアルタイムに発表を拝見していたのですが、 発表中「すげー」という単語しか出てこないくらいすごかったです。

言葉でうまく表現するのが難しいですが、すごかったところをざっくり言うと、

  • Vimの、特にtextobjects、operator周りの考察が深い。
  • AtomVim風に操作できるvim-modeというpackage(Vimでいうplugin)をforkしてvim-mode-plusで、Vimの機能を移植するのみならず、様々な独自機能を追加され、完全に独自進化を遂げている。
  • そして、そのvim-mode-plusで独自追加された機能が、Vimについて深く考えていないと作れないようなもので、どれも面白く便利そう。

vim-mode-plusの機能について説明するのが本記事の目的ではないので 詳しく知りたい方は、上の動画およびt9mdさんの発表slideを是非見てみてください。

この発表を見てVimを初めた当初の様々な新しい機能を覚えていくときや、新しいVim pluginを思いついたときと似たような、 最近忘れていたVimへの気持ちの高まりというか、なんというか不思議な感覚を覚えました。

そして、VimConf2016が終わっても熱は冷めやらず Twitter上で何人かのVimmervim-mode-plusについての議論になりました。

そして議論の延長で、

と、kaoriyaさんがマルチ選択のVimのissueを立てられたり、

と、haya14busaさんが爆速でvim-mode-plusのoccurence機能と似たような機能を持つ(ちょっと違うけど便利) Vim pluginを実装したり

vim-mode-plusに触発されて色々な話がでてきて盛り上がりました。

で、やっと本題になるんですが、以下のhaya14busaさんのツイート

を、ここ1ヶ月ほど放置していたのを、ちょうど先週Vim Advent Calendarネタに困っていたときに 思い出したので、これをネタにしようという運びとなりました。(ヒドイ)

haya14busaさん、そしてt9mdさんありがとうございました。

以下今回のネタですが、vim-mode-plusの機能である、Keep cursor position by operator (operatorでの操作時カーソル位置を移動しない機能 & operatorの操作対象を一瞬ハイライトする機能) 相当の機能をVim pluginでできるようにしましたという話です。

Keep cursor position by operator

Vimで例えばoperatorのヤンクを使用すると、 カーソル位置がヤンク対象の textobject の先頭に移動します。 この動作はVimの設定で変えられるものではなく、 状況によっては使いづらいケースがあります。

例えば、大きめの段落をテキストオブジェクトでヤンクした際や、 textobj-entireでファイル全体をヤンクした際など、 「あれ?さっきいたところどこだっけ?」となることがあります。

本記事では上記ケースを解決するために「ヤンクした時にカーソル移動しない」機能を 実現するためにoperator-userを forkして実験的にフック機能をつけてみました。

なお、実験的なのでexperiment/hookというブランチを切ってそちらで実装しています。 時間がなくI/Fが練られていなかったり、テストがなかったり、ドキュメントが雑だったりの状態なので、使用は自己責任でお願いします。

(インストール方法も、使用方法もあまり詳しく載せていないのは決して時間がなかったからではない。はず。。。)

整理してそのうち本家にPRを送りたいですが、いつになるかは不明です。。。

(どなたか代わりにやりたいという方がいたらお願いしたいです)

operator-userのfork版 実験ブランチのフック機能

以下のようなフックを追加する関数を用意しています。 (なお実験ブランチなのでI/Fは変更される可能性があります。ご了承ください。)

" フックを登録する。
" {hook}で登録した関数を、{when}で指定したタイミングで呼び出すことができる。
"
" {hook}は文字列stringまたは関数参照Funcrefで指定。
" 文字列で指定する場合、定義された関数名である必要がある。
" フック関数が取る引数は{when}の指定によって異なる。
"   'before'  Hook(operator_name)
"   'after'   Hook(operator_name, motionwise)
" operator_nameは、operator#user#define()または
" operator#user#define_ex_command()の第1引数
" motionwiseはoperatorで選択された範囲が行単位か、文字単位か、ブロック単位か
" を表す。
"   'line'  行単位
"   'char'  文字単位
"   'block' ブロック単位
"
" {when}には、どのタイミングでフックするかを指定。
" 'before'と'after'を指定可能。それぞれ意味は
"   'before'  operatorが実行される前
"   'after'   operatorが実行された後
"
" 戻り値はフックのID。後述するフック削除関数で該当フックを削除できる。
call operator#user#add_hook({hook}, {when})

" 登録されているフックを削除する。
" {id}で削除対象のフックを指定。
" {id}はoperator#user#add_hook()関数の戻り値を指定。
call operator#user#delete_hook({id})

" 登録されているすべてのフックを削除する。
" {when}は省略可能。
" {when}が省略された場合、登録されているすべてのフックを削除する。
" {when}に'before'が指定された場合、登録時に'before'で登録したすべてのフックを削除する。
" {when}に'after'が指定された場合、登録時に'after'で登録したすべてのフックを削除する。
call operator#user#delete_hook([{when}])

上記フック関数で、前述の「ヤンクした時にカーソル移動しない」および、「ヤンク対象をハイライト」 を実現してみたいと思います。

フック関数はoperator-userの実験ブランチで実装しているので、 ヤンク時にフック関数を呼び出すために、operator-userを使用して、オペレータでヤンクするoperator-yankを作りました。 (当たり前ですが、operator-userのフック機能は、operator-userをベースとしたoperatorでしか使えません。Vim標準のoperatorでは残念ながらフックは使えません。)

operator-yankと、上記フック関数を利用してまずは「ヤンクした時にカーソル移動しない」機能の 設定を書いてみます。

" operator操作前のカーソル位置を保存
function! MySavePosition(opename)
  let s:save_cursor = getcurpos()
endfunction

" operator-yank操作後に、操作前のカーソル位置に移動
function! MyRestorePosition(opename, motionwise)
  " a:openameをチェックして、operator-yankの操作時のみ移動するようにしている
  if a:opename ==# 'yank'
    call setpos('.', s:save_cursor)
  endif
endfunction

call operator#user#add_hook('MySavePosition', 'before')
call operator#user#add_hook('MyRestorePosition', 'after')

operator操作前にカーソル位置を保存するというフック関数と operator操作後に保存したカーソル位置に移動するというフック関数を用意し、 これら関数をそれぞれフックとして登録しています。

1点だけ特徴的なのが、フック関数の第1引数は、operatorの名前が渡されるため、 これを判定して、特定のoperator(ここではoperator-yank)のみ動作させるフックを記述しています。 上記例では、operator-yankの名前は'yank'で登録しているため、 'yank'で判定することで、operator-yankでの操作時にのみ operator操作後のカーソル位置移動を行っています。

次に、「ヤンク対象をハイライト」機能の設定を書いてみます。

" ハイライト時間
let s:highlight_time = 500
" ハイライトグループ(デモで見やすいようにErrorMsgに)
let s:highlight_group = 'ErrorMsg'

" ハイライトパターンのIDs
let s:matched_ids = []

" ハイライトパターンを削除する
function! MyHighlightDelete(timer)
  for mm in s:matched_ids
    call matchdelete(mm)
  endfor
  let s:matched_ids = []
endfunction

" operator対象を規定時間ハイライトする
function! MyHighlightOperatorTarget(opename, motionwise)
  " operator-yankでの操作時のみハイライト
  if a:opename !=# 'yank'
    return
  endif
  let start = getpos("'[")
  let end = getpos("']")
  if a:motionwise == 'line'
    if start[1] == end[1]
      call add(s:matched_ids, matchadd(s:highlight_group, '\%'.start[1].'l'.'.*'))
    else
      call add(s:matched_ids, matchadd(s:highlight_group, '\%'.start[1].'l'.'\_.*\%'.end[1].'l'))
    endif
  elseif a:motionwise == 'char'
    if start[1] == end[1]  " マッチ行が1行内
      call add(s:matched_ids, matchadd(s:highlight_group, '\%'.start[1].'l'.'\%'.start[2].'c'.'.*\%'.(end[2]+1).'c'))
    elseif start[1] < end[1]  " マッチ行が2行以上
      " マッチした先頭行をハイライト
      let lastscol = col([start[1], '$'])
      call add(s:matched_ids, matchadd(s:highlight_group, '\%'.start[1].'l'.'\%'.start[2].'c'.'.*\%'.lastscol.'c'))
      " マッチした最終行をハイライト
      call add(s:matched_ids, matchadd(s:highlight_group, '\%'.end[1].'l'.'^.*\%'.end[2].'c'))

      if end[1] - start[1] == 2 " マッチ行が3行
        call add(s:matched_ids, matchadd(s:highlight_group, '\%'.(start[1]+1).'l'.'.*'))
      else " マッチ行が4行以上
        call add(s:matched_ids, matchadd(s:highlight_group, '\%'.(start[1]+1).'l'.'\_.*\%'.(end[1]-1).'l'))
      endif
    endif
  endif
  call timer_start(s:highlight_time, 'MyHighlightDelete', {'repeat': 1})
endfunction

" バッファ移動時、ハイライトパターンをすべて削除
augroup MyHighlightDeleteGroup
  autocmd!
  autocmd BufLeave * call MyHighlightDelete(0)
augroup END

call operator#user#add_hook('MyHighlightOperatorTarget', 'after')

ヤンク対象を正規表現で記述しているのと、motionwiseごとの処理 行数によりパターンの切り分けをしており若干読みづらいですが、 気持ちで感じてください。 matchaddにより、ハイライトしています。

規定時間たったらハイライトを消すために、地味にVim8.0のtimer機能を使っていたりします。

BufLeaveイベント時にハイライトを消しているのは、 こうしておかないとハイライト中に別バッファに切り替えたとき timerのコールバックでmatchdelete()によりハイライトが削除しようとしますが matchadd()はウィンドウ単位であり、別ウィンドウでハイライトを削除しようとしてエラーになります。

上記によって、行単位および文字単位での操作対象をハイライトできるようになっています。 なお、ブロック単位でのハイライトはめんどうなので実装していません。

最後に実際に試したデモを載せておきます。

f:id:deris:20161213001117g:plain

ヤンクしてもカーソル位置が移動していないのがわかると思います。 また、ヤンク対象が赤背景で一瞬ハイライトされるのもわかると思います。

類似Vim plugin

vim-operator-flashy

ヤンクした際に規定時間、ヤンク対象をハイライトできるVim pluginです。

今回私が作った、operator-userのfork版の実験ブランチを使わなくても、 operator-userを入れていれば、今すぐ気軽に試せるので便利です。

ちなみに私は先週このpluginに気づいたのですが、これを見たときに「えっ、haya14busaさん既にflash on operate作ってるやん」としばらく呆然としてました。

ただ、こちらはヤンクのみが対象なので、ネタがボツにならなくてすみました。(ホッ

まとめ

以上が、VimConf2016の延長線でできたネタでした。

それではVim Advent Calendar 2016の13日目の記事を終わります。

Happy Vim Life!

VimConf2016に参加しました

2016/11/5(土)に株式会社ミクシィで開催されたVimConf2016に参加してきたので感想レポートを書きました。

ラーメン

今年は、午前中の集まりもあったみたいだけど、前日の終電帰りの疲労により不参加。 今年は運営側でも、発表者でもなく、一参加者として参加したので、かなり気楽に出発し、12:00くらいに会場下についた。 会場についた直後に、thincaさんとryunixさんと一緒に、で すごい煮干ラーメンを食した。

名前の通り煮干がきいてて、こってり系で美味しかった。 thincaさんは、「おにぎり食べちゃったんだよねぇ」と言いつつ、 つけ麺大盛りを頼み、その上スープまで完飲していたので、 ラーメンに対する熱意がすごかった。

一部のVimmerにはVimConfに来たら凪を食べるというのが定番になっているらしい?ので チャンスがあれば食べてみることをおすすめします。

念願の?

会場に着くとVim界の大御所 kaoriyaさん自らが受付で対応されていて、 前々回?くらいのVimConfから面識があったので、少し挨拶をさせていただき 参加者ストラップを頂いたらそこには伝説のアレが…

当時の午前中にTwitterで何人かの方がVimリストバンドの写真を あげられていたので、余っていれば購入しようと考えていたんですが、 まさかの、参加者全員プレゼントなんて!

テンションがあがりすぎてロクなコメントもお礼もできませんでしたが、 ありがとうございました! > kaoriyaさん

家宝にします。

セッション

通常発表からLTに至るまで、Vim界で著名な錚々たるメンツなのは 例年のことなのですが、今年はGoに関連する発表が多く、 特にGo界隈で著名なtenntennさんが発表されに来ていたのが印象的だった。 tenntennさんが講師をされているハンズオンにも一度参加したことがあったので 個人的に楽しみだった。

Vim界隈の人は若干固定化されてきている感じがするので こういう交流が増えていくのは良いなぁと思った。

各界隈でVimをゴリゴリ使っている方はいるはずなので Vimに直接的に関係なくても、少しでも関連があれば 是非発表していただきたいと思った。

各セッションの詳細は既に他の方が書いているので、 気になったところをいくつかピックアップしました。

  • Vim8.0の興味深い機能のいくつかは、vim-jpからの働きによって 入った機能(channel, lambda, etc)であり、改めて、vim-jpすごいなぁと感じた。
  • golang関係の発表が3つもあってgolangの勢いを感じた。
  • golangVimの親和性良い。
  • vim-mode-plus の考察の深さがすごく、感動した。発表中はただただすごいとつぶやいていた。
  • golang速い。nodeもなかなか速い。
  • Vimのhelp翻訳人が足りない問題。参加するとVimの有名人とたくさん知り合いになれて便利そう。

懇親会

懇親会の様子です。

ピザ

寿司

ピザと寿司

ピザと寿司が大量にあり、お酒も出て これで参加費2,000円とはお得以外のなにものでもなかった。

寿司うまいうまい。

懇親会では割と色々な人(といっても知り合いばかりだったのが反省点)と話せてとても満足でした。

以下、酔っていてあまり覚えていないけど、私の懇親会の様子です。

  • haya14busaさんと一緒に、vim-mode-plusのネタを聞きにt9mdさんに突撃するなどした。
  • tsukkeeさんとVim8のjob周りの話、golangVimの相性の話、Vim8以降のVim pluginの話(jobとgolang組み合わせて楽ちんVim programming)などをした。
  • daisuzuさんとdaisuzuさんの職場の方、kaoriyaさん、k-takataさんと職場でのVimの話などをした。
  • aomoriringoさん、ryunixさんとともに寿司行脚をした。
  • aomoriringoさん、ujihisaさん、色々な方とVRの未来について語った。
  • VRはいいぞ

2次会?

会が終わり、何人の方が徹夜カラオケに行くという話になり、開始までに時間が空いたので、 2次会?として、参加者の何人かと渋谷でビックカメラ⇒本屋とブラブラしていました。

と言っても、私は徹夜カラオケ参加は厳しかったのでここで撤収。 徹夜カラオケも盛り上がったようです。 私も行きたかったなぁ…

以下2次会?の様子の写真で締めとします。

終わりに

最近、Vim熱が大分おさまっていてあまり活動できていなかったのですが、 熱い発表ばかりでかなりVim熱が高まったので非常によかったです。

まとめ役のb4b4r07さん、ryunixさん、VimConf2016運営にかかわられた皆さん、 発表された皆さん、参加者の皆さん、会場を貸していただいた 株式会社ミクシィさん、本当にありがとうございました。

またどこかのVim関係の勉強会でお会いしましょう!

Happy Vim Life!

jとkでの移動を矯正するためのVim pluginを作った

本記事はVim Advent Calandar 2015の13日目です。

本来書こうと思っていたネタがあったんですが、若干ネタが大きかったため期間的に厳しく そのネタの内容を検討している時に思いついて作ったVim pluginについてご紹介します。

背景

みなさんはカーソル位置からスクリーン上に見える範囲の特定の行への移動はどのように操作されていますでしょうか?

Vimmerは十人十色なので、様々なやり方があると思います。

例えば

  • 気合でjjjjj・・・kkkkk・・・を使う
  • 5j5kなどを繰り返し実行して距離を詰めた後に最後微調整する
  • (relativenumberオプションを有効にするなどで) 目視で極力一発で目的の行に移動する
  • 様々な縦方向の移動コマンドの中から状況にあった移動コマンドを選択する (/, }, { などなど)
  • (vim-easymotionなどの) 移動系のVim pluginを使う
  • マウスが大好きでマウスを使う

他にも色々あるかと思います。

私は、上記の中で以下を組み合わせてやりたい派です。

  • 様々な縦方向の移動コマンドの中から、状況にあった移動コマンドを選択する
  • 5j5kなどを繰り返し実行して距離を詰めた後に最後微調整する

基本的には、j, k以外のその場に適したコマンドで移動できるところは移動して、 j, k以外の移動コマンドだと手詰まりだったり、面倒だったりした場合には、5j, 5k、 また、j, kで調整するというスタイルです。

効率化という意味ではベストではないかもしれませんが、素Vimでの操作も考えると別に悪くはなさそうです。 ただ、個人的に1点課題に感じているところがありました。

それが以下の部分です。

  • 5j5kなどcount指定で距離を詰めて移動する方

これ、やりたいと思っていますが、実は現状できていません。

じゃあ現状どうやっているかというとこれです。

  • 気合でjjjjj・・・kkkkk・・・を使う

私はOSのキーリピート速度を高速化して、速度的には不都合がないとはいえ、 個人的にはキーリピート速度の高速化は邪道だと思っていますし、 「素Vimでもそれなりのパフォーマンスで操作できる」をモットーで やっている身として、count指定を使えるところは、count指定する べきだし、したほうが効率的だと思うのです。

でも、長年の手癖は早々直せないもの。ということで、これを矯正するために vim-gothrough-jkというVim pluginを作ってみました。

vim-gothrough-jk

vim-gothrough-jkの機能は以下です。

  • j, kを連続で3回以上タイプするとgothroughモードに移行する
  • gothroughモードではj, kをタイプした時の移動幅が5になる。
  • gothroughモードでは 4秒待つか、count指定でj, k移動するか、j, k以外の移動(h, lなど)で通常のj, kに戻る

なお、以下の部分はカスタマイズ可能です(I/Fは変更の可能性があるためここには書きません)

  • どれくらいの間隔(ミリ秒)で連続でタイプしたらgothroughモードに移行するか(現状デフォルトは150ミリ秒)
  • 何回以上タイプしたらgothroughモードに移行するか(現状デフォルトは3回以上)
  • gothroughモード時にj, kで移動する移動幅の変更(現状デフォルトは5)
  • gothroughモードに移行した後、最後にj, kをタイプしてからどれくらいの間隔(ミリ秒)が空いたら通常のj, kに戻るか(現状デフォルトは4000)

以下に動作のスクリーンショットを載せます。

f:id:deris:20151213180358g:plain

3回下に移動した後に、移動幅が5になり、3回上に移動した後に移動幅が5になっていることがわかるかと思います。

わかりやすいように、どれくらいの間隔で連続でタイプしたらgothroughモードに移行するかの値を 大きめにしてやっていますが、実際はj, kを押しっぱなしでないと発動しないくらいでいいかと思います(デフォルトは150ミリ秒)。 環境によってカスタマイズすることを推奨します。

で、このVim pluginの機能でどうやって矯正されることを期待しているのかというと

  • j, kを連続で3回以上タイプするとgothroughモードになるので、count指定のj, kを使わないと近い距離に移動する際に移動しづらくなる。 (例えば、カーソル行から4行下に移動したい場合、jの連続タイプだと途中で移動幅が5に置き換わるので、最初から4jで移動することを意識せざるを得なくなる)
  • 途中から5j, 5kに移行するので、20行下程度でもそれなりに高速で調整できるため、素Vimに戻った時に違和感を感じて、5j, 5kを使いたくなる…(かも)

なお、一般向けに今のデフォルト値にしていますが、移動幅を20くらいにすると、ハードモードになり 矯正もかなり進むのではないかと思っているので、私はしばらくそれで運用してみるつもりです。

類似Vim plugin

vim-hardtime

名前を失念してしまいリンクを貼れず申し訳ないのですが、(Lingr上でryunixさんに教えていただきました。 ありがとうございました。) vim-hardtimeは、j, kを連続で一定回数以上タイプすると、 しばらく(1秒とか)sleepするため、j, kを連続タイプしないよう矯正できます。

Vim pluginの着想は、ここから来た部分が大きいです。

ただ、流石にsleepはやり過ぎだなぁと思って、もう少し有用に使えて、 でも矯正にもなるような機能は無いかなぁと考え、現状の仕様にしました。

vim-accelerated-jk

vim-accelerated-jkj, kでの移動を加速度的に 速くできるVim pluginです。(実際は加速度を計算しているわけではなく、タイプ数に応じて移動幅を増やしています)

最初は似ていると気づかなかったのですが、j, kで、移動幅を変更するという点でかなり似ています。

気づいた時点で、新規にVim pluginを書き起こすか、vim-accelerated-jkの Pull Requestですますか悩んだのですが、用途もやりたいことも(多分)微妙に違うので、新規に書き起こすことにしました。

(もし、気になる機能があったらこれを見た作者のLindanさんが vim-accelerated-jkに輸入してくれるはず…)

まとめ

以上が、j, kでの移動を矯正するためのVim plugin、vim-gothrough-jkの紹介でした。

本題とはそれますが、Vimレベルが上がるのでvimrc読書会に参加することをおすすめします。 私は最近あまり顔を出せていませんが、毎週土曜日23時からやってます。

それではVim Advent Calendar 2015の13日目の記事を終わります。

Happy Vim Life!

Go Conference 2015 Winterに参加しました

2015/12/6(日)に開催されたGo Conference 2015 Winterに参加してきたので感想レポートを書きました。

「鉄は熱いうちに打て」ということでGoCon終了後、渋谷のカフェにこもって雑に殴り書きしたので、 読みづらかったり誤りがあったりしたらごめんなさい。ご指摘いただけると助かります。

ちなみにLTについては、酔っ払っていてまじめに聞けなかったので感想を省きましたが、 どれも笑いをとっていて酒のツマミには最高のLTばかりでしたということはご報告しておきます。

あと、発表者の方の資料や 当日のtogetterの情報は以下にまとめていただいていてとてもありがたいです。 ありがとうございます。

#gocon 発表者資料一覧 + togetter

発表の感想

x/mobile gaming

gomobileでゲームを作成する過程を、コミットログの差分から順に説明していくスタイルの発表でした。

実際のコードを見せてデモしていくので非常にわかりやすく、英語も聞き取りやすかったです。

gomobileですごい簡単にゲーム作れちゃうんだな〜と思わせるKeynoteでした。

実際はそんなこと無いんだろうけどw

普通にFlappy Gopher面白そうでした。

発表の際に使っていたgitのdiffを表示するツールがめちゃめちゃ便利そうでした。

GoBGP : yet another BGP implementation written in Go!

BGPをgoから操作するGoBGPというツールの紹介でした。

BGPはネットワークのプロトコルで、ググる となんとなくですが、わかるような気がします。

ネットワーク機器は自動化運用について過渡期で、現状自動運用するためにtelnetでexpectでツラいけど、 Whitebox Switch(OSを含むソフトを含まないSwitch)で、cumulus linux, open network linuxなどを入れれば 色々自由度が広がって自動化運用進むよねという話でした。

そして、そんな環境であればGoBGPとか使えれば幸せになれるので、機会があれば どんどん自動化していきましょう的な話でした。

あと、余談ですが、発表者の方のWhitebox Switchの説明がWebに載ってたので、 こちらも合わせてみれば参考になりそうです。

ホワイトボックススイッチとは何か? オープン化がすすむネットワーク機器のハードとソフトの動向(前編)。ホワイトボックススイッチユーザ会 第一回勉強会

Webフレームワーク比較

多種多様な GoのWebフレームワークを比較紹介する内容でした。

はじめのWebフレームワークのリストの数が多くて笑いました。

速さならGin、人気ならMartiniという印象を受けました。

あと、紹介があったkamiの作者の方が質問されたりしていました。

紹介してた速度の単位が nsだったのが、さすがgolang早いな〜と感じました。

TLでは、Martiniはreflection使い過ぎなので、negroniの方が 良さそうという話が上がっていたり、標準のnet/httpでいいでしょという話も上がっていたりしました。

全然関係ないですが、マティーニとネグローニとどちらもお酒の名前なんですね。

そういえば、某mattnさんも net/httpでいいでしょと何度かつぶやいていたような気がします。

私は、net/httpを軽く触った程度なのでよくわかりません。

gomobileでピアノの作り方

お子さんのために、モバイルのピアノアプリを作ったという話でした。

子供が広告タッチしちゃうとかあるあるなので笑いました。

内容についてはgolangの話はあまりなく、音楽(物理?)の話をわかりやすくお話されていて 門外漢でしたがフムフムーと聞いていました。

実戦へのGo導入

初学者向けの内容?だったので、golang歴 1ヶ月に満たない私にとっては、完全に俺得発表でした。

初学者向けのブログのリンクや、便利ツールのリンクなど、便利情報ばかりでした。

エディタはなんでもいいとお話されていて、Vimを使われているとお話されていましたが、 実際Vimgolang書くのは非常に相性が良いと思います(私もVimを使うので)。

vim-goも実際便利です。

GoライブラリAPIの変更を知る

GoのAPI(typeやfuncで外部公開されているもの)で、リビジョン間で変更(シグネチャの変更)があった APIを検知するgompatibleというツールを作成したという内容でした。

実際とても便利そうで、他の言語でもあったらいいのにと感じました。

型や関数のシグネチャを見るので、同じシグネチャで使用する意味が変わってしまったら 現状は対応できないとのことでしたが、これは仕方ないかな。

やるとしたら、変数の名前などの変更時に警告出すくらい?

Goのレガシーコードと戦った話

まず、Goで既にレガシーコードが作られているということに驚きましたw

内容的には、基本golangに限らない話でしたが、「性能が求められているかどうかわからない 箇所でgoroutineを多用する」はgolangならではでやばそうだなぁと感じました。

実コードでエラーを握りつぶすも恐ろしいけど笑った。

ISUCON5でトップスコアを出す方法

ISUCONで、どういう対策を取っていったかという話でしたが、 ここら辺の話は門外漢なので、フムフム〜と聞いていました。

「直前のレガシーコードの作成の主です。」とのしょっぱなのコメントに笑いました

golang が言語の選択で、ベースが早いというのは良いなぁ

Introduce log collector in Go into production

ログ取得のfluentd in-tail部分をfluentd-agent-hydraに置き換えるという話でした。

ここら辺も門外漢なのでフムフム〜と聞いていました。

Introduction to golang.org

golang.orgの様々なページの紹介でした。

日本語版のサイトは情報が古かったりするので、やっぱり英語で読むのが一番みたいです。

The Go Programming Language本も現状英語版だけですしね(私はebook版で買いました)。

あとは、Gopher GalaというHackathonの宣伝もされていました。

FINAL FANTASY Record Keeperを支えたGolang

FINAL FANTASY Record Keeperの開発(運用)の際に使用した、様々な便利ツールの紹介的な発表でした。

どれも便利そうでした。

特に、golang標準のflagsは使ったことありましたが、go-flags は使ったことがなかったので使ってみようと思います。

タグ形式なので、多言語対応の時に別構造体をきるのは辛そうですが そんな機会は私にはなさそうなのでw

あと、「信頼と安心のmattnプロダクツ」であるgo-colorable も紹介されていました。

Go が支えるインフラストラクチャーサービス

ゲヒルン株式会社の様々なサービスについての紹介でした。

golangで作られたサービスが沢山あって、golang触る機会がたくさんあってよいなーと感じました。

あと、発表練習のために、YAPC Asia の動画を見てると止まらなくなって発表前日 夜更かししてしまうらしいです。

私もつい先日 VimConfというイベントのために、スティーブ・ジョブス氏のOne more thingの動画を 深夜2時くらいから1時間見るという愚行をしてしまったので気持ちはよくわかります。

終わりに

主催のtenntennさん、Go Conference 2015 Winter運営にかかわられた皆さん、発表された皆さん、参加者の皆さんありがとうございました。

可能であれば来年も参加もとい発表したいです。

VimConf2015に参加しました

2015/11/21(土)に株式会社ミクシィで開催されたVimConf2015に参加してきたので感想レポートを書きました。

当日まで

最初は一般参加で登録していて、ネタと時間がなかったため今年は発表するかどうか迷ったのですが、 Lindanさんに若干煽られ?「海外Vimmerが開発したVim pluginの紹介」というタイトルで、LT枠に登録しました。

ただ、Vim pluginの紹介でデモをやろうと思った時点で、LTでは全然時間が足りなそうということに 気づき、vim-jp/vimconfのissuesで時間を分けてもらえないか相談したところ、thincaさんに時間を 譲っていただき事なきを得ました。thincaさんありがとうございました。

発表内容は、最近全然新しいVim pluginを試せていなかったため、実益を兼ねVim plugin紹介にしよう と思ったはいいものの、Vim plugin選定に向けて、以下の様な制限を設けてしまったため、 調査にかなり時間がかかりました。(何個Vim plugin見たか覚えていない…

  • 私が使ったことがない or 使っていない
  • 日本語で紹介したページがない(or 非常に少ない)
  • プログラミング言語非依存

前日に微妙に喉に違和感を感じて当日どうなるか心配でしたが、そこまでひどくなかったのとユンケルのおかけでなんとかなりました。

前日は深夜4時まで資料を書きなおしたり、youtubeここらへんを 見てイメトレしたりしてました。

私の発表

発表スライドは以下にあげています

English version is here

発表練習出来ていなかったこともあり、時間を気にしてちょっと駆け足になってしまった感があり、 なんとなくでもわかってもらえたか不安だったりします。

類似Vim pluginで、いくつか会場にいらっしゃっている方のVim pluginを紹介したのに、 時間を気にして紹介できませんでした…(ここで紹介しておくと、thincaさんのthinca/vim-ref、 Lindanさんのrhysd/devdocs.vim、haya14busaさんのhaya14busa/vim-undoreplayです)

同じく類似Vim pluginで、AndrewRadev/inline_edit.vimの類似Vim pluginに、thincaさんのthinca/vim-partedit を載せてないという凡ミス(知っていたのに)をしました…

発表の際に、リストの中で 5個以上知っている方はいますかとアンケートを取ったところ、 一人もいなかったっぽいので、目的の一つは達せたような気がします。(実際に役に立つかどうかはわからないけど

ちなみに最後のOne more thingですが、あまりに微妙だったせいか、良かったとも悪かったとも誰からもふれられず、 懇親会の際、やっとbasyuraさんに「最後のOne more thingは完全に余計でしたねw」とありがたいツッコミを頂き、 きっと他の参加者の方も同じような気持ちだったんだろうなぁと思いましたが、私がやりたかっただけなのでまったく反省はしていない ( ー`дー´)キリッ

唯一反省点は、One more thingまでの持っていき方がちょっとイメトレしていた時と違ってあまりうまくできなかったので そこが心残りです

あとは、どうせやるなら自作Vim pluginとかもう少しまともなネタを用意したかったっていうのはありますが時間がなく断念…

人生で一度できれば十分なので、多分もうやることはないでしょうw

(是非もう一度見たいという声があればやぶさかではない)

雑多な感想

他の発表者の方の感想は、他の参加者の方が色々上げてくれるはずなので、雑多な感想を

  • 発表は皆クオリティが高くて、もっと発表うまくならねば、というか面白いネタを仕入れるために日々精進せねばと思いました
  • kaoriyaさんのプレゼンが、ラップトップのトラブルにより急遽スライドなし発表に切り替わったのですが、あまりに自然すぎてすごいとしか言いようがなかった…(私もアドリブ力がほしい)
  • LindanさんのブラウザでVim動かす発表で、ブラウザ上で普通にVim pluginが動いていて、「すごい」という言葉しか出てこなかった(犬)
  • gu4さんが5年yokohama.vimを続けたという意識の高いLTをされていて、私がまじめにVimを触り始めたのも大体一番初めのyokohama.vimからなので、5年たったのかぁと感慨深い気持ちになりました
  • 今年の懇親会は極力面識のない方とお話しようと思い、「Vimは何に使ってますか?」というキーワードを元に、3, 4人には話しかけることができ面白い話も聞けたので良かった(nviの話したり、私のVim pluginのduzzle.vimをやっていただいていたり、yoshiko_pgさんにvim-rengbang使ってみますと言っていただいたり、Lingr上でしか把握していなかったzcheeさんとお話したりなどなど)
  • ただ、懇親会楽しすぎてあっという間でもっと色々な方とお話したかったなぁという心残りもありました
  • そして話すのに夢中で寿司を全然食べられなかった…
  • そして話すのに夢中で寿司を全然食べられなかった…(大事なことなので二回
  • kaoriyaさん、ujihisaさんとお話できる(本当に)めったにない機会なのでお話させていただきました。vimconfに参加した方でお話していない方がいたら、是非来年は話しかけることをおすすめします!(そして私にも話しかけてくれると嬉しい)
  • 総じて例年以上に最高でした

終わりに

まだ、当日の余韻に浸っていますが、非常に濃い1日を過ごすことができました。

主催のdictavさん、VimConf2015運営にかかわられた皆さん、発表された皆さん、参加者の皆さん、会場を貸していただいた 株式会社ミクシィさん、本当にありがとうございました。

またどこかのVim関係の勉強会でお会いしましょう!

Happy Vim Life!