実行可能jarに外部jarを含めるためのライブラリ調査

実行可能jarを作ろうとして、jarに外部jarを含めようとしたら、NoClassDefFoundError を投げてコケる。調べてみると、以下のような問題があるらしい。

外部ライブラリを含む場合の問題 - JARファイルをダブルクリックで実行

で、さらに調べてみると、これを解決するライブラリがいくつか見付かった。(参考: JarClassLoader)
この種のライブラリは、ソースコードを自分のプログラムに含める必要があるため、ライセンスには特に注意を要すると思われる。そこで、JarClassLoaderのページで挙げられていた類似プロジェクトのライセンスを確認してみた。

プロジェクト ライセンス 最終リリース (バージョン)
Classworlds 独自ライセンス? BSD似だが項目数が多い 2003-12-04 (1.0)
Meta Jar Utilities GPL v2 & Apache ライセンス 2.0 2002-08-16 (1.7.1)
One-JAR 修正BSDライセンス 2010-07-15 (0.97)
Embedded jar classloader
in under 100 lines
不明 2008-10-30
jar in jar loader
(Eclipse内蔵用)
EPL v1.0 2009-11-05 (1.3)
JCL - Jar Class Loader LGPL v3 or later 2010-05-03 (2.2)
JarClassLoader GPL v2 & 商用ライセンス 2010/02/18 (1.24)

とりあえず、ライセンス的に無難&リリースが新しいのはOne-JARだろうか。

NTEmacs 23 に乗り換える(途中)

前々から気になりつつも、面倒&特に利点無しだったので放置していたのですが、flymakeを使ったらMeadowが頻繁に落ちるので、ついにNTEmacs23への乗り換えを決意しました。

ということで、とりあえずメモ。なお、インストール等は Cygwin 1.7 の bash 上で作業しています。

NTEmacs 23 バイナリの入手

http://gnupack.sourceforge.jp/docs/current/UsersGuide.html

NTEmacsを C:\opt\emacs 以下に展開。

hiwin-mode

gnupackから直接抽出 → site-lisp/hiwin-mode

tabbar

gnupackから直接抽出 → site-lisp/tabbar

APEL

http://www.jpl.org/elips/apel/

make EMACS=/opt/emacs/bin/emacs install

LIMIT (FLIM)

http://www.jpl.org/ftp/pub/m17n/

make EMACS=/opt/emacs/bin/emacs install

SEMI

http://www.jpl.org/ftp/pub/m17n/

make EMACS=/opt/emacs/bin/emacs install

SKK

http://openlab.ring.gr.jp/skk/index-j.html

SHELL=`cygpath -am $SHELL` make EMACS=/opt/emacs/bin/emacs install

Wanderlust

http://www.jpl.org/elips/wl/snapshots/

make EMACS=/opt/emacs/bin/emacs install

WindowsISO-2022-JP対応

http://nijino.homelinux.net/emacs/cp5022x.el

cd /opt/emacs/site-lisp
wget http://nijino.homelinux.net/emacs/cp5022x.el

フォント設定

http://www11.plala.or.jp/metameta/takuayu_papa/emacs2.html
⇒ えせBDF Fontにしよう!(new)

文字コード設定

http://nijino.homelinux.net/emacs/emacs23-ja.html

上記だけではまだ問題が出たので、若干改変

@@ -1,5 +1,15 @@
--- orig.el	2010-08-06 00:08:30.312500000 +0900
+++ new.el	2010-08-06 00:10:14.531250000 +0900
@@ -1,5 +1,15 @@
 (cond
  ((not (string< mule-version "6.0"))
+  ;; 機種依存文字
+  (require 'cp5022x)
+  (define-coding-system-alias 'euc-jp 'cp51932)
+  ;; decode-translation-table の設定
+  (coding-system-put 'euc-jp :decode-translation-table
+		     (get 'japanese-ucs-jis-to-cp932-map 'translation-table))
+  (coding-system-put 'iso-2022-jp :decode-translation-table
+		     (get 'japanese-ucs-jis-to-cp932-map 'translation-table))
+  (coding-system-put 'utf-8 :decode-translation-table
+		     (get 'japanese-ucs-jis-to-cp932-map 'translation-table))
   ;; encode-translation-table の設定
   (coding-system-put 'euc-jp :encode-translation-table
 		     (get 'japanese-ucs-cp932-to-jis-map 'translation-table))
@@ -7,6 +17,8 @@
 		     (get 'japanese-ucs-cp932-to-jis-map 'translation-table))
   (coding-system-put 'cp932 :encode-translation-table
 		     (get 'japanese-ucs-jis-to-cp932-map 'translation-table))
+  (coding-system-put 'utf-8 :encode-translation-table
+		     (get 'japanese-ucs-jis-to-cp932-map 'translation-table))
   ;; charset と coding-system の優先度設定
   (set-charset-priority 'ascii 'japanese-jisx0208 'latin-jisx0201
 			'katakana-jisx0201 'iso-8859-1 'cp1252 'unicode)
@@ -18,8 +30,6 @@
 	 (get 'japanese-ucs-jis-to-cp932-map 'translation-table)
 	 (coding-system-plist 'utf-8))
   (set-terminal-coding-system 'utf-8-for-putty)
-  ;; 機種依存文字
-  (require 'cp5022x)
   ;; East Asian Ambiguous
   (defun set-east-asian-ambiguous-width (width)
     (while (char-table-parent char-width-table)

iPhoneで撮った動画に手を加えようとしたら心が挫けた

当方、コンテナとCODECの区別が付く程度の動画初心者なのだが、うっかり動画処理に手を出したら、この世界の深淵を垣間見た気がした(^^;

先日、四季の森公園にお出かけしたとき、写真だけじゃなくてムービーも撮ってみた。が、家に帰って再生してみると、手ぶれが激し過ぎて見れたもんじゃない(-_-; まぁ、画面も見ずに胸元にささげながら歩き回っていたせいなんだけど。

しかしこの手の問題をかかえているのは私だけであるはずがない、ということで適当にぐぐってみる。ツール自体はすぐに見付かった。

早速ダウンロード、インストール、実行でファイルを開こうとしてみる。……MOVは食ってくれないらしい。

そこで、MOVをAVIに変換するツールを探してみる。……多過ぎて、どれを選んでいいかわからねぇ。とりあえず、

を入れてみたけど、2010年現在だと何を入れるのが適当なんだろーか?

で、適当に1個変換してみるかー、と思って起動してみる。……なんかCODECがいっぱいあって、またしてもどれを選んでいいかわかんねーよ!! まぁ、コンテナの載せ替えができればいいんじゃないかと思って、ビデオをx264、オーディオをaacにしてみる。

……なんか一所懸命変換してるっぽいんですけど。*1
……VirtualDubで開こうとすると、そんなCODEC知らんと言われるんですけど。

よくわからんので、デフォルトになってた xvid + mp3 で変換してみると、ようやく VirtualDub が食ってくれた。(何が最適なのか未だにわからん)

ややうんざりしつつ、Deshakerの設定画面を開いてみる。……意味がさっぱりわからねぇ。(この時点で既に挫けつつある) 全くわからんので、参考元のブログ記事そのまんまの値を突っ込んで変換してみる。……CPU(Core2Duo 3GHz)のパフォーマンスメーターが振り切れているにもかかわらず、遅々として進まない。生まれて初めてGPGPUの必要性を体感した瞬間であった。

この辺で心が挫けたので、目的は全く果たされていなかったりする。リベンジするにしても、どこから手を付けるべきかねぇ……。

*1:後から「Original」という選択肢があったことに気付く。が、どっちにしろVirtualDubは食ってくれなさそう

簡単ログイン(ケータイID認証)問題を3行で説明してみる(α版)

普通の人が変更するのは難しいが、悪人がなりすますのは簡単なID/パスワードを、全てのサイトで使い回すのと同じ。

  1. IDの変更は、普通の利用者にとっては難しい。
  2. しかし、悪意のある利用者がなりすますのは簡単。(なことが多い)
  3. しかも、簡単ログイン対応のどのサイトにも同じIDが送信される。

……という理解でOK?

Session Fixation対策

Wicketで、ログイン時にJSESSIONIDの再発行を行おうとしたんだけど、ぐぐってもぐぐってもなかなか情報に行き当たらない。なんとか見付かった「2008-07-27 - okkeyの日記」を参考にキーワードを工夫することで、ようやく「[WICKET-1767] Protection against Session Fixation - ASF JIRA」にたどりついた。

おもいっきりはしょると、Wicket-1.4以降なら「Session#replaceSession()」を呼ぶだけでいい。中身はokkey氏の日記のコードと同じだったりするが:-)

WTP上のTomcat6でH2をデータソースにする

一回できたのに忘れてしまったのでメモ。なお、EclipseにはPleiadesが組み込まれてるものとする。

多分これでいいと思うんだけど、間違ってたら誰か突っ込んでくれ。

WTPで動かすTomcat6に外部のjarを登録する

「Servers」プロジェクトを選択して右クリックメニュー
⇒ 「実行」 ⇒ 「実行の構成」
⇒ 「クラスパス」タブを選択
⇒ 「ユーザー・エントリー」にH2のjarを追加
⇒ 「適用」を押す。

H2をJDBCドライバとして登録する

「Servers」プロジェクトのサーバ定義フォルダ(例えば「ローカル・ホスト の Tomcat v6.0 サーバー-config」)にある「context.xml」を編集する。

の内側に以下を追加。

<Resource name="TestDB"
          auth="Container"
          type="javax.sql.DataSource"
          maxActive ="-1" -- テスト用なので適当 --
          maxIdle="-1" -- 〃 --
          maxWait="-1" -- 〃 --
          username="test_web"
          password="test_web"
          driverClassName="org.h2.Driver"
          url="jdbc:h2:~/workspace/TestDB" />

H2がサーバとして起動している場合は「jdbc:h2:tcp://localhost/~/workspace/TestDB」のように指定する。

Connectionオブジェクトを取ってくる

public class ClassOfSingleton {
    @Resource(name = "TestDB")
    private DataSource ds;
    ...
    void method() {
        Connection conn = null;
        try {
            conn = ds.getConnection();
            ...
        } catch (SQLException e) {
            ...
        } finally {
            try {
                conn.close();
            } catch (SQLException e) {
                ...
            }
        }
        ...
    }
}