2016.05.01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

MHI 5.0

この「にっき」には暴力シーンやグロテスクな表現が含まれています。

(2015.09.23) 1500

$ 移転

独自文法で書くのもしんどくなってきたので、続きは markdowned_wifky で書いた方にて

(2015.07.15) 1118

$ 引用符で囲まれた領域を、置換の対象外にする技 #Lua

置換の対象にならないような文字列「\a(通し番号)」に一旦置き換えるという方法。 wifky.plでやった技だけど、Lua のパターン置換でもいけた ( nyagos の brace.lua で使ってみた )。

local save={}

cmdline = cmdline:gsub("((['\"])[^%2]*%2)", function(s,_)
    local i=#save+1
    save[i] = s
    return '\a('..i..')'
end)

--- このへんで目的の置換を行う ---


cmdline = cmdline:gsub("\a%((%d+)%)",function(s)
    return save[s+0]
end)

(2015.06.17) 2325

$ #golang でデストラクタ的なことをするのが難しいなら、Ruby の真似をすればいいんじゃね

ここで紹介されている、runtime.SetFinalizer は、 GC が動かない場合などに動作が期待できないそうだ。

Go では defer を使って finally 的なことは出来るが、 それをライブラリから強制的に行う仕組みが残念ながらない。

  • C++ ならデストラクタで、
  • Python なら with 文で、
  • .NET Framework なら using & Dispose メソッドで

行うような自動解放的な仕組みは作れないだろうか。

Ruby なんかだとブロック(昔はイタレータ言うたな)を使って、 資源確保、解放をやるのが定石となっている。 Go では Ruby ほど綺麗な書き方ではないのだが、 クロージャーを使えば同等なことができる。

nyagos の dos モジュールではディレクトリ内を走査する関数を 自前で用意しているのだが、Close 忘れが怖いので、 下記のように使える ForFiles 関数を用意した。

err := ForFiles(pattern, func(findf *FileInfo) bool {
        if name := findf.Name(); name[0] != '.' || pname[0] == '.' {
                match = append(match, filepath.Join(dirname, name))
        }
        return true
})

丸括弧の中に中括弧を書くのは、やや不細工だが、気にしたら負けだ。

(2015.06.17) 2247

$ Google Chrome のテキストエリアを任意のエディターで編集する Powered by #golangjp

どういう経緯か忘れたのですが:

という記事を見つけました。概略的には

  • Google Chrome は Firefox とは違い、外部プロセスを起動することは禁止されている
  • そこで Chrome Extension の Edit with Emacs は、Emacs のサービスを 127.0.0.1:9292 に立ち上げて、XMLHttpRequest を使って、テキストエリアの内容を Emacs と交換している。
  • 上記の記事では、Emacs のサーバーのかわりに Perl でサービスを立ち上げて、任意のエディターを Chrome で使えるようにしている

という感じです。記事の方法だと Perl 一式が必要だし、Linux でしか動作が検証されていないようでした(別に Windows で動かないとは言っていないが)。 が、記事のおかげで原理はだいたい分かったので、勉強がてら Go 1.4 for Windows で「だいたい同じもの」を作ってみました。

最初、よー分からんで何故か TCP のレベルからやろうとして挫折したのですが、 net/http で書き直したところ、比較的簡単に出来ました。 「editsrv.exe gvim.exe」を走らせておくと、 テキストエリアの右下に出る 'edit' のマークをクリックした時に gvim.exe が起動するようになります。 (なお、UTF8 対応エディターである必要があります)

ただ、twitter の本家サイトについては、テキストエリアの内容が 何故か HTML で飛んでくるので、このサイトだけは特別扱いして、 HTML ⇔ プレーンテキストの変換を相互にやってます。やりすぎかな。

普通、この手のものは「思いついたのはいいが、なかなかうまいこと作れない」ものなんですが、自分にしては、あっさりできて驚きでした。

ま、多分、似たようなものの Go 版は先人がとっくの昔に作ってそうではありますが…まぁ、手段が目的みたいなもんですから、そこんところは目をつぶってくださいませ。

- 追記(2015.07.05)

起動するエディターが gvim の場合は vimtweak.dll (32bit版64bit版 )を gvim.exe と同じフォルダーに入れて、

   au! BufNewFile,BufRead editsrv* call libcallnr("vimtweak.dll", "EnableTopMost", 1)

という一文を %USERPROFILE%\.gvimrc に入れれば、gvim.exe が Chrome の裏で起動することはなくなる。

しかし、アクティブになっているわけではないので、そのままキーボードをうつと、Chrome の方にキー入力がいってしまう。

道のりは長い

(2015.06.17) 2213

$ NYAGOS 4.0.9 とその狂気

パイプラインを実行するとクラッシュする不具合に苦しめられてました。 それはもう発狂するくらいに。

事の発端は svn のサブコマンドを勝手に拡張するコード:

nyagos.alias.svn = function(args)
    if args[1] == "amdc" then
        return "svn.exe status | findstr ^[AMDC]"
    end
    args[0] = "svn.exe"
    if args[1] == "exclude" then
        args[1] = "update"
        table.insert(args,2,"--set-depth=exclude")
    elseif args[1] == "emptyup" then
        args[1] = "update"
        table.insert(args,2,"--depth=empty")
    elseif args[1] == "emptyadd" then
        args[1] = "add"
        table.insert(args,2,"--depth=empty")
    end
    return args
end

を使うと、よくクラッシュすることでした。

でも、よくよく調べてみると、別にこの svn エイリアスを 使わない場合でも普通に発生するんですよね。

自分ではもう何が何やら分からんで情緒不安定になっていたんですが、 そんな折 @nocd5 さんが 調べてくださったところ、 (拡張子に応じてインタプリタ名を挿入するために設けたフックである) nyagos.argsfilter という Luaフィルターを呼ぶ箇所で クラッシュしていたことが判明しました。 (それまで、ずっと違うところだと勘違いしていた)

どうやら、コマンドラインでパイプラインを使った時に、 それぞれのパイプラインごとのゴルーチンで「同時に」 nyagos.argsfilter を呼び出していたようでした。 これをゴルーチンを走らせる前の段階で、個別に逐次呼び出すようにしたところ、 普通にパイプラインを使う分にはクラッシュしないようになりました。

もう、それでどれだけ安堵したことやら…

ただ、パイプライン上の「コマンド」として、 Luaエイリアスを複数書くと「理論上」また発生するはずなんですよね。 対策としては、コマンドごとに Lua のインスタンスを分けるか、 そもそも Lua エイリアスの複数起動を仕様としてできないようにするか、 いずれかなんですがー… でも

  • Lua のインスタンスを分けるのなら、Lua のデータも複写しなければいけないので、そのコストが大きい (こういう時 fork がある UNIX はいいなぁ)
  • 仕様を制限するのはあまりスマートな解決法でもないような気もする

という感じで、致命的でないのをいいことに、対応を先送りしてます。

しかし、プログラミングは楽しいけど、理解を越える不具合が出ると、 本当にあたまがおかしくなります、割とまじで。

.net(3) C++(3) Cygwin(12) GAME(3) Groovy(1) Linux(2) Lua(39) Mercurial(13) NYAOS(92) OS/2(7) Oracle(3) Perl(4) Python(22) SKK(4) Windows8(1) album(68) ckw(10) coLinux(1) vim(6) wifky(27) 書評(21) (9)

zetamattaのたいじゅー