# 手抜き版 find hoge/ -type f -mtime -1 | tar cvf hoge_yesterday.tar.gz # ちゃんと動く版 find hoge/ -type f -mtime -1 -print0 | tar cvf hoge_yesterday.tar.gz --null -T -
再帰的にファイル内の文字列を検索して置換する
http://hoge.example.com を https://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で無用なインデントをさせない
TeraTermで、シリアルコンソールの画面サイズを変更したとき
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
検索したら結構メジャーなトラブルっぽかった