2011年4月29日金曜日

javadocのdocletをEclipceで作る

自分用のメモだけど、javadocのdocletをちょっと作る機会があったのでメモ。


ここを参考にした
http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/javadoc/doclet/overview.html


Eclipseだと文字エンコードで怒られなくなる。なんでだろ?


・ListClass.java
ソースに含まれるクラスを標準出力へ吐き出してくれる。
パッケージをデフォルト・パッケージにすると実行時に楽みたい

import com.sun.javadoc.*;

public class ListClass {
    public static boolean start(RootDoc root) {
        ClassDoc[] classes = root.classes();
        for (int i = 0; i < classes.length; ++i) {
            System.out.println(classes[i]);
        }
        return true;
    }
}
・プロジェクトの実行の構成を変える メイン・クラス com.sun.tools.javadoc.Main 引数 -docletpath ${workspace_loc:doclet/bin} -doclet MyDoclet -sourcepath ${workspace_loc:対象になるソース} -subpackages パッケージ名 -private 


2011年4月26日火曜日

ByteBufferの速度

ByteBufferはプリミティブな型の数値からbyte配列を簡単につくってくれる。
だけど、ByteBuffer.classの中身を見るとabstractとか使ってたりインスタンス生成したりするので意外とコストがかかる。
なので、自前でビットシフトを使って作ったメソッドを作ってみた。ByteBuffer.classの中身を追った感じは同じ用な考え方で実装してた。
速度を測ってみたら自前でつくったメソッドの方が早く動作した。

・Main.java
ByteBufferと自前でビットシフトをするメソッドで1000000回変換した場合の時間を測定

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {

        final int LOOP = 1000000;
        final int value = 0x12345678;

        ByteBuffer buf = ByteBuffer.allocate(16);
        buf.order(ByteOrder.LITTLE_ENDIAN);
        byte[] dat = new byte[16];

        long s_time = System.nanoTime();

        for (int i = 0; i < LOOP; i++) {
            DataConverter.setValue(dat, 0, value);
            DataConverter.setValue(dat, 3, value);
            DataConverter.setValue(dat, 7, value);
            DataConverter.setValue(dat, 11, value);
        }

        System.out.println("Convertor:" + (System.nanoTime() - s_time) / LOOP);

        for (int i = 0; i < dat.length; i++) {
            System.out.format("%02X ", dat[i]);
        }
        System.out.println();
        System.out.println();

        s_time = System.nanoTime();

        for (int i = 0; i < LOOP; i++) {
            buf.putInt(0, value);
            buf.putInt(3, value);
            buf.putInt(7, value);
            buf.putInt(11, value);
            // byte[] d = buf.array();
        }
        System.out.println("ByteBuffer:" + (System.nanoTime() - s_time) / LOOP);

        byte[] d = buf.array();
        for (int i = 0; i < d.length; i++) {
            System.out.format("%02X ", d[i]);
        }

    }
}
・DataConvertor.java
public final class DataConverter {

    /** int型のバイトサイズ */
    private static final int SIZE_INTEGER = Integer.SIZE / Byte.SIZE;

    /** マスク */
    private static final int MASK = 0xFF;

    public static void setValue(final byte[] dest, final int offset, final int src) {
        for (int i = 0; i < SIZE_INTEGER; i++) {
            dest[offset + i] = (byte)(src >> Byte.SIZE * i & MASK);
        }
    }
}
●結果
Convertor:56
78 56 34 78 56 34 12 78 56 34 12 78 56 34 12 00

ByteBuffer:130
78 56 34 78 56 34 12 78 56 34 12 78 56 34 12 00
どちらも出力の形は一緒になったけど、時間に差が出た。 10回やってみた結果。
cnt = 1
Convertor :  54ns
ByteBuffer: 139ns
cnt = 2
Convertor :  53ns
ByteBuffer: 130ns
cnt = 3
Convertor :  49ns
ByteBuffer: 131ns
cnt = 4
Convertor :  50ns
ByteBuffer: 134ns
cnt = 5
Convertor :  50ns
ByteBuffer: 129ns
cnt = 6
Convertor :  50ns
ByteBuffer: 130ns
cnt = 7
Convertor :  52ns
ByteBuffer: 131ns
cnt = 8
Convertor :  50ns
ByteBuffer: 127ns
cnt = 9
Convertor :  50ns
ByteBuffer: 131ns
cnt = 10
Convertor :  50ns
ByteBuffer: 131ns

2011年4月24日日曜日

JavaのMapの動作

ちょっとJavaでMapの動作について気になったからテストしてみた。
気になったことはMapに同じキーでputしてからgetするとデータはどうなっちゃうのかなって。
結果としては、Mapはあとから同じキーでputされると以前設定されていた内容に上書きしてくれる。
Javadocにもそう書いてあった。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/Map.html#put(K, V)

Map map = new HashMap();

map.put(1, "1st");
map.put(2, "2nd");
map.put(3, "3rd");
map.put(4, "4th");
map.put(5, "5th");
map.put(6, "6th");
map.put(1, "いち");


for (int i = 1; i <= 6; i++) 
{
      System.out.println(map.get(i)); 
}  

2011年4月23日土曜日

Javaのコールバック

abstractでextendsしたクラスへのコールバック?と、interfaceを使ったコールバックだとabstractの方が早い。
Core-i5で5倍ほど差が出た。
多分Android上だともっと差がでるんだろうかな。




・AbstractThread.java
public abstract class AbstractThread extends Thread implements Runnable {

    abstract public void run();

}

・CallbackThread.java
public class CallbackThread extends Thread implements Runnable {

    public interface CallBack {
        void onCallback(int value);
    }

    private CallBack lis;

    void setCallBack(CallBack listener) {
        this.lis = listener;
    }

    @Override
    public void run() {

        long startTime = System.nanoTime();
        for (int i = 0; i < Main.LOOP; i++) {
            if (lis != null) {
                lis.onCallback(i);
            }
        }

        long procTime = System.nanoTime() - startTime;
        System.out.println("Callback:" + procTime / Main.LOOP + "[ns]");

    }

}
・Main.java
public class Main {

    public static void main(String[] args) {

        CallbackThread thread = new CallbackThread();

        CallbackThread.CallBack call = new CallBack() {

            @Override
            public void onCallback(int value) {
                // System.out.println(value);
            }
        };

        thread.setCallBack(call);
        thread.start();

        AbstractThread athread = new AbstractThread() {

            @Override
            public void run() {
                long startTime = System.nanoTime();
                for (int i = 0; i < LOOP; i++) {
                    // System.out.println(i);
                }

                long procTime = System.nanoTime() - startTime;
                System.out.println("Abstract:" + procTime / LOOP + "[ns]");
            }
        };
        athread.start();
    }
}

2011年4月12日火曜日

XOOMとOptimus Padを触ってみた

Optimus Padを買いました。
そしたら後輩がXOOMを買いました。

なので、ちょっと触って比べてみた。

・大きさ
XOOMは画面が10.1インチでOptimus Padは8.9インチ。
ただし、寸法的にはXOOMが幅で1センチほど大きいだけ。
大きさとしてはほぼ同じくらいに感じました。
それでも、XOOMはOptimusよりもでかい画面なので、画面周りの枠が細かったです。

・画面
そのサイズの違う画面。
輝度としてはXOOMの方が少し暗い感じ。画面サイズが大きい分でしょうか?
発色としては好みが分かれそうな感じ。
XOOMは少し淡い感じで、Optimusは色がきつい感じな印象でした。

・キーボード
XOOMとOptimus Padでなぜかキーボードの挙動が違いました。
XOOMは入力切り替えに表示される文字が英字キーボード表示時と、数字キーボード表示時は同じだったのですが、
Optimus Padは数字キーボード表示時に半角/全角で選べるようになりました。
見た目は同じなのですが、中身がちょっと違って意外です。どっちが新しいんだ?

・雑感
お昼休みとラーメン屋でちょっと比べただけなのであまり詳しくは観ていないのですが、
ほぼ同じといった印象。
重さで選ぶなら、Optimus。画面の大きさで選ぶならXOOM。
初期出資が少ないのを選ぶならOptimus。維持費で選ぶならXOOM。
といった感じでしょうか。
今度もうちょっと詳しく比べてみようかと思います。

2011年4月8日金曜日

通知バーを消したり出したりする

通知バーを出したり消したりする方法
忘れないようにメモ

//消す場合
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

//出す場合
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);