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

とにかく、最初のLinuxOracleがインストールできなかったことが腑に落ちない。
TomcatApacheがインストールされていたことが問題なのか?
けれど2回目に挑戦したLinuxだって、バージョンは違うがApacheTomcatも動いていたのになあ。

Tomcat4.1+JRE1.4.1とTomcat5.5+JRE1.5.0の共存。

久々に更新。

普段はTomcat5.5+JRE1.5で開発を行っているんだが、
別件で古いバージョンのTomcatJreを使わないといけなくなった。

共存させないといけないのだが、なんともうまくいかない。

まず最初に、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



IEの既知の問題で、Firefoxでは通常通り表示される。



結局解決に半日つぶしてしまい、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プロジェクトのソースを漁って見つけた方法なんだけど、
結構普通の手法なんだね。。
ごめんよ、こんなところまで、辿り着けなくて。


っていうか、前任者すごい。