2015/03/26


Goでchannelがcloseしてるかどうか知りたい というアンチパターン - beatsync.net

そもそもGoのchannelがcloseしてるかどうかを知りたいっていう理由は、だいたい「Goのchannelはナイーブだから」というところに起因するのはないかと思います。

https://beatsync.net/main/log20150325.html

golang には元々 closed() という、channel が閉じられているかどうかを返す組み込み関数がありました。しかし廃止されました。

closed は API としては目的を達成出来ているのですが、builtin が1つ増える、channel から取り出す前に一度確認する必要があるという理由で削除されたと私は記憶しています。

Goでchannelがcloseしてるかどうか知りたい というアンチパターン - beatsync.net

selectをつかってブロックする可能性のある文をcaseにかけば一番最初にブロックが外れたやつに分岐します。で、これは@fujiwaraさんに教えてもらった技ですが、なんもしないdefaultを書けばブロックせずにすぐdefaultにおちるとのこと。

https://beatsync.net/main/log20150325.html

実際には closed() が無くなった訳ではなく、型アサーションと同じインタフェースに置き換えられました。

Issue 4243072: code review 4243072: go code: replace closed(c) with x, ok := <-c - Code Review

LGTM http://codereview.appspot.com/4243072/diff/5001/src/pkg/os/inotify/inotify_li... File src/pkg/o...

https://codereview.appspot.com/4243072/
x, ok := <-c

戻り値の2つ目に channel から取り出せたかどうかが bool で返ります。

例: Go Playground

select はどちらかと言うと、複数の channel を同時に待てる仕組みであり、閉じている channel の case には飛ばないという理由で動いています。ですのでどうしても select は嫌だという方は以下の様に書くと良いです。(注意: ブロックはするので select とは動作が違う事に注意)

if x, ok := <-c; ok {
    // x を使った処理
}

2015/03/20


Google Code が終了する様です。
Google Open Source Blog: Bidding farewell to Google Code
http://google-opensource.blogspot.com/2015/03/farewell-to-google-code.html

GitHub が無かった頃、私はコード置き場として Google Code を使っていました。とても安定していたし落ちるのを見た事がありませんでした。

残念ながらその Google Code がサービスを終えようとしています。

しかし我々 Gopher のコードには、この Google Code にホスティングされている golang のパッケージが幾らかあります。

Google Code が終了するまでに、私達は移行を完了させなければなりません。

mattn/check-code-google-com - GitHub
https://github.com/mattn/check-code-google-com

パッケージが code.google.com のパッケージに依存しているかどうかを調べてくれます。

例えば mahonia に依存している jvgrep であれば

この様に表示され、code.google.com に依存していない twty であれば

この様に表示されます。中には依存しているパッケージのその依存しているパッケージが code.google.com に依存している事がありますが、それも検索します。-v オプションを付ける事で、どのパッケージが code.google.com に依存しているのかが分かる様になっています。

よろしければどうぞ。


2015/03/10


Vim には netrw というファイラが付属しています。引数にディレクトリを渡すとディレクトリブラウザが開き、HTML のある URL を指定するとダウンロードされた HTML が開き、scp:// の様なプロトコルを指定するとそれにあったファイルの開き方をしてくれます。

最近のモダンな Vim 使いの多くは、NERDTreevimfiler を使っているのですが、正直僕は vim からファイルを操作はしない。思考停止せずに目的のファイルを見つけ出したいし、ファイル操作はファイル操作としてシェルからやりたい。なので深い階層のファイルを見つける為の目的として CtrlP を使ってるし、カレントディレクトリのファイル一覧を出すのに NERDTree を使っていた。

でも NERDTree 遅いなー。ツライなー。そんな風に思っていた時にこれを見つけた。

justinmk/vim-dirvish - GitHub

dired on a diet

https://github.com/justinmk/vim-dirvish

filebeagle をベースとしてとことん小さくしたプラグイン。README には「Note: there are still some bugs. This plugin isn't ready to use yet.」と書かれているけど僕は乗り換えてしまった。

僕は手癖で

$ vim .

とする癖があるのだけど、その時に出るファイル一覧が netrw も NERDTree もとにかく遅い。思考が停止しそうでイラッとする。でも dirvish だと一瞬で開く。本当にファイル操作したいなら :sh で shell やコマンドプロンプトに戻ればいいだけなので僕にはこれが目的にあったプラグインなのです。こういうminimumでenoughなのが僕は好きです。