揮発性のメモ2

知識をメモ書きしておく

VirtualBoxで仮想マシンをコピーしようとしたらHDDにエラーが見つかって大変だった

ある仮想マシンを1台コピーすることになった
VirtualBoxマネージャーからクローンを実施したところ、エラーが発生した

f:id:iww:20200904141716p:plain
Could not create the clone medium '/data/virtualbox/hogehoge/hogehoge-disk1.vmdk' (VERR_DEV_IO_ERROR).

DEV_IO_ERROR とか出ているが、さっきまで動いてたHDDイメージだし まあ気のせいだと判断
代わりにエクスポートを試みるも、同じエラーが発生

面倒だと思いつつ、一応保全のために 仮想マシンディレクトリごと丸々 tarで固めようとしたところ

$ tar zcf /tmp/hogehoge.tar.gz hogehoge/
tar: hogehoge/hogehoge-disk001.vmdk: 169689088 バイト小さくなったので、ゼロで埋めます

なんだそのエラー 初めて見たぞ
tar のエラーメッセージ tar: path/file: %lld バイト小さくなったので、ゼロで埋めます - tar 送り側で I/O エラーが原因だった | ふるた技工所(てっこうしょ) - 楽天ブログ

嫌な予感がしたので、イメージを単体でコピーしてみると

$ cp hogehoge-disk01.vmdk /tmp/
cp: 'hogehoge-disk01.vmdk' の読み込みエラー: 入力/出力エラーです

ちょうどこのファイルのどこかのセクタがイカれているっぽい。

しかたがないので、ddでエラーを飛ばしてコピーをし保全する

$ dd if=hogehoge-disk01.vmdk of=/mnt/hogehoge-disk01.vmdk conv=sync,noerror

dd でディスクをコピーするよく使う例 - それマグで!


当然こんなのは一時しのぎもいいところなので、
台風の中 HDDを大急ぎで買いに行かねばならなくなった。

PhpStormで、秀丸で開く

PhpStormで、外部ツールに「秀丸で開く」を追加したら ちょっぴりバグった。

本来は External Tools のサブメニューに出てくるはずの「秀丸で開く」が4つくらい余計に増えて本体メニュー側にはみでている
日本語とか多バイト文字でバグっているのではなく、「秀丸で開く」という文字列でのみおかしくなるので、どう考えてもおま環
おそらく大昔に登録していた「秀丸で開く」というメニューが 新しく追加したときになにか不思議な力でよみがえってくるのだと思う
説明が面倒くさすぎて面倒くさいので、このバグは報告しないことにした
表題を「秀丸で見る」にしたら直った

TweetDeckのスクロールバーが動かせない不具合を回避する

Windowsfirefoxを使ってtweetdeckを見ているとき、2つ目以降のスクロールバーをドラッグで動かせない不具合について。
www.reddit.com
ハードウェアアクセラレーションをオフにすると直るとのこと。


半信半疑で試したら動くようになった。 マジか


bashで、数字を展開して並べる

ブレース展開

0から10まで展開

$ echo {0..10}
0 1 2 3 4 5 6 7 8 9 10

00から10まで展開

$ echo {00..10}
00 01 02 03 04 05 06 07 08 09 10

なにこれ超優秀じゃん


実は便利なブレース展開 - interprism's blog
bash のブレース展開機能の紹介と用例 - それマグで!
bashのブレース展開についてまとめ - Qiita

dateコマンドで、1時間後を求める

現在時刻の1時間後を求める

$ date +"%Y-%m-%d %H:%M:%S" -d "1 hour"


任意の日時の1時間後を求める

$ date +"%Y-%m-%d %H:%M:%S" -d "2020-07-15 22:33:44 1 hour"
2020-07-15 23:33:44


任意の日時は 時、分、秒を削っても認識される

$ date +"%Y-%m-%d %H:%M:%S" -d "2020-07-15 22 1 hour"
2020-07-15 23:00:00

プログラムの標準出力を別のプログラムの標準入力に渡す

ようするにパイプなんだけど、普通と違う書き方ができる

$ ls -l | grep hoge
$ ls -l > >(grep hoge)

上の2つはだいたい同じような意味合いを持つ

io redirection - bash exec sending output to a pipe, how? - Stack Overflow
bash-hackers.org - このウェブサイトは販売用です! - bash hackers リソースおよび情報

Process substitution

プロセスの標準入力や標準出力を取得できる機能

<(command) がcommandの標準出力
>(command) がcommandの標準入力

$ echo <(ls)
/dev/fd/63
※ lsの標準出力のディスクリプタを表示

$ cat <(ls)
hoge.sh   piyo.txt
※ lsの標準出力を表示 = lsの結果を表示


この機能と bashのexec と組み合わせると、次のようなことをしたいときに一つのスクリプトにまとめることができる

$ ./hoge.sh | column -t

hoge.shの中に、次のようにexecを書くことができる

#!/bin/bash

# 後処理したいプログラムをProcess substitutionで起動
exec > >(column -t)
EXECPID=$!

# ここに本来の処理

# 後処理プログラムの終了を待つ
exec 1<&-
wait $EXECPID


最後にwaitを入れないと、columnの出力が出切る前に本体が終了してプロンプトが出てしまうことがあり、少々みっともない
(パイプならそんなこと起きないんだけど)
Process substitution 先では標準入力が閉じられるまでプログラムは動き続けるので、メインの方で標準出力を閉じることで無事終了する。そして、それをwaitで拾う

shell - Redirect stderr and stdout in Bash - Stack Overflow

本当は wait と jobs を組み合わせて格好よくやりたかったけど、どうも Process substitution で作ったプロセスは jobs で表示されない仕様らしい。

vpncmd を非対話で使い、設定をファイルに保存する

vpncmd コマンドで設定ファイルの保存など、パスを指定するときは先頭の /// と書かないと正常に動かない

VPN Server>ConfigGet /tmp/hoge.txt
ConfigGet command - Get the current configuration of the VPN Server
The parameter "/tmp/hoge.txt" has been specified. It is not possible to specify this parameter when using the command "ConfigGet". Input "ConfigGet /HELP" to see the list of what parameters can be used.
VPN Server>ConfigGet //tmp/hoge.txt
ConfigGet command - Get the current configuration of the VPN Server
The command completed successfully.

6.3.42 "ConfigGet": VPN Server の現在のコンフィグレーションの取得

SoftEther VPNの設定をAnsibleで更新する - Qiita

/始まりをオプションと誤認しているっぽい感じ。
「パラメータがおかしいからちゃんとヘルプ読め」とか言われても、どこにもこんなこと書いてなくてだいぶ困った。