html>
Javaマスターへの道
▲検証の必要性あり 2003/09/24 ●String型は String a = null; として a = "ABC"; と代入してもよい ※暗黙的にnew String()されている? ▲つまりオブジェクトは作成されているということ? ●java.lang.String compareTo() メソッドは 等しい場合は,0(int)を返す ●文字列比較(equalsメソッド) String str = "ab"; if(str.equals("abc")){ System.out.println("正しい"); }else{ System.out.println("間違い"); } ▲trueに対してfalseするのではなく falseに対してtrueはできるの? ●日付処理(※カレンダーをタイムスタンプには変えれない)←▲でまかせ(Date,Timestampなど変換を行うことにより多少のズレ(ミリ秒単位で)が生じる) 日付の比較は ・java.util.Date(あまり推奨されない) Date date = new Date(); //1970 年 1 月 1 日 00:00:00 GMT からのミリ秒数を返します(戻り値long) System.out.println("Date: " + date.getTime()); 結果:1009852068687 ・java.util.Calendar(Dateよりはこっち) abstractクラス 注意:コンストラクタに年月日を指定する場合は月から-1しないといけない Calendar calendar = new GregorianCalendar(); System.out.println(calendar.getTime()); 結果:Tue Jan 01 11:26:15 JST 2002 曜日 月 これでもOK Calendar cal = Calendar.getInstance(); setTimeメソッド setTime(Date date) Calendar の現在の時刻を、指定された Date にします。 ・java.sql.Timestamp コンストラクタ→Timestamp(long time) のみ java.lang.Object | +--java.util.Date | +--java.sql.Timestamp Date date = new Date(); //1970 年 1 月 1 日 00:00:00 GMT からのミリ秒数を返します(戻り値long) //System.out.println("Date: " + date.getTime()); Timestamp time = new Timestamp(date.getTime()); System.out.println("time" + time); 結果:2002-01-01 11:29:22.359 ●文字に変換 String.valueOf ●Eclipse デバッグ ・ステップイン 一行ごとに実行(メソッドが現れたときは内部に入る) ・ステップオーバー 一行ごとに実行(メソッドが現れたときはメソッドは実行されたものとして先に進む) ・ステップ・リターン 一行ごとに実行(今実行しているメソッドから抜け出す) ●Tomcat CATALINA_HOMEとTOMCAT_HOMEはどう違うの? 環境変数 CATALINA_HOME = D:\tomcat PATH = %CATALINA_HOME%\bin を追加すると Tomcatを起動させたい時に コマンドプロンプト上でわざわざ D:\tomcat\bin に移動してから startupとしなくても どこのフォルダからでも startupでTomcatを起動させることができる 2003/09/25 ---------------------- 参考 http://www.sqlpowerpage.co.jp/plsql/varchar2.htm ■PL/SQL %type jcno jcmf.jcno%type; %type は、テーブルのデータ型を与える。 jcmf←テーブル名 jcno←列名 ●CLOBのInsert,UpdateともにVARCHARと同様でOK insert into WFSS_TM(recordid,LOCATIONNAME) values(1,'1111'); insert into WFSS_TM(recordid,LOCATIONNAME) values(2,'2222'); insert into WFSS_TM(recordid,LOCATIONNAME) values(3,'3333'); insert into WFSS_TM(recordid,LOCATIONNAME) values(5,'2222'); update WFSS_TM set locationname = '2' where recordid = 1; delete WFSS_TM where recordid = 1; 参考 http://www02.so-net.ne.jp/~khayashi/ora_clob.html SELECT recordid,locationname FROM WFSS_TM WHERE DBMS_LOB.INSTR(locationname, '2222', 1, 1) > 0; SELECT locationname FROM WFSS_TM WHERE DBMS_LOB.INSTR(locationname, '2222', 1, 1) = 1 AND DBMS_LOB.GETLENGTH(locationname) = LENGTH('2222'); SELECT locationname FROM WFSS_TM WHERE DBMS_LOB.INSTR(locationname, inLocationName, 1, 1) = 1 AND DBMS_LOB.GETLENGTH(locationname) = LENGTH(inLocationName); SELECT recordid,locationname FROM WFSS_TM WHERE DBMS_LOB.INSTR(locationname, '2222', 1, 1) = 1; SELECT locationname FROM WFSS_TM WHERE DBMS_LOB.GETLENGTH(locationname) = LENGTH('2222'); ●------------------------------------------------------------------------- String str = "This is a pen\n" + "I am a pen\n" + "He is a pen\n" + "She is a pen\n" + "\n\n\n\n\n" + "We are a pen\n"; String str_line = null; int i = 0; //StringTokenizer token_message = new StringTokenizer(str,"\n",true); StringTokenizer token_message = new StringTokenizer(str,"\n"); while( token_message.hasMoreTokens() ){ i++; str_line = token_message.nextToken(); System.out.print( i + "行目" + str_line ); } ●1行目This is a pen2行目I am a pen3行目He is a pen4行目She is a pen5行目We are a pen ------------------------------------------------------------------------- ●StringTokenizerの第3引数に,「true」を設定 String str = "This is a pen\n" + "I am a pen\n" + "He is a pen\n" + "She is a pen\n" + "\n" + "\n" + "We are a pen\n"; String str_line = null; int i = 0; StringTokenizer token_message = new StringTokenizer(str,"\n",true); //StringTokenizer token_message = new StringTokenizer(str,"\n"); while( token_message.hasMoreTokens() ){ i++; str_line = token_message.nextToken(); System.out.print( i + "行目" + str_line ); } ● 1行目This is a pen2行目 3行目I am a pen4行目 5行目He is a pen6行目 7行目She is a pen8行目 9行目 10行目 11行目We are a pen12行目 つまり\n区切りで出力するものの \n自体も出力対象としているの トークンに区切り文字自体も含める ------------------------------------------------------------------------- 2003/09/29 ●SQL Plus 1.spool C:\SQL 2.select TO_CHAR(property) from WFSS_TM where recordid = 271; 3.spool off ※これをしないといつまでもファイルに書き込まれてしまう ●oracleの改行 参考 http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/sq_k10.htm Insert into WFSS_TM(recordid,property) values (902,'abcde \n abcde'); select TO_CHAR(property) from WFSS_TM where recordid = 902; update WFSS_TM set property = 'abcde \\n abcde' where recordid = 902; update WFSS_TM set property = 'abcde \r abcde' where recordid = 902; ------------------------- Oracleの改行 start ------------------------- Javaの変数 String str = "Shimoda(char)13" + "\n" "Tomoya\n" + "\n" + "\n" + "desu\n"; DBには Shimoda Tomoya desu Oracleの改行文字はあるのか? 黒くなるのは? -------------------------- Oracleの改行 end -------------------------- 参考 http://abcclub.cside.ne.jp/vbahelp_help/chr1.htm Java → Oracle → Java Insert into WFSS_TM(recordid,property) values (902,'abc4444444444444444444444444444'||chr(10)||'44444444444444444444444444444de '||chr(10)||' abcde'); PROPERTY ------------------------------------------------ abc4444444444444444444444444444 44444444444444444444444444444de abcde Insert into WFSS_TM(recordid,property) values (902,'abc4444444444444444444444444444'||chr(13)||chr(10)||'44444444444444444444444444444de'||chr(13)||chr(10)||' abcde'); truncate table WFSS_TM; select property from WFSS_TM where recordid = 902; ●コマンドプロンプトでメッセージを送信 net send マシン名 メッセージ 2003/10/01 日付比較 前提条件 あるテキストファイルに日時分(※1)が設定(以下ではテキスト日付とする)されているとする。 システム時刻(※2)とテキスト日付の比較を行い システム時刻>=テキスト日付ならば テキスト日付を返し システム時刻<テキスト日付ならば テキスト日付-1を返す と言いたいところなのだが テキスト日付には日時分しか設定されていない どうにかして比較できるように変換しないといけません そこでシステム時刻の年-月を取得し そこにテキスト日付の日時分をくっつけてやれば Timestamp型に近くなる(以下比較日付) (例:2002-09-20 13:50:00) やっと比較ができそうだ! 比較の方法 パターン1 long型で比較を行うか(Date型では1970年からのミリ秒で時刻を表すのだ!) パターン2 Timestamp型でafterメソッドを使うか まああるものを使うにこしたことがないのでパターン2でチャレンジ ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ しかしここで重大なことに気づきました 前提条件:テキスト日付が間違うことはないとします テキスト日付が312355 (31日23時55分) 仮にシステム日付が2002-09-20 13:50:00とすると 比較日付は,2002-09-31 23:55:00となります よしよし。これで比較が行える・・・ ってんなあほな!! 2002-09-31という日付存在するはずない・・・(※3) ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ 何か対策を・・・ そうだ! おかしな日付になれば,判定なしで一ヶ月マイナスしてやればいいんだ おかしくなるパターン 一ヶ月ひく場合は閏年に対応しているのか? 1.テキスト日付に31日が設定されている場合 システム時刻の月が 2 4 6 9 11月ならおかしくなる(※3) 2.テキスト日付に30が設定されている場合 システム時刻の月が2月ならおかしくなる よって 2月の30日or31日 4,6,9,11月の31日が設定された時点で一ヶ月マイナスしてやればよい ●日付の神秘(※重要) バグバグバグバグバグゥ〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 と思っていたが,新たなエラーが!!!!!!!!!!!!!!!! 2 4 6 9 11月 -------------------- ※ start -------------------- ※1 201350 (20日13時50分) ※2 2002-09-23 16:56:34 Timestamp型 ※3 日付の神秘 2 4 6 9 11(西向く侍は,28,29,30日になりえる月) 1 3 5 7 8 10 12(それ以外は,必ず31日/月あります) さらに詳しく 2月は閏年(うるうどし)なので,28,29日になる可能性があるのです。 基本は4年に1回閏年になる ちなみに上記の例外で100年単位で閏年でなくなる が400年単位では閏年になる 以上で閏年についての講義は終わります --------------------- ※ end --------------------- ●メソッド substring( a,b )のa,bの数え方 2002-09-23 16:56:34 a 0 3 56 b 1 4 67 2003/10/02 ●Eclipse クラスのメソッド単位のテスト スクラップブック・ページで インポートしない場合 System.out.println( jp.go.kishou.adess.yss02.oki.function.decode.TelOenTimeStoring.dateComparison( "020102") ); インポートした場合(jp.go.kishou.adess.yss02.oki.function.decode.TelOenTimeStoring) System.out.println( TelOenTimeStoring.dateComparison( "310017" ) ); ソースを選択-実行-大元のソースにブレークポイントを設定してればそちらに処理が移る -F6[ステップ実行]-F7[ブレークポイントまで移動] ただし,テスト用のメソッドを public static にしなければ 不可視状態なのでメソッドを呼び出せない TelOenTimeStoringオブジェクトを作成すればよさそうだが・・・ でもデフォルトコンストラクタ用意していないのでめんどくさいっす 2003/10/05(日) ●ガベージコレクションを用いたメモリ管理(sunのホームページで確認の必要あり) メモリとは? パソコンにはメモリというものがあり 本来,アプリケーションやプログラムを起動させることで メモリを消費していく。 メモリがなくなることにより,パソコンの動作が遅くなったり アプリケーションプログラムの起動ができなくなるといった 現象が起きる。 ガベージコレクション Javaではガベージコレクションを用いることにより OutofMemoryError JavaVMが「これ以上はメモリ領域を拡大できないので、今後新しいオブジェクトを生成することはできないよ」 128Mでプログラムを起動 java -Xmx128m MyProgram ●日付処理 java.util.Date コンストラクタ Date() Date( long date ) 年は1970を引いたものとする 月は0〜11とする(普段の月から-1したもの) 時間は0〜23時で表す 分は0〜59で表す 秒は0〜61で表す(うるう秒対応) メソッド getTime() ミリ秒を返す 戻り値 long setTime(long time) 戻り値 void toString() 戻り値 String Date オブジェクトをdow mon dd hh:mm:ss zzz yyyy 形式に変換 dow は曜日 Sun(日), Mon(月), Tue(火), Wed(水), Thu(木), Fri(金), Sat(土) mon は月 Jan(1), Feb(2), Mar(3), Apr(4), May(5), Jun6(), Jul(7), Aug(8), Sep(9), Oct(10), Nov(11), Dec(12) dd は 2 桁の 10 進数である月の日 (01 〜 31) hh は 2 桁の 10 進数である日の時 (00 〜 23) mm は 2 桁の 10 進数である時の分 (00 〜 59) ss は 2 桁の 10 進数である分の秒 (00 〜 61) zzz はタイムゾーン (夏時間を反映する場合がある)。 標準タイムゾーンの省略名には、parse メソッドで認識されるものも含まれる。 タイムゾーンの情報がない場合、zzz は空で、文字は含まれない yyyy は 4 桁の 10 進数である年 java.sql.Date コンストラクタ Date(long date) メソッド valueOf(String s)・・・※static 戻り値 Date(java.sql.Date?) パラメータ "yyyy-mm-dd" 形式の日付 java.util.Calendar 年 YEAR 月 MONTH 日 DATE(=DAY_OF_MONTH) 時 HOUR_OF_DAY(24h)・・・( 参考:HOUR(12h) ) 分 MINUTE 秒 SECOND ミリ秒 MILLISECOND Calendarオブジェクト作成 Calendar cal = Calendar.getInstance(); カレンダのミリ秒は、get()、getTime() または getTimeInMillis() が次に呼び出されるまで再計算されません set() 1999 年 8 月 31 日に設定された GregorianCalendar があるとする。 set(Calendar.MONTH, Calendar.SEPTEMBER) カレンダが 1999 年 9 月 31 日に設定(※これは一時的な内部表現) getTime() を呼び出すと 1999 年 10 月 1 日計算を行う。 ただし、getTime() を呼び出す前に set(Calendar.DAY_OF_MONTH, 30) を呼び出すと set() 自体のあとに再計算が行われるために カレンダーが 1999 年 9 月 30 日に設定されます。 add() set()とは異なり,add() ではカレンダのミリ秒およびすべてのフィールドがただちに強制的に再計算される 標準は,GMT (Greenwich Mean Time、グリニッジ標準時) 日付文字列のフォーマットと解析には DateFormat ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● 2003/10/7 分散 3 6 2 5 3+6+2+5=16 16/4=4 (4-3)+(4-6)+(4-2)+(5-2)=10 10/4=2.5 標準偏差 分散のルート クロック周波数 200MHz=200回/秒 1クロックあたりの時間 1/(200*10の6乗)=5(ナノ秒) CPI 1命令実行するのに必要なクロック数(7とすると) 5*7(CPI)=35(ナノ秒) 1命令実行するのに必要な時間 ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●● ☆☆☆☆☆☆ Eclipseの極意 ☆☆☆☆☆☆ ・デバッグ中に監視式への代入がしたい! hiduke = "30030" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ ▲▲▲▲▲▲▲▲▲ Oracle マスターへの道 ▲▲▲▲▲▲▲▲▲ ●SEQUENCE(順序) 一意の整数(最大38桁の整数) データディクショナリ:USER_SEQUENCES 件数確認 select count(*) from user_sequences; select SEQUENCE_NAME from user_sequences SQL> desc user_sequences 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- SEQUENCE_NAME NOT NULL VARCHAR2(30) MIN_VALUE NUMBER MAX_VALUE NUMBER INCREMENT_BY NOT NULL NUMBER CYCLE_FLAG VARCHAR2(1) ORDER_FLAG VARCHAR2(1) CACHE_SIZE NOT NULL NUMBER LAST_NUMBER NOT NULL NUMBER select * from user_sequences where sequence_name = 'T1_22_SEQ'; 受信DB T0_01_SEQ select max(recordid) from okienvtelrecv; Insert into okienvtelrecv(T0_01_SEQ.CURRVAL) values (select max(recordid) from okienvtelrecv;) ; select T0_01_SEQ.CURRVAL FROM DUAL; @シーケンスの削除 Drop sequence T4_02_SEQ; Aシーケンスの作成 create sequence T4_02_SEQ start with 1 minvalue 1 maxvalue 999999999 increment by 1 nocache cycle; シーケンスを作成していたものの 自分でレコードを作成してしまった場合は 一意制約に違反となってしまう。 そこでPL/SQLを使いUpする必要がある ●INDEX(索引) 件数確認 select count(*) from user_indexes; ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲ Java逆コンパイラ http://www.musya.biz/Java/re.htm Eclipseで逆コンパイル http://w3.cube-web.net/eclipse/index.php?%5B%5BJadClipse%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3%5D%5D gc http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=6148&forum=12 http://www.netgene.co.jp/java/technicalTerms.html#GCSystemGc 文字の判別 http://www.ingrid.org/java/jserv/i18n/corruptedchar.html http://210.239.181.34/products/iserver/oracle8i/pdf/LOB_partner_9906_nonote.PDF ☆正規表現 start ---------------------------------------------------------- 正規表現 [3-7] 意味 : 3 4 5 6 7 同意[34567] 数字の羅列でも可 [0-2][0-3] 意味 : 0〜23 [0-9][0-9]/[0-9][0-9] 99/99 置・指定 適合をストリングのある場所に限定するための主な文字は2つある。 入力データの頭 (^) か後尾 ($) を適合させることができる。これが、意外に便利なんだ。 例えば、改行前にHTMLの終タグがない行を見つけ出したいとしよう。 egrep '<[^>]*$' *.html 言い替えれば、「<」の後に、「>」以外の文字が行の最後まで続く場合を探している訳だ。 とりあえず、入門としてはこんなものだろう。正規表現に使える特殊文字の種類は、正規表現の作り込み方によって違うけれど、使い方はいくつかの基本的な分野に限られることさえ覚えておけば習得はたいして難しくないはずだ。位置、範囲、繰り返し、任意文字が、正規表現の基礎だ。 参考 http://www2.famille.ne.jp/~akio1998/l_grep.html ☆正規表現 end ------------------------------------------------------------ ●Oracle start ----------------------------------------------------------------- # TNSNAMES.ORA Network Configuration File: C:\oracle\ora92\network\admin\tnsnames.ora # Generated by Oracle configuration tools. 任意の文字列 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = ホスト名(コンピュータ名) or IPアドレス)(PORT = 1521(デフォルト))) ) (CONNECT_DATA = (SERVICE_NAME = グローバルデータベース名) ) ) ※ネットサービス名は 任意の名前でありSQL*Plusのホスト文字列で使う C:\oracle\ora92\network\ADMIN Microsoft AccessからOracleにリンクする時は ネットサービス名(任意で入れた奴) ユーザ名 パスワード が必要 ●Oracle end ----------------------------------------------------------------- 管理ツール ODBCの設定 ●Struts サイト start --------------------------------------------------- http://www-6.ibm.com/jp/software/websphere/developer/j2ee/struts/pdf/1.pdf ●Struts サイト end ------------------------------------------------------ ●コピーライト解除ソフト http://www.exactaudiocopy.de ●WebLogic Plugin http://dev2dev.bea.com/codelibrary/code/wlplugin.jsp 2003/10/15--------------------------------------------------------------------- cygwin WindowsでLinuxの様な環境を構築 CDに備え付けのsetup.exeを実行すると 以下の様な文が・・・ 現在のiniファイルはsetup.exeのより新しいバージョンからです。 どんな問題インストールも行っている場合は httpからの新鮮なバージョンをダウンロードしてください http://www.cygwin.com/setup.exe このセット・アップはバージョン2.340.2.5です。 しかし、setup.iniは、バージョン2.416が利用可能であると主張します。 最新の特徴およびバグフィックスを得るようにアップグレードしたいと思うかもしれません。 ぶっちゃけ http://www.cygwin.com/setup.exe 最新のバージョンのsetup.exeを使えってことっすね Tomcatのプラグインをcommonのclassesにいれておくとstrutsのexampleを実行することはできない。 ●Javadocについて /** * メソッドの説明 * @param addKazu 仮引数の説明 * @return int 計算結果を返す * @exception Exception(※ここにはメソッドなどでthrowsしたものを記述する) */ private int add(int addKazu) throws Exception { ・・・足し算 } ●Eclipseの日本語化 http://www.koyane.org/memos/comment-eclipse1.html https://sourceforge.jp/projects/mergedoc/ unibon日記 http://d.hatena.ne.jp/unibon/20030907 ソースの内部デバッグ http://muimi.com/j/eclipse/struts03.html