揮発性のメモ2

知識をメモ書きしておく

再帰的にファイル内の文字列を検索して置換する

http://hoge.example.comhttps://hoge.example.com に置き換えるやつ

# findでやる方法
find . -type f | xargs sed -e 's/http:\/\/hoge\.example\.com/https:\/\/hoge.example.com/m' -i

# grepでやる方法
grep -rIl http://hoge.example.com . | xargs sed -e 's/http:\/\/hoge\.example\.com/https:\/\/hoge.example.com/m' -i

grepのオプション

-r 再帰
-I バイナリは無視
-l ファイル名表示だけ

findだと検索対象にバイナリも含んでしまうし、全ファイルのタイムスタンプが書き換わってしまう。
grepなら対象を選べるし、バイナリも除外できるし、タイムスタンプの更新も必要最小限にできるので、grepをちゃんと使おう

Cで、breakが使えるスコープを使う

#define blockscope  switch(0)default:


puts("hoge\n");
puts("piyo\n");

blockscope{
    puts("foo\n");
    puts("bar\n");
    if(baz==E_OK) break;
    puts("baz\n");
}

puts("fuga\n");

途中で小さいスコープを作ってbreakで脱出できるコードを書く方法で
switch(0)default:{
というイディオムを聞いた
本の虫: 今まで知らなかったswitch文の仕様

メリット1:書くのは1行だけでよい

for(;;){ }だとケツにbreakを入れる必要があるし、do{ }while(0);while(0)を書く必要がある。
この書き方なら非常にマクロを書きやすい

メリット2:continueが使えない

switch文なので、当然continueはエラーになってくれる

デメリット:見た目がキモい

まずCの構文に見えないのがキモい。
よく見ると switch(0)の直後に括弧が無いし、括弧の前のdefault:がタイポにしか見えないし、初見だとなんで動くのか10秒くらい思考が止まってしまう。


blog.robertelder.org
switch文のルナティックキモい使い方を集めた百鬼夜行みたいなページを見つけたので、あとで勉強する

vimで無用なインデントをさせない

vimで勝手にインデントしてしまう小さな親切を無効化する

:set noautoindent
:set nosmartindent
:set nocindent
:set indentexpr=
:set paste
noautoindent 普通のインデントを無効化
nosmartindent 賢いインデントを無効化
nocindent C言語用インデントを無効化
indentexpr= 言語ごとのインデントを無効化
paste すべてのインデントを一時無効化


stupiddog.jp
vim.fandom.com
vim-jp.org

aptで出力結果を編集することはできない

# apt search linux-headers | grep 4.9.82

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

注意:aptはちゃんとしたCLIを持ってないからスクリプトで使うときは気を付けてね


apt-cache search とか使う

続きを読む

TeraTermで、シリアルコンソールの画面サイズを変更したとき

TeratermでシリアルコンソールでLinuxに接続しているとき、画面サイズの変更は
sttyコマンドでおこなう

# stty size
24 80
# stty rows 48 columns 160
# stty size
48 160


linuxjm.osdn.jp

桁数は割とすぐ反映されるけど、行数はなんか反映されないことがある。
stty size で確認した結果となんか食い違っているときは「端末リセット」で直る

unpackは想像以上にメモリをたくさん消費する

PHPで500KB程度のバイナリファイルを1バイトずつ処理したかったので

<?
$array = unpack("C*", file_get_contents($argv[1]));
foreach($array as $a){

みたいなコードを書いていたら、メモリが足りないというエラーが出た

$ ./hoge.php hoge.bin
PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 20 bytes) in /tmp/hoge.php on line 3

なんで500KBをunpackしたら32MB超えるんだよ
と思って調べたところ、本当に超えていた

<?
ini_set('memory_limit', '128M'); // テスト用にメモリを拡張
echo("読出し前 ". memory_get_usage());

$text  = file_get_contents($argv[1]);
echo("読出し後 ". memory_get_usage());

$array = unpack("C*", $text);
echo("unpack後 ". memory_get_usage());
読出し前 117924
読出し後 618204
unpack後 38715820

(38715820-618204)/500000 = 76
概算で1バイトあたり76バイト使っている。(実際には管理領域とかあるので違うけど)
じゃあstr_split()でいこうと思ったら、もっと浪費していた。(概算92バイトくらい)

しかたがないので、1文字ずつ取り出してループするように変更

<?
$text = file_get_contents($argv[1]);
$size = strlen($text);
for($i=0; $i<$size; $i++){
    $a = ord(substr($text, $i, 1));


stackoverflow.com
検索したら結構メジャーなトラブルっぽかった