SAStrutsのフォワード用URLにどうしても"."を入れたい場合

SAStrutsで別のアクションにフォワードする場合、URLにクエリーを付けることもできますが*1、こういうURLだと動作しませんでした。

return "/foo?num=1234.56";

理由は、org.seasar.struts.config.S2ActionMapping#createForward(String, boolean)で、"."が含まれるURLはJSPと見なされて、頭に"/WEB-INF/view"が付いたURLに変換されるため。

S2ActionMappingをそのまま使う場合は、以下の方法で回避可能。

対策1. "."を"%2e"に置換する。

URLデコード不要で特に問題なく使えました。

対策2. requestのParameterMapに項目追加。

SAStrutsで管理されてるrequestのgetParameterMap()は変更可能なようなので、クエリーの代わりにパラメータをput。
パラメータをログ出力するのとかは面倒。

対策3. Struts形式のURLにして":"を含める。

":"があるとURLが一切変換されなくなるので、自前でS2ActionMapping#createRoutingPath(String)を呼んでURLを変換した後、クエリーとかフラグメントとして適当に":"を追加。
動くけど汚い。

対策4. 適当な文字に置換して、フォワード先で戻す。

対策1で十分。

結論

なるべくなら、ちゃんとActionFormでなんとかした方が良さそう。
どうしようもないときは1か2で。

*1:ちゃんとフォワード先でparameterMapにも格納されてる

QNAP TS-659にTwonky Media Serverを入れる

PS3からDLNAで音楽を再生する場合に、PS3 Media Serverを使う場合、FLACのトランスエンコーディングは問題ないのですが、ファイル単位かディレクトリ単位での再生しかできず、あまりに使い勝手が悪いので、メタデータを解釈してくれるTwonky Media Serverを導入しました。

1.Twonky Media Serverを導入

大まかには以下のような手順。

  1. UPnP Media Serverを無効にする
  2. TwonkyMedia 6のQPKGをインストール&有効化
  3. flacのトランスエンコーディング設定
    1. ipkg install flac
    2. /share/MD0_DATA/.qpkg/TwonkyMedia/cgi-bin/flac-wav.desc を編集
    3. rm /share/MD0_DATA/.qpkg/TwonkyMedia/cgi-bin/flac.location
  4. TwonkyServer再起動

トランスエンコーディング設定は PS3 + FLAC solution? - QNAP NAS Community Forum を参照。
flac.locationの中身を/opt/binに変えるだけで動作しました。

成功すればhttp://サーバーアドレス:9000/ で参照できます。
ただし、コンテンツディレクトリの再スキャンやDB再構築を行っても、メタデータが正しく読み込まれない不具合が発生。
どうも、FLACにID3v2タグを使っているのが良くなかった模様

2. ID3v2タグの削除

Removing id3 tags from .flac files - robinbowes.comにあるように、ipkgでid3v2をインストールして、下のコマンドをsshコンソール上から実行すればOK。

find . -name "*.flac" -exec id3v2 --delete-all {} \;

ただし、id3v2をインストールしてそのまま使うと、以下のエラーが発生

# id3v2 --help
id3v2: error while loading shared libraries: libid3-3.8.so.3: cannot open shared object file: No such file or directory

ipkgでインストールされる共有ライブラリの配置先は /opt/lib ですが、これが /etc/ld.so.conf に記載されていないのが原因の模様。
/etc/ld.so.conf を修正して、共有ライブラリキャッシュを再構築することで解決。

# echo "/opt/lib" >> /etc/ld.so.conf
# /sbin/ldconfig
# id3v2 --help
Usage: id3v2 [OPTION]... [FILE]...
...(以下略)...

これで、ID3v2コマンドが使えるようになりましたが、標準のbusybox v1.01だとfindのexecオプションが使えないため、ipkgでbusyboxを入れてfindのシンボリックリンクを張り替える作業も必要です。

これで、コマンド実行後、FLACメタデータが正しく反映されるようになりました。

2012-02-18追記:

ファームウェア 3.6.0 で、UPnP Media Serverが Twonky 6.0.38 になりましたが、相変わらずトランスコーディング出来ないようです。


QPKGの方を6.0.38にバージョンアップしたら動作しなくなりました。
一時期DLNAクライアントでWAVファイルの再生が出来なかったので、その辺に問題があったのかも?
再設定手順は、いったんQPKG版をアンインストールしたのち、上記手順の通りにしました(flac.locationの修正で対応)

ランダム抽出

親テーブルのデータに関連する子テーブルのデータから一件ランダム抽出して表示する場合

SELECT
  x,
  (SELECT y FROM test_b WHERE test_a.x = test_b.x ORDER BY RANDOM() LIMIT 1) AS y
FROM
  test_a;

でも出来るけど、親の件数分サブクエリが実行されてしまい、コストが予想外にでかくなるので

SELECT DISTINCT ON (x)
  x, y
FROM (
  SELECT
    x, y, RANDOM() AS r
  FROM
    test_a JOIN test_b USING (x)
  ORDER BY
    x, r
) AS a

の方が良さげ

QNAP TS-239へのWordpress 3.1インストール

ほぼhttp://www.qnap.com/jp/pro_application.asp?ap_id=206のとおりです。
TS-239のファームウェアは3.4.1を使用しています。

MySQLサーバーの用意

  1. phpMyAdmin QPKGのインストール
  2. Web Serverを有効にする。
  3. MySQL Serverを有効にする
  4. ブラウザでhttp://NAS-IP-Adress/phpMyAdmin/ *1にアクセス
  5. root/adminでログイン
  6. wordpress用のデータベース(e.g. wordpress)を作成
    1. 照合順序は utf8-unicode-ci
  7. wordpress用のユーザー(e.g. wordpress)を作成し、wordpressデータベースの権限を設定
    1. Grant all privileges on database "wordpress"を選択すれば、良いようにやってくれます。

ipkg info mysql5 も確認してみたんですが、バージョン5.0.88-1で、デフォルトのMySQL(Ver 14.14 Distrib 5.1.36, /usr/local/mysql/bin/mysql --versionで確認)より低かったので、特に弄ってません。

Wordpress QPKGのインストール

とりあえずQPKGをインストールし、QPKG InstalledタブのWordpressアイコンをクリックして、Installation PathとWeb Pageの内容を確認してください。
ついでに、Web Pageを表示してインストール用の画面が出ることも確認。

Wordpress日本語版への差し替え

日本語 — WordPressから最新版(今回は3.1-ja)のtarボールを落としてきて、差し替えます。
一応QPKG版のアクセス制限を確認しておいてください。
少なくともグループの書き込み権限がないと面倒くさそうです。(インストール時にconfファイル作成に失敗する。)

# cd /tmp
# wget http://ja.wordpress.org/wordpress-3.1-ja.tar.gz
# tar -zvf wordpress-3.1-ja.tar.gz
# rf -rm /share/Qweb/wordpress
# mv wordpress /share/Qweb/
# chown -R admin:administrators /share/Qweb/wordpress
# chmod -R g+w /share/Qweb/wordpress

Wordpressのインストール

http://NAS-IP-Adress/wordpress/ にアクセスして、DB情報とユーザー情報等を設定したら完了。

考察

確認しなかったけど、Wordpress QPKGって要らないような気もする…。どうなんだろう?

*1:QPKG PluginsのQPKG InstalledタブのphpMyAdminのアイコンからリンクの確認ができます。

Windowsへのgitのインストール

今更ですが備忘録として、以前の職場で使っていた時の内容をまとめ

msysgitをインストールする

http://code.google.com/p/msysgit/ から実行ファイル(2011-03-21現在だと、Git-1.7.4-preview20110204.exe)をダウンロードして実行。
この際に、「Use a TrueType font in all console windows (not only for Git Bash)」はオフにした方が良いです。

オンにした場合、コマンドプロンプト全般でフォントが変わります。
msysGitをインストールしたらコマンドプロンプトが文字化け - Silent Powerを参照。

msysgitの多言語対応(任意)

WindowsでのGit環境構築とその注意点 | OSDN Magazineを参照し、下記のようにコマンドを置換する。

  1. Downloading lessからWindows用のバイナリ(2011-03-21時点では、less436w.zip)を取得。
  2. less436w.zipを解凍し、中のless.exeを _Gitインストール先_\bin に上書きする
  3. http://www.asuka.cx/software/nkf/からnkf-2.0.8b.bin.tar.gzを取得。
  4. nkf-2.0.8b.bin.tar.gz を解凍し、中のnkf.exeを _Gitインストール先_\bin に移動する
  5. _Gitインストール先_\etc\gitconfig ファイルを以下のように修正。
    1. [core]セクションに、以下を追加

pager = nkf -s | less

Gitの環境設定

Git bashを起動し、以下を設定。

$ git config --global user.name "自分のユーザー名"
$ git config --global user.email "自分のメールアドレス"
$ git config --global color.ui auto

TortoiseGitをインストールする

TortoiseGitの設定

コンテキストメニューから、[TortoiseGit] - [Settings] を選択し、以下を設定。

  • [External Programs] - [Diff Viewer] に WinMergeを指定する場合、以下のように入力

C:\Program Files\WinMerge\WinMergeU.exe /e /x /ub -dl %bname -dr
%yname %base %mine

  • [External Programs] - [Diff Viewer] に WinMergeを指定する場合、以下のように入力

C:\Program Files\WinMerge\WinMergeU.exe %merged

  • TortoiseGitを入れたら重くなった場合、[Icon Overlays]で制限をする
    • [Status Cache]を"None"に変更
    • [Drive Type]を全てOFFにする
    • [Include Paths]に、作業ディレクトリを指定する。(例:c:\path\to\git\*)

ツリーハウスのルール

アクション

原則:
  • アクションの前と後で形が変わること。
    • 同じ場所にHOPや、AIMで向きを変えない等は禁止
  • 他のピラミッドに被ったら立たせること。
TIP
  • 立っている or スタックしているピラミッドを倒す。
  • どっちに倒してもOK。
  • スタックを倒した場合、スタックすべてを重なっている順にばらす。
    • 部分的に倒すことは不可。
HOP
  • 立っている or スタックしているピラミッドを、他のピラミッドの横か上に移動する。
  • スタックはそのまま移動できる。
  • スタート状態のように3つスタックしている場合、1番上の1つだけか、2番目までのスタックで移動する
    • 他のピラミッドの横に置く必要があるので。
  • 上からの移動だから、入れ子の場合は1番上だけなのかも?
    • 大 -> 中 ->小 の入れ子だったら大だけとか、中 -> 大 -> 小 なら中または中 -> 大とか…。
SWAP
  • 任意の2つのピラミッドを入れ替える。
  • ピラミッドの状態は、そのまま引き継ぐ。
    • ただし、SWAPでスタックか入れ子になった場合は、元の状態を無視する
  • スタック単位での入れ替えは不可。
    • 小 -> 中 -> 大 から 中 -> 大 -> 小 は不可。
    • 小 -> 中, 大 から 大, 小 -> 中 は不可
  • 立っていても寝ていてもOK
AIM
  • スタック・入れ子でないピラミッド1つの向きを変える。
  • 立っていても寝ていてもOK
DIG
  • 寝ているピラミッドを、他のピラミッドの横か下に移動する。
  • 移動したピラミッドは立たせる。
  • 対象のピラミッドの先端方向にのみ移動可能。(バック不可)
WILD

他のアクションのどれか1つを実行