メモの日々


2008年12月01日(月) [長年日記]

  • 前の仕事は終わって今日から新しい仕事。だが内容は同じようなものでつまらない。

[howto][java] NetBeansでフォントを大きくする

NetBeansを6.5にバージョンアップした。あまり違いは感じない。

以前から、NetBeansの下部のペインの文字が小さすぎるのでもっと大きなフォントで表示したいと思っていた。が、[ツール]->[オプション]->[フォントと色]と辿って表示されるダイアログでは下ペインのフォントサイズを変更できそうにない。

検索すると、起動時に「netbeans --fontsize 14」のように fontsize オプションを付ければフォントサイズを変えられるとのこと。起動時にしか指定できないとは不便だ。

これで確かに下ペインのフォントサイズは大きくなったが、他の部分も文字が大きくなってしまう。どうしようもないのか。

(追記)

お、開発ビルドではGUIでフォントサイズが変更できるようになっているみたい。

[howto][unix] テキストファイルの文字コードを調べる (2)

3年前に「kcc -c ファイル名」という方法をメモしていたので今日使ったら、UTF-8なファイルを判別してくれなかった。当時はUTF-8なんて使っていなかったのかなあ。

nkfでも判別できるんじゃないかと nkfのマニュアル を読んだところ、

nkf --guess ファイル名

でできるみたい。UTF-8でも大丈夫。

[howto][unix] ディレクトリを辿ってファイルの文字コードを変換する (2)

4年前になにやらシェルスクリプトを使うようなメモをしていたが、少なくとも今のnkfには overwrite というオプションがあり、

find . -name '*.java' | xargs nkf -w --overwrite

のようにするだけでよさそう。-wはUTF-8に変換の意。

なお、wオプションの説明には「UTF8コードを出力する。(BOM無し)」とあったが、UTF-16のファイルを-wで変換したらBOMは残った。nkfのバージョンは2.0.7。

[dev] Subversionはタイムスタンプが更新されないと差分を認識しない?

上のようにして文字コードを変更した後で svn diff を実行したら、差分がなかった。なんでや。

nkfのoverwriteオプションの説明には「元のファイルのタイムスタンプとパーミッションが保持される。」とある。どうもSubversionはファイル内容が変化してもタイムスタンプが変化しないと差分を認識しないようだ。svnコマンドのバージョンは1.4.2。

仕方ないので事前に「find . -name '*.java' | xargs touch」を実行してから上のnkf処理を行うようにしたら差分を取得できコミットすることができた。

やること

  • 請書
  • スポンジ

2008年12月02日(火) [長年日記]

[windows][howto] バッチファイル自身の格納ディレクトリの絶対パスを得る

Bourneシェルでのやり方はこの間メモしたが、Windowsで同じことをするにはどうやるのかを知らない。調べた。

バッチファイル(という呼び方でいいのか?)には「バッチ パラメータ」というものがあり、

  • %0 がバッチファイル自身の絶対パス
  • %~d0 がその中のドライブ文字列部分
  • %~p0 がパス部分

となるようで、これらを組み合わせて

@echo off
set d=%~dp0
echo %d%

としたらできた。パスの最後に \ が付いているので注意。

[windows] 「コマンド ライン リファレンス」のヘルプファイル

上のようなことは「コマンド ライン リファレンス」というヘルプファイルに書いてあった。このヘルプファイルは

  • C:\WINDOWS\Help\ntcmds.chm

にあった。そのことが

に書いてあった。

「バッチ パラメータ」の説明は、ヘルプの「キーワード」タブの一番上にある「% (バッチ パラメータ), バッチ ファイルの」というリンクから辿れる。

[life] よく攣る (2)

ベンチに座って右を向いてポスターを読んでいたら首が攣った。大丈夫なのかな、おれの体。

やること

  • 請書
  • スポンジ

2008年12月10日(水) [長年日記]

  • Apach Axis2を使っている。色々わからない。

[java][db][web][howto] Tomcat 6でのJDBC Data Sourceの設定

Tomcatは3年に1度くらいしか使わないので全然覚えない。使う度にバージョンが変わっているし。今はバージョン6.0.18。

JDBC Data Sourceの設定方法を調べたのでメモしておく。

JDBC Data Sourceとは

javax.sqlパッケージ にあるDataSourceインタフェースのことだと思う。このインタフェースの使い方は JDBC API 入門 などに説明がある。

JDBCを使うときには java.sql.Connection を利用するが、これのインスタンスを取得するのにDataSourceオブジェクトが必要になる。ウェブアプリケーションでは、アプリケーションコンテナにDataSourceオブジェクトを作らせそれをJNDI APIを使って取得するように実装することが推奨されているみたい。

コネクションプーリング機能を持ったDataSourceオブジェクトをコンテナに作らせれば、ウェブアプリケーション側では意識せずともプーリングされたConnectionオブジェクトを利用できる。

Tomcatでの設定方法

Tomcatにはコネクションプーリング機能を持ったDataSourceオブジェクトを作る機能があるようなので、それを利用したい。設定方法は JNDI Resources HOW-TO に書いてある。この後、ここに書いてあるのと同じことをメモする。なお、同じマニュアルのTomcat 5版の日本語訳が Ja-Jakarta にありありがたく参照したが、Resourceの設定方法がTomcat 5.5以降で変わったようで、それに気付かず長時間はまった。

やることは次の3つ。

  • JDBCドライバの配置
    • 使用するDBMS用のJDBCドライバをTomcatが読み込める場所に配置する。$CATALINA_HOME/lib に配置するのが簡単だと書いてあった。
  • Context設定ファイルの配置
    • TomcatがDataSourceインスタンスを作成してそれをJNDIに登録するための情報を、Contextという形で設定するみたい。
    • Contextの設定方法は The Context Container というページに書いてあった。Contextを記述したXMLファイルを作ればいいみたい。
    • XMLファイルの置き場所は色々あるようで、その中の /META-INF/context.xml に置くのがよさそうに思ってそうしてみたが、ここに置いても読み込んでくれなかった。META-INFの場所をおれが勘違いしているのかなあ。
    • $CATALINA_BASE/conf/[enginename]/[hostname]/[コンテキストパス].xml に置くのでもよいと書いてあるのでそうしたら動いた。コンテキストパスというのがよく分かっていないけど、URLに現れるアプリケーション名のことだと思っている。
    • XMLファイルの内容は次のような感じ。この書き方がTomcat 5までとは違う。Tomcatは Commons DBCP を使っているようなので、設定パラメータについては Commons DBCPのマニュアル も参考になりそう。
<Context>
    <Resource name="jdbc/oreore"
              auth="Container"
              type="javax.sql.DataSource"
              username="user"
              password="pswd"
              driverClassName="org.apache.derby.jdbc.ClientDriver"
              url="jdbc:derby://localhost/oreoreDB"
              maxActive="8"
              maxIdle="4"/>
</Context>
  • アプリケーションのweb.xmlの編集
    • 上で設定したDataSourceをアプリケーションからJNDI APIで参照できるようにするために、web.xmlに次のような設定を追加する必要があるみたい。web-app要素内に書く。authの所をよく分かっていないなあ。本当に必要なのだろうか。
<resource-ref>
  <res-ref-name>jdbc/oreore</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref>

アプリケーションからのDataSourceの取得方法

上のように設定すると、アプリケーションのコードで

Context ictx = new InitialContext();
DataSource dataSource = (DataSource)ictx.lookup("java:comp/env/jdbc/oreore");

のようにJNDIを使ってDataSourceオブジェクトを取得できる。

「jdbc/oreore」を3箇所に分散して書かないといけない所がひどい。

[java][db] DataSourceはスレッドセーフなのか

スレッドセーフじゃないと困ると思うが、明記したドキュメントが見当たらない。

検索したら @IT会議室 がヒットし、そこに For Driver Writers の「A.1.6 Support Multithreading」に記述があるという発言があった。確かに

All operations on java.sql and javax.sql objects are required to be multithread safe.

で始まっている。それ以降はちゃんと読んでないけど。

これを信じてもいいんだろうか。Connectionのスレッド安全性は実装依存というのを以前にどこかで読んだ記憶があるんだよな。念のため自分で排他制御すべきかなあ。

[java][web] Axis2でのサービスオブジェクトのライフサイクル

Axis2にて、サービスクラスのインスタンスはどのように管理されるのか。

コンストラクタでログを出力するようにして試したところ、デフォルトでは要求を受信する度に新しいインスタンスが作られるようだった。

Axis2 Configuration Guide のService Configuration節に、

scope: (Optional Attribute) The time period during which runtime information of the deployed services will be available. Scope is of several types- "Application", "SOAPSession", "TransportSession", "Request". The default value (if you don't enter any value) will be "Request"

と書いてあった。デフォルト値が Request だからか。

それならと services.xml に「scope="Application"」を追記して試してみたが、やっぱり要求を受信する度に新しいインスタンスが作られる。なんでや。

調べると「scope="application"」のように全部小文字の例があったのでそれを試したら、Tomcatの起動時にインスタンスが生成され、新しい要求を受信しても新しいインスタンスは作られないようになった。ということは、ドキュメントの説明がおかしい。あっ、それともXMLってクォーテーション内も小文字だけ使うんだったっけか。いやいや、そんなことないよなあ。

[java][web] Axis2のライフサイクル管理

上で引用したService Configuration節に、

class: (Optional attribute) The full qualified name of the service lifecycle implementation class. ServiceLifeCycle class is useful when you want to do some tasks when the system starts and when it shuts down.

なんてことも書かれている。この説明だけでは何の事だか分からない。属性名がclassってのはひどい。

検索すると、Axis2 services : LifeCycle Vs ServiceLifeCycle というページがあった。ServiceLifeCycleとLifecycleという2つのインタフェースがあるのか。LifeCycleなのかLifecycleなのかはネイディブの人でも悩むのかね。

試した結果をメモ。

org.apache.axis2.engine.ServiceLifeCycle

このインタフェースを実装したクラスを作り、そのクラス名をservices.xml内のclass属性に指定しておくと、

  • Axisエンジン起動時にインスタンスが作られ、startUp(ConfigurationContext configctx, AxisService service) が呼ばれる。
  • Axisエンジン終了時に shutDown(ConfigurationContext configctx, AxisService service) が呼ばれる。

となるみたい。引数で渡されるオブジェクトをどう使えばいいのかがよく分からない。

Axis2のアーカイブ内のsamplesディレクトリに servicelifecycle というサンプルがあって、そこでこのインタフェースを使っていた。

org.apache.axis2.service.Lifecycle

サービスクラスにてこのインタフェースを実装しておくと、

  • サービスクラスのインスタンスが作られたときに init(ServiceContext context) が呼ばれる。
  • サービスクラスのインスタンスが用済みになったときに destroy(ServiceContext context) が呼ばれる。いつ用済みになるかは上に書いた「scope」の設定で決まる。

となるのかと思ったが、そうならないケースもあった。うーん。

scopeをapplicationにしているときは上のようになったが、requestにしたときはdestroy()が呼ばれない。finalize()は呼ばれているのにdestroy()は呼ばれない。なんでや。

やること

  • 請書
  • スポンジ
  • Microsoft Update
  • 換金

2008年12月17日(水) [長年日記]

[db][java] Java DBでnot nullでないカラムに一意制約を付けられるようになっていた

以前はできなかったのにいつの間にかできるようになっていた。

Derbyのサイトで調べると、Derby 10.4.1.3のリリースノート

Unique constraints on nullable columns. SQL Feature T591.

と書かれていた。

やること

  • Microsoft Update
  • 換金
  • 請求書

2008年12月31日(水) [長年日記]

  • あっという間に大晦日。

[service][life] 年末年始はゆうちょ銀行窓口閉まっている

家の近くの小さな郵便局へ行ったら閉まっていた。仕方ないので遠くの大きな郵便局まで出向いたが、そこもゆうちょ銀行の窓口は閉まっていた。

郵便局なんだから年末年始も開いているようなイメージでいたが、12/31〜1/4は休みなのかー。

[book] 分身 (東野圭吾)

分身(東野圭吾/著) ちょっと前に読んだ。女子大生の鞠子と双葉が自分の過去を調べる話。交互に話が進み、細切れに読んでいると今どちらの話なのかが分からなくなったりする。まあまあ面白かったけど、もう少し何かあるのかと思ってた。3.3点。

[book] クライマーズ・ハイ (横山秀夫)

クライマーズ・ハイ(横山秀夫/著) 読んだ。カッとしやすい新聞記者悠木が日航機墜落事故の全権デスクとして頑張る話。毎日成果物を世に出さねばならない新聞社ってのは大変そう。すぐ喧嘩になるんだがこんな雰囲気で会社を維持できるのかな。3.9点。

やること

  • 換金
  • 請求書