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.
今までこれだけミスったよ ( *´艸`)
という記録らしい。











