2001年10月13日 0:05:46
さらに、起動にやたらと時間がかかり、イベントログにはサービスの開始エラーが大量に・・・・。
今回、Remote Procedure Callというサービスを「無効」にしてしまったら、こんな大変な目にあってしまいました。
リモートとか書いてあるから閉じたのに(笑)。
依存するサービスの所を先にチェックすべきだね。
結局、レジストリ直接書き換えて、このサービスを有効にしたら無事戻りました。
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\
↑このあたりのどこか
なかなか便利なコマンドが紹介してある。結構、知らないのがいっぱいあった。
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/tipsindex.html
特に各ユーザーが最後にログインした日が分かるlastlogや
最近のログインの履歴が見れるlastや
メモリ使用状況が分かるvmstat
動いているプロセスが常に確認できるtop、
あと、パスワード入力中に間違えた時にctrl + Uでリセットできるなど・・・
で、vmstat使ったら、空きメモリって簡単に700KBぐらいになっちゃってたので、結構ショック(笑)
個人使用では無料だとのこと。
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/121viruschk.html
↓日本代理店らしい。パターンファイルも落とせる。
http://www.cseltd.co.jp/security/sav/products/
2001年10月11日 21:18:31
リダイレクトしたファイルに何も残っていないのが非常に気になるけど・・・
とりあえず、現行の形式も思い入れ(笑)があるので、ソース公開。
よーく見ていくと、まずいところがたくさんあるぞ(笑)。
恥をさらしているとも言える。
10/7の図も見るとわかりやすいかも。
BbsCtrlServlet.java
DbAccess.java
BbsViewBean.java
bbs.jsp
BbsArticleData.java
BbsWrite.java
BbsWriteAction.java
DbAccessにゆすけ氏のようにdoNextも入れておけば良かった・・・・
一カ所Statementをクローズし切れてない場所もあります(笑)
BbsCtrlServletなんかは、コメントに「ゲストブック表示クラス」とか書いてあるし(^^)
あちこちSystem.err.printlnしてあるのは、デバッグの名残。
getInitParameterでweb.xmlに指定した初期値を取り込む時にGenericServletでエラーが出ていた。
import宣言を見直した所エラーが出なくなった。
具体的には
import javax.servlet.*;
import javax.servlet.http.*;
というように*を使って指定していたところを、使う分だけ個別に
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
と指定したらエラーは出なくなった。
おそらく、javax.serlvetの方で先にGenericServletが見つかって、そっちのgetInitParameterを呼び出したのではないだろうか?
むやみにパッケージ指定に*を使うなというのは良く聞くが、はじめて今日実感。
2001年10月11日 0:11:44
今までは直接ResultSetをJSPからビーン経由で操っていたが、この方法だとStatementやResultSetをクローズするタイミングが難しい。(Beanが消滅する時に実行されるメソッドとかあるんかな?)
結局、サーバーマシンのメモリが少ないので躊躇していた、VectorやHashtableを使うことに。
ただ、レコードセットすべてをこれらに入れると、やはり後々Out Of Memoryとか出てきそうなので、表示する何件か分だけ取り込むようにした。
構成が全然変わってしまったので、まだまとまってない感じがするが、コンパイルがとりあえず通る状態まではなった。
次回はちゃんと動くかの確認だ。
正しくインデックス更新されています。結局最適化のgcnmzはスクリプトを分けてmknmzの一時間後に実行されるようにしました。/etc/crontabに一行追加しました。
2001年10月10日 1:39:21
namazuのインデックスを最適化するgcnmzをコメントアウトしたら、ちゃんとインデックス更新されました。
やっぱり同時に走っちゃってたのかな?
bashスクリプトで、なんか指定があるっぽいが、手持ちの本には情報無し。
誰か教えて(笑)。
2001年10月9日 1:00:56
作成というか、本のそのままパクリ(^^)
本当は丸ごとこの本の物で差し替えようと思っていたが、それよりも今のDBにアクセスを担当しているDbAccessクラスの接続部分だけをこのDBConnectionHandlerで管理させることにする。
DBConnectionHandlerクラスはSingletonパターンで作ってあり、インスタンスはサーバー上に一つしか出来ない。
サーブレットからDBConnectio~のgetInstanceでインスタンスを作成し、既にある場合は新たに生成しない。
そのインスタンスへの参照をDbAccess2クラスにセット。DBConnection~は一つのインスタンスしか作らないので、DbAcess2のインスタンスが複数出来ても、すべて同じインスタンスを参照する形になる。
DbAcess2はまずデータベースへのコネクションを取得する。取得にはセットされたDBConnection~のインスタンスのメソッドgetConnectionを使う。
本にはDBConnectionHandlerはコネクションが使用されていると、他のスレッドが何も出来ないので・・・といった説明があるが、これはnullを返しているだけで、待ってもいない様子。
コネクションプールを行うバージョンもその本に載っているが、これはgetConnectionで空きがなければ、再度自分自身のメソッド(getConnection)を実行して、コネクションが取得できるまで繰り返している。
残っている修正部分としては
どうも、最後のインデックス書き出しで失敗している模様。
で、ログを出力するようにしてみたので、時間を見てみると、インデックス作成と最適化が同時刻に走っている。
バックグラウンドで動作する処理を外したのに。
試しに、最適化はさせないで明日の結果を見てみる。
2001年10月7日 23:22:02
この前インデックスが壊れたのは、たぶんmknmzとgcnmzが同時に動いちゃったため。
なんで、同時に動いたかというと、
mknamazu ......&
というようにバックグラウンドで動かしちゃったため(笑)
ジオシティーから自前サーバーに持ってきたTipsコーナーだが、量が増えてきたので更新が面倒。
そこで、Tipsページを自動構築してくれるツールを作ろうかと考え中。
データを用意するとそれから、HTMLとその間のリンクを作ってくれるというイメージ。
できれば、XML形式で階層構造を持たせようかと思う。
DBでやった方が早いとは思うけど、わざわざDB作るほどでもないだろうし、入力の画面も作らないといけなくなる。
XMLの勉強も兼ねられるので、一応これで行く予定。
もちろん、Javaで。いつかかれるかわからないけど・・・。
わけが分からなくなっていたので、図に書いてみた。
BbsArticleというあまり意味のないクラスを作っていたのが、混乱の原因かも。
BbsViewBeanにやらせて良い内容だ。ただ、他でも同じ内容を使い回しするなら意味はある。
とりあえず、今は使わない気がするけど・・・(Cの構造体みたいな使い方だね)
この仕組みだと、サーブレットはリクエストごとにスレッドを生成して処理するので、DbAccessインスタンスは複数出来て、コネクションも複数存在することになる。
2001年10月6日 0:05:44
ここにまた違うやり方が書いてある。
http://www.atmarkit.co.jp/flinux/special/namazu/namazu.html#g
set PERL_BADLANG=0
export PERL_BADLANG
ってのは初めて見たぞ。
2001年10月4日 22:34:08
地方専用の掲示板有り。地元局の情報が集めやすくて、これは嬉しい(^ ^)
http://www.dailylife-online.com/net/index.html
情報量が多い。ISDNから切り替える人向けの情報もあり
http://village.infoweb.ne.jp/~fwnz2242/
こんな風につづけて書けばいいんだな。今日試して初めて知った(笑)
try{ ... int current = Integer.valueOf(index).intValue(); ... }catch(NumberFormatException e) { res.setContentType("text/html;charset=EUC_JP"); PrintWriter out = res.getWriter(); out.println("不正なインデックス番号が与えられています<BR>"); out.println(e); }catch(Exception e) { res.setContentType("text/html;charset=EUC_JP"); PrintWriter out = res.getWriter(); out.println(e); }
Exceptionの種類ごとに分けて、書いておけば起きた例外ごとに処理を変えられる。
これは、BBSの引数indexに数字以外が与えられた時の処理とその他の例外を分けて処理している。
ちなみに後のExceptionを前に持ってくると、Exceptionがエラーは全部拾ってしまってNumberFor....の方が処理されないのでコンパイルエラーが出る。
しかし、このページは俺の基本がなってない部分をさらけ出しているだけのような(汗)。
普通は、一時でもこんな状態でWebにあげちゃいけません(笑)
値チェックぐらいはしとかないと・・・
以前の予定プラス!!
EZWebは記述が違うだけで、普通のWebサーバーで公開できるらしい。
WAPサーバーがいると思ってた(^^)。これはAUがやってくれるらしいね。
Webサーバー→WAPサーバー→携帯端末の流れ。
WAPと携帯端末の間はバイナリデータがやりとりされるのが、i-modeとは大きな違いだね。
(逆に言えば、WebサーバーのHDMLをバイナリにするのがWAPサーバーの役目)
2001年10月3日 0:10:38
今、DBとのコネクションをこのSingletonパターンを使って、無尽蔵にコネクションを貼らないようにしようとしている。
http://www.tetras.co.jp/yada/j_java_singleton_r.htm
↑この例はわかったけど、応用利かせて使いこなせるかは不明(笑)
いずれもBBSの機能アップで、
・タグライブラリで「次の10件」を表現
・同じく、タグライブラリでMail,Homeのリンクボタンを作成
・投稿削除機能
このあたりを付けていこうかなと、いう感じの予定。
今日は、singletonの理解度を深める勉強。
Analogのエラー記録を記録するログファイルにはWeb閲覧者の権限を与えておかないといけない。
ちなみにそこに書き込めないとApacheのerrorログに記録されてしまう。
また、各種ファイルへのパスはフルパスで書き直した。
本当なら、ホームディレクトリがどこかで設定したりできるのだろうが、よく分からなかった。
LANGFILE /var/analog-5.03/lang/jp.lng DESCFILE /var/analog-5.03/lang/jpdesc.txt DOMAINSFILE /var/analog-5.03/lang/jpdom.tab
この中のjpdom.tabはWebから落としてきた(4.01用とか書いてあったけど、問題なし)
また、文字コードが合っていないと文字化けして出てくる。
あーんど、チャートを出したい場合は、Apacheに
Alias /analog/ /var/analog-5.03/
を追加して、Analogを入れたフォルダをアクセスできるようにする。
そしてanalog.cfgに
CHARTDIR /analog/images/
LOCALCHARTDIR /var/analog-5.03/images/
という感じで設定しておけば良い。
出ない時はだいたい、ディレクトリの指定ミスのはず。
エラーログを見て確認すべし。
2001年9月30日 18:58:48
Postgresql7.1用JDBCドライバ
ここにあるみたい。
ロジックはそのままで(もちろん、日本語部分は変更有り)なのに、next()メソッド実行するだけでnull
Exceptionは変だと思ったので、正当なドライバを入手して試してみるところ。
もちろん、ResultSetオブジェクトがnullにはなっているとかいう初歩的なことではない。とすると、ドライバの使い方が悪いのかドライバ自体が悪いとしか考えられない。
・・・→が、ドライバ変えても同じだった(笑)。ただ、なんでこんなにサイズが違うのか?
違うところといえば、7.1.3を新規にインストールして、旧バージョンとフォルダごとそう入れ替えしているので、Postgresqlの設定が足りていないのかもしれない。
Postgresqlは環境設定らしい環境設定は無かったと思うがもう一度、確認してみる。
だから、Webはまだ停止したままで(笑)
→でも、環境じゃなくて↓
どうも、仕様が変わってるみたい?
これはsqlを投げるとDBにアクセスして、ResultSetを返すメソッド↓
public ResultSet getRecord(String query) throws SQLException { Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query); //stmt.close(); return rs; }
三行目でコメントアウトしてますが、元々はコメントアウトはなくて、ここでStatementオブジェクトのclose()を実行してました。
このあたりのオブジェクトの基本がよく分かってないので、確信はもてませんでしたが、ResultSetはStatementから作っているので、先にcloseするのはまずいんじゃないかと思って、ここをコメントアウトすると無事動作。
しかし、今まではなんの問題なく動作。なんで、余計に意味不明。
いやいや、基本的なことがわかってないから、わけが分からないわけですな。
基本のAPIマニュアルでjava.sql.statement.closeを調べると・・・
- 自動的にクローズされるときに
Statement
オブジェクトのデータベースと JDBC リソースが解放されるのを待つのではなく、ただちにそれらを解放します。データベースのリソースを占有するのを避けるために、通常は、作業が終了したらすぐにリソースを解放するようにしてください。
- 注: Statement は、ガベージとして回収されるときは自動的にクローズされます。Statement がクローズされるとき、その現在の ResultSet が存在すれば、それもクローズされます。
あ、ResultSetもクローズするって書いてある(笑)。
まさにそれやっちゃってるじゃん。
ようは、元々のやり方がまずかった、今まで動いていたのが不思議だと言うことか(笑)
前のドライバはclose()してもすぐクローズされずに残っていたのか(そんなことがあるのか?)
でも、これってcloseしないまんまだから、あんまり良くないんだよね。
いつ、どこでcloseしよう・・・
上のcloseの件のおかげで、引数にindex=10とかやると、そこから表示されるようになりました。
(これも、同じメソッド使っていて、なぜかこちらではResultSetクローズされてたみたい)
でも、今の形じゃやっぱり、危ういので作り替えます。ただ、現在のに手を加える形で行きます。
ただ、別の問題が浮上。
なぜか、一番最新の書き込みが見えない(笑)
なんでよ。
→解決。
レコード読み込む時にいきなり、一行目に移動した後next()を実行していたので、二行目からしか出なくなってました。
これが作り方が適当だったんでかなり苦労しました。これ直したら、直るはずと思ったら、別のところが直ってなくて、ダメだったり。
たぶん、既に他人が見てもわからないソースです。これはいかん。
いきなり、コーディングはいかんです。UMLをマジで覚えようかな。
たとえば、homeなんかはURLを入れられていない場合は、表示自体を消さないといけない。
これは、表示する文字やグラフィックを表現するタグ(BBSのページを例にすると「<A
href='http://a-tak.com' target="_blank">home</A>」)自体をServlet側に埋め込めば、それは簡単だがもし、これをのちのちリンクを画像のボタンにしたいという場合は、Javaのソースをいじって、コンパイルして、FTPであげて、Tomcat再起動して・・・ととにかく手間。
それよりも子ノード付きのカスタムタグを作って、HTMLエディタで
<mail:link>mail</mail:link>
とか、
<mail:link><IMG src="/image/mail.gif" ></mail:link>
と言う風に書ける方が楽なはず。
→とりあえずはServletで対処しちゃいました。あとで改良だ。
次へと前へボタンのためのメソッドを追加したが、なぜかcan't find infomation
methodとかなんとか出て、機能しなかった。
getNextではなく、setNextが他のうまくいってるものはprivate宣言してあるので、そうしたところうまくいった。
JSPから使う、Beanってsetはprivateじゃないとだめなのだろうか?
今日は、これでおしまい。また今度見てみる。
2001年9月29日 21:15:45
なぜか、スクリプトをcronで実行させるようにしてても、実行されていない。
namazuのインデックスや時間の自動調整などだ。
スクリプトを直接、bashで実行すると起動するので、何が違うか考えたら、PATHのことが思い当たったので、スクリプトは全部フルパスで記述した。
そういや、前もこれでひっかかったような(笑)・・・。
と思って、他人が作ったスクリプトを見てみると、
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
・・・PATHを読み込んでる。汚ねー(笑)
なるほどその手があったか。
上のスクリプトの件だが、/binにもパスを通していないと、エラーが出る。
しかも、これはスクリプト中にフルパスで書いて対処できないので、やはりexportは入れないといけないようだ。
付属のドキュメントにだまされたというか、なんというか。
さんざんコンパイル出来なかったドライバのコンパイル方法。
事前にトップディレクトリで./configure --with-javaを実行しておかないといけない。
これをやった後で、初めて/src/interfaces/jdbcでmakeを実行するとコンパイル出来る。
ドライバだけコンパイルする時は、後の方だけやることしか説明してないので、気づかなかった。
エンコーディング関係のファイルだと思うが見つからないと出ている。
インストール方法が変わったかな?
以下のリンクでは引数与えてコンパイルしている。
http://www.atmarkit.co.jp/fjava/rensai/enhydra02/enhydra02_1.html
前のバージョンインストールした時も、マルチバイトの指定をしていた。
前のバージョンは書き方違ったから気づかなかった。
ちなみに、7.1.3のマルチバイトの設定
./configure --enable-multibyte=EUC_JP
これを指定してコンパイルしないと使えません。DBは作れても、消す時に最初にいったエラーが出る。
http://osb.sra.co.jp/PostgreSQL/7.1/jdbc-build.html
これもドキュメントにだまされた。リストアする際に
psql < backup(バックアップスクリプト)
としても、
「psql: FATAL 1: Database "(ユーザー名)" does not exist in the
system catalog.」
とか出てきて、バックアップは戻せない。
ここに違うやり方が書いてある。
http://www8.xdsl.ne.jp/~niwaken/tips/postgresupgrade.html
psql -d template1 -f 先程バックアップを取ったファイル名
スクリプトの中に確かに作ってもいないDB「template1」に、平気で接続しているので気になってはいたのだが、こういうこととはね・・・・。
これで、一発でOKだった。
make >& make.log &
たぶん、こんな感じで>&を入れるとエラーすらリダイレクトしてくれるそうだ。
おわったらちゃんとDoneと出てくるので分かる。
なぜか、コンパイルした新しいPostgresqlドライバで、next()やabsolute()[だっけ?)などのレコードセットのカーソル移動系の命令を使うとNullPointer...が出る。
getStringは可能なので、単純に接続できていないとかそういう問題ではない。
DBからはただしく、値を引っ張ってきている様子(よく見てないので勘違いかも)
ドライバの問題かなぁー。インターネットで明日調べてみる。
やっぱり、本格的に作りがまずいみたいだ。
今回は自分でリセットされるのを目の当たりにした。Tomcat再起動とかしているうちに突然って感じです。
カウントはまたアップさせたけどね(笑)
2001年9月27日 0:05:24
http://www.zdnet.co.jp/help/howto/linux/0007master/05/03.html
本当に、これで未解決IPというのが無くなるのだろうか?
http://www.kuis.kyoto-u.ac.jp/imel/tebiki/rvsettei/settei/node83.html
cron.dailyに入れておくと、時間に正しいサーバーになるかも。
http://osb.sra.co.jp/PostgreSQL/Manual/PostgreSQL-7.1-ja/jdbc.html
ここのとおりコンパイルするが、Makefileに指定してあるファイルが確実にない(笑)
バージョンも同じ物を落としてきて、解凍してるんですが・・・。
コンパイルはあきらめて、コンパイル済みの物をゲットするつもりが、今日はサイトが落ちてて繋がらない。
また明日。
2001年9月25日 23:12:27
HostnameLookupsをOnにしてもIPでしか記録されていなかったので、なぜだろうと思っていたら、httpd.confの下の方に「HostnameLookups
off」の表記が(笑)。
当たり前だけど、後に書いてあるやつの方が優先です。
たぶん、どのディストリービューションでも標準で記述してあるはずなので、注意。
loggerをスクリプトに入れれば良い。
logger -t A-tak -s "俺参上!!"
-tはタグ。-sはメッセージの内容。
Sep 25 23:39:11 myhost 9月 25 23:39:11 A-tak: 俺参上!!
という感じで出力される。
DOSと同じようにset ANT_HOME=/usr/localとは出来ない。
Linuxで環境変数にセットするにはexportを使う。
export ANT_HOME=/usr/local/ant
「=」の後はスペース無しにしないとエラーが出る。
英語のドキュメント見ても、どうもいまいちわからない。ドキュメントによって言ってることが違うみたいだし(笑)。
インターネットで日本語のページを探す
2001年9月23日 12:01:00
前回の最後で紹介してあるFilesを使った方法だが、あれだとうちのサイトはほとんど名前解決しなくなる。なぜならサーブレットがほとんどで、cgiやhtmlの拡張子の物が無いからだ。
HostnameLookups on <Files ~ "\.(gif|jpg)$"> HostnameLookups off </Files>
逆に、Offにする物だけチェックした。
・・・・でも、よく考えれば、画像もリクエスト回数にカウントされているならば、ログにIPとホスト名が混在してしまうので、結局全部DNSひかないとだめなんじゃ・・・
結構、有名なログ解析ツールらしい。
日本Analogの会 http://jp.analog.cx/
最新Linux Ver http://www.iddl.vt.edu/~jackie/analog/
RPM版の入れ方 http://jp.analog.cx/cmpllinux.html
httpd.confの
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent #CustomLog /var/log/httpd/access_log common #CustomLog /var/log/httpd/referer_log referer #CustomLog /var/log/httpd/agent_log agent CustomLog /var/log/httpd/access_log combined
このあたりを見てみる。
LogFormatの一番目が実はAnalogで読める形式。combinedという名前で設定されているので、CustomLogのcominedの行の#コメントを外す(通常はcommonだけのはず)
おそらく、httpd.confに
HostNameLookups On
とすれば、DNSを参照して名前を取得してくれるはず(まだ、未確認)。ただし、パフォーマンスは悪くなる様子。
また、/etc/desolve.confにDNS名を指定しないと名前は取得できない
あと、設定を変えたらhttpdの再起動を忘れずに。
http://www1.plala.or.jp/knambo/apa/advanced.html
こんなのも発見。
htmlやcgiだけDNSで名前解決させることが出来る。
ただ、ちょっと間違いがあって、FileではなくてFilesとしないと通らないので注意。
http://home7.highway.ne.jp/dayan/tips/unix/webserver.html
rpm -l パッケージ名 | more
とすれば良い。