ここ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でやれよとは思う。。。

Vimから翻訳をしたい

というわけでLet's translategoogle.vim!

このプラグインをインストールすると以下のコマンドが使えるようになります。

:TranslateGoogle
:TranslateGoogleCmd

:TranslateGoogleを実行すると翻訳用のバッファが開き、

f:id:daisuzu:20131222151409p:plain

beforeバッファに入力した内容が翻訳されます。

f:id:daisuzu:20131222151442p:plain

beforeバッファで:TranslateGoogleEnableRetranslateを実行すると
翻訳後のバッファが再翻訳されます。

f:id:daisuzu:20131222151637p:plain

デフォルトでは英語から日本語への翻訳になっているので
変更する場合はvimrcに以下の設定を追加しておきます。

let g:translategoogle_default_sl = 'ja'
let g:translategoogle_default_tl = 'en'

コマンドから翻訳する場合は以下のように実行します。

:TranslateGoogleCmd --sl=ja --tl=en ダークビムマスター

'--sl'と'--tl'を指定しなかった場合はVim起動時の設定が使われます。

もっと詳しい使い方はドキュメントを参照といいたいところですが、
ほとんど書けていないのでソース参照といったところですかねぇ...

今思いつくTODO:

  • ドキュメントをもっと書く(コマンドの説明とか関数の説明とか)
  • :TranslateGoogleの翻訳が遅いことがあるので直す(InsertLeaveとTextChangedが両方発動する)
  • :TranslateGoogleの複数起動(:TranslateGoogleNewとか)
  • :TranslateGoogleCmdの-completeを作る

Fabricで最新のVimをバラまく

Vim Advent Calendar 2013の8日目の記事です。
昨日は@mattn_jpさんのVim script は人々の生活を豊かにしなければならないッ!でした。


以下のような開発環境で作業をするとき、ちょっとした編集なら特に困ることもないのですが、
バリバリとコードを書くとなるとさすがに素のVimは不便で困っていました。

f:id:daisuzu:20131207235804p:plain

最初はvimrcだけ転送したりとか、特定のプラグインだけを転送して使っていましたが、
色々と面倒になってしまったので、もうVim環境をまるごと転送してしまうことにしました。

Vim環境を作るのに用意したのは開発環境と同じOSの仮想マシンです。

f:id:daisuzu:20131207235822p:plain

この仮想マシン

をしたら.tar.gzとかで固めてまるっと開発環境にばらまきます。

ただ、毎回手作業をするとなるとそのうちやらなくなってしまうので
Fabricさんにやってもらいましょう。

# -*- coding: utf-8 -*-
""" fabfile for vim. """

from fabric.api import (
    run,
    get,
    put,
    cd,
    hosts,
)

# Vimのソースコードをhg cloneした場所
VIM_SRC = '~/src/vim'

# Vimのインストール先
VIM_PATH = '$HOME/work/daisuzu/local'

# vimrcをgit cloneした場所
VIMRC_PATH = '~/work/daisuzu/.vim/dotvim'

# 最初に読み込むvimrc
MYVIMRC = '~/work/daisuzu/vimrc'

# 作成したしたVim環境の格納場所
VIM_ARCHIVE = './work/daisuzu'

# Vimをビルドする際に設定する環境変数
env_export = [
    {'vi_cv_path_python3':
        '$HOME/.pyenv/versions/3.3.2/bin/python3'},
]
env_str = ' && '.join(
    [
        'export {key}={value}'.format(
            key=x.keys()[0],
            value=x.values()[0])
        for x in env_export
    ]
)

# Vimの./configureのオプション
config = [
    {'with-features':
        'huge'},
    {'enable-multibyte':
        ''},
    {'enable-gui':
        'gtk2'},
    {'enable-rubyinterp':
        'dynamic'},
    {'enable-pythoninterp':
        'dynamic'},
    {'with-python-config-dir':
        '$HOME/.pyenv/versions/2.7.5/lib/python2.7/config'},
    {'enable-python3interp':
        'dynamic'},
    {'with-python3-config-dir':
        '$HOME/.pyenv/versions/3.3.2/lib/python3.3/config-3.3m'},
    {'enable-perlinterp':
        'dynamic'},
    {'enable-luainterp':
        'dynamic'},
    {'with-luajit':
        ''},
    {'with-lua-prefix':
        '$HOME/.luaenv/versions/luajit-2.0.1-p1'},
    {'enable-gpm':
        ''},
    {'enable-xim':
        ''},
    {'enable-cscope':
        ''},
    {'enable-fontset':
        ''},
    {'with-compiledby':
        '"daisuzu <daisuzu@gmail.com>"'},
    {'prefix':
        '$HOME/work/daisuzu/local'},
]
config_str = ' '.join(
    [
        '--{key}{value}'.format(
            key=x.keys()[0],
            value='=' + x.values()[0] if x.values()[0] else '')
        for x in config
    ]
)


@hosts(['centos6'])
def build():
    """ build vim. """

    with cd(VIM_SRC):
        result = run('hg incoming', warn_only=True)
        if not result.return_code:
            # 新しいパッチが来ていたらVimをビルドする
            run('hg pull')
            run('hg update')
            run('make distclean')
            run(
                '{env} && {cmd} {arg}'.format(
                    env=env_str,
                    cmd='./configure',
                    arg=config_str
                )
            )
            run('make')
            run('sudo /usr/local/bin/paco -D make install')

    # vimrcを更新する
    with cd(VIMRC_PATH):
        run('git pull --rebase')

    # プラグインを更新する
    run(
        '{vim} {opt} {so_cmd} {update_cmd} --cmd qall'.format(
            vim=VIM_PATH + '/bin/vim',
            opt='-N -u NONE -i NONE -V1 -e -s',
            so_cmd='--cmd "source ' + MYVIMRC + '"',
            update_cmd='--cmd NeoBundleUpdate'
        ),
        warn_only=True
    )

    # Vim環境とif_xxxに必要な環境を圧縮する
    run('tar zcvf dotvim.tar.gz --exclude .git ' + VIM_ARCHIVE)
    run('tar zcvf dotenv.tar.gz --exclude .git .luaenv .pyenv .plenv .rbenv')

    # ローカルマシンに一旦コピー
    get('dotenv.tar.gz', '/home/daisuzu/tmp/dotfiles/dotenv.tar.gz')
    get('dotvim.tar.gz', '/home/daisuzu/tmp/dotfiles/dotvim.tar.gz')


@hosts(['relay-host00'])
def dist():
    """ dist vim. """

    # Vimをバラまくホストたち
    target_hosts = [
        'target-host01',
        'target-host02',
    ]

    # まずは踏み台ホストにファイルをコピー
    put('/home/daisuzu/tmp/dotfiles/dotenv.tar.gz', 'dotfiles/dotenv.tar.gz')
    put('/home/daisuzu/tmp/dotfiles/dotvim.tar.gz', 'dotfiles/dotvim.tar.gz')

    # 対象のホストに一式をコピーしてから展開する
    for h in target_hosts:
        run(
            '{scp} {file} {host}:{dst}'.format(
                scp='myscp',
                file='dotfiles/dotenv.tar.gz',
                host=h,
                dst='work/daisuzu/dotfiles'
            )
        )

        run(
            '{scp} {file} {host}:{dst}'.format(
                scp='myscp',
                file='dotfiles/dotvim.tar.gz',
                host=h,
                dst='work/daisuzu/dotfiles'
            )
        )

        run(
            '{ssh} {host} "{cmd}"'.format(
                ssh='myssh',
                host=h,
                cmd='tar zxvf work/daisuzu/dotfiles/dotenv.tar.gz'
            )
        )

        run(
            '{ssh} {host} "{cmd}"'.format(
                ssh='myssh',
                host=h,
                cmd='tar zxvf work/daisuzu/dotfiles/dotvim.tar.gz'
            )
        )

FabricにしたのはChefとかAnsibleだと踏み台ホストで動かすことができなかったからです。

このfabfileでは以下の環境で動作することを想定しています。

[~/]
+ .luaenv/      ==> luajit-2.0.1-p1がインストール済
+ .plenv/       ==> 5.18.0がインストール済
+ .pyenv/       ==> 2.7.5と3.3.2がインストール済
+ .rbenv/       ==> 1.9.3-p448がインストール済
- src/
 |+ vim/        ==> hg clone https://code.google.com/p/vim/
- work/
 |- daisuzu/
  |- .vim
   |+ Bundle/   ==> neobundle#rcするディレクトリ
   |- dotvim/   ==> git clone git://github.com/daisuzu/dotvim
    |  .vimrc
  |- local/     ==> ビルドしたVimはここにインストールされる
   |- bin/
    |  vim
   |+ share/
  |  vimrc      ==> このvimrcから~/work/daisuzu/.vim/dotvim/.vimrcを読み込む

開発環境は同じユーザに複数人がログインして使うことがあるため、
標準のVimには一切影響を与えないようにしています。

そのため、新たにインストールしたVim

$ ~/work/daisuzu/local/bin/vim -u ~/work/daisuzu/vimrc

として実行するかaliasに設定してあげる必要があります。


あとは気が向いたタイミングでこのfabfile.pyを叩くなりcronで回すなりすれば
Vim環境をアップデートすることができます。

ね、簡単でしょう?


なんでわざわざこんなことをするかって!?
そんなのよく使うプラグインがより速く、より強くとif_luaを...
な なにをする そのまさかー!
He has turned to the dark side.


明日は@Linda_ppさんです。

VimConf2013に行ってきた

昨日(11/16)はVimConf2013に参加してきました

発表内容

  • How to suggest new features for Vim(by @kaoriya)

Vimは単なるテキストエディタなので新機能を取り込んでもらうにはストーリー作りが大事

  • Evil is Justice.(by @esehara)

Emacsの機能を使いたいけどVim風に編集したい時にはEvilが便利

  • How to use Git from Vim(by @c0hama)

プラグインがあってもなくてもVimからGitを使うのは便利

  • vital.ProcessManager(by @ujm)

外部プロセスとの連携にif_xxx + スレッドは危険だけどProcessManagerを使うと簡単で安全

  • Do You Know About Vim Builtin Runtime Files?(by @Linda_pp)

Vimには色々と便利なスクリプトが付属しているので「それデフォルトのVimでもできるよ!」

  • How to write patches for Vim(by @k_takata)

Vimのパッチを書くための環境を作ったら気軽にパッチを書いてみて自分だけのVimを構築しよう

  • About of neocomplete(by @ShougoMatsu)

neocomplete誕生秘話とif_luaのパフォーマンス、続きはFAQで!

スライドはそのうちVimConf2013のページにリンクされるのかな?

個人的には最近仕事でquick hack的なソリューションをボコられてしまったので
kaoriyaさんの発表がグサッときました。
そのへんも含めて色々とお話できればと思ったらほぼ猫トークで終わってしまった...

それから懇親会ではピザを食べながら他のVimmerの方々と交流したり、
Shougoさんのライブで盛り上がったり、とても楽しかったです。

ということで皆さまお疲れ様です、ありがとうございました。