2011/10/01


先日、vim-jpがオープンした訳だけど、これの真の意味はバラバラだったユーザや開発者を1ヶ所に集めるのが目的。まぁVim-users.jpもあって良いし、各々でやったらいいと思うけど僕が求めていたのは開発側。
vim-jpを作って良かったと思った。
githubのIssueトラッカーを使ってvim_devにパッチを放流するまでのワークフローが出来上がりつつある。

  1. 不具合報告
  2. 皆で再現確認
  3. 修正方法の提案そして議論
  4. 修正担当者をアサイン
  5. パッチを仮で書いて貼り付ける
  6. レビューしてもらって提出
突然、有識者がパッチ書いてvim_dev投げるとツメも甘かったりしますし、第一に新しい開発メンバが増えない。仕事でも同じだな。不具合が出たら修正者にすぐ直させるものいいんだけど、どう直すのかを予めレクチャーさせると不具合の認識が共有出来る。
後からそういう修正じゃなかったんだけど...って事がなくなる。

とてもいい感じです。

さて、vim-jpが出来てまだ半月しか経ってない。でもvim_devでは日本人が猛威をふるっている。MLの皆が「日本人、突然どうした」と思ってるかもしれない。
では、このIssueトラッカーを使い出してからの成果をご紹介しよう。

入力文字列を変更してもcompletefuncが呼ばれない


補完中に入力文字を変えた場合、補完候補が変わるの可能性があるで補完関数が呼ばれるはずだが呼ばれない。
KoRoNさんがパッチ書いて投稿。素早い。さすがです。7.3.311で取り込まれる。

autoload関数を読み込むとコマンド行が1行ずれる


知る人ぞ知る、いやらしいバグ。コマンドラインからautoloadなスクリプトを呼ぶとコマンドメッセージが1行ずれる。eskk.vim等がそれの影響でひどい動きになっていた。
僕がパッチ書いて投稿。7.3.305で取り込まれる。

'verbosefile' で出力する際、:highlight などの色付きの出力だと出力が壊れる


verbosefileオプションでファイルを指定すると詳細な情報が出力されるのですが、その際、画面のメッセージ位置とファイル上の書き出し位置を共有しているのが原因で奇妙な見え方になっていた。
僕がパッチ書いて投稿。7.3.308で取り込まれる。

:callに複雑な式を渡すと「E15: Invalid expression」を出すことがある


vimscriptは文と文を"|"で繋げられるのだけど
echohl Warnings | echomsg "hello" | echohl NONE 文法的に解析する際、論理和の"|"と勘違いしてしまうので、vimscriptはif 0で通らない行についても仮でで関数を呼び出す。また関数の戻り値がDictの場合
call foo.bar().baz() みたいな事も出来る。vimscriptの仕様は変態的で、文字列の結合も辞書のメンバ参照も"."なのです。そのせいで無効行内の関数呼び出しは空のDictを返す作りになっています。ただ配列のインデックス指定時の考慮が抜けていた。
call foo.bar["baz"]() これがエラーになる。
僕がパッチ書いて投稿。ちょっと違うパッチになっちゃったけど7.3.329で取り込まれる。

ユーザ補完関数を使用していると、入力した文字列がregister-.に入らない


題名の通り。
KoRoNさんがパッチ書いて投稿。7.3.319で取り込まれる。

ドラッグ&ドロップで開いたファイルのバッファを削除すると落ちる


vim-jpメンバじゃない人から不具合報告をもらった。どんどん報告して下さい!
実際には既に閉じられたバッファのNULLポインタをデリファレンスしてた。
僕がパッチかいて投稿、7.3.316で取り込まれる。

'foldopen' が all でないと :help で折り畳みが開かれない


helpファイルにfoldingがある場合に:help fooがfoldを展開しない不具合。
僕がパッチかいて投稿、7.3.327で取り込まれる。

引数の変数名が重複していると内部エラーが出る


題名の通り。
tyruさんがパッチかいて投稿、7.3.325で取り込まれる。パッチをちょっと書き直されたけど、伝わればok

WindowsのMinGW環境にて、xxdのmakeに失敗する


mingw付属のgccがバージョン4.6になり、-mno-cygwinオプションがobsoluteになったのが原因。
ネオコンやVimShellでおなじみのShougoさんがvim_dev初投稿。みごとマージされ、はれてShougoさんはCONTRIBUTE AUTHORになりました。7.3.326で取り込まれる。

パッチは提供したけど、まだ反応もらってない物もあります。個人的にはNakadairaさんの指摘やパッチ提供が的確過ぎて素晴らしいです。

これ、半月の間に日本人が解決した不具合です。すばらしいですね。

これが僕がやりたかった事だ。どんどんvimが良くなれば、僕もKoRoNさんもNakadairaさんもtyruさんもthincaさんもShougoさんも、そして全ユーザも幸せになれるんです。

vim-jpでは不具合報告をお待ちしております。

あなたもCONTRIBUTE AUTHORになろう。
Posted at by



2011/09/30


※ネタです

※UDFです


正誤表を書くのにしばらくこの本をちょっと眺めてみたら、SQLiteのUDFって簡単に作れるんだなー、と思った && そういやV8ってライブラリとして簡単にリンクできるはずだな、と思い出した ので、ついカッとなって作った。

sqlite3udf-jseval - GitHub

http://github.com/mattn/sqlite3udf-jseval

UDFうんぬn

ほとんど↑の本、全然関係ないと思ってたけど、やっぱりSQLiteのUDFについて全然書いてなかった。しょうがないので軽く紹介しておくと

UDFを追加する場合、SQLiteの再コンパイルは必要ない (しかるべき所に.soがおいてあればいい)
UDFはこの辺読んどけばだいたい分かる。

例えば文字列っぽいものを返すmyfuncっていうUDFを作りたい場合
SQLITE_EXTENSION_INIT1 static void js_eval_func(sqlite3_context *context, int argc, sqlite3_value **argv);
int sqlite3_extension_init(sqlite3 *db, char **errmsg, const sqlite3_api_routines *api);
の二つの関数を実装したmyfunc.cっていうコードを用意してあげて gcc -o myfunc.so myfunc.c `sqlite_config --cflags` -shared という風にコンパイルして(これはLinuxの場合)、しかるべき場所(LD_LIBRARY_PATHが通る場所)に置いた後、sqliteのシェルで > select load_extension("myfunc.so"); とやればいきなり使える。

sqlite3_value_textはアロケートした文字列を渡して、最終引数に開放関数を渡すというのがUDFのお作法らしい。strdupで確保したポインタは最終引数の関数でfreeする、みたいな。

動かす手順

で、今回作ったのはV8とリンクして、JSの文字列をevalしてくれるjs_evalというUDF。
多分試す人はいないと思うけど、動かすための手順を書くと

V8のビルド

V8を落としてきてビルドする。ただし、SQLiteのUDFは別に-fPICを付けなくてもおk。

js_eval.cppをコンパイル

V8をビルドしたディレクトリにもっていって
g++ -o js_eval.so js_eval.cpp `sqlite_config --cflags` -shared -Iinclude libv8.a -lpthread
そうすると、js_eval.soができるので、これをLD_LIBRARY_PATHが通ったディレクトリに置く

読み込むる

シェルに入って
> select load_extension("myfunc.so"); (※このUDF、食わせるものによってはSQLiteごと落ちるかもしれないので良い子のみんなは注意だ)

キターーーッ

すごい。
sqlite3udf1

全然
sqlite3udf2
役に立つ気がしない。
sqlite3udf3
というかSQLite力が低すぎてどうしたら面白くなるか思いつかない。これを発展させていってTEXTとかに突っ込んだJSONの中身を効率よく検索とか出来たら面白い&実用的なんだけど、道は遠そうだ。


参考
やったーJavaScriptの動くMySQLできたよー - 愛と勇気と缶ビール

しばらく 積ん読 していたこの本をちょっと眺めてみたら、 MySQL のUDFって簡単に作れるんだなー、と思った && そういや V8 って ライブラリ として簡単にリンクできるはずだな、と思い出した...

http://d.hatena.ne.jp/zentoo/20110925/1316961032
Posted at by



2011/09/09



追記
anekosさんから、Chromeは「--disk-cache-dir=r:/ram みたいにオプションつけて起動すれば、キャッシュディレクトリ指定できる」と教えて貰いました。毎度指定してないとダメらしいですが、ショートカット等で運用すればjunction要らない子ですね。

IEとFirefoxに関しては難しい事はしないし誰でも出来る。この記事読む時間も合わせて10分程度あればIE、Firefoxを高速化出来る。Chromeは少し敷居が高いけど中級者レベルなら出来るはず。

以下、Windows初心者は最後まで読んでからやるべし。あと動作がおかしくなったとしても自力で直せる片が対象です。
まず、これを入れる。
ドライバーダウンロード RAMDISK ユーティリティー | BUFFALO バッファロー

お客様が以下のダウンロードソフトウェア使用許諾契約に同意する場合にのみ、お客様はダウンロードソフトウェアをダウンロードし、またはこれを使用することができます。ダウンロードソフトウェア使用許諾契約をよく...

http://buffalo.jp/download/driver/memory/ramdisk.html
これは、メモリをRAMDISKとして扱うソフトウェアで、通常の書き込みオーバーヘッドの多いディスクストレージに比べて高速にアクセス出来る仮想ストレージを提供するソフトウェア。

これをインストールすると、BUFFALO RAMDISKユーティリティとういソフトウェアがインストールされる。起動して「かんたん設定」ボタンを押すと、適当なドライブ(私の場合はFドライブになった)にメモリから割り当てられたRAMDISKが作られる。要再起動。
choppa1
実はこれだけで、既にIEとFirefoxが劇的に高速化されている。このソフト、以前まではキャッシュの設定を自分でやる必要があったが、最近は自動でやってくれる。
再起動後に詳細設定を見ると分かるが、IEのTemporary Internet FilesがFドライブに配置され、FirefoxのcacheディレクトリもFドライブに設定される。
choppa2
Google Mapsなんかで試すとサクサク動くようになるのが分かると思う。

最後にChromeだが、Chromeはキャッシュフォルダを任意の場所に移す事が出来ない。
そこでWindows2000以降で使えるハードリンクを使う。
WindowsXPに付属のfsutil.exeを使いたくなるだろうが、実はfsutil.exeはターゲットフォルダがNTFSとして認識されないとハードリンクが作れないという制限がある。そこでjunctionというツールを使う。
Junction

Windows 2000 以降では、ディレクトリのシンボリック リンクをサポートしています。これにより、ディレクトリをコンピューター上の別のディレクトリのシンボリック リンクとして使用することができます。...

http://technet.microsoft.com/ja-jp/sysinternals/bb896768
これを C:¥Windows¥System32 にコピーしておき、以下の手順で実行します。
以下を実行する前に全てのGoogle Chromeを終了しておいて下さい。

エクスプローラでCacheフォルダを移動する

WindowsXPだと以下のフォルダ C:¥Documents and Settings¥[ユーザ名]¥Local Settings¥Application Data¥Google¥Chrome¥User Data VistaやWindows7の場合は以下のフォルダ C:¥Users¥[ユーザー名]¥AppData¥Local¥Google¥Chrome¥User Data に移動し、Cacheというフォルダがある事を確認する。そのフォルダを上記のツールで作成されたドライブ(上記の例だとFドライブ)にカットアンドペーストする。心配な人はどこか別の場所にバックアップを持っておけばいい。ただしキャッシュなので飛んでもそれほど重大じゃないと思う。なお、バックアップは誰にも見えない場所にしておいた方がいい。
僕の場合は F:¥Cache というフォルダ名が汎用すぎて嫌だったので、エクスプローラから F:¥ChromeCache とリネームした。

コマンドプロンプトからジャンクションを作る

コマンドプロンプトを開き、上記の場所に移動し、junctionコマンドを実行する。
WindowsXPだと以下のコマンド cd C:¥Documents and Settings¥[ユーザ名]¥Local Settings¥Application Data¥Google¥Chrome¥User Data
junction Cache F:¥ChromeCache
VistaやWindows7の場合は以下のフォルダ cd C:¥Users¥[ユーザー名]¥AppData¥Local¥Google¥Chrome¥User Data
junction Cache F:¥ChromeCache
なお、この僕は上記で言った様に F:¥ChromeCache をChromeのキャッシュフォルダにしたが、他のフォルダ名にした人はコマンドの内容も変更して下さい。

あとはChromeを起動するだけ。

僕が触った感触だと、IEはかなり速くなり、FirefoxとChromeはそこそこ速くなる感じ。

ちなみにIEは、「インターネット オプション」にある「全般」タブで、タブの設定を開き、「クィック タブを有効にする」と「タブ グループを有効にする」のチェックを外しておくとさらにチョッパヤになる。
choppa3
なお、Chromeに関しては手動でジャンクションを作ったので、もし元に戻されるのならば、ジャンクションも元に戻すのを忘れない様にして下さい。

RAMDISKを作るソフトウェアとしては、「Gavotte Ramdisk」というソフトウェアもありますが、上記で説明したBUFFALO RAMDISKユーティリティの方が簡単に試す事が出来ます。
Posted at by