要約すると、クラス名ではなく、CSSセレクタの:nth-child
を使って階層の位置で表現すれば、削除したいElementを特定できるんじゃないかな、と思ってやってみたが、しんどくて諦めてます、という感じです。
RAID1の片方が逝ったのでストレージを差し替えた
久々にまともなネタが出来た。
以前、NASのためにRAID1を組んだが、とうとう壊れた模様。差し替え作業は初めてかもしれない。
mdadmを使っているが、これはオンラインのまま差し替えができるはず。やっていきましょう。
行ったストレージ交換の要点
cat /proc/mdstat
とmdadm --detail RAIDデバイス名
で faulty なストレージデバイスがないか確認するmdadm --remove RAIDデバイス名 ストレージデバイス名
でRAIDデバイスの構成から切り離すecho 1 > /sys/block/ストレージデバイス名/device/delete
でストレージデバイスを削除してLinuxの管理から外す(?)- ストレージデバイスを物理的に差し替える
- fdiskなどで新たなストレージデバイスが認識したことを確認する
mdadm --add RAIDデバイス名 ストレージデバイス名
でRAID構成に戻すcat /proc/mdstat
でちゃんと同期していることを確認する
マシンを止めることなくできた。
今回はRAIDデバイス名が/dev/md1
、ストレージデバイス名が/dev/sdd
(sdd
)です。
以下は作業ログとか駄文。
続きを読む文字列に含まれる複数の数値を考慮したソート
ディレクトリとファイルの整理をすることになって、ファイル名に基づいて連番を振るリネーム作業が必要になった。
2_0001.dat
、10_0001.dat
、10_0002.dat
だとか、10_aa.dat
、10_ab.dat
、といった感じのファイルをいい感じに並び替える必要があった。
見ての通り、ファイル名は複数の数値を含んでいたり、ゼロ埋めだったり、文字の連番('aa', 'ab)もあった。なので、これを考慮して並び替えたい。 (要はWindowsのファイル名の昇順と概ね同じ並びにしたい。)
GNU CoreUtils のsort
ではできないっぽいので、perlでこう書いた。
sub is_number { return $_[0] =~ /^\d+(?:\.\d+)?$/; } sub by_number{ my $pattern = qr/(\d+(?:\.\d+)?|\D+)/; my @a = ($a =~ /$pattern/g); my @b = ($b =~ /$pattern/g); for(my $i=0; $i<@a&&$i<@b; ++$i){ my $cmp = (is_number($a[$i]) && is_number($b[$i])) ? $a[$i] <=> $b[$i] : $a[$i] cmp $b[$i]; if($cmp){ return $cmp; } } return scalar(@a) <=> scalar(@b); } # 使用例 my @sorted_datalist = sort by_number @datalist;
で、クソコード書き終えてから気付いた。 数値は先頭ゼロを含めて同じ桁なら、文字比較でもうまくいくはずなので、「数値を0埋めして、後は文字比較する」でよい気がする。
sub by_number{ my $ta = $a; my $tb = $b; $ta =~ s/(\d+)/sprintf("%010d",$1)/eg; # 数値10桁を越えそうなら書き換える $tb =~ s/(\d+)/sprintf("%010d",$1)/eg; return $ta cmp $tb; }
で、これぐらいならワンライナーに落とせそうだったので落とした。入力は1行1ファイル名。
# `#`区切りで`ゼロ埋め文字列#元文字列`に変換して出力して、並び替えたら元の文字列の部分だけをして出す。 cat "target.txt" | perl -ne 'chomp; $t=$_; s/(\d+)/sprintf("%010d",$1)/eg; print "$_#$t\n"' | sort | cut -d '#' -f 2
もっと簡単な方法はありそう。