2013/12/06


この記事はVim Advent Calendar 2013 : ATND 7日目の記事になります。

2013年もあと少しです。今年も Vim に関する色んな話題が登場しました。
そして数多くの Vim plugin が今年も登場しました。
  • ステータスバーをスタイリッシュにするプラグイン
  • Markdownをプレビューするプラグイン
  • 正規表現をプレビューするプラグイン
  • ブラウザと通信するプラグイン
  • 補完プラグイン
  • 貴様!?まさか!
  • そのまさかだ!フハハハハハハ...
どれも凄い物ばかりでした。そして Vim 界においては日本人の活動が特に素晴らしかったと思っています。 k_takata さんの大活躍で多くのパッチが vim-jp より提出され取り込まれました。
何名かの方には Vim 7.4 のリリース後も動作検証に協力頂きましたし、Vim advent calendar 2012 は結局1年を通して記事をポストし続けてしまいましたし、vimrc読書会も毎週続けられ、Vim に関するイベントも多く開催されました。
個人的には9月に KoRoN さん、h_east さん、ytaniike さんとお好み焼きを食べに行った事も良い思い出になりました。ありがとうございました。

来年も Vim にとって良い年である事を切に願います。
さて、今年作られた Vim plugin、どれも良い物でしたが僕がいつも思う事はこんな事です。

Vim プラグインとは言え、作るからには人々の暮らしを豊かにしなければならないッ!
僕は Windows を良く使います。僕の Vim script 力で Windows ユーザを豊かにしたい、くじけそうになっている人を Vim で救いたい。モテたいと願っている青年達を Vim でモテモテにしたい。そう願って今年も新しいプラグインを作りました。
mattn/startmenu-vim - GitHub
https://github.com/mattn/startmenu-vim
StartMenu

CtrlPUnite で Windows のスタートメニューが扱えます。
これでいちいちマウスに手を伸ばしてスタートメニューをクリックし、ポチポチとツリーを展開したり検索語を入力していく必要もありません。

あえて日本語ロケールの名称で一覧していませんので、IME を使わず英名でマッチします(ショートカット名が日本語の場合は頑張って下さい)。これで Vim から Excel 等を簡単に起動出来る様になりました。
会社で Vim から Excel 起動したら、きっと同僚の眼差しも「センパイッ!すごい!」となるでしょう。
もっと豊かに、もっと豊かに...

そうだ...そうなんだ。僕のプラグインで便利になったのはプログラムの起動方法でしかないッ!Windows ユーザはそのランチャーから起動した Excel で設計書を閲覧するんだ!彼らの生活を豊かにする為には、Vim で Excel を開けなければならないんだァッ!!これはもう、Vim で Excel を見れる様にするしかない!!1
そう思って、もう一つプラグインを作りました。
mattn/excelview-vim - GitHub
https://github.com/mattn/excelview-vim
てっとりばやく言うと、Vim で Excel を閲覧出来ます。 :ExcelView Book1.xls で表示出来ます。シート番号を指定して :ExcelView Book1.xls 2 という開き方も出来ます(この辺は、今後もしかしたら変更するかもしれません)。
excelview1
こんな Excel ファイルであれば
excelview2
こう表示されます。
xlsx 形式(Excel 2007形式)のファイルしか読めないです。今後、もしかしたら CSV には対応するかもしれません。実行には webapi-vim が必要です。
ちなみに Pure Vim script の XML パーサでこんな事やってます。
let doc = webapi#xml#parse(xml)
let rows = doc.childNode("sheetData").childNodes("row")
let cells = map(range(1256)'map(range(1,256), "''''")')
let aa = char2nr('A')
for row in rows
  for col in row.childNodes("c")
    let r = col.attr["r"]
    let nv = col.childNode("v")
    let v = empty(nv) ? "" : nv.value()
    if has_key(col.attr, "t") && col.attr["t"== "s"
      let v = ss[v]
    endif
    let x = char2nr(r[0]) - aa
    let y = matchstr(r, '\d\+')
    let cells[y][x+1= v
  endfor
endfor
今の所、制限事項として 256x256 のデータしか表示出来ません。それ以上のデータを読み込むとエラーが発生します(改良の予定です)。

これでとても豊かになりました。ssh でサーバにログインしている開発者が Excel で仕様書を送りつけられても椅子を投げる事も無くなると信じています。

良い年末をお過ごし下さい。
実践Vim 思考のスピードで編集しよう! 実践Vim 思考のスピードで編集しよう!
Drew Neil, 新丈径
アスキー・メディアワークス 単行本(ソフトカバー) / ¥5,830 (2013年08月29日)
 
発送可能時間:

Vimテクニックバイブル ~作業効率をカイゼンする150の技 Vimテクニックバイブル ~作業効率をカイゼンする150の技
Vimサポーターズ
技術評論社 単行本(ソフトカバー) / ¥540 (2011年09月23日)
 
発送可能時間:

Posted at by



2013/11/28


普段 vim-jp や色んな所で jekyll を使っているのだけど、どうも遅くて困っていました。
Windows だと ruby 本体の起動も重いのに、たかだか数十ページの生成に十数秒、PCの負荷が高い時には30秒近く掛かったりしていました。
何とか出来ないかなーと思って、golang を使ってクローンを作ってみました。
mattn/jedie - GitHub

jedie - static site generator, jekyll replacement, in golang

https://github.com/mattn/jedie
インストールは以下の様に行います。 $ go get github.com/mattn/jedie
jekyll と同様にひな形の出力も出来ます。 $ mkdir mysite
$ cd mysite
$ jedie new .
markdown エンジンの変更等は出来ませんので _config.yml でのカスタマイズ性は高くないです。
テンプレートエンジンには pongo を使いました。
flosch/pongo - GitHub

pongo is a well-tested template engine which implements a Django-template -like syntax

https://github.com/flosch/pongo
django のテンプレートエンジンを真似ていますが、jekyll の liquid も良く似た構文になっています。jedie では liquid と似る様に、幾つかフィルタも追加しています。
_postsyyyy-mm-dd-title.md というファイルを書いたら $ jedie build
_site に html が生成されます。for を使って site.posts をぐるぐる回したりも出来ます。
またローカルサーバを立ち上げる事も出来ます。 $ jedie serve
フォルダを監視して、変更があれば自動で変換する処理も実装しています。
細かな点で jekyll と異なる点があるかもしれませんが、僕としてはこれで十分なレベルになったので公開してみました。
ちなみに jekyll で時間が掛かっていたサイトを jedie で生成してみましたが、「フハハハハハ...」と笑みがこぼれる程に高速でした。
テンプレート記法をそれ程使っていない方であれば、jekyll から乗り換え可能かもしれません。


/ (1970年01月01日)
 
発送可能時間:

Posted at by



2013/11/15


Treasure Data の REST API をコールするライブラリを書いた。
REST API | Treasure Data

REST API The user can control Treasure Data using the public REST API. This article will explain how...

http://docs.treasure-data.com/articles/rest-api
mattn/go-treasuredata ・ GitHub
https://github.com/mattn/go-treasuredata
使い方はこんな感じ。
client := treasuredata.NewClient("TREASUREDATA-API-KEY")
job, _ := client.JobIssueHive("mydb""select * from mytable")
client.JobResultFunc(job.JobId, func(row []interface{}) error {
    fmt.Println(row)
    return nil
})
結果は JSON で貰えます。データが大量に返る場合があるのでデータ取得はコールバックで行います。error を返せば途中で抜けられます。
td フォルダにはコマンドラインツールが入っていて、クエリをコマンドラインから投げられます。
$ cd td
$ go build td.go
$ export TREASURE_DATA_API_KEY=xxxxxx
$ ./td -d mattn -q 'select * from unko'
["残念","小",{"size":"小","feel":"残念","time":"1363948092"},1363948092]
["残念","小",{"size":"小","feel":"残念","time":"1363948093"},1363948093]
["残念","小",{"size":"小","feel":"残念","time":"1363948094"},1363948094]
["残念","小",{"size":"小","feel":"残念","time":"1363948095"},1363948095]
["残念","小",{"size":"小","feel":"残念","time":"1363948096"},1363948096]
["残念","小",{"size":"小","feel":"残念","time":"1363948097"},1363948097]
["爽快","大",{"size":"大","feel":"爽快","time":"1363948098"},1363948098]
["残念","小",{"size":"小","feel":"残念","time":"1363948091"},1363948091]
["残念","小",{"size":"小","feel":"残念","time":"1363948092"},1363948092]
["残念","小",{"size":"小","feel":"残念","time":"1363948093"},1363948093]
["残念","小",{"size":"小","feel":"残念","time":"1363948094"},1363948094]
["残念","小",{"size":"小","feel":"残念","time":"1363948095"},1363948095]
["残念","小",{"size":"小","feel":"残念","time":"1363948096"},1363948096]
["残念","小",{"size":"小","feel":"残念","time":"1363948097"},1363948097]
["爽快","大",{"size":"大","feel":"爽快","time":"1363948098"},1363948098]
["残念","小",{"size":"小","feel":"残念","time":"1363948092"},1363948092]
["残念","小",{"size":"小","feel":"残念","time":"1363948093"},1363948093]
["残念","小",{"size":"小","feel":"残念","time":"1363948094"},1363948094]
["残念","小",{"size":"小","feel":"残念","time":"1363948095"},1363948095]
["残念","小",{"size":"小","feel":"残念","time":"1363948096"},1363948096]
["残念","小",{"size":"小","feel":"残念","time":"1363948097"},1363948097]
["爽快","大",{"size":"大","feel":"爽快","time":"1363948098"},1363948098]
["残念","小",{"size":"小","feel":"残念","time":"1363948091"},1363948091]
["残念","小",{"size":"小","feel":"残念","time":"1363948092"},1363948092]
["残念","小",{"size":"小","feel":"残念","time":"1363948093"},1363948093]
["残念","小",{"size":"小","feel":"残念","time":"1363948094"},1363948094]
["残念","小",{"size":"小","feel":"残念","time":"1363948095"},1363948095]
["残念","小",{"size":"小","feel":"残念","time":"1363948096"},1363948096]
["残念","小",{"size":"小","feel":"残念","time":"1363948097"},1363948097]
["爽快","大",{"size":"大","feel":"爽快","time":"1363948098"},1363948098]
毎日のウンコのサイズを treasure data に入れておいて、go-treasuredata で履歴を照会出来る様にしておけば健康管理もバッチリですね。
Posted at by