今、ひさびさにLinuxで作業をしている。最近はWin2kでCygwinを使っているから
いちいちLinuxで作業をしなくなっていたのだ。
|
2003年 4月28日(月) 01時15分49秒 JST
keroppyを焼く - FDセクタ不良? -
|
keroppyをFDにインストールしたいのになかなかできないでいる。
FDからブートすると途中でとまってしまうのだ。読みこめないとかって言うエラー。
FDに焼いているときも、I/OERRORがでている。だからきっときちんと焼けていないんだ
とおもう。なぜ?FDがセクタ不良ってのは充分考えられる。
フォーマット型式も、1.44Mがデフォルトなのに、1.68Mでやこうとしている。ふだんは
目立たないセクタ不良がきっと大きな容量で焼く際に問題になっているんじゃないだろうか?
エラーメッセージは、
end_request: I/O error, dev 02:3c, sector 2655
end_request: I/O error, dev 02:3c, sector 2655
というもの。telnetでマシンに入って焼いているのでコンソール端末には。。。
[root@mendezi hide]# dd of=pub/keroppy-2.0.4-1.1.0.img if=/dev/fd0u1722
dd: /dev/fd0u1722: Input/output error
読み込まれたブロック数は 2654+0
書き込まれたブロック数は 2654+0
ちゃんとエラーが出てる(笑)
やっぱりFDのせいかな。
あ、今回は1.72Mで焼きました。1.68Mでは焼けなかったので。
あ、原因が分かった。ifとofを虐にしている。だからI/O ERRORなのか。
なぜこんなにFDLINUXに拘っているかと言えばうちはデスクトップをルータにして
しまっているんだけどルータならノートPCでまにあうから、使っていない
古いPCをルータにしたかったのだ。
あと、mendeziのBIOSの立ち上げ方だれか知らないかな。忘れてしまって。
ときどきなんかのひょうしに立ち上がる。キーをまちがえて押したら偶然
あがるんだけどあとで確かめようにもあがらない。alt,del,ctrl,F1,ESCあたりのキーの
組み合せがあやしいんだけど。
|
|
2003年 4月28日(月) 01時03分09秒 JST
文字コードの恐怖
|
|
なぜか、LINUXから編集したらこのページへのリンク先が飛ばなくなった。
このページが見れない。なぜ?
文字コードの問題かと思ったけど、そうでもない。ページがないわけでもない。
というか、リンク先を押しても、そこからページが見れないのだ。どこへも
とばない。他のリンク先は問題なく表示される。直接、リンク先を指定しても
とんでくれない。なぜ?
いま、アップして表示させたら見れるようになった。文字コードがEUC_JP
にされて表示したから文字化けしたけど、SHIFT_JISにしたら問題なく表示。
今度はリンクから飛んだら今度は文字がばけないで表示。文字コードはSHIFT_JIS
でも、いまLINUXで編集してるから文字コードはEUJ_JPじゃないのか?
文字コードはよくわからない。オリジナルがSHIFT_JISだからあとで編集しても
最初の文字コードで押し通すってことなのか?
あ、まちがえた。このページで文字コードをSHIFT_JISに設定していたんだった。
でも、生に落ちないところもある。じゃぁ、設定をきめればどんなOSで書いても、
文字はちゃんと表示されるってもんなんだろうか?
|
|
2003年 4月27日(日) 05時58分33秒 JST
TITLE
|
|
ひさびさにLinuxを使っているんだけど、プリンタが使えなくて困っていた。
EPSON PM-780Cというやつなんだけどエプソンコーワというところでドライバがあるからそれを
使うと使えるようになるといわれて昔やったことがあった。でも、できなかった。
いちおう印刷らしき者は出るんだけど、なんか暗号のようなものが階段状に印刷される。
しかもとまらない。で、あきらめてたんだけど、今回たまたま、Linux Magazine 2001/6を読んでいたら、
最新プリンタを使うと言う特集が組まれているところがあってそこに我が家のPM-780Cが掲載されていたのだ。
この本自体かなり古いんだけど、まだこの本を買ったときにはこの機種を買っていなかったのであまり
目に止まらなかったんだと思う。でも、エプソンコーワ自体の∃は知っていたのでためしては居たんだけど
だめだった。今回ひさびさにエプソンコーワのページに行ってふたたびドライバを悪としてこようと思った
んだけど今回は落すのに同意書を確認する必要ができていた。変わったもんだ。
で、プリンタの機種を選ばせるところにたしかにPM-780Cはあったんだけど、ver.2.0って書かれている。
まえのとちがうらしい。で、インストールを試みた。RPMでやってみる。
で、やってみるとその過程で、/etc/printcapにも記入をしているみたいだ。昔はできなくて自分で
書いていたのに。なんとなくきたいが持てて、ためしにMozillaでYahooのトップページを印刷してみると
簡単に印刷できた。すごい。なにかが変わったんだ。これでプリンタもLinuxから使えるようになった。
これはかなりの進歩だ。いちいち印刷するだけでWindowsに切替えていたんだからこれはケなりおおきいことだ。
WindowsとLinuxをどっちも使いながら、どっちも利用するってのをいつのまにやらやっていた。
関係ないけど、Vineのdateコマンドって日本語化されてたんだ。いままでそんなに規にしないで使っていたけど、
CYGWINで使っていたDATEコマンドは英語だったから自分でPERLで作っていたのでこんかいVineでdateを使ったら
ちゃんと日本語になっていてビックリした。JSTまででる。
Linuxだとtelnetで他のマシンにはいっていてもあんまり異和感がない。WINDOWSだとTERATERMを使っていて
いかにもどこかに入ってます、って意識するんだけど。でも、localhostにinetサービスをあげてtelnetして
コンソールを使っていたからだんだんUNIXライクな使いかたをしていたのかもしれないけどね。
|
|
2003年 4月27日(日) 05時40分45秒 JST
TITLE
|
|
今、ひさびさにLinuxで作業をしている。最近はWin2kでCygwinを使っているから
いちいちLinuxで作業をしなくなっていたのだ。
でも、やっぱりLinuxで作業をすることもだいじだと思ってマルチブートで
買えている。Vine2.1だ。そろそろVine2.6へ移行したいんだけど変え方が
わからない。困ったことだ。
さて、いまのところマイブームの1FDLinuxなんだけど、keroppyを居れてみることにした。
いちいtHDDに居れることを考えると1FDだけですむっていうのはかなり楽な撰択だ。
さっきはフォーマットをしなかったのでずっとI/O Errorがでてしまって止まらなくなったが
今度は大丈夫!で、フォーマットは1.68MBでやる。これはWINDOWSではできない作業だ。
普通、FDは規格が1.44MBになっている。だからその規格にもとづいて作業するんだけど、
LINUXはデバイスを堂解釈するかを選択できるので、1.72MBのFDとしてフォーマットできたり
するので容量が多くかせげる。今回は、1.68MBとして作業することになった。
デバイスは/dev以下にあるデバイスを使うんだけど、今回は、/dev/fd0u1680を使いたい。
でも、ないから作る。この作るって作業もすごいとおもう。とりあえず言われたと降りに
作ることにした。
フォーマットするところからイメージファイルをFDに焼く作業まで。
# fdformat /dev/fd0u1680
# dd if=keroppy-X.X.X-X.X.img of=/dev/fd0u1680 bs=36b
惟で焼ける。この、/dev/fd0u1680がない場合は次のコマンドを撃つ。
# mknod /dev/fd0u1680 b 2 44
これで焼けてしまう。焼いたあとの報告はまた今度と言うことで。
|
|
2003年4月26日(土)5時13分32秒
keroppy
|
なんだ、参考にしていた人の説明でtomsrtbtを作ったのにこのひと自体がつくっている
ディストリビューションの方が使い勝手がよさそうだ。keroppyっていうやつ。
アドオンっていう独自のシステムで1FDなのにかなり拡張性があがっているというものらしい。
もう(_。_)。ο〇から、とりあえずサイトのURLだけ残しておきます。
http://shimakero.s4.xrea.com/keroppy/index.html
|
|
2003年4月26日(土)4時26分19秒
tomsrtbtが動き出す。
|
|
I/O=0x33,irp=3.
これはtomsrtbtディストリビューションのeth0カードを認識したときの値。ノートパソコンでNICを認識しているのを
はじめてみた。やっぱりNE2000コンパチは認識のされかたが違う。
そう、1FDLinuxに今没頭しているのだ。会社からもらってきた電源すらうまくつかないノートを
FDだけでうごかすルーター兼簡単な実験用マシンとしてよみがえらせたいのだ。NICが認識されれば
なんとかネットワークにつなげる。そうすればADSLにつなげるし、うまくいけばマスカレードもできるかも…と夢は風呂がる。
|
|
2003年4月26日(土)0時14分48秒
TITLE
|
|
mendeziが起動しない理由がわかった。/etc/fstabを書き換えてしまったからだ。
1行目の/(ルート)をマウントするところを/dev/ram0にしてしまっている。だから起動のときに
/dev/ram0をチェックしに行ってエラーがでていたのだ。なぜ書き換えたかというと、1FD Linux+GRUB
を作るときにルートファイルシステムをいじっていて、まちがえてHDDのルートファイルシステムの方を
いじってしまったのだ。で、こいつを治せばいいんだけど、viでそれをいじるというのが難しい。
結局1FDLinuxを立ち上げて/dev/hda1をなんとかマウントして、/etc/fstabを書き直したい。
1FDにviをいれてFDだけでルートシステムがあがるディストリビューションがないかと思ったら、
あるもんだ。
tomsrtbtだ。こいつはviを搭載しながら、1FDで立ち上がる。
ちょうどぼくがGRUBをブートローだとするFDLinuxを作っていたけどそれに近い。
このFDを作るのは、日本語で解説してくれているこのサイトを元にした。
../../SiliconValley-Cupertino/5128/500_compu/tomsrtbt.html
ここでLinuxで1FD起動フロッピーを作る方法を解説している。これはそんなに難しくない。
本当はぼくはWindowsで作る方法をやりたかったんだけどうまくいかなかった。目的のファイルを
展開したら中身のイメージが1FDの容量を越えてしまっていたのだ。
結局家にあるLinuxマシンで作成した。このtomssrtbtはPCMCIAも認識し、しかもViもつかるという優れもの。
さっそくmendezi復旧作業をした。
1.マシンにFDを入れ、起動する。途中、Videoをどうするかとか聞かれるけど、SPACEキーでキャンセルできる。
2.何とか、boot:までくる。ここにはrootユーザでログインするんだけど、パスワードは、xxxxこれは、伏字
じゃなくて、アルファベットのxを4回入れるのだ。この辺もなんかしゃれてるけど。
次に、HDDの/dev/hda1をマウントする。
% root /dev/hda1 /mnt
これで/mnt以下がHDDのルートになる。
3.viで/etc/fstabを編集する
% vi /mnt/etc/fstab
まちがえて/etc/fstabを編集しそうになった。そいつはこのtomsrtbtのfstabだって。今回の問題もそれが
原因になったんだから。
ちゃんとviで編集できて保存された。
4.再起動
狙ったとおり、ちゃんとブートしてログイン画面までくることができた。よかった。
ぼくが作りたかったのはこのディストリビューションにGRUBをブートローダとしたものではないか?
とおもった。tomsrtbt2.0.103+GRUBだ。きっとこのFDにGRUBの必要なファイルをいれて
GRUBをほかのFDで起動してからtomにインストールすればうごくはず。容量が問題になると思うが。
さっきやろうとしたらFDのファイルの種類がex2fsではないようだ。なぜだ?
とか行ってたら、DOSで書き込みたいときの方法がかかれているページがあった。
http://www.bg.wakwak.com/~tomoaki/linux/libretto/contents2.html
あと、1FDでうごくLinuxの紹介ページがあります。
http://home7.highway.ne.jp/iMac/Linux.html
|
|
2003年4月25日(金)11時9分3秒
参考になるもの(ブートディスク)
|
|
http://www.asahi-net.or.jp/~ty4s-tkhs/memo/mkdisk.html
ここはブートディスクをつくるのに参考になりそうな。
|
|
2003年4月25日(金)10時53分13秒
今のmendezi
|
|
今のmendezi。
/dev/ram0というsuperblockが読めないという。f2fsck -b 8193 を実行してみろ。
というんだけど、それをやると、なんか、なんだ!これは!!!!というようなメッセージだけしか
はかない。なんか壊れているようだ。なんだろう。そういえば、/mnt/cdrom , /mnt/floppyなんかを
マウントしたときにもなかなかunmountできなかったり変なエラーが出たり、マウントしているときに
FDドライブが何回も点灯したりしていた。あれがおかしくなる前触れだったのか?
|
|
2003年4月25日(金)8時0分20秒
Ruby to Grep
|
Rubyの初心者チュートリアルを読んでいたら、grepと同等の機能を実現できるとあった。
そのスクリプト
#!/usr/local/bin/ruby
$pat=ARGV.shift
while gets
print if /#{$pat}/
end
これで実現できるらしい。しかも、複数のファイルを一気に読めるのだ。
で、こいつを動かしたあと、本物のGrepとベンチマーク対決をしてみると言う項があった。
[hide@elizabethae ~/rwork]$ time ruby grep.rb connect psql*
conn=PGconn.connect("localhost",5432,"","","hide")
#conn=PGconn.connect("192.168.0.2",5432,"","","bio")
#conn=PGconn.connect("localhost",5432,"","","hide")
conn=PGconn.connect("192.168.0.2",5432,"","","bio")
conn=PGconn.connect("mendezi",5432,"","","bio")
conn=PGconn.connect("mendezi",5432,"","","bio")
real 0m0.265s
user 0m0.060s
sys 0m0.010s
[hide@elizabethae ~/rwork]$ time grep connect psql*
psql.rb:conn=PGconn.connect("localhost",5432,"","","hide")
psql.rb:#conn=PGconn.connect("192.168.0.2",5432,"","","bio")
psql.rb.bak:#conn=PGconn.connect("localhost",5432,"","","hide")
psql.rb.bak:conn=PGconn.connect("192.168.0.2",5432,"","","bio")
psql2.rb:conn=PGconn.connect("mendezi",5432,"","","bio")
psql2.rb.bak:conn=PGconn.connect("mendezi",5432,"","","bio")
real 0m0.065s
user 0m0.020s
sys 0m0.040s
実際にやってみるとこんな結果になった。本物のGrepはどのファイルから検索した結果なのかが
わかるようになっている。これを含めてRubyよりも速い。
これがインタプリタなんだということなんだけど、Grepではできない、というか自分だけのオリジナルの
機能を組み込むことができるのがRubyのいいところだって続く。
たしかにそうなのかもしれない。それに4行しか書いてないから、こんな短くてすぐに自分のほしい
結果をだしてくれるなんてうれしい。
ただ勉強している時間とか組んでいる時間とか考えるとできあいのものをレンジでチンのほうが楽、
というのもある。これって一人暮らしの食生活に関係しているじゃない買って思う。
|
|
2003年4月25日(金)6時38分37秒
TeraTermProの設定
|
|
結局、TeraTermProにはかなりお世話になりっぱなしだ。で、コンソール端末をかなり長時間見ているので
その背景と文字の色はきちんと設定しないと疲れてしまうことがわかった。
で、いまのところこの色がいいんじゃないか?という設定があるので記す。
# ===================
# TeraTerm Settings
# ===================
#
#---------------------
# 文字 R:144 G:166 B:123
# 背景 R:82 G:48 B:57
# 端末サイズ 120x35
# フォント MS Gothic 10
# カーソルの形水平線
#---------------------
何でもいいってこともあるんだけど。でも、クロの背景にしろの文字ってらしくていいんだけど
だんだん疲れてきてしまうことが多い。あれって学校の黒板に感じが似てる。黒板も長時間みてたら
そういえばつかれてきたような。で、チョークが汚れていたほうが見やすかったような。
そういえば、大事なところが色分けされたりして黒板もちょっとしたコンソール端末みたいだったなぁ。
|
|
2003年4月25日(金)5時29分25秒
TITLE
|
|
なんか最近このページのみに書き込みをしているような。
やっぱり野口由紀雄のポケット一つ制の考え方は本当だったんだ。
vi の備忘録
バッファ名指定コピー/貼り付け
"<文字><コマンド>
<例>
"ayy ... aというバッファに1行コピーする。
その後カーソル移動してp(貼り付け)する。
前にやってたんだけど忘れていた。複数のファイルを開いて別のファイルにバッファをコピるときなんかに
重宝する。でもどこのバッファに入れたとか忘れがちなんで使わなくなっていた。
viはいろいろモードがある。なんかFTP上のファイルを直接いじれるモードがあるって読んだことがあったんだけど
なかなかうまくいかない。emacsにも似た機能があったなぁ。
|
|
2003年4月25日(金)5時0分46秒
date2が間違ってる!
|
|
自作した日付表示拡張Perlスクリプト”date2 "のアルゴリズムが間違っていた。
localtimeから返される曜日の値のとり方を勘違いしていた。曜日は日曜日から始まるんだった。
僕は曜日は月曜日から始まるのが好きなのでつい自分の主観で作ってしまっていた。
だからこれまでの曜日(ここのページの)は全部一日前倒しになってしまっている。
日付が正確ではないのってかなり致命的…。
|
|
2003年4月25日(土)3時46分52秒
Mozillaのショートカット操作
|
ぼくの大好きなMozilla。使い慣れてくるとほとんどの操作をキーボードで行いたくなるのは人の常。
というわけでショートカット操作をちょっとリファレンスしたくなった。
というわけで
ちゃんとあるんですね。それもどっかのサイトじゃなくて、Mozillaのサイトにそういうところの極め細やかさ
がMozillaなんだなぁとどうでもいいことに感心したりして。でも、なんどかMozillaで落ちたことがあったりする。
そのたびにフィードバックでメールを送ってる。そのために最新バージョンを入れているようなもんだし。
http://jt.mozilla.gr.jp/docs/end-user/moz_shortcuts.html
ちなみにWindows自体のキーボード操作は、
http://www.katch.ne.jp/~redeyes/pc/pc-key.htm
ここで紹介されている操作はほとんどやってたんだけど1つだけ、Shift+F10で右クリックと同等っていうのは
知らなかった。これができてしまうとマウス必要ないんじゃ?という気がする。
|
|
2003年4月24日(金)23時45分4秒
GRUB FD 起動ディスクが完成した!
|
とうとうFDにmenu.lstを入れたGRUB起動ディスクが完成した!あんなに苦労したのに。
どうやったかというと、
用意するもの:
FD2枚
GRUBインストールに必要なもの
stage1, stage2, menu.lst, あと、stage1_5のファイルも必要に応じて)
http://www.gnu.org/software/grub/
rawrite (DOSでFDにデータを書き込むツール)
ftp://ftp.jp.freebsd.org/pub/FreeBSD/
まず1枚目のFDをWindowsでFATフォーマットしてboot/grub/stage1, boot/grub/stage2, boot/grub/menu.lst
をコピーする。
( C:\winnt\tempは作業していたフォルダ )
C:\winnt\temp format /Q a:
C:\winnt\temp copy boot\grub\stage1 a:
C:\winnt\temp copy boot\grub\stage2 a:
C:\winnt\temp copy boot\grub\menu.lst a:
これをGRUB_FD_FATと名づけます(この辺は参考にしたサイト通り)。
つぎに、GRUBをとりあえずFDから起動させたいので、dosutilであるrawrite.exe (これはFreeBSDのFTPサイト。toolsの中にあったりする)
をもちいて、FDに書き込む。これは別のFDを用意する。手順は、
C:\winnt\temp\boot\grub copy /b stage1+stege2 grub.bin
これは、バイナリ形式で複数のファイルを連結してコピーするとかって言うみたいだけどちょっと理解不足。
このgrub.binを2枚目のFDにrawrite.exeをもちいて書き込む。
C:\winnt\temp\boot\grub rawrite.exe -f grub.bin -d a:
もちろん、C:\winnt\temp\boot\grubにrawrite.exeが置いてあることを前提にしてます。
すると2名目のFDにGRUBがインストールされている。これをGRUB_FD_RAWとする。このFDはLinuxからもWindowsからも
中身が見えないFDです。見えればこんな複雑なことをしなくてもいいんだけど。
それで、GRUB_FD_RAWをFDドライブにいれてPCから再起動。FDから起動してまずGRUBを起動させます。
つぎに、FDをGRUB_FD_FATに入れ替えて、GRUBのコマンドラインから、
GRUB> root (fd0)
GRUB> setup (fd0)
とやるとメッセージが出て、すこし怪しいところも歩けど、GRUB_FD_FATにGRUBがインストールされる(最初のセクタにGRUB
が書き込まれるらしい)。
今度はこのGRUB_FD_FATを使ってPCを起動させます。うまくいけばGRUBが起動します。このとき、
menu.lstが読み込まれて起動するのでメニュー画面がでるはず。ここがGRUB_FD_RAWと違うところ(GRUB_FD_RAWは単純にGRUBが
入っているだけなのでmenu.lstがなくてコマンドラインからの起動になる)。
あとは、menu.lstを編集すればいい。フォーマットが
FATなのでWindowsからメモ帳なんかで編集できます。もちろんLinuxでもFATなら編集できるはず。このために複雑な
過程を経てGRUB_FD_FATを作っていたのです。
なんでいままで失敗していたかというと、GRUB_FD_FATの方をLinuxで作ろうとしていたからだと思われる。正確な原因は
わからない。ただLinuxでext2fsを用いてFDを作ってもそのFDにGRUBをインストールできなかった。単純ミスかもしれないし、
わからない。
それで今度は本当の目的であるFDにLinuxミニディストリビューションを作ってそこにGRUBをインストールするという
原始的なLinuxシステムをFDに作ってしまおうという壮大な計画。これもサイトを参考にした。
用意するものは、
FD2枚(1枚は、起動できるGRUB起動FD、もう一枚がこれから作成するミニディストリビューション用FD)。
Linux kernel(なんかかっこいいな。ぼくは、Vine1.1の/boot/vmlinuz***を使用しました)。
rescue.gz(ルートファイルシステム用なんだとか。Linuxの緊急ディスク用のファイルなんだけど、ぼくはこれは、
Vine1.1の起動CD-ROMの中の、images/rescue.imgを使った。もしやと思って、このrescue.imgをfileコマンドで調べると
gz formatのファイルなんだって。イメージファイルが実はgzip形式のファイルだったなんて…)
あれからずっとやりつづけてなんとかGRUB+Linux FDを完成させようとしたとき、思わぬ問題が起こった。
FDにrescue.gzを入れようとしたらなんとDisk Fullだそうだ。オリジナルのrescue.imgが144MBを超えている。
これではFDに入らない。Vineの緊急FDイメージは多分いろいろ入りすぎているんだろう。
結局、どうやってGRUB+LINUXを作ろうとしたかというとさっきのFDをFATフォーマットして成功したのを参考にして、
FDをFATフォーマットしたままLINUXでmtools(DOSのコマンド群)を使ったのだ。これで、FDにGRUB関係とkernel関係、
ルートファイルシステム関係を入れて動かせばなんとかなるかと。で、FDに全部詰め込んでそのFDの先頭にGRUBを
インストールするところまではうまくいったのだ。でも、ルートファイルシステム(rescue.gz)がおおきすぎて
はいらない!だからカーネル読み込みまでは成功した(カーネルは非常に小さかった)のに、rescue.gzがありませんと
エラーが出る。なんかもう少しなのに…。
http://www3.justnet.ne.jp/~nmasu/linux/install/fd-libc4-grub.html
ここを参考にしたんだけどここのrescue.gzはslackwareなんだよなぁ。きっと最小限の緊急ディスクなんだろう。
Vineは日本語対応のせいできっと大きいに違いない。かなりショックだ。
こうなったら乗りかかった船。rescue.gzをシェイプアップしよう。
で、中身をみていらないものは削除することにした。
# gunzip rescue.gz
# mount -o loop rescue $(MOUNTPOINT)
なぜこうやるのかは知らない。ただルートファイルシステムというのはマウントしてから作業するもんなんだろうという
程度の理解である。単純にみれないのか?とかいろいろ考えたがぼくはいま非常にマニアックなことをしているみたいなので
とにかく言われるままに作業をする。実際、gunzipで展開したrescueをfileコマンドで見ると
# file rescue
rescue: Linux/i386 ext2 filesystem
とでる。それはディレクトリではないから中身を見ようにも見れない。やはりこのシステムをマウントして
中を見るんだ。すごいことだ。
ここで、
# cd $(MOUNTPOINT)
として中身を見る。するとそこにはLinuxの/(ルート)以下と似た構成の状態になっている。
bin/ dev/ lib/ mnt/ tmp/ var/
boot/ etc/ home/ lost+found/ proc/ sbin/ usr/
こんなかんじだ。で、この中で一番容量を食って層なのはきっとバイナリだ。だから、bin/以下をみることにした。
で、独断と偏見で削除してみる。
bin/tac
bin/traceroute
bin/fsex2chk
bin/pico
bin/rpm
sbin
usr/bin
usr/sbin
usr/share
usr/lib
こんなところかな。ってすごい削除した。理由は、bin/tacはたしかcatの逆コマンドでファイルのしたから表示する
とかってやつであんまし必要でなさそうなんで(わかんないもしかしたらシステムの起動に重要な関与をしているのかも)
。tracerouteはネットワーク関係だったか。ネットワークをどうしようともおもわないので削除。
fsex2chkこれはちょっとこんな名前だったかうろおぼえ。ただファイルチェックをするコマンドみたいだったから
そんなに必要ではないだろう(チェックすること自体しないだろうと思って)と判断しました。
picoは名前から(^. ^;rpmはこれはパッケージは全然関係ないので自信を持って削除。
/sbin以下はbin以下と同じコマンドがたくさん入っていたので全部削除。同様にusr/bin,usr/sbin
と思ったら、mendeziがおかしくなっている。
起動させたら、/dev/ram0が読めない。といわれてメンテナンスをしろという。/dev/ram0はsuperblockだという。
なんだ???っていうか、せっかくSQLサーバにしたのに動かなくなってる!
どうしたらいいんだ。メンテナンスセよ、ってrootになれ、というんだけどなってどうすればいいんだ!?
でも、このPC、再インストールする勇気がない。もうそれは途方にくれるくらいの設定をしなければならないのだ 。
NICの設定より以前にインストールがうまくいくか分からない。たしか、インストールに9時間くらいかかったはず。
しかも一回ではうまくいかなかった。もう泣きたい。
|
|
2003年4月24日(金)9時30分36秒
やっとわかったGRUBの仕組み
|
GRUBの起動ディスクをWindowsもLinuxも読めない理由がわかった。ファイルシステムがRAWになってて
気にはなってたんだけど、そのあたりの答えが、
../../SiliconValley-Bay/3897/geobook.html#river3
にかかれていた。このページのやり方にしたがってつくってみるとFDにstage1,stage2をベタコピーした
ものが起動する!この仕組みはまだむずかしすぎるが。
もうこうなったら臨機応変と理屈で理解するしかない。
rawrite.exeでうまくできないので、Linuxでコピーをすることにした。
1.まずFATフォーマットしたFDを用意する(ぼくはWindowsを使った)
2.Linuxで作業をする
# mount -t vfat /dev/fd0 /mnt/floppy
# mkdir -p /mnt/floppy/boot/grub
# cd /home/hide/temp ←grubのtarボールを展開したディレクトリ
# cp stage1 stage2 menu.lst /mnt/floppy/boot/grub/
# umount /floppy
3.それで今度はできあがっているGRUBのFD起動ディスクでGRUBをたちあげて
FDをさっきLinuxでつくったFDに差し替えてから、
grub>root (fd0)
grub>setup (fd0)
とやるとインストールが完了した!ようにみえたがこれで作成したFDからはGRUB
は起動しなかった。
う〜〜ん、それからいろいろ考えた。考えあぐねたという言葉がすごく好きだ。
結局、目的はHDDにインストールすることなのだ!というところが大事である。
それで、GRUBのバイナリをHDDの/boot/grub以下に入れて、GRUBのFDブートディスクから
setupでインストールしてしまおうとおもった。おもった。
でもできなかった。エラーメッセージを読むとどうやら/boot/grub以下はBIOSが認識できない
領域らしい(1024シリンダ以上)。だからブートしないのか。でも、むかしFDのLILOは
ちゃんと起動してたよなぁ。なんでだ?いまやりたいのは、
1.FDからGRUBを起動
2.タイムアウトでそのまま/boot/vmlinuz-2.0.6をロードして起動
というために、FDにmenu.lstをいれて編集できる状態にするか、
ハードディスクにインストールをしてFDなしで起動したいのだ。どちらもできるはずなのに。
いや、まてよ、あの方法なら、DOSからrawrite.exeでベタコピーするとき、いっしょにmenu.lst
もコピれば…。
|
|
2003年4月24日(金)6時23分49秒
TITLE
|
GRUBを0.9.3にしてからいろいろ進展があったmendeziのブートだが、chainloaderの使い方
が分からなくなったというのがある。chainloaderの使い方で間違えたときに、メッセージで
Filename must be either am absolute pathname or blocklist
ってでてきたんで何気に「ファイルって、こいつはこのシステムが見えているん家?」と思い、
chainloader /[TAB]
でTAB補完をすると、/(ルートディレクトリ)以下の候補がでるわでるわ。見えてるんだ、GRUB
はハードディスクの内容が。それでいろいろためしたんだけど、chainloaderの使い方はわかんない。
chainloader +1はmendeziではInvalidらしくてうまくいかないのだ。
それでmenu.1stの内容をおもいだして、そういえばkernelってコマンドがあったような…。とおもい
menu.1stの設定方法をネットで調べていると、どうやらカーネルイメージを指定すればいいらしい
ってことがわかり、またもやTAB補完で、
kernel /boot/[TAB]
をやるとvmlinuz-2.0.36あたりがあやしいので、
kernel /boot/vmlinuz-2.0.36
とやるとおお!!カーネルイメージを読み込み始めた!とうとうmendeziをGRUBでブートできた!
LILOもだめでいろいろためしてだめだったのにGRUBの最新バージョンで成功した。
とおもったら、よくみるとkernel panicを起こしていた。・゜(´□`)゜・。
いま、kernelコマンドをいろいろ調べていて、
root (hd0,0)
kernel (hd0,0)/boot/vmlinuz-2.0.36 ro root=/dev/hda1
boot
で起動させている。とりあえずカーネルが読み込まれているのは確かなんだけど…。
おお!!!ちゃんと起動した。NICも認識されているし、ネットワークはつながっています。
さっきの問題は、ro root=/dev/hda1ってのがなかったことにあるんだな。カーネルイメージを作った
起動ディスクでも、rdevってツールを使って、rdev /dev/hda1と買ってやった気がする。
なんとか成功したブートローディングなんだけど、GRUBにいちいちコマンド打って起動させるのは
面倒。FDブートしかできないならせめてタイムアウトして勝手にブートしてほしい。
たしかメニュー画面で画像を背景に選択できるはず。で、その画像も入手した
splash.xpm.gz[ 53KB ]
で、設定ファイルをFDの/boot/grub/grub.confとして作成したいんだけど、なぜか作成したFDの中身が
見えないのだ。rawrite.exeでイメージを焼いたからだろうか?
たぶん原因がわかった。GRUBのブートイメージに問題があるんだ。
ためしにrawrite.exeでほかのイメージを焼いてみたらそのFDはちゃんと見えた。
GRUB用のブートイメージは、*.ext2fsっていう名前のものでたぶんLINUX用のイメージなんだと思う。
だからそれをDOSユーティリティのrawrite.exeで書いているからおかしなことになっていると思う。
でもよく起動するなぁ。
とりあえずLinuxでFDをフォーマットすることにしたファイルシステムはext2fsだ。ひさびさだ。
# mkfs -t ext2 /dev/fd0
それからFDにイメージを書き込む。
# dd if=[boot image] of=/dev/fd0
書き込めたらしい。けど、やっぱり中身が見れない!これじゃ、編集できないじゃないか!!!
関係ないけど、mendeziが電源を入れてからいつもだしている、IBMへ修理に出してくれという
メッセージを出さなくなった。なぜ?BIOSでメモリーの速度とfastbootっていうのを選択しただけ。
それだけで??あのメッセージはたしか内部電池が切れているからとかって聞いたことがあったけど違った
のか???大変よかったんだけど原因がつかめず。
|
|
2003年4月24日(金)3時17分2秒
TITLE
|
結局、GRUBのFDインストールは完了した。FDドライブがいかれていないノートパソコン(Dynabook)である
Rotkeilがあったからそれでrawrite.exeを使い、イメージを書き込みました 。
で、mendeziでFDブートしようとした。まず、root (hd0, 0)を実行したんだけど、ちゃんとex2fsシステム
が見えている。以前のバージョンのGRUBはこの時点でシステムが見えてなかった。ここは進歩だ。
でも、次にmakeactiveして、chainloader +1するとなぜかError 13というエラーがでてしまう。
こいつをどうにかしたい。
http://www.skipup.com/~search/grub.html
ぼくがどうにかしたかったのはハードディスクにGRUBをインストールしたいのだ。
しかしなかなかうまくいかない。
そもそもぼくはなににつまづいているのかといえば、HDDからブートできないってことなのだ。
いまはFDにカーネルイメージを書いてそこから/dev/hdaにマウントして使っている。でも、
LILOで起動させたいし、でうまくいかなくてHDDにGRUBをインストールしたいんだけど、そもそもHDDのLILO
が起動しない理由に、ハードの癖の強さって野がある。mendezi(そのPCの名前)は、かなり昔のPCで
IBMのPS/V Vison(2408-WMB)っていうマシン。Win98も動かすのが難しいマシンだ。
Linuxのインストールも起動ディスクからブートさせるところからまずこけてしまったという兵で、
何しろkonがインストーラで動くんだけどそれがまずディスプレイが乱れて動かなくなってしまい、
konを起動しないようにして動かすようにしたのだ(よくlinux textとやればいいっていうんだけどそれもだめで
linux nokonっていうかなりマニアックなブートの仕方をして解決した)
ともかくそれでそのハードによる問題だってことでPS/V Visonに関する調べ者をしたらいました。
むかしぼくが苦労した問題とおなじ悩みを解決した人が。そのひとはFreeBSDをインストールしていた。
それでそのページの中にkon.cfgの設定についてかかれていた。ぼくもみようみまねでなんとかした結果が合った
のでそれと比べてみると、
http://homepage3.nifty.com/heru/freebsd/
# ページの人の設定
VGA:Normal
VGA
640 672 768 800 480 491 493 525
0
79 29
# 僕の設定
VGA:Normal
VGA
640 680 768 864 480 491 493 525
1
79 29
微妙に違う。ちょっとkonの表示に気に入らないところがあったので直したいと思っていた。
さっそく直してみようと思う。結果、特に変わらなかった(^. ^;
と思ったら、まだほかの説があった(^. ^;
VGA:Normal
VGA
640 664 760 800 480 491 493 525
0
79 29
これは、http://homepage3.nifty.com/heru/vision/os.htmで紹介されている。PS/V Vison専門ページ。
ここはSlackwareで戦っている。
試したけどやっぱりあんま変わんない。でもこの数値いいかげんではないのだ。ぼくもやったから
わかるけど微妙にかえると表示が乱れてしまう。周波数とかの設定なんだとおもうけど詳しくは分からない。
というか、PS/V Vision専門ページがあった。BIOSの立ち上げとか忘れたからここをみよう。
http://homepage3.nifty.com/heru/vision/
あと、かつてのVisionのコピーがあったので、記載。
http://www-6.ibm.com/jp/pc/desktop/old_dsk/0399.html
あと、この今井内科医院ってところの院長さんもほんのすこしだけVisonに触れていますが、一体型PCは
拡張性がないから未来がないとか…。iMacに匹敵するくらいのインパクトを与えたといわれるVisionも
時間の流れとともにいろいろと言われてきたんですね。
http://plaza25.mbn.or.jp/~imai_naika/
なんかどこを読んでも、このPCはテレビが写るという触れ込みがあったとあるんだけどどうやると
テレビが写るんだ?
ちなみにそのiMacみたいなPC PS/V VisonとはこんなPC
今、BIOSの立ち上げ方が分からなくて困ってたんだけど、いろいろキーボードをたたいていて、
Alt+F1かな?(このかな?って思うことがなんだろうなぁ…。)とおもったらなにやらメッセージが
でてきた。
The following error(s) were detected when the system was started:
301 Keyboard Error
163 Date and Time Incorrect
Press Enter to run the Configuration Utility or Escape to continue
昔もこんな画面からBIOSに進んだっけかな?と思いながらもENTERを押すが、受け付けない。
??そのあとにまた同じ画面になったからENTERキーをおすとひさびさのBIOS設定画面。
いろいろみたけどMemorySPEEDくらいしか帰るべきところがなかったので70ns→80nsに変えた 。
どういう意味なのかはわからない。
|
|
2003年4月24日(金)0時46分2秒
TITLE
|
GRUBをひさびさに使おうとしている。mendeziのBOOTがGRUBで失敗し、そのあとてんてこ舞いで
失敗してGRUBのブートフロッピーを消してしまったのだ。きっとバージョンもあがっているに違いない
ととにかくフロッピーを一枚保険のために作ってしまいたかった。
まず、サイトへ行く。
http://www.gnu.org/software/grub/
落としてくる。
ftp://alpha.gnu.org/gnu/grub/
展開する。
[hide@elizabethae /usr/src]$ tar xzvf grub-0.93.tar.gz
なんかまちがえたみたいだ。こいつはブートイメージじゃない。
Windowsでブートフロッピーを作りたいので、ブートイメージを持ってこないとだめらしい。
そいつは 、
[hide@elizabethae /usr/src/grub]$ ls
grub-0.93-i386-pc.ext2fs
[hide@elizabethae /usr/src/grub]$ file grub-0.93-i386-pc.ext2fs
grub-0.93-i386-pc.ext2fs: x86 boot sector
これであっているみたい。boot sectorって表示されてるし。
こんどはこいつをdosutilのrawrite.exeを使ってFDに直接書き込む。
http://www.h2.dion.ne.jp/~yoshida/rawrite.exe
ぼくはここから落としてきました。
[hide@elizabethae /usr/src/grub]$ ls -l
total 270
-rw-r--r-- 1 hide none 239616 Apr 24 00:55 grub-0.93-i386-pc.ext2fs
-rwxr-xr-x 1 hide none 36064 Apr 24 01:03 rawrite.exe*
で、これはエクスプローラーで直接ダブルクリック。
とおもったらよく考えたら自分のPCのFDドライブ壊れていたんだった。・゜(´□`)゜・。
これじゃできないよ。困ったことになった…。そうだ、mendeziでFD作ってしまおうか。
http://www.geocities.co.jp/SiliconValley-Bay/3897/grub/grub.html
ここを参考にしてみました。
今の最新のGRUBって0.93なんだなぁ 。
んで、いろいろやったんだけどelizabethae(Win2k)のFDドライブが壊れているってのが
致命的で、mendezi(Vine1.1)でGRUBをインストールしようとしたけど、makeでこけてしまい、
どうしようもない。せめてFDにインストールしようとしたんだけど、stage2/にstage2がない
つまりコンパイルできないのでこれもインストール不可。
もうあきらめました(^. ^;
でもやり始めたらとまらない。
|
|
2003年4月23日(木)23時8分24秒
シェルスクリプト
|
ぼくはまともなシェルスクリプトを組んだことがない。し、勉強したこともない。
でも、UNIX系のOSを使っていればどうしても使わざるを得ない状況に直面する。
そんなときにシェルが組めればなぁっておもう。だからすこしずつ組める用になりたいなぁ 。
ところで、rpmパッケージを探そうとして-qオプションを使って探したけどないらしい、で も
『あった』ということがないだろうか?実はそのとき引数が適切でないことが多いのだ。
そのときあらかじめwhichコマンドで探しておく。
[hide@mendezi hide]$ rpm -qf emacs
ファイル /home/hide/emacs: No such file or directory
こうやってないんだけど…、
[hide@mendezi hide]$ which emacs
/usr/bin/emacs
[hide@mendezi hide]$ rpm -qf /usr/bin/emacs
mule-canna-2.3@19.34-3
こうやれば探せる。でもいつも絶対パスで探す必要はない。でも探さなくては成らないことがある。
そんなときこの一連の手続きを一括して
[hide@mendezi work]$ more searchrpm.sh
#!/bin/sh
if [ -n $1 ]
then
fullpath=`which $1`
pkg=`rpm -qf $fullpath`
rpm -ql "$pkg"
fi
こんな風に書きます。ちょっとちがうのは、最後の行のオプションが-qlになったこと。これがどうなるかっていうと
[hide@mendezi work]$ ./searchrpm.sh emacs
/usr/bin/emacs
/usr/bin/emacs-19.34
/usr/bin/mule
/usr/bin/mule-19.34
ってことになる。おお!便利じゃないですか。このスクリプトをPATHの通ったディレクトリにでも入れておけば
いつでもコマンドとして使うことができる。
実はこれはLinuxMagazine3月号の特集に書かれていたところでぼくがシェルスクリプトで勉強したのは
この特集だけといっても過言ではない。本当は本を買って勉強してもいいんだけどそうもいってはいられない(!?)
というわけでこの特集にかかれている要点をまとめて書き出したいと思う。
#!/bin/shとは?
これは実行属性がついているファイルの先頭に#!をみつけると以下のコマンドを起動して2行目以降をスクリプトとして
実行するというもの。Perlでも似たようなのがありました。だから以下のコマンドというのを、
$!/bin/bashとすればbashを実行することができるというわけ。シェルの種類を限定することができる。
変数
実行した結果とか数値などを一時的に入れておく格納庫のようなもの。
var=hensuu
というように使う。=の両側にスペースを入れてはならない。また、変数にスペースを入れたい場合は、
var="hennsu space"のように""で囲む。
このようにして設定した変数を参照したい場合は$をつける。
echo $hensuuのように使う。
位置パラメータ
これはシェルスクリプトがバイナリプログラムみたく引数を取れるというもの。
たとえば、commandっていうスクリプトがあったとして、
command foo bar bazっていうように実行すると、foo,bar,bazはそれぞれ1,2,3という変数に格納される。
またプログラム名自体は、0になる。なんかよくわからなくても、次のスクリプトを作成して実行してみればいい。
[hide@mendezi work]$ more mycommand
#!/bin/sh
echo $1, $2, $3
shift
echo $1, $2, $3
↑これがスクリプト(mycommand)の中身。で、↓が実行例。
echo $1, $2, $3がどんな感じになるのかがわかるとおもう。また、shiftってのがあるけど、
それは後述します。
[hide@mendezi work]$ ./mycommand foo bar baz
foo, bar, baz
bar, baz,
shiftコマンド
さっきのスクリプトで使っていたけど、shiftコマンドは位置パラメータを前にずらす組み込みコマンドである。
1がfoo
2がbar
3がbaz
なんだけど、shiftを実行したら、
1がbar
2がbaz
になったというわけ。3はずれたからなくなったので表示されないのです。
あと変数はシェルでは文字列として格納される(これ意外に重要だ)。
なのでそれを数値として扱いたいとか計算したいとか言うときは別途コマンドを必要とします。
exprコマンドです。
[hide@mendezi work]$ expr 10 + 20
30
[hide@mendezi work]$ echo 10 + 20
10 + 20
こんなかんじの違いが出ます。ただ、
[hide@mendezi work]$ expr 10+20
10+20
というように演算子の両側をあけないとやっぱりそのまま表示されてしまいますので注意(ぼくがやった)
引用符の使い分け
""と''は内容が違う。どう違うのかも実行結果を見せてから説明します。
[hide@mendezi work]$ hensuu="doubutsu no oisyasan"
[hide@mendezi work]$ echo "TV Program: $hensuu"
TV Program: doubutsu no oisyasan
[hide@mendezi work]$ echo 'TV Program: $hensuu'
TV Program: $hensuu
中身の変数が取り出せているのは""で囲ったほうです。''で囲ったほうはうまく取り出せてません。
これは、""で囲ったほうは中身に$とか`(バッククォート)があるときちんと処理されるということです。
逆に''の中身は無視されるので$や`を文字として扱いたい場合とかはこちらが便利です(都営風)。
ここで二つ目のポイントはべつにシェルだからスクリプトに書かなくてもコマンドライン上で実行できるってこと。
これって案外重要。スクリプトはあくまで一気に書いているだけに過ぎないのだ。
次に""を使った引用符の例。
順番に実行
これも大事。全部大事ジャンとかいわないで。
command1 && command2
command1 || command2
この二つの違いは一つ目のコマンドが正常終了されているかどうかの判定が違うということ。
一つ目の&&を用いた場合は、command1が正常終了されたときにのみcommand2が実行されます。
command2がcommmand1の正常終了が前提になっている場合にこちらが便利です(やっぱり都営風)
2つ目はcommand1が正常終了しなかった場合にのみcommand2が実行されます。command1が正常終了
しなかった場合のフォローにcommand2を実行したい場合にはこちらが便利です。
for構文
[hide@mendezi work]$ more loop.sh
#!/bin/sh
for var in Swallow Tail ButterFly; do
echo "$var fish"
done
[hide@mendezi work]$ ./loop.sh
Swallow fish
Tail fish
ButterFly fish
これはvarという変数に、Swallow Tail ButterFlyという文字列を入れて
3つの文字列(Swallowm, Tail, ButterFly)にそれぞれfishという文字列を付加して表示している
ものです。こうした一気に格納してスペースで区切られた文字列をひとつずつ処理するってのが
シェルは得意です。だからシェルスクリプトにとってスペースってのはいつも特別な存在なのです。
分岐
if構文は、テストコマンドの結果によって、実行するコマンド群を切り替えたりするのに便利。
テストコマンドっていうのは、testっていうコマンドがあるんだけど通常は[…]っていうように
省略されている。条件式で主に使われていてその条件に対して返す値がいろいろ変わるんで
条件式に用いられているみたいです(説明になってたかな?)
[hide@mendezi work]$ cat monku.sh
#!/bin/sh
if [ $1 = 山 ] ; then
echo "川"
elif [ $1 = ツー ] ; then
echo "カー"
else
echo "おぬし仲間ではないな"
fi
このスクリプトを実行してみると、
[hide@mendezi work]$ ./monku.sh 山
川
[hide@mendezi work]$ ./monku.sh ツー
カー
[hide@mendezi work]$ ./monku.sh 仲間由紀恵
おぬし仲間ではないな
こんなかんじです。
注意すべきは、テストコマンドは[ $1 = 山 ]のようにスペースをあけて使うという点。
シェルはスペースにとてもうるさいのです。
あと、いまさら説明するんだけど、スクリプトを実行するのに当たって実行属性をつけないと
ならないです。この辺の説明は端降ります。ぼくは
[hide@mendezi work]$ chmod 701 monku.sh
として実行属性をつけました。スクリプトが実行するのに許可を与えるという感じです 。
このようにスクリプトを使うんだけど、実際に運用するのはこれを自動実行するのに
もちいるってのが多いです。cronシステムとかって呼ばれてます。たとえば、
crontab -eとコマンドラインで実行するとデフォルトのviエディタが起動して、なんか書いてくれ
と言ってきます。で、そこに実行させるためのスケジュールを書くんですが、ここには書式があります。
それは
分/時/日/月/曜日/実行するコマンド
の6つの項目で指定します。こんなかんじ
0 2 * * * mybackup
*は任意という意味。毎日午前2時にmybackupっていうシェルスクリプトが実行されるということに
なります。この辺はもっと詳しいところで参照しましょう。
|
|
2003年4月23日(木)22時53分58秒
RubyでPostgresを使う(再び)
|
以前、RubyでPostgresに接続するのに失敗していた。
今回やったらうまくいった。それは2つ問題点があったからだ。
1.ネットワーク接続の設定が適切になされていなかった。
2.接続するテーブルの権限をもっているユーザと接続するユーザがことなっていたのではじかれていた。
だから接続できなかった。
今回修正してうまくテーブルにアクセスし、表示することができた。
[ psql2.rb ]
#!/usr/local/bin/ruby
require "postgres"
conn=PGconn.connect("mendezi",5432,"","","bio")
res=conn.exec("select * from school_list2;");
res.each{|x|
print x,"\n"
}
実行結果は、
[hide@elizabethae ~/rwork]$ ruby psql2.rb
1NAME 2003xxxxxxxx
3NAME 2003xxxxxxxx
2NAME2 2003-2554545
となった。ちなみに実際のテーブルは、
| hide | school_list | table |
(↑\dの結果の一部抜粋。)
それで、中身は、
bio=> select * from school_list2;
id|name |num|serial
--+--------------------+---+----------
1|NAME | 20|03xxxxxxxx
3|NAME | 20|03xxxxxxxx
2|NAME2 | 20|03-2554545
(3 rows)
ようやくRubyでもSQLが発行できるようになった。これでなんとか使いこなせそうだ。
ただ実際にSQLを発行することになるのはJavaなのかもしれない。Javaの場合は、
jdbcドライバがないとならない。それは実はインストールしてあるんだけど、
でもSQLサーバにあるJavaがBlackDownっていうちょっとやくざなJavaなのでうまく動かないかもしれない。
いちおう動くはずなんだけど全然保証がないのだ。
今はとにかくSQLをマスターすることが先決だからPerlとpsqlを用いて遊んでみることにする。
それが終わってからやっとJavaかな。Javaも忘れないようにしないと。Javaはハノイの塔を作るって言う
目標があったんだよね。
|
|
2003年4月23日(木)8時35分21秒
本格的なDB作成
|
|
はじめて大掛かりなDBを作成した。ちょうどアドレス帳をEXCELで作成していたからCSV形式に吐き出して、
それをPerlで処理してテーブルにINSERTしたのだ。その一気にはいる快感はうれしかった。
とうとうDBらしいものができたのでさっそくこれを活用したいところだった。
ただかなりプライベートなものなのでちゃんと管理しないとならない。
|
|
2003年4月23日(木)4時29分48秒
TITLE
|
|
またまた問題発生!どんなタイムラグで発生しているのか知りたくない。
psqlでネットワーク接続して、日本語を打つと画面に表示できない。無効化してしまう。
ターミナルの問題かと思ったんだけどでも通常のシェルではできる。
なんか調べていたら分かったようなきがする。これはエンコードの問題みたい。
PGBASHという便利なツールがあるんだけど
http://www.psn.co.jp/PostgreSQL/pgbash-2.2/index-j.html
ここでもサーバがEUCでクライアントがSJISの場合に環境変数を設定して処理するように
説明があった。きっとpsql自体にもそのことで問題があるんだろう。
んでわかった。
http://search.net-newbie.com/pgsql/multibyte.html
ここにもあるけど、やっぱり環境変数だ。
~.bashrcに、
export PGCLIENTENCODING=SJIS # For PostgreSQL
って環境変数を書いておくとクライアントからサーバに接続しに行ったときにエンコードが
設定されるんだそうだ。でも、あとからいろいろ帰られるらしい。
でも、それでもうまくいかない。やり方は会ってるはずなんだけど…。
|
|
2003年4月23日(木)4時0分22秒
TITLE
|
|
bio=> \! date
Wed Apr 23 03:59:43 2003
PostgresTips集。
psqlのシェルのなかからシステムのシェルを動かしたいときにいちいち\qで終わらせてから
もういちどpsqlに戻るなんてのは大変。そんなとき、\! [COMMAND]で、実行できるらしい。
こいつは使える。あ、でもcdは使えなかった。って当然か…。
でも、ターミナルをいくつも開いて作業しているとpsqlがどっちからどっちへ開いているのか
わかんなくなる。そんなときもこの方法を使えば、
bio=> \! hostname
elizabethae
bio=> \! ls
tmp.sql
bio=> \! pwd
/home/hide/dbwork
bio=> \! more tmp.sql
select * from drink;
select coffee from drink;
select tea from drink;
こんなかんじに今どっちのマシンがクライアントか(今回は、elizabethaeからmendeziへリモート接続している)
とか、作業ディレクトリにあるSQLファイルの中身を調べたりとかできるわけ。
こいつは大変便利である。
で、今思いついたのが、psqlの中でpsqlを実行できないか?というもの。やっぱり実行できます(^. ^;
bio=> \! psql hide
Welcome to psql 7.3.2, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help on internal slash commands
\g or terminate with semicolon to execute query
\q to quit
hide=#
これはmendeziへ接続しに行ってその間にpsqlのシェルの中でローカル接続するpsqlを実行したもの。
ちなみにもどるときは、
hide=# \q
bio=>
こうすれば戻れます。って、なんかだんだんpsqlマニアになってきた。
bio=> select * from bwh;
・ミ・ケ・ネ | ・メ・テ・ラ | ・ヲ・ァ・ケ・ネ
--------+--------+----------
80 | 50 | 40
(1 row)
bio=> select * from bwh;
バスト | ヒップ | ウェスト
--------+--------+----------
80 | 50 | 40
(1 row)
上が、SJISで出力、下がEUC。ネットワーク接続ってOSの違いとかが関係してくるんだよね。
よかった、TeraTermProで。
あと、psqlで補完動作ができないかなっておもっていたら作っている人がいました。
http://pjam.jpweb.net/cgi/wiki/yukiwiki.cgi?mycmd=read&mypage=PgBashComplete
|
|
2003年4月23日(木)3時34分49秒
TITLE
|
Postgresをネットワーク接続できたので、その辺のことを書きます。
まず、ローカル接続した場合(Windows2k環境下 PostgreSQL 7.3.2)
[hide@elizabethae ~]$ psql hide
Welcome to psql 7.3.2, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help on internal slash commands
\g or terminate with semicolon to execute query
\q to quit
hide=# \d
List of relations
Schema | Name | Type | Owner
--------+-----------+-------+-------
public | shinamono | table | hide
(1 row )
ここでまちがえちゃうのはバージョンが出ているのはあくまでクライアントツールpsqlのバージョンのこと。
サーバ側とは一致しないこともあるわけ。今回はローカル環境へ接続しているのでサーバとクライアントは
おなじバージョンです。
次に、ネットワーク接続した場合(Vine1.1 on i486 PostgreSQL 6.5.3)
[hide@elizabethae ~]$ psql -h mendezi bio
ERROR: parser: parse error at or near "."
Welcome to psql 7.3.2, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help on internal slash commands
\g or terminate with semicolon to execute query
\q to quit
bio=> \d
ERROR: parser: parse error at or near "."
さっそく問題が起きてます。・゜(´□`)゜・。
なんかparserがエラーを出してます。何なんでしょう?
http://ml.postgresql.jp/pipermail/pgsql-jp/2003-March/004512.html
ここに似た問題がありました。どうやらCygwinのバージョンによるものみたいです。
リダイレクト周りとありますが僕の場合はリダイレクトを使っていない(そもそも
psqlで接続しに行ってるときにおこるから)。
そうそうCygwinのバージョンはsetup.logから
2003/04/12 13:07:12 Starting cygwin install, version 2.249.2.10
だとわかります。あんまりCygwinのバージョン気にしないんだよね。
ちょっとちょっとなんか技のようなものを見つけたのでメモし解きます。
catコマンドをヒアドキュメントとリダイレクトを使うと
viを使わなくてもこんなことができる!viがあるんだから
いいじゃん。ということなかれ。この技を応用すればWindowsでも
使えるかもしれない。
いや、ちょっと考えて無理か…。
[hide@elizabethae ~/dbwork]$ cat <tmp.sql
> select * from drink;
> select coffee from drink;
> select tea from drink;
> EOF
こんなことをしてファイルを作る方法があったとは。これって
簡単なファイルを作るときには使える方法だな。こうやってファイルの中身を
つくるところを示すのにはいいのかも。
|
|
2003年4月23日(木)3時19分13秒
CygwinのLink先
|
Cygwinを使いまわしているのでCygwin関係のLink先も集めておこうと思う。
Project Heavy Moon
ここはCygwin環境下でRPMを作っているところ
そういえばむかしここへ来たことがあったかなぁ。
|
|
2003年4月23日(木)3時22分51秒
SLを成功させる on Cygwin
|
前に挑戦して断念していた冗談コマンド"SL"。しかし、Cygwinでインストールに成功していたひとがいた!
(なぜか探しているときにはリンク先がないんだよね。)何が違うのかまだ調べきってないんだけど、
どうやらslのバージョンが前に挑戦したときのよりも新しいみたい。だって作者のページからもってきたんだ
けど。ver.3.02からver.3.03にあがっていました。2000年に。
それで見ていたらSLに関するページがあるある。
http://www.linet.gr.jp/~izumi/sl/
http://www.tkl.iis.u-tokyo.ac.jp/~toyoda/sl/aroundlink.html
それでなんとコンパイルできました!ただ、CygwinにコンパイラがgccしかはいってなかったのでMakefileを
いじってみるとあのSLがCygwinで動いている!あんなに苦労したのに。。。
というかどうやらncurseっていうもののせいらしい。ぼくはなんだかまちがったncurseを入れていたんではないか?
って気がする 。
ncursesの書庫はこちら↓
ftp://ftp.ring.gr.jp/pub/GNU/ncurses
でも、どうせだからと、SL改造版をいれることにしました。ちょっと『往路 28 両目で core dump するバグを発見・修正』という
文に惹かれたので(^. ^;パッチを当てて
[hide@elizabethae /usr/src/sl/sl]$ ls
Makefile Makefile.orig README header.h sl.c sl.h sl5-1.patch
Makefile.bak Makefile.rej README.patch5 sl.1 sl.exe* sl.txt
[hide@elizabethae /usr/src/sl/sl]$ patch -p 2< sl5-1.patch
さっそく実行してみると…これは試してみてください。ぼくはあんまりlsをミスタイプしないほうなんでこの改造版のほうが
いいなぁっておもいました。
ついでにi486マシンmendeziにも入れてみようと思います。パワーがないから大変かもしれないけどソフトの機能は十分に
発揮できるのかも。
[hide@mendezi 030422]$ make
gcc -fstrength-reduce -O -o sl sl.c -lcurses -ltermcap
sl.c:28: curses.h: No such file or directory
make: *** [sl] Error 1
前はこんなかんじでだめだった。ncursesがはいってない!?でも入れたような。うろ覚え。
|
|
DATE
2003年4月23日(木)1時49分49秒
Windowsのコマンド群 NET
|
|
ちょっと奇妙なコマンドをネットで見ていたら見つけたのでTips集ということで。
netコマンドというのがあって、Windows上でPCの設定を買えるコマンド群なんだそうです。
それで面白いのが、NTPサーバと同期を取るnet timeとPC同士でメッセージを送る、net sendです。
net time [\\コンピュータ名] /setsntp:[NTPサーバ名]
とするとNTPサーバと同期が取れるらしい。実際にやってみました。
C:\>net time \\elizabethae /setsntp:clock.nc.fukuoka-u.ac.jp
コマンドは正常に終了しました。
net send [PC名、ユーザ名など][メッセージ]
これはちょっとやってません。機会があったらやってみたいと思います。
どちらも桜時計、IP Messengerと似た機能ってことですね。でも、標準で装備されているとは知り
ませんでした。
あと、Windows2000を使うとどうしてもユーザ管理があるので別ユーザで立ち上げたりしたいんだけど
わざわざログオフしないとならない。でも、実は自分以外のユーザになって実行することが可能なんだとか。
runas (/profile) /user:[マシン名]\[ユーザ名] [コマンド]
といった感じです./profileを付けるとユーザプロファイルを読み込みます.例えばsu.batとして
@echo off
runas /profile /user:%COMPUTERNAME%\administrator "cmd /f:on"
echo on
を保存して実行すればadministrator権限でコマンドプロンプトを実行できるようになるらしい。
これらは
http://www.ozawa.ics.keio.ac.jp/~yamano/Notes/commandline_w2k.html
ここにかかれてありました。もしこのページが消えたらどうしよう!と思って書き残しておいたんです。
|
|
2003年4月23日(木)0時41分43秒
Postgresの起動スクリプトとネットワーク接続権限
|
今日もPostgresをいじろうとした。ところがいつも起動するときに使っているシェルスクリプトが
気に入らないことに気になりだしてこれは直してやる!という気になったのだ。
シェルスクリプトはelizabethaeの法で使っているやつで、Cygwin環境下で使っている。
PG_DATAもPOSTGRES_LIGもPOSTGRES_INCLUDEとかも全然違うので設定を変えたものを使わないと成らない。
LINUXで使っているスクリプトは起動用なんだけど裏で勝手にINITが起動してくれているやつだ。
/etc/rc.d/init.d/postgresqlってやつ。でも、そのスクリプトはルート権限で動かすわけで、途中で
Postgresユーザに変身してpostmasterを動かしたり独特な書かれ方をしている。
Cygwinで動かす限り、ルート権限を考えなくてもいいし、Postgresスーパーユーザが起動してくれれば
全然問題ないのだ。というわけでほかにもいろいろと手を加えてようやく環境に合った起動スクリプトを
INIT用から書き換えることに成功したのでここに書き残すことにします。
1 #!/bin/sh
2 # Cygwin環境下でのPostgres起動スクリプト
3 # UNIXにしかないコマンドなどを排除し、Windows上でも動かせるように修正をした
4 # 2003.04.22
5 # See how we were called.
6 case "$1" in
7 start)
8 echo -n " Checking postgresql installation: "
9 if [ -f /usr/local/pgsql/data/PG_VERSION ]
10 then
11 if [ `cat /usr/local/pgsql/data/PG_VERSION` != '7.3' ]
12 then
13 echo "old version. Need to Upgrade."
14 exit 1
15 else
16 echo "looks good!"
17 fi
18 fi
19
20 pid=`ps aux | grep postgres | sed -n 1p | cut -f6 -d" "`
21 if [ $pid ]
22 then
23 echo " Postmaster already running. "
24 else
25 rm -f /tmp/.s.PGSQL.* > /dev/null
26 echo -n " Starting Postgres service: "
27 #su -l hide -c '/usr/bin/postmaster -i -S -D/usr/lib/postgresql > /usr/local/pgsql/data/log/post
gres.log 2>&1 &'
28 # Cygwinなのでユーザ権限を無視してPostmasterを起動。もちろん オプションは忘れずに。
29 /usr/bin/postmaster -i -S > /usr/local/pgsql/data/log/postgres.log 2>&1 &
30 sleep 1
31 pid=`ps aux | grep postgres | sed -n 1p | cut -f6 -d" "`
32 if [ $pid ]
33 then
34 echo -n "postmaster [$pid]"
35 echo $pid > /usr/local/pgsql/data/postmaster.pid
36 echo
37 else
38 echo -n "failed."
39 fi
40
41 fi
42 ;;
43 stop)
44 pid=`ps aux | grep postgres | sed -n 1p | cut -f6 -d" "`
45 echo -n "Stopping postgresql services:"
46 kill $pid
47 sleep 2
48 rm -f /usr/local/pgsql/data/postmaster.pid
49 echo
50 ;;
51 status )
52 pid=`ps aux | grep postgres | sed -n 1p | cut -f6 -d" "`
53 echo "postmaster (pid $pid) is running..."
54 ;;
55 restart)
56 $0 stop
57 $0 start
58 ;;
59 *)
60 echo "Usage: postgresql {start|stop|status|restart}"
61 exit 1
62 esac
63
64 exit 0
いろいろ手を加えたんだけど大きな修正個所は、20行目の
pid=`ps aux | grep postgres | sed -n 1p | cut -f6 -d" "`
です。オリジナルは、簡単に、$pid=`pidof postmaster`としていました。
まず、Cygwin環境下でpidofはありません(^. ^;それで、しかたなくパイプを使って,psの出力結果を
Postmasterの起動状況つまりPIDがあるかどうかあればその数字を表示するといったことにしたわけです。
また、psを使った場合、実際に起動しているのはpostmasterではなくて/bin/postgres.exeという実行ファイル
だったために、ps postgresとしました(postmasterはpostgres.exeのシンボリックリンクだったんです)。sed -n 1pは、ほかにもプロセスが上がっているんですけど、
そのなかで1行目のプロセスだけに注目しようというわけです。cut -f6 -d" "は、その中からPIDの値だけを
抽出するために使いました。また、なぜだか知りませんがその1つのプロセスをKILLするとほかのプロセスも
うまい具合に消えてくれます。というわけでps aux | grep postgresの出力結果から1行目だけを相手にして
処理をするとstartもstopもstatusもrestartもうまく扱うことができました。
あとはオリジナルとほとんど同じ処理です。というかもっと細かい極め細やかさがあったんだけど、
それらを削除しました(^. ^;
このINIT用のスクリプトは第1引数をうまくcase文を使って処理しているあたりが
うまいなぁっておもいます。あとは、postmaster.pidが残らないようにstopのところにrmしてしまう処理を
加えているのでようやくプロセスをKILLすることができます。KILLをいちいちしなくても良くなったわけです。
いままでは起動するときに残っていたら削除して起動というようにしていたんだけど、やっぱあと片付けは
直後にやるのがマナーなんだろうなぁって思って。
それでとうとうelizabethaeできちんとPostgresが起動、停止、再開、状況ができるようになりました!
ようやくやった!というかんじです。これでようやくまともになりました。
で、もうひとつelizabethaeとmendeziが互いにサーバークライアントになることができたのです!
pg_hba.confがちゃんと設定されたからだとおもう。ちょっと気がかりなのは、elizabethaeのほうのPG_DATA配下
にpostgresql.confができていたこと。前からあったのか?
こいつにもネットワークのアクセス制限に関係する記述があるのでそれも修正しました。tcpip = trueとかなんとか
ってやつだったと思う。
|
|
2003年4月22日(水)6時0分11秒
PostgreSQLでSQLの勉強
|
|
いままでやってきたことはSELECT文での出来事です。ほかにもINSERT文とかはデータ操作(DML)に入るし、
関数は処理をするからまた別。なかなか先にはすすめないなぁってかんじ。トリガーなんてのもみたことあるし、
みようみまねで例題をコピーはしたけどなんのことだかわかんないある条件で特定の動作をさせたいときに使うらしい
んだけどそれが必要だ!という状態にはまだなってない。
|
|
2003年4月22日(水)3時57分7秒
PostgreSQLでSQLの勉強(基本的なSQL文の作成)
|
今回はSQLの検索方法の妙を学びます。前文検索をしていたんでは表示されてもなんのことだか
わかんない!というときのとっておきの技があるといいます。いやなければSQLではないんです!
bio=> select * from 従業員 where 部署NO=20;
従業員no|従業員名|担当|上司| 入社日| 給与|コミッション|部署no
--------+--------+----+----+----------+------+------------+------
7360|小出 |営業|7698|02-22-1981|225000| &nbs
p; 50000| 20
7360|松岡 |課長|7839|04-02-1981|297500| &nbs
p; | 20
7360|高木 |営業|7698|09-28-1981|225000| &nbs
p; | 20
7360|藤原 |課長|7839|05-01-1981|385000| &nbs
p; | 20
7360|高橋 |課長|7839|06-09-1981|345000| &nbs
p; | 20
7360|藤井 |主任|7566|06-13-1987|300000| &nbs
p; | 20
7360|林 |社長| 0|11-17-1981|900000| &nb
sp; | 20
7360|川口 |営業|7698|09-08-1981|250000| &nbs
p; | 20
7360|長谷川 |担当|7788|03-13-1987|210000| &n
bsp; | 20
7360|田中 |担当|7698|12-03-1981|195000| &nbs
p; | 20
7360|桜井 |主任|7566|01-03-1981|300000| &nbs
p; | 20
7360|田村 |担当|7782|01-03-1982|230000| &nbs
p; | 20
(12 rows)
これは、部署NOが20の列を抜き出すコマンドです。今回はwhere句がニューカマーですね。
ここでWHERE句が使用できる比較条件を示してみます。
| 比較条件
|
意味
|
例
|
| =
|
等しい
|
col=100
|
| !=<>^=
|
等しくない
|
col != 100
|
| >=
|
以上
|
col >= 100
|
| <=
|
以下
|
col <= 100
|
| >
|
より大きい
|
col > 100
|
| <
|
より小さい
|
col < 100
|
| BETWEEN a AND b
|
a以上b以下の範囲
|
col BETWEEN 100 AND 200
|
| NOT BETWEEN a AND b
|
a以上b以下の範囲外
|
col BETWEEN 100 AND 200
|
| IN (list)
|
list内のいずれかと等しい
|
col IN (10,20)
|
| NOT IN (list)
|
list内のいずれかとも等しくない
|
col NOT IN (10,20)
|
| IS NULL
|
NULL値である
|
col IS NULL
|
| IS NOT NULL
|
NULL値でない
|
col IS NOT NULL
|
| LIKE
|
文字パターンと一致する
|
col LIKE 'A%'
|
| NOT LIKE
|
文字パターンと一致しない
|
col NOT LIKE 'A%'
|
ここでNOTをWHERE句に使用した場合の実行結果を示してみます。
bio=> select * from 従業員 where not 部署NO=20;
従業員no|従業員名|担当|上司| 入社日| 給与|コミッション|部署no
--------+--------+----+----+----------+------+------------+------
7360|伊藤 |担当|7902|12-17-1980|180000| | 30
7499|白井 |営業|7698|02-20-1981|260000| 30000| 30
(2 rows)
あと論理条件に優先順位があるということです。
() > NOT > AND > OR
んで、ちょっと複雑極まりない条件をWHERE句に使用してみます。
bio=> select * from 従業員 where 部署NO=20 OR 部署NO=30 AND 担当='担当' OR NOT 担当='課長' AND 部署NO=30;
従業員no|従業員名|担当|上司| 入社日| 給与|コミッション|部署no
--------+--------+----+----+----------+------+------------+------
7360|伊藤 |担当|7902|12-17-1980|180000| | 30
7499|白井 |営業|7698|02-20-1981|260000| 30000| 30
7360|小出 |営業|7698|02-22-1981|225000| 50000| 20
7360|松岡 |課長|7839|04-02-1981|297500| | 20
7360|高木 |営業|7698|09-28-1981|225000| | 20
7360|藤原 |課長|7839|05-01-1981|385000| | 20
7360|高橋 |課長|7839|06-09-1981|345000| | 20
7360|藤井 |主任|7566|06-13-1987|300000| | 20
7360|林 |社長| 0|11-17-1981|900000| | 20
7360|川口 |営業|7698|09-08-1981|250000| | 20
7360|長谷川 |担当|7788|03-13-1987|210000| | 20
7360|田中 |担当|7698|12-03-1981|195000| | 20
7360|桜井 |主任|7566|01-03-1981|300000| | 20
7360|田村 |担当|7782|01-03-1982|230000| | 20
(14 rows)
これは、日本語にすると、部署NOが20あるいは部署NOが30でかつ担当が’担当’かあるいは担当が’課長’でない部署NOが30の列をぬきだせということ。なんだ!!!!!!!!!!!!とぶちきれそうですが、情報処理試験とかで出てきそうな感じです。
日本語ですがもう日本語ではありません。すでに条件があっているのかどうか判別ができません。どうしたいいもんでしょうか?
こんどはNOT IN条件です。まずは検索結果をみてください。
bio=> select 従業員名,担当 from 従業員 where 担当 NOT IN ('営業','課長','担当');
従業員名|担当
--------+----
藤井 |主任
林 |社長
桜井 |主任
(3 rows)
担当が営業でもなく課長でもなく担当でもないひとたちです。藤井さんと林さんと桜井さんですね。
んで結果を出すこと自体は簡単なんですがほかに注意をしてみたほうがいいことがあります。
表示の工夫です。担当を注目したいので、列名に担当を抜き出そうとするのはいいんですがそれが誰なのか?
ということが大事なわけです。逆にそれ以外の情報を表示させると分けわかんなくなりがちです。
たとえば、
bio=> select * from 従業員 where 担当 NOT IN ('営業','課長','担当');
従業員no|従業員名|担当|上司| 入社日| 給与|コミッション|部署no
--------+--------+----+----+----------+------+------------+------
7360|藤井 |主任|7566|06-13-1987|300000| | 20
7360|林 |社長| 0|11-17-1981|900000| | 20
7360|桜井 |主任|7566|01-03-1981|300000| | 20
(3 rows)
なんて表示の仕方をすると何を抜き出そうとしようとしたのか焦点がぼやけてしまうわけです。あんまり気にしない(というか当然?)のでその辺は例題とかやってると気にならないんだけど大事な点だと思います。
たとえば、SQLらしいなぁと僕が勝手に思い込んでるLIKE条件ですが、
bio=> select distinct 担当 from 従業員 where 担当 like '%長';
担当
----
課長
社長
(2 rows)
こうやるとあぁ、〜長って肩書きのひとは課長と社長か!っておもうんだけど、
つぎのようにやると、
bio=> select * from 従業員 where 担当 like '%長';
従業員no|従業員名|担当|上司| 入社日| 給与|コミッション|部署no
--------+--------+----+----+----------+------+------------+------
7360|松岡 |課長|7839|04-02-1981|297500| | 20
7360|藤原 |課長|7839|05-01-1981|385000| | 20
7360|高橋 |課長|7839|06-09-1981|345000| | 20
7360|林 |社長| 0|11-17-1981|900000| | 20
(4 rows)
??なんだか何を抜き出そうとしたのか自分でもわからないぞっと(
『
ekiden 駅伝』の別所哲也調)。
こんどはまたもやぼくがSQLちっくだ!とおもっているORDER BYです。
これは行の並び替え(ソート)をおこなうものです。いままでは列に関する条件でしたが、
こんどは行に関するものなんだ!ということを念頭におくようにしてください。ここ重要!
bio=> select 部署NO, 従業員名, 給与, 担当 from 従業員 where 担当='担当' order by 部署NO;
部署no|従業員名| 給与|担当
------+--------+------+----
20|長谷川 |210000|担当
20|田中 |195000|担当
20|田村 |230000|担当
30|伊藤 |180000|担当
(4 rows)
どうです!よく分からない方は、こんどはORDER BYを使わないで表示してみます。
bio=> select 部署NO, 従業員名, 給与, 担当 from 従業員 where 担当='担当';
部署no|従業員名| 給与|担当
------+--------+------+----
30|伊藤 |180000|担当
20|長谷川 |210000|担当
20|田中 |195000|担当
20|田村 |230000|担当
(4 rows)
bio=> select 部署NO, 従業員名, 給与, 担当 from 従業員 where 担当='営業' order by 部署NO desc;
部署no|従業員名| 給与|担当
------+--------+------+----
30|白井 |260000|営業
20|小出 |225000|営業
20|高木 |225000|営業
20|川口 |250000|営業
(4 rows)
今度は、descというキーワードをつけました。これはDESCENDINGをあらわすDESCキーワードです。これを列名の
最後につけると降順に並び替えます。
bio=> select 部署NO, 従業員名, 給与, 担当 from 従業員 where 担当='営業' order by 部署NO;
部署no|従業員名| 給与|担当
------+--------+------+----
20|小出 |225000|営業
20|高木 |225000|営業
20|川口 |250000|営業
30|白井 |260000|営業
(4 rows)
つけないとこう。つまり何もつけないときは昇順なんです。デフォルトが昇順ってことですね。
もちろん複雑な技が使えます。
bio=> select 部署NO, 従業員名, 給与, 担当 from 従業員 where 部署NO=20 order by 担当 desc, 給与 desc;
部署no|従業員名| 給与|担当
------+--------+------+----
20|田村 |230000|担当
20|長谷川 |210000|担当
20|田中 |195000|担当
20|藤井 |300000|主任
20|桜井 |300000|主任
20|林 |900000|社長
20|藤原 |385000|課長
20|高橋 |345000|課長
20|松岡 |297500|課長
20|川口 |250000|営業
20|小出 |225000|営業
20|高木 |225000|営業
(12 rows)
これは部署NOが20の行を担当の降順、給与の降順に表示するという意味です。
ただ、担当を降順に並べるってどんな意味があるんだろう?それに給与はvarcharなのであんまり今回は意味ある並び替えに
なっていない点に注目…市内でください。・゜(´□`)゜・。
やっぱりデータで給与がvarcharになってたりするのはデータ操作がしづらいので変えることにしました。
ぼくはもとのテーブル作成時のSQLをファイルでもっていたので変更するのはそれほど句ではなかったけど、
それがもしなかったらテーブルの中身をいったんどこかへ非難しておいて、それを新しく作ったテーブルに
入れなおして、もとのテーブルを削除したあとに新しいテーブルをリネームするという手順を踏むとできる
みたい。さっきやろうとしたんだけどよくわかんなくなってきて断念しました。
でも、コマンドでcopyとかalterとか使うのでこれはSQLスーパーユーザであるPostgresでないとだめかも。
さっそく修正をしたDBで実行してみます。修正個所は、
[hide@mendezi dbwork]$ diff employee.sql employee_new.sql
7,8c7,8
< 給与 varchar(255),
< コミッション varchar(255),
---
> 給与 int4,
> コミッション int4,
です。つまり列名で、給与とコミッションをそれぞれvarchar(255)からint4へ変更しました。
bio=> select 部署NO, 従業員名,給与, 給与*12 AS 年収 from 従業員 order by 年収;
部署no|従業員名| 給与| 年収
------+--------+------+--------
30|伊藤 |180000| 2160000
20|田中 |195000| 2340000
20|長谷川 |210000| 2520000
20|小出 |225000| 2700000
20|高木 |225000| 2700000
20|田村 |230000| 2760000
20|川口 |250000| 3000000
30|白井 |260000| 3120000
20|松岡 |297500| 3570000
20|藤井 |300000| 3600000
20|桜井 |300000| 3600000
20|高橋 |345000| 4140000
20|藤原 |385000| 4620000
20|林 |900000|10800000
(14 rows)
給与(1か月分)を12倍すると年収になるんだけど(当然か)、これを年収という列名で別名を与え、
しかもその年収に対してORDER BYをかけてソートをしてしまうというすごい技。
今回は給与も表示したんだけど年収は給与をもとに算出しているから本来は表示しないのが普通かも。
変化を見たかったので表示してみました。
データの制限とソートはこんなとこでしょう。端降りつつも結構ちゃんとやりました。
ORとかANDとかNOTとかは組み合わせ次第でかなりのことができるようになるんでしょう。
とりあえずこんなかんじのことが分かっていればいいんではないでしょうか?
次は関数です。関数はこれまたいろんなことができそう。もうすでに関数のいくつかはでてきてるけど、
NVL関数とかOracle特有のものもあるみたい。これについてはあとで述べることにして。
ちなみにどっかを調べたら関数を作成してOracleのNVL関数と同等のことをできる関数をみせていた
ひとがいました。関数を作って登録することとかできるんですね。どうやるのかなんてまだ
今のレベルではできそうにないです(_。_)。ο〇
|
|
2003年4月22日(水)3時39分10秒
PostgreSQLでSQLの勉強(基本的なSQL文の作成)
|
今日は、文字列の連結から。
連結演算子(||)をつかうとリテラル文字と列を連結して表示ができるんだとか。
意味不明ですね。リテラル文字とは、SELECT句に含まれた文字、数字、または日付のことをいうんだそうだけど
まだ意味不明。っていうか実用的にするのにどうすればいいのかがみえてこないですね。やはり論より証拠。
bio=> select 従業員名||'の職種は'||担当||'です。' from 従業員;
?column?
------------------------
伊藤の職種は担当です。
白井の職種は営業です。
小出の職種は営業です。
松岡の職種は課長です。
高木の職種は営業です。
藤原の職種は課長です。
高橋の職種は課長です。
藤井の職種は主任です。
林の職種は社長です。
川口の職種は営業です。
長谷川の職種は担当です。
田中の職種は担当です。
桜井の職種は主任です。
田村の職種は担当です。
(14 rows)
わかったでしょうか?なんか一発理解ですね。
つまり表示するときに説明する文字をくっつけて表示させたいときに使うんでしょう。
やはり?column?があります。これは仕方ないんでしょうか?
bio=> select 従業員名||'の職種は'||担当||'です。' AS 各従業員の職種 from 従業員;
各従業員の職種
------------------------
伊藤の職種は担当です。
白井の職種は営業です。
小出の職種は営業です。
松岡の職種は課長です。
高木の職種は営業です。
藤原の職種は課長です。
高橋の職種は課長です。
藤井の職種は主任です。
林の職種は社長です。
川口の職種は営業です。
長谷川の職種は担当です。
田中の職種は担当です。
桜井の職種は主任です。
田村の職種は担当です。
(14 rows)
おぉ!!ちゃんと表示できてる。問い合わせの結果を表示する場合に、列名を列の見出しとして
表示するんだけど、その見出しを帰ることができるんだそうです。それがASキーワード。
列の別名をつけてやるんですね。
ほんとは文字列を連結した時点で表示されるはずなんだけど、まぁいいや。Postgresの仕様なんだろう。
でも、ASキーワードは列名を表示させたいときのいい味方になってくれそうなんである。
|
|
2003年4月22日(水)2時57分18秒
PostgreSQLでSQLの勉強(基本的なSQL文の作成)
|
とりあえずデータからまず、従業員テーブルで従業員名列を検索してみました。
bio=> select 従業員名 from 従業員;
従業員名
--------
伊藤
白井
小出
松岡
高木
藤原
高橋
藤井
林
川口
長谷川
田中
桜井
田村
(14 rows)
今度は、すごく良く使う、列名にアスタリスク(*)を使うと全列が検索できるというやつ。
bio=> select * from 従業員;
従業員no|従業員名|担当|上司| 入社日| 給与|コミッション|部署no
--------+--------+----+----+----------+------+------------+------
7360|伊藤 |担当|7902|12-17-1980|180000| | 30
7499|白井 |営業|7698|02-20-1981|260000| 30000| 30
7360|小出 |営業|7698|02-22-1981|225000| 50000| 20
7360|松岡 |課長|7839|04-02-1981|297500| | 20
7360|高木 |営業|7698|09-28-1981|225000| | 20
7360|藤原 |課長|7839|05-01-1981|385000| | 20
7360|高橋 |課長|7839|06-09-1981|345000| | 20
7360|藤井 |主任|7566|06-13-1987|300000| | 20
7360|林 |社長| 0|11-17-1981|900000| | 20
7360|川口 |営業|7698|09-08-1981|250000| | 20
7360|長谷川 |担当|7788|03-13-1987|210000| | 20
7360|田中 |担当|7698|12-03-1981|195000| | 20
7360|桜井 |主任|7566|01-03-1981|300000| | 20
7360|田村 |担当|7782|01-03-1982|230000| | 20
(14 rows)
今度は、特定の列の選択。列と列の間にカンマ(,)を入れると複数の列を選択できます。
bio=> select 部署NO,従業員名 from 従業員;
部署no|従業員名
------+--------
30|伊藤
30|白井
20|小出
20|松岡
20|高木
20|藤原
20|高橋
20|藤井
20|林
20|川口
20|長谷川
20|田中
20|桜井
20|田村
(14 rows)
できました。
今度は、列の選択です。列を選択してもそのなかに重複するものがある場合があります。
そのとき、DISTINCTを指定すると、一意な値だけを表示します。論より証拠。
bio=> select 担当 from 従業員;
担当
----
担当
営業
営業
課長
営業
課長
課長
主任
社長
営業
担当
担当
主任
担当
(14 rows)
bio=> select distinct 担当 from 従業員;
担当
----
営業
課長
社長
主任
担当
(5 rows)
DISTINCTを指定しなかったときは課長とか営業とか重複しているけど、DISTINCTを指定したときは
その値が一意なものになっているのがわかるとおもいます。SQLは論より証拠!
ただむずいのは、複数の列名を指定したときにDISTINCTを使うとき。
bio=> select 部署NO, 担当 from 従業員;
部署no|担当
------+----
30|担当
30|営業
20|営業
20|課長
20|営業
20|課長
20|課長
20|主任
20|社長
20|営業
20|担当
20|担当
20|主任
20|担当
(14 rows)
bio=> select distinct 部署NO, 担当 from 従業員;
部署no|担当
------+----
20|営業
20|課長
20|社長
20|主任
20|担当
30|営業
30|担当
(7 rows)
この違いが分かるでしょうか?
今度は、算術式。
SQL文のなかでも計算ができます。式には優先順位があって、
乗算 *
除算 /
加算 +
減算 -
の順で優先的に計算されます。この辺は四則演算そのもの。だから当然、自分が優先したいところには
()をつけると先に計算されることもおなじ。
職種が営業のひとの給与とコミッションを加算する場合
bio=> select 従業員名, 給与, コミッション, 給与+コミッション from 従業員 where 担当='営業';
ERROR: Unable to identify an operator '+' for types 'varchar' and 'varchar'
You will have to retype this query using an explicit cast
あれ??なんか計算できないらしい。んで、エラーを見ると+をvarcharに適用できないというエラーみたい。
従業員テーブルをもう一度みてみよう。
bio=> \d 従業員
Table = 従業員
+----------------------------------+----------------------------------+-------+
| Field | Type | Length|
+----------------------------------+----------------------------------+-------+
| 従業員no | int4 | 4 |
| 従業員名 | varchar() | 255 |
| 担当 | varchar() | 255 |
| 上司 | int4 | 4 |
| 入社日 | date | 4 |
| 給与 | varchar() | 255 |
| コミッション | varchar() | 255 |
| 部署no | int4 | 4 |
+----------------------------------+----------------------------------+-------+
たしかに二つともvarcharでした(^. ^;
たしかに計算できないです。int型じゃないと計算できないってことね。
でもひとまず計算したいので、計算する意味は置いておくとして、上司と部署NOを足して
表示してみます。
bio=> select 従業員名, 上司, 部署NO, 上司+部署NO from 従業員 where 担当='営業';
従業員名|上司|部署no|?column?
--------+----+------+--------
白井 |7698| 30| 7728
小出 |7698| 20| 7718
高木 |7698| 20| 7718
川口 |7698| 20| 7718
(4 rows)
これは、職種が営業の人たちの上司と部署NOを足した値を表示するというもの。意味はわからない
ですがとりあえず表示できてます。で、本当なら、?column?のところに上司+部署NOが入るはずなんだけど
成ってないですね…。なんででしょう?深く考えずに次に行きます!
というわけで次にNVL関数を勉強しようと思ったんだけど、PostgresにはNVL関数がありません(^. ^;
でも、似たやつでCOALESCE関数ってのがあるんだけどちょっと書式がちがいます。それにNULLがどんなかんじに
はいっているのか自分の作ったテーブルに責任がもてないので実例を示すのをやめます。というわけで
この辺で。・゜(´□`)゜・。
COALESCE関数についてはこの辺↓
http://www.postgresql.jp/document/pg653doc/ej/user/functions.htm
|
|
2003年4月22日(水)1時31分5秒
PostgreSQLのテーブルの削除
|
テーブルを作ったんだけどそのテーブルの定義を間違えてしまった。おなじ名前のテーブルを作成したいから
そのテーブルを削除したい。
bio=> \d
Database = bio
+------------------+----------------------------------+----------+
| Owner | Relation | Type |
+------------------+----------------------------------+----------+
| postgres | drink | table |
| postgres | grp | table |
| postgres | grp_pkey | index |
| postgres | name_list | table |
| hide | school_list | table |
| hide | school_list2 | table |
| hide | school_list2_pkey | index |
| hide | school_list_pkey | index |
| postgres | test | table |
| hide | 従業員 | table |
+------------------+----------------------------------+----------+
bio=> drop table 従業員;
DROP
bio=> \d
Database = bio
+------------------+----------------------------------+----------+
| Owner | Relation | Type |
+------------------+----------------------------------+----------+
| postgres | drink | table |
| postgres | grp | table |
| postgres | grp_pkey | index |
| postgres | name_list | table |
| hide | school_list | table |
| hide | school_list2 | table |
| hide | school_list2_pkey | index |
| hide | school_list_pkey | index |
| postgres | test | table |
+------------------+----------------------------------+----------+
たしかに消えている!
今度はちゃんと表をつくる。あらかじめ、SQL文を書いたファイルを用意して
読み込ませることにする。
bio=> \i division.sql
create table 部署(
部署NO int4,
部署名 varchar(255),
場所 varchar(255)
);
CREATE
EOF
bio=> \i employee.sql
create table 従業員(
従業員NO int4,
従業員名 varchar(255),
担当 varchar(255),
上司 int4,
入社日 date,
給与 varchar(255),
コミッション varchar(255),
部署NO int4
);
CREATE
EOF
読み込んだファイルの内容が表示されてたしかにCREATE去れているのが分かるo=> insert into 部署 values(10,'経理','東京');
INSERT 18939 1
bio=> insert into 部署 values(20,'研究開発','名古屋');
INSERT 18940 1
bio=> insert into 部署 values(20,'営業','大阪');
INSERT 18941 1
bio=> insert into 部署 values(20,'管理','東京');
INSERT 18942 1
bio=> \d 部署
Couldn't find table 蜚署!
bio=> select * from 部署;
部署no|部署名 |場所
------+--------+------
10|経理 |東京
20|研究開発|名古屋
20|営業 |大阪
20|管理 |東京
(4 rows)。
なんでか、\d 部署;
を実行すると Couldn't find table 蜚署!って怒られる。蜚署!ってなんだ!と逆切れしたい勢い(^. ^;
日本語の問題なのかな?けど、SELECT文では問題ないんだよね。なんでだ??
ともかくようやく部署にデータを作成できた。実は結構いろいろひっかかってたんだよね、データ型で。
それはここには書きません。charとvarcharの違いが良く分かってないんで。
bio=> \i employee_insert.sql
insert into 従業員 values(7360,'伊藤','担当','7902','80-12-17','180000','',30);
INSERT 18944 1
insert into 従業員 values(7499,'白井','営業','7698','81-02-20','260000','30000',30);
INSERT 18945 1
insert into 従業員 values(7360,'小出','営業','7698','81-02-22','225000','50000',20);
INSERT 18946 1
insert into 従業員 values(7360,'松岡','課長','7839','81-04-02','297500','',20);
INSERT 18947 1
insert into 従業員 values(7360,'高木','営業','7698','81-09-28','225000','',20);
INSERT 18948 1
insert into 従業員 values(7360,'藤原','課長','7839','81-05-01','385000','',20);
INSERT 18949 1
insert into 従業員 values(7360,'高橋','課長','7839','81-06-09','345000','',20);
INSERT 18950 1
insert into 従業員 values(7360,'藤井','主任','7566','87-06-13','300000','',20);
INSERT 18951 1
insert into 従業員 values(7360,'林','社長','','81-11-17','900000','',20);
INSERT 18952 1
insert into 従業員 values(7360,'川口','営業','7698','81-09-08','250000','',20);
INSERT 18953 1
insert into 従業員 values(7360,'長谷川','担当','7788','87-03-13','210000','',20);
INSERT 18954 1
insert into 従業員 values(7360,'田中','担当','7698','81-12-03','195000','',20);
INSERT 18955 1
insert into 従業員 values(7360,'桜井','主任','7566','81-01-03','300000','',20);
INSERT 18956 1
insert into 従業員 values(7360,'田村','担当','7782','82-01-03','230000','',20);
INSERT 18957 1
EOF
なんとなく、SELECT文が別ファイルで定義して読み込ませられるならINSERT文だって読み込ませられるはず
とおもって、別ファイル(employee_insert.sql)を作成して、読み込ませたら出来上がった。
一気にINSERTしてくれるさまは爽快以外の何者でもない!その内容はこちら。
(employee_insert.sql)
insert into 従業員 values(7360,'伊藤','担当','7902','80-12-17','180000','',30);
insert into 従業員 values(7499,'白井','営業','7698','81-02-20','260000','30000',30);
insert into 従業員 values(7360,'小出','営業','7698','81-02-22','225000','50000',20);
insert into 従業員 values(7360,'松岡','課長','7839','81-04-02','297500','',20);
insert into 従業員 values(7360,'高木','営業','7698','81-09-28','225000','',20);
insert into 従業員 values(7360,'藤原','課長','7839','81-05-01','385000','',20);
insert into 従業員 values(7360,'高橋','課長','7839','81-06-09','345000','',20);
insert into 従業員 values(7360,'藤井','主任','7566','87-06-13','300000','',20);
insert into 従業員 values(7360,'林','社長','','81-11-17','900000','',20);
insert into 従業員 values(7360,'川口','営業','7698','81-09-08','250000','',20);
insert into 従業員 values(7360,'長谷川','担当','7788','87-03-13','210000','',20);
insert into 従業員 values(7360,'田中','担当','7698','81-12-03','195000','',20);
insert into 従業員 values(7360,'桜井','主任','7566','81-01-03','300000','',20);
insert into 従業員 values(7360,'田村','担当','7782','82-01-03','230000','',20);
そういえば、このSQL文を書くファイルにコメントアウトって存在するんだろうか?
とりあえず、今扱ってるのがPostgreSQL-6.5.3なのでドキュメントを見るようにする。
http://www.postgresql.jp/document/
とりあえず、データは造ることができた。これで何をするかというとSQL文のお勉強なのだ。
しかも、Oracleの(^. ^;なんか方言とかの問題とか会って混乱するかもしれないんだけど、
実際に手が動かせないと意味がないんだよね、実際のはなし。というわけでPostgreSQLで
Oracleの勉強をすることにしました。
~
CONTENTS
|
|
2003年4月20日(月)0時1分27秒
StyleSheetとJavaScriptのこと
|
| 今、このページのレイアウトをしようとStyleSheetとJavaScriptを
使おうと思っていろいろいじってみたがどれも実現しなかった。ほとんどばかみたいな修飾だ。
でも、ぼくにはできない。このメモのタイトルの色をランダムに変えてみようと思って、テーブルの背景色の値を
ランダムに取得するというものを作ろうとしたが、まったくできなかった。
つぎに今ソール画面からの例を四角く点線で囲んだものにしようと、スタイルシートのdivにdottedを適用としたが
できなかった。それは自分が使っているスタイルシートの別ファイルに書き込まれているプロパティが互いに干渉している
らしい。それらを削除したが今度は全体のレイアウトが崩れる。どうしようもなくなってどれも実現するのを止めた。
簡単な技術なだけにせつなくなった。でもぼくには簡単なことのどれもができない。
|
|
2003年4月19日(日)17時12分9秒 Postgresのネットワーク接続の話
|
いまだに解決していないPostgresのネットワーク接続の話だけど、
しばらく調べているうちに、$PG_DATA/pg_hba.conf以外にも設定をしなければならなそうなファイルがあることが
分かった。$PG_DATA/postgresql.confがそうである。 このファイルを書き換えるとどうなるのかはまだやってないが、
もしかしたらこれかもしれない、と犯人の手がかりを見つけた気がした。そんな今このとき。
[postgres@mendezi pgsql]$ cd /var/lib/pgsql/
[postgres@mendezi pgsql]$ ls
PG_VERSION pg_database pg_group pg_log pg_shadow
base pg_geqo.sample pg_hba.conf.030419 pg_pwd pg_variable
実際、$PG_DATAに何があるのか見てみるんだけど、postgresql.confなんてものはなかった。なんでだろう?
それでも確かにあるはずなんだけど、なにやらUNIXドメインソケット経由とTCP/IPソケット経由の2つがPostgresへアクセス
する方法だそうです。ぼくはTCP/IPソケット経由で接続することになるから間違ったことをやってるわけじゃないと思うが。
そもそもPerlスクリプトがどうのということをやると問題が分からなくなるので、ネットワーク接続をクライアント/サーバ同士で行うことを考えることにした。
[hide@elizabethae ~/pwork/simba/css]$ psql -h 192.168.0.2 bio
psql: Missing or erroneous pg_hba.conf file, see postmaster log for details
実際、-hオプションを使ってpsqlクライアントツールを用いてDBへ接続しようとすると、エラーメッセージがでた。
するととりあえずLOGファイルを見ろ!ということなので従うこととした。
っていうか、postmaster立ち上げるときにログはかないようになってるじゃん!
というわけで自分ではかせることにした。
[postgres@mendezi postgres]$ grep -n 'postmaster' /etc/rc.d/init.d/postgresql
12:# processname: postmaster
13:# pidfile: /var/run/postmaster.pid
23:# Pretty much need it for postmaster.
26:[ -f /usr/bin/postmaster ] || exit 0
28:# This script is slightly unusual in that the name of the daemon (postmaster)
61: # Check for postmaster already running...
62: pid=`pidof postmaster`
70: su -l postgres -c '/usr/bin/postmaster -i -S -D/var/lib/pgsql > /var/lib/pgsql/log/postgres.log 2>&1 &'
72: pid=`pidof postmaster`
75: echo -n "postmaster [$pid]"
77: echo $pid > /var/run/postmaster.pid
86: killproc postmaster
88: rm -f /var/run/postmaster.pid
93: status postmaster
こんな感じにしてみた。けど、ログがでてこない!もういやだ。
ちょっと気になって、今度はmendeziからelizabethaeのPostgresサーバにつないでみた。はじめ、-iオプションで起動してない!
とかって起こられたけど、それを直して起動しなおしたら、なんとpsqlでつながってしまったのだ。
設定は、pg_hba.confも同じだし、違うところは唯一ファイルにユーザ権限がないことだけだ。もしかしたら…。
ということは、Perlスクリプトからも接続できるはず!とおもったんだけど、スクリプトがそもそもDBの仕様に依存したものを
書いてしまっているのでテーブルを作らなければ成らない。でも、一度作ってしまったテーブルと同じ者をもういちど作るのは
大変だ。SQL文をいちいち書いているからそうなったのだ。SQLファイルを作ってそれを\iコマンドで読み込むようにしていれば
良かったのだ。ここでもいろいろ学ぶことができた。
|
|
2003年4月19日(日)0時24分14秒 Pg.pmをelizabethaeにソースからインストールする
|
elizabethaeはCygwin環境なのでなかなかインストールするとき戸惑うことが多い。
でも教えられることもある。結局インストールはソースからコンパイルしたほうがいいってこと。
あとで日本語パッチをあてるにしてもバイナリを入れているとあとで当てられなくなるのだ。
で、http://search.cpan.org/search?module=Pg
からソースをもってきて、makeすることにしたのだけれど、
[hide@elizabethae /usr/src/pgsql_perl5-1.9.0]$ perl Makefile.PL
Configuring Pg
Remember to actually read the README file !
please set environment variables POSTGRES_INCLUDE and POSTGRES_LIB !
と怒られてしまった。たしかにセットしてないのだ。なんでかというとインストールのときに必要がなかったから。
結局Postgreが動いてしまったのでそのままにしてある。し、POSTGRES_INCLUDEの場所がわからないのだ。
/usr/lib/postgresql/がPOSTGRES_LIBだってことはわかった。でもPOSTGRES_INCLUDEの場所は?
とりあえず、今の状況を整理しよう。
elizabethaeの環境は、Win2k+Cygwin
PostgreSQLのバージョンは、7.3.2
Perlのバージョンは、
いま、値をセットして、もういちどmakeすることにした。
Pg::conndefaults ........ ok
Pg::connectdb ........... not ok: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
コンパイルしている中で、こんなメッセージがでてきた。Postgresサーバに接続したいの?
コンパイル中に。
今度は、
[hide@elizabethae /usr/src/pgsql_perl5-1.9.0]$ make test
/usr/bin/perl.exe "-Iblib/lib" "-Iblib/arch" test.pl
Pg::conndefaults ........ ok
Pg::connectdb ........... ok
Bad free() ignored (PERL_CORE) at test.pl line 111.
$conn->exec ............. ok
$conn->errorMessage ..... ok
$conn->db ............... ok
$conn->user ............. ok
$conn->port ............. ok
Bad free() ignored (PERL_CORE) at test.pl line 151.
$conn->cmdStatus ........ not ok: CREATE TABLE
Bad free() ignored (PERL_CORE) at test.pl line 159.
$conn->oidStatus ........ ok
$conn->getline .......... ok
$conn->endcopy .......... ok
$result->cmdTuples ...... ok
$result->fname .......... ok
$result->ftype .......... ok
$result->fsize .......... ok
$result->fnumber ........ ok
$result->fetchrow ....... ok
test sequence finished.
ちゃんとサーバを起動しておいてからmake testしてみた。
[hide@elizabethae /usr/src/pgsql_perl5-1.9.0]$ make install
Installing /usr/lib/perl5/site_perl/5.8.0/cygwin-multi-64int/auto/Pg/Pg.dll
Installing /usr/lib/perl5/site_perl/5.8.0/cygwin-multi-64int/auto/Pg/libPg.dll.a
Installing /usr/lib/perl5/site_perl/5.8.0/cygwin-multi-64int/auto/Pg/Pg.bs
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Installing /usr/lib/perl5/site_perl/5.8.0/cygwin-multi-64int/Pg.pm
Installing /usr/lib/perl5/site_perl/5.8.0/cygwin-multi-64int/auto/Pg/autosplit.ix
Installing /usr/man/man3/Pg.3pm
Writing /usr/lib/perl5/site_perl/5.8.0/cygwin-multi-64int/auto/Pg/.packlist
Appending installation info to /usr/lib/perl5/site_perl/5.8.0/cygwin-multi-64int/perllocal.pod
今回はエラーが出なかった。で、きっとPg.pmはインストールされたに違いない!と思ったのである。
それでクライアントからサーバ(mendezi)へPerlから接続してみた。からからから、と例のサーバの
仕事をしている音がした。ちゃんと接続しにいったらしい。やっと成功した!つまり、elizabethaeにPg.pm
がインストールされたみたいだ。調子にのってDBDとかDBIとか入れそうになるががまん。
インストールマニアになりそうだからだ。今回の目的はSQLの練習だ。それとPerlからのアクセスを試すと
いうこともある。最近腱鞘炎になりそうな勢いなのでとりあえずお休みする。
と思ったけどちょっとやりかけなのでそのまま少し進めることにする。
いま、Perlスクリプトから接続しに行ったまでは良かったがスクリプトの目的であるテーブルへの書き込む
に失敗した。PGRES_CONNECTION_OKの値を取得できなかったのだ。
Pg::setdbLoginで得たオブジェクトが返す値で、$conn->statusの値に成功すると入る値である。
ここは見当がついた。サーバの方でクライアントからの接続を許可する方法が2種類あるのだ。
HBAとかっていうほうが簡単だからそれをなんとかすることにする。
mendeziの/usr/lib/pgsql/にpg_hba_.conf.sampleというファイルがある。これをpg_hba.conf
なんかご機嫌みたい。なんかうまくいきそうな予感。
local all trust
host all 127.0.0.1 255.255.255.255 trust
host all 198.168.0.3 255.255.255.0 trust
という風に、198.168.0.3からのアクセスを許可するという一行を加える。
それで、postmasterを再起動してみる。
それで接続してみたけどうまくいかない!なんで?というか、pg_hba.confがそもそも/usr/lib/pgsqlで
の中において置くのでいいのかどうか?という問題があり、どこに置くべきかを調べると、
$PG_DATAディレクトリに置くことがわかった。それで早速どこなのかを調べる。
バイナリインストールしたもんだから場所がわかんないんだよね。でも、逆に起動スクリプトをみれば
答えがあるかも…とおもってみてみる。
su -l postgres -c '/usr/bin/initdb --pglib=/usr/lib/pgsql --pgdata=/var/lib/pgsql'
mendeziの/etc/rc.d/init.d/postgresqlの中に、この1行があるので、PG_DATAは、/var/lib/pgsql
であることがわかった。
ようやくわかって、pg_hba.confを直してみたんだけどうまくいかない。なぜ?
/etc/hostsもみて、ちゃんと198.168.0.3がelizabethaeだってことも教えたんだけどわからないらしい。
ローカルだとうまく書き込みができる(サーバに入って)。これはアクセス権の問題だと思うんだけど
解決せず。これはちゃんと解決しないとだめな問題だ。だって、SQLサーバがいつでもローカルからだけしか
アクセスできないんじゃ、何にもできないようなものだからだ。CGIだって別のマシンで動いていたら何もできない
ってことになる。どうしたらいいんだ?
仕方ないので、
http://itb-tech.itboost.co.jp/inst/inst_09.php
を参考にして、postmaster -iで起動されていることを確認、pg_hba.confの設定のされ方を見て、
あんまり許されない方法、
host all 0.0.0.0 0.0.0.0 trust
を記述して、再起動。またelizabethaeから接続すると今度は違ったメッセージになった!?
[hide@elizabethae ~/pwork]$ perl pgql2.pl
Bad free() ignored (PERL_CORE) at pgql2.pl line 50.
Bad free() ignored (PERL_CORE) during global destruction.
??なんだかわかんない。・゜(´□`)゜・。
とりあえず接続に成功してはみた。
あと、pg_hba.confの修正は再起動しなくても反映されることが分かった。
今日のところはこのへんで勘弁しておくか。。・゜(´□`)゜・。
|
|
2003年4月18日(土)5時19分2秒 PostgreSQLとRuby
|
そうそう、6時間のコーディングの中にはPerlだけじゃなくてRubyでもPostgreSQL
にアクセスしようとしてたんだった。
[hide@elizabethae ~/rwork]$ more psql.rb
#!/usr/local/bin/ruby
require "postgres"
conn=PGconn.connect("localhost",5432,"","","hide")
#conn=PGconn.connect("192.168.0.2",5432,"","","bio")
res=conn.exec("select * from name_list;");
res.each{|x|
print x,"\n"
}
で、実行すると、
[hide@elizabethae ~/rwork]$ ruby psql.rb
psql.rb:3:in `connect': could not connect to server: Connection refused (PGError)
Is the server running on host localhost and accepting
TCP/IP connections on port 5432?
from psql.rb:3
なんなんでしょう。。。よくわからないんで保留にしてPerlに行ったんだった。
Rubyの書き方とPerlの書き方のかなり違いがくっきり出ている。でも、Perl5はRuby
と似たような感じに書けるらしい。でも、Rubyのeachの使い方とかオブジェクト指向
なんだけどかなり反則的だよなぁ。省略の美学とオブジェクトの繊細さが見事に調和
しているって言えば言えるけど、でも初心者にはかなり魔術的に見えてしまう。
|
|
2003年4月18日(土)4時44分28秒 PostgreSQLサーバーからデータを読み込む
|
とりあえずソースを見せると、
#!/usr/bin/perl
# =================================================
#
# pgql3.pl
# lasmodified 2003.4.18
#
# =================================================
use Pg;
$pghost='localhost'; $pgport='5432'; $pgoption='';
$pgtty=''; $pgdbname='bio'; $pguser='postgres'; $pgpwd='';
$table_name='school_list2';
$conn=Pg::setdbLogin($pghost, $pgport, '', '', $pgdbname, $pguser, $pgpwd);
if ($conn->status ne PGRES_CONNECTION_OK) {
print "NOT CONNECTIVITY\n";
} else {
@readdata = (1, 'Name', 20, '03xxxxxxxx');
@readdata = &db_readdata($table_name, $readdata[0]);
#@readdata = &db_readdata($table_name, "1");
print @readdata;
}
#==================================
# method:db_readdata
# @param testdata, $readdata
# @return @dbdata
# usage: to get DB
#==================================
sub db_readdata {
my($i, $pddata, $key, $num, $column);
$pdtable = $_[0]; $key = $_[1]; @dbdata = ();
$sqlstring = "select * from $pgtable where id='$key';";
$result = $conn->exec($sqlstring); $num = $result->ntuples;
if ($result->resultStatus ne PGRES_TUPLES_OK) {
# fault to search
print "fault to search\n";
} else {
if($num == 0) { # nothing in DB
print "NOTHING IN $table_name\n";
} elsif ($num == 1) { # mismatch in DB
print "COLISION IN $table_name\n";
} else { # OK
$column = $result->nfields;
for($i = 0; $i < $column; $i++){$dbdata[$i]=$result->getvalue(0, $i);}
}
}
return @dbdata;
}
こいつが実行されると、fault to searchと表示される。
$result->resultStatusの値が、PGRES_TUPLES_OKでないということで、検索失敗したということである。
ここで、$resultは$conn->exec()の値であり、
この値はSELECT文を発行して無事成功すれば、PGRES_TUPLES_OKという値が帰ってくる予定なのである。
ちなみに発行したSQL文が、COPY以外のSQLであれば、PGRES_COMMAND_OKという値が返ってくることになっている。
今回はSELECT文だからPGRES_TUPLES_OKが返ってきて然るべきなんだけど。
http://www.postgresql.jp/document/pg653doc/ej/programmer/x4530.htm
http://itb-tech.itboost.co.jp/perl/perl_11.php
とか読んだんだけどよくわからない。とりあえずSQL文を発行して書き込むことはできたということで
今日は終わり。これだけで6時間かかったけど気にしないことにする。
|
|
2003年4月18日(土)3時6分47秒 PostgreSQLサーバーにデータを書き込む!
|
まず、Perlで書くINSERT文に、idを必要とする(idを使って、where id =???って感じにSQL文を発行したいので)ので
idをもったテーブルを作成することにする。primary keyにしたのは特に意味はない。
bio=> create table school_list2 (id int primary key, name char(20), num int, serial char(10));
NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index 'school_list2_pkey' for table 'school_list2'
CREATE
bio=> \d school_list2
Table = school_list2
+----------------------------------+----------------------------------+-------+
| Field | Type | Length|
+----------------------------------+----------------------------------+-------+
| id | int4 not null | 4 |
| name | char() | 20 |
| num | int4 | 4 |
| serial | char() | 10 |
+----------------------------------+----------------------------------+-------+
Index: school_list2_pkey
DBは作った。あとはPerlでDBに書き込むロジックを書くだけだ。
#!/usr/bin/perl
use Pg;
$pghost='localhost'; $pgport='5432'; $pgoption='';
$pgtty=''; $pgdbname='bio'; $pguser='postgres'; $pgpwd='';
$conn=Pg::setdbLogin($pghost, $pgport, '', '', $pgdbname, $pguser, $pgpwd);
if ($conn->status ne PGRES_CONNECTION_OK) {
print "NO\n";
} else {
@writedata=(1, 'NAME', 20, '03xxxxxxxx');
&db_writedata('school_list2',@writedata);
}
#==================================
# method:db_writedata
$conn=Pg::setdbLogin($pghost, $pgport, '', '', $pgdbname, $pguser, $pgpwd);
if ($conn->status ne PGRES_CONNECTION_OK) {
print "NO\n";
} else {
@writedata=(1, 'NAME', 20, '03xxxxxxxx');
&db_writedata('school_list2',@writedata);
}
#==================================
# method:db_writedata
# @param testdata, @writedata
# @return none
# usage: to access DB
#==================================
sub db_writedata {
my($pgtable, $num, $i, $columnname);
my @data = @_; $pgtable=$data[0];
$sqlstring="select * from $pgtable where id='$data[1]';";
$result=$conn->exec($sqlstring); $num=$result->ntuples;
if($result->resultStatus ne PGRES_TUPLES_OK) {
print "cannot search, sorry...";
} else{
if($num == 0) {
# insert into DB because num = 0
$sqlstring="insert into $pgtable values(";
foreach $i(1 .. $#data) {
$sqlstring .= "'$data[$i]'";
if ($i != $#data ) {$sqlstring .= ',';}
}
$sqlstring .=');';
}else{
# update into DB because num != 0
$sqlstring = "update $pgtable set";
foreach $i(1..$#data) {
$columnname=$result->fname($i-1);
$sqlstring .= " $columnname='$data[$i]'";
if ($i != $#data) {$sqlstring .= ',';}
}
$sqlstring .= " where id='$data[1]';";
}
$conn->exec($sqlstring);
}
return;
}
これで書けるのか?
実行すると
[hide@mendezi pwork]$ perl pgql2.pl
[hide@mendezi pwork]$
静か過ぎて怖い。でもこれは失敗に終わった。DBを見てもテーブルに何も書き込まれてなかった。
何が問題なのかわからないがとにかくスクリプトを1行ずつ追っていくと、,が.になっているという
初歩的なミスがあることが判明。それを直すと、
bio=> \d school_list2
Table = school_list2
+----------------------------------+----------------------------------+-------+
| Field | Type | Length|
+----------------------------------+----------------------------------+-------+
| id | int4 not null | 4 |
| name | char() | 20 |
| num | int4 | 4 |
| serial | char() | 10 |
+----------------------------------+----------------------------------+-------+
Index: school_list2_pkey
bio=> select * from school_list2;
id|name|num|serial
--+----+---+------
(0 rows)
bio=> select * from school_list2;
id|name |num|serial
--+--------------------+---+----------
1|NAME | 20|03xxxxxxxx
(1 row)
使用前と使用後の変化がおわかりいただけるでしょうか?もうこのDBに書き込むというプログラムを
実は2年前からずっとやりたかった。だけどDB以前にプログラムの知識やらSQLをインストールするということの意味、
はたまたDBを操作するということがどんなことなのかすらわからず、ただそばの人が使っているのを変なアスキーアート
のテーブルがでているのをうらやましげに見るだけだった。とうとう自力でDBに書き込むロジックを書いたのだ!
Perlでよかった。これがJavaだったらもっと難しいだろう。
|
|
2003年4月18日(土)1時48分58秒
日付のフォーマット
|
プログラムしてるとどうしてもぶつかる時間の概念。
そんな大げさではなかったんだけど、今回時間をもっと日本的に表示してくれるフォーマットのコマンドが
ほしかったのでPerlで実装してみた。名づけて、date2(そのまま)。そんな大げさなものではなくて、
ただただ〜年〜月〜日〜(曜日)みたいな感じに表示してほしかったのだ。
直接的にはこのページの時刻をいれるところにいつも表記がみにくい時刻を入れていたのでこれをどうにかしたかった
というのがある。いちいちマウスでWindowsの時計をダブルクリックしたり、タスクバーをみたりするのは面倒である。
コマンドを打ってみたかった。ただそれだけだった。ちなみにソースは、
#!/usr/bin/perl
# ===========================
# date
# 簡易日付表示プログラム
# Copyright hidewo@elizabethae
# 2003.04.18
# hidewo@zf7.so-net.ne.jp
#
# ===========================
# ハッシュを使って、曜日のハッシュテーブルを作る
%week=(
"0"=>"月",
"1"=>"火",
"2"=>"水",
"3"=>"木",
"4"=>"金",
"5"=>"土",
"6"=>"日"
);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
=localtime(time);
$mon += 1;
$year += 1900;
print $year,"年",$mon,"月",$mday,"日","(",$week{$wday},")",$hour,"時",$min,"分",$sec,"秒","\n";
こんなかんじである。localtime関数でほぼかたがついているじゃないか!なんていわないでほしい。ぼくは
必死なんだから。
|
|
Fri Apr 18 00:00:18 2003
PostgreSQLサーバとRubyクライアント
|
|
あたりまえの話なんだけど、SQLサーバとクライアントは別のマシンであってもいい。このことはわかっていたんだけど、
たとえば、モジュールを使ってRubyを組もうと思ったときにSQLを使って、
たとえば、require 'postgres'なんてことを書いたとき、サーバ側にはRubyとPostgresのインターフェイスが
なくても委員だって事がわからなかった。ということは、あくまでサーバにはSQLだけがはいっていればいいのだ。インターフェイスはつまりクライアントの仕事である。このこともドキュメントに但し書きで書いてあったんだけどやってみてやっと実感ができた次第である。
|
|
Thu Apr 17 16:22:47 2003
ソースよね
|
|
mod_rubyをRPMから入れようとしたんだけど、そうだったRuby本体をソースからインストールしてるから
だめだ。というわけでぼくは↓から持ってくることにした。
http://modruby.net/
と、待てよ、このモジュールってapacheにRubyインタプリタを組み込むって、apacheもソースからインストール
しないとだめじゃない??apacheはRPMだった。
|
|
Thu Apr 17 16:10:20 2003
apacheのインストール
|
apacheをインストールしたら、こんなメッセージが出た。初めてインストールしたのでびっくりした。
[root@mendezi rpm]# rpm -iUvh apache-1.3.9-1.i386.rpm
apache ##################################################
+--------------------------------------------------------+
| You now have successfully installed the Apache 1.3 |
| HTTP server. To verify that Apache actually works |
| correctly you now should first check the |
| (initially created or preserved) configuration files |
| |
| /etc/httpd/conf/httpd.conf |
| |
| and then you should be able to immediately fire up |
| Apache the first time by running: |
| |
| /usr/sbin/apachectl start |
| |
| Thanks for using Apache. The Apache Group |
| http://www.apache.org/ |
+--------------------------------------------------------+
今、BioRubyがインストールされたのでさっそくあのプログラムを動かしてみる。
#!/usr/bin/env ruby
require 'bio'
gene = "tctacttaagctaatnnnacccatgaacgttgaagannnnnntattagcacgcctgtaaagagcga"
prot = Bio::Sequence::NA.new(gene).translate
prot[/^/] = 'JU'
prot[7] = 'O'
prot['XX'] = 'UB'
puts prot.split('*').join(' ').capitalize << '.'
ちょっと時間がかかったけど、
[hide@mendezi rwork]$ ./bio.rb
Just another ruby hacker.
ちゃんと動いた。このまえこのプログラムみてびっくりしたけど、BioRubyのインストール確認
にいいプログラムだってことに気づいた。
|
|
Thu Apr 17 15:20:19 2003
TITLE
|
|
今、mendeziにRubyをインストールする準備をしている。
さっきはソースをmakeしていたら時刻がおかしいというようなメッセージがでた。なので時刻を設定しなおして(時刻が1980になっていた。80'sも好きだからいいんだけど(^. ^;)、またmakeをしていまコンパイル中。
かなり時間がかかる。Ruby-1.6.8をどうしてもインストールしたいのでRPMはやめた。
あと、CGIでもRubyを使いたいため、mod_ruby-0.1.4-1.i386.rpmをもってきてあとで入れるつもりだ。
Vine1.1のRPMパッケージはなくなっていたかと思ったら、まだあった。ftp://ftp.jaist.ac.jp/pub/os/linux/Vine/VinePlus/1.1/RPMS/list.html
|
|
Thu Apr 17 14:18:58 2003
mendeziの時刻がおかしい
|
memdeziが正しい時を刻んでいないので、あわせることにした。ハードウェアクロックも狂っている。
電池は交換したんだけどそういう問題ではなくなっているようだ。
[root@mendezi ruby-1.6.8]# date
Wed Feb 20 22:05:01 JST 1980
[root@mendezi ruby-1.6.8]# date -s 'Thurs Apr 17 14:16 JST 2003'
Thu Apr 17 14:16:00 JST 2003
[root@mendezi ruby-1.6.8]# date
Thu Apr 17 14:16:04 JST 2003
[root@mendezi ruby-1.6.8]# /sbin/hwclock --systohc
まず、時刻を確認。次にdateコマンドのオプション -sで日付を設定。次に時刻を確認。
あとは、その設定をハードウェアクロックにも教える。まぁ、壊れてるから再起動するとまた狂うんだけど。
|
|
Thu Apr 17 05:28:03 2003
PerlからPostgreSQLを使う
|
ついでというか乗りかかった船なのでPerlからPostgreSQLを使いたい。Vine1.1で、パッケージをインストールして
あるのでたぶんPerlからPostgresにアクセスできるはず。PostgreSQLのPerl用ライブラリである。
さっそくPerlで書いてみる。
#!/usr/bin/perl
use Pg;
$pghost='localhost';
$pgdbname="bio";
$pguser="postgres";
$pgport="5432"; $pgoption=""; $pgtty=""; $pgpwd="";
$conn=Pg::setdbLogin( $pghost, $pgport, '', '', $pgdbname, $pguser, $pgpwd );
if ($conn->status ne PGRES_CONNECTION_OK) {
print "you NOT SUCCESS to access DB\n";
} else {
print "you SUCCESS to access DB\n";
}
これでアクセスができるはず。とりあえずできたかどうかを確かめるプログラムにした。
流れは、
Pgモジュールの宣言。
PostgreSQLサーバへの接続。
問い合わせの実行。
結果の利用。
の4段階で動かすものらしい。Perlのスクリプトの詳しい説明はぬきにしてとりあえずこのスクリプトを実行すると
[hide@mendezi pwork]$ ./conpgsql.pl
you SUCCESS to access DB
おお、どうやら成功したらしいではないか。よかったよかった。ちなみにやっぱりモジュールがない!ってときは
こんなメッセージがでる。
Can't locate Pg.pm in @INC (@INC contains: /usr/lib/perl5/5.8.0/cygwin-multi-64int /usr/lib/perl5/5.8.0 /usr/lib/perl5/s
ite_perl/5.8.0/cygwin-multi-64int /usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl .) at ./conpgsql.pl line 3.
BEGIN failed--compilation aborted at ./conpgsql.pl line 3.
これは、Cygwin環境下(elizabethae)でのメッセージ。
これでCGIでもDBにアクセスできそうなかんじ。
でも、mendeziでアパッチを起動するのが大変そうなんだよなぁ、なぜか。。。
CGIでDBを動かしたいというひともまずスクリプトを動かしてロジックだけ作ってみることをお勧めします。
それだとCGIのたとえばCGIがうごくディレクトリの問題とか実行権限の問題(ちなみにこのスクリプトも権限を755に
設定しました)なんかがあって問題が切り分けられないことが多いので。
いろいろやったけど、mendeziをPostgreSQLサーバにしたのは成功だったみたい。いろいろ勉強がはかどった。
サーバって自分と対話してくれる先生(ちょっといろいろ説明しないと聞いてくれないような)みたいなかんじだ。
ただ、DBサーバにi486マシンを選んだのは問題があるかもしれないけどたくさんの人がアクセスしてくるわけじゃないから
まぁ、いいか。。。
もう最後だから、PerlからSQL文を発行してPostgresに結果を返してもらおう!
[hide@mendezi pwork]$ more conpgsql2.pl
#!/usr/bin/perl
use Pg;
$pghost='localhost';
$pgdbname="bio";
$pguser="postgres";
$pgport="5432"; $pgoption=""; $pgtty=""; $pgpwd="";
$conn=Pg::connectdb("dbname=$pgdbname user=$pguser");
if ($conn->status ne PGRES_CONNECTION_OK) {
print "you NOT SUCCESS to access DB\n";
} else {
$result=$conn->exec("select * from drink;");
print "$result\n";
print "$result->ntuples\n";
}
んで、返された結果はこんな感じ。
de@mendezi pwork]$ ./conpgsql2.pl
PG_results=SCALAR(0x81183a4)
PG_results=SCALAR(0x81183a4)->ntuples
なんか間違えた気がする。
Pg::connectdbはオプションがデフォルトで決まっている関数で、今回は、DB名とユーザ名を指定した。
あと指定しなければデフォルト値が適用されるみたいで、
host localhost
port 5432
options ""(空文字列)
tty ""(空文字列)
dbname 現在のユーザ ID
user 現在のユーザ ID
password ""(空文字列)
が与えられる。今回、パスワードを与えるとDBにアクセスできなかった。なんでなのかわかんない。なんでだろ〜。
でも、DBにアクセスできたのは本当みたい。 なんでわかるかっていうとmendeziのハードディスクへのアクセス音が
からからからからと音を立てるから。i486の非力さが役立ったわけだ。 DBへのアクセスは力仕事なんだろうなぁ。
ちゃんとからころ音を立ててPerlがPostgresをよんでいるのがわかる。(^. ^;
|
|
Thu Apr 17 04:44:04 2003
PostgreSQLを使う
|
実際にSQLをやるときにはファイルにSQL文を書いておいてあとで読み込むことでSQL文を発行するというかたちをとることもできる。
[postgres@mendezi dbwork]$ vi name_list.sql
create table Name_list(
id int4,
name text
);
とname_list.sqlというファイルを作って保存する。
[postgres@mendezi dbwork]$ psql bio
Welcome to the POSTGRESQL interactive sql monitor:
Please read the file COPYRIGHT for copyright terms of POSTGRESQL
[PostgreSQL 6.5.3 on i686-pc-linux-gnu, compiled by gcc 2.7.2.3]
type \? for help on slash commands
type \q to quit
type \g or terminate with semicolon to execute query
You are currently connected to the database: bio
bio=> \i name_list.sql
create table Name_list(
id int4,
name text
);
CREATE
EOF
bio=> \d←ここで、\dコマンドを使って、テーブル名なんだっけ?なんてやるのがわかってる人ぽくて吉。
Database = bio
+------------------+----------------------------------+----------+
| Owner | Relation | Type |
+------------------+----------------------------------+----------+
| postgres | drink | table |
| postgres | grp | table |
| postgres | grp_pkey | index |
| postgres | name_list | table |←このname_listがいま挿入したテーブルだ。
| postgres | test | table |
+------------------+----------------------------------+----------+
bio=> select * from name_list;
id|name
--+----
(0 rows)
ここで重大なことに気が付いた。
そういえばいままでの作業をスーパーユーザpostgresで行っていた。
これはよくないことだ。実際には一般ユーザがやらないとまずい。
というわけでDBを扱うユーザに一般ユーザを加えることにした。
[postgres@mendezi dbwork]$ createuser hide
Enter user's postgres ID or RETURN to use unix user ID: 500 ->
Is user "hide" allowed to create databases (y/n) y
Is user "hide" a superuser? (y/n) n
createuser: hide was successfully added
ちなみにさっきhide(一般ユーザ)でDBにアクセスしようとしたらこんなメッセージになった。
[hide@mendezi hide]$ psql bio
Connection to database 'bio' failed.
FATAL 1: SetUserId: user 'hide' is not in 'pg_shadow'
そして、今度は、DBのテーブルの中身をSELECT文でみようとしたら、
bio=> \d
Database = bio
+------------------+----------------------------------+----------+
| Owner | Relation | Type |
+------------------+----------------------------------+----------+
| postgres | drink | table |
| postgres | grp | table |
| postgres | grp_pkey | index |
| postgres | name_list | table |
| postgres | test | table |
+------------------+----------------------------------+----------+
bio=> select * from name_list;
ERROR: name_list: Permission denied.
ちゃんと許可のないユーザにはテーブルの中身が見れないようになってる!
もちろんDBの中のテーブル名くらいはみせてくれるみたい。これすらできないと
その中のどれかのテーブルには許可があってもそれがなんだったか手がかりがなくなって
途方にくれてしまうものなぁ。
それで、こんどは、postgresユーザでDB(bio)にアクセスして、GRANT文を発行する。
bio=> grant all on name_list to hide;
CHANGE
反応があった。これでhideがname_listテーブルにアクセスすることができるようになった
はずである。
bio=> select * from name_list;
ERROR: name_list: Permission denied.
bio=>
bio=> select * from name_list;
id|name
--+----
(0 rows)
さっきパーミッションでないど、と起こられたそばからこんどはアクセスできるようになっている。
うん、うん。DBの感覚がわかってきた。そういえばこの前DBにアクセスすることができる人を限定する
話を聞いたことがあった。社会問題になるんだろう。これからの時代は。
ヒトゲノムプロジェクトとか、倫理問題がかかわるとき、そこにDBが存在しているからそこへのアクセス権を
限定することで対処するという具体案が浮上するだろう。
あと、今度はpsqlコマンドとbashを用いてSQL文の結果を自動的にはかせる簡単なスクリプトができるので
紹介します。
bashに(というかシェルには)はヒアドキュメント機能があって、ある命令を一気にコマンドに流し込むという
ことができるのだ。リダイレクト機能に似たかんじだけどもっと強力。スクリプトは、
[postgres@mendezi dbwork]$ more select.sh
#!/bin/sh
psql -q -u bio > result.dat << EOF
postgres
PASSWORD
select * from drink;
EOF
こんな感じに書く。1行目はシェルスクリプトです、という宣言みたいなもの。
2行目でpsqlコマンドをオプションつきで実行している。-qオプションは無駄な出力をなくすものらしい。
-uはユーザを指定するもので、
3行目でユーザ名、4行目にパスワードを記す。PASSWORDに実際にパスワードを書いておく。
5行目がSELECT文。SQL文をかくわけ。INSERT文とかも書けるんじゃないかな。6行目は2行目にもあるけど
EOFでヒアドキュメントの宣言。つまり、3行目から5行目までの内容をpsqlに送っているのである。これがヒアドキュメント。
|
|
Thu Apr 17 02:56:06 2003
Vine1.1にpostgres-6.5.3を入れる
|
rpm -i postgresql-6.5.3_jp-1.i386.rpm
rpm -i postgresql-devel-6.5.3_jp-1.i386.rpm
rpm -i postgresql-server-6.5.3_jp-1.i386.rpm
をmendeziにインストールする。postgresql-serverを入れないとinitdbができない。ちょっとはまった。い や、だいぶ。
余計なモジュールも入れてしまった、おかげで。でも、jdbcやperlやpython(?)からも利用できるようになっている。
# adduser postgres
# passwd postgres
postgresゆーざを作成し、パスワードを設定。
Vineのパッケージは実は/etc/rc.d/init.d/postgresqlスクリプトを最初に起動するとそのユーザがPostgresスーパーユーザとなり
しかも、PG_LIBやPG_DATAのディレクトリ設定もしてくれたりする。
だからこのスクリプトはpostgresユーザになっておこなう。するとinitdbをしたのと同じことがおこる(というか、それがスクリプト
に書いてあるんだろうなぁ。で、
# createuser postgres
でDBを使用するユーザにpostgresを加えて、
# createdb bio
でDB名を設定する(今回は使いたい目的であるbioにした)。
あとは、postmasterが起動しているのでクライアントツールであるpsql(OracleのSQL*PLUSみたいの)を使って
SQL文を発行する。
postgresql-jdbc-6.5.3_jp-1.i386.rpm
ちなみにこのパッケージはjdbcドライバです。
/usr/lib/pgsql/jdbc6.5-1.1.jar
/usr/lib/pgsql/jdbc6.5-1.2.jar
がインストールされます。こいつをクラスパスに通すと、Java側からPostgreSQLにアクセスできる
はず。Tomcatが使えるかなというスケベ魂が。。。いや、Vine1.1のころは
JServだったんじゃなかったか。
詳しい説明は、http://spelunker.jp/haru/runaway/config0.html
この辺で。
[postgres@mendezi postgres]$ psql bio
Welcome to the POSTGRESQL interactive sql monitor:
Please read the file COPYRIGHT for copyright terms of POSTGRESQL
[PostgreSQL 6.5.3 on i686-pc-linux-gnu, compiled by gcc 2.7.2.3]
type \? for help on slash commands
type \q to quit
type \g or terminate with semicolon to execute query
You are currently connected to the database: bio
bio=> create table drink(name text, price integer);
CREATE
と、DBにアクセスし、テーブルを作りました。
bio=> insert into drink values('coffee', 250);
INSERT 18528 1
bio=> insert into drink values('beer',500);
INSERT 18529 1
bio=> insert into drink values('tea',280);
INSERT 18530 1
これでINSERT文を発行してます。coffeeとbeerとteaの値段を入れています。
やっとうまくいきました。
bio=> select * from drink;
name |price
------+-----
coffee| 250
beer | 500
tea | 280
(3 rows)
SELECT文を発行してdrinkテーブルにちゃんと値が入っているのかどうかをたしかめています。
ちゃんと入っているようです。ぼくはこのアスキーアートちっくはテーブルが好きだし、
これを見るとぼくはSQLをやってる!ってかんじがします。
bio=> grant all on drink to postgres;
CHANGE
ここでこのdrinkテーブルにアクセスするユーザはpostgresであることを許可している。といっても
postgresはPostgreSQLのスーパーユーザなんでそんな許可はあんまし意味内容。・゜(´□`)゜・。がするんだけど
まぁとりあえず、無難なところで。
[hide@elizabethae ~]$ psql -d bio -U postgres -h 192.168.0.2
psql: No pg_hba.conf entry for host 192.168.0.3, user postgres, database bio
ここでPostgreSQLサーバであるmendeziに対して、リモートであるelizabethaeからデータベース
にアクセスしようと思ったんだけどエラーメッセージが出る(もうエラーには慣れた)。
いったいpg_hda.confはどこにあるんだ??っていうか、psqlってネットワーク対応してるんか?
bio=> \d
Database = bio
+------------------+----------------------------------+----------+
| Owner | Relation | Type |
+------------------+----------------------------------+----------+
| postgres | drink | table |
| postgres | grp | table |
| postgres | grp_pkey | index |
| postgres | test | table |
+------------------+----------------------------------+----------+
前から気になってた、そのDBにどんなテーブル名が入っているんだ?っていうのを表示するコマンド。
データベース中のテーブルをリスト表示します、っていうもの。psqlの\dコマンド。
\dfは関数をリスト表示します、とある。
timestamp|timestamp |datetime |convert datetime to timestamp
timestamp|timestamp |timestamp |convert (noop)
tinterval|mktinterval |abstime abstime |convert to interval
varchar |varchar |int4 |convert int4 to varchar
varchar |varchar |int8 |convert int8 to varchar
varchar |varchar |name |convert convert name to varchar
varchar |varchar |varchar int4 |truncate varchar()
varchar |varcharin |int4 |(internal)
(899 rows)
なんかこんなかんじのがずらずらっとでてきた。でるまでに時間がかかったのは、mendeziがi486マシンだったからにちがいない。 http://www.mediaweb.biz/database/db/psql_command1.html
http://www.mediaweb.biz/database/db/psql_command1.html
http://www.mediaweb.biz/database/db/psql_command2.html
詳しくは上記のURLで詳しく説明されてます。
あと、JDBCドライバを使って、JavaからPostgresを利用する方法は、
http://www.techscore.com/tech/Java/JDBC/1.html
に載ってるかんじです。そういえば、mendeziに載ってるJavaってBlackDownだった。たしか、SunのJDKがコンパイラかなんかの都合で入んなかったんだったかな。それでいろいろ調べてBlackdownだったら入ると思って入れたらすんなり入ったわけ。
でも、実際Javaを使うとしたらSunじゃないと危ないかも。いろいろエラーが出るだろうとおもう。大抵の解説はSunのJDKを前提としてかかれているから。今、mendeziで、
[hide@mendezi hide]$ java -version
java version "sbb:05/19/97-22:33"
ってでた。とりあえず怪しすぎる。(^. ^;
elizabethae(Windows2000)は、
[hide@elizabethae ~]$ java -version
java version "1.4.1_02"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_02-b06)
Java HotSpot(TM) Client VM (build 1.4.1_02-b06, mixed mode)
となる。
|
|
Thu Apr 17 01:47:21 2003
一括変換
|
|
findとperlを使うとあるディレクトリ以下のある拡張子のファイル全部に対して、ある文字列を置換する
というコマンドがつかえるらしい。たとえば、*.htmlの拡張子のファイルをカレントディレクトリ以下で変換する。
リンク先がwww.yahoo.co.jp→www.geocities.co.jpに変えたいとする。そのとき、
find . -name '*.html' -exec perl -pi.bak -e 's/yahoo/geocities/g' {}\;
とすればいい。
|
|
Wed Apr 16 15:42:30 2003
IP Masqが聞かない
|
|
ゲートウェイとして動いていたMendeziのIPマスカレードができなくなった。調べているうちに、
/etc/rc.d/rc.localの記述に、ipfwadmがないことがわかった。でも、おなじディレクトリにrc.local~というファイルがあって、そこには記述してある。たぶんバックアップなんだけど、なんでわざわざやめたのか理由がわからない。それでいったん設定を有効にしてさいきどうしたんだけどうまくいかない。なぜだ?設定はどこに書けばいいんだったか?
|
|
Wed Apr 16 04:50:55 2003
戻った!
|
|
mendeziがとうとう昔の状態に戻ったようなんである。というのは、起動時にちゃんとNICを認識しているのだ。
始めに気が付いたのは、サウンドドライバが認識されている表示がそういえばなかったなと思っていて、それが
今回戻っているのを確認してもしや?とおもったらそのあとにNICもI/OとIRQをちゃんと確認して認識していたのである。
今回修正したのは起動ディスクである。どうも、即席で作ったカーネルイメージで起動しているのがおかしいということはなんとなくわかっていた。とりあえず起動することには成功していたんだけど、そのあとでサウンドはならなくなるし、NICは認識しないしで、どうもそんなのはカーネルに問題があるだろうということがわかった。FDにコピーしたのは、インストール用の起動ディスクにあったカーネルイメージ。実際にはそのあとでハードディスクでいろんな設定を反映しているからカーネルも変わっているはず。
それで起動してから、/boot/vmlinuz-2.0.36-xxxをちゃんとFDに前と同じ手順でコピーしなおしたのだ。そうしたらちゃんと起動してくれた。LILOをFDにインストールするのはずっと失敗した。FDから起動してもLIでとまるようになってしまったのだ。
でも、今回起動ディスクは、カーネルイメージをFDにコピーすればいいことがわかった。
カーネルイメージはなんでもいいわけではなく、起動したいマシンにあるカーネルとおなじバージョンでなければ成らない。でも、とりあえず起動したいだけならそれでいいが、起動したら、ちゃんとローカルのカーネルイメージをFDにコピーして正式のものをつくらないとだめってことだ。でも自分で起動できたのは驚いた。
|
|
Wed Apr 16 00:58:01 2003
起動ディスクがない!
|
|
昔につかっていたi486マシンをひさびさに使うことになった。Vine1.1が入っていたんだけど、ハードウェアがくせのあるマシンで、LILOがうまく起動しない(LIで止まってしまう)のでFD起動していた。ひさびさに外においておいたそのマシンを引っ張り出してきたら、なぜかFDがなかった。どこを探してもわからず、結局使わないと思ってどこかへやってしまったらしいことがわかった。
HDDにあるLILOもLIでとまってしまうので、起動ディスクを作成しなくてはならない。でもどうやって??
それから4時間くらいの格闘が会った。おもえばこのマシンはNICを認識することすらできなかった。2枚ざしにしてGATEWAYマシンとして使えるようになるまでに半年かかったのだ。
結局、どうやったかというと、FDでたまたまVine1.1のインストール用起動ディスクがあったのでそのなかにあった、VMLINUZというファイル(イメージ?)をほかのLinuxマシンへコピーをしておく。そのカーネルイメージを/boot/vmlinuzへコピーをして、空のFDを用意して、
# fdformat /dev/fd0H1440
# dd if=/boot/vmlinuz of=/dev/fd0
# rdev /dev/fd0 /dev/hd1
一行目は、フロッピーのコピー。2行目は、カーネルイメージをFDにコピーする。たぶん、カーネルイメージはどこにあっても
いいんではないかとおもう。自分がコピーしたいカーネルイメージを用意してその場所を指定するんだろう。
3行目は、ルートファイルシステムのパーティションを指定している。この起動ディスクで起動すると/dev/hd1のパーティションを(ルート)ファイルシステムとしてマウントすることになる。
今回のネックとなったのは、カーネルイメージだった。Vine1.1はカーネルがkernel-2.0.36なんだけど手元にはじめ、Vine2.1のFDとかCD-ROMしかなかったのだ。たとえばVine2.1の起動FDを使うと、
CPU 486と表示が出て、どういうわけか、コプロセッサがどうのこうのといって、再起動しろとかいわれてしまう。
これは、カーネルイメージの問題なんだろうと思う。起動ディスクにあるカーネルイメージとHDDのカーネルとが一致していないと
だめってことなんじゃないだろうか?よくわからない。ともかく起動ディスクができてよかった。
また古いマシン
とおもったら、せっかく昔NICが認識していたのに、eth0,eth1ともに不明なデバイスとかってでてる。ネットワークにつながらないことになるから、ネットワークにつながらないとなるとなんのファイルも外からもちこめない。ぜんぜん改善しないのだ。どうする?ひつようなものは自分でViで書くのか??。・゜(´□`)゜・。
|
|
Tue Apr 15 06:12:40 2003
Perlの1行はすごい
|
|
Perlって言語はというか、スクリプト言語は大体、コマンドラインでそのままスクリプトを書いて実行することができる。
オプションに -eをつけて、
perl -e '$word=hello; print $word;'
こんなかんじである。
で、エラストテネスのふるいっていう素数を計算するアルゴリズムをPerlで1行で書くと、
perl -e 'for $i(2..1000){$flg=0;for $j(2..sqrt($i)){ if(0==($i%$j)){$flg=1;last;}} if(!$
flg){print "$i ";}} print "\n"'
ってことになるらしい。1行でできてできてしまうのだ。で、実行結果は、
[hide@elizabethae /usr/src/sl]$ perl -e 'for $i(2..1000){$flg=0;for $j(2..sqrt($i)){ if(0==($i%$j)){$flg=1;last;}} if(!$
flg){print "$i ";}} print "\n"'
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 1
63 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 3
37 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 5
21 523 541 547 557 563 569 571 577 587 593 599 901 907 613 617 619 631 641 643 647 653 659 661 673 677 683 691 701 709 7
19 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 877 881 883 887 907 911 919 9
29 937 941 947 953 967 971 977 983 991 997
すごくないですか?Perlって、、、っていうかプログラムって、、、って感じた一瞬だった。
|
Tue Apr 15 05:22:45 2003
汽車が走らせた肩
CygwinでもあのSLを走らせたくて、sl.tar.gzを落としてきたのまではよかったんだけど、curses.hがないといわれて、仕方なく、ncursesを落としてきてmakeしてインストール。で、そのエラーは消えたんだけど、今度は、
gcc -O -o sl sl.c -lcurses -ltermcap
sl.c: In function `main':
sl.c:90: warning: return type of `main' is not `int'
/usr/lib/gcc-lib/i686-pc-cygwin/3.2/../../../../i686-pc-cygwin/bin/ld: cannot find -lcurses
collect2: ld returned 1 exit status
make: *** [sl] Error 1
|
Mon Apr 14 19:44:26 2003
jvimの表示崩れ変わらず
http://pcmania.jp/~moraz/doc/link.htmlあたりがなんか助けてくれそうな。。。ためしに、JVim for Win32を -nwでコンソールモードにしたらDOSでは動かすことができた。
表示も問題はない。なんでだろう?とかんがえるに、きっとCygwinとJVimの愛称が悪いんだろうということにきがつく。JVIMってIMEにWindowsのものを予測なんてしてないから。きっとIMEがらみの問題だろう。プログラマのはずなのにそれについてなんの可決絵もできないでいる。
|
|
Sun Apr 13 21:45:54 2003
TITLE
Ctrl+lをBASH上で行うと、clearと同じ効果が得られることがわかった。これがclearのショートカットなのか
どうかはよくわからない。viの再描画をやっていて、ついBash上でも行ったらそうなったのだ。
|
(Sun Apr 13 19:40:53 2003)
CronをWindows2000で動かす
まず、Windows側の設定で、[システムのプロパティ]-[詳細]タブ-[環境変数]から設定
C:\usr\local\bin;c:\bin
を追加(CygwinがC:\配下にインストールされている場合)
次は、cygrunsrvを使って、
$ cygrunsrv -I cron -d "CYGWIN cron" \
> -p /usr/sbin/cron \
> -a -D -e "CYGWIN=ntsec nosmbntsec"
と実行する。cygrunsrvとcronはインストールされていることを前提にしています。
これでCYGWIN cronという名前でサービスが登録されました。
アンインストールする際には、
$ cygrunsrv -R cron
というコマンドでサービスから抹消されます。確認してください。
サービスに登録去れているかどうかは管理ツールのサービスをみるとわかります。
そこで状態が開始になっていなければ開始しましょう。
つぎは実際に実行させてみましょう。
今回は、backup.shというシェルスクリプトを実行させると仮定します。
$ crontab -e
とうちこむとviエディタが起動してスケジュールを登録できる状態になります。
ここで、
* * * * * /home/hide/backup.sh
と書き込むと1分おきに/home/hide/backup.shを実行するといういみになります。
分 時 日 月 曜日 ジョブ
という順に並んでいるのです。
|
(Sun Apr 13 16:16:30 2003)
シェルスクリプトのはなし
#!/bin/sh
ftp -n www.tok2.com <<EOF_FTP
user USER PASS
ascii
prompt
put $*
quit
EOF_FTP
こんなスクリプトを作ってPATHを通しておくと、FTPが楽になる。
USERにユーザ名、PASSにパスワードを書き込んでおく。
あとは、非対話モードになってくれる(prompt)ので勝手にFTPしておいてきてくれるのだ。
|
2003.4.12
Cygwinで日本語環境を構築する際に必要な設定
.bashrcに
# export JLESSCHARSET=japanese-sjis
もんだいなく表示されたのでコメントアウトした。
# alias ls='ls --color=auto '
# alias ls='ls -AF --color=tty --show-control-chars'
# カラフルな日本語ファイル名を表示する
alias ls='ls -ANF --color=auto --show-control-chars'
# 日本語ファイル名の指定(Tab補完もできるはず)
bind 'set convert-meta off'
bind 'set meta-flag on'
bind 'set output-meta on'
を追加。
.bash_profileに
# 日本語の入力
stty cs8 -istrip -parenb
の一行を追加。
|
( Sun Apr 13 12:46:14 2003)
Window2000のCygwin環境が日本語で対応できるようになってきた。lsは色つきにして、alias ls='ls -AF --color=tty --show-control-chars' と~/.bashrcに付け加えてあるので日本語がコンソールで表示できるようになっている。
あと、viがいままで日本語が表示も入力もできなかったんだけど、jvimをインストールして対応できるようになったので、vim32を使わなくてもよくなりつつある。
やっぱりコンソールからすぐに編集できるのがviのよさであるわけでアプリをいちいち立ち上げるというのはちょっと違う気がしていたのだ。
日本語を入力するときはvi(jvim)を立ち上げてAlt+半角/全角キーでできる。jvimのインストール時にvimにjvimのパッチをあてたり、patchはあんまり使わないのでそれの勉強にもなった↓この辺を参考にさせてもらった。
http://www6.plala.or.jp/jun-pei/linux/ld_new.html
jvimがうまく日本語入力できなくなっていて、patchのあたりかたがわるかったのかとコンパイルしなおしたりしたんだけどなんとか動くようになった。理由は、単純に~/.exrcがおかしかったため。単純ミスだった。でもまだすこしおかしい。打ってると1文字分改行されてひょうじされてしまうのだ。これはなんとかならないか。ちゃんと保存はされているんだけど。とりあえず表示が崩れだしたら、Ctrl+lで画面のリフレッシュをしてその場をしのいでいる。
|
|