2011/10/11


どんなソフトにもバグあって、ユーザからの報告によって直って行くんだけど
  • バグ報告したいけど英語が苦手
  • 解析出来ない
  • 再現が難しい
といった問題がバグ報告への足枷になっている事実は否めません。
そこでgithub上にvim-users-jpというorganizationを作成しました。
vim-jp/issues - GitHub

有識者で既知のバグを管理しオフィシャルへのマージを検討します

https://github.com/vim-jp/issues/issues

issuesを開放していますので

ぜひ日本語でバグ報告

して下さい。
githubのアカウントは必要になりますが、少しはバグ報告への障壁が減るかと思います。
誰かが解析してvim-devにバグ報告してくれるかもしれませんし、patch付きで報告されて瞬時に直るかもしれません。

既に幾らかissuesに登録されています。これを見てvim-devに報告して貰っても良いですし、issuesに補足情報を追加してもらっても構いません。
場合によってはgitリポジトリも開放します。
有識者数名をorganizationに追加させて頂きましたが、迷惑であれば外しますし、もし権限が必要な方がいらっしゃれば連絡下さい。
Posted at by



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