蘇る失墜

日常の出来事をつらつらと

Runtime

2006年09月25日 00時34分26秒 | java
最近javaゼミをやっていて適当にプログラムを書く宿題を出したので
自分もいろいろと作ってみた。
前回のゼミでファイル入出力をやったので、
復習もかねてファイル名と探したい文字列を入力するとマッチした行が返ってくるというのを作って見た。(作成時間約40分)
これはLinuxのgrepコマンドっぽいので、Linuxのコマンドをいろいろと作って見ようと思った。
Linuxで一番使うのはlsだろうと思い、そういうクラスはないかと探して見たところ
Fileクラスというまさにそれっぽいクラスを発見。
うまく表示させるのが難しかった(作成時間約50分)
このクラスの中にmkdirというメソッドもあったのでついでにmkdirも作った。
(作成時間約10分)
そのあと何の機能を追加しようか悩みつつwebで検索していたら、
外部コマンドを使えるというRuntimeクラスとProcessクラスを発見!!
これを使えばpingとかnslookupとかいろんなコマンドを
Process process = Runtime.getRuntime().exec("hoge");
hogeの中に渡してあとはprocessをインプットストリームで読めば良いだけ。
私のPCにはcygwinが入っていないのでlsやgrepは使えないが
Windowsのdirやfindは使えるのでさほど問題ではない。
lsが使いたかったらたぶんLinuxを使えばいい。
ということはこれを使えば私が作ったプログラムは無意味というわけで…
私の作成時間約2時間はいったいなんだったんだろうorz

james

2006年09月12日 21時09分38秒 | java
jamesとはjavaでメールをいろいろと扱えるもんです。
特にすごいのは、メール受信をトリガーにして様々な処理を行える点。
Mailetとか言うServletみたいなのがあって、それを実装するだけなので簡単らしい。
まだ調べた量が少ないのでよくわかっていない。
以下は今日やったことのメモ。(Windowsの場合)

・jamesのインストール
まずjamesをダウンロードする。日本語版のページからではリンクが切れていたためダウンロードできなかった。なので英語版のページからダウンロードする。
バイナリとソースがあるが、ここではバイナリにする。
日本語のページにすこしインストール方法などがあったので参考にした。
ダウンロードしたら適当な場所に解凍する(たぶんどこでもいい)
あとついでにjavamail-1_4とjaf-1_1-frも落としておく

・jamesの起動
起動するには jamesのフォルダ/bin/
のrun.bat(linuxの場合はrun.shとか?)を動かす
これを起動したままの状態で、コマンドプロンプトからtelnetコマンドを入力する。
そのあとに open localhost 4555
と入力する。そうするとidとpasswordの入力を求められるので,
両方ともrootを入力する。パスワードを変更するにはconfig.xmlを変更する。
ログインしたら、ユーザを追加する。helpと打つといろいろ出てくる。
ユーザを追加するだけなら addUser name pass で良い。

・メールを送信するサンプルプログラム
webからコピペしたが動かなかった。
Y先輩が過去に動かした経験があるらしい。あとレジュメにも何か書いていたらしい。それを参考にすればいいだろう。

・Mailet
全然わかっていない

自分の調べる能力の低さを感じた。
2~3時間やってこれくらいしかできていないorz


-------------------------------------------------
参考URL:
http://www.nurs.or.jp/~sug/soft/james/index.htm
http://www-06.ibm.com/jp/developerworks/java/030905/j_j-james1.html

他にもいろいろ見たが、まともに使えそうなのはこの2つくらいか?

ArrayList

2006年09月01日 22時48分46秒 | java
ArrayListにデータベースに入れるデータを順番に追加していったのだが、
追加した後も新しいArrayListを作らずにその後ろに追加していったため、ArrayListがガベージコレクションが動くまで長くなっていき、そのかなりの長さであるArrayListをDBに追加しようとしていたため、PCにすごい負荷がかかってしまっていた。
本来一度入れたデータを入れようとするとエラーが出て気づきそうなものだが、今回のプログラムではignoreを使っていたため中々気づけなかった。
これを解決するためDB挿入後ArrayListを新しく作るようにした。
今は快適に動いている

java勉強会

2006年08月29日 16時23分01秒 | java
今日はjavaの勉強会があった。
今回で3回目にも関わらず新しい発見があった。
Human型の配列にHumanのサブクラスであるStudentやTeacherクラスも入るそうです。

あとmysqlについて先輩に聞いたこと
mysqlはprimary key以外にユニークなキーを持てるらしい。
insert ignore into hoge values();
とすればエラーが出ても無視できるらしい。

Eclipseで2つのプログラムを動かすには

2006年08月28日 22時01分54秒 | java
あるプログラムが動いている状態で別のプログラムを実行すると、最初に動いていたプログラムのコンソール画面が、後から動かすプログラムに上書きされてしまうそうです。それを解決するためにはまず新規コンソールビューを開き、そして先に動いているプログラムのコンソールを選択して、「コンソールのピン止め」をクリックするだけ。これをクリックするとコンソール画面を固定することができるので、もう片方のコンソール画面で別のプログラムを動かせば、コンソール画面が上書きされてしまうことを防ぐことができます。試してないけど2つだけでなく3,4つ動かすこともできるだろう。

Eclipseで気づいた便利なキーボードショートカット。
CTRL+D・・・1行削除。
EmacsのCTRL+Kと同じみたいに使える。ただEmacsと違って削除したものを貼り付けることができるかどうかは不明。

今日悩んだこと
Stringクラスのsplit(String hoge)を使ってで区切ろうとするとエラーがでる。はただそれだけでは文字とみなされないらしく、\\\\を直前に入れる必要があった。

ここ2,3日のまとめ

2006年08月28日 01時02分38秒 | java
前々回の記事でついにプログラムが完成したと書いたけれど
実際はバグがあったのでここ2日くらいプログラムの修正をしていた。
出ていたバグはデータベースの接続にたまに失敗するというもの
エラーは↓のような感じのもの

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:

** BEGIN NESTED EXCEPTION **

java.net.SocketException
MESSAGE: java.net.BindException: Address already in use: connect

STACKTRACE:

原因は結局よくわからなかったけど、おそらくデータベースに頻繁にアクセスしていたことが原因のような気がする。
今までは

insert into hoge values(1,hoge);
insert into hoge values(2,hoge2);

という感じで一行ずつデータベースに入れていた。
これでは100個のデータがあったら100個のSELECT文ができ100回データベースに接続するというひどいプログラムであった。
それを防ぐために

insert into hoge(id,name) values(1,hoge),(2,hoge2)・・・

という風にひとつのSELECT文にすることによってデータベースに接続する回数データ数に限らず1回にさせた。そうしたら上記のようなエラーは今のところ出ていない。

このような問題からデータベースに接続する回数はなるべく減らしたほうがいいだろうということで、今まではデータベースにいちいち接続してIDの最大値を取得していた部分を、mysqlのオートインクリメントを使うことにした。
mysqlのオートインクリメントはテーブル作成時に

create table hoge {
primary key(id),
id int not null auto_increment,
}
とすることで使用可能になる。

これに伴って今まではidをプログラムで保持していたが、オートインクリメントで入れるために、プログラムでは保持しなくった。そのため他のテーブルでidを外部キーにしているものはmysqlのlast_insert_id()をつかって取得するようにした。last_insert_id()は直前にDBに入れたidを取得してくれる関数である。


mysql

2006年08月10日 22時16分08秒 | java
mysqlを再インストールした。
mysqlをインストールする際に文字コードを指定する場面で
デフォルトではlatin1担っている部分をCP932に指定した。
CP932とはWindowsでの正しい文字コード。
Windowsの文字コードは、一般的には「シフトJIS」だが、正しくは「CP932」である。
「MS932」とも言う。

これにしたら、以前はblobでしか入らなかった日本語がtextでも入るようになった。
ただCP932はWindows用なのでLinuxはどうしたらいいのかがわからない。
やっぱりWindows2003サーバしかないのか…