トップ «前の日記(2013-11-23) 最新 次の日記(2013-11-25)» 編集

ヨタの日々

2001|08|09|10|11|12|
2002|01|02|03|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2013-11-24 :-)

_ 午前

0930 起床

1020 おひる。カルボナーラ

1100 アニメ消化

_ 午後

1200 東京モーターショー未遂 || チケットはネットで購入済みだったんだが印刷して紙媒体を会場で提示しないといけないということに最寄り駅で気づいた || 戻ってからまた来るのも面倒くさいので来週にする

1300 不動産屋

1400 散歩

1600 ぐったり

IMG_3300

_

1800 コードリーディング

2130 飯

_ 買い物

amazon

4871481840

_ [艦これ]艦これ

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 しているので

  1. /etc/rc.d/fsck_root
  2. /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/clear を読む

tput clear を呼ぶ。そうなんだ

exec tput clear

_ [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.

今までこれだけミスったよ ( *´艸`)

という記録らしい。