CMDのforのバグ

バグと言っていいのかどうか。ワイルドカード処理中にファイル名を変えると意図しない動作。

D:\Temp>dir /b
aaa.txt
bbb.txt
ccc.txt

D:\Temp>for %A in (*.txt) do ren %A ZZ%A
(実行結果)
D:\Temp>ren aaa.txt ZZaaa.txt
D:\Temp>ren bbb.txt ZZbbb.txt
D:\Temp>ren ccc.txt ZZccc.txt
D:\Temp>ren ZZaaa.txt ZZZZaaa.txt
D:\Temp>

3つのファイルなのにループを3回回った後、リネーム後のファイルをさらに処理する。

いろいろ試すと、「ワイルドカードが複数のファイルにマッチするときに、その(辞書順での)最後のファイル以外の1つ以上のファイルを、最後のファイルより辞書的に大きいファイル名にリネームして、かつ、最後のファイルもリネームした場合」のようです。

8年ぶりのPC買い換え

Windows7が来年1月でサポート切れとう事もあり、PCの買い換え。

調べると今のT520を買ったのが、2011年6月なのでほぼ8年使ったことになる。

連休限定の通常以上の割引率のクーポンがあったので、いろいろ考えた末購入。 15インチモデルはテンキーが付いてしまうので、サイズを落として14インチモデル。 今年モデルのT490を買うつもりだったけど、構成をいろいろ考えた結果、 SSD+HDDがえらべるのと、値引率も違うので、去年モデルのT480で。 55%引きともなると、標準価格って何だよと。

リミットまでまだ半年以上あるので、今後も通常以上のクーポンが出てくるとは思ったけど、その時にT480が買えるとは限らず、ここで思い切った。

ハードウェアだけじゃなくてOfficeもこの値引きなので、Office2019も購入。 Home&Businessが1万2千円くらいで買えることになる。

ThikPad T480

  • Core i7-8550U
  • Windows10/Pro
  • 32GBメモリ
  • 128GB SSD PCIe-NVMe
  • 1TB HDD 5400rpm
  • NVIDIA GeForce MX150
  • 1920x1080 IPS液晶 タッチパネル無し

ストレージは、1TB SSDだと、+4万円。高いけど思い切るべきだったかも知れない。まあ、メモリ32GBあるので。

Windows10の顔認証機能でログインできるらしいということで、赤外線付きカメラ。

タッチパネル液晶は+2000円くらいなので迷ったけど、わざわざキーボードから腕を持ち上げて使わないと思うのと、タッチ用のシートがある分で見えにくくなったら本末転倒と思い、止めた。 トラックポイントじゃなくてマウスを使う人なら良いのかも。

コマンドプロンプト画面の文字色を固定に

コマンドプロンプトの色は、背景を黒、文字を白にしているのだが、プログラムによっては他の色の文字が表示される。 白以外の文字を黒背景に出すと非常に読みにくいので、白固定にした。

まず、レジストリ

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Console]
"ColorTable00"=dword:00000000
"ColorTable01"=dword:00ffffff
"ColorTable02"=dword:00ffffff
"ColorTable03"=dword:00ffffff
"ColorTable04"=dword:00ffffff
"ColorTable05"=dword:00ffffff
"ColorTable06"=dword:00ffffff
"ColorTable07"=dword:00ffffff
"ColorTable08"=dword:00ffffff
"ColorTable09"=dword:00ffffff
"ColorTable10"=dword:00ffffff
"ColorTable11"=dword:00ffffff
"ColorTable12"=dword:00ffffff
"ColorTable13"=dword:00ffffff
"ColorTable14"=dword:00ffffff
"ColorTable15"=dword:00ffffff

PowerShellは独自に色を出しているようで、設定ファイルに色を記述する。 ドキュメントフォルダ、デフォルトだと、C:\Users\ユーザ名\Documentsに、WindowsPowerShellというフォルダを作り、その中にMicrosoft.PowerShell_profile.ps1というファイルを作る。

$Host.PrivateData.DebugBackgroundColor = "black"
$Host.PrivateData.DebugForegroundColor = "white"
$Host.PrivateData.ErrorBackgroundColor = "black"
$Host.PrivateData.ErrorForegroundColor = "white"
$Host.PrivateData.ProgressBackgroundColor = "black"
$Host.PrivateData.ProgressForegroundColor = "white"
$Host.PrivateData.VerboseBackgroundColor = "black"
$Host.PrivateData.VerboseForegroundColor = "white"
$Host.PrivateData.WarningBackgroundColor = "black"
$Host.PrivateData.WarningForegroundColor = "white"

全部白にしないで、多少色を付けても良かったかも。

openssl.so でエラー

gem update で、opensslが2.1.1、2.1.2になると、

127: 指定されたプロシージャが見つかりません。   - 〜〜/gems/openssl-2.1.2/lib/openssl.so

というエラーになる。
対応としては、gems\openssl-2.1.0\lib\openssl.so を、gems\openssl-2.1.2\lib\openssl.so にコピーする。

ライフゲーム

data = <<EOF
++++++++++++++++++++
++++++++++++++++++++
+++++++OOOOOO+++++++
++++++O++++++O++++++
+++++O++++++++O+++++
++++++O++++++O++++++
+++++++OOOOOO+++++++
++++++++++++++++++++
++++++++++++++++++++
EOF

LOOP = false
board = data.split(/\n/)
Y = board.size
X = board[0].size

def alive(board,y,x)
  return 0 if not LOOP and ( x<0 or x>=X or y<0 or y>=Y )
  board[y%Y][x%X] == "O" ? 1 : 0
end

def update(t0, t1)
  (0...Y).each do |i|
    (0...X).each do |j|
      life = alive(t0,i-1,j-1)+alive(t0,i-1,j)+alive(t0,i-1,j+1)+
             alive(t0,i  ,j-1)+                alive(t0,i  ,j+1)+
             alive(t0,i+1,j-1)+alive(t0,i+1,j)+alive(t0,i+1,j+1)
      t1[i][j] =
        case life
        when 2 then t0[i][j]
        when 3 then "O"
        else        "+"
        end
    end
  end
end

while gets == "\n"
  puts board
  next_board = Array.new(Y){"+"*X}
  update(board, next_board)
  board = next_board
end