2012年2月25日土曜日

java : ジェネリクス型の引数を持つメソッドをinvoke

例えば、javaで「public void testMethod(List arg)」をリフレクションで呼ぶときどうすればいいのでしょう? それなりに検索したけど出てきませんでした。 C#のリフレクションならすぐに見つかるんですけどねぇ。 で、適当にやったら「定義したクラス.getMethod("testMethod", List.class)」で呼べることが判明。 ジェネリクスの部分を省略すればいいようです。

試したコードはこちら。

2012年2月17日金曜日

java : Look&feelの設定でGUI全体のフォントサイズを変更

だいぶ前のコードを漁っていたら、Look&feelの設定を変えてGUI全体のフォントサイズを指定する方法が見つかりました。

import java.awt.Component;
import javax.swing.JComponent;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;

public class UiCustomizer
{
    public static void setFontSize(final int fontSize)
    {
        UIDefaults defaultTable = UIManager.getLookAndFeelDefaults();
        for(Object o: defaultTable.keySet() )
        {
            if(o.toString().toLowerCase().endsWith("font") )
            {
                FontUIResource font = (FontUIResource)UIManager.get(o);
                font = new FontUIResource(font.getName(), font.getStyle(), fontSize);
                UIManager.put(o, font);
            }
        }
    }

    public static void setScrollBarWidth(final int width)
    {
        UIManager.put("ScrollBar.width", width);
    }

    public static void updateUiAll(JComponent component)
    {
        for(Component child : component.getComponents() )
        {
            if(child instanceof JComponent)
            {
                JComponent updateComp = (JComponent)child;
                updateComp.updateUI();
                updateUiAll(updateComp);
            }
        }
    }
}

2012年2月13日月曜日

RLtrapは防がれているようだけど?

恥ずかしながら、この記事を見て初めてRLtrapの存在を知りました。

アダルトサイト詐欺6億円 エスカレートする手口

RLtrapの説明はこちら。

INTERNET Watch - Unicodeの制御文字を使いファイル名偽装、ウイルス「RLTrap」検出報告5万件

防ぎ方はこちらにあります。

float32の日記: これで安心してXPHomeが使えるのでAC

う~ん、これを見ると、ずいぶん前からあったもののようですね。

2012年2月12日日曜日

java : SQLiteJDBCのSQLException

javaで次のSQLiteJDBCを使ったときの話。

このSQLiteJDBCを使っていて発生したSQLExceptionは次のようになります。

  • getErrorCode → 0
  • getSQLState → null
  • getMessage → [例外の種類] 種類ごとの文 (詳細)

「例外の種類」というのはSQLiteJDBCのorg.sqlite.SQLiteErrorCode列挙体の文字列表現が入るようです。 SQLiteErrorCodeについてはSQLiteJDBCのjavadocに書いてあります。

ErrorCodeやSQLStateはないのでMessageの文字列を見てふるい分けをしなければなりません。

java : SQLiteのselectを途中で止める

前のネタでSQLite + SQLiteJDBCでは重いselect文を実行してしまったときにStatement.cancelメソッドが効かず、途中で止められないことが判明しました。

しかし今回使っているSQLiteJDBCではユーザー定義関数を作ることができます。

これをうまく使えばselectの途中で例外を投げてクエリーを止めることができます。 というわけでこんなクラスを作ってみました。

2012年2月11日土曜日

java : SQLiteではStatement.cancelが効かない

jdkのドキュメントを見ると、Statement.cancelメソッドで実行中のSQL文を停止できるようです。 ただし、apiリファレンスには「DBMSおよびドライバの両方がSQL文の終了をサポートする場合に、このStatementオブジェクトを取り消します。」との記述があります。 サポートしていない場合はSQLFeatureNotSupportedExceptionが投げられる模様。

SQLite + SQLiteJDBCでcancelができるか試してみました。 SQLiteJDBCの入手先は、

試したコードはこんな感じです。 まずはデータベースを扱うクラス。 Statement.cancelメソッドは別スレッドから停止させるためのものなので、Runnableを実装しています。 メインスレッド以外にデータベース処理用のスレッドを作り、selectが動いたらメインスレッドから停止させます。

2012年2月10日金曜日

java : SQLiteのユーザー定義関数の例(order by用の乱数)

前回の投稿でSQLiteにjdbcで接続したときにユーザー定義関数を使う方法について書きました。 今回はユーザー定義関数の簡単な例を投稿します。 ネタはorder byで使うことを念頭に置いた、乱数を返す関数です。

2012年2月9日木曜日

java : SQLiteにjdbcで接続してユーザー定義関数を使う

SQLiteにはsqlite3_create_functionなどの関数があり、ユーザー定義関数が登録できるようになっています。 ユーザー定義関数というのは、

select count(id) from テーブル

のcountに当たるようなsql文で使う関数を自作したものです。 count等の元からある関数の置き換えもできるとか。

これは↓のjdbcドライバを使えばjavaでも可能です。

SQLiteJDBCはネイティブで書かれた各環境向けのSQLite本体をjarファイル内に持っていて、それに対してjniでアクセス、jdbcドライバとして動作するようにしたものです。 sqlite3_create_functionの部分もラッピングされています。

最近PCのファンが自己主張を始める

最近、昨年7月に買ったPCから変な音が出るようになりました。 音量は「PCから出る」って事でそれなりですが、車のアイドリングのような音です。 どっかのファンの軸がホコリでズレたとかかな?

起動後しばらくはアイドリング音。 気がついたころにはおさまって、「え? なんかの弾みで直った?」と思ったら次の起動時もアイドリング音。

「ガワを開けて掃除するのは年に1度で言いかなぁ?」とかって思ってたんですが、今ちゃんと確認しといた方が良さそうですね。 ってことで電源コードを外してガワオープン。

...ホコリが。

2012年2月6日月曜日

Virtual Boxで仮想HDDイメージサイズの拡張とUbuntuディストリビューションのアップデート

久しぶりにVirtualBoxを立ち上げたらアップデートが出てました。 VirtualBox本体のアップデートをした後、バーチャルのUbuntuを立ち上げたらこちらはディストリビューションのアップデートがあるとか。 面倒くさいと思いつつ、この機会にアップデートしてみました。 するとHDDの空き容量が足りないとのメッセージが。 「最近Ubuntu使ってないんだよなぁ」とちょっと迷って、惰性で仮想HDDイメージサイズの拡張 → ディストリビューションのアップデートをやりました。

手順は間違っていたっぽいけど最終的にOKな状況になりました。 そしてやはり面倒くさかった...

java : sqliteに登録した画像をHttpServerで送信

sqliteに画像を登録して、com.sun.net.httpserver.HttpServerで送信、ブラウザで画像を見る簡単なサンプルプログラムを作りました。 sqliteにはjdbcで接続。 jdbcはこちらで配布しているものを使いました。

以前の投稿をふまえて、

作ったら大体こんな感じになりました。

「test0~2.png」の画像ファイルをclassと同じディレクトリに用意してコマンドプロンプトで実行。 sqliteに画像を登録した後、HttpServerが動きます。 コマンドプロンプトの表示は「なんたらかんたら ... Push enter to stop.」となって待機。 ブラウザで「http://localhost/」にアクセスすると「画像選択アンカー」のついたhtmlが表示されます。 アンカークリックで画像の切り替え。 画像はsqliteからselectして送信です。 uriの受け取り方が適当なので、適当なコンテキストにアクセスすると表示が崩れます。 雑なサンプルコードということでlocalhostから接続されたときしか反応しないようにしました。 コマンドプロンプトでenterキーを押したらサーバの停止です。

コードはこんな感じ。

2012年2月3日金曜日

wpf : 画像ファイルをロックせずにBitmapSourceを読み込む

wpfでローカルの画像ファイルを読み込むときの話。 BitmapFrameを使うと次のようになります。

try
{
    // xamlでImageを記述 → imgLock
    imgLock.Source = BitmapFrame.Create(new Uri(path, UriKind.Absolute));
}
catch (Exception exc)
{
    // thisはMainWindow
    MessageBox.Show(this, "[" + exc.Message + "]\n" + exc.StackTrace, this.Title);
}

このやり方だと画像ファイルはロックされてしまい、更新、移動、削除ができません。 ロックされないようにするには次のように書きます。

2012年2月1日水曜日

java : 実行ファイルのディレクトリ

実行ファイルのディレクトリってC#(.net framework)なら

FileInfo fileInfo = new FileInfo(Environment.GetCommandLineArgs()[0]);
string dir = fileInfo.Directory.FullName;

で簡単に取れますよね。

javaだと「OSの違い」とか「jarパッケージかclassか」とかでもう少し長いコードが必要なようです。

java : sqlite + jdbcでテータベースアタッチのサンプル

前の投稿で「アタッチがアトミックでどうこう」って書いたので、一応アタッチの小さなサンプルコードを書きました。 アトミックかどうかはノータッチで。

jdbcはこちらで配布しているものを使いました。

以下コード。