標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

テキストデータ加工関数集 go-texts をようやくまとめた

qrunch.ioより転載)

これな > zetamatta/go-texts: go-texts is the utility package for text-data

  • "go-texts".SortedKeys
    • string をキーとするマップのキーの配列をソートして得る(Perl の sort keys と同じ。キーに対する値の方は何でも大丈夫。reflect パッケージを使っている)
  • "go-texts/mbcs".UtoA【Windowsのみ】
    • UTF8 テキストをマルチバイト文字列へ変換
  • "go-texts/mbcs".AtoU【Windowsのみ】
    • マルチバイト文字列をUTF8へ変換
  • "go-texts/mbcs".NewAutoDetectReader【Windowsのみ】
    • 与えられた io.Reader の中身を元の文字コード(ANSI,UTF8 or UTF16)を自動判別した上で、UTF8 へ変換しながら読みだす io.Reader を得る
  • "go-texts/mbcs".ConsoleCP【Windowsのみ】
    • 現在のコンソールのコードページを得る。OS やスレッドのコードページではないのに注意。子プロセスで動作する CMD.EXE が扱うバッチファイル向けには、こちらから得られるコードページを使わないといけない
  • "go-texts/dos".System
    • C言語のsystem関数のようなもの。二重引用符関係のトラブルを回避する小細工が入っている(環境変数使ってるだけ)
  • "go-texts/dos".WithoutExt
    • ファイルのパスから拡張子を除く。本来、path/filepath に欲しかった

nyagos 4.3.3_3 を公開しました。

Release 4.3.3_3 zetamatta/nyagos

  • (#310) copy と move の宛先でショートカットをサポート
  • (#313 reopened) git blame FILES | type | gvim - & で gvim が空バッファで始まってしまう問題を修正
  • 壊れたジャンクションに対する rmdir ができなかった問題を修正
  • Luaスクリプトや外部プロセスの一部で Ctrl-C が機能しなかった問題を修正
  • (#267) type や more で UTF16 ファイルを表示できるようにした
  • (#336) io.write が -e や --lua-file オプション中で機能しない不具合を修正
  • (#337) バッチが exit -1 で終了するとクラッシュする不具合を修正(Thx! @hogewest)

Windows用のHyperEstraierのGo言語のラッパーを作りました、途中まで!

qrunch.ioより転記)

これな

実は会社で HyperEstraier を使ったWindows 製品の保守をちょっとだけしているのですが、標準のコマンドラインツール estcmd は UTF8 でして、ANK 文字ならいいんですが、日本語が入るとコマンドラインは CP932 (ShiftJIS+α)なので、つらいことに!

ということで、Go言語でラッパーを作りました。といっても、検索側の機能だけで、インデックスを作成する方はまだ未実装です(そのうち、必要になったら作りますが、とりあえず目下の問題が解消されたので、すぐやる必要がなくなってしまった!)

この手のツールは、"cgo" を使ってC言語ライブラリをスタティックリンクするのが普通なんですが、自分はついつい慣れた「syscall.NewLazyDLL で Windows のバイナリライブラリを呼び出す」という方法の方を使ってしまいます。プロプライエタリなソフトウェアならともかく、オープンソースソフトウェアのライブラリで、それやる必要あんの?という感じですが、ジジイはついつい慣れた方法を使ってしまうものなのです。

ほとんど自分しか使わないツールですが、もし他に使う人がいらっしゃるようであれば、まじめに改善に取り組みますので、コメントください

nyagos の type, more で UTF16 をサポート

(qrunch.io より転記)

これな

当初は「とりあえず書いてみた」という感じの issue で、そのうちニーズがない割に面倒なので、やめようかな…と思っていました。

が、最近、会社で過去に書いたプロダクトに問題があって、その修正をしていのたですが、ワークファイルが UTF16 で保存されていて、vim ではかろうじて開けるものの、more も grep も使えないので、たいへんなことに。

ということでですね、実は別途 ANSI/UTF8 の自動判別読み込みフィルター "github.com/zetamatta/go-texts/mbcs".NewAutoDetectReader別パッケージで作ってまして、それを改善する形で取り込んで、UTF16 もサポートするようにしました。 (※バイナリ版はまだリリースしていません)

これの文字コード判別ルールは極めて簡単で

  • \xFF\xFE で始まっていたら、UTF16LE 確定
  • \xFE\xFF で始まっていたら、UTF16BE 確定
  • 0スタートの偶数バイト目に \0 が存在していたら、UTF16BE 確定
  • 奇数バイト名に \0 が存在していたら、UTF16LE 確定
  • 任意の場所に \xEF\xBB\xBF があれば UTF8 確定
  • 1行単位で読み込んで、Go 言語の "utf8".Valid() が false ならば、非UTF8 のマルチバイト文字列と確定
  • 以上でなければ、暫定的に UTF8 とする

実のところ、こんな判別ルールよりももっとたいへんなのが、 "golang.org/x/text/transform" のルールに準拠したテキストフィルターの書き方だったのですが、それはまた別の機会にでも

二重引用符などで面倒なことにならない cmd.exe の呼び方

環境変数を使おう。

func system(cmdline string) error {
    const CMDVAR = "CMDVAR"

    orgcmdarg := os.Getenv(CMDVAR)
    defer os.Setenv(CMDVAR, orgcmdarg)

    os.Setenv(CMDVAR, cmdline)

    cmd1 := exec.Command("cmd.exe", "/c", "%"+CMDVAR+"%")
    cmd1.Stdout = os.Stdout
    cmd1.Stderr = os.Stderr
    cmd1.Stdin = os.Stdin
    return cmd1.Run()
}

手短なクロージャーの説明を考えてみた。

  • 関数の中で関数を定義できる
  • 子関数は親関数のローカル変数を参照できる
  • 子関数は親関数の外部にも放り出せて、そこでも親関数のローカル変数を参照できる
    • ただし、子関数が定義された時点で見えていた変数のみ