AntBuilderでwarファイルをWebLogicにデプロイ
AntBuilderでtaskdefしてWebLogicのDeployerを利用してデプロイを行う。
def ant = new AntBuilder() ant.sequential() { taskdef name: "wldeploy", classname:"weblogic.ant.taskdefs.management.WLDeploy", classpath:"E:/bea/wlserver_10.3/server/lib/weblogic.jar" wldeploy action:"deploy", source:deployWorkDir + "/" + projectName + ".war", name:projectName, user:"weblogic", password:"weblogic", verbose:"true", adminurl:"t3://xxx.xxx.xxx.xxx:7001", targets:"examplesServer",remote:"true",upload:"true" }//ant end
AntBuilderとは特に関係ないが、リモートのWebLogicにデプロイする場合は、upload=trueが必要。
AntBuilderでwarファイル作成
def ant = new AntBuilder() ant.war(destfile:deployWorkDir + "/" + projectName + ".war", webxml:"WEB-INF/web.xml"){ fileset(dir:".") { include(name:"**/*") exclude(name:"WEB-INF/lib/xxxx.jar") exclude(name:"**/*.java") } }
warに含めたいファイルが全部カレントにあるとすると上記の記述で大丈夫のよう。
exludeで特定のjarやjavaソースファイルを除外しています。
Mewからssl経由でgmail/yahoo mailを利用
けっこうはまってしまったのでメモ。
設定
mewの設定
(setq mew-config-alist '( ("default" ("name" . "名前") ("user" . "ユーザ名") ("mail-domain" . "gmail.com") ("pop-ssl" . t) ("pop-ssl-port" . "995") ("pop-auth" . pass) ("pop-user" . "ユーザ名") ("pop-server" . "pop.gmail.com") ("ssl-cert-directory" . "/cygdrive/d/home/.certs") ("ssl-verify-level" . 2) ;0だと鍵のチェックしない ("imap-server" . "imap.gmail.com") ("imap-user" . "ユーザ名") ("imap-auth" . t) ("imap-ssl" . t) ("imap-ssl-port" . 993) ("smtp-ssl" . t) ("smtp-ssl-port" . "465") ("smtp-user" . "ユーザ名") ("smtp-server" . "smtp.gmail.com")) ("yahoo" ("user" . "ユーザ名") ("mail-domain" . "yahoo.co.jp") ("mailbox-type" . pop) ;or 'mbox ("inbox-folder" . "+inbox") ("pop-server" . "pop.mail.yahoo.co.jp") ("pop-ssl" . t) ;; ("pop-ssl-port" . "995") ("pop-auth" . pass) ("pop-user" . "ユーザ名") ("smtp-server" . "smtp.mail.yahoo.co.jp") ("smtp-ssl" . t) ("smtp-ssl-port" . "465") ("ssl-cert-directory" . "/cygdrive/d/home/.certs") ("ssl-verify-level" . 2) ;0だと鍵のチェックしない ("smtp-user" . "ユーザ名"))) )
上記設定はwebからかき集めてきたので、いらない設定もあるかも。
ssl-cert-directoryは信頼できるCAの証明書の置き場所。
フルパスで、cygwinの形式で記述する必要があった。
証明書の用意は、下記のやり方そのままでOKでした。
ファイル名を".crtや.pemのハッシュ値".0にする必要があるみたい。
http://d.hatena.ne.jp/sleepy_yoshi/20080223/p1
opensslから接続検証コマンド
openssl s_client -connect pop.mail.yahoo.co.jp:995 -CApath ~/.certs/
stunnelの設定
stunnelのバージョンは4.26。
cygwinのsetup.exeから入れた直後は設定ファイルが置かれていないので、サンプルを見ながら自分で用意する。
cygwinの端末からstunnelを引数なしで実行すると設定ファイルの設定値に起因するエラーメッセージが表示されたのでいろいろ調節する。
setuid周りはwindows環境だとエラーになるのでコメントアウト。
cert=d:/home/.certs/cert.pem
key=D:/home/ssl/private/key.pem
certはopensslで作った自分の証明書、keyはその鍵を指定。
[参考]
http://bitarts.jp/tech/linux/openssl.html
例外の実装方針
例外クラスの利用方針
Javaでの例外の利用方針は、思いつくもので大きく分けて3つ。
- アプリケーション全体でひとつの例外クラスを利用
- アプリケーション全体で複数の例外を利用
- 検査例外を利用せず、全てRuntime Exceptionを利用
アプリケーション全体でひとつの例外クラスを利用
独自の例外をひとつだけ定義し、エラー内容はエラーコードで区別する。
EclipseのCoreExceptionなどがその例。
アプリケーション全体で複数の例外を利用
エラーの種類ごとにXXXException、YYYExceptionなどの独自例外を定義する。
独自例外にも継承関係を持たせて構造化したりもできる。
例外クラスの型を判定することで例外を区別できる。
検査例外を利用せず、全てRuntime Exceptionを利用
これは比較的最近のやり方のはず。検査例外を投げる場合、投げる例外クラスの変更や追加があると修正のインパクトが大きいのでRuntime Exceptionを利用する。
throwsには目印として投げるRuntime Exceptionを記述しておく。
エラーコード
他の言語同様に、Javaでもエラーコードの設計では普通に行う。
ただし、Eclipseのplugin開発などでは、提供されているCoreExceptionを利用したログ出力機構ではCoreExceptionに設定したエラーコードは出力されない。
このため、エラーコードをログファイルに出力する場合は、エラーメッセージ本文にコードを埋め込むなど工夫が必要。
ログファイルにはStackTraceが出力されるので、エラーコードを出す文化のないアプリケーションのプラグイン開発などでは無理に出さずにそのやり方に従うという選択もある。
例外を投げるタイミングとログ出力のタイミング
例外を投げるタイミングとログ出力のタイミングは必ずしも一致しない。
例外は発生元から、順次呼び出し元に伝播していくので、極端な話、各catch箇所で毎回StackTraceのログを出力していると、同じ内容が重複してログに出力されてしまう。
例外情報を詰めてThrowした場合は自分でログを出力しない、受けた例外をThrowしない場合はその時点でログ出力するというルールを適用すると重複は回避できる。
この場合、何かのバグでログ出力からもれてしまうケースがあるのではないか、漏れが発生するくらいなら重複覚悟で余計めに出力しておいたほうがよいのでは、と思ってしまうが、これはテストして漏れていないことを確認するしかないと思う。もしくはcriticalなエラーの場合は重複を許容して即座にログを出力してしまうとか。
ファンクションポイントとユースケースの本・資料
そのうち読むかも、ということでタイトルだけメモ
- 失敗のないファンクションポイント法-アレア
- システム開発の見積りのための実践ファンクションポイント法
- IPA/SEC ソフトウェア開発データ白書
- JUAS ソフトウェアメトリックス調査
コメントの抽出
下のページのコメント部分を抜き出すというお題が前から気になっていたので、書き直してシンプルにして(劣化?)みた。コアな部分はあまり変わっていないので面白くないかもしれない。
http://ls-al.jp/blog2/category_11/item_498.html
module Main(main) where import System.Environment import System.IO import Char main = getArgs >>= (\a-> openBinaryFile (a !! 0) ReadMode) >>= hGetContents >>= (return.getSrcComment) >>= (\a->openBinaryFile "./out.txt" WriteMode >>= (\h-> hPutStr h a >> hClose h)) getSrcComment::String->String getSrcComment src = concat $map trimEmpty $map getResult $ zip (tail $ scanl commentFilterHs (0,0) [(idx,src)| idx <- [0.. (length src) -1]]) src commentFilterHs (prevFlag, ownFlag) (idx,str) | prevFlag == 1 && c1 == '-' && c2 == '-' && c3 == '}' = (0,0) | prevFlag == 0 && c1 == '{' && c2 == '-' && c3 == '-' = (1,1) | prevFlag == 2 && c2 == '\n' = (0,1) | prevFlag == 0 && c2 == '-' && c3 == '-' = (2,1) | prevFlag == 9 && c2 == '"' = (0,0) | prevFlag == 0 && c2 == '"' = (9,0) | prevFlag == 9 = (9,0) | prevFlag == 1 = (1,1) | prevFlag == 2 = (2,1) where c1 = if idx -1 >= 0 then str !! (idx -1) else '\NUL' c2 = str !! idx c3 = if idx +1 < length str then str !! (idx +1) else '\NUL' commentFilterHs (prevFlag, ownFlag) (idx,str) = (0,0) getResult ((prevFlag, ownFlag), c) | ownFlag == 1 = c getResult ((prevFlag, ownFlag), c) = chr 0 trimEmpty c |ord c == 0 = "" trimEmpty c = c:[]
せっかくコメントを抜き出しても日本語が化けてしまうのでバイナリopenにしてみた。
パラメータの文字数3という制限をなくしたので、解析メソッドを拡張することでもっといろんなことができるかもしれない。
さらに手を加えるとするならStateを使って実装するとか。