2013-11-24 :-)
_ 午後
1200 東京モーターショー未遂 || チケットはネットで購入済みだったんだが印刷して紙媒体を会場で提示しないといけないということに最寄り駅で気づいた || 戻ってからまた来るのも面倒くさいので来週にする
1300 不動産屋
1400 散歩
1600 ぐったり
_ [艦これ]艦これ
E-3 出撃してクリア。
2h くらいか。
出撃→ボス→完了→入渠でバケツ→出撃を繰り返した。
羅針盤的には戦艦x1 雷巡x2 軽空母x2 正規空母x1 が安定した。
装備は雷巡ハイパーズは夜戦に備えて連撃装備。空母たちは烈風 > 彗星 > {流星,天山} の配分で装備。
陣形は道中もボス戦も全部単縦。
7 回出撃して 4 回ボス戦。
昼戦で千代田が大破したので怖かったんだが夜戦へ突入。比叡さんが撃破してくれた。
歴戦の艦娘たち。結局この娘たちで連戦した。よくやってくれた。
いろいろゲット。
E-4 が開放されましたが、どうかなあ。
_ [NetBSD]/sbin/fastboot と /sbin/fasthalt を読む
/sbin/fastboot と /sbin/fasthalt
fastboot, fasthalt とはなんぞや。man を読む。
DESCRIPTION fastboot and fasthalt are shell scripts which reboot or halt the system, and when next started, the system will skip the normal the file systems checks. This is done by creating a file /fastboot, then invoking the reboot(8) program. The system startup script, /etc/rc, looks for this file and, if present, skips the normal invocation of fsck(8).
起動時に fsck をすっ飛ばすらしい。
コードを読む。
fastboot はこう。/fastboot というファイルを作り reboot する。touch /fastboot じゃダメなのかしら。
cp /dev/null /fastboot /sbin/reboot $*
fasthalt はこう。halt している以外は fastboot と同じ。
cp /dev/null /fastboot /sbin/halt $*
/etc/rc.d
man fastboot によると /etc/rc が /fastboot をチェックするらしい。
探す。3 箇所にある。
% grep -r fastboot /etc/* /etc/rc.d/fsck: if [ -e /fastboot ]; then /etc/rc.d/root: rm -f /fastboot /etc/rc.d/fsck_root: if [ -e /fastboot ]; then
/etc/rc.d/fsck はこう。
# PROVIDE: fsck # REQUIRE: localswap $_rc_subr_loaded . /etc/rc.subr name="fsck" start_cmd="fsck_start" stop_cmd=":" fsck_start() { # # ファイルがある場合は帰る # if [ -e /fastboot ]; then echo "Fast boot: skipping disk checks." return fi trap : 2 # Ignore SIGINT, SIGQUIT, so we trap : 3 # enter single-user mode on failure. echo "Starting file system checks:" fsck -x / $fsck_flags handle_fsck_error "$?" } load_rc_config $name run_rc_command "$1"
/etc/rc.d/root はこう。
# PROVIDE: root # REQUIRE: fsck_root $_rc_subr_loaded . /etc/rc.subr name="root" start_cmd="root_start" stop_cmd=":" root_start() { umount -a >/dev/null 2>&1 mount / # # 問答無用で削除 # rm -f /fastboot } load_rc_config $name run_rc_command "$1"
/etc/rc.d/fsck_root はこう。/etc/fstab を処理するらしい。
# PROVIDE: fsck_root $_rc_subr_loaded . /etc/rc.subr name="fsck_root" start_cmd="fsck_root_start" stop_cmd=":" fstab_file=/etc/fstab fsck_root_start() { if [ -e /fastboot ]; then echo "Fast boot: skipping disk checks." return fi trap : 2 # Ignore SIGINT, SIGQUIT, so we trap : 3 # enter single-user mode on failure. # Do nothing if root file system has fs_passno=0 in /etc/fstab, # or if root file system is not mentioned in /etc/fstab, or if # root file system seems to be a network mount. root_in_fstab=false while read fs_spec fs_file fs_vfstype fs_mntops fs_freq fs_passno do # skip comment or blank line case "${fs_spec}" in \#*|'') continue ;; esac # fs_freq and fs_passno default to 0 if not specified : ${fs_freq:=0} ${fs_passno:=0} case "${fs_file},${fs_passno}" in /,0) echo "Not checking /: fs_passno = 0 in ${fstab_file}" return ;; /,*) root_in_fstab=true case "${fs_spec}" in *:*) echo "Not checking /: network mount" return ;; esac ;; esac done < "${fstab_file}" if $root_in_fstab; then echo "Starting root file system check:" fsck $fsck_flags / handle_fsck_error "$?" return else echo "Not checking /: not listed in ${fstab_file}" fi } load_rc_config $name run_rc_command "$1"
/etc/rc.d/* のスクリプトを呼び出しているのは /etc/rc である。読む。
/etc/rc
# # ディレクトリにあるスクリプトを実行する # for _rc_elem in $files; do print_rc_metadata "cmd-name:$_rc_elem" run_rc_script $_rc_elem start print_rc_metadata "cmd-status:$_rc_elem:$?" done
スクリプトはファイル名順に run_rc_script に渡される。PROVIDE や REQUIRE を考慮したうえでスクリプトを実行するのだろう。
/etc/rc.d/root は /etc/rc.d/fsck_root を REQUIRE しているので
- /etc/rc.d/fsck_root
- /etc/rc.d/root
という順番で呼ばれると思われる。
_ [NetBSD]/usr/bin/cleantags を読む
RCS のタグから $ を削除。$Author は Author になる。どこで使うのかしらん。
#!/bin/sh # $NetBSD: cleantags.sh,v 1.2 2011/12/25 23:31:22 christos Exp $ # Remove the $'s from rcs tags PROG="$(basename "$0")" PAT='\$(Author|Date|CVSHeader|Header|Id|LocalId|Locker|Log|Name|RCSfile|Revision|Source|State|NetBSD)' verbose=false # # ここでひたすら置換する # dosed() { sed \ -e 's/\$\(Author.*\)\$/\1/' \ -e 's/\$\(Date.*\)\$/\1/' \ -e 's/\$\(CVSHeader.*\)\$/\1/' \ -e 's/\$\(Header.*\)\$/\1/' \ -e 's/\$\(Id.*\)\$/\1/' \ -e 's/\$\(LocalId.*\)\$/\1/' \ -e 's/\$\(Locker.*\)\$/\1/' \ -e 's/\$\(Log.*\)\$/\1/' \ -e 's/\$\(Name.*\)\$/\1/' \ -e 's/\$\(RCSfile.*\)\$/\1/' \ -e 's/\$\(Revision.*\)\$/\1/' \ -e 's/\$\(Source.*\)\$/\1/' \ -e 's/\$\(State.*\)\$/\1/' \ -e 's/\$\(NetBSD.*\)\$/\1/' \ "$1" > "/tmp/$PROG$$" && mv "/tmp/$PROG$$" "$1" if $verbose then echo "$1" fi } usage() { echo "Usage: $PROG [-v] <files>|<directories>" 1>&2 exit 1 } while getopts "v" f do case "$f" in v) verbose=true;; *) usage;; esac done shift "$(expr "$OPTIND" - 1)" if [ -z "$1" ] then usage fi # # 指定された引数をひたすら処理する # for i do if [ -d "$i" ] then # # find と while と read の組み合わせは試験に出る # find "$i" -type f -print0 | xargs -0 egrep -l "$PAT" | while read f do dosed "$f" done elif egrep -qs "$PAT" "$i" then dosed "$i" fi done
_ [NetBSD]/usr/bin/zdiff と /usr/bin/zcmp を読む
中身は同じ。
% diff -u /usr/bin/zdiff /usr/bin/zcmp
スクリプト冒頭で自分がどのスクリプトとして呼ばれたのかを判定し、処理を変える。こういう仕組みは zcmp や zdiff 以外にもいろいろなところで使われている。gcc もそうだっけ。
# Set $prog based on $0 case $0 in *cmp) prog=cmp ;; *) prog=diff ;; esac
スクリプトに与えられた引数の拡張子によって展開に使うコマンドを変える。
check_suffix() { case "$1" in *[._-][Zz]) setvar $2 "${1%??}" setvar $3 "gzip -cdqf" ;; *[._-]bz) setvar $2 "${1%???}" setvar $3 "bzip2 -cdqf" ;; *[._-]gz) setvar $2 "${1%???}" setvar $3 "gzip -cdqf" ;; *[._-]xz) setvar $2 "${1%???}" setvar $3 "xz -cdqf" ;; *[._-]bz2) setvar $2 "${1%????}" setvar $3 "bzip2 -cdqf" ;; *[._-]lzma) setvar $2 "${1%?????}" setvar $3 "xz -cdqf" ;; *.t[ag]z) setvar $2 "${1%??}"ar setvar $3 "gzip -cdqf" ;; *.tbz) setvar $2 "${1%??}"ar setvar $3 "bzip2 -cdqf" ;; *.tbz2) setvar $2 "${1%???}"ar setvar $3 "bzip2 -cdqf" ;; *.t[lx]z) setvar $2 "${1%??}"ar setvar $3 "xz -cdqf" ;; *) setvar $2 "$1" setvar $3 "" ;; esac }
# 引数のファイルが 1 つの場合は比較対象を標準入力から読む if [ $# -eq 1 ]; then # One file given, compare compressed to uncompressed files="$1" check_suffix "$1" files filt if [ -z "$filt" ]; then echo "z$prog: unknown suffix" 1>&2 exit 1 fi $filt -- "$1" | $prog $flags -- - "$files" status=$? elif [ $# -eq 2 ]; then # Two files given, compare the two uncompressing as needed # 展開に使うコマンドが filt に格納される # 展開したあとに cmp または diff を呼ぶ check_suffix "$1" files filt check_suffix "$2" files2 filt2 if [ -z "$filt" -a -z "$filt2" ]; then $prog $flags -- "$1" "$2" elif [ -z "$filt" -a -n "$filt2" -a "$1" != "-" ]; then $filt2 -- "$2" | $prog $flags -- "$1" - elif [ -n "$filt" -a -z "$filt2" -a "$2" != "-" ]; then $filt -- "$1" | $prog $flags -- - "$2" else tmp=`mktemp -t z$prog.XXXXXXXXXX` || exit 1 trap "rm -f $tmp" 0 1 2 3 13 15 ${filt2:-cat} -- "$2" > $tmp || exit $? ${filt:-cat} -- "$1" | $prog $flags -- - "$tmp" fi status=$? else echo "$USAGE" 1>&2 exit 1 fi
_ [NetBSD]/usr/bin/spell を読む
spell.sh は spellprog ( $SPELLPROG ) を呼びだす。
if [ -n "$HISTFILE" ]; then $DEROFF | sort -u | $SPELLPROG -o $TMP $STOP $STOP_LANG | \ $SPELLPROG $FLAGS $DICT $LANG $EXTRA | sort -u -k1f - $TMP | \ tee -a $HISTFILE who -m >> $HISTFILE else $DEROFF | sort -u | $SPELLPROG -o $TMP $STOP $STOP_LANG | \ $SPELLPROG $FLAGS $DICT $LANG $EXTRA | sort -u -k1f - $TMP fi
$DEROFF には deroff や detex が設定されている。roff などのタグを削除してから処理することになる。
$HISTFILE はキャッシュかと思ったがそうでもなく、たんに記録してるだけ? man spell を読む
-h spellhist Store misspelled words in the specified history file. The output of who -m is appended to the history file after the list of mis- spelled words.
今までこれだけミスったよ ( *´艸`)
という記録らしい。