EmacsでXML整形表示

xml-mode(sgml-mode)にして、一行になっているXMLをリージョンで選択し、M-x sgml-pretty-printを行うと、改行とインデントが施されて表示される。
xml-modeでない場合、改行のみでインデントはされないが、xml-modeに切り替えてindent-regionを行うとインデントが施される。

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を利用

けっこうはまってしまったのでメモ。

準備

stunnelはcygwinのものを利用。
上記プラスcygwinのopenssl(鍵を作るため)

設定

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を使って実装するとか。