もうさすがにネタ切れかなと毎年思いつつも、頼んでもないのに忘れた頃に大改造してしまうニッチな和製コマンドラインシェル、それが NYAGOS (Nihongo Yet Another GOing Shell)
NYAGOS とは(復習)
- C++ で開発されてきた NYAOS シリーズを、Go言語でスクラッチから作り直した
- 文法は NYAOS シリーズの基本ポリシーどおり、CMD.EXE と bash のチャンポン
- カスタマイズ言語としては NYAOS 3.x と同様に、俺たちの Lua 言語を採用
- 最大の特徴は Unicode サポート。「
☭
」といった JIS にない文字も普通に入力できるよ NYAOS 3.x までと違い、ちゃんとしたパイプラインをついに実現した
- NYAOS 3.xの時は「
外部コマンド | 内蔵コマンド | 外部コマンド
」とか無理だった - これが出来るようになったのは、Goroutine で簡単にバックグラウンド実行が出来るようになったことが大きい
- NYAOS 3.xの時は「
- 【ポエム】 NYAGOSの現在と今後 【2017年版】 - Qiita
2018年に何をやったか
(1) バッチファイルでの環境変数・カレントディレクトリの変更を取り込めるように (4.2.5)
「NYAGOS使えない!」という理由として、よく挙げられる「環境変数設定バッチが動作しない」の「環境変数設定バッチ」が source 文なしに普通に使えるはずです。やってることは、バッチファイル呼び出しを
%COMSPEC% /V:ON /S /C " call "@バッチファイル名" & set ERRORLEVEL_=!ERRORLEVEL! & (cd & set) > "%TEMP%\nyagos-(PID).tmp" & exit /b !ERRORLEVEL_! "
みたいな形にして、終了後に nyagos-(PID).tmp
を読み込んでいるだけなんですけどね。
一応「lua_e "nyagos.option.usesource = false"
」で無効化も出来ます。
(2) Luaエンジンを GopherLua へ変更(4.3.0)
lua53.dll を syscall 経由で利用していたのを、GopherLua に切り替えました。lua53.dll を使った拡張モジュール開発者の皆様には作り直しを要求することになり、たいへん申し訳ないことになってしまいましたが、本体は Pure Golang になったことで安定性が向上しました。
> スタックトレースがちゃんと出るのって、幸せだなぁ <
Go言語コード → C言語のDLL → Go言語コード(CallBack) なことをやるとね、クラッシュの場所がよう分からんことになりがちなんですよ。あと、
- 同梱する lua53.dll の32bit/64bitを間違えないように注意する必要がなくなった
- appveyor で自動ビルドする際に lua53.dll のダウンロードに失敗する障害からも解放された※
(※ 最近の MinGW/gcc で lua53.dll をビルドすると、LIBGCC_S_DW2-1.DLL を必要としてしまう。EXEファイルをビルドする際は static リンクできるが、DLLファイルには static リンクできない。そのため、luaBinariesのように、古いバージョンの MingW/gcc をベースとした TDM-gcc で lua53.dll をビルドするか、同サイトからダウンロードするか、DLLバイナリを直接 github レポジトリにコミットするかいずれかを選ばなくてはいけなかった)
など、運用も楽になりました。
なお、Luaライブラリ切り替えに伴って、Luaへの依存部をいったん分離したので、副産物として「Luaなしバージョン」もビルドできるようになっています。cd go/src/github.com/zetamatta/nyagos/ngs && go build
で Ok です。
(3) キー入力を自前から mattn/go-tty へ
こちらはバイナリ版は未リリースで、現在 developブランチのみで実装されています。
そもそもの目的は、キー入力の呼び出し方を「UNIX/Linux に近いスタンダードな形」に寄せることで、将来的に MSYS2 系とか汎用ターミナルとかから利用できるようにしたかったのです。
キー入力を使っていたのは自前 readline と、あと少数のコマンドのYes/No問い合わせくらいなので、Lua の切り替えと違い、これは本当に「えいやっ」で2,3日で出来ました。 (Lua切り替えは前準備に半年くらいかかったのですよ)
自前版(zetamatta/go-getch) もかなり手を入れていて思い入れはあったのですが、結局、キーだけでなく、サイズ変更とか、いろいろなコンソールイベントが一つの API 経由で入ってくるのを「わかりやすく && 汎用的」になんて到底無理だし、もう偉い人のライブラリにアウトソースした方が早いんじゃねということで、思い切って切り捨てました(ここらへんの損切り感覚は大切)
(4) Linux 対応
ネタやと思いますやろ? なんと developブランチは Linux でビルドできるようになりました。
Windows への依存が激しかった Lua とキー入力をが、Windows/Linux 双方に対応しているものに切り替えることが出来たので「もしかしていけるかな」と、残りの syscall を利用したコードを個別に *_windows.go
と *_unix.go
とより分けてゆき、無理な機能は Windows 限定という形にしていった結果、なんかできちゃったよ!
DOS-Like commandline Shell for Linux, NYAGOS 誕生ですわ
まぁ、ある意味「使えるけど、使うメリットが別にない」からネタちゅーたら、ネタかもしれませんがね… なので、あんまり本格的なテストはやってません。Windows Subsystem for Linux のなかで、ぼちぼちと不具合とか暫定的に無効化している部分を潰してる感じですね。
しかし、NYAOS 2.x 時代、DOS/Windows/OS/2 の 3-OSサポートで散々苦労したのに、またやるかな、俺は…