【恒例のポエム】NYAGOS 2018年総括

もうさすがにネタ切れかなと毎年思いつつも、頼んでもないのに忘れた頃に大改造してしまうニッチな和製コマンドラインシェル、それが NYAGOS (Nihongo Yet Another GOing Shell) NYAGOS とは(復習) Windows向けの UNIX風コマンドラインシェルです。 C++ で…

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

go

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

.NET の Dispose メソッドの引数について(復習)

基本は implements IDisposablse を定義した時に挿入される Visual Studio のテンプレートのコメント通りにすればよい。 基本、下記のとおり 常に絶対実行しないといけないもの アンマネージドなリソースの解放 これがある時は、コメントアウトされている Fi…

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

go

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

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

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

nyagos で、行番号シェルつくった

多分理解されないと思うけど、あの「入力が数字から始まっていたら、即実行中ではなく記憶しておき、runとタイプされると数字順に実行する」という「古代 8bit BASIC」のシステム、 意外とコマンドラインシェルで便利かもね。nyagos の Lua で書いてみたけど…

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…

nyagos 4.3.3_3 を公開しました。

Release 4.3.3_3 zetamatta/nyagos (#310) copy と move の宛先でショートカットをサポート (#313 reopened) git blame FILES | type | gvim - & で gvim が空バッファで始まってしまう問題を修正 壊れたジャンクションに対する rmdir ができなかった問題を…

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

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

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

(qrunch.io より転記) これな type and more supports UTF16 (if it contains '\000' ...) Issue #267 zetamatta/nyagos 当初は「とりあえず書いてみた」という感じの issue で、そのうちニーズがない割に面倒なので、やめようかな…と思っていました。 が、…

二重引用符などで面倒なことにならない 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)] }

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

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

「git new」コマンドをでっち上げる(Windowsでgitのサブコマンドを作る)

git

自分の場合、新規レポジトリを作る際、いつも定番的に実行しなければいけない作業がある git init 最初に空コミット作成 改行コード変換の無効設定 日本語ファイル名はそのまま表示させる メールアドレス等の設定 次の記事によると、「git-XXXX」という実行…

github の Releases のダウンロード数を curl と jq でお手軽に調べたいッ

次のような API があるようだ。 Releases | GitHub Developer Guide → List releases for a repositor 「GET /repos/:owner/:repo/releases」の意味が分かりにくいが、「:owner」と「:repo」を、レポジトリのオーナー名とレポジトリ名に置き換えればよいよう…

自前の io.* ライブラリを構築中

nyagos内蔵Luaで「lua_e "for line in io.lines() do print(line) end" < FILE」が FILE から読み込めない - 標準愚痴出力 ファイルまわりはシェル本体との密接な連携が必要なので、結局、io.* 以下の関数を全部自前バージョンで置き換えることにした。 最初…

例外がエラー戻り値よりも使いにくいシーンの例(説明用)

Go言語は例外がないのでアウトという人が多いわけですが、自分は「例外が取り扱いにくいシーン」というものを経験しているので、その点は実は肯定的なんですよね。 たとえば、コンストラクタで「様々な例外」が発生する時、下手に try の範囲を広げると「予…

nyagos内蔵Luaで「lua_e "for line in io.lines() do print(line) end" < FILE」が FILE から読み込めない

lua function can not read from STDIN redirected. · Issue #323 · zetamatta/nyagos うん、標準入力をうまいこと GopherLua 内の標準入力にアサインできていないせい で、GopherLua の開発元に相談してみた。 How to do io.input( <*os.File instance crea…

つらい、さすがの 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」になってしまう 関数まで実行されてしまうので、脆弱性となってしまう これを解決するには勝手に変な解釈がされないように、あくまで「文字列」と…

任意の map[string]~ のキーを全部配列( []string )化してソート

go

map のキーは文字列限定だが、値については任意の型 Ok import ( "reflect" "sort" ) // SortedKeys makes sorted strings' array from keys of the given map whose key's type is string. func SortedKeys(mapInt interface{}) []string { values := refle…

両親の話

亡くなった父は不器用そうに言ったものだ。 「お父ちゃんは何も強制せん。お前の好きなようにしたらええからな」 今、目の前にいる、認知症が進んでしまった母も、昔は 「こうでなかったらいかんというものはない」 などと言ってくれたものだ。 それだけの自…

GENESTUB という汎用スタブモジュールを公開しました。

昔作った子プロセスが想定どおり呼ばれているかテストするためのスタブモジュールを MIT ライセンスで公開します。 Windows用ですが、.NET Framework 4.0 以降が必要です。 zetamatta/genestub: Stub module to test the child-process is called as expecte…

内蔵Luaで実行する際、@ で始まる行を無視するよう修正した

nyagos 4.3 で、バッチファイルに Lua を組み込んで実行する際、内蔵Lua が 5.3 から 5.1 になったため、ラベルの文法がなくなって @setlocal & set "ARGS=%*" & nyagos.exe --norc -e "_,_,b=io.input([[%~f0]]):read('*l','*l','*a');assert(loadstring('\…

nyagos 内蔵 Lua 組み込みバッチファイルの雛型

nyagos内蔵Lua が 5.1 になったので前の 5.3 向けの方法が使えなくなった donyagos.cmd @setlocal & set "ARGS=%*" & nyagos.exe --norc -e "_,_,b=io.input([[%~f0]]):read('*l','*l','*a');assert(loadstring('\n'..b,[[%~f0]]))()" @endlocal & exit /b %…

自分のマシンの IP アドレスを列挙するコマンドを作った

localhosts 自分の IP アドレスを表示するだけのコマンド。Go の net ライブラリを使った。 IPv4 アドレス UP している loopback でない キーワードが指定されている時は、そのキーワードがインターフェイス名に含まれたものとする マシンのブート時に以下の…

nyagos豆知識!(じゃじゃーん)- 「cd -h」

「cd -h」とすると、それまでたどったディレクトリが一覧で出るよ。もし「-2 C:\Users\hymko」とか表示されたら「cd -2」でそこへ移動できるよ! <DESKTOP-LGGUCRA:~/go/src/github.com> $ cd -h -3 C:\Users\hymko -2 C:\Users\hymko\go\src\github.com\zetamatta\nyagos -1 C:\Users\hymko\go\sr</desktop-lggucra:~/go/src/github.com>…

静的型付け言語に慣れた開発者が AutoLISP でやったアレコレ

(2018.06.02) 「静的型付け言語に慣れた開発者が貧弱なCAD用 Lispでやったアレコレ」からタイトル変更しました 静的型付け言語になれた身としては、欲しい機能がいろいろなくて、つらたにえん。せめて、CommonLisp だったら、もうちょっと楽なんだろうなぁ(…

バッチファイルで strtok 的な変数の分割切り出し処理

%PATH% の各ディレクトリを一つずつ処理する(ここでは表示するだけ) @echo off setlocal set "PATHS=%PATH%" :loop for /F "tokens=1,* delims=;" %%I in ("%PATHS%") do ( echo %%I set "PATHS=%%J" ) if not "%PATHS%" == "" goto loop endlocal $ strto…