標準愚痴出力

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

mastodon ここ最近、ちょっと触っているので(頭痛をまぎらわしがてら)所感を

  • jpサーバは中学生・高校生みたいな下品な投稿が多くて、ローカルタイムラインは見てられないが、著名な技術者も泳いでいるので、外せない。でも、別に他のサーバにアカウントを作っても、リモートでフォローできるのが mastodon のよいところだから、jpサーバーにこだわる必要はない
  • Go言語製のコマンドラインクライアント(go-mastodon)の開発に「ちょっとだけ」携われて楽しかった(2,3 Pull Request 送っただけ)
  • 500文字もあると、タンブラー的に使えてよい。また、文書が長い時「(続きを読む)」で本文を隠せるようになったのは地味に便利。読み手の利便性を意識した書き方ができる
  • 共有のためのブックマークレットがないのがちょっと不便。とりあえず、コピペ支援の簡単なブックマークレット※で代用中
  • 前身の GNU Social(quitter.noとか)の時は日本人がほとんどいなくて寂しかったが、mastodon は賑やかで本当に嬉しい。これで、仕様変更でユーザを振り回す twitter 社の呪縛から逃れられる

javascript:(function(){var v=window.getSelection();prompt('',(v==''?'':'『'+v+'』\n')+'QT ' + document.title + ' ' + window.location.href)}())

C:\path\\to は invalid なパスか、否か?

IPAのページ Windowsパス名の落とし穴によると

4. d:\\InetPub\\\wwwroot\\\\secret\\\\\data.txt
    ディレクトリの区切り文字は幾つか重複しても構わない

とあるため、これを信じると C:\path\\to は Valid なパスである。

無論、これイコール Microsoft の見解というわけではないが、 .NET Framework の System.IO.File.Exist 関数や、 System.IO.Directory.Exist 関数でも True が戻ってくるため、 Microsoft の指針と矛盾しないと考えるのが妥当だろう。

だが、Windowsエクスプローラーのパス入力欄に入力すると

'C:\path\\to' は見つかりません。綴りを確認して再実行してください。

などとエラーにされる。

ユーザからすると、こちらが目に入りやすいため、 「\\というパス区切りをエラーにしないとはどういうことか」 ということになる。

困ったものですなぁ

☭(U+262D)のコマンドプロンプトに置ける文字の幅問題

☭という記号がある。「鎌と槌」(HAMMER AND SICKLE)と呼ばれる記号で、いわゆる共産党のシンボルである。

この文字、East_Asian_Width は Neutral になっているWikipediaの東アジアの文字幅によると

UAX#11では、これらの特性を次のように解釈することを推奨している。

Unicode のテキストを東アジアの従来文字コードの文脈で扱う場合
- 特性値Na(狭)またはN(中立)を持つ文字は、半角の文字 (halfwidth) として扱う
  :
Unicode のテキストを東アジア以外の従来文字コードの文脈で扱う場合
- 特性値Na(狭)またはN(中立)を持つ文字は、幅の狭い文字 (narrow) として扱う。

であるため、規格上はいわゆる「半角文字」である。

が、コマンドプロンプトで実際に出力すると、セルを二つ消費する。つまり、「全角文字」相当になっている。

これが原因で go-runewidth をそのまま使って、文字の桁数を計算することができなくなっている。仕方がないので、実際にコマンドプロンプトに出力した時のカーソル移動量で文字の桁数を求めている。

NYAGOS の一行入力パッケージでは、極力 go-colorable によるエスケープシーケンスだけで処理を済まそうとしているが、一部どうしてもコンソールの API を直接呼び出している。この文字桁問題がなければ、ひとつ直接呼出しが減らせるんだけどな…

peco/choライクな選択コマンド box を作成しました(ただし次期NYAGOS内蔵コマンド)

NYAGOS の内蔵コマンドとして box を作成しました。

現在、機能の調整中(具体的にはドキュメントが出来てない)ですが、 次の NYAGOS のリリース (4.1.9)に盛り込む予定です。 すぐ使いたい人は自力でビルドしましょう。

peco

この手のコマンドで有名なものには peco というものがありました。これは

  • 標準入力から選択肢一覧を受信
  • 画面上でカーソル移動・フィルターリングなどで、選択肢を選ぶ
  • 確定した選択肢を標準出力に出力する

というもので、シェルのパイプラインの中に組み込んで、簡単なユーザインターフェイスを構築するのに便利なツールでした。 ただ、このツール、Windows では動作するものの、コマンドプロンプトではフォントによっては画面が乱れるという問題がありました。 (対応予定はない模様。フォント側を直すべきとされている)

cho

それに対して、画面更新量を必要最小限にすることにより、乱れを回避したものが mattn 先生による cho。 peco では termbox-go で端末画面のほぼ全体を利用していたのに対し、cho では

を使っています。わたくしも愛用していました。

box

NYAGOS では、peco と cho を利用した、ファイル名選択・git のコミット選択機能を Lua スクリプトで実装していました。 が、peco も cho も全てのマシンに標準装備というわけではないので、NYAGOS ではデフォルトで ON ではなく、 オプションのフォルダーに入れていました(nyagos.d/catalog/peco.luanyagos.d/catalog/cho.lua)。

「せっかくの機能なのだから、標準で使えるようにしたいな。バイナリ(cho.exe)をバンドルさせてもらおうかな。でも、cho のメインルーチンの長さを見ると、自分で作れなくもないな。でも、まったく同じものを作っても意味ないな」 というわけで、選択肢を ls みたいに複数列化したコマンド box を作成しました。

box の仕様自体は peco と同じです。下記はファイル名補完の補助ツールとして box を組み込んだものです。

f:id:zetamatta:20170319175514g:plain

box は、とりあえず nyagos の内蔵コマンドとして作りましたが、独立した EXE も作成可能です(box.exe)。 ただし、端末操作のライブラリとして nyagos 内のものも使っているため、現行は Windows 専用となっています とはいえ、ライブラリを各OS対応のものに切り替えれば、Linux 対応も難しくないでしょう(たぶん)