Redhat Linux+Oracleの苦悩
以下のサイトを参考にインストール。
http://kamoland.com/oracle/ora92redhat9.html
しかし、何度やっても上手くインストールできない。
原因は、Oracleが使用しているJREのパスの問題だと思うのだが。
dbcaなどが起動しないのだ(起動時にJREのパスが通らないのが原因っぽい)
最初に設定した.bash_profileの設定ミスか、
JREがインストール済みだからなのか、原因はやはり分からないが、
別のLinux(同じバージョンのRedhat)にインストールすると、すんなりインストール達成。何故。
まず、インストールするときにOracleユーザでログインしないといけないのは間違いないが、XWindowを使用している場合は、マシンへのログインはrootで行い、ターミナルでユーザを切り換えてOracleでインストール。
・・・という方法で行うと、失敗する。
必ず、Oracleユーザーでシステムにログインしないとダメっぽい。
あとはdbcaを起動させ、Database作成中に
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
・・というエラー発生。
これは、OracleDBを起動させていれば出ないっぽい。頭悪ぃ、私www
$ dbstart
とにかく、最初のLinuxにOracleがインストールできなかったことが腑に落ちない。
TomcatやApacheがインストールされていたことが問題なのか?
けれど2回目に挑戦したLinuxだって、バージョンは違うがApacheもTomcatも動いていたのになあ。
Tomcat4.1+JRE1.4.1とTomcat5.5+JRE1.5.0の共存。
久々に更新。
普段はTomcat5.5+JRE1.5で開発を行っているんだが、
別件で古いバージョンのTomcatとJreを使わないといけなくなった。
共存させないといけないのだが、なんともうまくいかない。
まず最初に、JRE1.4系をインストールした後、
環境変数などは変更しないで、Tomcat4.1をインストール。
当然、JRE1.5でインストールしますか?という旨聞いてくるので、
OKでそのままGO
さくっとインストールして、Tomcatをスタートさせ、
localhostを開いてみたが、JSPのコンパイルエラー。
START TOMCATショートカットの引数で、JARファイルを解凍するJAVAC.exeを指定するのだが、
その指定にJRE1.4.1系を指定してみるも、同じエラーが出力。
うーん。
とりあえず、環境変数のJAVA_HOMEに、一時的にjre1.4.1のパスを通し、
その後、Tomcat4.1を再インストール。
インストール時に使ったJVMからバージョンダウンさせたJVMを使って、
TOMCATを起動させるとダメってことなのかな?
UMLのモデリングツール
オブジェクト指向型言語の設計をする際、
標準的に使用される設計モデルであるUML。
私もクラス図なんかは、UMLの基本に則って記述するようにしている。
UMLという仕様が既に明確になっているため、
いつもソースを元にクラス図を起こしてくれるツールを使っている。
世の中にはいろいろなツールがあるようだが、
私が使用しているのはJUDE Communityというツール。
Freeだけれど、いろんなUMLの設計図が書ける。
・・・って言っても、クラス図にしか使ってないけれど。今のところ。
新しいプロジェクトを作成し、
ソースファイルを指定して「ツール」>「Javaソースコードの読み込み」を選択し、
ソースコードのディレクトリを参照(サブディレクトリにチェックを忘れずに)
全てのJavaクラスが一覧で出てくるので、クラス図に起こしたいソースを選んで作成。
構造ツリーに使用クラスが表示されるので、
作成したい名前空間を右クリックして「クラス図を自動作成する」を選択。
これでOK
もっとも。これだけでは、ハッキリ言って、煩雑すぎる。
全ての構造が全て描かれるので、ものすごい状態になることもあるし。
というわけで、とりあえず大雑把な構図を把握しておき、
これを元に設計書を書いていくのだ。
なんだ設計書を自動作成するわけじゃないんじゃん。と思うかもしれないが、
属性・操作の名称、引数・戻り値の型、スコープ、静的・動的なども拾ってくれるので、これはこれでありがたいし、
継承や集約、インターフェースなどの関連も分かりやすいので、あとはExcelに必要なものをコピって貼り付けるだけ、くらいの作業になる。
そもそも、平面な文字列だけのソースコードからクラス図を起こすのは難しいというか面倒。
その点、JUDEは割と便利だと思う。
UML Modeling Tool - JUDE
http://jude.change-vision.com/jude-web/index.html
apache上の文字化け
Tomcatでの文字化けは、フィルタークラスを配置することによって回避していたので、
普通にウェブアプリケーションをテストしていたのでは気づかなかったが、
通常のhtmlファイルは文字化けしてしまう。
私の環境は、Apache2+Tomcat5.5の連携。
htmlのヘッダには、EUC-JPを指定しているのに、
ブラウザで見ると、「西ヨーロッパ言語」で表示されるのだ。
(その後、エンコーディングでEUC-JPを選択すると正しく表示)
apacheのコンフィグレーションファイルにデフォルト指定された文字コードが優先され、
htmlのメタタグに記述しているエンコーディングが無視されてしまうみたい。
以下、その回避方法。
1.APACHE_HOME\conf\httpd.confの700行目辺り
AddDefaultCharset ISO-8859-1
・・・となっているところを、
#AddDefaultCharset ISO-8859-1
AddDefaultCharset off
・・・って修正。
デフォルト、ISO-8859-1を指定している部分をコメントアウトして、
オフにするって修正ね。
オフにしたら、htmlで指定している文字コードでデフォルト表示されるようになります。
html側には、メタタグで文字コード指定するのを忘れないように。
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
Tomcatだけの設定で油断してたら、文字化けしててびっくり。
つか、これ、メタタグの指定意味ないし。
デフォルトが西ヨーロッパ言語ってどーなんだ。
Javaを使った定時処理
通常Javaを使った定時処理を行うときは、
mainメソッドを実装したクラスを作成し、
サーバ機の定時処理(Windowsのbatや、Linuxのcronなど)で呼び出したりする。
・・・のしか思いつかなかった。
が、これだと、
現在作っているのが、たとえばウェブアプリケーションで、
なおかつ同じ機能や同じクラスを流用したい場合、
ウェブアプリで使っているjarファイルから、オリジナルのライブラリまで、
全てにクラスパスを通さなければならない。
まあ、当たり前といえば当たり前なのだが。
そこで、
ウェブアプリケーションに並行して使用する定時バッチとして、
定時処理をスタートさせるサーブレットを用意し、
それを、Tomcat起動時、すなわちアプリケーションを配置するのと同時に配置し、
サーバが機能している間は、ずっとスレッドを監視し続け、
指定時間になったら、処理を行う、というJavaを実装してみた。
思いのほか上手くいっているので満足。
以下、実装メモ。
1.スタートアップ用のサーブレットを用意
「init」メソッドを用意するのがポイント。
public class TaskStarter extends HttpServlet {
private Task task = null;
public void init(ServletConfig config) throws ServletException {
//タスクを開始
start();
}private void start(){
if(reportTask == null){
reportTask = new ReportTask();
}try {
//*起動後は、規定時間ごとにスレッドを監視。
Timer timer = new Timer(true);
timer.schedule(task,0, 60000); //①60秒間ごとにtask処理を実施
}catch (Throwable ex){
//throw ex;
}
}
(以下略)
2.処理クラスを作成
ちょっと端折ったけど、次のような感じ。
Starterでタスクを呼び出すときに、1分ごとに呼び出すように設定。
(①の処理。60000の数値を変えると監視間隔は変更可能)
1分ごとにタスククラスのrunメソッドが処理されるので、
そのメソッド内で、時間を監視し、規定の時間がきたら処理。
public class ReportTask extends Task{
/**
* コンストラクタ
*/
public ReportTask(){}
/**
* タスク処理本体
*/
public void run(){
try{
Date tryTimeStartMail = //今日の日付+指定時間
Date tryTimeEndMail = //↑の日付+トライ時間
Date nowTime = now();//処理(開始時間から、一定時間内リトライを行う)
if (nowTime.after(tryTimeStartMail) &&
nowTime.before(tryTimeEndMail)){
//一回成功したら次は処理しないように記述する}
}catch (Throwable ex){}
}
3.スターターを起動するようにweb.xmlに設定
ウェブアプリケーションのweb.xmlでOKなので、以下のように設定
testTask
test.TaskStarter
3
あとは、開始時間やら間隔やらを設定してOK。
バッチにかかる処理時間などによって、トライ方法やトライ間隔などを考えないとダメだけど、実現方法としてこういうのもアリかなと。
〜が文字化けする。
EUC-JP+Javaの組み合わせで開発を行っていると、
どうも、「〜」という文字が「潤オ」という文字に化けてしまう。
いろいろ調べた結果、
http://software.fujitsu.com/jp/manual/manualfiles/M050002/B1WN5131/01/note03/note0128.htm
http://ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5
こういうことらしい。
要するに、Windowsで採用している字形とUnicodeの字形の、
認識の違い、つーか、間違い?から始まっているらしい。
以下引用すると、
なお、Windows同梱フォントのU+301Cの字形が右下がりから始まる一般的でない形を採用したのは、Unicode仕様書の例示字形にひきずられたものと考えられる。同仕様書ではU+301Cに「JIS punctuation」(The Unicode Standard, Version 2.0より引用)という注釈を施しておきながら、JISの波ダッシュの例示字形と異なる形を印刷してしまった。このことが混乱の大元と考えられる。なお、Windows Vistaに搭載されるフォント「メイリオ」では、U+301Cが一般的な波ダッシュの形(JISの例示字形と同じもの)に修正されている。
・・・とある。
Windowsの仕様書が間違ってるのかよ。
これは、javaのキャラクターセット関連を弄っても直らんし、
解決するには、文字コードをUTF-8にするとか、そういう仕様がベストなのかと思われるが、
いまさら、そんなこと言われても。
というわけで、ネット上から拾ったメソッドを実装して、
文字コードをひとつずつ変換して対応。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=32324&forum=12
結局解決に半日つぶしてしまい、Microsoftを殴りたいキモチでいっぱいになった。
JavaのForm入出力のエンコーディング
javaをつかってFormの入力データをやり取りしていると、
次画面へデータを表示させたとき、
必ず文字化けしている。
jspのヘッダを指定しても、
requestのキャラクターセットを行ってもダメ。
泣きそうでした。
んで、以下、上手くいった設定メモ。
1.Tomcatのconf\server.xmlのConnectorタグに、
useBodyEncodingForURI="true" を設定。
<Connector
port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"
useBodyEncodingForURI="true"/>
2.Filterを継承するクラスを作成。
ここでは、test.common.SetCharacterEncodingFilterでビルド。
doFilterメソッドは以下のような記述。
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {// Conditionally select and set
//the character encoding to be used
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig)
throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;
}
3.該当サイトのweb.xmlに以下の記述を追加
ここでは、EUC-JPに設定。
ちなみに、ここでencodingパラメーターに設定した文字コードが、
上記クラスのメソッド内で取得され、
アプリケーションで扱う文字コードとしてフィルタリングされます。
<filter>
<filter-name>EUC-JP Encoding</filter-name>
<filter-class>test.common.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>EUC-JP</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EUC-JP Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
今までやってきたJavaプロジェクトのソースを漁って見つけた方法なんだけど、
結構普通の手法なんだね。。
ごめんよ、こんなところまで、辿り着けなくて。
っていうか、前任者すごい。