Windows 8 系で scoop を入れる

だが、PowerShell のバージョンが古いので、そのままでは入らない。

PS C:\Users\Administrator> Get-Host | Select-Object Version

Version
-------
4.0

Download Windows Management Framework 5.1 from Official Microsoft Download Center より、OS の種類に対応した、Windows Management Framework 5.1 をインストールする(要OS再起動)。

どの OS がどのファイルか親切に書いていないので、ファイル名から推測する。Win8.1AndW2K12R2-KB3191564-x64.msu が 64bit版の Windows8.1 と Windows 2012R2 サーバのようだ(間違っていてもちゃんとエラーが出るのでやり直せば大丈夫)

PS C:\Users\Administrator> Get-Host | Select-Object Version

Version
-------
5.1.14409.1005

あとは、パッケージマネージャの「scoop」経由で nyagos をインストールしてみましたと同様に、

powershell -ExecutionPolicy RemoteSigned "iwr -useb get.scoop.sh | iex"

でよい

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

もうさすがに打ち止めかな…

バックグラウンドワーカーからダイアログのデータを更新する

(2020.02.25 追記あり

通常は BackgroundWorker からダイアログのコントロールを操作することはできない。だが、Delegate を経由すれば、可能になる。

Public Class Form1
    '*** UIスレッドで実行される関数 ***
    Private Sub AddRow(color1 As Color, objs As Object())
        Dim row1 As New DataGridViewRow
        row1.CreateCells(Me.DataGrid_Sheet)
        For i As Integer = LBound(objs) To UBound(objs)
            row1.Cells(i).Value = objs(i)
        Next
        row1.DefaultCellStyle.BackColor = color1
        row1.Resizable = DataGridViewTriState.False
        Me.DataGrid_Sheet.Rows.Add(row1)
    End Sub

    '*** UIスレッドへ、更新データを送る Delegate の宣言
    Delegate Sub AddRowDelegate(color1 As Color, objs As Object())
    Private AddRowDelegate1 As New AddRowDelegate(AddressOf AddRow)

   '*** バックグラウンドワーカー
    Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
   '            : 中略
                Me.Invoke(AddRowDelegate1,
                    color,
                    New Object() { 
                        ' セルデータ,
                    }  )
  '            : 中略
    End Sub

ただし、あまりにも更新のスピードが多いと、U/I スレッドがそれへの応答でいっぱいいっぱいになって応答がなくなってしまい、BackgroundWorker の意味がなくなってしまう。

そのような場合、結局、タイマ割り込みで休み休みやった方が安全のようだ。(このあたりは推測にすぎないが…)

(2020.02.25 追記)

本記事では、当初、次のように書いていた。

Me.AddRowDelegate1.Invoke(
    color,
    New Object() { 
            ' セルデータ,
            }  )

だが、Windowsフォームで別スレッドからコントロールを操作するには?:.NET TIPS - @ITによると、コントロールのメソッドとして呼ばないと、意味がないようだ(そりゃそうだ)

Me.Invoke(
    AddRowDelegate1,
    color,
    New Object() { 
           ' セルデータ,
    }  )

また、Invoke はメインスレッドをブロックするが、BeginInvoke だと待機状態になったタイミングで実行するとあるので、BeginInvokeを使えば U/I スレッドがいっぱいいっぱいになることは避けられるかもしれない

nyagos で %PATH% がオーバーフローしないようにする対策

環境変数 PATH の文字数には 2000文字くらいの上限があるようで、これをオーバーして、必要なコマンドが呼び出せなくなるというトラブルが WSL あたりで発生しているようです。

nyagos でも問題は同様に発生しうるのですが、Lua コードで %PATH% にフォルダーを追加する前に、使わないフォルダーを除くことでオーバーフローしないようにすることが可能です。 (削除しても nyagos と nyagos から呼び出される子プロセス内だけの話なので、他の動作には影響しない

以前はそういうコードをゴリゴリ書く必要があったのですが、4.4.5 から nyagos.envdel という関数が使えるようになって、整理が簡単になりました。

こんなふうに %USERPROFILE%.nyagos に書きます。

nyagos.envdel("PATH",
    "Oracle","Lenovo","Skype",
    "chocolatey","TypeScript","WindowsApps",
    "Wbem","dotnet")

envdel 関数は、第一引数で示された環境変数内の ; で区切られた要素から、第ニ引数以降の文字列を 含んでいるもの を削除します。 上の例だと OracleLenovo … といった文字列が含まれたフォルダーを %PATH% から除きます。

で、これをやって %PATH% の長さにゆとりがでたところで

nyagos.envadd("PATH",
    "C:\\go\\bin",
    "C:\\TDM-GCC-64\\bin",
    "%ProgramFiles%\\Git\\bin",
    "%ProgramFiles%\\Git\\cmd",
    "%ProgramFiles(x86)%\\Git\\bin",
    "%ProgramFiles(x86)%\\Git\\cmd",
    "%ProgramFiles%\\Subversion\\bin",
    "%ProgramFiles(x86)%\\Subversion\\bin",
    "~\\Share\\Program Files\\idmanager",
    "%VBOX_MSI_INSTALL_PATH%",
    "~\\bin",
    "~\\scoop\shims",
    "~\\Share\\bin",
    "~\\Share\\cmds")

とフォルダーを改めてドドンと足すことができるというわけです。

ね、簡単でしょ?

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

現在のコマンドプロンプトでの文字列のピクセルサイズを測る API(gdi.dll のGetTextExtentPoint32W)を呼ぶパッケージを作成した。

これを使って、引数のテキストの長さを測るプログラムを書いた。

package main

import (
    "os"

    "github.com/zetamatta/go-windows-consolefontpixel"
)

func main1() error {
    dc, err := consolefontpixel.OpenDC()
    if err != nil {
        return err
    }
    defer dc.Close()

    for _, s := range os.Args[1:] {
        w, h, err := dc.GetTextExtentPoint(s)
        if err != nil {
            return err
        }
        println(s, ":width=", w, ",height=", h)
    }
    return nil
}

func main() {
    if err := main1(); err != nil {
        println(err.Error())
        os.Exit(1)
    }
}

やってみよう!

f:id:zetamatta:20200208101445p:plain

だめだ。こりゃ…

U+2727 : WHITE FOUR POINTED STAR は幅16ピクセル、高さ18ピクセルなのでほぼ全角サイズなのに、最後の行を見て分かるとおり画面に出力すると1セル分しかカーソルが移動していない。 (ちなみに Windows 7 では2セル動いていた → コマンドプロンプトの文字幅をキャリブレーションして、崩れない TUI 画面を作ろう - 標準愚痴出力 )

Windows 10 から、全角・半角判定はフォントサイズではなく、厳密な Unicode の規定に従うようにしたのだろうか

パッケージマネージャの「scoop」経由で kaoriya版 vim をインストールしてみました

前回:パッケージマネージャの「scoop」経由で nyagos をインストールしてみましたからの続き

scoop install vim でインストールされる素の vim × skk.vim × git のコミットログ編集をすると、やはり日本語が厳しい。

(そりゃ SKK の辞書は EUC-JP で、コミットログのドラフトは UTF8 、デフォルト表示は普通 CP932 なんだから、キツかろう)

でググってたら:

と、scoop でインストール可能な kaoriya-vim のレポジトリが公開されていた!すばらしい

$ scoop bucket add jp https://github.com/rkbk60/scoop-for-jp
Checking repo... ok
The jp bucket was added successfully.

$ scoop install vim-kaoriya
Updating Scoop...
Updating 'jp' bucket...
Updating 'main' bucket...
Checking repo... ok
The main bucket was added successfully.
Scoop was updated successfully!
Installing 'vim-kaoriya' (8.1.0005.20180520) [64bit]
vim81-kaoriya-win64-8.1.0005-20180520.zip (17.6 MB) [=================] 100%
Checking hash of vim81-kaoriya-win64-8.1.0005-20180520.zip ... ok.
Extracting vim81-kaoriya-win64-8.1.0005-20180520.zip ... done.
Linking ~\scoop\apps\vim-kaoriya\current => ~\scoop\apps\vim-kaoriya\8.1.0005.20180520
Creating shim for 'vim'.
Creating shim for 'vimk'.
Creating shim for 'gvim'.
Creating shim for 'gvimk'.
Creating shortcut for Gvim (gvim.exe)
'vim-kaoriya' (8.1.0005.20180520) was installed successfully!

で Ok!

今までは、VMごとに何回もインストールするのがたいへんだったので、ホストの共有フォルダーにインストールしたのに PATH を通して使っていたんだけど、やはりアクセスが遅いという難点があった。

が、これほどさくっと入るのであれば、個別のVMごとにさくっと入れたほうが早いね!(小泉進次郎記法)

(追記 @ 2020/02/27)

インストールされている Git が古いと

C:\Users\Administrator>scoop bucket add jp https://github.com/rkbk60/scoop-for-jp
Checking repo... 'https://github.com/rkbk60/scoop-for-jp' doesn't look like a va
lid git repository

Error given:
fatal: unable to access 'https://github.com/rkbk60/scoop-for-jp/': error:1407742
E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

というエラーになる

C:\Users\Administrator>git --version
git version 1.9.5.msysgit.0

だめだ、こりゃ。自前で入れた古い Git は「プログラムの追加と削除」でアンインストールし、新しいバージョンを改めて scoop install git で潜影蛇手すると

$ scoop bucket add jp https://github.com/rkbk60/scoop-for-jp
Checking repo... ok
The jp bucket was added successfully.

よしよし

パッケージマネージャの「scoop」経由で nyagos をインストールしてみました。

昨年2019年の6月末に ironsand さんが scoop という Windows のパッケージマネージャに nyagos 4.4.5_2 を登録してくださいました(ありがとうございました)。

今頃になりましたが、どんなものか、試してみました。

(1)scoop をインストールする

インストーラーを PowerShell でダウンロード即実行します。スクリプトを実行するので、RemoteSigne 権限で行う必要があります(この権限付けがめんどいですよね)

$ powershell -ExecutionPolicy RemoteSigned "iwr -useb get.scoop.sh | iex"
Initializing...
Downloading scoop...
Extracting...
Creating shim...
Downloading main bucket...
Extracting...
Adding ~\scoop\shims to your path.
'lastupdate' has been set to '2020-01-26T20:56:49.1761305+09:00'
Scoop was installed successfully!
Type 'scoop help' for instructions.

(2) scoop にパスを通す

環境変数 PATH に %USERPROFILE%\scoop\shims を追加します。

(3)nyagos をインストールする

$ scoop install nyagos
Installing 'nyagos' (4.4.5_2) [64bit]
nyagos-4.4.5_2-windows-amd64.zip (3.1 MB) [===========================] 100%
Checking hash of nyagos-4.4.5_2-windows-amd64.zip ... ok.
Extracting nyagos-4.4.5_2-windows-amd64.zip ... done.
Linking ~\scoop\apps\nyagos\current => ~\scoop\apps\nyagos\4.4.5_2
Creating shim for 'nyagos'.
'nyagos' (4.4.5_2) was installed successfully!

(4)ちゃんと入ったかな?

$ where nyagos
C:\Users\hymko\Share\bin64\nyagos.exe
C:\Users\hymko\Share\bin64\nyagos.lua
C:\Users\hymko\Share\bin\nyagos
C:\Users\hymko\Share\bin\nyagos.exe
C:\Users\hymko\Share\bin\nyagos.lua
C:\Users\hymko\scoop\shims\nyagos.exe
C:\Users\hymko\scoop\shims\nyagos.ps1

最後の2行が今回追加されたようなので、これがインストールされた nyagos なのかなと思ったら、ちょっと違うようです。

<DESKTOP-LGGUCRA:~/scoop/shims>
$ ls -ltr
-rwxa-- 7,680 Dec  1 03:27:28 nyagos.exe*
-rwxa--   271 Jan 26 20:56:43 scoop.ps1*
-rwxa--   339 Jan 26 20:56:43 scoop.cmd*
-rw-a--   116 Jan 26 20:56:43 scoop
-rwxa--   269 Jan 26 21:01:19 nyagos.ps1*
-rw-a--    63 Jan 26 21:01:20 nyagos.shim

俺の nyagos がこんなに小さいわけがない(8KB どころの話じゃなくて、8MBくらいある。でも、実行するとちゃんと起動します。

<DESKTOP-LGGUCRA:~/scoop/shims>
$ ./nyagos.exe
Nihongo Yet Another GOing Shell 4.4.5_2-windows-amd64 by go1.13.3
(c) 2014-2019 NYAOS.ORG <http://www.nyaos.org>
<DESKTOP-LGGUCRA:~/scoop/shims>
$ lua_e "print(nyagos.exe)"
C:\Users\hymko\scoop\apps\nyagos\current\nyagos.exe

どうやら、この nyagos.exe はプロクシー的なプログラムで、実体である  %USERPROFILE%\scoop\apps\(アプリケーション名)\current\(アプリケーション名).exe を呼び出す仕組みになっているようです。なるほど、これなら環境変数 PATH に無秩序にディレクトリを追加しなくて済みそうですね。よく考えられています。

<DESKTOP-LGGUCRA:~/scoop/apps/nyagos>
$ ls -ltr
dr-x--- 0 Jan 26 21:01:19 current@ -> C:\Users\hymko\scoop\apps\nyagos\4.4.5_2
drwx--- 0 Jan 26 21:01:20 4.4.5_2/

アプリケーションに関するファイルは基本全部 %USERPROFILE%\scoop\apps\(アプリケーション名)\バージョン\ の中に入っていて、current は最新バージョンに対するジャンクションみたいです。考えた人、あたまいいですね。

(追記)

このあと、scoop install curl もやってみました。

<DESKTOP-LGGUCRA:~/scoop/shims>
$ ls -ltr
-rwxa-- 7,680 Dec  1 03:27:28 nyagos.exe*
-rwxa-- 7,680 Dec  1 03:27:28 curl.exe*
-rwxa-- 7,680 Dec  1 03:27:28 7z.exe*

curl が依存している 7z も一緒に入ったようです。で、全部同じサイズです。

<DESKTOP-LGGUCRA:~/scoop/shims>
$ fc /b nyagos.exe curl.exe
ファイル nyagos.exe と CURL.EXE を比較しています
FC: 相違点は検出されませんでした

同じバイナリのようです。ARGV[0] で挙動を変えているパターンのようですね。

$ fsutil.exe hardlink list nyagos.exe
\Users\hymko\scoop\shims\nyagos.exe

でも、別にハードリンクされているわけではなさそうです。あらー