2010/06/18


tyruさんが既に記事にしてくれてますが、こちらでも。
mattnさんが前の記事にコードで回答してくれた - おつあり

mattnさんが前の記事にコードで回答してくれた Vim mattn’s libcallex-vim at master - GitHub こんなリポジトリが作られたので十中八九僕のlibcall()...

http://d.hatena.ne.jp/tyru/20100518/cool_mattn
通常 libcall は引数が1つしか扱えないのですが、内部でJSONでやりとりしてC言語で書いた呼び出しproxyを介して外部ライブラリ(DLL等)の関数を呼び出せます。
とはいってもvimで扱える型しか対応していませんが、ちょっと無茶すればいろんな事が出来ます。
例えばuser32.dllのMessageBoxAを実行したり... so ../libcallex.vim

silent unlet! lib

let lib = libcallex.load('msvcrt.dll')
let username = lib.call('getenv', ["USERNAME"], 'string')
call libcallex.free(lib)

let lib = libcallex.load("user32.dll")
if lib.call('MessageBoxA', [0, "Hello ".username."\r\nCan you see this message?", 'Hello World', 4]) == 6
  call lib.call('MessageBoxA', [0, 'You clicked "YES"', 'Hello World', 0])
else
  call lib.call('MessageBoxA', [0, 'You clicked "NO". Are you all right?', 'Hello World', 0])
endif
call libcallex.free(lib)
バッファを引数に取る関数を呼び出してWindowsのSystemディレクトリを取得したり... so ../libcallex.vim

silent unlet! lib

let lib = libcallex.load('kernel32.dll')

let buf = repeat(' ', 255)
let args = [buf, 255]
call lib.call('GetWindowsDirectoryA', args, 'number')
let dir = args[0]
echo "your windows directory: " . dir

let buf = repeat(' ', 255)
let args = [buf, 255]
call lib.call('GetSystemDirectoryA', args, 'number')
let dir = args[0]
echo "your system directory : " . dir

call libcallex.free(lib)
無理やりlongのポインタ作ってバッファ書き込み数を参照渡しで扱う関数を呼び出したり... so ../libcallex.vim

silent unlet! msvcrt
silent unlet! advapi32

let msvcrt = libcallex.load('msvcrt.dll')
let advapi32 = libcallex.load('advapi32.dll')

" make address of variable which is stored 256
let ptr = float2nr(eval(msvcrt.call('malloc', [4], 'number')))
call msvcrt.call('memset', [ptr, 0, 4], 'number')
call msvcrt.call('memset', [ptr+1, 1, 1], 'number')

let buf = repeat(' ', 256)
let args = [buf, ptr]
call advapi32.call('GetUserNameA', args, 'number')
let username = args[0]

call msvcrt.call('free', [ptr], 'number')

call libcallex.free(advapi32)
call libcallex.free(msvcrt)

echo username
出来ます。(まぁ最後のはやりすぎとして)
分かる人は想像通りですが、簡単なインラインアセンブラで実現してます。
いままでvimからDLL呼び出しが出来ないと悩んでおられた方には有用かもしれません。

えっ?mattnとtyruさんだけだって?
Posted at by




知っている人もいるだろうけど、一応こっちでも宣伝。
os0xさんがSafariで拡張を作る方法をまとめてくれたので、すんなり出来ました。
Safari拡張の作り方 - 0xFF

Safari拡張の作り方 Safari, extension Safari拡張をいくつか作って大体感覚は掴めたので、ざっくりと拡張の作成手順を解説してみます。 なお、Windows版で作業していますが...

http://d.hatena.ne.jp/os0x/20100610/1276119135
作業時間も30分程度だった気がする。
mattn's safari-grff at master - GitHub

Google Reader Full Feed for Safari

http://github.com/mattn/safari-grff
Safari5で動きます。パッケージングしたものをDownloadから落とせるので、使ってみたい人はどうぞ。
ソースも一緒の所にあるので良かったらみて下さい。正直Chrome版とほぼ同じです。
Posted at by




Go言語のWindows版はまだnetやhttpのパッケージが機能しないため、Windows自身で実行出来ないですが、LinuxからWindowsに通知する事は出来るかと思います。(えっそんな人いない?

mattn's go-gntp at master - GitHub

GNTP for golang. http://www.growlforwindows.com/gfw/help/gntp.aspx

http://github.com/mattn/go-gntp
使い方は極力簡単にしました。 client := gntp.NewClient();
client.Register();
client.Notify("ぐろーる!", "こんにちわ!");
こんな感じ。いまはWindowsでは使えないのでSetServer()メソッドでGrowl For Windowsが動いているPCを指定する事になりますね。

ところで...golang-nutsというMLでこんな会話見つけた。
> i saw a tweet that there has been a success of running godoc under
> windows. Does it mean you can use packages net and http in windows? If
> yes, how can I go about it.

It's not ready yet, but I think all the necessary pieces
will be in the next release.
そのツィートがこれ。
Twitter / Andrew: A #golang developer just s ...

go_nuts go_nuts: A #golang developer just sent me a screenshot of godoc running under Windows. Getting excitingly close to having stable Windows support!

http://twitter.com/go_nuts/status/15832858455
次のリリースあたりでWindowsからもnetやhttpパッケージが使えるって事でいいんかな?
ちなみに最近は、Windows版を定期的にリリースしてくれてる人がいるので、試してみたい方はいかがでしょうか。
Posted at by