rotatelogs を使う

Tomcatが動くサーバがお亡くなりになったので再構築を行った。
ログのローテーションに rotatelogs を使っているようなのだが、パスに通っていない。
今回壊れなかった方のサーバを見ると、/usr/sbinにあったのでコピってみたが以下のメッセージが出て動かない。

/usr/sbin/rotatelogs: error while loading shared libraries: libaprutil-1.so.0: cannot open shared object file: No such file or directory

暫く悩んだ挙句、yumaprapr-util を入れることで解決。

chromeでoptionのclickをbindしても反応しない

2つのリストを連動させたくて、一方のリストのoptionのclickをbindしていた。
firefoxだと問題なく動いたが、chromeだと動かず。

json.forEach(function(e) {
  jQuery('#リスト1のID').append(
      jQuery('<option />')
        .html(e.name)
        .val(e.id)
        .click(function() {
          jQuery('#リスト2のID').val(e.id2);
        })
    );
});

idをキーに連携させるのならval()でできるが、id2をキーにしたかったのでそのままでは動かない。
そのため、新たに属性をセットして、selectのclickをbindして解決。

json.forEach(function(e) {
 jQuery('#リスト1のID').append(
   jQuery('<option />')
    .html(e.name)
    .val(e.id)
    .attr('id2', e.id2)
  );
});
jQuery('#リスト1のID').click(function() {
 jQuery('#リスト2のID').val(jQuery('#リスト1のID option:selected').attr('id2'));
});

いまさらStrutsのActionFormでハマった

昔過ぎてどうやっていたか忘れていて小一時間ハマったのでメモ

複数のIDを渡したくてListを使ったのだが、なかなかうまく行かなかった。

最初は単純にsetter/getterを用意したが、List#setでIndexOutOfBoundsが発生した。

private List<BigDecimal> ids = new ArrayList<BigDecimal>();
public void getIds() {
  return ids;
}
public void setIds(List<BigDecimal> ids) {
  this.ids = ids;
}

自動的にリストのサイズを拡張するListの実装を作って対処。

public class AutoResizeArrayList<E> extends ArrayList<E> {
  @Override
  public E set(int index, E element) {
    for (int i = size(); i <= index; i++) {
      add(null);
    }
    return super.set(index, element);
  };
  @Override
  public E get(int index) {
    return super.get(index);
  }
}

次に、List#get()でしたものがナゼかStringになってしまう現象に遭遇。
これは、プロパティがセットされる際にgetIds()したリストへset()しているが、その時にStringがセットされていた。
Genericsだとこう可能性はあることは知っていたが、初めて遭遇した)
そこで、setIds(List ids)を削除してsetIds(int index, BigDecimal id)を追加したところ、正しくBigDecimalがセットされた。
ちなみにsetIds(List ids)が残っているとgetIds()が呼ばれてうまくいかない。

Table Sorter のエラーメッセージでハマったのでメモ

TinyTable JavaScript Table Sorter
というjavascriptのライブラリを利用している。
さっき管理ツールにソート機能を追加するために久しぶりに利用して、見事にハマったのでメモ。

TypeError: T$$(...)[0] is undefined
t.h = T$$('thead', T$(e))[0].rows[0];

こんなエラーメッセージが出るんだけど意味がわからず。
以前に利用したときのhtmlと比較したら、/を指定し忘れていた。

PostgreSQLで「ァ」と「ア」を区別せず検索した

とあるシステムで、カナ検索が出来ないという指摘を受けた。
コードを読んでみるとおそらく「フアンタ」のように登録して欲しいところ「ファンタ」と入っていたので、likeじゃ検索出来ていなかった。

で、かなり力技だけど、こんな関数を使って解決しました。

create or replace function to_large_text(text)
returns text
AS ' 
SELECT translate(upper($1) 
,''-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨワヲンァィゥェォャュョヮぁぃぅぇぉゃゅょゎ '' 
,''−0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨワヲンアイウエオヤユヨワあいうえおかやゆよわ ''); 
'
language 'sql';

2013/8/30追記
「ポッカ」とかが変換できていなかったので修正

create or replace function to_large_text(text)
returns text
AS ' 
SELECT translate(upper($1) 
,''-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨワヲンァィゥェォヵヶッャュョヮぁぃぅぇぉゃゅょゎ '' 
,''−0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨワヲンアイウエオカケツヤユヨワあいうえおかやゆよわ ''); 
'
language 'sql';

Jenkinsでsvnからリビジョンを指定してビルドする方法

プラグインとかあるみたいだけど、お手軽にやるためのメモ。

単純に「設定」→「ソースコード管理システム」→「Subversion」のリポジトリURLの末尾に「@<リビジョン番号>」とする。