いったん 6:30 頃に起きるが早いのでトイレに行ってまた寝る。

8:00 起床。奇跡的に背中も腰も痛くない。どうしたのだ。 外は大雨だが洗濯日なので洗濯機を回す。乾燥時間を試験的に倍にする。 テレビを点けて納豆とバターロールを食う。 土曜なので仕事探しを気にする必要がなく気が楽だ。

Advanced Bash-Scripting Guide を読む。 その過程でハードディスクの使用率が 25 パーと妙に高いことが発覚。買って一年も経っていないのにだ。 調べると Windows Update のファイルが圧迫しているらしい。 もう要らないので OS のクリナップツールで掃除。プログレスバーがなかなか短くならないので期待大。

13:00 雨がひたすら降っている。おやつの買い出しは億劫。

しばらくして傘とレインパンツ足ハメ装備で外出。隅田公園で用を足してから買い出しに行く。

14:25 ローソンストア 100 言問橋店でおやつを調達。234 円。

  • 手巻きおにぎり焼鮭
  • ロングウィンナーパン粒マスタード
  • スイスロールコーヒー

徹子の部屋でも観るか。

17:00 外出。錦糸町へ直行。オリナス錦糸町の地下に移動。 タイトー F ステーションオリナス錦糸町店でゲームに興じる。生活保護費でいいのか。 悩みつつ熱くなって 5 クレも使った。

19:40 カスミオリナス錦糸町店で晩飯等を調達。やはりこの時間は安い。546 円。

  • 青椒肉絲&麻婆豆腐丼
  • 温玉冷やし讃岐
  • 野菜ジュース

20:00 ビッグエー墨田業平店で食料続きを調達。127 円。

  • 納豆 (3)
  • シュークリーム

20:15 部屋に戻る。ちょっとテレビが面白かったが一拍置いて入浴。 朝空けた野菜ジュースのペットボトルに風呂掃除用の洗剤を詰める。半分しか埋まらない。

20:45 晩飯。ベランダの洗濯物が乾いていない。

22:00 電話ボックスへ移動してインターネットに接続。 今晩も特に用事がないので Twitter を見回る。

22:50 部屋に戻る。麻雀の練習。

23:50 消灯。

Programming Notes

Advanced Bash-Scripting Guide を読む。

  • Chapter 28 Indirect References
    • eval newvar=\$$varname のような技法がある。
    • ${!variable}
  • Chapter 29 /dev and /proc
    • 本題とははずれるがコマンド df でディスク消費率がわかる。
    • /dev は物理デバイス、デバイスもどきのファイルからなる。
    • mount コマンドと /etc/fstab ファイルと関係がある。
    • /dev/tcp/$URL/80 などを指定してインターネットからファイルをダウンロードできる。 GET や HEAD などの HTTP リクエストをここにリダイレクトする。
    • /dev/dsp の実演コードがインパクトあり。シェルスクリプトで演奏ができるとは思わなかった。
    • /proc はファイルシステムもどき。面白い情報が得られる。
    • cat /proc/cpuinfo | grep "model name"
    • cat /proc/$PROCESS_ID/cmdline | xargs -0 echo
    • /proc 以下に何かを書くことは危険だ。
  • Chapter 30 Network Programming: Cygwin とインターネットのない孤島にいるため後回し。
  • Chapter 31 Of Zeros and Nulls
    • /dev/null は事実上書き込み専用のファイルだと考える。ブラックホール。
    • /dev/null を空ファイルのために用いることも考えられる。
      • cat /dev/null > newfile
      • : /dev/null > newfile: サブプロセスを生じない。
    • cat something &>/dev/null のようにして stdout と stderr の両方を吸い込ませる。 リダイレクトを二つ書くのが面倒なので。
    • ln -s /dev/null something という用例もある。ゴミ箱のようだ。
    • /dev/zero はバイナリー的にゼロのストリームを生じる。 やはり dd コマンドでコピーする用例が挙げられる。

      dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks
      
  • Chapter 32 Debugging
    • 空白文字を含むファイルを削除する例はおもしろい。
    • バグの分類もいい。
      • スクリプトが syntax error を含む。
      • スクリプトが期待通りに動作しない。
      • スクリプトが期待通りに動作するのだが、副作用がある。
    • シェルスクリプトにはデバッガーがないので、原始的なデバッグ技法を駆使するしかない。
    • シェルのオプションを利用する。set -OPTset -o OPTNAME などで指定してもよい。
      • -n オプションで構文チェックだけができる。
      • -v オプションで実行するコマンドの直前に命令を出力する。
      • -x オプションは実行直後に結果を出力する。
      • -u オプションで未定義変数の参照を咎める。
    • 関数として assert を自前で実装する。
    • LINEINFO, caller など使えるものを使う。
    • trap をうまく使う。trap 'command' EXIT などとする。
    • プログレスバーの例は正常終了と Ctrl+C の両方を試すこと。
      • ユーザーシグナルなるものがある。
    • trap 'command' DEBUG というのもある。
    • BASH_ から始まる変数を参照するのもよい。
  • Chapter 33 Options
    • オフにするには set +OPTset +o OPTNAME とする。
  • Chapter 34 Gotchas: 推奨されない practice 一覧
    • - を変数名や関数名に使用することは推奨されない。ファイル名と同じ感覚ではダメなのだ。
    • 文字列の比較演算子と数のそれとを混同しないように。
    • 何度も言及しているが、子プロセスで変数を export しても親プロセスや、それより上には影響しない。
    • Bash は文字列 // を正しく処理しない。例:cd //
  • Chapter 35 Scripting With Style
    • エラーコードを決めるのに /usr/include/sysexit.h が参考になる。
  • Chapter 36 Miscellany
    • 不要な cat に注意。
    • パイプをうまく使って処理効率を上げる。
    • Unicode サポートが要らないなら LC_ALL=C で処理効率を上げる。
    • expr よりも (( ... )) のほうが効率が良い。
    • 分岐の多い if 文よりも case 文。
    • ファイル入出力を最小化すること。Bash はそれが特にうまくはない。
    • スクリプトの先頭で PATHumask をリセットすることは可搬性を上げる。
    • 何かをパイプするときにはふつう 2>/dev/null すること。
  • Chapter 37 Bash, versions 2, 3, and 4
    • += で文字列連結ができる。PATH の設定に有用。
    • case 文で ;;& などが使える。
    • coproc でコルーチンのようなものが定義できる。
    • mapfile でファイルの中身を配列として参照できる。
    • ${var^}, ${var^^} で変数の一部または全部を大文字に変換する。
    • ${var,}, ${var,,} はその小文字版。
    • {start..stop..step}
    • globstar オプションを有効にすることで ** がサブディレクトリーを見に行く。
    • \u, \U プレフィックスによる Unicode サポート。Python 風。
    • 配列、文字列の要素を指すのに負の数を許す。Python 風。
  • Chapter 38 Endnotes: ここは読まなくていい