今から21年前の1990年に出版された本なので「最新」の宇宙論ではないのかもしれないが、大変面白かった。
特に、ブラックホールとワームホールを実時間と虚時間で説明している部分が興味深かった。ブラックホールの蒸発に関する説明も分かりやすい。
巻末の佐藤勝彦氏と高柳雄一氏の対談も分かりやすくて面白い。この対談ももっと読みたいと思った。
翻訳本だが、一部、英語原文が掲載されているので、そちらも読むとよいと思う。
今から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 lineSELinux 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)]をクリックする。
「どのタイプのインストールをしますか?」と表示される。
の5つの選択肢で、デフォルトでは「既存のLinuxシステムを入れ替える」にチェックが入っている。
このチェックはそのままとする。
※既存のLinuxシステムを入れ替える:Linuxのパーティションのみを削除します(以前のLinuxインストールで作成したもの)。これは、ストレージデバイス上にすでに存在する他のパーティションは削除しません(NTFSやFAT32など)。
同画面の「システムを暗号化する(E)」、「パーティションのレイアウトをレビューまたは修正(V)」のチェックボックスにはデフォルトでチェックが入っていない。これらはそのままとする。
[次(N)]をクリックする。
「ストレージ設定をディスクに書き込み中」という警告画面が表示される。
「選択したディスク分割のオプションを書き込みます。削除及び再フォーマットするパーティションにある
データはすべて失われます。」と表示されるので、[変更をディスクに書き込む(W)]をクリックする。
「フォーマット中」の画面が表示される。
フォーマットが終了すると、以下の設定を行う。
「CentOSのデフォルトインストールは最小限インストールです。オプションとして追加のソフトウェアを選択することができます。
の6つの選択肢があるが、Minimalが選択されている。このままとする。
「ソフトウェアのインストールに必要な追加リポジトリーを選択してください。」は、
「CentOS」にチェックが入っているので、このままとする。
同画面で「次のステップでソフトウェアの選択を詳細にカスタマイズすることができます。
またはインストール後にソフトウェア管理アプリケーションでカスタマイズを行うこともできます。」とある
ので、[後でぐカスタマイズ(L)]を選択する。
[次(N)]をクリックする。
インストール作業が自動で開始される。
「おめでとうございます。CentOSのインストールが完了しました。」と表示されたら、[再起動(T)]をクリックする。
再起動が終了し、
CentOS Linux release 6.0 (Final)
Kernel 2.6.32-71.e16.x86_64 on an x86_64nobuneko 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東海道本線・沼津行)
《京浜東北線だけで上野駅から横浜駅まで移動した場合》
21:11〜21:56
JR上野駅からJR横浜駅まで(JR京浜東北・根岸線・大船行)
東海道線に乗り換えたほうが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ではなく別のブラウザで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で試した場合の例。