MEMO

2003年 6月 14日 土曜日 17:26:12 JST   CPANからモジュールをもってくる
CPANからモジュールをもってきて、勝手にインストールしてもらう手軽な方法。
# perl -MCPAN -e shell

するとプロンプトが、cpan>
にかわる。
で、 cpan> install モジュール名
これで、勝手にモジュールの依存関係をしらべてもらえて、勝手にインストールしてもらえる。aptよりも 古くからある方法で、かなりすばらしい。
2003年 6月 9日 月曜日 08:35:51 JST   CPANをいれる
最近やっているPerlのデータ万陣愚の総仕上げとして、CPANからモジュールをもってきて、 テストをしようとしたんだけど、CPANをインストールはできたが、そのあとで問題が怒った。 --08:36:39-- ftp://ftp.jaist.ac.jp/pub/lang/perl/CPAN/authors/id/W/WR/WRW/Number-Format-1.45.tar.gz (試行:15) => `-' ftp.jaist.ac.jp[150.65.7.50]:21 に接続しています... 接続しました。 anonymous としてログインしています... サーバがログインを拒否しました。 再試行しています。 こんなかんじになってしまう。 CPANをインストールできて、そのあとに、 cpan> install Jcode とやってまずJCODEはインストールができた。 そのあとでConvert::EBCDICというEBCDIC形式のデータをあつかえるモジュールをいれようとしたところ、 取得しようとしたままとまったので、Ctrl+Cで中断を仕手、別のモジュールをいれようということにした。 それが問題をおこしたらしい。そのあとに、Number::Formatモジュールをいれようとしても、サーバが 拒否をするのだ。どうしてだ? あと、疑問なのは、CPANっていうのはユーザごとに設定ができるものなのか?念のためにrootでCPAN をいれようとしたんだけど、~/.root以下に設定をおくようになった。もしかしてこれってrootだけしかつかえない ようになってしまうんだろうか?ぼくとしては全ユーザに許して欲しいんだけれども。
2003年 6月 7日 土曜日 09:42:00 JST   TITLE
XMLマスタープロフェッショナルに必要な書籍類。
2003年5月17日(土)2時42分48秒   TITLE
FDを1.68Mで書き込めない。Linuxで書き込もうとしている。でも焼けない、焼けない焼けない、焼けない、焼けない、 焼けない、焼けない、焼けない。
2003年5月17日(土)1時1分4秒   TITLE
CONTENTS
2003年5月13日(火)6時7分14秒   TITLE
J-SKY用のエミュレータがある。 http://www.919search.com/index.html これは、J-PHONEの端末をエミュレートしてくれる。919シュミレータとかっていうらしい。 あんまり携帯の端末のエミュレータって意外にないもんだ。あっても、なんか 端末らしくなかったり、ez-webはあるにはあるけど、最近の端末をエミュレートはしてくれない。 ただ、簡単なHTMLを端末で見るとどのくらいのレイアウトになるのか?ということだけが みたければこれがあればいいきがする。
2003年5月13日(火)3時42分55秒   Dynamic DNSの設定が終わる
とうとう、DynamicDNSの設定ができた。というか、いままでと変えてないんだけど、勝手にうまくいってしまったのだ。 なにやら告知で障害があったというから、きっと障害のせいだろう。 http://www.zive.org/ というところで登録をした。ここで、自分のIDとパスワードを入れてログインすると勝手にIPアドレスをぬいてくれる。 で、あとはその下にあるリンクをクリックするとIPアドレスをDNSに登録する画面になるのでそこで登録を済ませると 自分のマシンがDNSに登録されてしまう。ぼくのマシンのDNS名は、 inconspicua.zive.net<である。 たまにIPアドレスが変わったら登録するのが面倒だけどそれ以外では問題はない。これはかなりうれしい。 世界中からアクセスできるようになったのだ。 なにより、FTPしてほかのWEBサーバに沖に行かなくていいのがかなり楽。自分のローカルファイルをいじればそのまま配信されているのだから。
2003年 5月 6日 火曜日 02:26:51 JST   TITLE
面白いゲームを見付けた。LEXTERというコンソールでうごくゲーム。 マシンパワーがなくても遊べるだろう。 ルールが面白くて、縦横斜めで英単語をならべて消すと言う『落ちもの』である。 http://www.kyne.com.au/~mark/software/ ほかにも、フランス語も辞書がはいっていてフランス語で陳べるルールも使えるらしい。 でもおちてくるブロックのアルファベットが偏っている感じがしたのはきのせいだろうか?でないとゲームにならなくなるんだろうけど。
2003年 5月 6日 火曜日 01:39:40 JST   muttがなついてくれた
やっと、muttでメールの送受信ができた。 まず送信でエラーがおきたのは、.muttrcの設定二問台があったせいだった。これは$sendmailにpostfixを設定していたためで実際にはフェイクしていたのはsendmailだったのでこれをいじってはいけなかった。 それは、起動時にmutt -vとやると設定しているデフォルトの変数が表示されるんだけどそこでsendmailが設定されていたのを確認していたためだった。で、コメントアウトしたら直った。 つぎに、受信なんだけど、/var/spool/mail/hideがロックできない?ってメッセージが出る。そのスプールファイルをいろいろ属性を変えてみたりしたんだけど変化なし。で、このファイルのバックアップをとろうとしたときにバックアップがとれなかったのを思い出したのだ。 root権限でmuttで受信をすると受信できた。これは想像通りだった。つまり、/var/spool/mail事態がrootが所有者なのだ。だから、このディレクトリに他のファイルをつくることができない。rootで受信したのは、ファイルを作っていたのだ。ロックするときにたしかhide.lockっていうファイルを作成してほかからアクセスできないようにするはず。で、受信してから開放するのだ。だから、/var/spool/mailの所有者をhideにした。セキュリティからいうとあんまよくないし、システム的にも問題があるんだけどぼくひとりがつかっているのでそうした。 これは、もともとスプールファイル事態がシステムが管理すべきなんだという考え方なんだと思う。fetchmailとかが外のMTAからゲットしてきてローカルにためて、muttがそれを外にいってユーザディレクトリのメールボックスにもっていくというのが本式なんだと思う。そのうちにいろいろ設定をしたくなったら、fetchmailなんかのMDAを使おうと思う。それまではユーザ権限のmuttで直接ローカルスプールにメールをもってこれるように権限をユーザにしておいた。とりあえずこれでmuttでメール送受信が可能になった。これはかなりうれしい。
2003年 5月 5日 月曜日 02:54:17 JST   ハードの設定、しかし疲れている
cacatuoidesで自動シャットダウンができない。 なんかLINUX使ってるとハードの種類が変わっただけで いろいろ設定しないとならなくて大変。 WINDOWSを入れていたときに自動でおちていたのでハードが もともとできないというわけではないはず。 なんとかしたいが疲れている。
2003年 5月 5日 月曜日 02:31:33 JST   Xを表示する側を変える。
cacatuoides(Vine2.6r1 Pentium 100MHz)とinconspicua(Vine2.6r1 Duron 700MHz)とがあって、どちらもLINUXなので、VNCを使わずに どうせならXをリモートで操ろうと思った。 で、前にもやったんだけど備忘録。 hide@inconspicua hide]$ xhost + cacatuoides cacatuoides being added to access control list hide@inconspicua hide]$ telnet Trying 192.168.0.10... Connected to cacatuoides. Escape character is '^]'. Vine Linux 2.6 (La Fleur de Bouard) Kernel 2.4.19-0vl11 on an i586 login: hide Password: Last login: Mon May 5 02:28:53 from inconspicua [hide@cacatuoides hide]$ export DISPLAY=inconspicua:0.0 [hide@cacatuoides hide]$ sylpheed & 1.まず、xhost + で、リモートホストと接続する。 2.で、メッセージが正しく表示されたことを確認して、リモート側にTELNTE Tして今度はリモートからローカル側に通信を送るように export DISPLAY=:0.0 をする。この:0.0のぶぶんは確かディスプレイ番号で、うつす番号をいれるんだけど 大抵リモートで使っている番号は0なので0を使う。このへんをいろいろ使い分けている ひとは玄人のはずなのでxhostの使いかたで迷っていたりしないだろう。きっと。 3.で、TELNETしたままリモートでアプリをあげるとその実行はローカル側で表示される。 テレビみたいなものだ。 実行しているのはそれぞれのマシンだけど、移す場所を変えればいい。 XはXサーバなので移す側をチェンジすることができるのだ。
2003年 5月 4日 日曜日 23:58:12 JST   WindowMakerに戻してみる
EnlightmentからWindowMakerに変更した。 というか戻した。ちょっとやっぱり重いのでウィンドウが かなり時間をかけて処理される。 いろいろいじって、新規にひらくウィンドウが画面の そとからトンでくるようにしてみたりしたんだけど逆効果だった。 それはあまり理由ではなくて、じつはハングアップしてしまったのだ。XMMSを起動してバビロンの奇跡を聞いていたところ、途中再生が中断してみたりで、結局デスクトップも固まった。で、コンソール画面にもどそうとおもったんだけどそれも不可能。結局システムがとまってしまったのでこれはまずいとおもってマネージャーを戻したのだ。AQUAにテーマをかえてMACぽさを味わっていたんだけどそこまで本格的に味わう必要もないだろうとおもって(笑) で、Aquaにしていてよかったのは、ツールバーのかんじもあるんだけど、ETERMが使いやすかったことだ。みためも背景に画像がはりつけられたりふぉんとをその場でかえられたりするところもよかった。で、これはアプリなので引き継げた。あとログイン時の起動音がAQUAのテーマソング(だとおもう)になっていたのでひきつごうかとおもったんだけどうまくいかない。よくみると、ファイル名が、login.auになっている。AU形式をWAV形式にできるツールはないかと探していたら、デフォルトでsoxってのがあるらしい。自分の環境(Vine2.6r1)でもすでに入っていたので使ってみるr。 # sox login.au login.wav これで新規にlogin.wavが作成された。 で、設定をするとちゃんとテーマが流れる。 ついでにlogout.auもlogout.wavにして使ってみたんだけど、 WindowMaker自体が軽すぎて終了するのが早いので音がながれるまえに終わってしまうと言う事態になった。科類のも問題化?なんておもってみたりする。
2003年 5月 3日 土曜日 02:14:02 JST   複数の表からのデータの表示
複数の表からのデータの表示。
等価結合、非等価結合がある。
どちらも、WHERE句がキーになる。
WHEREは、条件をしるすんだけど、これを2つの表に関しておこなうとうまく結合するのだ。ほんとうにうまく結合になるというかんじである。一つの表でやるのはいままで通りなんだけど、条件をあわせると二つがひとつになる。
例を出そうかと思ったけどやめた。簡単だと思ったから。
で、代わりに自己結合を例に出す。まずサンプルから。
bio=> select 部下.従業員NO, 部下.従業員名, 部下.上司, 上司.従業員NO, 上司.従業員名 from 従業員 部下,従業員 上司 where 部下.上司=上司.従業員NO;
従業員no|従業員名|上司|従業員no|従業員名
--------+--------+----+--------+--------
7083|藤原 |7839| 7839|松岡
7011|高橋 |7839| 7839|松岡
7839|松岡 |7839| 7839|松岡
(3 rows)
これって、一つの表のなかでのできごとです。
なんのことかというと、WHERE句のなかで、
部下.上司=上司.従業員NOという表し方を
しているんだけど部下表も上司表もありません。あるのは従業員表のみ。でも、上司表と部下表とを見比べて、部下の上司と上司の従業員NOとがおなじものを抽出してひとつの表にまとめているんです。
そのこたえは、FROM句にあります。ここで従業員 部下, 従業員 上司とやって、あたかも二つの表があるかのようにみせているのです。
なんのことかわからないかもしれないですが、その意味のわからなさはきっと表の意味なんだと思う。
意味と言うのは目的のことかもしれない。
ある従業員を表すとそのなかには上司と部下という関係がある。だから、そのなかから上司と部下の関係にあるものをぬきだし表にしたい!という目的です。でも、一つの表に上司と部下が混在している。だからわかりやすいように、おなじ表を上司というなまえをつけ、部下と井生名前を付け、つきあわせているのです。
紙でやればおなじ表を2枚印刷してそこから上司がおなじ部下をマーカーでひっぱってあとで書き出すような作業です。
そんな作業をSQLサーバにやらせる作業がこんなことなのです。
2003年 5月 3日 土曜日 01:50:53 JST   TITLE
例によって、テーブルを作るときはSQLをあらかじめ 書いたファイルをつくって読み込ませる。
今回は従業員表と部署表以外にも給与等級額というものが 必要になったのでそれをつくりました。
bio=> \i amount_insert.sql
INSERT INTO 給与等級額 VALUES(1,'70000','120000');
INSERT 19488 1
INSERT INTO 給与等級額 VALUES(1,'120001','140000');
INSERT 19489 1
INSERT INTO 給与等級額 VALUES(1,'140001','200000');
INSERT 19490 1
INSERT INTO 給与等級額 VALUES(1,'200001','300000');
INSERT 19491 1
INSERT INTO 給与等級額 VALUES(1,'300001','999999');
INSERT 19492 1
EOF
bio=> select * from 給与等級額;
等級|最低給与額|最高給与額
----+----------+----------
1| 70000| 120000
1| 120001| 140000
1| 140001| 200000
1| 200001| 300000
1| 300001| 999999
(5 rows)
spoolを使って記録しようと思ったんだけどうまくいかなかったのでしかたないので scriptをシェルで実行することにした。 scriptとは、端末上でおこったことを記録するコマンドでpsqlとは何の関係も ないんだけど、Oracleのspoolと同様のこう化があるんじゃないか?とおもい 使うことにした。記録をのこすための手段。 ちなみにpsqlからシェル上でコマンドをおこなうときは\!をつける。 bio=>\!ls -l とかやるとカレントディレクトリが表示されたりする。 とおもったらまずいことになった。psql上でscriptを使うとexitがおこなわれる あいだシェルのコマンドラインになってしまうのだ。psqlに戻れない。 というわけで使うのを止めた。
2003年 5月 3日 土曜日 01:10:18 JST   SQL勉強終わる。で、Postgres
なんとかSQLの勉強が終わった。 てきとうに読んだのでまだよくわかってない。 あとはPostgresでなんとか勉強することにした。 でも、Postgresが動くのかどうかすらわからない。というのはクライアント側のサーバをバージョンアップしてしまったからだ。 そっか、だからサーバは別マシンにしておかないとならないんだとじっ関したわけだけれども。というわけで、さっそくPostgresを動かすことにする。一番難しいのは拍の結合というやつ。 なんかひさびさにpsqlを動かした。そしたらこんなメッセージがでてきたんだけど、 --- PostgreSQL の会話型ターミナル、psql へようこそ \copyright とタイプすると、配布条件を表示します \h とタイプすると、SQL コマンドのヘルプを表示します \? とタイプすると、内部スラッシュコマンドのヘルプを表示します \g と打つかセミコロンで閉じると、クエリーを実行します \q で終了します --- そういえば、LINUXからクライアントとして動かしたのは初めてだった。いままではクライアントはWINDOWSだった。だからすごく新鮮な感じがしたのだ。
2003年 5月 2日 金曜日 15:27:27 JST   CanoScan DL Site
Canon CanoScan D660U Driver DownLoad http://cweb.canon.jp/drv-upd/canoscan/index-j.html Scannerがドライバがなくなってからは使わなくなっていた。 でもDLすればいいんだ。でもなかなかそれすら面倒におもって しまう。精神的な壁っておそろしい。
2003年 5月 2日 金曜日 14:19:40 JST   TWIN
a program to open many window on CONSOLE http://linuz.sns.it/~max/twin/
2003年 5月 2日 金曜日 13:02:32 JST   TITLE
あと、screenってコマンドもおぼえておくといい。 あるコマンドを実行していて
2003年 5月 2日 金曜日 12:47:34 JST   xset(ビープ音をOFF!)
さっき書いたことは前にやったし初歩的なことだとすこし軽んじていたんだけど、xsetは簡単なスクリーンセーバ機能の他にビープ音すら制御できるのだ。そのことはすこししか触れられてなかったが調べてみるとあった。コンソールで補完機能を使っていると『ビッ!!』となって結構うるさい。さっきまであとで電源悪としたら配線をぬいてやろうとおもっていた。ところがXでだしているんだからXで消せ♪ドア。 # xset -b ほかにもアプリでそれぞれビープ音を消せるらしい。 http://www.linux.or.jp/JF/JFdocs/Visual-Bell/applications.html もちろんXでなくてもけせるわけでシェルの種類ごとに # set visiblebell (tcsh(6.04以降) # set bell-style visible (bash) なんてことができる。これらを設定ファイルに かきこめばいい。 ぼくはこれはやったんだけど直んなかった。 なんかやりかた間違えたんだろうか。
2003年 5月 2日 金曜日 12:27:04 JST   Xの起動時の設定。(.Xdefaults,.xinitrc)
Enlightenmentを使い出してXの使いかたも設定も いろいろあったなぁとおもいだした。 たしかXの起動時にたちあげるアプリの設定も、 .Xdefaultsとか.xnitrcとかに記述するってあった。 コンソールを使っていると立ち上げてからいろいろ起動したり 端末からエディタはviだし、でたくさんあげる必要がないので 困らなかったりするのだ。 あとで説明を残すけど、いろいろ設定があるので設定ファイルのみを記載しておきます。 xset s 300 xset s xset s noblank xset s 300 3 xscreensaver -timeout 5 -lock-mode & ~/.xinitrc for instance # blank screensaver #xset s 300 # strolling 'X' screensaver #xset s noblank #xset s 300 3 #xscreensaver xscreensaver -timeout 5 -lock-mode & # start applications kterm & emacs & # start window manager fvwm2 ~/.Xdefaults for instance !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! emacs, xemacs !emacs*Background: DarkSlateGray emacs*Background: gray !emacs*Foreground: Wheat emacs*Foreground: midnightblue !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! kterm KTerm*background: gray KTerm*foreground: midnightblue !emacs*font: fixed emacs*font: -etl-fixed-medium-r-normal--16-160-72-72-c-80-iso8859-2 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! emacs, xemacs !emacs.geometry: 80x25 emacs.geometry: 80x44+220+60 ! kterm KTerm*geometry: 80x24-10+5 !emacs*pointerColor: Orchid emacs*pointerColor: black !emacs*cursorColor: Orchid emacs*cursorColor: black .Xdefaultsのコメント行は!ではじまる。 フォント野設定はXでつかるものは、 xfontselを使うとわかる。それぞれのアプリで 使えるフォントは、infoドキュメントにある。 # info emacs とか実行するとわかる。manよりもアプリ寄りの 情報だ。 あとは、/usr/X11R6/lib/X11/app-defaultsに Xのアプリのデフォルトが記述されたファイルが たくさんある。
2003年 5月 2日 金曜日 00:07:39 JST   TITLE
Xにはいろんなウィンドウマネージャがあるものだ。 ここ こんなにいろんな概観に変えられるのはこれはLINUX独特だろう。 でも、今回一番気に入ったのはAQUAもそうだけど、ETERMだ。背景に画像がはめこまれて色も変えられるし、フォントもなかなかいい。これはべつにEにかぎらず使えるのでだからVINEPLUSにもはいっていたんだな。むかしから知ってたけど、ずっとコンソール画面を使うようになって背景の色を変えることができるようになるのはすごく大切だとおもった。 環境が変えられるのはほんとうに大切なことだとじっかんしたわけである。
2003年 5月 1日 木曜日 23:32:20 JST   コンパイラに怒られる
EsoundっていうのがあるEnlightenmentに音を出させるものらしいんだけど、やっとそのサイトを見付けてDLしたんだけどmakeができない。RTL_NEXTっていうのがはじめてきいた、とかってコンパイラに起こられる。
なんだ?
2003年 5月 1日 木曜日 22:57:18 JST   tee, script-exit, grep -r,ttyrec
Aquaの日本語化のために作成したtextclasses.cfgをゞ変更したのかと言うのはこんなかんじだ。
スクリプトは Thu May 1 22:56:11 2003
に開始しました]0;hide@inconspicua: /home/hide/.enlightenment/themes/Aqua[hide@inconspicua Aqua]$ diff textclasses.cfg.030501 textclasses.cfg
7c7
< __NORMAL "-*-helvetica-bold-r-normal-*-*-120-*-*-*-*-*-*"
---
> __NORMAL "-*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*,-misc-fixed-bold-r-normal-*-12-*-*-*-c-*-*-*"
12c12
< __NORMAL_ACTIVE "-*-helvetica-bold-r-normal-*-*-120-*-*-*-*-*-*"
---
> __NORMAL_ACTIVE "-*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*,-misc-fixed-bold-r-normal-*-12-*-*-*-c-*-*-*"
18c18
< __NORMAL_ACTIVE_STICKY "-*-helvetica-bold-r-normal-*-*-120-*-*-*-*-*-*"
---
> __NORMAL_ACTIVE_STICKY "-*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*,-misc-fixed-bold-r-normal-*-12-*-*-*-c-*-*-*"
27c27
< __NORMAL "-*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*"
---
> __NORMAL "-*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*,-misc-fixed-bold-r-normal-*-12-*-*-*-c-*-*-*"
33c33
< __NORMAL_ACTIVE "-*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*"
---
> __NORMAL_ACTIVE "-*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*,-misc-fixed-bold-r-normal-*-12-*-*-*-c-*-*-*"
41c41
< __NORMAL "-*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*"
---
> __NORMAL "-*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*,-misc-fixed-bold-r-normal-*-12-*-*-*-c-*-*-*"
50c50
< __NORMAL "-*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*"
---
> __NORMAL "-*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*,-misc-fixed-bold-r-normal-*-12-*-*-*-c-*-*-*"
59c59
< __NORMAL "-*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*"
---
> __NORMAL "-*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*,-misc-fixed-bold-r-normal-*-12-*-*-*-c-*-*-*"
65c65
< __HILITED "-*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*"
---
> __HILITED "-*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*,-misc-fixed-bold-r-normal-*-12-*-*-*-c-*-*-*"
70a71,80
>
> __TCLASS __BGN
> __NAME "MENU_TEXT"
> __NORMAL "-*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*,-misc-fixed-medium-r-normal-*-14-*-*-*-c-*-*-*"
> __DRAWING_EFFECT __EFFECT_NONE
> __FORGROUND_COLOR 0 0 0
> __BACKGROUND_COLOR 255 255 255
> __JUSTIFICATION 0
> __END
>
]0;hide@inconspicua: /home/hide/.enlightenment/themes/Aqua[hide@inconspicua Aqua]$ exit

スクリプトは Thu May 1 22:56:27 2003
に終了しました
なんかこれみにくいってかんじだけど、これはちょっと今日本屋さんでUNIXUSERを読んでメモったscriptっていうコマンドを使ってみた結果だ。scriptって最初に打っているのがわかると思うけど、これを打ってから、いろいろコマンドを打って、最後にexitってうつとそこまでのいろんな作業がカレントディレクトリにtypescriptっていうファイルとして記録が残ると言う仕掛け。これって結構便利。でもいまみたら改行コードとかいろんなものもでるみたい。でも完全な証拠になるんだ。画面上の出力結果とかコマンドを何をうったかとかがその端末上の記録をのこすのにもってこい。仁田感じのコマンドで、teeっていうのがある。これはあるコマンド(たとえばmakeとか)を打った亜とにパイプでわたしてファイルを指定するとそのコマンドの出力結果をファイルに入れてくれると言うもの。たしか標準出力でもなんでもはいってくれるはず。これもいちいち端末じょうの画面をぜんぶ選択してコピーとかやらないでいいので楽。
# make | tee outfile こんなかんじ。scriptに仁田コマンドでttyrecっていうのもあるらしいけど、ぼくの環境ではコマンドがなかったので確かめられなかった。 あとついでにgrep -rについて。これはぼくはよくあるディレクトリ以下のファイルにたいしてある文字列が含まれていないかってことを作業でやるんだけどそれっていつも、 # find . -print | xargs grep 'hogehoge'みたく実行する。このxargsってのが曲者で、このコマンドはパイプで渡されるものを逐次渡すコマンドでときどきファイルが壊れているとか、xargs自体がなかったりするのだ。そんなときgrep -r をつかうとあるフォルダ以下のファイルをぜんぶなめてくれるのだ。rはきっとリカーシブルの略だったりするんだろう。
2003年 5月 1日 木曜日 22:05:45 JST   Enlightenmentのテーマ "Aqua"の環境設定
とうとうMacOS XのテーマであるAquaのテーマを Enlightenmentで実現することに成功した。
テーマはここ
そんなにインストは難しくなかったけど参考にしたサイト
がGTK+もいれるように書いてあったけどそれは無視した。
本当は窺に市内とならないことなのかもしれないんだけど。
とにかく、AQUAのテーマをDLしてきて、./enlightenment/themes/以下にAquaというディレクトリを作成して展開して入れる。
なんとか動いたと言う感じだ。
でも、ツールバーとか日本語が化けている。これは、theme/Aquaいかにあるtextclasses.cfgというファイルが日本語フォントをよみこんでいないためだ。theme以下にできたtextclasses.cfgっていうのに日本語を読ませる設定がないためらしい。そういえばテーマを日本語化するスクリプトがあったはず。PERLで書かれていた。実用的だ茄ぁって関心した。PERLってUNIXではWORD、EXCELみたく使われているみたい。というかそれ以上なのかも。

http://home2.highway.ne.jp/mutoh/bibo/b200004.html
詳しくはここで。AQUAの入手先もある
。 Enlightenmentを使っているといままでのショートカットが使えないのでちょっとばかし疲れそうだ。
でもきっとショートカットがあるはず。というか自分で設定するのか?で、F1をおしたらETERM上では設定が変わった。で、偶然FreeWnnでF1をつかったら環境設定とか単語登録とかの画面がでて来た。いろいろやってみるもんなんだ。

Enlightenment 本家 http://www.enlightenment.org/pages/main.html
2003年 5月 1日 木曜日 21:06:03 JST   TITLE
ひさびさにおもいだしてVineにEnlightenmentをいれた。
なんでおもいだしたかというと、もともとぼくはEnlightenmentを使っていたんだけど、それが使えなくなってしまって面倒になってWindowMakerを使っていたという経緯があった。それがいまみたくバージョンアップをしたときだった。アップグレードを設楽使えなくなるものがたくさんあってそのときにあぁ、そうだった、ウィンドウマネージャもそうだった。とおもいだしたのだ。それでいれてみた。そしたらこれが凄いきれい。
最近WINDOWSを使っていたのはやっぱり見た目のできぐあいとかやっぱりGUIの作り込み方がすばらしいからだった。でも、実際に作業をするときにはGUIを使うのはつらい。だからCYGWINをいれていた。TERATERMの背景を変えてみたりするのなんて、ETERMを使えばそれ以上にきれいになる。あとはフォントをきれいにできるといいなぁとはおもう。
あとメモリーを食うんだ、これは。でもいまはそんなにロースペックでもないので安心して使うことができる。というわけでアップグレードを施してようやく帰ってきたというかんじだ。で、いまMacOSXライクなAquaにしようとしている。これができるとほんとにMacぽくなるんだろうなぁ。

http://home2.highway.ne.jp/mutoh/bibo/b200004.html
いま試しにフォントをおおきくしたりちいさくしたり、背景画像を変えたりしてみた
2003年 5月 1日 木曜日 12:30:39 JST   Vineをいれたかったマシン
で、アップグレードしたinconspicuaなんだけどほんとは新しいPCのほうにVINE をいれたかったのだ。でも、結局ハードディスクを全部消去するはめに なり、WIN98すら立ち上がらなくなったのだ。これは別のPCからCD-ROMをもって きてインストールするしかないなぁ。
2003年 5月 1日 木曜日 12:23:18 JST   Vine2.6r1に乗り換え
PCに入っているVine Linuxを2.1.5から2.6r1へアップグレードした。
なんといっても、カーネルが2.4系になってくれたのがおおきい。
でも、いつもアップグレードするとろくなことがない。大抵依存関係に
あったものがおかしなことになって動作しなくなる。
今回もまずサウンドがならなくなった。ALSAを使っていたからもういちど
alsaconfをつかったんだけど見付からないらしい。まえにあったのに
見付からないってのもおかしなもんだ。で、ALSAを新気に入れようとしたんだけど
どうやら前にいろいろいじっているうちにパッケージとソースとがごちゃごちゃ
になっているらしい。2都農バージョンのalsa-driverから必要とされている
パッケージがあるとか。さっき、APT-GETを使おうと四苦八苦していたら
結局依存関係で削除した方がいいとかいわれてXまで削除されてしまって
もういちどインストしてしまった。vnc-serverまで削除された。
いらないものは捨てなさいといわれてむりやりおもちゃを捨てられた子供
のような気分だ。
で、サウンドのほうなんだけど結局解決した。ひとつはBIOSの問題で、
恩チップのほうのサウンドカードが認識されてしまっていたと言う問題が
あったのでBIOSでDISABLEにした(一回やったのになぜか設定が解除されている)
それと、kernel2.4系でもういちまいのYAHAMA YM724が認識されるようになった
のだ。だからOSSドライバでことがすむようになった。それでリーナスさんの
声も聞けて一件落着。ほんとはALSAのほうがいいんだけど。コマンドラインで
音量とかいじれるから。でも音がデルのはたすかった。
2003年4月30日(水)8時34分23秒   Java Development Kit by Black Down
うちのmendeziにはJava環境としてBlackDownのJDKが入っている。JDKをソースからコンパイルして入れるしかなくて、 そのためにそのときのSunのJDKは古いバージョンでもコンパイルができなかったのだ。それで仕方なく入れたんだけど、 それって結構すごい選択だった。BlackDownっていうのは、有志でJava環境を作っていたコミュニティで、Linuxに移植をしていた らしい。それでSunのJDKのLinuxバージョンは結構新しいんだけど、それってこのBlackDownで作ったものをそのまま使っている らしいのだ。だからBlackDown版を入れたというのはそんなに悪くない選択だったらしい。 http://www.blackdown.org/
DATE 2003年4月30日(水)7時37分4秒   そういえば、ぼくはCygwinについて何も知らない
ついでにCygwinのPrefixについて調べてみた。というのは、ドライブを表現するのになんで、/cygdrive/ってつけるのか 気になっていたからだ。
http://www.sixnine.net/cygwin/cygwin-doc/cygwin-ug-net/using.html
http://www.sixnine.net/cygwin/cygwin-doc/cygwin-ug-net/using.html
パス名のマッピングというらしい。なんでも、UNIXにはドライブという概念がなく、ドライブを新設しても、そのドライブは マウントして/NEW_DRIVEのように表現されるだけなのだ。これはPOSIXのパス表現にもとづくのだそうです。
でも、Cygwinは Windows上でうごくエミュレータだからWindowsのようにドライブを表現するものとの間にたって表現をする必要ができたのだという。なので、/cygdriveのような表現になったみたい。で、この表現をもっと理解するために、そのマウントを使ってみることにする。
引数を指定しないで実行すると現在のパスマッピングが出力される。
de@elizabethae ~]$ mount
C:\\bin on /usr/bin type system (binmode)
C:\\lib on /usr/lib type system (binmode)
C: on / type system (binmode)
d: on /cygdrive/d type user (binmode,noumount)
ちなみに、-pオプションをつけると、
de@elizabethae ~]$ mount -p
Prefix Type Flags
/cygdrive user binmode
/cygdrive system binmod
e cygdriveというprefixは、説明によると
、 特定の Win32 パスを 既存のマウントによって POSIX パスへと変換することが出来なかった場合、 Cygwin は常に自動的に POSIX パス /cygdrive の下にある仮想上のマウントポイントを使用します。例えば、Cygwin が Z:\foo にアクセスしたが、 Z ドライブは現在のマウントテーブルには存在しなかった場合、 Z:\ は自動的に /cygdrive/Z へと変換されます。デフォルトのプレフィックス /cygdrive は変更可能です (更なる情報については the Section called mount を参照して下さい)。
なんだそうです。つまり仕方なくそうなっているんですね。それで、cygdriveっていうprefixはどこに書かれているのか?
っていうとレジストリにあるらしいので、regeditを実行して調べてみました。
ぼくのCygwinのバージョンは
2003/04/12 13:07:12 Starting cygwin install, version 2.249.2.10
だそうです。このバージョンだと、
HKEY_CURRENT_USER/Software/Cygnus Solutions/Cygwin/mounts v2にあります。ユーザごとのテーブルです。
これがシステム全体で定義されているテーブルというのもあって、administoratorが管理しているんだとか。
で、ユーザごとに管理しているテーブルはmountコマンドで定義を変えることができるみたい。
mount --change-cygdrive-prefix
ってやると変わる。さっきやったけどなぜかシステムのテーブルが変わって、ユーザのテーブルは変わらないという
わけのわからないことになったけどきっとなんかの間違いだろう。
いろいろ特にシステムに関するコマンドはUNIXと同じコマンドであっても微妙に違うみたい。そうだよな、システムはWindowsでUNIXをやってるわけだもんな。だってUNIXのmountのオプションに--change-cygdrive-prefixなんてあるはずない。で、貴重な情報源は、
http://www.sixnine.net/cygwin/cygwin-doc/index.html
2003年4月30日(水)7時23分45秒   Cygwinのパス表現
あとついでにTips。Cygwinを使っているとパーティションの移動でつまづく。Windowsだから、Cドライブは、C:\以下にある。 Dドライブがあれば、D:\となる。DOSプロンプトなら、Dドライブに移動するのにD:と打てばDドライブに移動できるんだけど、 Cygwin上ではシェルが違うからできない。その場合、Cygwinでは、仮想的に/cygdrive/dがDドライブを表すので、 cd /cygdrive/dとやるとDドライブに移動できる。同様に、Eドライブがあれば/cygdrive/eとやればいい。これってあんまり ネットでも書いてないようなきがする。
2003年4月30日(水)7時14分47秒   Cronにさせたい仕事そしてさせられない仕事
#!/bin/sh
# ===================================================
# arcFiles
#
# バックアップ作成スクリプト
# www.tok2.comにアップしているHTMLファイル群を
# tarで固めてバックアップをとる
# lastmod: 03.04.30
# ===================================================
curdir='/cygdrive/d/My_Homepage/simba/'
tmpfile='/tmp/filelist'
ls $curdir > $tmpfile

bkfile=$curdir/kusano.`date +%y%m%d`.tar.gz
#grep -i html $tmpfile
grep -i html $tmpfile | while read file; do
echo "========= $curdir${file%.bak} ==========="
tar zcf $bkfile $curdir${file%.bak}
done
結局、バックファイルをとるためのシェルスクリプトを書いていて実現できなかったので諦めざるを得なかった。
というか、きっと1週間くらいかかるに違いない。
やろうとしたことは、
1./cygdrive/d/My_Homepage/simba/以下のファイルのリストを作る。
2.そのなかから、htmlファイルだけを抜き取る
3.そのファイルをカレントディレクトリ(/cygdrive/d/My_Homepage/simba)にtar.gzで固めて圧縮する
というもの。それで考えて上記のスクリプトを作成したのだが、なぜかうまくいかない。
実行すると、
========= /cygdrive/d/My_Homepage/simba/index.html ===========
tar: Removing leading `/' from member names
========= /cygdrive/d/My_Homepage/simba/index.html.030411 ===========
tar: Removing leading `/' from member names
========= /cygdrive/d/My_Homepage/simba/index.html ===========
tar: Removing leading `/' from member names
========= /cygdrive/d/My_Homepage/simba/link.html ===========
tar: Removing leading `/' from member names
========= /cygdrive/d/My_Homepage/simba/link.html ===========
tar: Removing leading `/' from member names
========= /cygdrive/d/My_Homepage/simba/list.html ===========
tar: Removing leading `/' from member names
========= /cygdrive/d/My_Homepage/simba/memo.html ===========
tar: Removing leading `/' from member names
========= /cygdrive/d/My_Homepage/simba/memo.html ===========
tar: Removing leading `/' from member names
========= /cygdrive/d/My_Homepage/simba/memo.html.bak ===========
tar: Removing leading `/' from member names
========= /cygdrive/d/My_Homepage/simba/perl.html ===========
tar: Removing leading `/' from member names ========= /cygdrive/d/My_Homepage/simba/ruby.html ===========
tar: Removing leading `/' from member names
========= /cygdrive/d/My_Homepage/simba/ruby_sub0.html ===========
tar: Removing leading `/' from member names
========= /cygdrive/d/My_Homepage/simba/sample.html ===========
tar: Removing leading `/' from member names
========= /cygdrive/d/My_Homepage/simba/sample.html ===========
tar: Removing leading `/' from member names
========= /cygdrive/d/My_Homepage/simba/test.html ===========
tar: Removing leading `/' from member names
========= /cygdrive/d/My_Homepage/simba/test.html ===========
tar: Removing leading `/' from member names
となる。なぜ??
さっきファイルを消してしまった原因が分からないといったが撤回する。
原因は、技術力のなさと僕の性格だ。そして二つとも直らない。致命的だ。
となる。
DATE 2003年4月30日(水)5時45分34秒   TITLE
バックアップがないもんなぁ、って思っていたらあったのだ。実はたまたまバックアップを取っていたのだ! 実は、昨日までデュアルブートしているLINUXで作業を少しだけやっていて、そのときローカルにmemo.htmlをもってきて それを編集していた。だからあったのだ。さっそくVineでログインして、ローカルにあるファイルをもってきた。 それでなくしてから作業していたmemo.htmlをマージすることにした。 というわけで完全なバックアップではないけれども大事なところは修復された。というかほとんど直った。 これもバックアップのおかげ。今回はたまたま直ったがこれを機にやっぱりバックアップの大切さを実感したので バックアップをとることにした。せっかく覚えたcrontabも使えることだし(そうだ、その使い方も書いてあったんだ)。
2003年4月30日(水)5時3分35秒   消えたものの覚書き
忘れないうちに、いままで書いてきた内容のキーワードだけでも残しておくことにする。
Postgres(SQLの勉強をしようと思って、ひたすらSQL文を書いたり、ネットワーク接続するための設定やらインストールの情況なんかを全部書いていた)。keroppy(1FDを作ろうと思って、このディストリビューションがいいとおもってリンク先を残していた。tomsrtbtというのもあった。これは検索すればなんとかなる)。新しいPCの構成を書いていた。残しておいた方がいいとおもって。でもさっき消えた)。
CPU: PentiumMMX 430MHz
M/b: ??
Memory:32MB
HDD: Maxtor 8.4GB
CD-ROM:WEARNES CDD-820ERC
Graphic Card: Maxtor Graphics
FDD: NEC ??
SPEAKER: YMS-M100
ウーハー:YMT-MSWT
とりあえず覚えているだけでこんなかんじ。また調べなおす気はない。
keroppyのfbwebがなかったはずなのにサイトに追加されていた。これは、今月号のLinuxWorldを読んでいたら、fbwebで1FDフロッピーサーバを実現するって言う特集が組まれていてあれってなかったはず、っておもって見に行ったらあったという覚書きをしていた。もしかしてあの特集を書いていた人がkeroppyの作者かな?っておもったところでとまっていた。
http://shimakero.s4.xrea.com/keroppy/ 悔しいのはもろもろの設定に関する覚書きとSQLの勉強のところだ。これはどうしようもない。でもSQLは頭に入っているとも いえるのでこれは忘れないうちに資格とるとか形にでも市内と報われないなぁっておもう。
あと、slのページ http://www.tkl.iis.u-tokyo.ac.jp/~toyoda/

http://www.linet.gr.jp/~izumi/sl/ 消えてよかったこと。 ・ページが軽くなった(^. ^; ・また位置から出直す気になった。
DATE 2003年4月30日(水)4時46分42秒   すべて消えた
ぼくの馬鹿さ加減にはあきれることばかりだが、このページのメモを全部消去してしまった。 ここ1ヶ月のぼくのほとんどの時間が費やされたページであっただけにかなりのショックが隠せない。 1ページにすべて書き込んでいるから一つのファイルが消えただけでどうしようもない。1ページに書くと 効率がいいんだけど、ファイルがなくなったときの損害は大きすぎた。仕方がないので、どうやって ファイルがなくなったのかを説明してみる。 まず、一つのファイルが大きくなりすぎたのでファイルをわけることにしたのだ。 古い構成: memo.html 新しい構成:
memo -+
|
+-memo.html(new html)
+-memo0.html(old html)
古いmemo.htmlをmemo0.htmlにリネームし、新しいmemo.htmlをmemo.htmlとして、新しいディレクトリmemo の中に入れる。このmemo.html(new)にindex.htmlからリンクをすることにしたのだ。 で、安心して、tok2.comにFTPしたんだけど、途中で気が変わって、やっぱり古いmemo0.htmlをmemo040429.html として、新しいmemo.htmlとともに、カレントディレクトリに入れてしまおうとしたのだ。で、memoディレクトリ はいらないので消去した。ところがmemoディレクトリの中にあるファイルをカレントに移動しないままに消去 したので古いmemo0.htmlごと消えたのだ。memo0.htmlはこれまで書き込んできたファイルでバックアップがないから そのままなくなってしまった。 とおもったら、viはたしかバックアップファイルをとってあるはず!とおもったんだけど、いまこのファイルを保存したた ためにうわがきされてしまった!と思って落ち込んでいてあせっていたからlsをslと間違えて打ち込んでしまい、 slが動き出した。・゜(´□`)゜・。 もうおかしくなりそうだ。 今後、同じミスをしないためには、バックアップをとる(でもとってたんだよね) ファイルを一つにまとめないで分散させる(一つの方がすぐに書き込めて精神的な障壁がすくなくてすむからわざとやったんだけど)というわけで、また同じミスをしそうである。仕方ないと割り切るべきか…。 かなり時間をかけてつくったファイルだっただけに、すべて頭の中にある!なんてかっこつけるのも つらすぎてできない。
2003年 4月28日(月) 21時21分09秒 JST   XPenguin exists even now.
XPENGUINSというLINUXのX上でうごくマスコットアプリが あった。むかし、いれていて、たまに行き詰まったときに 実行してなぐさめられていた。最近、とある雑誌のバックナンバーを読んでいたら書いてあったのでなつかしくてURLを撃ち込んだら引っ越ししていた。 あたらしいURL2いってみるとバージョンがあがってちゃんと存在していた。 しかも、WINDOWSでも動くものが移植されている。 http://xpenguins.seul.org/
2003年 4月28日(月) 02時19分56秒 JST   ラジオ自動録画システム
いつかやってみたものにラジオ自動録音システムがある。 これはLINUXでALSAドライバとMP3エンコーダとPERLとシェルスクリプトとラジオ本体があればできる。前は技術的にちんぷんかんぷんだったんだけど、いまならできるようなきがする。あと、LINEIN端子を買ってこないと。前に電器屋にいったら、端子には種類があるんだよ、といわれて買えなかった。 今は、ラジオが壊れ、しかも録音したかった番組(NHK 英会話入門)が終了してしまった。crontabとか使いかた分かったし、PERLもやるようになったし、午後こーだも配布開始したのに勧進のものがなくなってしまった。くやしい。でも、こんどはPCでテレビの録画ができるらしい。これはいちどやってみたいから今度挑戦しようか。 でも、いいキャプチャカードを買わないとならないし、動画だからマシンのスペックもかなり要求されるんじゃないだろうか?それがかなり恐かったりする。
2003年 4月28日(月) 02時14分57秒 JST   TITLE
SSIを試してみたくなったから、サーバにあげようとしたんだけど なんかおかしい。FTPに接続できないのだ。どうやらサーバがおかしいみたい。CGIもFTPもTELNETも許しているサーバなんてきっと調子がわるくなるんだろう。しかたないのでローカルで作業することにする。Apacheをあげて。でも、SSIはできないんだよなぁ。
2003年 4月28日(月) 01時39分01秒 JST   起動
PC(i486マシン,IBM PS/V Vision)であるmendeziは 現在、FDから立ち上げている。HDDのMBRにあるLILOは、LIで 止まってしまって立ち上がる気配はないし、難度インストールしても治らない。それで、FDにLILOをインストールしたのに、LILOがFDからもLIで止まって しまっている。むかしは、インストール時に作成したFDでブートしたんだけど今は動かない。 し勝たなく、いまはFDにGRUBをいれて、メニューから選択して ブートすることにしている。面倒だからtimeout=10で使っている。こんなのでいいのか?とおもうけどFDは無難な撰択だし、ほっといても立ち上がるからいいだろう。一時期、とにかくHDDをあげないことにはどうしようもなくなったときには、 ブートFDの茄かにあったカーネル(Vine1.1用)のカーネルを FDにじかに焼いて、rdevコマンドを使ってマウントさせるようにしてブートディスクを作った。いまおもえばよくやったもんだ。
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で作業をしなくなっていたのだ。
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時18分37秒   RAA
RAA ( Rubyアプリケーションアーカイブ ) http://raa.ruby-lang.org/
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時53分23秒   TITLE
viの使い方の詳しいリファレンス http://docs.sun.com/db/doc/816-3946/6ma6m5blb?l=ja&a=view
そういえばまともにviを使い出したのはSolaris8だったなぁ。Linuxで練習して、Solarisで実践。
ただSolarisに入っていたViはほんとに操作がからかったから、編集モードのとき削除にBSキーが
使えなかったり(消すときはコマンドモードに戻ってxを押す)、いろいろ大変だった。
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時38分39秒   TITLE
ruby-postgresのリファレンス。
http://www.postgresql.jp/interfaces/ruby/reference-ja.html
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
DATE TITLE
Tue Apr 15 00:50:25 2003 CygUtils Cygipcもここにある。
http://www.neuro.gatech.edu/users/cwilson/cygutils/
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上でも行ったらそうなったのだ。
DATE Sun Apr 13 20:23:24 2003 ソースコードを読む技術 http://i.loverruby.net/ja/misc/readingcode.html

(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で画面のリフレッシュをしてその場をしのいでいる。



スケジュール PERL RUBY
日記 携帯アクセス用ページ BBS