binay diary このページをアンテナに追加 RSSフィード

2009-08-29

[]javazip作成 16:54 javaでzip作成を含むブックマーク javaでzip作成のブックマークコメント

javaディレクトリ以下のzip化してる。不要ファイルが多くなったから、有無を言わさずzip化するため。

文字化け化けだ。ZipOutputStream#getUTF8Bytesとかがprivateで存在するし、外からどうこうしてもどうしようもないのかな。

apacheライブラリで直るみたいだから、後で試す。

import java.io.*;
import java.util.zip.*;

public class Zipper {
    public static void main(String[] args) {
        if (args.length < 1) {
            System.out.println("usage: - path");
            return;
        }
        new Zipper(args);
    }
    public Zipper(String[] args) {
        ZipOutputStream zipStream = null;
        try {
            File root = new File(args[0]);
            File zip  = new File(root.getName() + ".zip");
            zipStream = new ZipOutputStream(
                new BufferedOutputStream(new FileOutputStream(zip)));
            directory(root , zipStream);
            zipStream.finish();
        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            try {
                zipStream.close();
            } catch(Exception ignore) {}
            
        }
    }
    void directory(File file, ZipOutputStream zip) throws IOException {
        for (File f : file.listFiles()) {
            if (f.isDirectory()) {
                createDirEntry(f, zip);
                directory(f, zip);
            } else if (f.isFile()) {
                file(f, zip);
            }
        }
    }
    void file(File file, ZipOutputStream zip) throws IOException {
        ZipEntry entry = new ZipEntry(file.getName());
        BufferedInputStream stream =
            new BufferedInputStream(new FileInputStream(file));
        zip.putNextEntry(entry);
        int i;
        while((i = stream.read()) != -1) {
            zip.write((byte)i);
        }
        stream.close();
        zip.closeEntry();
    }
    void createDirEntry(File file, ZipOutputStream zip) throws IOException  {
        ZipEntry entry = new ZipEntry(file.getName() + "/");
        entry.setSize(0);
        entry.setCrc(0);
        zip.putNextEntry(entry);
        zip.closeEntry();
    }
}

引数でどこのディレクトリzipにしたいか指定する。

やったことないけど、rubyとかならあっさり出来そうだ。

2009-07-02 Fireofoxのファイルアップロードでロック このエントリーを含むブックマーク このエントリーのブックマークコメント

Firefoxアップロードしらファイルがなんだかロックされて困った。

Excelが吐き出したファイルをFirefoxに手動でアップロードするだけの簡単なお仕事なのに、吐き出しに失敗してしまう。

原因はまぁ、Firefoxが掴んでるからなのだけど、何が掴んでいたかというとfirebugsだった。こいつでアップロードしたファイルがちゃんと画面に反映されるかを見られるようにブレークポイントとかはっていたのがまずかったみたいだ。

firebugsを落としたら治った。

2008-09-23

[]既存クラスにフィールド追加ではまり中。 22:37 既存クラスにフィールド追加ではまり中。を含むブックマーク 既存クラスにフィールド追加ではまり中。のブックマークコメント

こんなクラスを作っておく。

class Hoge {
    String hoge = "hoge";
}

これをこんな感じで呼び出してみる。

public class AddFieldTest {
    public static void main(String args[]) {
        Hoge hoge = new Hoge() {
            String foo = "foo";
        };
    }
}

ここまでは、コンパイルおk。問題ない。

まぁ、こんな書き方、普通のクラスに出来るとは知らなかった事が問題か。

ここで作ったfooにアクセス

public class AddFieldTest {
    public static void main(String args[]) {
        Hoge hoge = new Hoge() {
            String foo = "foo";
        };
        System.out.println(hoge.foo);
    }
}

こうすると、コンパイルエラー。

AddFieldTest.java:12: シンボルを見つけられません。
シンボル: 変数 foo
場所 : Hoge の クラス
System.out.println(hoge.foo); エラー 1 個

らしい。

どうなってるのかわからないけど、全フィールドを拾えば解る筈。

        Hoge hoge = new Hoge() {
            String foo = "foo";
        };

        Class clazz = hoge.getClass();
        Field[] fields = clazz.getDeclaredFields();

        for (Field field : fields) {
            System.out.println(field.getName());
        }

これの実行結果がこれ。

C:\Hoge\Hoge>java AddFieldTest
foo

hogeが消えとる・・・。

フィールドの上書きが起こるのだろうか?
もっかい書き換えて確認。

        Hoge hoge = new Hoge() {
            String foo = "foo";
        };
        Class clazz = hoge.getClass();
        Field[] fields = clazz.getDeclaredFields();

        System.out.println(fields.length);

        for (Field field : fields) {
            System.out.println(field.getName());
        }
        
        System.out.println(hoge.hoge);

hogeが死んでいれば、何らかのアクションがあるかと期待。

C:\Hoge\Hoge>java AddFieldTest
foo
hoge

普通に出た。

じゃあ、こうしてみる。

        System.out.println(hoge.hoge);
        System.out.println(fields.length);
C:\Hoge\Hoge>java AddFieldTest
foo
hoge
1

当たり前の様に、1と出た。

全く解らないので、どうなっているのか仮定をして想像。

仮定としては、「newしたタイミングでフィールドの追加をすると、どれかがSuperクラスになっている」という物。

だから、こんな感じのコードで検証。

import java.lang.reflect.*;

class Foo2 {
    String foo = "foo";
}

class Hoge2 extends Foo2 {
    String hoge = "hoge";
}
public class AddFieldTest2 {
    public static void main(String args[]) {
        Hoge2 hoge = new Hoge2() ;
        Class clazz = hoge.getClass();
        Field[] fields = clazz.getDeclaredFields();

        System.out.println("length is " + fields.length);

        for (Field field : fields) {
            System.out.println("for are " + field.getName());
        }
        
        System.out.println("Super:foo is " + hoge.foo);
    }
}

ほぼ同じコードではあるけれど、さっきのHogeクラスにFooを継承している。

実行結果は

C:\Hoge\Hoge>java AddFieldTest2
length is 1
for are hoge
Super:foo is foo

こんな感じ。さっきと同じだ。

そっくりな挙動だけど、宣言以降でもSuperのフィールドは読めるから上のコードとは異なる挙動だ。
最初は全然違う事処理を書いてたのに、この挙動にはまってしまった。
何なんだろうなぁ。

2008-09-09

[]テストコードの処理時間計測 23:03 テストコードの処理時間計測を含むブックマーク テストコードの処理時間計測のブックマークコメント

Google Chromeは速くないって - umitanuki日記で、処理時間を計測したコードを見ていて、エントリの要旨ではないけどalertが何回も出てきているのが気になった。

ちょっと、書き換え。

timeって関数を変えてcheckにした。

function check(f){
  return function() {
    var start = new Date().getTime();
    f();
    alert(new Date().getTime() - start);
  }
}

こんな感じ。

で、onclickで呼び出される方を

var test1 = check(function() {
  var n = 1000000;
  var res = 0;
  for (var i = 0; i < n; i++) {
    res *= (i + 1);
  }
});

と変えてやるとalertが減った。

エントリの要旨ではないので、どうでもいいのだろうと思いつつも気になったので。

2008-08-29

[] 文字列からオブジェクトを作成 15:37  文字列からオブジェクトを作成を含むブックマーク  文字列からオブジェクトを作成のブックマークコメント

class Hoge {
    String hoge = "hogehoge";
}

こんなクラスがあったとして、"Hoge"って文字列からHogeクラスのオブジェクトを作成する。

public class Foo {
    public static void main(String[] args) {
        Hoge hoge = null;
        try {
            Class clazz = Class.forName("Hoge");
            hoge = (Hoge) clazz.newInstance();
        } catch(ClassNotFoundException e) {
            e.printStackTrace();
        } catch(InstantiationException e) {
            e.printStackTrace();
        } catch(IllegalAccessException e) {
            e.printStackTrace();
        }
        System.out.println(hoge.hoge);
    }
}

実行結果は

hogehoge

おk。ちゃんとインスタンス化してくれて、フィールドをみてる。

こうすればクラス名をXMLとかに外だししてフレームワークが作れるのだな〜。知らなかった。