標準愚痴出力

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

nyagos のリリース手順 - make.cmd の秘密(備忘録)

nyagos にはビルドスクリプト: make.cmd というものがあります。

これ、中身は PowerShell で、機能過多なので普通のバッチファイルか Makefile などに変えてスリムなものに戻したいと思っているのですが、まだちょっと無理な状況です。

というわけで、まだしばらくお世話になるので、万が一に備えて、使い方を書いておこうと思いました。

普通のビルド

make だけで、デフォルトの GOOS 、デフォルトの GOARCH でビルドする。 この時、表記バージョンは 4.4.6_0-8-ge5e89d3-windows-amd64 といったコミットIDまで含んだものになる。

先頭のバージョン部分(4.4.6_0)は Etc\version.txt から読む。

アーキテクチャ・OSを変えてビルド
  • make 386 … GOARCH=386 でビルドする
  • make amd64 … GOARCH=amd64 でビルドする
  • make linux … GOOS=linux でビルドする。こちらだけはコミット ID が含まれない

なお make linux 386 のようなものはない(linux 指定の時はかならずデフォルト GOARCH のまま)。特にニーズがないので…

リリースパッケージ向けにビルドする
  • make release … デフォルトの GOOS、デフォルトの GOARCH でリリース向けビルドを作成する。表記バージョンは 4.4.6_1-windows-amd64 などのようにコミットIDが入らなくなる
  • make release 386アーキテクチャを変えて、リリース向けにビルドする。なお、make release linux はなくて、make linux をそのまま使う

など、実行ファイルは以下2箇所に同じもの作られる

  • make.cmd と同じフォルダー
    • すぐ試す用
  • cmd\amd64 , cmd\386 , cmd\linux
    • アーキテクチャが違うものを互いに上書きしないで残しておく用
    • 次のバージョンから bin\amd64 , bin\386 , bin\linux へ変更予定
    • Linux 版をテストする時は WSL の bash を起動して、そこから ./nyagos を呼び出したりする
パッケージを作る

リリース向けビルドをすでに行っていることが前提。これで nyagos-4.4.6_1-windows-amd64.zip 、nyagos-4.4.6_1-linux-amd64.tar.gz みたいなパッケージを作る。

  • make package
  • make package 386
  • make package linux
(余談)バージョンアップの時にすること
  1. Doc\release_note_en.md , Doc\release_note_ja.md に、新しいバージョンの見出しをつける
  2. Etc\version.txt のバージョンを更新する
  3. git commit && git pushbump to バージョンナンバー としているコミットはたいていこれ
  4. make release && make package (Windows/amd64)
  5. make release 386 && make package 386 (Windows/386)
  6. make linux && make package linux (Linux/amd64)
  7. GitHub の Release タブで Draft a new relese をたたく
  8. タグ・リリースタイトルともに 4.4.6_1 といったバージョンナンバーをそのまま付ける。リリース内容は Doc\release_note_en.txt と Doc\release_note_ja.txt の両方から引用するだけ
  9. 作成したバイナリパッケージ3点をドロップして Publish New Release
  10. git pull して、GitHub 側が作成した新タグをローカルに取り込む
  11. アナウンス用の twitter アカウントから、リリースしたとの告知を行う
  12. 個人の twitter アカウントからリリース告知を RT する
  13. はてなブログにリリースの内容を解説する記事を書く
    • 最近は予告記事に修正内容を書いて、リリース記事はシンプルにしてたりしますが。
  14. その記事も twitter で告知だして、RT(しつこい)

というようなことをして、今、4.4.6_1 をリリースしました。だいぶと自動化はしたんですが、まだまだ手間かかりますね…

以上です。

(リリース予告)NYAGOS 4.4.6_1

(2020.05.31 追記) リリースしました → Release 4.4.6_1 · zetamatta/nyagos


ちょっと看過しづらい不具合がたまってきたので、近々、修正版(4.4.6_1)を公開する予定です。 今回の修正には新機能(WindowsTerminal 対応や、CDPATH )は含みません (masterブランチに、develop ブランチにある不具合修正分だけを cherry-pick しています)

(#385) 最後にいたフォルダーが削除されたドライブの任意のフォルダーへ移動できなかった不具合を修正

#385 の例にあるとおり

$ mkdir D:\HOGE
$ cd D:\HOGE
$ C:
$ rmdir D:\HOGE
$ cd d:\.
chdir D:\hoge: The system cannot find the file specified.

別のドライブのカレントディレクトリが削除されていると、そのドライブの任意のフォルダーに移動できなくなるという不具合がありました。これは、別ドライブのカレントディレクトリに一旦移動してから、指定のディレクトリに移動するという二段階を踏んでいたせいでした。

そういうまわりくどいことはやめて、別ドライブに移動を行う時、別ドライブのカレントディレクトリ基準の相対パスD:. とか D:foo)の表記の時だけ、D:\(前回のフォルダー)\(今回のフォルダー) みたいに読み替えるようにしました。

cd のディレクトリヒストリがパスの大文字小文字を区別していなかった問題を修正

nyagosにはcdのディレクトリヒストリがあり

  • cd -h→ヒストリを表示
  • cd -3→リスト3番目へ移動

ができ、かつヒストリは同じディレクトリを集約し過去10ディレクトリを選べるようになっています。この集約機能に英大文字・小文字を区別してしまう不具合がありました。

そんな害はありませんが、記憶させるヒストリは -1 ~ -9 と9個に限っているので、無駄にスタックを消費させていてもったいないことになってました。

ドライブ移動(x:) でディレクトリヒストリにディレクトリをスタックしていなかった問題を修正

cd -h で出てくるディレクトリヒストリは cd , pushd の時などに記憶させていましたが、C: などドライブ名切り替えの時が漏れていました。

nyagos.rawexec{...}の最後の要素が無視されていた不具合を修正
  • [NG] lua_e "nyagos.rawexec{'cmd','/c','echo ahaha'}"
  • [OK] lua_e "nyagos.rawexec('cmd','/c','echo ahaha')
  • [OK] lua_e "nyagos.rawexec{'cmd','/c','echo ahaha',''}"

テーブルコンストラクタで引き渡したパラメータの最後のものが欠けるという不具合がありました。これは Lua では要素数Nの配列状テーブルの添字が 1...N と表現されるのに、0...(N-1) を展開していたためでした。

0...N の要素をチェックするよう修正しました(添字が存在しなかったら無視するようにはなっているので、Out of range なクラッシュはありません)

以上です。

Windows Terminal で Ctrl-H が Backspace と認識されないケースについて調べてみた(5/24追記あり)

nyagos では大丈夫なんだけど、コンソール版 vim.exe だと、Ctrl-H をタイプすると Backspace と認識されず豆腐(□)が表示される。

ちょっとしたコードを書いて、違いを比較してみた。

package main

import (
    "fmt"

    "github.com/zetamatta/go-console/getch"
)

func main() {
    getch.Flush()

    // get console event
    fmt.Println("Type ESC-Key to program shutdown.")
    for {
        e := getch.All()
        if k := e.Key; k != nil {
            fmt.Printf("key down: code=%04X scan=%04X shift=%04X\n",
                k.Rune, k.Scan, k.Shift)
        }
        if k := e.KeyUp; k != nil {
            fmt.Printf("key up: code=%04X scan=%04X shift=%04X\n",
                k.Rune, k.Scan, k.Shift)
            if k.Rune == 0x1B {
                break
            }
        }
    }
}

コマンドプロンプトでは:

$ ./example5.exe
Type ESC-Key to program shutdown.
key up: code=000D scan=000D shift=0000
key down: code=0000 scan=0011 shift=0008
key down: code=0008 scan=0048 shift=0008
key up: code=0008 scan=0048 shift=0008
key up: code=0000 scan=0011 shift=0000
key down: code=001B scan=001B shift=0000
key up: code=001B scan=001B shift=0000

Ctrl-H のコードがBackspace文字通り Ctrl + H (code=0008,shift=0008)と認識されている。

Windows Terminal では:

$ ./example5.exe
Type ESC-Key to program shutdown.
key down: code=0000 scan=0011 shift=0008
key down: code=007F scan=0008 shift=0008
key up: code=007F scan=0008 shift=0008
key up: code=0000 scan=0011 shift=0000
key down: code=001B scan=001B shift=0000
key up: code=001B scan=001B shift=0000

Ctrl-H のコードが Ctrl+Del(code=007F,shift=0008) と認識されている。なるほど。

.vimrc で Ctrl+Del を Backspace 相当にアサインすればよさそうだけど、どうすりゃいいんだ?

inoremap <C-Del> <Bs>
inoremap <Del> <Bs>

と書いてみたけど、効いてなさそう…うーむ

(追記)
inoremap <C-Char-0x7f> <Bs>

で Ctrl-H がBackspace として機能するようになった。

(さらに追記)

Windows Terminal 1.4.3.141.0 では直ってた。

WindowsTerminal の起動シェルに nyagos を指定する

2020.05.24 追記 :nyagos向け設定行で、起動ディレクトリを %USERPROFILE% で指定するようにした)

Windows Terminal 1.0 が出たようですね!

フォントがなかなかよいけど、どうせサロゲートペアな Unicode は表示できないんでしょ…と思ってたら、表示できてしまったので、ビックリです。 マジかよ
(コンソールバッファどうしてるんだよ。1セル2バイトだろ、あれ…)

これは常用したくなってきました。

ということで、デフォルトの起動シェルを PowerShell から nyagos に変更してみました。手順は下記のとおりです。

  1. Windows Terminal を起動する
  2. Ctrl-, (Comma) を押下すると設定ファイルが標準テキストエディターでオープンされる。
  3. 次のように修正してセーブ

トップ → "Profiles""list" の下に NYAGOS のエントリを追加する

(例)

{
      "guid": "{19ddaf5e-e045-481a-bf88-37f7ebe66292}",
      "hidden": false,
      "name": "Nihongo Yet Another GOing Shell",
      "commandline": "%USERPROFILE%\\Share\\Bin64\\nyagos.exe",
      "cursorShape": "vintage",
      "startingDirectory": "%USERPROFILE%"
}

(ここに記載した guid はツールで適当に作った guid だが、他と重複しなければなんでもよい。ここのをそのまま使っても問題ないはず)

トップ直下の "defaultProfile"PowerShell の guid から、追加したエントリの nyagos の guid に変更する。

    "defaultProfile": "{19ddaf5e-e045-481a-bf88-37f7ebe66292}",
    // "defaultProfile": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",

画面サイズも変更したい場合は、以下のようなエントリをトップ直下に追加しておくとよい(正直、デフォルトは大きすぎる)

"initialCols": 90,
"initialRows": 30,

以上です。しばらく、これでがんばってみましょう

NYAGOS 4.4.6_0 を公開しました。

度重なる延期でお待たせしました。

前回:(リリース予告)NYAGOS 4.4.6_0 - 標準愚痴出力 での案内以降の追加変更は以下のとおりです。

start の後のタブキーは(which と同様に)コマンド名補完をするようにした

コマンド別のカスタマイズ補完で、start が抜けてましたので、追加しました。処理としては which 向けの補完と全く同じです(実際1行追加しただけ)

cd x:\y\z が失敗した時、x:\ (ルートディレクトリ)に移動する不具合を修正した

cd X:\YYY\ZZZ」 で「X:\YYY\ZZZ」が存在しない時、cd を中止せず、X:\ のルートへ移動してしまう不具合がありました。どうも、そういう仕様のつもりだったようですが、リンク切れのショートカットに cd した時、ルートに移動してしまうのはおかしい感じがあったので、ディレクトリを移動しないように(正確にいうと元の場所に戻るように)直しました。

だいたい、以上です。よろしくお願いいたします。

Bitbucket の Mercurial Support が 2020年7月1日で終了すると聞いた俺たちは

Bitbucket の Mercurial レポジトリとその Downloads ページに上げたバイナリパッケージのバックアップをとらねばと思ったのはよいが

https://bitbucket.org/zetamatta/nyaos3000/downloads/

https://bitbucket.org/zetamatta/nyaos3000/downloads/

> 64ファイルも(手作業で)ダウンロードしてられんわ! <

ということで、URL を指定したら、そのからリンクされている .zip / .bz2 / .gz ファイルを全部ダウンロードするツールを書いた。

それだけ(たぶん wget とかをうまいこと使った方が早かっただろうね)

なお、プライベートレポジトリでは使えません。

(リリース予告)NYAGOS 4.4.6_0

現在、まだ手元で試験運用中ですが、次の nyagos では次のような修正が盛り込まれる予定です。公開時期は未定ですが、特に不具合が発覚しなければ連休明けくらいが無難かなと考えています。

なお、master ブランチにはすでにマージされているので、使ってみたい人は AppVeyorの Current Build → Environment:Platform → Artifacts から実行ファイルをダウンロードしてください。

%DATE% と %TIME% を実装した。

以前、記しました %DATE% の展開をサポートした を御覧ください。

nyagos.envdel は削除したディレクトリを戻り値として返すようになった。

こんな感じに使います。

for _,s in pairs{
    nyagos.envdel("PATH",
        "Oracle",
        "Lenovo",
        "Skype",
        "chocolatey",
        "TypeScript",
        "WindowsApps",
        "OpenSSH",
        "dotnet",
        "MinGW")} do
    print("del",s)
end

通常は %PATH% で削除したフォルダーを %NYAGOSPATH% に追加するためなどに使います。

dos/net*.go などを github.com/zetamatta/go-windows-netresource へ移行

サブパッケージ dosnodos で定義していた、下請けの汎用関数を別のパッケージ

で独立管理するようにしました。

(#379) nyagos.preexechook & postexechook を追加

リクエストいただいた仕様追加です。コマンドを発行する直前・直後で呼び出す Lua 関数を設定できるようにしました。こんな感じに使います。

(登録)

nyagos.preexechook = function(args)
    io.write("Call ")
    for i=1,#args do
        io.write("[" .. args[i] .. "]")
    end
    io.write("\n")
end

nyagos.postexechook = function(args)
    io.write("Done ")
    for i=1,#args do
        io.write("[" .. args[i] .. "]")
    end
    io.write("\n")
end

(解除)

nyagos.preexechook = nil
nyagos.postexechook = nil
(#383) 端末がクラッシュした時、無限ループに突入してしまう不具合を修正

junegunn/fzf: A command-line fuzzy finder というツール内で日本語検索をするとターミナルがクラッシュしてしまうのですが、呼び出し元の nyagos がターミナルが消えた後も生き残って CPU リソースを消費し続けてしまうという問題がありました。

クラッシュ自体は fzf とターミナルの問題なのですが、ターミナル無き後も動作するのは nyagos の問題です。調査してみると、どうやら、go-tty.Open が出している go-tty.Open: No process is on the other end of the pipe. というエラーを握りつぶしてしまっていました。 これを「ただちに終了する」よう修正したところ、いつまでも nyagos が残ってしまう問題は解決しました。
(なお、fzf のクラッシュは俺の知ったことではない)

なお、当問題が発覚した当初、ターミナルがないのに残ってしまった nyagos プロセスをゾンビプロセスと表記していましたが、ゾンビプロセスとはプロセス自体は終了しているのにプロセスのテーブルに残っているもので kill できないというもので、nyagos の場合とは明らかに違いました。訂正します。 issue でも、最初は件名を Crash or be zombie on searching Japanese words by fzf だったのを、後から Go into an infinite-loop when the terminal crashes に改めました。

以上