そいえばCommons

http://d.hatena.ne.jp/t_yano/20080506/1210077794
を読んで、あまり関係ないところに反応してみる。

Apache Commons使わなくなったなあ。昔は社内向けにそんなん何度も書かないでつかえ!とか思ってJavaDoc翻訳とかしてまで布教してたのだけれど。

最近では、Velocityのバージョンを1.5に上げたらCommons-langへの依存が増えてて、ああ、langいれるのやだなあとか思ったりしてしまう。入れてると使うやつでるじゃんとか。

で、何で使わなくなったのかなあとか考えてみると、まあ昔から思ってはいたのだけれと、JavaAPI以上にあれ、センスないですよね?かっこわるくて気持ち悪いところが結構ある。

あともう古い。1.5対応されててもうちっとセンスのいいCommonsチックな何かがあればとか思いながら日がなも自分ライブラリを車輪の再発明をする日々をおくったりするわけです。だめじゃん。

SQLServer 2005 のテーブルのコメントをJDBC経由で取得するSQL

DatabaseMetaData経由だとテーブルコメント(説明ってやつ)がとれんのよね。ということで。

テーブル

SELECT
  t.name AS TABLE_NAME,
  CAST(e.value AS varchar) AS COMMENT
FROM
  sys.tables t
INNER JOIN sys.extended_properties e ON
  t.object_id = e.major_id AND
  e.minor_id = 0

カラムはこう

SELECT
  t.name        AS TABLE_NAME,
  c.name        AS COLUMN_NAME,
  p.name        AS TYPE_NAME,
  c.max_length  AS MAX_LENGTH,
  c.is_nullable AS NULLABLE,
  c.precision   AS PRECISION,
  c.scale       AS SCALE,
  CAST(e.value AS varchar) AS COMMENT
FROM
  sys.tables t
INNER JOIN sys.columns c ON t.object_id = c.object_id
INNER JOIN sys.types   p ON 
  c.system_type_id = p.system_type_id AND
  c.user_type_id = p.user_type_id
INNER JOIN sys.extended_properties e ON
  c.object_id = e.major_id AND
  c.column_id = e.minor_id
WHERE
  t.name = 'テーブル名'

ちくしょう、variantてなんだよ、爆発しろ!ってとこではまった。
追記:キャストが必要なのは sys.extended_properties だけやね。
MSの世界はわからんぜい。MSDNとか見たくねえ><

Wicket自分用メモ

出力結果からwicket:idを消す

getMarkupSettings().setStripWicketTags(true);

ログアウト

add(new Link("logout"){
    public void onClick(){
        getSession().invalidate();
        setResponsePage(getApplication().getHomePage());
    }
});

HTMLのアトリビュート値書き換え

item.add(new SimpleAttributeModifier("class", "menu-on"));

スタイルシートの参照パスをコンテキストパス足して書き換え

WebApplication application = (WebApplication)getApplication();
final String contextPath = application.getServletContext().getContextPath();
WebComponent cssLink = new WebComponent("cssLink"){
    @Override
    protected void onComponentTag(ComponentTag tag) {
        super.onComponentTag(tag);
        String cssHref = tag.getAttributes().getString("href");
        tag.getAttributes().put("href", contextPath + "/" + cssHref);
    }
};
add(cssLink);

もっと良い方法ありそう

add(new StyleSheetReference("cssLink", MyPage.class, "myPage.css"));

CSSの定義ならこうやね。


あとHTMLコメント内は処理されない。

MySQLサヨナラ><

technobahn.com - このウェブサイトは販売用です! - 株価検索 株価チャート 株価 銘柄 終値 リソースおよび情報

動向は生暖かく見守るとしても、私的にもう選択肢としてMySQLは無いな・・・

追記:突き抜けちゃった内容だと思ってたけどミスリーディングな記事だったみたい。まあ見守る。

で、なんでGenericsかというと

今でもちょっとしたDBアクセスとかにApache Commons DbUtilを使うのだけれど、これが嫌。

String sql = "SELECT * FROM person WHERE age=? AND sex=?";
QueryRunner r = new QueryRunner(dataSource);
//ここきもい
Object[] p = new Object[]{new Integer(18),"female"};
//キャストめんどい
Person = (Person)r.query(sql,p,new BeanHandler(Person.class));

こういうのほしい。自作するしか?

<T> T query(ResultSetHandler<T>,String sql, Object ... params)
        throws SQLException;

いまさらGenerics

こうですか?!わかりません><

@SuppressWarnings("serial")
static class UpperKeyHashMap extends HashMap<String,Object> {

    public boolean containsKey(Object key) {
        return super.containsKey(key.toString().toUpperCase());
    }

    public Object get(Object key) {
        return super.get(key.toString().toUpperCase());
    }

    public Object put(String key, Object value) {
        return super.put(key.toString().toUpperCase(), value);
    }

    public void putAll(Map<? extends String,? extends Object> map) {
        for(String key : map.keySet()){
            this.put(key, map.get(key));
        }
    }
    public Object remove(Object key) {
        return super.remove(key.toString().toUpperCase());
    }
}

べんりだけど、putAllのとこがキモイ。JavaDoc見ないとわからんわい。