TokyoVim#18に行ってきた

TokyoVim#18に行ってきました。

今回の目標はdaisuzu/translategoogle.vim · GitHubのドキュメントを書くことだったので最初はgoogle/vimdoc · GitHubで書こうと色々試してみました。
が、LeafCage/vimhelpgenerator · GitHub変数にあたる部分をうまく生成することができず、結局普通に書いてしまいました。

ただ、コードのコメントからドキュメントを自動生成するというのはメンテナンスがしやすそうなので今後のバージョンアップに期待したいです。
※見た感じgoogle/maktaba · GitHubのようなライブラリを対象にしているような気がしたので普通のプラグイン向けになるかはわかりませんが...

あとはプラグインに自分が使いそうなコマンドを追加したりとかしていたらあっという間に終わってしまいました。

終了後は懇親会に行き、他のVimmerと交流しながらVim Advent Calendar 2013 : ATNDの記事を書いたりしていました。

次回はちょろっと話に上がったハトクラをやりたいです。

Vimでマウスを使った矩形選択がしたい

Vim Advent Calendar 2013の133日目の記事です。

昨日、後輩(コンソールではVimを使っている)
「矩形選択が楽なのでxyzzy使っています」
と言っていたので

  • Alt + LeftMouse
  • マウスドラッグで選択開始してCtrl + V

Vimでも同じようにできるよ。
と教えてあげました。

Vimでマウス...!?とか言われてしまいそうですが、
任意の範囲を選択したいときにはマウスが便利だと思います。

明日のVim Advent Calendarはどうも書く人がいないようですが、
きっと本日のTokyoVim#18に参加して進捗を出せた人が書いてくれると思います。

ちなみにこの記事はPC利用率100%のTokyoVim#18懇親会会場で書いています。

TokyoVim#17に行ってきた

久しぶりにTokyoVimに行ってきました。
今回は#17でした。

内容はいつも通りのもくもく会
今まで何かと忙しくて去年作ったままほったらかしになっていた
translategoogle.vimをようやく修正することができました。


まず直したのは:TranslateGoogleCmdのオプション補完。
このプラグインではVitalのOptionParserを使って引数の解析をしていたのですが、
少し前にLinda_ppさんが補完もできるようにしてくれたのでその対応をしました。

既に組み込まれているVitalは古いバージョンなので以下コマンドでVitalを更新します。

" プラグインのあるディレクトリで実行する場合はtarget-dirに"."を指定
:Vitalize --name=translategoogle . Vim.BufferManager Vim.Message Web.HTTP Web.HTML OptionParser

" 更新の場合はmoduleの指定は省略可(@haya14busaさんに教えていただきました)
:Vitalize --name=translategoogle . 

これでOptionParserの新しい機能を使う準備ができました。

実際にオプション補完をするにはcommandの-completeに
オプション補完用の関数を指定するだけです。

let s:V = vital#of('translategoogle')
let s:OptionParser = s:V.import('OptionParser')

let s:parser = s:OptionParser.new()
call s:parser.on('--sl=VALUE', 'source language')
call s:parser.on('--tl=VALUE', 'target language')
call s:parser.on('--ie=VALUE', 'input encoding')
call s:parser.on('--oe=VALUE', 'outout encoding')

" 新たに追加した関数
function! translategoogle#complete_command(arglead, cmdline, cursorpos)
    return s:parser.complete(a:arglead, a:cmdline, a:cursorpos)
endfunction

" -completeにcustomlist,translategoogle#complete_commandを追加
command! -nargs=* -complete=customlist,translategoogle#complete_command
            \ TranslateGoogleCmd echo translategoogle#command(<q-args>)

以下のように"--"まで入力した後にTabキーを押すと

:TranslateGoogleCmd --

補完候補に

--tl=, --oe=, --ie=, --sl=

が出てくるようになりました。

ただ、これだけではオプションに指定する値は補完できないのでもう少し修正します。

" オプション値の補完候補
let g:translategoogle_languages =
            \ get(g:, 'translategoogle_languages', ['ja', 'en'])

" オプション値の補完に使用する関数
function! s:complete_language(optlead, cmdline, cursorpos)
    return filter(copy(g:translategoogle_languages),
                \ 'a:optlead == "" ? 1 : (v:val =~# a:optlead)')
endfunction

" --slと--tlにオプション補完関数を指定
call s:parser.on('--sl=VALUE', 'source language', {'completion': function('s:complete_language')})
call s:parser.on('--tl=VALUE', 'target language', {'completion': function('s:complete_language')})

これで

:TranslateGoogleCmd --sl=

の後にTabを押すと

--sl=ja, ==sl=en

が補完されるようになりました。

また、OptionParserはデフォルトで"--help"というオプションが用意されているため、

:TranslateGoogleCmd --help

として実行すると

Options:
  --tl=VALUE : target language
  --oe=VALUE : outout encoding
  --ie=VALUE : input encoding
  --sl=VALUE : source language

のようなヘルプを表示することができます。

この時、ヘルプを表示しても:TranslateGoogleCmd自体の実行は終了しないため、
処理を止めたい場合は

function! translategoogle#command(args)
    let args = s:parser.parse(a:args)
    if exists('args.help')
        return ''
    endif

    " 処理はこの下で行う
    " ...

endfunction

のようにして関数をreturnさせてあげる必要があります。


他には翻訳用バッファでInsertLeaveやTextChangedイベントが発生すると
すぐに翻訳を始めてしまうので、有効/無効を切り替えるコマンドや

" autocmdでの自動翻訳を有効化
:TranslateGoogleEnableAutoUpdate

" autocmdでの自動翻訳を無効化
:TranslateGoogleDisableAutoUpdate

翻訳用バッファをまとめて閉じるためのキーマッピングの設定

" デフォルトは'q'、''を指定するとマッピングをしない
let g:translategoogle_mapping_close = 'q'

を追加しました。


そして致命的だった、特定の文字列を翻訳すると
エラーが発生してしまう問題を修正しました。


とりあえず自分が普段使う分には良さそうな感じです。
daisuzu/translategoogle.vim · GitHub


なお、オプションの補完で使用している

function('s:complete_language')

は古いVimだと使えないようなので注意してください。
http://lingr.com/room/vim/archives/2014/03/15#message-18588733

ここ1年で新たに使ったソフトやライブラリなど

転職後、本格的に実務をやるようになって約1年。
色々とやったような気がするので思い出しながら書き出してみる。

ソフトウェア

SIPpみたいなトラフィックジェネレータ。
こっちはIMSだけじゃなくてRadiusとかDiameterも使える。

仮想環境を自動化する。
コマンド一発で環境が立ち上がるのは便利。

ターミナルマルチプレクサ。
ネットが切れやすい環境でsshを使うときは無いと困る。

MySQLインターフェイス
WindowsからMySQLをいじるときはこれを使っている。

デプロイツール。
ChefやAnsibleよりも手軽。

プロセス管理ツール。
適当に書いたスクリプトがデーモンになる。

ログ収集ツール。
設定ファイルだけでデータを集計したりしきい値監視したりメールを出したりできる。

Perl

初めてのWebプログラミングはcgiでした。

実はSQLを書いたのも初めて。

  • Template-Toolkit

さすがにprint関数で1行ずつhtmlを書いていくのはしんどい。。。

  • prove + Test::More + Test::Pretty

テスト関係のモジュール。
実際にはTest::mysqldやTest::Fixture::DBIとかTest::Mock::LWP::Dispatchあたり使っている。

  • String::Trigram

テキストの類似度を計算してくれる。

Python

  • Flask + SQLAlchemy

軽量Webフレームワーク + ORM。
プラグインがたくさんあるしPerlよりPythonの方が好きなので使いやすい。

  • mechanize

WWW::MechanizeのPython版。

  • pyquery

jQueryみたいなセレクタを使えるようになるライブラリ。
最近ではBeautifulSoupよりこっちの方が使われているらしい。

JavaScript

cgiすらやったことなかったので当然jQueryも初めて。

  • AngularJS

Webアプリをいまどきの手法で爆速開発したを読んで気になったので使ってみた。


決してWebエンジニアではないはずなんだけどWeb系のことばっかりやってるように見える...
来年度はもうちょい下のレイヤとか組み込み+モバイルなんかもやっていきたいなぁ。

IT系エンジニアが新しいタスクを振られた時

自分の場合はここ1年間、

  1. 周りを納得させられる理由があれば拒否する
  2. 今抱えているタスクに対し、リソースやスケジュールを調整して対応する
  3. 稼働を上げつつ新しい方法などで効率化しながら対応する
  4. 普通に稼働を上げるだけで対応する

の順でやっていると思う。

といっても1.なんて実際にはほとんど無いかも。
それをやることでビジネス的なメリットが何も無いときくらいしか思いつかないし。

そうなるとその下の2.か3.か4.になるわけだけど、個人的に一番好きなのは3。
達成感もあるし自分自身の成長にもなる。

そもそも評価エンジニアから開発エンジニアに転職したから今までのスキルセットだと何もできなくなってしまうわけで。
だから結果としては2.を選びつつ3.になっていることもあるのかな。

4.は残業時間だけ増えて得るものは少ないから出来れば避けたい選択肢。

ただ3.は終わらなかったり何か問題が起きたらどうするんだ!
的な反対をされることもあるんだけど他の人はどうなんだろ?(どうしてるんだろ?)

そして1.の段階で
「やったことがないからできません」
とか
「わからないからできません」
って言っている人がいてちょっとびっくりする。
(これは転職後も転職前もベテランでも新人でも)

こういった考え方もそのうち変わっていくのかなぁ...

isaiに機種変更した

少しSOL23SHL24と迷ったけど結局LGL22にしました。

今までがINFOBAR C01だったので今回は

  • 前よりバッテリの持ちが良くて
  • 前よりスペックが高くて
  • 前より画面が大きくて
  • 防水対応

の機種にしようと思っていました。
元が元なのでいまどきのAndroidであればほとんどどれでもOKなんですが、
メーカー的に(個人的には)一番良さげなLGを選びました。

1週間ほど使ってみて概ね満足といったところですが、画面が一気に大きくなりすぎたのでちょっと扱いに困っています。
それからたまにEメールがなかなか届かないことがあるのはアプリかWNSがバグってるからかも?
ってこれはINFOBAR C01もそうだったのでまだ直っていないのかという感じですが...


あとは以下の記事にも書いてありますが3845#*22#で裏メニューに入れるようです。

[au]LG LGL22 isai simunlock(シムフリー化)をやってみた | はるアイコン鯖blog

まあ今のところあまり使うこと無さそうな機能ばかりですが。。。

ssh先のVimでSphinxドキュメント編集中にプレビューをしたくなった

Windowsgvimなら:QuickRunコマンドだけでビルドしてFirefoxで開くところまでやってくれるように設定してあるんだけど、コンソールだとテキストブラウザしか使えない...

ふとPythonのSimpleHTTPServerを思い出したので_build/htmlディレクトリで

:let s = vimproc#popen3('python -m SimpleHTTPServer')

を実行してみた。

普通のブラウザからhttp://ssh先のip:8000を開くと生成したhtmlが表示されるのでとりあえずこれでも良さそう。

終了するときは

:call s.kill()

最初からGUIでやれよとは思う。。。