2011年10月アーカイブ

今から21年前の1990年に出版された本なので「最新」の宇宙論ではないのかもしれないが、大変面白かった。

特に、ブラックホールとワームホールを実時間と虚時間で説明している部分が興味深かった。ブラックホールの蒸発に関する説明も分かりやすい。

巻末の佐藤勝彦氏と高柳雄一氏の対談も分かりやすくて面白い。この対談ももっと読みたいと思った。

翻訳本だが、一部、英語原文が掲載されているので、そちらも読むとよいと思う。

CentOS 5でlsコマンドのヘルプを見るためのコマンドは、

ls --help

となる。

ls --helpの実行結果は、以下の通り。

使用法: ls [オプション]... [ファイル]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort.

長いオプションに必須の引数は短いオプションにも必須です.
  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
      --author               with -l, print the author of each file
  -b, --escape               print octal escapes for nongraphic characters
      --block-size=SIZE      ブロックサイズを SIZE とする
  -B, --ignore-backups       末尾に '~' がつくファイルをリスト表示しない
  -c                          -lt 付き: ctime(最終更新時刻) でソートして表示
                              -l 付き:  ctime を表示する。名前でソートする
                              その他:   ctime でソートする
  -C                         list entries by columns
      --color[=WHEN]         control whether color is used to distinguish file
                               types.  WHEN may be `never', `always', or `auto'
  -d, --directory            list directory entries instead of contents,
                               and do not dereference symbolic links
  -D, --dired                generate output designed for Emacs' dired mode
  -f                         do not sort, enable -aU, disable -lst
  -F, --classify             append indicator (one of */=>@|) to entries
      --file-type            likewise, except do not append `*'
      --format=WORD          across -x, commas -m, horizontal -x, long -l,
                               single-column -1, verbose -l, vertical -C
      --full-time            like -l --time-style=full-iso
  -g                         like -l, but do not list owner
  -G, --no-group             like -l, but do not list group
  -h, --human-readable       with -l, print sizes in human readable format
                               (e.g., 1K 234M 2G)
      --si                   likewise, but use powers of 1000 not 1024
  -H, --dereference-command-line
                             follow symbolic links listed on the command line
      --dereference-command-line-symlink-to-dir
                             follow each command line symbolic link
                             that points to a directory
      --hide=PATTERN         do not list implied entries matching shell PATTERN
                               (overridden by -a or -A)
      --indicator-style=WORD append indicator with style WORD to entry names:
                               none (default), slash (-p),
                               file-type (--file-type), classify (-F)
  -i, --inode                with -l, print the index number of each file
  -I, --ignore=PATTERN       do not list implied entries matching shell PATTERN
  -k                         like --block-size=1K
  -l                         詳細リスト形式を表示する
  -L, --dereference          シンボリックリンクのファイル情報を表示するときは
                               リンクそのものではなくリンク参照先のファイル
                               情報を表示する
  -m                         項目のリストをカンマで区切り、一行に詰め込む
  -n, --numeric-uid-gid      like -l, but list numeric user and group IDs
  -N, --literal              print raw entry names (don't treat e.g. control
                               characters specially)
  -o                         like -l, but do not list group information
  -p, --indicator-style=slash
                             append / indicator to directories
  -q, --hide-control-chars   表示不可能な文字を ? に置き換える
      --show-control-chars   表示不可能な文字をそのまま表示 (プログラムが
                             `ls' でなかったり出力が端末でない場合の初期状態)
  -Q, --quote-name           ファイル名をダブルクォート(")で囲む
      --quoting-style=WORD   項目名のクォートに WORD 文字を使う:
                               literal, locale, shell, shell-always, c, escape
  -r, --reverse              reverse order while sorting
  -R, --recursive            list subdirectories recursively
  -s, --size                 with -l, print size of each file, in blocks
  -S                         sort by file size
      --sort=WORD            extension -X, none -U, size -S, time -t,
                             version -v, status -c, time -t, atime -u,
                             access -u, use -u
      --time=WORD            with -l, show time as WORD instead of modification
                             time: atime, access, use, ctime or status; use
                             specified time as sort key if --sort=time
      --time-style=STYLE     with -l, show times using style STYLE:
                             full-iso, long-iso, iso, locale, +FORMAT.
                             FORMAT is interpreted like `date'; if FORMAT is
                             FORMAT1<newline>FORMAT2, FORMAT1 applies to
                             non-recent files and FORMAT2 to recent files;
                             if STYLE is prefixed with `posix-', STYLE
                             takes effect only outside the POSIX locale
  -t                         sort by modification time
  -T, --tabsize=COLS         assume tab stops at each COLS instead of 8
  -u                         with -lt: sort by, and show, access time
                               with -l: show access time and sort by name
                               otherwise: sort by access time
  -U                         do not sort; list entries in directory order.
                             In combination with one_per_line format `-1',
                             it will show files immediately and it has no
                             memory limitations.
  -v                         sort by version
  -w, --width=COLS           assume screen width instead of current value
  -x                         list entries by lines instead of by columns
  -X                         sort alphabetically by entry extension
  -1                         list one file per line

SELinux options:

      --lcontext             Display security context.   Enable -l. Lines
                               will probably be too wide for most displays.
      -Z, --context          Display security context so it fits on most
                               displays.  Displays only mode, user, group,
                               security context and file name.
      --scontext             Display only security context and file name.


      --help     この使い方を表示して終了
      --version  バージョン情報を表示して終了

SIZE may be (or may be an integer optionally followed by) one of following:
kB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y.

By default, color is not used to distinguish types of files.  That is
equivalent to using --color=none.  Using the --color option without the
optional WHEN argument is equivalent to using --color=always.  With
--color=auto, color codes are output only if standard output is connected
to a terminal (tty).  The environment variable LS_COLORS can influence the
colors, and can be set easily by the dircolors command.

Exit status is 0 if OK, 1 if minor problems, 2 if serious trouble.

バグを発見したら <bug-coreutils@gnu.org> 宛に報告して下さい.

横浜市関内にある居酒屋「縁日 馬車道店」(神奈川県横浜市中区常盤町5-62 常盤ビル1〜2F)に入り、おでんのメニューを眺めていたら、大根、卵など普通のメニューに並んで、

プチトマト(150円)

というメニューがあった。

トマト大好きの私は早速注文した。

プチトマトのおでんというのは、初めてだったが、口に入れた瞬間にとても甘くて美味しい味が広がり、あまりの美味しさに、ひゃーっと驚きの声をあげてしまった。

プチトマトのおでん、かなり、うまい。

今度家で妻におでんを作ってもらう時には、プチトマトを鍋にたくさん入れてもらうことを相談してみようかなぁ。

マクロスフロンティアのランカ・リーが歌っていた蒼のエーテルをほぼ毎日聞いてしまう日々がもう何か月も続いている…。

何度聞いても飽きない。

静かな曲で、ランカ・リー役の中島愛(ナカジマメグミ)の透き通った声もよい。

歌詞の意味も考えさせられる。

特に、1番の

光は粒 そして波
あなたは鳥 そして宇宙

と、

2番の

未来は羽 そして鉛
私は水 そして炎

が好きだ。

歌詞の意味は深く考えないようにしているが、たまに意味を考えると興味深い。

「光は粒 そして波」と聞くたびに、もっと宇宙論を勉強したい、という気持ちになる。

「未来は羽 そして鉛(なまり)」については、できる限り、「羽」の方を想像するというポジティブな気持ちが大切である一方で、たまには「鉛」を想定した行動をとっておかないといけない、という気持ちにさせてくれる。

本当に蒼のエーテルを聞くと、心が落ち着いてくる。

処理完了までに長時間を要するコマンドを何も考えずに短時間で何回も実行したり、あるいは、プログラムの不具合等(無限ループ)で処理を終了できないコマンドを(何度か)実行したりすると、マシンレスポンスが大変遅くなる時がある。

例えば、PHPをコマンドを(何度か)実行して、マシンレスポンスが平常時よりも明らかに悪いな、と気づいた時に、topコマンドで確認すると、以下のようにPHPプロセスで埋め尽くされる場合がある。

top - 17:02:59 up 7 days,  3:27,  1 user,  load average: 170.59, 169.89, 169.52
Tasks: 575 total, 169 running, 397 sleeping,   0 stopped,   9 zombie
Cpu(s): 21.6% us, 78.4% sy,  0.0% ni,  0.0% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:    125004k total,   104492k used,    20512k free,     8168k buffers
Swap:  1052248k total,   475156k used,   577092k free,    18448k cached

  PID USER      PR  NI %CPU    TIME+  %MEM  VIRT  RES  SHR S COMMAND
 5628 root      25   0  0.7   6:39.34  0.0 16716   60   40 R php
 5641 root      25   0  0.7   6:46.84  0.0 16332   60   40 R php
 5702 root      25   0  0.7   6:38.05  0.1 17656   64   40 R php
 5738 root      25   0  0.7   6:41.04  0.0 16832   60   40 R php
 5769 root      25   0  0.7   6:44.95  0.0 17544   60   40 R php
 6017 root      25   0  0.7   6:04.96  0.0 16076   60   40 R php
 6047 root      25   0  0.7   5:46.14  0.0 16324   60   40 R php
 6127 root      25   0  0.7   5:43.95  0.0 17348   60   40 R php
 6166 root      25   0  0.7   5:45.65  0.0 17192   60   40 R php
 6211 root      25   0  0.7   5:40.16  0.0 17352   60   40 R php
 6263 root      25   0  0.7   5:35.56  0.0 17516   60   40 R php
 6417 root      25   0  0.7   5:15.69  0.0 17196   60   40 R php
 6526 root      25   0  0.7   5:11.16  0.1 17324   64   40 R php
 6548 root      25   0  0.7   5:10.15  0.0 17136   60   40 R php
 6600 root      25   0  0.7   5:04.20  0.0 17344   60   40 R php
 6618 root      25   0  0.7   5:07.56  0.0 16988   60   40 R php
 7016 root      25   0  0.7   4:39.77  0.0 17320   60   40 R php
 7022 root      25   0  0.7   4:37.17  0.0 17136   60   40 R php
 7040 root      25   0  0.7   4:49.47  0.0 17848   60   40 R php
 7080 root      25   0  0.7   4:34.80  0.0 16624   60   40 R php
 7084 root      25   0  0.7   4:36.57  0.0 17296   60   40 R php
 7091 root      25   0  0.7   4:33.77  0.1 16320   64   40 R php
 7140 root      25   0  0.7   4:22.07  0.0 17352   60   40 R php
 7143 root      25   0  0.7   4:34.96  0.0 17840   60   40 R php
 7146 root      25   0  0.7   4:22.20  0.0 16320   60   40 R php
 5599 root      25   0  0.6   6:41.58  0.0 16996   60   40 R php
 5640 root      25   0  0.6   6:42.57  0.0 17296   60   40 R php
 5703 root      25   0  0.6   6:47.25  0.1 16964   64   40 R php
 5739 root      25   0  0.6   6:43.13  0.0 17056   60   40 R php
 5742 root      25   0  0.6   6:54.77  0.0 16712   60   40 R php

さらに、psコマンドでPHPをgrepすると、以下のようにPHPプロセスが大量に実行中であることが分かる。

[root@nobuneko ~]# ps -ef | grep php
root      5599  5551  0 Oct05 ?        00:06:42 /usr/bin/php -q /var/www/html/nobuneko.php
root      5628  5564  0 Oct05 ?        00:06:40 /usr/bin/php -q /var/www/html/nobuneko.php
root      5640  5618  0 Oct05 ?        00:06:43 /usr/bin/php -q /var/www/html/nobuneko.php
root      5641  5620  0 Oct05 ?        00:06:47 /usr/bin/php -q /var/www/html/nobuneko.php
root      5702  5638  0 Oct05 ?        00:06:38 /usr/bin/php -q /var/www/html/nobuneko.php
root      5703  5649  0 Oct05 ?        00:06:48 /usr/bin/php -q /var/www/html/nobuneko.php
root      5738  5681  0 Oct05 ?        00:06:41 /usr/bin/php -q /var/www/html/nobuneko.php
root      5739  5708  0 Oct05 ?        00:06:44 /usr/bin/php -q /var/www/html/nobuneko.php
root      5740  5705  0 Oct05 ?        00:06:37 /usr/bin/php -q /var/www/html/nobuneko.php
root      5741  5665  0 Oct05 ?        00:06:39 /usr/bin/php -q /var/www/html/nobuneko.php
root      5742  5666  0 Oct05 ?        00:06:55 /usr/bin/php -q /var/www/html/nobuneko.php
root      5743  5709  0 Oct05 ?        00:06:52 /usr/bin/php -q /var/www/html/nobuneko.php
root      5759  5713  0 Oct05 ?        00:06:50 /usr/bin/php -q /var/www/html/nobuneko.php
root      5760  5714  0 Oct05 ?        00:06:41 /usr/bin/php -q /var/www/html/nobuneko.php
root      5768  5722  0 Oct05 ?        00:06:39 /usr/bin/php -q /var/www/html/nobuneko.php
root      5769  5724  0 Oct05 ?        00:06:45 /usr/bin/php -q /var/www/html/nobuneko.php
root      5846  5761  0 Oct05 ?        00:06:12 /usr/bin/php -q /var/www/html/nobuneko.php
root      5926  5828  0 Oct05 ?        00:06:07 /usr/bin/php -q /var/www/html/nobuneko.php
root      5927  5790  0 Oct05 ?        00:06:18 /usr/bin/php -q /var/www/html/nobuneko.php
root      5928  5827  0 Oct05 ?        00:06:19 /usr/bin/php -q /var/www/html/nobuneko.php
root      5929  5789  0 Oct05 ?        00:06:09 /usr/bin/php -q /var/www/html/nobuneko.php
root      5930  5826  0 Oct05 ?        00:06:21 /usr/bin/php -q /var/www/html/nobuneko.php
root      5931  5792  0 Oct05 ?        00:06:01 /usr/bin/php -q /var/www/html/nobuneko.php
root      5932  5829  0 Oct05 ?        00:06:26 /usr/bin/php -q /var/www/html/nobuneko.php
root      5960  5859  0 Oct05 ?        00:06:26 /usr/bin/php -q /var/www/html/nobuneko.php
root      5965  5872  0 Oct05 ?        00:06:07 /usr/bin/php -q /var/www/html/nobuneko.php
root      5966  5871  0 Oct05 ?        00:06:08 /usr/bin/php -q /var/www/html/nobuneko.php
root      5967  5870  0 Oct05 ?        00:06:19 /usr/bin/php -q /var/www/html/nobuneko.php
root      5971  5916  0 Oct05 ?        00:06:15 /usr/bin/php -q /var/www/html/nobuneko.php
root      5973  5940  0 Oct05 ?        00:06:16 /usr/bin/php -q /var/www/html/nobuneko.php
root      5975  5968  0 Oct05 ?        00:06:11 /usr/bin/php -q /var/www/html/nobuneko.php
root      5995  5983  0 Oct05 ?        00:06:11 /usr/bin/php -q /var/www/html/nobuneko.php
root      5997  5993  0 Oct05 ?        00:06:07 /usr/bin/php -q /var/www/html/nobuneko.php
root      6012  6009  0 Oct05 ?        00:06:03 /usr/bin/php -q /var/www/html/nobuneko.php
root      6017  6013  0 Oct05 ?        00:06:05 /usr/bin/php -q /var/www/html/nobuneko.php
root      6047  6040  0 Oct05 ?        00:05:47 /usr/bin/php -q /var/www/html/nobuneko.php
root      6060  6055  0 Oct05 ?        00:06:00 /usr/bin/php -q /var/www/html/nobuneko.php
root      6063  6058  0 Oct05 ?        00:05:46 /usr/bin/php -q /var/www/html/nobuneko.php
root      6076  6074  0 Oct05 ?        00:05:51 /usr/bin/php -q /var/www/html/nobuneko.php
root      6086  6081  0 Oct05 ?        00:05:53 /usr/bin/php -q /var/www/html/nobuneko.php
root      6092  6090  0 Oct05 ?        00:05:53 /usr/bin/php -q /var/www/html/nobuneko.php
root      6103  6101  0 Oct05 ?        00:05:47 /usr/bin/php -q /var/www/html/nobuneko.php
root      6112  6109  0 Oct05 ?        00:05:49 /usr/bin/php -q /var/www/html/nobuneko.php
root      6127  6125  0 Oct05 ?        00:05:44 /usr/bin/php -q /var/www/html/nobuneko.php
root      6135  6133  0 Oct05 ?        00:05:40 /usr/bin/php -q /var/www/html/nobuneko.php
root      6148  6143  0 Oct05 ?        00:05:44 /usr/bin/php -q /var/www/html/nobuneko.php
root      6158  6157  0 Oct05 ?        00:05:40 /usr/bin/php -q /var/www/html/nobuneko.php
root      6166  6165  0 Oct05 ?        00:05:46 /usr/bin/php -q /var/www/html/nobuneko.php
root      6181  6176  0 Oct05 ?        00:05:31 /usr/bin/php -q /var/www/html/nobuneko.php
root      6189  6188  0 Oct05 ?        00:05:28 /usr/bin/php -q /var/www/html/nobuneko.php
root      6199  6196  0 Oct05 ?        00:05:37 /usr/bin/php -q /var/www/html/nobuneko.php
root      6211  6208  0 Oct05 ?        00:05:41 /usr/bin/php -q /var/www/html/nobuneko.php
root      6222  6221  0 Oct05 ?        00:05:31 /usr/bin/php -q /var/www/html/nobuneko.php
root      6235  6232  0 Oct05 ?        00:05:34 /usr/bin/php -q /var/www/html/nobuneko.php
root      6245  6244  0 Oct05 ?        00:05:32 /usr/bin/php -q /var/www/html/nobuneko.php
root      6263  6260  0 Oct05 ?        00:05:36 /usr/bin/php -q /var/www/html/nobuneko.php
root      6286  6283  0 Oct05 ?        00:05:29 /usr/bin/php -q /var/www/html/nobuneko.php
root      6304  6303  0 Oct05 ?        00:05:14 /usr/bin/php -q /var/www/html/nobuneko.php
root      6310  6309  0 Oct05 ?        00:05:28 /usr/bin/php -q /var/www/html/nobuneko.php
root      6333  6329  0 00:01 ?        00:05:25 /usr/bin/php -q /var/www/html/nobuneko.php
root      6354  6353  0 00:02 ?        00:05:19 /usr/bin/php -q /var/www/html/nobuneko.php
root      6361  6357  0 00:03 ?        00:05:22 /usr/bin/php -q /var/www/html/nobuneko.php
root      6371  6370  0 00:04 ?        00:05:30 /usr/bin/php -q /var/www/html/nobuneko.php
root      6385  6383  0 00:05 ?        00:05:19 /usr/bin/php -q /var/www/html/nobuneko.php
root      6401  6400  0 00:06 ?        00:05:22 /usr/bin/php -q /var/www/html/nobuneko.php
root      6417  6413  0 00:07 ?        00:05:16 /usr/bin/php -q /var/www/html/nobuneko.php
root      6421  6420  0 00:08 ?        00:05:20 /usr/bin/php -q /var/www/html/nobuneko.php
root      6444  6433  0 00:10 ?        00:05:13 /usr/bin/php -q /var/www/html/nobuneko.php
root      6451  6446  0 00:11 ?        00:05:11 /usr/bin/php -q /var/www/html/nobuneko.php
root      6452  6450  0 00:11 ?        00:05:13 /usr/bin/php -q /var/www/html/nobuneko.php
root      6468  6467  0 00:12 ?        00:05:11 /usr/bin/php -q /var/www/html/nobuneko.php
root      6503  6502  0 00:13 ?        00:05:19 /usr/bin/php -q /var/www/html/nobuneko.php
root      6526  6524  0 00:15 ?        00:05:12 /usr/bin/php -q /var/www/html/nobuneko.php
root      6539  6536  0 00:16 ?        00:05:02 /usr/bin/php -q /var/www/html/nobuneko.php
root      6548  6545  0 00:17 ?        00:05:11 /usr/bin/php -q /var/www/html/nobuneko.php
root      6572  6571  0 00:20 ?        00:05:02 /usr/bin/php -q /var/www/html/nobuneko.php
root      6580  6579  0 00:21 ?        00:05:17 /usr/bin/php -q /var/www/html/nobuneko.php
root      6600  6597  0 00:23 ?        00:05:05 /usr/bin/php -q /var/www/html/nobuneko.php
root      6613  6611  0 00:24 ?        00:05:06 /usr/bin/php -q /var/www/html/nobuneko.php
root      6618  6617  0 00:25 ?        00:05:08 /usr/bin/php -q /var/www/html/nobuneko.php
root      6634  6632  0 00:27 ?        00:05:01 /usr/bin/php -q /var/www/html/nobuneko.php
root      6641  6638  0 00:28 ?        00:05:02 /usr/bin/php -q /var/www/html/nobuneko.php
root      6650  6649  0 00:29 ?        00:05:03 /usr/bin/php -q /var/www/html/nobuneko.php
root      6668  6665  0 00:31 ?        00:04:55 /usr/bin/php -q /var/www/html/nobuneko.php
root      6695  6692  0 00:34 ?        00:05:07 /usr/bin/php -q /var/www/html/nobuneko.php
root      6709  6708  0 00:35 ?        00:04:57 /usr/bin/php -q /var/www/html/nobuneko.php
root      6717  6716  0 00:36 ?        00:04:58 /usr/bin/php -q /var/www/html/nobuneko.php
root      6726  6724  0 00:37 ?        00:04:59 /usr/bin/php -q /var/www/html/nobuneko.php
root      6755  6751  0 00:40 ?        00:04:54 /usr/bin/php -q /var/www/html/nobuneko.php
root      6758  6757  0 00:40 ?        00:04:52 /usr/bin/php -q /var/www/html/nobuneko.php
root      6771  6769  0 00:41 ?        00:04:46 /usr/bin/php -q /var/www/html/nobuneko.php
root      6820  6819  0 00:45 ?        00:04:46 /usr/bin/php -q /var/www/html/nobuneko.php
root      6832  6831  0 00:46 ?        00:04:53 /usr/bin/php -q /var/www/html/nobuneko.php
root      6848  6847  0 00:47 ?        00:04:56 /usr/bin/php -q /var/www/html/nobuneko.php
root      6854  6852  0 00:48 ?        00:04:36 /usr/bin/php -q /var/www/html/nobuneko.php
root      6870  6869  0 00:49 ?        00:04:41 /usr/bin/php -q /var/www/html/nobuneko.php
root      6895  6892  0 00:50 ?        00:04:44 /usr/bin/php -q /var/www/html/nobuneko.php
root      6906  6905  0 00:51 ?        00:04:45 /usr/bin/php -q /var/www/html/nobuneko.php
root      6949  6946  0 00:52 ?        00:04:52 /usr/bin/php -q /var/www/html/nobuneko.php
root      6986  6985  0 00:53 ?        00:04:46 /usr/bin/php -q /var/www/html/nobuneko.php
root      7013  7012  0 00:54 ?        00:04:52 /usr/bin/php -q /var/www/html/nobuneko.php
root      7016  7015  0 00:55 ?        00:04:40 /usr/bin/php -q /var/www/html/nobuneko.php
root      7019  7018  0 00:56 ?        00:04:48 /usr/bin/php -q /var/www/html/nobuneko.php
root      7022  7021  0 00:57 ?        00:04:38 /usr/bin/php -q /var/www/html/nobuneko.php
root      7027  7026  0 00:58 ?        00:04:39 /usr/bin/php -q /var/www/html/nobuneko.php
root      7030  7029  0 00:59 ?        00:04:46 /usr/bin/php -q /var/www/html/nobuneko.php
root      7033  7032  0 01:00 ?        00:04:38 /usr/bin/php -q /var/www/html/nobuneko.php
root      7040  7037  0 01:01 ?        00:04:50 /usr/bin/php -q /var/www/html/nobuneko.php
root      7044  7043  0 01:02 ?        00:04:35 /usr/bin/php -q /var/www/html/nobuneko.php
root      7049  7048  0 01:03 ?        00:04:40 /usr/bin/php -q /var/www/html/nobuneko.php
root      7052  7051  0 01:04 ?        00:04:49 /usr/bin/php -q /var/www/html/nobuneko.php
root      7060  7058  0 01:05 ?        00:04:37 /usr/bin/php -q /var/www/html/nobuneko.php
root      7064  7063  0 01:06 ?        00:04:41 /usr/bin/php -q /var/www/html/nobuneko.php
root      7067  7066  0 01:07 ?        00:04:40 /usr/bin/php -q /var/www/html/nobuneko.php
root      7071  7070  0 01:08 ?        00:04:43 /usr/bin/php -q /var/www/html/nobuneko.php
root      7074  7073  0 01:09 ?        00:04:41 /usr/bin/php -q /var/www/html/nobuneko.php
root      7077  7076  0 01:10 ?        00:04:37 /usr/bin/php -q /var/www/html/nobuneko.php
root      7080  7079  0 01:11 ?        00:04:35 /usr/bin/php -q /var/www/html/nobuneko.php
root      7084  7083  0 01:12 ?        00:04:37 /usr/bin/php -q /var/www/html/nobuneko.php
root      7088  7087  0 01:13 ?        00:04:36 /usr/bin/php -q /var/www/html/nobuneko.php
root      7091  7090  0 01:14 ?        00:04:34 /usr/bin/php -q /var/www/html/nobuneko.php
root      7094  7093  0 01:15 ?        00:04:40 /usr/bin/php -q /var/www/html/nobuneko.php
root      7097  7096  0 01:16 ?        00:04:33 /usr/bin/php -q /var/www/html/nobuneko.php
root      7100  7099  0 01:17 ?        00:04:37 /usr/bin/php -q /var/www/html/nobuneko.php
root      7105  7104  0 01:18 ?        00:04:31 /usr/bin/php -q /var/www/html/nobuneko.php
root      7108  7107  0 01:19 ?        00:04:26 /usr/bin/php -q /var/www/html/nobuneko.php
root      7112  7111  0 01:20 ?        00:04:39 /usr/bin/php -q /var/www/html/nobuneko.php
root      7115  7114  0 01:21 ?        00:04:36 /usr/bin/php -q /var/www/html/nobuneko.php
root      7119  7118  0 01:22 ?        00:04:31 /usr/bin/php -q /var/www/html/nobuneko.php
root      7123  7122  0 01:23 ?        00:04:38 /usr/bin/php -q /var/www/html/nobuneko.php
root      7126  7125  0 01:24 ?        00:04:33 /usr/bin/php -q /var/www/html/nobuneko.php
root      7129  7128  0 01:25 ?        00:04:26 /usr/bin/php -q /var/www/html/nobuneko.php
root      7132  7131  0 01:26 ?        00:04:25 /usr/bin/php -q /var/www/html/nobuneko.php
root      7136  7135  0 01:27 ?        00:04:36 /usr/bin/php -q /var/www/html/nobuneko.php
root      7140  7139  0 01:28 ?        00:04:23 /usr/bin/php -q /var/www/html/nobuneko.php
root      7143  7142  0 01:29 ?        00:04:35 /usr/bin/php -q /var/www/html/nobuneko.php
root      7146  7145  0 01:30 ?        00:04:23 /usr/bin/php -q /var/www/html/nobuneko.php
root      7150  7149  0 01:31 ?        00:04:26 /usr/bin/php -q /var/www/html/nobuneko.php
root      7154  7152  0 01:32 ?        00:04:26 /usr/bin/php -q /var/www/html/nobuneko.php
root      7158  7157  0 01:33 ?        00:04:26 /usr/bin/php -q /var/www/html/nobuneko.php
root      7161  7160  0 01:34 ?        00:04:29 /usr/bin/php -q /var/www/html/nobuneko.php
root      7164  7163  0 01:35 ?        00:04:28 /usr/bin/php -q /var/www/html/nobuneko.php
root      7167  7166  0 01:36 ?        00:04:24 /usr/bin/php -q /var/www/html/nobuneko.php
root      7170  7169  0 01:37 ?        00:04:25 /usr/bin/php -q /var/www/html/nobuneko.php
root      7175  7174  0 01:38 ?        00:04:26 /usr/bin/php -q /var/www/html/nobuneko.php
root      7178  7177  0 01:39 ?        00:04:21 /usr/bin/php -q /var/www/html/nobuneko.php
root      7182  7181  0 01:40 ?        00:04:25 /usr/bin/php -q /var/www/html/nobuneko.php
root      7185  7184  0 01:41 ?        00:04:25 /usr/bin/php -q /var/www/html/nobuneko.php
root      7189  7187  0 01:42 ?        00:04:35 /usr/bin/php -q /var/www/html/nobuneko.php
root      7193  7192  0 01:43 ?        00:04:30 /usr/bin/php -q /var/www/html/nobuneko.php
root      7196  7195  0 01:44 ?        00:04:22 /usr/bin/php -q /var/www/html/nobuneko.php
root      7200  7199  0 01:45 ?        00:04:13 /usr/bin/php -q /var/www/html/nobuneko.php
root      7203  7202  0 01:46 ?        00:04:15 /usr/bin/php -q /var/www/html/nobuneko.php
root      7206  7205  0 01:47 ?        00:04:24 /usr/bin/php -q /var/www/html/nobuneko.php
root      7211  7210  0 01:48 ?        00:04:17 /usr/bin/php -q /var/www/html/nobuneko.php
root      7214  7213  0 01:49 ?        00:04:28 /usr/bin/php -q /var/www/html/nobuneko.php
root      7217  7216  0 01:50 ?        00:04:15 /usr/bin/php -q /var/www/html/nobuneko.php
root      7220  7219  0 01:51 ?        00:04:18 /usr/bin/php -q /var/www/html/nobuneko.php
root      7223  7222  0 01:52 ?        00:04:15 /usr/bin/php -q /var/www/html/nobuneko.php
root      7228  7227  0 01:53 ?        00:04:16 /usr/bin/php -q /var/www/html/nobuneko.php
root      7231  7230  0 01:54 ?        00:04:18 /usr/bin/php -q /var/www/html/nobuneko.php
root      7234  7233  0 01:55 ?        00:04:13 /usr/bin/php -q /var/www/html/nobuneko.php
root      7237  7236  0 01:56 ?        00:04:11 /usr/bin/php -q /var/www/html/nobuneko.php
root      7240  7239  0 01:57 ?        00:04:25 /usr/bin/php -q /var/www/html/nobuneko.php
root      7245  7244  0 01:58 ?        00:04:15 /usr/bin/php -q /var/www/html/nobuneko.php
root      7248  7247  0 01:59 ?        00:04:23 /usr/bin/php -q /var/www/html/nobuneko.php
root      7251  7250  0 02:00 ?        00:04:15 /usr/bin/php -q /var/www/html/nobuneko.php
root      7262  7261  0 02:02 ?        00:04:15 /usr/bin/php -q /var/www/html/nobuneko.php
root     13916 13913  0 17:05 ?        00:00:00 /usr/bin/php -q /var/www/html/nobuneko.php
root     13919 13843  0 17:05 pts/0    00:00:00 grep php

マシンレスポンスが悪化している問題を解決するために、実行されているコマンドを全て停止したい場合がある。

その場合の1つの方法は、プロセスIDを1つ1つ指定してkillすることだ。例えば、上記の例だと、以下のようにする。

kill 5599  5628  5640  5641  5702  5703  5738  5739  5740  5741  5742  5743  5759  5760  5768  5769  5846  5926  5927  5928  5929  5930  5931  5932  5960  5965  5966  5967  5971  5973  5975  5995  5997  6012  6017  6047  6060  6063  6076  6086  6092  6103  6112  6127  6135  6148  6158  6166  6181  6189  6199  6211  6222  6235  6245  6263  6286  6304  6310  6333  6354  6361  6371  6385  6401  6417  6421  6444  6451  6452  6468  6503  6526  6539  6548  6572  6580  6600  6613  6618  6634  6641  6650  6668  6695  6709  6717  6726  6755  6758  6771  6820  6832  6848  6854  6870  6895  6906  6949  6986  7013  7016  7019  7022  7027  7030  7033  7040  7044  7049  7052  7060  7064  7067  7071  7074  7077  7080  7084  7088  7091  7094  7097  7100  7105  7108  7112  7115  7119  7123  7126  7129  7132  7136  7140  7143  7146  7150  7154  7158  7161  7164  7167  7170  7175  7178  7182  7185  7189  7193  7196  7200  7203  7206  7211  7214  7217  7220  7223  7228  7231  7234  7237  7240  7245  7248  7251  7262  13916

しかし、この方法だと、プロセスIDを1つ1つ指定することが面倒であり、この指定する作業に時間がかかり、問題解決までの時間が長くなる。

プロセスIDを1つ1つ指定してkillする方法ではなく、実行中の同一コマンド名のプロセスを一括停止するという方法をとれば、書くコマンドが短くて済むので、問題解決までの時間を短縮できる。

実行中の同一コマンド名のプロセスを一括停止するには、

pkill -f 'コマンド名(の一部)'

とすればよい。

上記の例では、

pkill -f 'nobuneko.php'

を実行すればよい。

※もちろん、同じコマンド名のプロセスが処理を完了できずに大量に残ってしまう根本的な問題については、このpkillコマンド実行により解決したわけではないので、別途検討して対策を取る必要がある。

先日、出張先の某古本屋で、コンピュータ関連のコーナーに並んでいる書籍を眺めていた。
ウェブサイト制作に関する本が並んでいる棚に、
『T 多重ウェィブ』
というタイトルの本があった。

「多重ウェィブ」って何だろう?
と思って、興味を持ち本を棚から取り出し、本の表紙を見てびっくり。

本の表紙はカラー写真で、そこに写っていたのは、プロレスなどの格闘技をほとんど知らない私でも知っている有名人「アントニオ猪木」だった。

『T 多重ウェィブ』(アントニオ猪木×高田延彦×前田日明)という本の表紙を見て、明らかに格闘技の本だと思ったのだが、馬鹿な私は、やや真剣にこう考えてしまった。

「ひょっとしたら、アントニオ猪木がウェブサイトについて語る本なのだろうか。」

本をパラパラとちらっと眺めてみた。
私の馬鹿な予想は見事に外れた。
ウェブサイトとは全く関係がない、格闘技の本だった。
たぶん、この本をジャンル別の棚に陳列する際に、本のタイトルの一部である「ウェィブ」というカタカナを見た定員さんが、「ウェブ(=Web)」と早とちりして、ウェブサイトのコーナーに本を置いてしまったのだろう。
真剣に変な期待を持った私は、何て馬鹿なんだろう、と思いながらも、少し愉快な気分になった。

古本屋で本を探している時は、仕事等が原因で少し心が疲れていたので、この出来事のおかげで少し気分が楽になった。

この本を探している人にとっては、本当は良くないことなのだけれど、店員さんか客のイタズラなのか、本当に店員さんのミスなのかは分からないが、「ありがとう」という気持ちになった。

psqlでPostgreSQLに接続後、

\?

と入力して[Enter]キーを押すと、PostgreSQLのヘルプを表示することができる。

《例》Linux(CentOS 5)でヘルプを表示する方法と表示結果

[root@nobuneko ~]# psql -U postgres nobuneko_datanase
Welcome to psql 8.1.23, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

nobuneko_datanase=# \?
General
  \c[onnect] [DBNAME|- [USER]]
                 connect to new database (currently "nobuneko_datanase")
  \cd [DIR]      change the current working directory
  \copyright     show PostgreSQL usage and distribution terms
  \encoding [ENCODING]
                 show or set client encoding
  \h [NAME]      help on syntax of SQL commands, * for all commands
  \q             quit psql
  \set [NAME [VALUE]]
                 set internal variable, or list all if no parameters
  \timing        toggle timing of commands (currently off)
  \unset NAME    unset (delete) internal variable
  \! [COMMAND]   execute command in shell or start interactive shell

Query Buffer
  \e [FILE]      edit the query buffer (or file) with external editor
  \g [FILE]      send query buffer to server (and results to file or |pipe)
  \p             show the contents of the query buffer
  \r             reset (clear) the query buffer
  \s [FILE]      display history or save it to file
  \w FILE        write query buffer to file

Input/Output
  \echo [STRING] write string to standard output
  \i FILE        execute commands from file
  \o [FILE]      send all query results to file or |pipe
  \qecho [STRING]
                 write string to query output stream (see \o)

Informational
  \d [NAME]      describe table, index, sequence, or view
  \d{t|i|s|v|S} [PATTERN] (add "+" for more detail)
                 list tables/indexes/sequences/views/system tables
  \da [PATTERN]  list aggregate functions
  \db [PATTERN]  list tablespaces (add "+" for more detail)
  \dc [PATTERN]  list conversions
  \dC            list casts
  \dd [PATTERN]  show comment for object
  \dD [PATTERN]  list domains
  \df [PATTERN]  list functions (add "+" for more detail)
  \dg [PATTERN]  list groups
  \dn [PATTERN]  list schemas (add "+" for more detail)
  \do [NAME]     list operators
  \dl            list large objects, same as \lo_list
  \dp [PATTERN]  list table, view, and sequence access privileges
  \dT [PATTERN]  list data types (add "+" for more detail)
  \du [PATTERN]  list users
  \l             list all databases (add "+" for more detail)
  \z [PATTERN]   list table, view, and sequence access privileges (same as \dp)

Formatting
  \a             toggle between unaligned and aligned output mode
  \C [STRING]    set table title, or unset if none
  \f [STRING]    show or set field separator for unaligned query output
  \H             toggle HTML output mode (currently off)
  \pset NAME [VALUE]
                 set table output option
                 (NAME := {format|border|expanded|fieldsep|footer|null|
                 numericlocale|recordsep|tuples_only|title|tableattr|pager})
  \t             show only rows (currently off)
  \T [STRING]    set HTML <table> tag attributes, or unset if none
  \x             toggle expanded output (currently off)

Copy, Large Object
  \copy ...      perform SQL COPY with data stream to the client host
  \lo_export LOBOID FILE
  \lo_import FILE [COMMENT]
  \lo_list
  \lo_unlink LOBOID    large object operations

psqlであるデータベースに接続した後、別のデータベースへの接続に切り替えたい場合がある。
現在のデータベースへの接続を「\q」コマンドで切断後、、再度psqlで別のデータベースに接続する、といった方法もあるが、psqlでの切断、接続やり直し、といった流れが少しだけ面倒かもしれない。

少しでも手間を省くには、「\c」コマンドで接続先データベースを変更すればよい。

\c データベース名 ユーザ名

と入力し、[Enter]キーを押すことで、接続先データベースとユーザ名を変更できる。

ユーザ名の指定が不要である場合は、ユーザ名を指定せず、

\c データベース名

と入力してもよい。

《備考》PostgreSQL8.1のヘルプに記載されている情報
  \c[onnect] [DBNAME|- [USER]]
                 connect to new database (currently "nobuneko_datanase")
※このヘルプは、使用方法だけでなく、「currently "データベース名"」の部分で、現在の接続先データベース名まで確認できるので分かりやすい。

《例》Linux(CentOS 5)+PostgreSQL 8.1で接続先データベースを変更する方法
[root@nobuneko ~]# psql -U postgres nobuneko_database
Welcome to psql 8.1.23, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

nobuneko_database=# \l
                List of databases
           Name            |  Owner   | Encoding
---------------------------+----------+----------
 cat_database              | postgres | EUC_JP
 neko_database             | postgres | EUC_JP
 nobuneko_database         | postgres | EUC_JP
 postgres                  | postgres | UTF8
 template0                 | postgres | UTF8
 template1                 | postgres | UTF8
(6 rows)

「\c データベース名」でデータベースの接続先を他のデータベースに変更する例
《存在するデータベースを指定した場合》
nobuneko_database=# \c neko_database ※存在するデータベース「neko_database」を指定
You are now connected to database "neko_database". ※「データベース『neko_database』に接続されている」、とメッセージが出る。

《存在しないデータベースを指定した場合》
nobuneko_database=# \c test_database ※存在しないデータベース「test_database」を指定
FATAL:  database "test_database" does not exist ※データベース「test_database」は存在しないと警告が出る
Previous connection kept ※「これまでの接続が維持される」と警告が出る

「\c データベース名 ユーザ名」でデータベースの接続先を他のデータベースに変更する例
《存在するユーザを指定した場合》
neko_database=# \c cat_database postgres ※存在するユーザ「postgres」を指定
You are now connected to database "cat_database" as user "postgres". ※「データベース『cat_database』に、『postgres』ユーザとして接続されている」、とメッセージが出る。

《存在しないユーザを指定した場合》
neko_database=# \c cat_database testuser ※存在しないユーザ「testuser」を指定
FATAL:  role "testuser" does not exist ※ユーザ「testuser」は存在しないと警告が出る
Previous connection kept ※「これまでの接続が維持される」と警告が出る

5歳7ヶ月の娘は、魔法少女が主人公のアニメが大好きだ。

『魔法少女リリカルなのは』みたいなものなんかな、と何も考えずに観てみると、かなり暗いテーマのお話だった。

私はそれなりに楽しめたのだけれど、幼児向きではなかったからか、娘の反応は『魔法少女リリカルなのは』ほどではない。「魔法少女」というタイトルで私と同じような勘違いをして、子どもに見せることを考えている人は少し注意が必要。

しかし、DVD全6巻を一挙に見たが、娘は最後まで見ていたので、娘にとっても実は結構面白かったのかもしれない。


10月8日(土曜日)、10月9日(日曜日)、10月10日(月曜日・祝日)の3日間の休日を全て休んだ。

3日連続で休んだのは久しぶりだ。(そもそも1日も休みを取らずに3週間連続で勤務していたので、休日そのものが久しぶりだ。)

しかし、10月8日(土曜日)は、午前1時半まで岡山県で仕事をしていて、そこから自動車を運転して松山に戻ってきた。

帰宅したら午前5時を過ぎていた。いつもの社内残業で午前5時まで作業する疲労感よりも、車を運転する疲労感は比べ物にならないほど上だ。さらに新横浜駅から岡山駅まで3時間かけて新幹線で移動していたことでも疲れていた。

また、生活リズムを崩したくなかったので、朝5時に帰宅したとはいえ、居眠りはしつつも、なるべく起きていることにした。もし夕方まで寝てしまうと、次の日に早起きできなくなり、休みが終わって仕事に戻った時にかえってつらいからだ。

だから、10月8日(土曜日)は休みと言いつつも、1日中眠気と戦いながら疲労困憊で倒れていたので、休みを堪能できる余裕がなかった。

それでも、5歳7ヶ月の娘を少しでも楽しませるために、私が体力を使わない方法として、アニメDVDを一緒に観る、ということを行った(『魔法少女まどか☆マギカ』を一緒に観た)。
※私が娘のために、と思ったのも、朝私が午前5時から書斎でPC作業をしていると、やがて目が覚めた娘が、「お父ちゃん、おはよう」と物凄く嬉しそうに挨拶してきたからだ。この笑顔に打ちのめされてしまい、何かしてあげなくては、と思ってしまったのだ。

10月9日(日曜日)は、土曜日の疲労の余波が続いていたせいか、先週のように朝6時前後に目覚める、という早起きができず、9時半に起きてしまった。早起きができなかったことにショックを受ける。

昼からは娘が喜ぶであろうエミフルMASAKIのイベント(自衛隊の特殊車両、消防車、パトカーなどが展示されているイベント)に連れていった。

最初は、私も大変楽しめていたのだが、たった1時間外にいただけで、暑さもあったせいか、しんどい、と思うようになり、これ以上外にいると、倒れるなあぁ、と思ったので、途中から妻に娘を任せて、私はエミフル店内の椅子に座って体調回復に努めていた。

夕食後、かんぽの宿道後で温泉に入って疲れを癒そうとすると、極度に眠くなり、浴室内で寝てしまった。浴室内で寝てしまうのは久しぶりだ。これも疲れがたまり過ぎているからだろう。

帰宅して、しばらくは起きていたが、0時30分には起きていることの限界を感じ、ベッドに入った。

本日、10月10日は、朝9時半に目覚めてしまい、ショックだった。

朝6時には起きる、という習慣が2日連続で消え去っている。

今週、会社に遅刻したりしないだろうか。

自宅にいる時は、娘の幼稚園があるから強制的に起こしてもらえる環境があり、大丈夫なのだが、出張先のホテルで目覚めることができるかどうかが、不安になる。

今日はいつもよりさらに早く寝ようか・・・。

まだ疲れが残っているので、そうした方が良さそうだ。

psqlであるデータベースに接続した後、カレントディレクトリ(現在のディレクトリ/作業ディレクトリ)を変更したい場合がある。
そのような場合は、

\cd ディレクトリ名

と入力し、[Enter]キーを押すことで、カレントディレクトリを変更できる。

《備考》PostgreSQL8.1のヘルプに記載されている情報
  \cd [DIR]      change the current working directory

《例》Linux(CentOS 5)+PostgreSQL 8.1でカレントディレクトリを変更する方法
[root@nobuneko ~]# psql -U postgres nobuneko_database
Welcome to psql 8.1.23, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

nobuneko_database=# \cd /home/nobuneko ※/home/nobunekoをカレントディレクトリとする場合の例

約2ヶ月前の8月21日に電話機をWILLCOM W-ZERO3 WS003SH(S)に変更してから、ずっと怠けていたことがある。

それは、それまで使用していたW-ZERO3 [es] WS007SHに登録されていた電話帳データをWILLCOM W-ZERO3 WS003SH(S)に移行する作業だ。

移行していなかったので、アドレス帳には1件も登録がないまま、2ヶ月間を過ごしてきたことになる。

妻からは、

「電話がかかってきた時に、誰から電話がかかってきたか分からないと電話にとるのが怖くない?かける時にはどうするの?」

とか言われたのだが、

「電話がかかってくる人は決まっている人しかいないので、電話番号を見たら分かるから、怖くない。それに電話なんてほとんどかかってこない。かける時も同じ理由で問題ない。電話をかける相手は、よく電話がかかってくる相手と同一人物なのだから、着信履歴を見て電話をかければ問題ない。」と返事をしたこともある。

念のため、それまで使用していたW-ZERO3 [es] WS007SHも持ち歩いていたが、結局、それを使用して電話帳を見ることは、たぶん、この約2ヶ月の間一度もなかった。

もう永遠にこのままでもいいかも、と思っていたのだが、その気持ちが変わった。

本日、実家のNTT固定電話番号が廃止され、IP電話番号だけになった、という連絡メールが届いていることに気づき、さて、IP電話番号って何だろう、と思った。

私が記憶している電話番号は、実家のNTT固定電話番号、自分のPHSの電話番号、会社の連絡先の3つしかない。

何と、未だに妻の電話番号も、自宅のNTT固定電話番号も覚えていない。

だから、実家のIP電話番号などは覚えているわけがない。

妹に電話して聞こうと思ったのだが、妹の電話番号も覚えていない。

うーん、こうなると、もう諦めるしかない。面倒くさくてやる気になれなかったのだが、ついに、W-ZERO3 [es] WS007SHに登録されていた電話帳データをWILLCOM W-ZERO3 WS003SH(S)に移行する作業を行った。

※以下のサイトを参考にしながら、「PIM Backup application (v2.8.5)」というソフトウェアをPHS端末の計2台にインストールして、電話帳データの移行作業を行った。

【データ移行・前編】W-ZERO3シリーズからAdvanced/W-ZERO3[es]へ乗り換えるためのデータ移行方法
http://www.willcom-fan.com/wzero3/entries/tantan/000394/

PIM Backup - v2.8
http://www.pocketpcfreeware.com/en/index.php?soft=1806

PIM Backup application (v2.8.5)
http://www.dotfred.net/
※このサイトで、「Download PIM backup v2.8.5 for WM5 & WM6 (ZIP file)」というリンクより、PPCPimBackupV2.8.5_wm2005.zipというファイルをダウンロードした。

移行作業は、20分程度で完了した。

電話帳データには、妹の電話番号も実家のIP電話番号も入っていたので、これで困ることはないだろう。

何故、この20分という時間を私が面倒くさがっていたのか、他の人の感覚ではたぶん理解できないだろう。

娘と一緒にアニメDVDを何本も観る暇があったら、できないことはないだろう、と思われそうだが、アニメDVDは、ただ再生して眺めているだけで良いから楽なのだが、この電話帳移行作業はたとえ20分と言えども、自らが主体的に作業しないといけないし、多少頭を使わないといけない作業なので、私にとっては、ハードルが高かったのだ。

みっともない言い訳をしているが、この2ヶ月間の私には、その20分がしんどくてできなかった。

たぶん、今日何とか作業ができたのは、必要に迫られた、ということもあるが、3週間ぶりに休日がとれた、少し心に余裕ができた、という理由もあるかもしれない。

まだ肩がかなり痛いし、偏頭痛も残っているが、今朝までよりは随分マシになった。

PostgreSQLでの「\copyright」コマンドによる著作権表示の方法

psqlであるデータベースに接続した後、

\copyright

と入力し、[Enter]キーを押すことで、著作権(コピーライト)を表示できる。

《備考》PostgreSQL8.1のヘルプに記載されている情報
  \copyright     show PostgreSQL usage and distribution terms

《例》Linux(CentOS 5)+PostgreSQL 8.1で著作権(コピーライト)を表示する方法
[root@nobuneko ~]# psql -U postgres nobuneko_database
Welcome to psql 8.1.23, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

nobuneko_database=# \copyright
PostgreSQL Data Base Management System

Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group

This software is based on Postgres95, formerly known as Postgres, which
contains the following notice:

Portions Copyright(c) 1994, Regents of the University of California

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose, without fee, and without a written agreement
is hereby granted, provided that the above copyright notice and this paragraph
and the following two paragraphs appear in all copies.

IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST
PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.

THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE.THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS,
AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE,
SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.

Linuxコンソールの文字エンコーディングがUTF-8で、PostgreSQLデータベースがEUC_JPの場合、そのまま何も設定を変更することなくpsql接続をしてselectでテーブル内の日本語文字列を表示させようとすると、文字化けしてしまう。Linuxコンソールの文字エンコーディングとPostgreSQLのデータベースの文字コードが異なると文字化けしてしまうのだ。

Linuxコンソールの文字エンコーディングとPostgreSQLのデータベースの文字コードが異なる場合でも、Linuxコンソールで日本語文字列を文字化けなく表示させる方法の1つが、psqlコマンドを使用し、表示する文字のエンコーディングを変更し、Linuxコンソールの文字コードと同一にすることだ。

psqlであるデータベースに接続した後、

\encoding 文字コード

と入力し、[Enter]キーを押すことで、指定した文字コードに文字エンコーディングを変更することができる。

また、文字コードを指定せず、

\encoding

と入力し、[Enter]キーを押すことで、現在の文字エンコーディングを確認することもできる。

《備考》PostgreSQL8.1のヘルプに記載されている情報
  \encoding [ENCODING]
                 show or set client encoding

《例》Linux(CentOS 5)+PostgreSQL 8.1での現在の文字エンコーディングの確認と変更方法
[root@nobuneko ~]# psql -U postgres nobuneko_database
Welcome to psql 8.1.23, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

nobuneko_database=# \encoding
EUC_JP ※現在の文字エンコーディングがEUC_JPであることが分かる。
nobuneko_database=# \encoding UTF8 ※現在の文字エンコーディングをUTF-8に変更する。
nobuneko_database=# \encoding
UTF8 ※現在の文字エンコーディングがUTF-8であることが分かる。

※実行したコマンドは「\encoding UTF8」としたが、「\encoding UTF-8」としても同じ結果だった。
キーボードで「UTF」まで入力し、キーボードのTabキーを押すと、「UTF8」と入力補完されたので、PostgreSQL的には、「UTF-8」ではなく「UTF8」が正式なのだろう。

psqlで使用可能なSQLコマンドを確認したい時がある。

そのような場合、psqlでデータベースに接続後、

\h

と入力し、[Enter]キーを押すことで、使用可能なSQLコマンド一覧を表示することができる。

使用可能なSQLコマンドの全ての使用方法を確認したい場合は、

\h *

と入力し、[Enter]キーを押すと、使用可能なSQLコマンドの全ての使用方法を確認できる。

使用可能なSQLコマンドのうち指定したSQLコマンドのみの使用方法を確認したい場合は、

\h SQLコマンド名

と入力し、[Enter]キーを押すと、指定したSQLコマンドの使用方法を確認できる。

《備考》PostgreSQL8.1のヘルプに記載されている情報
  \h [NAME]      help on syntax of SQL commands, * for all commands

《例》Linux(CentOS 5)+PostgreSQL 8.1で使用可能なSQLコマンド一覧の表示と使用方法の確認方法
[root@nobuneko ~]# psql -U postgres nobuneko_database
Welcome to psql 8.1.23, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

nobuneko_database=# \h ※使用可能なSQLコマンドの全ての使用方法を確認する
Available help:
  ABORT                     CREATE LANGUAGE           DROP VIEW                
  ALTER AGGREGATE           CREATE OPERATOR CLASS     END                      
  ALTER CONVERSION          CREATE OPERATOR           EXECUTE                  
  ALTER DATABASE            CREATE ROLE               EXPLAIN                  
  ALTER DOMAIN              CREATE RULE               FETCH                    
  ALTER FUNCTION            CREATE SCHEMA             GRANT                    
  ALTER GROUP               CREATE SEQUENCE           INSERT                   
  ALTER INDEX               CREATE TABLE              LISTEN                   
  ALTER LANGUAGE            CREATE TABLE AS           LOAD                     
  ALTER OPERATOR CLASS      CREATE TABLESPACE         LOCK                     
  ALTER OPERATOR            CREATE TRIGGER            MOVE                     
  ALTER ROLE                CREATE TYPE               NOTIFY                   
  ALTER SCHEMA              CREATE USER               PREPARE                  
  ALTER SEQUENCE            CREATE VIEW               PREPARE TRANSACTION      
  ALTER TABLE               DEALLOCATE                REINDEX                  
  ALTER TABLESPACE          DECLARE                   RELEASE SAVEPOINT        
  ALTER TRIGGER             DELETE                    RESET                    
  ALTER TYPE                DROP AGGREGATE            REVOKE                   
  ALTER USER                DROP CAST                 ROLLBACK                 
  ANALYZE                   DROP CONVERSION           ROLLBACK PREPARED        
  BEGIN                     DROP DATABASE             ROLLBACK TO SAVEPOINT    
  CHECKPOINT                DROP DOMAIN               SAVEPOINT                
  CLOSE                     DROP FUNCTION             SELECT                   
  CLUSTER                   DROP GROUP                SELECT INTO              
  COMMENT                   DROP INDEX                SET                      
  COMMIT                    DROP LANGUAGE             SET CONSTRAINTS          
  COMMIT PREPARED           DROP OPERATOR CLASS       SET ROLE                 
  COPY                      DROP OPERATOR             SET SESSION AUTHORIZATION
  CREATE AGGREGATE          DROP ROLE                 SET TRANSACTION          
  CREATE CAST               DROP RULE                 SHOW                     
  CREATE CONSTRAINT TRIGGER DROP SCHEMA               START TRANSACTION        
  CREATE CONVERSION         DROP SEQUENCE             TRUNCATE                 
  CREATE DATABASE           DROP TABLE                UNLISTEN                 
  CREATE DOMAIN             DROP TABLESPACE           UPDATE                   
  CREATE FUNCTION           DROP TRIGGER              VACUUM                   
  CREATE GROUP              DROP TYPE                
  CREATE INDEX              DROP USER                

nobuneko_database=# \h * ※使用可能なSQLコマンドの全ての使用方法を確認する
Command:     ABORT
Description: abort the current transaction
Syntax:
ABORT [ WORK | TRANSACTION ]

Command:     ALTER AGGREGATE
Description: change the definition of an aggregate function
Syntax:
ALTER AGGREGATE name ( type ) RENAME TO new_name
ALTER AGGREGATE name ( type ) OWNER TO new_owner
ALTER AGGREGATE name ( type ) SET SCHEMA new_schema

Command:     ALTER CONVERSION
Description: change the definition of a conversion
Syntax:
ALTER CONVERSION name RENAME TO newname
ALTER CONVERSION name OWNER TO newowner

Command:     ALTER DATABASE
Description: change a database
Syntax:
ALTER DATABASE name [ [ WITH ] option [ ... ] ]

where option can be:

    CONNECTION LIMIT connlimit

ALTER DATABASE name SET parameter { TO | = } { value | DEFAULT }
ALTER DATABASE name RESET parameter

ALTER DATABASE name RENAME TO newname

ALTER DATABASE name OWNER TO new_owner

Command:     ALTER DOMAIN
Description: change the definition of a domain
Syntax:
ALTER DOMAIN name
    { SET DEFAULT expression | DROP DEFAULT }
ALTER DOMAIN name
    { SET | DROP } NOT NULL
ALTER DOMAIN name
    ADD domain_constraint
ALTER DOMAIN name
    DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]
ALTER DOMAIN name
    OWNER TO new_owner
ALTER DOMAIN name
    SET SCHEMA new_schema

Command:     ALTER FUNCTION
Description: change the definition of a function
Syntax:
ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )
    action [, ... ] [ RESTRICT ]
ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )
    RENAME TO new_name
ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )
    OWNER TO new_owner
ALTER FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )
    SET SCHEMA new_schema

where action is one of:

    CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
    IMMUTABLE | STABLE | VOLATILE
    [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER

Command:     ALTER GROUP
Description: change role name or membership
Syntax:
ALTER GROUP groupname ADD USER username [, ... ]
ALTER GROUP groupname DROP USER username [, ... ]

ALTER GROUP groupname RENAME TO newname

Command:     ALTER INDEX
Description: change the definition of an index
Syntax:
ALTER INDEX name RENAME TO new_name
ALTER INDEX name SET TABLESPACE tablespace_name

Command:     ALTER LANGUAGE
Description: change the definition of a procedural language
Syntax:
ALTER LANGUAGE name RENAME TO newname

Command:     ALTER OPERATOR CLASS
Description: change the definition of an operator class
Syntax:
ALTER OPERATOR CLASS name USING index_method RENAME TO newname
ALTER OPERATOR CLASS name USING index_method OWNER TO newowner

Command:     ALTER OPERATOR
Description: change the definition of an operator
Syntax:
ALTER OPERATOR name ( { lefttype | NONE } , { righttype | NONE } ) OWNER TO newowner

Command:     ALTER ROLE
Description: change a database role
Syntax:
ALTER ROLE name [ [ WITH ] option [ ... ] ]

where option can be:
   
      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | CREATEUSER | NOCREATEUSER
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
    | VALID UNTIL 'timestamp'

ALTER ROLE name RENAME TO newname

ALTER ROLE name SET parameter { TO | = } { value | DEFAULT }
ALTER ROLE name RESET parameter

Command:     ALTER SCHEMA
Description: change the definition of a schema
Syntax:
ALTER SCHEMA name RENAME TO newname
ALTER SCHEMA name OWNER TO newowner

Command:     ALTER SEQUENCE
Description: change the definition of a sequence generator
Syntax:
ALTER SEQUENCE name [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ RESTART [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
ALTER SEQUENCE name SET SCHEMA new_schema

Command:     ALTER TABLE
Description: change the definition of a table
Syntax:
ALTER TABLE [ ONLY ] name [ * ]
    action [, ... ]
ALTER TABLE [ ONLY ] name [ * ]
    RENAME [ COLUMN ] column TO new_column
ALTER TABLE name
    RENAME TO new_name
ALTER TABLE name
    SET SCHEMA new_schema

where action is one of:

    ADD [ COLUMN ] column type [ column_constraint [ ... ] ]
    DROP [ COLUMN ] column [ RESTRICT | CASCADE ]
    ALTER [ COLUMN ] column TYPE type [ USING expression ]
    ALTER [ COLUMN ] column SET DEFAULT expression
    ALTER [ COLUMN ] column DROP DEFAULT
    ALTER [ COLUMN ] column { SET | DROP } NOT NULL
    ALTER [ COLUMN ] column SET STATISTICS integer
    ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
    ADD table_constraint
    DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]
    DISABLE TRIGGER [ trigger_name | ALL | USER ]
    ENABLE TRIGGER [ trigger_name | ALL | USER ]
    CLUSTER ON index_name
    SET WITHOUT CLUSTER
    SET WITHOUT OIDS
    OWNER TO new_owner
    SET TABLESPACE new_tablespace

Command:     ALTER TABLESPACE
Description: change the definition of a tablespace
Syntax:
ALTER TABLESPACE name RENAME TO newname
ALTER TABLESPACE name OWNER TO newowner

Command:     ALTER TRIGGER
Description: change the definition of a trigger
Syntax:
ALTER TRIGGER name ON table RENAME TO newname

Command:     ALTER TYPE
Description: change the definition of a type
Syntax:
ALTER TYPE name OWNER TO new_owner
ALTER TYPE name SET SCHEMA new_schema

Command:     ALTER USER
Description: change a database role
Syntax:
ALTER USER name [ [ WITH ] option [ ... ] ]

where option can be:
   
      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | CREATEUSER | NOCREATEUSER
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
    | VALID UNTIL 'timestamp'

ALTER USER name RENAME TO newname

ALTER USER name SET parameter { TO | = } { value | DEFAULT }
ALTER USER name RESET parameter

Command:     ANALYZE
Description: collect statistics about a database
Syntax:
ANALYZE [ VERBOSE ] [ table [ (column [, ...] ) ] ]

Command:     BEGIN
Description: start a transaction block
Syntax:
BEGIN [ WORK | TRANSACTION ] [ transaction_mode [, ...] ]

where transaction_mode is one of:

    ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
    READ WRITE | READ ONLY

Command:     CHECKPOINT
Description: force a transaction log checkpoint
Syntax:
CHECKPOINT

Command:     CLOSE
Description: close a cursor
Syntax:
CLOSE name

Command:     CLUSTER
Description: cluster a table according to an index
Syntax:
CLUSTER indexname ON tablename
CLUSTER tablename
CLUSTER

Command:     COMMENT
Description: define or change the comment of an object
Syntax:
COMMENT ON
{
  TABLE object_name |
  COLUMN table_name.column_name |
  AGGREGATE agg_name (agg_type) |
  CAST (sourcetype AS targettype) |
  CONSTRAINT constraint_name ON table_name |
  CONVERSION object_name |
  DATABASE object_name |
  DOMAIN object_name |
  FUNCTION func_name ( [ [ argmode ] [ argname ] argtype [, ...] ] ) |
  INDEX object_name |
  LARGE OBJECT large_object_oid |
  OPERATOR op (leftoperand_type, rightoperand_type) |
  OPERATOR CLASS object_name USING index_method |
  [ PROCEDURAL ] LANGUAGE object_name |
  RULE rule_name ON table_name |
  SCHEMA object_name |
  SEQUENCE object_name |
  TRIGGER trigger_name ON table_name |
  TYPE object_name |
  VIEW object_name
} IS 'text'

Command:     COMMIT
Description: commit the current transaction
Syntax:
COMMIT [ WORK | TRANSACTION ]

Command:     COMMIT PREPARED
Description: commit a transaction that was earlier prepared for two-phase commit
Syntax:
COMMIT PREPARED transaction_id

Command:     COPY
Description: copy data between a file and a table
Syntax:
COPY tablename [ ( column [, ...] ) ]
    FROM { 'filename' | STDIN }
    [ [ WITH ]
          [ BINARY ]
          [ OIDS ]
          [ DELIMITER [ AS ] 'delimiter' ]
          [ NULL [ AS ] 'null string' ]
          [ CSV [ HEADER ]
                [ QUOTE [ AS ] 'quote' ]
                [ ESCAPE [ AS ] 'escape' ]
                [ FORCE NOT NULL column [, ...] ]

COPY tablename [ ( column [, ...] ) ]
    TO { 'filename' | STDOUT }
    [ [ WITH ]
          [ BINARY ]
          [ OIDS ]
          [ DELIMITER [ AS ] 'delimiter' ]
          [ NULL [ AS ] 'null string' ]
          [ CSV [ HEADER ]
                [ QUOTE [ AS ] 'quote' ]
                [ ESCAPE [ AS ] 'escape' ]
                [ FORCE QUOTE column [, ...] ]

Command:     CREATE AGGREGATE
Description: define a new aggregate function
Syntax:
CREATE AGGREGATE name (
    BASETYPE = input_data_type,
    SFUNC = sfunc,
    STYPE = state_data_type
    [ , FINALFUNC = ffunc ]
    [ , INITCOND = initial_condition ]
    [ , SORTOP = sort_operator ]
)

Command:     CREATE CAST
Description: define a new cast
Syntax:
CREATE CAST (sourcetype AS targettype)
    WITH FUNCTION funcname (argtypes)
    [ AS ASSIGNMENT | AS IMPLICIT ]

CREATE CAST (sourcetype AS targettype)
    WITHOUT FUNCTION
    [ AS ASSIGNMENT | AS IMPLICIT ]

Command:     CREATE CONSTRAINT TRIGGER
Description: define a new constraint trigger
Syntax:
CREATE CONSTRAINT TRIGGER name
    AFTER events ON
    tablename constraint attributes
    FOR EACH ROW EXECUTE PROCEDURE funcname ( args )

Command:     CREATE CONVERSION
Description: define a new encoding conversion
Syntax:
CREATE [DEFAULT] CONVERSION name
    FOR source_encoding TO dest_encoding FROM funcname

Command:     CREATE DATABASE
Description: create a new database
Syntax:
CREATE DATABASE name
    [ [ WITH ] [ OWNER [=] dbowner ]
           [ TEMPLATE [=] template ]
           [ ENCODING [=] encoding ]
           [ TABLESPACE [=] tablespace ]
           [ CONNECTION LIMIT [=] connlimit ] ]

Command:     CREATE DOMAIN
Description: define a new domain
Syntax:
CREATE DOMAIN name [AS] data_type
    [ DEFAULT expression ]
    [ constraint [ ... ] ]

where constraint is:

[ CONSTRAINT constraint_name ]
{ NOT NULL | NULL | CHECK (expression) }

Command:     CREATE FUNCTION
Description: define a new function
Syntax:
CREATE [ OR REPLACE ] FUNCTION
    name ( [ [ argmode ] [ argname ] argtype [, ...] ] )
    [ RETURNS rettype ]
  { LANGUAGE langname
    | IMMUTABLE | STABLE | VOLATILE
    | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
    | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
    | AS 'definition'
    | AS 'obj_file', 'link_symbol'
  } ...
    [ WITH ( attribute [, ...] ) ]

Command:     CREATE GROUP
Description: define a new database role
Syntax:
CREATE GROUP name [ [ WITH ] option [ ... ] ]

where option can be:
   
      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | CREATEUSER | NOCREATEUSER
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
    | VALID UNTIL 'timestamp'
    | IN ROLE rolename [, ...]
    | IN GROUP rolename [, ...]
    | ROLE rolename [, ...]
    | ADMIN rolename [, ...]
    | USER rolename [, ...]
    | SYSID uid

Command:     CREATE INDEX
Description: define a new index
Syntax:
CREATE [ UNIQUE ] INDEX name ON table [ USING method ]
    ( { column | ( expression ) } [ opclass ] [, ...] )
    [ TABLESPACE tablespace ]
    [ WHERE predicate ]

Command:     CREATE LANGUAGE
Description: define a new procedural language
Syntax:
CREATE [ PROCEDURAL ] LANGUAGE name
CREATE [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name
    HANDLER call_handler [ VALIDATOR valfunction ]

Command:     CREATE OPERATOR CLASS
Description: define a new operator class
Syntax:
CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type USING index_method AS
  {  OPERATOR strategy_number operator_name [ ( op_type, op_type ) ] [ RECHECK ]
   | FUNCTION support_number funcname ( argument_type [, ...] )
   | STORAGE storage_type
  } [, ... ]

Command:     CREATE OPERATOR
Description: define a new operator
Syntax:
CREATE OPERATOR name (
    PROCEDURE = funcname
    [, LEFTARG = lefttype ] [, RIGHTARG = righttype ]
    [, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]
    [, RESTRICT = res_proc ] [, JOIN = join_proc ]
    [, HASHES ] [, MERGES ]
    [, SORT1 = left_sort_op ] [, SORT2 = right_sort_op ]
    [, LTCMP = less_than_op ] [, GTCMP = greater_than_op ]
)

Command:     CREATE ROLE
Description: define a new database role
Syntax:
CREATE ROLE name [ [ WITH ] option [ ... ] ]

where option can be:
   
      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | CREATEUSER | NOCREATEUSER
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
    | VALID UNTIL 'timestamp'
    | IN ROLE rolename [, ...]
    | IN GROUP rolename [, ...]
    | ROLE rolename [, ...]
    | ADMIN rolename [, ...]
    | USER rolename [, ...]
    | SYSID uid

Command:     CREATE RULE
Description: define a new rewrite rule
Syntax:
CREATE [ OR REPLACE ] RULE name AS ON event
    TO table [ WHERE condition ]
    DO [ ALSO | INSTEAD ] { NOTHING | command | ( command ; command ... ) }

Command:     CREATE SCHEMA
Description: define a new schema
Syntax:
CREATE SCHEMA schemaname [ AUTHORIZATION username ] [ schema_element [ ... ] ]
CREATE SCHEMA AUTHORIZATION username [ schema_element [ ... ] ]

Command:     CREATE SEQUENCE
Description: define a new sequence generator
Syntax:
CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]

Command:     CREATE TABLE
Description: define a new table
Syntax:
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( [
  { column_name data_type [ DEFAULT default_expr ] [ column_constraint [ ... ] ]
    | table_constraint
    | LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ] }
    [, ... ]
] )
[ INHERITS ( parent_table [, ... ] ) ]
[ WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace ]

where column_constraint is:

[ CONSTRAINT constraint_name ]
{ NOT NULL |
  NULL |
  UNIQUE [ USING INDEX TABLESPACE tablespace ] |
  PRIMARY KEY [ USING INDEX TABLESPACE tablespace ] |
  CHECK (expression) |
  REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
    [ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

and table_constraint is:

[ CONSTRAINT constraint_name ]
{ UNIQUE ( column_name [, ... ] ) [ USING INDEX TABLESPACE tablespace ] |
  PRIMARY KEY ( column_name [, ... ] ) [ USING INDEX TABLESPACE tablespace ] |
  CHECK ( expression ) |
  FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
    [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

Command:     CREATE TABLE AS
Description: define a new table from the results of a query
Syntax:
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name
    [ (column_name [, ...] ) ] [ [ WITH | WITHOUT ] OIDS ]
    AS query

Command:     CREATE TABLESPACE
Description: define a new tablespace
Syntax:
CREATE TABLESPACE tablespacename [ OWNER username ] LOCATION 'directory'

Command:     CREATE TRIGGER
Description: define a new trigger
Syntax:
CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] }
    ON table [ FOR [ EACH ] { ROW | STATEMENT } ]
    EXECUTE PROCEDURE funcname ( arguments )

Command:     CREATE TYPE
Description: define a new data type
Syntax:
CREATE TYPE name AS
    ( attribute_name data_type [, ... ] )

CREATE TYPE name (
    INPUT = input_function,
    OUTPUT = output_function
    [ , RECEIVE = receive_function ]
    [ , SEND = send_function ]
    [ , ANALYZE = analyze_function ]
    [ , INTERNALLENGTH = { internallength | VARIABLE } ]
    [ , PASSEDBYVALUE ]
    [ , ALIGNMENT = alignment ]
    [ , STORAGE = storage ]
    [ , DEFAULT = default ]
    [ , ELEMENT = element ]
    [ , DELIMITER = delimiter ]
)

Command:     CREATE USER
Description: define a new database role
Syntax:
CREATE USER name [ [ WITH ] option [ ... ] ]

where option can be:
   
      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | CREATEUSER | NOCREATEUSER
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
    | VALID UNTIL 'timestamp'
    | IN ROLE rolename [, ...]
    | IN GROUP rolename [, ...]
    | ROLE rolename [, ...]
    | ADMIN rolename [, ...]
    | USER rolename [, ...]
    | SYSID uid

Command:     CREATE VIEW
Description: define a new view
Syntax:
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW name [ ( column_name [, ...] ) ]
    AS query

Command:     DEALLOCATE
Description: deallocate a prepared statement
Syntax:
DEALLOCATE [ PREPARE ] plan_name

Command:     DECLARE
Description: define a cursor
Syntax:
DECLARE name [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ]
    CURSOR [ { WITH | WITHOUT } HOLD ] FOR query
    [ FOR { READ ONLY | UPDATE [ OF column [, ...] ] } ]

Command:     DELETE
Description: delete rows of a table
Syntax:
DELETE FROM [ ONLY ] table
    [ USING usinglist ]
    [ WHERE condition ]

Command:     DROP AGGREGATE
Description: remove an aggregate function
Syntax:
DROP AGGREGATE name ( type ) [ CASCADE | RESTRICT ]

Command:     DROP CAST
Description: remove a cast
Syntax:
DROP CAST (sourcetype AS targettype) [ CASCADE | RESTRICT ]

Command:     DROP CONVERSION
Description: remove a conversion
Syntax:
DROP CONVERSION name [ CASCADE | RESTRICT ]

Command:     DROP DATABASE
Description: remove a database
Syntax:
DROP DATABASE name

Command:     DROP DOMAIN
Description: remove a domain
Syntax:
DROP DOMAIN name [, ...]  [ CASCADE | RESTRICT ]

Command:     DROP FUNCTION
Description: remove a function
Syntax:
DROP FUNCTION name ( [ [ argmode ] [ argname ] argtype [, ...] ] )
    [ CASCADE | RESTRICT ]

Command:     DROP GROUP
Description: remove a database role
Syntax:
DROP GROUP name [, ...]

Command:     DROP INDEX
Description: remove an index
Syntax:
DROP INDEX name [, ...] [ CASCADE | RESTRICT ]

Command:     DROP LANGUAGE
Description: remove a procedural language
Syntax:
DROP [ PROCEDURAL ] LANGUAGE name [ CASCADE | RESTRICT ]

Command:     DROP OPERATOR CLASS
Description: remove an operator class
Syntax:
DROP OPERATOR CLASS name USING index_method [ CASCADE | RESTRICT ]

Command:     DROP OPERATOR
Description: remove an operator
Syntax:
DROP OPERATOR name ( { lefttype | NONE } , { righttype | NONE } ) [ CASCADE | RESTRICT ]

Command:     DROP ROLE
Description: remove a database role
Syntax:
DROP ROLE name [, ...]

Command:     DROP RULE
Description: remove a rewrite rule
Syntax:
DROP RULE name ON relation [ CASCADE | RESTRICT ]

Command:     DROP SCHEMA
Description: remove a schema
Syntax:
DROP SCHEMA name [, ...] [ CASCADE | RESTRICT ]

Command:     DROP SEQUENCE
Description: remove a sequence
Syntax:
DROP SEQUENCE name [, ...] [ CASCADE | RESTRICT ]

Command:     DROP TABLE
Description: remove a table
Syntax:
DROP TABLE name [, ...] [ CASCADE | RESTRICT ]

Command:     DROP TABLESPACE
Description: remove a tablespace
Syntax:
DROP TABLESPACE tablespacename

Command:     DROP TRIGGER
Description: remove a trigger
Syntax:
DROP TRIGGER name ON table [ CASCADE | RESTRICT ]

Command:     DROP TYPE
Description: remove a data type
Syntax:
DROP TYPE name [, ...] [ CASCADE | RESTRICT ]

Command:     DROP USER
Description: remove a database role
Syntax:
DROP USER name [, ...]

Command:     DROP VIEW
Description: remove a view
Syntax:
DROP VIEW name [, ...] [ CASCADE | RESTRICT ]

Command:     END
Description: commit the current transaction
Syntax:
END [ WORK | TRANSACTION ]

Command:     EXECUTE
Description: execute a prepared statement
Syntax:
EXECUTE plan_name [ (parameter [, ...] ) ]

Command:     EXPLAIN
Description: show the execution plan of a statement
Syntax:
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement

Command:     FETCH
Description: retrieve rows from a query using a cursor
Syntax:
FETCH [ direction { FROM | IN } ] cursorname

where direction can be empty or one of:

    NEXT
    PRIOR
    FIRST
    LAST
    ABSOLUTE count
    RELATIVE count
    count
    ALL
    FORWARD
    FORWARD count
    FORWARD ALL
    BACKWARD
    BACKWARD count
    BACKWARD ALL

Command:     GRANT
Description: define access privileges
Syntax:
GRANT { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER }
    [,...] | ALL [ PRIVILEGES ] }
    ON [ TABLE ] tablename [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE dbname [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE langname [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schemaname [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespacename [, ...]
    TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT role [, ...] TO username [, ...] [ WITH ADMIN OPTION ]

Command:     INSERT
Description: create new rows in a table
Syntax:
INSERT INTO table [ ( column [, ...] ) ]
    { DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) | query }

Command:     LISTEN
Description: listen for a notification
Syntax:
LISTEN name

Command:     LOAD
Description: load or reload a shared library file
Syntax:
LOAD 'filename'

Command:     LOCK
Description: lock a table
Syntax:
LOCK [ TABLE ] name [, ...] [ IN lockmode MODE ] [ NOWAIT ]

where lockmode is one of:

    ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE
    | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE

Command:     MOVE
Description: position a cursor
Syntax:
MOVE [ direction { FROM | IN } ] cursorname

Command:     NOTIFY
Description: generate a notification
Syntax:
NOTIFY name

Command:     PREPARE
Description: prepare a statement for execution
Syntax:
PREPARE plan_name [ (datatype [, ...] ) ] AS statement

Command:     PREPARE TRANSACTION
Description: prepare the current transaction for two-phase commit
Syntax:
PREPARE TRANSACTION transaction_id

Command:     REINDEX
Description: rebuild indexes
Syntax:
REINDEX { INDEX | TABLE | DATABASE | SYSTEM } name [ FORCE ]

Command:     RELEASE SAVEPOINT
Description: destroy a previously defined savepoint
Syntax:
RELEASE [ SAVEPOINT ] savepoint_name

Command:     RESET
Description: restore the value of a run-time parameter to the default value
Syntax:
RESET name
RESET ALL

Command:     REVOKE
Description: remove access privileges
Syntax:
REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | DELETE | RULE | REFERENCES | TRIGGER }
    [,...] | ALL [ PRIVILEGES ] }
    ON [ TABLE ] tablename [, ...]
    FROM { username | GROUP groupname | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE dbname [, ...]
    FROM { username | GROUP groupname | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { EXECUTE | ALL [ PRIVILEGES ] }
    ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...]
    FROM { username | GROUP groupname | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE langname [, ...]
    FROM { username | GROUP groupname | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schemaname [, ...]
    FROM { username | GROUP groupname | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespacename [, ...]
    FROM { username | GROUP groupname | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ ADMIN OPTION FOR ]
    role [, ...] FROM username [, ...]
    [ CASCADE | RESTRICT ]

Command:     ROLLBACK
Description: abort the current transaction
Syntax:
ROLLBACK [ WORK | TRANSACTION ]

Command:     ROLLBACK PREPARED
Description: cancel a transaction that was earlier prepared for two-phase commit
Syntax:
ROLLBACK PREPARED transaction_id

Command:     ROLLBACK TO SAVEPOINT
Description: roll back to a savepoint
Syntax:
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name

Command:     SAVEPOINT
Description: define a new savepoint within the current transaction
Syntax:
SAVEPOINT savepoint_name

Command:     SELECT
Description: retrieve rows from a table or view
Syntax:
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
    * | expression [ AS output_name ] [, ...]
    [ FROM from_item [, ...] ]
    [ WHERE condition ]
    [ GROUP BY expression [, ...] ]
    [ HAVING condition [, ...] ]
    [ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]
    [ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ]
    [ LIMIT { count | ALL } ]
    [ OFFSET start ]
    [ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] ]

where from_item can be one of:

    [ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
    ( select ) [ AS ] alias [ ( column_alias [, ...] ) ]
    function_name ( [ argument [, ...] ] ) [ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ]
    function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )
    from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]

Command:     SELECT INTO
Description: define a new table from the results of a query
Syntax:
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
    * | expression [ AS output_name ] [, ...]
    INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table
    [ FROM from_item [, ...] ]
    [ WHERE condition ]
    [ GROUP BY expression [, ...] ]
    [ HAVING condition [, ...] ]
    [ { UNION | INTERSECT | EXCEPT } [ ALL ] select ]
    [ ORDER BY expression [ ASC | DESC | USING operator ] [, ...] ]
    [ LIMIT { count | ALL } ]
    [ OFFSET start ]
    [ FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ] ]

Command:     SET
Description: change a run-time parameter
Syntax:
SET [ SESSION | LOCAL ] name { TO | = } { value | 'value' | DEFAULT }
SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT }

Command:     SET CONSTRAINTS
Description: set constraint checking modes for the current transaction
Syntax:
SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }

Command:     SET ROLE
Description: set the current user identifier of the current session
Syntax:
SET [ SESSION | LOCAL ] ROLE rolename
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE

Command:     SET SESSION AUTHORIZATION
Description: set the session user identifier and the current user identifier of the current session
Syntax:
SET [ SESSION | LOCAL ] SESSION AUTHORIZATION username
SET [ SESSION | LOCAL ] SESSION AUTHORIZATION DEFAULT
RESET SESSION AUTHORIZATION

Command:     SET TRANSACTION
Description: set the characteristics of the current transaction
Syntax:
SET TRANSACTION transaction_mode [, ...]
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]

where transaction_mode is one of:

    ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
    READ WRITE | READ ONLY

Command:     SHOW
Description: show the value of a run-time parameter
Syntax:
SHOW name
SHOW ALL

Command:     START TRANSACTION
Description: start a transaction block
Syntax:
START TRANSACTION [ transaction_mode [, ...] ]

where transaction_mode is one of:

    ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
    READ WRITE | READ ONLY

Command:     TRUNCATE
Description: empty a table or set of tables
Syntax:
TRUNCATE [ TABLE ] name [, ...]

Command:     UNLISTEN
Description: stop listening for a notification
Syntax:
UNLISTEN { name | * }

Command:     UPDATE
Description: update rows of a table
Syntax:
UPDATE [ ONLY ] table SET column = { expression | DEFAULT } [, ...]
    [ FROM fromlist ]
    [ WHERE condition ]

Command:     VACUUM
Description: garbage-collect and optionally analyze a database
Syntax:
VACUUM [ FULL | FREEZE ] [ VERBOSE ] [ table ]
VACUUM [ FULL | FREEZE ] [ VERBOSE ] ANALYZE [ table [ (column [, ...] ) ] ]

nobuneko_database=#
nobuneko_database=# \h ABORT ※指定したSQLコマンドのみの使用方法を確認したい場合
Command:     ABORT
Description: abort the current transaction
Syntax:
ABORT [ WORK | TRANSACTION ]

Windows Server 2003でのタスク画面の開き方
[スタート]→[アクセサリ]→[システム ツール]→[タスク]でタスク画面を開くことができる。

Windows Server 2003でのタスク実行履歴の確認方法
タスク画面(上部)のメニューバーより[詳細設定(N)]→[ログを表示]でタスク実行履歴を確認できる。
※通常はメモ帳が開き、以下のようなログを確認できる。

"nobunekoテストバッチ.job" (nobuneko_test.bat)
 開始 2011/10/13 23:00:00
"nobunekoテストバッチ.job" (nobuneko_test.bat)
 完了 2011/10/13 23:07:18
 結果: タスクは次の終了コードで完了しました: (0).
"nobunekoテストバッチ.job" (nobuneko_test.bat)
 開始 2011/10/13 23:30:00
"nobunekoテストバッチ.job" (nobuneko_test.bat)
 完了 2011/10/13 23:37:17
 結果: タスクは次の終了コードで完了しました: (0).

上記例では、「nobunekoテストバッチ」がタスク名となる。
実行履歴の形式(フォーマット)は以下になるようだ。

"タスク名.job" (タスクが実行するプログラムファイル名)
 完了 西暦年/月/日 時間(24時間表記):分:秒
 結果: メッセージ: (コードの番号).

※タスクの実行履歴は、永遠に履歴が蓄積されるの仕様ではなく、古い履歴が削除される仕様なので、少し時間が経過した後で過去のタスク実行履歴を見たいと思っている場合は、要注意。

昨日(10月13日)、iPod touchの新カラー(ホワイト)が発売された。

カメラがついているけれど、70万画素しかない。

せめて200万画素程度あれば迷わず買いそうなんだけれど、微妙だ。

カメラはなかったことにしてiOSで遊ぶことだけを目的にしても面白そうなので、どうするかは迷い中。

先日、出張前にこれを買おうと検討していることを妻に言うと、

「そんなに持ち歩くものを増やしてどうするの?ノートPC、PHS2台(W-ZERO3とW-ZERO3 es)、Amazon Kindle、PSPってあるのに、さらにiPod touch?荷物がまた重くなるし、なくしたら、大損するよ。」

と言われてしまった。

うーん、たしかに。

そういえば、PSPは持ち歩いていても仕事が忙しすぎてゲームする暇が全くなく、PSPで音楽を聴くのもちょっと面倒になってしまって、全く使用しない日々が続いていた。

妻の言う「なくしたら、大損するよ」という言葉がすごく気になり、使ってもいないのに持ち歩いていてなくした、という事態になったらアホらしい、と思った。そこで、今回の出張ではもうPSPは自宅に置いてきた。(本当にたまにすると、少し気晴らしになるんだけどね。)

iPod touchを本気で欲しいと思っているのかどうかは自分でもよく分からなくなってきたが、仕事が忙しいと言っている割には、2時間もAmazonや色々なサイトを見てiPod touchの購入を検討してしまった。

iPhone4sは、たぶんお金の問題で買えないのだろうけれど、これなら1万6千円程度で買えるので…うーん、どうしようかなぁ。

PostgreSQL 8.4.7のインストール後、早速PostgreSQLを起動しようとすると、

/var/lib/pgsql/data is missing

というエラーが出てしまう。

/var/lib/pgsql/dataディレクトリには、postgresql.conf、pg_hba.confなどPostgreSQLの設定に必要な重要なファイルが入っているので、/var/lib/pgsql/dataが存在しないのであればPostgreSQLが起動できない、という理由は納得できる。

《例》/var/lib/pgsql/data is missingというエラーが出る
[root@nobuneko ~]# /etc/rc.d/init.d/postgresql status
postmaster は停止しています
[root@nobuneko ~]# /etc/rc.d/init.d/postgresql start

/var/lib/pgsql/data is missing. Use "service postgresql initdb" to initialize the cluster first.
                                                           [失敗]

「クラスタを初期化するために『service postgresql initdb』を実行してくさださい」、という警告メッセージに素直に従ってinitdbを実行すると、無事にPostgreSQLサービスを起動できる。

《例》initdbを実行する
[root@nobuneko ~]# service postgresql initdb
データベースを初期化中:                                    [  OK  ]
[root@nobuneko ~]#
[root@nobuneko ~]# /etc/rc.d/init.d/postgresql start
postgresql サービスを開始中:                               [  OK  ]

※initdbを実行することで、/var/lib/pgsql/data配下のディレクトリ、ファイルが作成される。PostgreSQLインストール直後に、PostgreSQLを起動する際に「/var/lib/pgsql/data is missing」というエラーメッセージが出る場合は、このようにinitdbを実行していないことに原因があるので、initdbを実行すればこの問題は解決する。

《注》今回例に挙げたPostgreSQL 8.4.7は、CentOS 6.0で、yumでPostgreSQLをパッケージインストールしたもの。

あるサーバから、別のサーバのPostgreSQLデータベースにpsql接続を試みた時に、接続に失敗する場合がある。

《例》サーバA(neko/192.168.2.3)からサーバB(nobuneko/192.168.2.4)のPostgreSQLデータベースにpsql接続を試みた場合

1)psql -U postgres -h 192.168.2.4で接続できないことを確認
[root@neko ~]# psql -U postgres -h 192.168.2.4
psql: could not connect to server: ホストへの経路がありません
        Is the server running on host "192.168.2.4" and accepting
        TCP/IP connections on port 5432?

2)/var/lib/pgsql/data/postgresql.confのlisten_addressesに*(アスタリスク)が設定されていることを確認
[root@nobuneko ~]# cd /var/lib/pgsql/data
[root@nobuneko data]# cat postgresql.conf | grep listen
listen_addresses = '*'          # what IP address(es) to listen on;
※listen_addressesに*(アスタリスク)が設定されているので、IPアドレスによる接続制限がないことを確認。

3)/var/lib/pgsql/data/pg_hba.confでの設定内容を確認。
[root@nobuneko data]# vi pg_hba.conf
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# "local" is for Unix domain socket connections only
local   all         all                               trust
# IPv4 local connections:
host    all         all         127.0.0.1/32          trust
host    all         all         192.168.2.0/24        trust
# IPv6 local connections:
host    all         all         ::1/128               ident

※接続元サーバが所属するネットワーク(「192.168.2.0/24」)の接続元が許可されていることを確認。

4)SELinuxが無効(Disabled)になっていることを確認
[root@nobuneko ~]# getenforce
Disabled

念のため、SELinuxの設定ファイルも確認。

[root@nobuneko ~]# cat /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

通常であれば、上記1)〜4)の設定のどこかに問題があり、それらの設定を変更することで問題は解決するのだが、上記だけでは解決しない場合は、iptablesの設定も確認する。

5)iptablesの設定を確認
[root@nobuneko ~]# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
[root@nobuneko ~]# vi /etc/sysconfig/iptables

※SSH接続で使用するTCP 22番ポートは許可されているが、psql接続で使用するTCP 5432番ポートは許可されていないことを確認。

psql接続で使用するTCP 5432番ポートを許可する設定

-A INPUT -m state --state NEW -m tcp -p tcp --dport 5432 -j ACCEPT

を追記する。

[root@nobuneko ~]# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5432 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

※iptablesを再起動し、設定を反映させる。
[root@nobuneko ~]# /etc/rc.d/init.d/iptables restart
iptables: ファイアウォールルールを消去中:                  [  OK  ]
iptables: チェインをポリシー ACCEPT へ設定中filter         [  OK  ]
iptables: モジュールを取り外し中:                          [  OK  ]
iptables: ファイアウォールルールを適用中:                  [  OK  ]

psql接続ができない原因がiptablesの設定だった場合は、psqlが使用するポート番号を許可し、iptablesを再起動すれば解決する。

《注》今回例に挙げたPostgreSQL 8.4.7は、CentOS 6.0で、yumでPostgreSQLをパッケージインストールしたもの。

createdbを実行すると、

createdb: データベースの生成に失敗しました: ERROR: 符号化方式 EUC_JP がロケール ja_JP.UTF-8 に合いません

といったエラーになることがある。

エラーメッセージから原因がほぼ分かるが、要するに、ロケールの文字コードと作成するDBの文字コードが異なるためにエラーが出ているようだ。

1)createdb失敗時のエラーメッセージ(標準出力)を確認
[root@nobuneko ~]# createdb -U postgres -E EUC_JP nobuneko_database
createdb: データベースの生成に失敗しました: ERROR:  符号化方式 EUC_JP がロケール ja_JP.UTF-8 に合いません
DETAIL:  選択された LC_CTYPE を設定するには、符号化方式 UTF8 である必要があります。

2)createdb失敗時にpg_log配下に出力されるエラーログを確認
[root@nobuneko pg_log]# cat /var/lib/pgsql/data/pg_log/postgresql-Thu.log
ERROR:  符号化方式 EUC_JP がロケール ja_JP.UTF-8 に合いません
詳細:  選択された LC_CTYPE を設定するには、符号化方式 UTF8 である必要があります。
ステートメント:  CREATE DATABASE nobuneko_database ENCODING 'EUC_JP';

3)データベース一覧を表示して文字コードを確認する。
[root@nobuneko ~]# psql -U postgres
psql (8.4.7)
"help" でヘルプを表示します.

postgres=# \l
                                         データベース一覧
   名前    |  所有者  | エンコーディング |  照合順序   | Ctype(変換演算子) |      アクセス権
-----------+----------+------------------+-------------+-------------------+-----------------------
 postgres  | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       |
 template0 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres
                                                                           : postgres=CTc/postgres
 template1 | postgres | UTF8             | ja_JP.UTF-8 | ja_JP.UTF-8       | =c/postgres
                                                                           : postgres=CTc/postgres
(3 行)

4)ロケールとテンプレートを指定してcreatedbを実行する。

[root@nobuneko ~]# createdb -U postgres -E EUC_JP --locale=ja_JP.EUC_JP nobuneko_database --template=template0

5)データベースの作成に成功した場合、作成したデータベースにpsql接続ができるかを確認する。
[root@nobuneko ~]# psql -U postgres nobuneko_database
psql (8.4.7)
"help" でヘルプを表示します.

nobuneko_database=# \q

※上記の4)の結果、createdbができるようになっていれば、createdbが失敗した原因が、ロケールとテンプレート指定の問題である、ということが分かる。

Googleアカウントを長年持っていて、Google Analyticsなどのサービスを無料で利用させてもらっているのだが、ずっと使っていなかった機能がある。

それは、Gmail(Googleの無料のメールサービス)だ。

プロバイダのメールアドレスは、DION(現auone-net)、@niftyの2つもあったし、全く使ってはいないが独自ドメインのメールアドレスもあるので、これ以上メールアドレスを増やすのは面倒だと思っていたし、@niftyのWebメールが私にとってはかなり便利なので、Gmailを利用する必要性が感じられなかったのだ。

しかし、最近購入したiPod Touchが大変便利な存在になってきており、メールの送受信機能がついていたことから、iPod Touchでメールもしたい、という思いが強くなってきて、検討の結果、iPod TouchでGmailを利用することにした。

iPod Touchでは、実は@niftyメールも利用できるのだが、以下の2つの理由でGmailを利用することにした。

(1)iPod Touchのメール機能には標準でGmailの設定が登録されており、メールの設定が簡単そうだった。

※@niftyメールも、自分で設定を追加すれば、利用できるようだが、少しだけ設定が面倒。

《参考》@niftyの公式サイト:
iPhone、iPod touchのメールアプリで@niftyのメール設定を教えてほしい。
http://qa.nifty.com/cs/catalog/faq_qa/qid_4237/1.htm?category2=69&category1=63&keyword=iphone

(2)@niftyメールに届くメールは、私のPHSのメールアドレス宛にも転送される設定にしているので、iPod Touchで@niftyメールを利用する頻度が高まる結果になれば、それはPHSに転送されるメールも増えることになり、それは嫌だなぁ、と思った。

※個人的には(1)よりも(2)の理由の方が重要度が高い。

既にGoogleアカウントを持っていたので、Gmailの登録は1〜2分程度で完了した。

さて、Googleのサービスは長年利用しているし、時々、Googleから郵送物まで自宅に届いているにもかかわらず、同じGoogleアカウントを使用したGmailのメールアカウント取得にも自分の電話番号による電話認証が必要だった。おそらく世界中からGmailのメールアカウントを不正に登録しようとする人が多くて、仕方なくこのような堅牢な対策をすることになったのだろう。

少し感動したのは、携帯電話のメールアドレスのドメインを選択するセレクトメニューにDDI Pocket時代から存在する「pdx.ne.jp」があったことだ。私はその時代からのPHSユーザなので嬉しい。(もちろん現ウィルコムのドメイン「willcom.com」も選択できる。)

そして、かなりびっくりしたのが、電話番号による認証だ。

携帯電話の電話番号を入力する欄があり、私はそこにPHSの電話番号を入力した。

それから、[確認]だったか、[認証]だったか、そんな名称のボタンをクリックした。この次に起きることは、「まさかなぁ」と半信半疑だったのだが、私のPHSに電話がかかってきた。

私のPHSの画面には、謎の電話番号「5853624115」から着信中である、と表示されている。

川崎市の初めて泊まったホテルの部屋に真夜中に一人でいる、ということもあり、何だかホラー映画の一場面を今まさに自分が体験しているのではないか、という錯覚を覚えてしまうほど怖くて、ほんのしばらく、リーンと鳴るPHSの画面を茫然と眺めてしまった。

数コール鳴った後で、「まぁ、Googleからの電話だろうから、怖がることはないかぁ」と冷静さを取り戻し、思い切って電話をとってみた。
すると、機械的な女性の録音音声で、何桁かの数字が読み上げられた。
緊張していたせいもあり、1回目だけでは聞き取れなかったが、自動的に繰り返し読み上げてくれたので、2回目でようやく聞き取れた。
その聞き取った番号をGmailの登録画面で入力すると、Gmailの登録が完了した。

昔はこんな凄い認証機能はなかったのだろうけれど、私のようにこれから新しくGmailユーザになる人は、少しだけ勇気が必要かもしれない。
また、Gmailは無料サービスであるにもかかわらず、認証時にPHSや携帯電話に電話をかける仕組みになっているので、Googleが支払う電話代金は大変な金額になっているのだろう、と思い、やはりGoogleは凄いなぁ、と感心した。

Gmail登録完了後の数分後にはiPod Touchでのメール設定もあっさりと完了し、私のiPod TouchでのGmailの利用が始まった。

iPod Touchのおかげで、ようやくGmailを利用する気になった。

これから、どんどん活用していきたい。

※以下は、VMware Player 3.1にCentOS 6.0を仮想OSとしてインストールする簡易的な手順(メモ)となる。

1.VMware Playerを起動する。

2.メニューバーの[ファイル (F)]より、[新規仮想マシンの作成 (C) …]をクリックする。
 (「新しい仮想マシン ウィザード」が表示される。)

3.「新規仮想マシン作成ウィザードへようこそ」画面の「インストール元:」で「後でOSをインストール (S)」(仮想マシンは、空のハードディスクを1つ持つように作成されます)を選択する。

[次へ (N) >]をクリックする。

 ※「インストーラディスク イメージ ファイル (M)(iso)」を選択すると、「CentOS 64ビット が検出されました。このOSは簡易インストールを使用します。」と表示されるので、こちらの方がインストールが簡単そうだと思って当初はそのまま進めてしまった。その結果、たしかにインストールは簡単に終わったのだが、CentOSが英語版でインストールされてしまった。英語版を日本語版に設定し直せばよかったのかもしれないが、その手順を検討するのが面倒だったので、やり直すことにした。

4.「ゲストOSの選択」画面で「この仮想マシンにどのOSをインストールしますか。」と表示されるので、「ゲストOS」で「Linux」を選択し、「バージョン (V)」で「CentOS 64 ビット」を選択し、[次へ (N) >]をクリックする。

5.「仮想マシンの名前」画面で「仮想マシンに使用する名前を指定してください。」と表示されるので、「仮想マシン名(V):」に適当な名称を入力する。

※デフォルトでは、前画面の「ゲストOSの選択」で選択した「バージョン (V)」と同一の名称「CentOS 64 ビット」が入力されていた。
※同画面では「格納場所 (L)」も指定することができる。
デフォルトではWindowsのログインユーザ名のマイ ドキュメント配下に作成されるようだ。
《例》Windowsのログインユーザ名がAdministratorの場合
C:\Documents and Settings\Administrator\My Documents\My Virtual Machines\CentOS 64 ビット

「仮想マシン名(V):」と「格納場所 (L)」の入力内容を確認後、[次へ (N) >]をクリックする。

6.「ディスク容量の指定」画面で「このディスクのサイズを指定してください。」と表示されるので、「ディスク最大サイズ (S) (GB)」でディスク容量を指定する。

※ディスク容量は、100MB単位で設定できるようだった。
同画面には「CentOS 64 ビットの推奨サイズ:20GB」と表示されていた。20GB以上だったらいいのかな、と思い、「100GB」としてみる。

※試しに、「ディスク最大サイズ (S) (GB)」で、0を指定すると、「指定されたディスク サイズは、この仮想ディスクに許可されたサイズを下回っています。0.1〜2040.0GBの範囲でサイズを指定してください。」という警告が表示された。

「仮想ディスクを単一ファイルとして格納 (O)」と「仮想ディスクを複数のファイルに分割 (M)」のどちらかを選択しないといけないのだが、「ディスクを分割すると、仮想マシンを別のコンピュータに容易に移動できるようになりますが、非常に大きなディスクではパフォーマンスが低下する可能性があります。」と同画面に記述されており、インストールするPCのスペックがあまり良くないことも考慮して、「仮想ディスクを単一ファイルとして格納 (O)」を選択する。
※デフォルトの選択は「仮想ディスクを単一ファイルとして格納 (O)」になっていた。

[次へ (N) >]をクリックする。

7.「仮想マシンを作成する準備完了」画面で「仮想マシンは次の設定で作成されます:」の下に表示される内容を確認する。

ハードウェアを変更したい場合は、[ハードウェアをカスタマイズ (C)]をクリックし、「メモリ」、「プロセッサ」(CPU)の設定を変更する。

[完了]をクリックする。
(※以上で仮想マシンの作成が終了するが、この段階ではCentOS 6はインストールされていない。)

8.作成された仮想マシン名を右クリックで選択し、「仮想マシンの再生」をクリックする。

「Operating System not found」と表示され、画面下部に「CentOS 64 ビットはこの仮想マシンにインストールされていません。インストール ディスクを挿入し、[仮想マシン再起動]をクリックしてください。」と表示される。

[CD/DVDの設定を変更]をクリックする。
「CD/DVD(IDE)」画面の「接続」欄で「ISOイメージファイルを使用する(M)」を選択し、[参照 (B)]をクリックして、「CentOS 64 ビット」のインストールに使用するISOファイルを指定する。

「CD/DVD(IDE)」画面下部の[OK]をクリックする。

[仮想マシンを再起動]をクリックする。

9.CentOS 6.0の設定を画面の指示に従って適宜行う

※以下は私のかなり適当な設定例。

仮想マシンの再起動が完了すると、「Welcome to CentOS 6.0!」画面が表示される。
 Install or upgrade an existing system
 Install system with basic video driver
 Rescue installed system
 Boot from local drive
 Memory test
という5つの選択肢より、「Install or upgrade an existing system」を選択し、[Enter]キーを押す。

CUIのCentOS 6のインストール画面が表示される。
「Welcome to CentOS for X86_64」画面が表示されたら、画面の指示に従ってインストールを進める。

「Disc Found」画面
To begin testing the media before installation press OK.
Choose Skip to skip the media test and start the installation.

インストールメディアのテストは省略したかったので、[Skip]を選択する。

GUIのCentOS 6のインストール画面が表示される。
[Next]をクリックする。

「What language would you like to use during the installation process?」と表示される。
デフォルトでは、「English(English)」が選択されているので、「Japanese(日本語)」を選択し直す。

「どちらのタイプのストレージデバイスにインストールしますか?」で

「基本ストレージデバイス」(一般的なストレージデバイスにインストール、またはアップグレードします。どのオプションが正しいのか不明な場合は、これが適切でしょう。)

「エンタープライズストレージデバイス」(SANs(Storage Area Networks)などのエンタープライズストレージデバイスにインストールするか、またはアップグレードします。このオプションにより、FCoE / iSCSI / zFCPなどのストレージデバイスを追加でき、インストーラが無視すべきデバイスを選別します。)

のどちらかを選択するように求められるので、「基本ストレージデバイス」を選択する。

[次(N)]をクリックする。

ドライブの処理中にエラー発生:
pci-0000:00:10.0-scsi-0:0:0:0
102400MB
VMware,VMware Virtual S
このデバイスは初期化が必要かもしれません。

再初期化すると全てのデータが消失します!
このアクションは再初期化を必要とする全ての他のディスクにも適用できるかも知れません。

Device details:
pci-0000:00:10.0-scsi-0:0:0:0

という警告画面が表示されたら、[全てを再初期化(T)]をクリック
(初期化は一瞬で終了した。)

「このコンピュータのホスト名を指定してください。ホスト名はネットワーク上でこのコンピュータを識別するために必要です。」
という画面で、以下を設定する。
 ・ホスト名:「localhost.localdomain」→「nobuneko」
 ・[ネットワークの設定]をクリックし、「ネットワーク接続画面」を表示する。
  [有線]タブで「System eth0」を選択し、[編集]をクリックする。
  [IPv4のセッティング]タブの「方式(M)」で「自動 (DHCP)」が選択されているので、「手動」を選択し、
  [アドレス]で[追加]をクリックし、
   「アドレス」に「192.168.2.4」
   「ネットマスク」に「255.255.255.0」
   「ゲートウェイ」に「192.168.2.1」
   「DNSサーバ(D)に「192.168.2.5」
   を入力する。
  [適用]をクリックする。

 [次(N)]をクリックする。

「使用するタイムゾーンの中で一番近い都市を選択してください」で「アジア/東京」を選択する。
同画面の「システムクロックでUTCを使用(S)」というチェックボックスはチェックを外す。

 [次(N)]をクリックする。

「rootユーザーはシステムの管理用に使用します。rootユーザーのパスワードを入力してください。」
の画面で、「rootパスワード(P)」、「確認(C)」にパスワードを入力する。

 [次(N)]をクリックする。

「どのタイプのインストールをしますか?」と表示される。

  • すべての領域を使用する
  • 既存のLinuxシステムを入れ替える
  • 現在のシステムを縮小する
  • 空き領域を使用する
  • カスタムレイアウトを作成する

の5つの選択肢で、デフォルトでは「既存のLinuxシステムを入れ替える」にチェックが入っている。
このチェックはそのままとする。
※既存のLinuxシステムを入れ替える:Linuxのパーティションのみを削除します(以前のLinuxインストールで作成したもの)。これは、ストレージデバイス上にすでに存在する他のパーティションは削除しません(NTFSやFAT32など)。

同画面の「システムを暗号化する(E)」、「パーティションのレイアウトをレビューまたは修正(V)」のチェックボックスにはデフォルトでチェックが入っていない。これらはそのままとする。

 [次(N)]をクリックする。

「ストレージ設定をディスクに書き込み中」という警告画面が表示される。
「選択したディスク分割のオプションを書き込みます。削除及び再フォーマットするパーティションにある
データはすべて失われます。」と表示されるので、[変更をディスクに書き込む(W)]をクリックする。
「フォーマット中」の画面が表示される。

フォーマットが終了すると、以下の設定を行う。

「CentOSのデフォルトインストールは最小限インストールです。オプションとして追加のソフトウェアを選択することができます。

  • Desktop
  • Minimal Desktop
  • Minimal
  • Basic Server
  • Database Server
  • Web Server

の6つの選択肢があるが、Minimalが選択されている。このままとする。

「ソフトウェアのインストールに必要な追加リポジトリーを選択してください。」は、
「CentOS」にチェックが入っているので、このままとする。

同画面で「次のステップでソフトウェアの選択を詳細にカスタマイズすることができます。
またはインストール後にソフトウェア管理アプリケーションでカスタマイズを行うこともできます。」とある
ので、[後でぐカスタマイズ(L)]を選択する。

 [次(N)]をクリックする。

インストール作業が自動で開始される。
「おめでとうございます。CentOSのインストールが完了しました。」と表示されたら、[再起動(T)]をクリックする。

再起動が終了し、

CentOS Linux release 6.0 (Final)
Kernel 2.6.32-71.e16.x86_64 on an x86_64

nobuneko login:

と表示されたら、OK。

VMwareの画面下部に表示されている

物理コンピュータにインストールするのと同じ要領で、CentOS 64ビットをインストールします。
インストールの完了後、OSが起動したら、[インストールを完了しました]をクリックしてください。

のメッセージの右側にある[インストールを完了しました]をクリックする。

これでCentOSの設定は終わったようだったが、他のネットワークからゲストOSであるCentOSに接続できなかったので、ネットワークの設定を再確認することにした。

10.VMwareとCentOS 6.0のネットワークの設定を確認する。

VMwareのメニューバーの[仮想マシン(V)]より「仮想マシン設定」画面を開き、[ハードウェア]タブのより、

ネットワークアダプタ>「ネットワーク接続」>「NAT:ホストのIPアドレスを共有して使用」

という設定を

ネットワークアダプタ>「ネットワーク接続」>「ブリッジ:物理ネットワークに直接接続(B)」

を選択した設定に変更する。

※「物理ネットワーク接続の状態を複製(P)」のチェックボックスはチェックが外れていたのでそのままとする。

[OK]をクリックし、設定を反映する。

→これだけではネットワーク接続ができなかった。

理由がさっぱり分からなかったので、VMwareのメニューバーのヘルプより、アップデートを確認すると、VMware 4.0.0がダウンロードできることが分かったので、それにアップデートしてみた。
→しかし、解決せず。

そもそもVMwareの設定が関係ない予感がしてきたので、CentOS 6の設定をよく見てみる。

vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
NM_CONTROLLED="yes"
ONBOOT="no"
HWADDR=00:0C:29:35:F4:FC
TYPE=Ethernet
BOOTPROTO=none
IPADDR=192.168.2.4
PREFIX=24
GATEWAY=192.168.2.1
DNS1=192.168.2.5
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
UUID=5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03

なんと、

ONBOOT=no

になってた。

ONBOOT=yes

に修正して、

/etc/rc.d/init.d/network restart

とコマンドを実行し、ネットワークサービスを再起動する。

これで、ネットワーク接続に成功した。

仮想OSのネットワーク設定がうまくできない場合、最初っから、仮想OSであるから、VMwareの設定が悪いなどと思い込まずに、まずは仮想OS(今回の例だとCentOS6.0)の設定をよく見るべきである、と反省した。

大学時代の友人UFIT君とIKD君とJR上野駅でお別れした。

UFIT君は宿泊中の池袋のホテルへ、IKD君は会社の寮がある亀有の方へ、私は横浜へ、3名全員が乗る電車が違ったからだ。

私は京浜東北線に乗ることにした。

しかし、やけに気になったのが、電車にほとんど人が乗っておらず、楽勝で座席に座ることができる、ということ。乗った電車が各駅停車なので、目的地に着くまで時間がかかるから、乗っている人が少ないのだろうか、などと考えた。

東京駅に着くと、東海道線の電車への乗り換えることを思いつき、京浜東北線の電車を降り、ホーム下まで移動すると、「東海道線 10番線」といった案内板が見えたので、10番線のホームまで急いだ。すると、駅員さん(男性)のアナウンスが流れ、「東海道線にお乗りの方は、7番ホームに停車中の電車にお乗りください。」となり、「えーーー、10番線のホームに、10番線は横浜行きって案内板があるのに、何故!?」と思ったが、都会の電車のことがよく分からない私が悪いのだろうと思って、7番線のホームまで急いだ。

このあたりで、もう足が随分疲れてきたことを自覚した。

7番線に停車中の東海道線の電車に乗ると、先ほどま乗っていた京浜東北線の電車とは対照的に乗客がたくさんいて、座席に座ることなどできなかった。

横浜に着くまで立ちっぱなしだったので、かなり疲労した。(東海道線によく乗っている人はこれが普通なのかもしれないが…)。

宿泊中のホテルに戻り、京浜東北線でそのまま電車に乗っていた場合と、東海道線に乗り換えた場合のどちらが良かったのかをYAHOO!JAPANの「路線情報」で確認してみた。

《京浜東北線で上野駅から東京駅まで移動し、東京駅から横浜駅までは東海道線で移動した場合》
21:11〜21:18
JR上野駅からJR東京駅まで(JR京浜東北・根岸線・大船行)

21:22〜21:49
JR東京駅からJR横浜駅まで(JR東海道本線・沼津行)

  • 乗車時間:38分
  • 乗り換え:1回(東京駅で乗り換え。ホームを上り下りしたので、少ししんどい。)
  • 空席状況:空席はない。立っている人が多い。立って乗っていないといけないので、かなりしんどい。

《京浜東北線だけで上野駅から横浜駅まで移動した場合》
21:11〜21:56
JR上野駅からJR横浜駅まで(JR京浜東北・根岸線・大船行)

  • 乗車時間:45分
  • 乗り換え:なし
  • 空席状況:空席だらけ。楽勝で座ることができる。

東海道線に乗り換えたほうが7分も時間短縮ができることが分かったので、東京駅で東海道線に乗り換えた私は、時間短縮という目的を優先するのであれば、誤っていなかったと思う。

しかし、7分程度の差であれば、ホテルに戻るだけだったから、体の疲れを考えると、座席に座ることができる京浜東北線で移動した方がよかったのだろう、と思う。(今、かなり足腰が痛い。)

今回のことで、今後、京浜東北線と東海道線のどちらを利用すべきかを迷った時は、時間短縮と体を休めることのどちらを優先すべきかを考えて行動したい、ということを学んだ。

時間短縮だけを考慮すると、今回のように失敗するかもしれない。

私が愛用しているMovable Type 4のリッチテキストエディタは、Internet Explorer 8(IE8)では動作していたが、Internet Explorer 9(IE9)では動作しないようだった。

[ブログを書く]ボタンをクリック後、「フォーマット:」の右側にあるセレクトメニューで「リッチテキスト」を選択しても、何も反応がなかったからだ。

※私が使用しているMovable Type 4は、「version 4.25」であるため、このバージョン以外ではまた動きが違うのかもしれないので注意。

IE9だとIE8とはJavaScriptの動きが違うのかなぁ、IE9はやはりダメだなぁ、と思いながら、さて、どうしようかな、と思案した。

Google Chrome 14やMozilla Firefox 7でMovable Type 4を使用することを思いつき、早速試してみたところ、たしかにリッチテキストエディタは動作するのだが、リッチテキストエディタで自動生成されるHTMLタグが各ブラウザによって異なることに気づいた。

例えば、[Enter]キーを押して改行を行った場合、

  • IEだとpタグが生成される。
  • Google Chromeだと、divタグが生成される。
  • Mozilla Firefoxだとbrタグが生成される。

となることが分かった。

驚くべきことに各ブラウザでそれぞれ動きが異なる。

この状況だと、IEではなく別のブラウザでMovable Type 4のリッチテキストエディタでブログ記事の更新をした場合、これまでのHTMLソースとの整合性がとれなくなってしまう。

そう考えると、IEで何とか使用したい、と思った。

しばらく悩んだが、ふと思いついて、IE9のメニューバーにある[ツール(T)]から[互換表示(V)]をクリックした。

すると、Movable Type 4のリッチテキストがIE8の時と同じように動作するようになった。

助かった!

今後も突然IE9で動作しなくなったJavaScriptプログラムなどに遭遇した場合は、「互換表示」機能で乗り切ってみよう、と思った。

コマンドラインでpsqlコマンドを実行する場合、

psql -U postgres -c '(シングルクォーテーション)実行するSQL'(シングルクォーテーション) DB名

とする。

この場合、「実行するSQL」の中に「'(シングルクォーテーション)」が入っている時は、どうしたよいか。

例えば、実行するSQLを「copy テーブル名 to '(シングルクォーテーション)出力先'(シングルクォーテーション) データベース名」とした場合、「出力先」を囲む「'(シングルクォーテーション)」は、そのまま書いてよいだろうか。

《エラーになるコマンド例》
psql -U postgres -c 'copy nobuneko_table1 to '/home/nobuneko/tmp/test1.txt'' nobuneko_database

ERROR:  syntax error at or near "/" at character 23
LINE 1: copy nobuneko_table1 to /home/nobuneko/tmp/test1.txt

そのまま「'(シングルクォーテーション)」を書くのでは、エラーになるようだった。

'(シングルクォーテーション)のエスケープ文字などがあるのだろうか、と考えて試したが、うまくいかず、さて、どうしようか、と思って適当に試していたら、あっさりと解決した。

《成功するコマンド例》
psql -U postgres -c "copy nobuneko_table1 to '/home/nobuneko/tmp/test1.txt'" nobuneko_database

「実行するSQL」を「'(シングルクォーテーション)」ではなく、「"(ダブルクォーテーション)」で囲めばよかったようだ。

簡単なことだったが、知らないと、これだけ悩んでしまう…。

※上記は、PostgreSQL 8.1で試した場合の例。

2012年4月

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

アーカイブ

カテゴリー