Go

2ペインテキストビューア、いろいろ作ってます。

go

20年くらい前にOS/2で eff , ell という「テキストビューア」群を作ってましたが、それと同じような感じのものできないかなーと思って、Go言語で簡単なフレームワーク go-twopane を作ってみました。 コンソール画面を2分割して、上に件名一覧、下に詳細を…

strings.EqualFold はどの程度の速度か

Go

Big Sky :: Go で大文字小文字無視の文字列比較ベンチマーク strings.EqualFold について言及がなかったので、測ってみました。 追加行: func isDevNull4(name string) bool { return strings.EqualFold(name,"nul") } func BenchmarkS4(b *testing.B) { te…

Go言語のセットアップの覚書 for Windows & nyagos

今更だけど、PCがクラッシュしたら忘れるかもしれないので アーカイブの展開 MSI はインストーラーが意外と遅いので、アーカイブは *.zip ファイルを使う。 % cd / % ren go go.bak % unzip ~/go1.12.7.windows-amd64.zip vim の設定 *.go を開いた時、デフ…

【解決編】UNCパスの補完機能の強化のためにコンピューター名一覧を出したいんだが、違うそうじゃない

UNCパスの補完機能の強化のためにコンピューター名一覧を出したいんだが、違うそうじゃない - 標準愚痴出力 記事を書いたら、自己解決する法則でもあるのかなぁ。 // +build run package main import ( "fmt" "unsafe" "golang.org/x/sys/windows" ) const R…

UNCパスの補完機能の強化のためにコンピューター名一覧を出したいんだが、違うそうじゃない

いまひとつうまくゆかん。 // +build gorun package main import ( "fmt" "unsafe" "golang.org/x/sys/windows" ) const RESOURCE_CONNECTED = 1 const RESOURCE_CONTEXT = 5 const RESOURCE_GLOBALNET = 2 const RESOURCE_REMEMBERED = 3 const RESOURCETYP…

Windows でジャンクション作れない・リベンジ編

go

前回 → Windows でジャンクション作れない - 標準愚痴出力 「DeviceIoControl用の構造体」を作るのに、Microsoft ご本家の Go 言語パッケージ Microsoft/go-winio: Win32 IO-related utilities for Goを使ったら、うまく動作するようになった!やったね、た…

Windows でジャンクション作れない

go

junction_go.run: package main import ( "os" "unsafe" "errors" "golang.org/x/sys/windows" "golang.org/x/xerrors" ) const ( _MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16384 _FSCTL_SET_REPARSE_POINT = 589988 _INVALID_HANDLE_VALUE = ^windows.Handle(0…

appveyer の Go が 1.12 になってくれない

go

もうパッケージの多くが、Go 1.12 名指しになってるのに! go.mod を騙し騙しで調整し、Go 1.12 で追加された関数の使用を我慢しつづけてきたが、さすがにもう待てん! というわけで、Go 1.12 をビルド時にダウンロードさせるようにした(→ appveyer.yml: do…

Go Modules 使用時に「他人のレポジトリに来てるマージされてないプルリク」の影響を予め検証する

go

自分のプロダクトが依存しているパッケージ T についてプルリクエストが来ているようですが、まだマージされていません。 その修正の影響がどの程度こちらに影響にあるかあらかじめ検証したいと思いますが、go.mod にその修正をどう書くのが正解か、よくわか…

昔の Go は exit status が fmt.Errorf("exit status %d",ERRORLEVEL) で返ってきたような

go

Go 1.12 で、実行したプロセスの ERRORLEVEL を得るためのメソッド:"os".ProcessState.ExitCode() が追加されたので、対応の準備をすすめていて気づいたのだけれども… 昔の Go言語だと、0 以外の ERRORLEVEL を受け取ると、"os/exec".Cmd.Run() で fmt.Erro…

Shift-JISファイルの作成

go

現在のコードページの文字形式ではなくて、本当に ShiftJIS 固定となるので、日本語特化のアプリとなるが package main import ( "fmt" "os" "path/filepath" "golang.org/x/text/encoding/japanese" ) const fname = "search.lst" func main1() error { fd,…

続・GoでCygterm っぽいことをやりたいので、ソケットサーバーを書いている

go

Go で Cygterm っぽいことをやりたいので、ソケットサーバーを書いている(勉強中) - 標準愚痴出力 アドバイスをいただきました(ありがとうございます) enter しないと文字が送られないのは、たぶん tera term のオプションで local echo を off にすると…

a[:0] と append の秘密

go

a = a[:0] は領域のサイズをリセットするが、a = make([]T,0,cap(a)) と違って、使っていたメモリブロックを再利用するため、allocation 回数を削減できる。 だが、旧a の領域が他で使われていないかを気にせず、無頓着に使うと append でおかしいことになる…

Go で Cygterm っぽいことをやりたいので、ソケットサーバーを書いている(勉強中)

go

(続きの記事 あり) serv.go : package main import ( "fmt" "net" "os" "strings" ) func handler(conn net.Conn) { defer conn.Close() var buffer [255]byte for { n, err := conn.Read(buffer[:]) if err != nil { fmt.Fprintln(os.Stderr, err) return …

Go Modules 使用時、最新タグよりも新しい Commit でモジュールを使用したい時

go

go mod -m github.com/<USER>/<REPOSITORY>@<COMMIT-HASH> でいいようです。</commit-hash></repository></user>

("bufio".Reader) ReadString('\n') と ("bufio".Scanner) Scan() の違い

go

違い ("bufio".Reader) ReadString('\n') 改行をカットしない ("bufio".Scanner) Scan() 改行をカットする 改行コードのない最終行の扱い 最後の行が abcd(EOF) というテキストの場合 ("bufio".Reader) ReadString('\n') "abcd",io.EOF という戻り値となる (…

Gopher人類とGenerics【Golang帝国興亡史】

go

我々Gopher人類は「Genericsは不要」と強調しすぎたのかもしれないな。「GenericsないからGoはダメ」に対する反論だけど、実際は「7~8割のケースではGenericsは要らないけど、2~3割やはりGenerics欲しい」というところだ。そこをつかれて「おまいら矛盾し…

slack へポストするコードを書いた

go

秘密鍵書けないので、呼び出し元の main 関数は省略するが、下記のようなコードで出来た。 package main import ( "bufio" "bytes" "encoding/json" "fmt" "net/http" "os" ) type Message struct { Text string `json:"text"` Channel string `json:"channe…

syscall は deprecated だったのかー

go

syscall - The Go Programming Language Deprecated: this package is locked down. Callers should use the corresponding package in the golang.org/x/sys repository instead. (雑な訳)非推奨:このパッケージ(syscall)は凍結(?)しとります。ユーザ…

io.Reader のプリプロセッサな io.Reader を作る

go

( io.Reader のプリプロセッサな io.Reader を作る - Qiita より転載) 任意の io.Reader を受け取って、それを加工した結果を、別の io.Reader として読み取れるようにしたい時、どうするのがベストな方法だろうか。 具体的には、当初「文字コード(ShiftJI…

os.exec の (Command) Start で、ドライブ毎のカレントディレクトリが継承されない

go

カレントディレクトリは Windows/UNIX ともに1プロセスにつき一つだけ存在するということになっている。だが、DOSの頃はドライブごとにカレントディレクトリが設けられていたことを覚えている人も多いだろう。そして、現在も CMD.EXE ではあたかもドライブ…

CMD.EXEの引数での引用符の扱いを完全に理解した

go

multipost →Qrunch CMD /? で出てくるヘルプを一部引用する: /C または /K が指定されている場合、スイッチの後の残りのコマンド ラインがコマンド ラインとして処理されます。次のルールが引用符 (") の処理に使われます: 次のすべての条件に一致する場合…

nyagos でのバッチ起動方法を軽量化した

nyagos では、子プロセスのバッチファイルが変更した環境変数を取り込むのに @call バッチファイル 引数1 引数2 … @set ERRORLEVEL_=%ERRORLEVEL% @(cd & set) > 一時ファイル名 @exit /b %ERRORLEVEL_% といった踏み台バッチを毎回作っていた。 これはこ…

What file is it ? - ファイル識別コマンド wfile を作った

go

これな> zetamatta/wfile: wfile is a command like file of UNIX. ファイルのマジックナンバーを元にして、ファイルの種類を自動判別するツールである。 EXEファイルならば、 32bit or 64bit GUI or CUI Windows or 他のOS など $ wfile wfile.exe wfile.e…

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

go

(qrunch.ioより転載) これな > zetamatta/go-texts: go-texts is the utility package for text-data "go-texts".SortedKeys string をキーとするマップのキーの配列をソートして得る(Perl の sort keys と同じ。キーに対する値の方は何でも大丈夫。refl…

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

(qrunch.ioより転記) これな zetamatta/go-hyperestraier-win32: golang wrapper for estraier.dll (win32) 実は会社で HyperEstraier を使ったWindows 製品の保守をちょっとだけしているのですが、標準のコマンドラインツール estcmd は UTF8 でして、ANK…

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

go

環境変数を使おう。 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 =…

Goの"/path/filepath" に「拡張子を除く関数」がないのが辛い

go

まぁ、自分で書いても数行なんですけどね without.go func withoutExt(fname string) string { ext := filepath.Ext(fname) return fname[:len(fname)-len(ext)] }

つらい、さすがの reflect も構造体の非公開フィールドに値を無理やりセットする用途には使えないかー

go

package main import ( "reflect" ) type privateOne struct { m1 string m2 string } func sub(from interface{}) interface{} { t := reflect.ValueOf(from).Elem().Type() obj := reflect.New(t) p := obj.Elem() p.Field(0).SetString("foo") p.Field(1)…

CSV を「安全」に Excel に読み込む Go プログラムを書いたー(pipe2excel.exe)

5/2 が「5/2」でなく、日付と解釈されて「5月2日」になってしまう =1+2 が「=1+2」ではなく、計算されて「3」になってしまう 関数まで実行されてしまうので、脆弱性となってしまう これを解決するには勝手に変な解釈がされないように、あくまで「文字列」と…