プログラム メモ


2001年7月29日 23:28:52

[Java]掲示板の前に・・・

来場回数ランキングみたいなのでも付けようかなーと。「プライバシーの侵害だぁ」ということになりそうだったら、ユーザー情報変更の所にでも参加するかどうかのチェック作るけど、まあとりあえず全員参加と言うことですすめてみる(笑)。

[DB]はじめての複数テーブルの参照

DBなんてあんまり使ったこと無いので、複数のテーブルに参照かけてどうこうというのは初めて。
今回は、ユーザー情報を記録しているテーブルの固有のIDと訪問回数を記録しているテーブルの同じ意味を持つフィールドを結びつけて、一つの表を作る(結合というらしい [SQL入門 オーム社 平尾 隆行 著 p.62より])。
やり方は...

SELECT userdata.name, countdata.count FROM userdata, countdata
       WHERE userdata.userid = countdata.userid

結果は

userdata.name countdata.count
A-tak 777
えーいたく 600
いえーいたっく 400

こんな感じで列名を指定する時に「.」をつけて前にテーブル名を書く。
そして、where句に「=」で二つのテーブルで一致する項目をつなぐ。
今回はuserdataテーブルにユーザー情報としてユーザー固有の番号userid入れておき、countdataテーブルには訪問回数countとuserdataテーブル内の、どのユーザーかを示すためにuserid欄を作った。もちろん、ユーザー作成時に、userdataテーブルのuserid欄と同じ値がここにも入る。

作業予定

なんか掲示板の方が簡単にできないか?(笑)

[DB]psqlでのテーブルの新規作成

psql データベース名
を実行。

create table テーブル名(フィールド名 型, フィールド名 型,・・・);
でテーブルを作成する。
たとえば、
create table test(id serial primary key, name text);
など。
primary keyは主キーの設定。serialはAccessでいうオートナンバー型のこと。serialを使うと番号を管理するテーブルが勝手にできあがる。


2001年7月29日 11:30:00

[通信]七階層?

ネットワークを流れる信号はこんな感じ。たぶん(あやしい)↓

MACアドレス IPアドレス TCP/IP、NetBueiなどのヘッダ データ(SMTP、FTPなどのやりとりも)

LANカード、HUBはMACアドレスまでを扱う機械。IPなんぞはお構いなし。
ルーター、スイッチングハブ(一部)、ブリッジはIPまで認識して処理できる。だから、IPによってルーティングなど可能。でも、IPXだろうとNetBueiだろうとお構いなし(?)
SMTPやらHTTPなどはTCP/IP上で扱われるデータのやりとりの方式なので、さらにもう一個上のレベルのプロトコルになる。
インターネットで流せるのはIPの決まりにのっとったもの。だから、実はTCP/IPに限ることではない。IP上に成り立つプロトコル作って、流しても何の問題もない。

[通信]TCP/IPって?

IPベースのプロトコル。IPで定義されている機能は基本的なものなので、いくつか機能アップさせている。
大きく、到達保証と順序保証(?名称はこういう呼ばれ方をしているか不明)。
TCP/IPは相手にちゃんと届いたかどうかが確認できる。簡単に言うと相手に何かデータを送ると、相手が届きましたよーという返事を返してくる(synとack)。
また、順序保証とは送ったデータが複数のパケット(直訳すると小包。データはパケットという単位にまとめられて受け渡しされる)に分かれて相手についた時に、ちゃんと正しい順序に並び替えることが出来る仕組み。ネット上はどこを通って相手に着いても良いので、その時の回線状況によって、それぞれのパケットがいろんな道を通って相手に送られ、送った順番にパケットが届かない時がある。それを保証する仕組み。パケットに番号が振られていて、それを受け取り側は綺麗に並べるような処理をするらしい。

[通信]ソケット通信の手順とADSLのチューニング

詳しいサイトはいっぱいあるので、詳しくはかかないけど、Windowsの場合、クライアントでは
WSAStartup --> socket --> connect --> recv や send --> shutdown --> closesocket --> cleanup
という手順で関数を呼び出す。
ちなみにサーバーは
WSAStartup --> socket --> bind --> listen --> accept --> recv や send --> shutdown --> closesocket -->cleanup(だったかな?)

これらの一つ一つのやりとりでsynとそれに応答するackが飛び交う(TCP/IPって?の所の到達保証のため)
このsynとackはパケットごとに送っている。もし、ackが相手から帰ってこないと、送り側は再度そのパケットを送り直す。
だから、パケットのサイズを小さくすると、それだけ頻繁にsynとackが飛び交い、通信するデータが増えるので遅くなるが、もし回線品質が悪くパケットが相手に届かず、ackが帰ってこないことが多くても、送り直す量は小さいパケットなので、スピードは遅いが相手と確実に通信を行うことが出来る。
パケットのサイズが大きい、たとえば(できるかどうかしらないけど)一メガを一つのパケットとすると、効率は良いが相手に届かなければ、再度一メガ送り直すことになってしまう。下手すれば通信できないかもしれない。

また、ちょっと話は変わるが、相手の(ルーターの?)設定次第では、大きなパケットは受付られない時がある。その時はそのルーターはICMP(?)というpingなんぞで使われるプロトコルで、送信者にパケットサイズを小さくしてくれという要求を流す。すると、送信者はパケットサイズを小さくして送り直すという動きになる。
だから、送るパケットサイズを大きくしすぎると、相手(経路のルーターも?)の設定次第では送り直しが発生するし、ルーターの設定でICMPプロトコルをシャットアウトしていた日には、送信不可なんてこともあるかもしれない

最近、ADSLを早くするためにLANカードのチューニングをするのがはやってるが、それは上のことが関わってくる。通信品質の善し悪しや一般的に相手がどれぐらいのパケットまでを受け取れるかを考慮して、最大限のパケットサイズにすることで、通信が早くなる。

[通信]SMTPとかFTPなどのプロトコルはどこで出てくるのさ?

SMTPやFTPやHTTPやRealAudioなど様々なインターネット上のプロトコルは、上の手順で言うrecvやsendの時に、それぞれの決まりにそってどんなデータを流すかが違うというだけ。それぞれのプロトコルによって、ASCII形式で流すとか、最初にこんな文字列を送って、次にユーザー名を送るとか・・・。ソケット通信が出来れば、送るデータについて分かれば、インターネットのどんなプロトコルを扱うプログラムも書ける・・・と思う(笑)。俺はまず簡単そうなSMTPから(^^)

[VB]Windows APIの使う時の注意

Windows APIに引数を渡す時、VBの場合は次のようになる

数値(integer,longなど)はByval(値渡しで)
文字列(String)はByvalで
※文字列は一般的にはポインタを渡さないといけないのだが、VBの場合Byvalで文字列の場合はポインタを渡す。
ユーザー定義型(Cで言う構造体)はByref(参照渡し。省略可)で渡す。

文字列がByvalなのに注意。


2001年7月19日 1:43:14

[Java]パッケージ名変更

また、パッケージ名を変更した。
パッケージ名はドメイン名を逆さにしてというのが、一般的だけど俺のドメイン名には「-」が入っていたので、net.dynodns.atakという名前にしていた。
しかし、ハイフンはアンダーバーで表すことになるらしい。で、com.a_takに変えました。
はっきり言って面倒くさいです。特に何が良くなるわけでもないし。

もし動いていないところがあれば連絡ください(笑)
最近、疲れててこれぐらいしか、作業しきれん(T.T)
ソケット通信少しやったら、また掲示板作成に移る予定。


2001年7月9日 23:53:14

[JSP]ゲストブックのJSP

昨日のとセットでゲストブックは一目瞭然、俺が(笑)。これで会社から調べたくなってもいつでもOKだ。
使いたい人は前日のソースとセットで勝手にお使いください。
甘いところはご指摘をよろしく(笑)。

guestbook.jspのソース(一部、略)

[JSP]JSPでエラーが発生した時にエラーページへ飛ぶ

@pageタグに
errorPage="/message/error.jsp"
と入れる。こんな感じ
<%@ page contentType="text/html; charset=UTF-8" errorPage="/message/error.jsp" %>
ドキュメントルートの下のmessageフォルダ内のerror.jspを表示するようにしている

[JSP]エラーページでエラーの内容を出したい

上の方法で飛んだページでエラーの内容は暗黙的に定義されているexceptionという変数に入っている。これを表示させればよい。ただし、また@pageタグに
isErrorPage="true"
を追加しておく必要がある。そして、拡張子はもちろんjspにしておく。


2001年7月9日 0:29:24

[Java,DB]ゲストブック完成(SQLで並び替え)

ゲストブックに必要そうな機能は付けた。
新しい物が一番上に来るようにして、更新日も出してみた。
HTML出力時の問題はUserInfoに組み込み解決。JSPに表示する時に使うクラスとして、UserInfoを継承して作ったGuestBookUserというクラスを作り、一言と更新日を記録するメンバーを追加した。
なぜ、UserInfoクラスに手を加えなかったかというと、UserInfoクラスは元々セッションが続く間ユーザ情報を保持するためにある物なので、これにデータベースとのやりとりに使う情報を入れたくなかったからだ(ややこしい、メモリの無駄)。

GuestBookViewクラスでGuestBookUserクラスのインスタンスを作り、そこに一レコードごとの情報を記録した。UserInfoから継承しているのでHTMLへの最適化は行われている。

GuestBookViewクラス
HTML最適化処理付きUserInfoクラス
GuestBookUserクラス


2001年7月8日 2:14:10

ゲストブックほぼ完成

結局、タグライブラリを使うまでもないことが判明。
DBにアクセスするBeanを作り、getPropertyタグをJSPに埋め込むことで対応した。

改行への対応

ただ、ここでゲストブックが改行に対応できていないことが判明。改行コードを<BR>に置き換える変換ロジックを一行加えただけで、対応完了、としたいところだが・・・

今は最初のDBに登録する際にDBに登録する際に不適切な文字列('とか")の変換とHTMLへ出す時に不適切な文字(<とか>)の変換を行っている。なぜかという面倒だから(^^)。登録は一回だけだけど、表示はあちこちでやるから、それぞれに変換ロジックを入れないといけない。
ただ、DBに登録するのデータはHTMLへ出す時に必要な変換は入れない方がいいような気もする。
もし、Webではなく他のシステムに移行する場合(ゲストブックは絶対移行はしないけどね(笑))HTMLに特化したデータを入れたら、非常に問題だ。

明日はStringReplaceクラス(文字列置き換えのクラス)から継承して、新たにHtmlOutCnvクラスを作って、そちらにHTML出力に必要な変換をさせるようにする

ゲストブックの表示順

そういえば、古いものが一番上に来てる。だいたい、こういうのは新しい順なので、並び替えしないといけない。
昇順、降順のSQL文を忘れてしまったので、これも明日調べてやる。


2001年7月6日 0:42:56

PostgreSQLの停止

postmaster -sとすれば良い。実行できるのはpostgresqlの特権ユーザーのみ。

サーブレットのインスタンス変数は全リクエストで共通

サーブレットはリクエストごとにスレッドを作成する。スレッド間ではインスタンス変数は同一の物を参照する。ビーンについては?


2001年7月3日 21:15:24

アプレットはどこから始まるのか?

init()、start()、paint()という特殊なメソッドがキー。
init()はアプレットをロードする時に実行される。start()はアプレットの実行時に起動する。他のページから戻ってきた時はここから実行される。pain()はブラウザが他のウィンドウに隠れた状態から、正面に出てきたときなどに実行される。

だから、init() ->start() ->paint()という順序で初めは実行される。start()が実行された場合は、paint()も実行される。


2001年6月29日 0:40:45(2002/10/20修正)

メソッドが終了するのはどのタイミング(RequestDispatcherでは終了しない)

おそらく、そのメソッドの最後の「}」に到達するか、returnを見つけた時のみ。
RequestDispatcherで他のサーブレットやJSPを表示できるが、プログラムの処理自体は元々のメソッドの処理が続いてしまう。
「ページが移ったから、このメソッドの処理は終わり」と思っていると、本当はその先の処理も実行されていて、思わぬ結果になることも・・・


2001年6月28日 0:23:16

JSPでセッション変数やsetAttributeしたオブジェクトを取得する

以下のように書く

<jsp:useBean id="userinfo" scope="session" class="net.dynodns.atak.login.UserInfo" />

idはsetAttributeの時に設定した名前を入れる?(ちょっと自信なし)
classはオブジェクトのクラス名を指定する。
scopeに指定した範囲でclassに指定したオブジェクトがあれば、取得するし無い場合は作成する。
scopeはセッション変数ならばsessionにして、setAttributeした物はrequestにしておけばよい。他にもpageなどがある。

JSPでビーンの値を取得

上の方法で取得したオブジェクトにgetやsetメソッドがあれば、以下のタグでビーンのプロパティーを取得できる

<jsp:getProperty name="userinfo" property="pass" />

nameがuseBeanで指定したidで、propertyが値を取得したいgetXXXというメソッドの名前。XXXに当たる部分を書く。

"<"や">"対策

やばいなーと思いながらも、放置してたら忘れてて、今日思い出したので、さっき対処しました(笑)
フォームで入力する際に、HTMLタグの始まりである"<"を入れておくと、それが表示される際に不都合が起きるし、下手すれば、変なJava Scriptsを実行されてしまうので、「&lg;」(だったっけ?)などに置き換えました。

始めての継承

いまいち継承のメリットを享受していない気がするが、自作の文字列置き換えクラスをスーパークラスとして、サブクラスに先ほどの"<"やシングルクォーテーションなど、そのまま入れてはまずい物を変換するクラスを作成しました。
まあ、こうしておけば、スーパークラスはあとあと他の置き換え処理用に使えるのでいいかなーと・・・
メソッドをオーバーライドしたりしてるわけではないので、文字置換クラスを継承ではなく、普通にそのクラスのメソッドを呼び出してもいいような気はしたけどね・・・
ビーンからビーンを呼び出しているだけだと、ただの関数呼出しみたいだったので、あえて継承してみました。
(今、思えばやっぱりこうした方がの方がすっきりして良いかも)

継承の時に注意するスコープ

protected そのクラスとサブクラスから見える
private そのクラス内でしか見えない
public どのクラスからも見える


2001年6月25日 23:52:45

なんとコネクション切断し忘れ!

なんか、昨日プログラムしてておかしい気はしていたが、DBへの接続を切断するのを完全に忘れていた(おい!)。
DbAccessクラスに切断するメソッドも用意せねばいかん(笑)→用意終了!!

データベースへのアクセスが早くなった?!

気のせいかもしれないが、ちゃんとDBから切断するようになったら、ページが表示されるまでが早くなった気がする。
明日、会社でちょっと見てみよー・・・


2001年6月24日 23:22:18

サーブレットからJSPへ直接値を渡す(セッションを使わない)

まず、サーブレットで

req.setAttribute("word", mes);
※reqはHTTPリクエスト

とする。
これは、wordという名前でオブジェクトmesをセットしている。
リクエストにくっつけて処理するのはセッションと同じだが、HTTPプロトコルとは関係ないところで実現されている機能で、セッションを使わずに接続毎のデータを管理している。
mesはMessageという独自のクラスで内容は以下のようになっている。

//
package net.dynodns.atak.web;
public class Message {
        String mes = null;

    public Message() {
    }

        public void setMessage(String mes) {
                this.mes = mes;
        }

        public String getMessage() {
                return mes;
        }
}
//

このクラスのsetMessage()でJSPに渡したいデータをセットして、先ほどの方法でJSPに渡す用意をした
受け取るJSPの方では

<% Message word = (Message)request.getAttribute("word"); %>

でMessageオブジェクトを受け取り
<%=word.getMessage() %>メソッドを呼出し表示させている。

暗黙的オブジェクト

上の項目に関連するが、JSPにはわざわざ定義しなくても、既に暗黙的に定義されていて使用できるオブジェクトがある。
requestやresponse、sessionなどがそうで、詳しくは「Javaサーバーサイドプログラミング(原田洋子著)」のP.272に一覧が掲載されている。

JBuilderでクラスがコンパイルされていない

コンパイルを実行させてもclassファイルができあがらないのは、プロジェクトに加えていないから。左の画面でjavaファイルを追加しておく必要がある


2001年6月23日 18:43:17

UserInfoのNoをString型に変更

使い勝手的にString型が良いので、システムが大きくなる前に変更した。だいたいユーザーごとにDBで振られるシーケンシャルな番号で足し算引き算、比較はしないのでこれで良いはず。
UserInfoクラスとUserDataGetクラスの修正。UserInfoクラスのNo変数は、文字列でも数値型でも変換してセットできるようにした。取り出す時は文字列になる。

RequestDispacherで飛んだjspページが文字化けする

htmlではShift_JISで指定しているのに、表示されている文字コードがどうもEUC-JPのようで、エンコードを切り替えると正しく表示される場合の話。
RequestDispacherがあるサーブレットでprintlnでhtml出力していないだろうか?
その時に指定してある文字コードが飛び先のエンコードと違う場合は、エンコードがずれてしまう。
飛び先のjspページがShift_JISならば、サーブレットないで出力するメッセージもShift_JISにしておかないといけない。

JSPに渡すためにsetAttributeしたはずなのに、中身がnull

StringをsetAttributeして、JSPで受け取ってみたが、なぜかnull。
これでは駄目で↓の方法でやる

JSPにデータを渡す時はオブジェクト

JSPで受け取る際にクラス名を指定したりしているので、クラスにしておかないといけない様子。


2001年6月23日 0:40:29

SJISに変更

ほぼ全ページのエンコーディングをShiftJISに変えた。インフォシークがjpドメイン以外のEUCを受け付けないからだ。

JISAutoDetectをLangChangeに追加

受け取るエンコードが分からなくても、ちゃんとUnicodeに変換してくれるはず。メソッド名はgetUnicodeString()


2001年6月19日 21:46:51

今日はどうも気が乗らない

Javaはお休み。明日はまず、ユーザー情報変更のページで「一言」が表示されていないのと、Updateのロジックを書く。


2001年6月18日 21:54:18

トップページを見栄え良くした

テーブルをほそ~くしてラインなど入れてみた。写真はハウステンボスのある店の看板。

ログアウトの時のエラーの原因発見!!

と思ったけど、違うかも・・・
実は会社でもhtmlの方でデータを送る時にGETを指定するとうまくいった。もしかして、doPostが用意されていないかと思ったけど、ソースにはちゃんとdoPostが入れてあって、そこからdoGetに飛ぶようにしてあるので問題ないようだが?
もしかして、その後のdoGetに書いてあるクッキーの処理がまずいのか?
(確かにクッキーはserviceメソッドから受け取った物を渡す必要があると書いてある)

doGet, doPost, serviceメソッドって何?

それぞれブラウザからのリクエストの種類に対応するメソッドがこれら。doGetはブラウザからGETでそのサーブレットにリクエストがあった時に、処理が始まるメソッド。doPostは同じようにPOSTを受け取った時に動き出す。

serviceは何かというGETやPOSTなどの一般的なHTTPリクエストに対応してくれるメソッドで、サーブレットAPIリファレンスによると、「doXXXXというメソッドはこのクラスの中に定義されている」と書いてあるので、実はservice()メソッドだけ使えば混乱しなくて済むのであった。

ほかのdoGetやdoPost(他にもいろいろ)はそのリクエストが来た時のみの処理をする時に使えば良いらしい。ちなみに、service()メソッドを実装した場合は、doGetやdoPostは使えないらしい(でも、super.initすれば確か使えるんだったかな?)

Java Beanをサーバーにアップした時に再起動しなくて良い方法

Java Beanオブジェクトをセッションに入れたりしてる場合(?)、それをサーバーにアップするとサーバーを再起動しない限りエラーが出て動かない場合がある。

これは、Java BeanをWEB-INF/classesの中に入れているからだそうだ。Java Beanはjarにしてlibの中に入れておけばいいらしい。とりあえず、classesの中に入れておくと、コンパイルされた時にオートリロードの対象になってしまうのが原因のようだ。

でもね~、実際の所毎回Beanをjarにするのは面倒だ。結局の所、TomcatとApatchを再起動するのが一番早いようだ。

ユーザー情報変更の時にURLが表示されない、と思ったら・・・

調べてみたら、UserInfoクラスに書き間違いがありました。setUrlメソッドを実行するとユーザーIDの変数に入れていたのです。そりゃ出ないはずだ。
起動時のクッキーチェックサーブレットにテストでURLに初期値を入れるとユーザーID欄に表示されていたので、それで分かった。

ユーザー情報変更ページの作成中

とりあえず、フォームに現在のユーザー情報を表示するところまでは出来た。
あとは、変更したもので、DBをアップデートするロジックを入れる必要がある。


2001年6月17日 23:04:22

なぜにJavaプロセスがたくさん

ネットの情報によると、Linuxがスレッドをプロセスのように扱うからだそう。メモリは共有しているので、あまり気にしなくて良いらしい。

Tomcatのログをファイルに出力する

普段は画面(標準出力)にエラーなどの情報を出しているが、ログに取りたい場合は、confの中のserver.xmlでtc_logの"INFOMATION"の後に「path="logs/tomcat.log"」を追加する。
詳しくは以下に。

http://www.itboost.co.jp/jserv/jserv_01.php

Tomcatのユーザーガイド日本語訳

でも、一部だけのような・・・。

http://www.slayers.nu/~kumasaka/Gyoumu/tomcat-ugj.html


2001年6月14日 22:53:43

エラー回避できず

SELECT文実行時のエラーはまだ未解決。
・レコードセット変数をメソッド内で定義してみたが×
・SQL文のuidを変数ではなく、直接指定しても同じ

初歩的なミスDBに接続し忘れ!!

エラーの原因解明。DBに接続するのを忘れてた。取ってきたソースがちょうど接続部分のみ離れた場所にあったので見落としていた。
一応、これでログイン時にUserInfoオブジェクトにDBからのデータを記録することが出来た。
ロジックを綺麗にクラス化したので、ソースがすっきりしたのも良い。

オリジナルの例外処理

今回の物もDBのアクセスに失敗したら、ブラウザにExceptionをわかりやすく出したいが、そういうのはExceptionクラスのサブクラスを定義すれば出来るらしい。これで、DBに接続前にレコードを取得しようとした時に、間違いに気づくようなエラーが出せないだろうか?

プロジェクトから消えた?!

今、JBuilderに登録してあるはずのjavaファイルが二ついきなり出てこなくなった。実ファイルはあったから良かったけど・・・大丈夫か?


2001年6月14日 0:24:20

メソッドが決まればクラス設計は決まる

会社にあるJava Worldのオブジェクト指向設計?か何かの記事に、クラスの設計はメソッドやクラス変数が決まれば、終わりというように書いてあった。
メソッドの定義部分のみ(ロジックは書かない)から始めて行くと設計しやすい。

SELECT文実行時になぜかNullPointerException

/**
 *ユーザー検索開始
 *今のところ空白のユーザーIDやパスワードも許容している
 *結果はgetSearchResultで取得する
 * @return  void
 */
        public void searchUser() throws SQLException {
                    //SQL文用に特殊文字変換
                        StringReplace sr = new StringReplace();
                        String uid = sr.convInput(this.uid);
                        String pass = sr.convInput(this.pass);
                        //ユーザーをDBから検索
                        DbAccess db = new DbAccess();
                        String query;
                        query = "select * from userdata where uid=\'"+uid+"\'";
                        rs = db.getRecord(query);   //ここでNullPointerException発生!!!
・・・
・・・
        }

rsはクラス変数としてRecordset型で定義済み<--これがまずい?


2001年6月11日 23:02:00

お気に入りのアイコンを作ってみた

このサイトをお気に入りに入れた時にアイコンが表示されるようにした。このサイトのどこかをお気に入りに入れて、ブラウザを起動し直すと、お気に入りにアイコンが表示されているはず。
10分で作ったやつなので、適当だけど・・・。


2001年6月10日 16:48:27

NullPointerExceptionとは?

調べてみたところ、空のオブジェクトに対してアクセスを行うとこのエラーが出るそうだ。
今回はフォームからもらったチェックボックスの値(文字列でonというように入る)をユニコードに変換し忘れていた。

チェックボックスの値が取得できない?

これも手違いで、htmlの方にはcookieOnという名前にしていたが、受け取り側はcookieonで受け取っていたので、値が何も入ってきていなかった。htmlの大文字、小文字にも注意しておく。

これってハッキングのルート?

/scripts/..%c0%af../winnt/system32/cmd.exe?/c+dir
これをwebサーバーに投げているヤツがいるが、NTサーバーのセキュリティーホールか何かかなぁ。

JBuilderで長い変数名を簡単に入力する

JBuilderで長い変数名を打つ場合、最初の数文字を入力してctrl + spaceを押すと良い。

Tomcatのバージョンも関係あり?

例のInternal Server Errorについて、Tomcatのアップデートを考えたが、バージョンは3.2.1なので、既に現在の最新バージョンだった。

会社からアクセスした時のInternal Server Errorの内容

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, a-tak@geocities.co.jp and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

--------------------------------------------------------------------------------

Apache/1.3.20 Server at a-tak.com Port 80

会社からアクセスした時のCookieの内容はこれ

クッキーの名前がservlet(servlet/ではない)
インターネットアドレスが
Cookie:○○○@a-tak.com/servlet
有効期限
2069/0625

uid
test
a-tak.com/servlet/
0
2xxxx02752
344xxx88
1305xxxx52
29xxxx88
*
pass
111
a-tak.com/servlet/
0
21xxxx2752
344xxx88
xxx56xxxx52
29xxxx88
*

会社からアクセスした時とクッキーの名前が違う

会社からアクセスすると「servlet」になっているが、家だと「servlet/」になっている。なぜ?

mod_jk.logでheader lineエラー

ajp12のエラーが出ているようだが、これの影響?

ユーザー検索、セッションなどの仕様変更

今は、Loginサーブレットで、ユーザーIDの検索、パスワードのチェック、そしてIDとパスワードをセッション変数への記録させているが、今後UserInfoオブジェクトには名前やメールアドレスの他のデータも入れておく必要があるので、動きを変更する。

UserInfoにユーザーナンバーの情報を入れて、UserInfoオブジェクトを戻り値として返すようにする。受け取り側もそのままUserInfoオブジェクトをセッションにバインドすればいいので、楽だ。
最初は取得した情報を配列に記憶してなんてことを考えていたが、UserInfoオブジェクトというものが既にあるので、それを活用することにした。
ユーザーナンバーを検索する部分もユーザー名やパスワードを投げることで検索してくれるクラスがあるといいかもしれない。というよりも、わざわざユーザーナンバーを指定して、UserInfoオブジェクトを返すなんてことをせずに、常にユーザー認証も自動でやってくれた方がいいような気もするが、ユーザーの検索だけ行う場合もあるので、クラスは分けて置いた方がいいような気もする。
それか、これらの機能をもった一つのクラスを作るのもいいかもしれない。プロパティーにユーザーIDとパスワードをセットし、検索メソッドで検索し、見つかったのかどうか、パスワードが間違っているなどの状況がどこかのプロパティーにセットされる。検索がうまくいっているのが確認できたら、UserInfoを返すメソッドを実行すれば良い。
また、これらの一連の動作を行ってくれるメソッドも別にあるといいかもしれない。

UserDataGet.class
public setUid(); //ユーザーIDをセットするプロパティー
public setPass();  //パスワードをセットするプロパティー
public searchUser();  //セットしたIDとパスワードで検索する
public getSearchResult();
//検索した結果を返す(文字列)
//found=見つかった nouser=ユーザーが見つからない nopass=パスワードが間違っている
public getUserInfo();  //探したユーザーの情報をUserInfo型で返す
public searchGetUserInfo();
//searchUserとgetUserInfoを行う。失敗した場合はnullで返す
//失敗原因を知りたい場合は、getSearchResultをすれば分かる


2001年6月7日 22:25:59

会社からアクセスするとInternal Server Error?

なぜか会社からアクセスして、ログアウトボタンを押すとこのエラーが出る。家からアクセスしても問題ないのに。なぜ?!


2001年6月7日 1:33:52

ログインシステム一部完成

ログインのボタンの動作一部完成。
ユーザーIDが間違っていた時とパスワードが間違っていた時の処理は完成。認証をパスした時の動作は未完(今は真っ白のページが出るだけ)。
ユーザー登録、ログイン、ログアウトを実際に押して動作しているのが確認できる状態。

あとは、認証がうまくいった時の処理(クッキー登録、セッション記録など)を付け加え、最初のトップページでのクッキーチェックの仕組みなどを変更すれば完成。


2001年6月5日 23:57:33

ログアウト部分完成

ちょい最近体調不良などでさぼり気味だったが、ログアウトがうまく動いた。
今、トップページ表示時にクッキーからIDとパスワードを読み込み、セッション変数に記録すると同時に、ログインのフォームにもIDとパスワードを自動で入るようにしていたが、ログアウトを押した時に、
・クッキーの削除 ・セッションの破棄 を行うようにした。

次はログインを作る。ユーザーIDとパスワードを入れさせて、ログインボタンを押した時に、そのIDのユーザーをDBから探し、あればパスワードが合っているか確認して、セッション変数に情報を記録する。あわなければ、エラーのページにとばす。

現在のトップページのチェックも変えないといけない。クッキーから取得したデータでDBを検索し、合っていればセッションに情報を記録しないといけない。

これらが出来てから、ゲストブックの表示と掲示板を作る予定。


2001年6月3日 21:06:50

JBuilder4のシンボル検索のショートカット

alt + shift + H でそのクラスなどの定義部分にジャンプする。
ctrl + alt + カーソルの左でジャンプ元に戻る。
ただし、[ツール]-[エディタの設定]の"CodeInsight"の[キーの割り当て]で指定できる。
※キーマップの設定によっても変わる

JBuilder4で対応する括弧を探す

対応する括弧を秀丸のように表示することは出来ないようだが、対応するかっこ内のコードを選択状態にすることが出来る。
括弧の上で、ctrl + shift + [ を押すと良い。

その他JBuilderの便利そうな機能

ctrl + J でコードテンプレートを使ってコード入力を簡略化出来る。

JBuilderのヘルプは英語!?

日本語のAPIドキュメントは1.2までのようだ。だから英語なんだろう。試しに1.2の日本語マニュアルをjarにしてみたら、F1で検索できなくなってしまった。待つしか無い様子。

@todoタグ?!

javadocコメント(//* */に囲まれた部分)にこれを入れるとJBuilderの構造表示に出るらしいが、Proffesional版やEnterprise版だけでFoundation版には無い機能らしい。残念。

JBuilder4 foundationとForte for Java Comunity Edition使ってみた感じ

今まで、秀丸で作っていて、試しにIDEを使ってみた。
エディタ + JDKと開発環境を比べてみる。Forteはあまり触ってないので、ほぼJBuilderとの比較。

以下はJBuilderでしか確認していない

こんな感じ。自分はサーブレットの作成がメインになるので、ただコンパイルが楽なのと、一覧で見やすいというのがメリットだ。あと、ドットを打った後クラスを補完したり、クラス定義までジャンプするのは便利・・かなぁ。
自分で作っているソースなんでだいたい何がどこで定義されているかわかるんだけどね。Javaはファイル名=クラス名だし。
こういう環境は重いので、エディタで開発しているという人が多いが、自分のパソコンは結構武装してあるのでそこまでそれは感じない。
ただ、キーカスタマイズが出来ないのはショックだった。こういう制限が加えられていると、Foundation版の将来は暗いなーという気がする。
まあ、とりあえずエディタ代わりに使うという感じでしばらくJBuilderを使ってみるが、秀丸に戻りそうだなぁ

FTPでフォルダが作れない

権限がないのだが、権限はそのディレクトリでの権限を変更するという意味になるので、一つ上の親階層に移動して変更することになる。
たとえば、htmlフォルダの中に新たにフォルダを作れるようにするには、htmlフォルダの所有者などを変える。あたりまえではあるけど。


2001年6月2日 0:07:31

「インスタンス変数として参照しようとしました」エラー

「class net.dynodns.atak.login.UserInfo 内のメソッド getPass をインスタンス変数として参照しようとしました。」
こんなエラーが出た場合、このオブジェクトのgetPassを呼び出そうとしたときに
<%=userinfo.getPass;%>
というようにしてないだろうか。
正しくは
<%=userinfo.getPass();%>
単純なことだけどJSPだとHTMLと混在して分かりづらいので忘れないように。

UserInfoをセッション変数に記録

変更オッケー。セッションにUserInfoオブジェクトをバインド(というらしい)して、index.jspでもそこから読み込んで、上の欄に値を入れている。今はクッキーからユーザーIDとパスワードを取得して、セッション変数に記録しているが、他のメールなどの情報も必要になってくるので、変更して、
クッキーチェック->ユーザーIDとパスワードでDBを検索->UserInfoに記録->セッション変数にバインド
としたほうが良いのか?
それとも、最初はクッキーからの情報を使いログイン、掲示板などに入るときにセッション変数内をチェックして、メールやURLの情報が無ければDBから拾ってきた方がいいのか?

・いちいち掲示板やその他いろんな物を開くときに検索しに行くと重くなりそう。
・ただし、DBの登録内容を変えた場合はすぐにセッション変数にデータを入れ直す必要がある。

これで作ってみよう。

apacheクラスのエラーが出る場合

だいたいTomcatを再起動すれば直る。