Go

なんか、前に Go の GUI を検討したファイルが出てきたのでリサイクル

go

fyne-io/fyne: Cross platform GUI in Go based on Material Design サンプルを自分の WIndows10 でビルド・実行した時の表示: ちょっとフォントがアレかな?(設定かオプションで直るかな?) 実行ファイルのサイズ $ ls -ltr -rw-a-- 369 Jan 1 2019 fyne…

Goの reflect で Perlでいうところの「sorted keys %HASH」的なことをする

Go

とある slack で reflect のよい使用例についての話題が出てました。 reflect を使用したいというケースは、encoding とか O/R mapper 以外となると、ほとんどの場合「interface で済むんじゃね?さもなければプログラマがよく Go 言語を理解していないんじ…

その名も fcopy 、不屈のコピーだ

go

最近の Windows はファイルのコピーがたいへんだ。 以下のバッチファイルはビルドしたファイルを C:\Program Files\xxxxx にコピーするだけの代物。だが… C:\Program Files\xxxxx に書き込むには管理者権限が必要 PowerShell で管理者モードに昇格 管理者モ…

Windows のバージョンナンバーを得る Go パッケージを作成しました。

go

zetamatta/go-windows-osversion 仕様は簡単で、readme にあるように osversion.Query() を呼べば、OS のバージョン情報を格納した構造体へのポインタが帰ってきます。 ( Windows 以外の OS だと、バージョンナンバーはどれもゼロになります) どういうこと…

最近、nyagosのために作った関数を切り売っています

go-windows10-ansi Enable Windows10's native ansi-escape-sequences Windows10 ネイティブのエスケープシーケンスを有効にする go-windows-shortcut Make or read shortcut-files on Windows Windows のショートカット(*.lnk)を作る go-windows-consolei…

コマンドプロンプトでフォントサイズから全角・半角を区別する試み

go

現在のコマンドプロンプトでの文字列のピクセルサイズを測る API(gdi.dll のGetTextExtentPoint32W)を呼ぶパッケージを作成した。 zetamatta/go-windows-consolefontpixel これを使って、引数のテキストの長さを測るプログラムを書いた。 package main imp…

*_test.go を使わないテストコードとかサンプルコード

go

以下はどこかの記事を読んで知った方法なのだが、どこだったかわからなくなってしまったので、改めてここに記す(つまり、自分が考えついた方法ではない) *_test.go を使わないテストコードとかサンプルコードを書きたい時どうするか。 普通は別フォルダー…

IsNil を書いてみた

go

型が違っても nil 判定ができる関数を作ってみた。 package main import ( "fmt" "reflect" ) func IsNil(p interface{}) bool { if p == nil { return true } value := reflect.ValueOf(p) switch value.Kind() { case reflect.Ptr, reflect.Map, reflect.S…

1byte ではなく、1 runeずつ文字列を伸ばしてゆく一番速い方法は?

go

(追記)最終的には strings.Builder の優勝です。最後まで読みましょう 「1 byte ずつ」というのは今まで何回も計測されてきて、 append > strings.Builder > 文字列の加算 というのが定説になっている。が、「1 rune ずつ」の場合はどうだろうか? とい…

コマンドプロンプトの文字幅をキャリブレーションして、崩れない TUI 画面を作ろう

go

本文書は コマンドプロンプトの文字幅をキャリブレーションして、崩れない TUI 画面を作ろう - Qiitaよりの転載です。 最近、コマンドプロンプトで動作する CSVビューア とか、ツイッタクライアント を書いてます。 この手のツールを書く時、本格的なフレー…

Go言語の実行ファイルのパッケージを作成するバッチファイル

go

GOOS=windows or linux、GOARCH=amd64 or 386 という組み合わせで、(フォルダー名)-(年月日)-(GOOS)-(GOARCH).zip という zip ファイルを作ります。 go-package.cmd @echo off setlocal set "PROMPT=$ " for %%I in (%CD%) do set "NAME=%%~nI" for %%I in (…

CSV のビューアを作った

go

仕事でプログラム間の連携を TSV ファイルで行うことが多く、しかも Excel とか仮想マシン上に入ってなかったりすることが多い(し、あっても重くて使いたくない)ので、意を決して CSV ビューアを作りました。 先日のツイッタークライアントは、一応自分で…

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…