プログラマメモ2 - programmer no memo2

目次

JFrameが不可視(visible=false)になるときに発生するイベントは何でしょう。 2007/11/29

ある程度コードが大きくなるとなかなか手を入れるのが億劫になりますね。

で、
JFrameが不可視(visible=false)になるときに発生するイベントは何でしょう。
具体的にはsetVisible(false)にしたときに発生するWindowListenerのイベントです。

WINDOW_DEACTIVATED

WindowListenerのwindowDeactivatedが呼ばれます。

JButtonで設定したActionListenerはダブルクリックをクリック2回でイベントを発生するの? 2007/11/28

javaです。

JButtonで設定したActionListenerはダブルクリックをクリック2回でイベントを発生するの?

どうやらそのようですね。
ですので、javax.swing.AbstractButtonには、setMultiClickThreshholdなるものが用意されています。

以下、javadoc1.4からの引用です。

マウスのボタンを押すイベントが対応するアクションイベントを生成するまでに必要な時間をミリ秒単位で設定します。最初にマウスのボタンが押され、アクションイベントが生成されると、しきい値より短い間隔でマウスのボタンが押されることで発生する後続イベントは無視され、これに対するアクションイベントは生成されません。しきい値はデフォルトではゼロであり、どんなに速くマウスのボタンをクリックしても、対応するアクションイベントがトリガされます。たとえばダイアログの [OK] ボタンなどの、このような動作が望ましくないボタンでは、このしきい値に適切な正の数値を設定します。javadoc1.4


次の問題は、この適切な正の値がどれくらいかといことですね。

JListで、配列やVectorをsetListDataした場合には、superがjavax.swing.AbstractListModelの匿名クラスが生成される。 2007/11/28

JListで、配列やVectorをsetListDataした場合には、superがjavax.swing.AbstractListModelの匿名クラスが生成される。

このmodelがJList内部で保持されるものになります。よくWebとかでみかけるサンプルで紹介されるDefaultListModelでないことに注意すること。

javax.swing.DefaultListModelを使うと、remove,addとかのメソッドが用意されているので、
getModelしてモデルの操作が簡単に行えるけど、配列やVectorをsetListDataした場合はgetModelしてもDefaultListModelが返ってこないので、
キャスト例外がおきる。

下記のコードは、java.lang.ClassCastExceptionが発生します。

String[] ss = { "aa", "bb", "cc" };
JList list = new JList(new DefaultListModel());
list.setListData(ss);
DefaultListModel model = (DefaultListModel)list.getModel();
System.out.println(model.getClass());


DefaultListModelに配列とか別のコレクションから作成できる仕組みがあればいいのにと思いましたがどうでしょうか?

html メール友達に知らせるリンク 2007/11/27

リンクでmailto:?body=xxxxxx
でxxxxxxの部分にメールの内容が入るようですね。
gmail使ってるとgmailが動きますね。


<a href="mailto:?body=http://deiji.jp/f/index.html ">友達に知らせる</a>


友達に知らせる

ちょっとした工夫、JListのレンダラー 2007/11/27

javaです。swingです。

JListのリストの見え方を少しだけ変えたい場合、ListCellRendererをごりごり実装するのではなく、デフォルトのレンダラーからコンポーネントを取得してそのコンポーネントを返すと、楽だという話です。

listからgetCellRendererしてデフォルトのレンダラーを取得して、オリジナルのレンダラーにそのデフォルトのレンダラーをもたせてます。

static class MyRenderer implements ListCellRenderer {

ListCellRenderer defaultRenderer;

public MyRenderer(ListCellRenderer defaultRenderer) {
this.defaultRenderer = defaultRenderer;
}

public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {

Component component = this.defaultRenderer
.getListCellRendererComponent(list, value, index,
isSelected, cellHasFocus);

/*
* ここでcomponentに対する操作を行います。
*/

return component;
}
}

ラジオボタンにはlabelタグのforが便利 - safariが対応していない場合 2007/11/26
2007/12/09

Zopeジャンキー日記 :ラジオボタンにはlabelタグのforが便利

わざわざラジオボタンをクリックしないですむのはやはり便利ですね。

safariがこの機能に対応していないようなので、調べたら、javascriptを使用してこの機能を使う方法がありました。

Add Label Click Support to Safari: Chris Cassell Dot Net

コードは下記のような感じです。
※このコードはAdd Label Click Support to Safari: Chris Cassell Dot Netにあったものです。

function init(){
if (navigator.userAgent.indexOf("Safari") > 0) {
var labels = document.getElementsByTagName('label');
for (i=0; i< labels.length; i++) { labels[i].addEventListener("click",addLabelFocus,false); }
}
}

function addLabelFocus(){
var item = document.getElementById(this.getAttribute("for"));
item.focus();
if (item.getAttribute("type") == "text") {
item.value = item.value;
} else if (item.getAttribute("type") == "checkbox") {
if (!item["checked"]) {
item["checked"] = true;
} else {
item["checked"] = false;
}
} else if (item.getAttribute("type") == "radio") {
var allInputs = document.getElementsByTagName("input");
var radios = new Array();
for (i = 0; i < allInputs.length; i++) {
if (allInputs[i].getAttribute("name") == item.getAttribute("name")) {
radios.push(allInputs[i]);
}
}
for (i = 0; i < radios.length; i++) {
if (radios[i]["checked"] && radios[i].getAttribute("id") != item.getAttribute("id")) {
radios[i]["checked"] = false;
}
}
item["checked"] = true;
}
}

poj 2453 - たしかに簡単な問題なのかもしれないが。 2007/11/26

2453 -- An Easy Problem

いろいろビットをさわって解こうとしていましたが、何度かWrongAnswerでした。簡単な問題とはありますが....

で、どうやって解いたかといいますと、ビットカウントとして、与えられた値を1づつカウントアップして、その際に、ビットカウントが一緒なら答えというふうにしました。

static int r(int a){
int cnt_bit = bitCount(a);
int m = a;
while(true){
m += 1;
if(cnt_bit == bitCount(m)) break;
}
return m;
}

static int bitCount(int r){
BigInteger integer = BigInteger.valueOf(r);
return integer.bitCount();
}


javaなので、BigIntegerのbitCountを使用しました。

この BigInteger の 2 の補数表現内の、符号ビットと異なるビットの数を返します。このメソッドは BigInteger 上にビットベクトル形式の設定を実装する場合に便利です。javadoc

クリックしてtextareaの文字を全て選択 2007/11/25

参考リンク
hori-uchi.com: クリックするとすべて選択されるテキストエリア

クリックしてtextareaの文字を全て選択したい。

下記のような感じでいいようです。

<textarea readonly rows="12" cols="40" onclick="this.focus();this.select()" id="code">ここの部分を選択したい。</textarea>


実験

css DisplayとVisibility 2007/11/25

CSS Properties: Display vs. Visibility

何がしたかったというと、Visibilityをhiddenにして、後からjavascriptで表示させたかったわけです。

ですが、そうすると、隠していた文字列がどうもみえていないだけで、あきらかに領域をとってしまって表示されていました。思い通りのレイアウトではない!!

それで、style="display:none;"というふうにあらかじめしておいた文字列をあとから,
jQueryを使って、

$('.crr').css("display", "block");


としてどうにか解決。

dislayを使えばいいというわけですね。

jqueryでラジオボタンの値を取得 2007/11/24

jQuery: The Write Less, Do More, JavaScript Library

prototypeをあきらめてjqueryを使ってみようと画策中...
正直どっちもつかったことがないし、何ができるかわかってないので、なんとなく流されるままという感じです。

Radio button values using jquery - JavaScript - Snipplr

jqueryを使ってラジオボタンから値をとる方法です。
nameで取得しています。

var r =$("input[@name=名前]:checked").val();
if(r){
//処理
}

prototype.jsでラジオボタンの値を取得 2007/11/24

protoype.jsを使って、ラジオボタンの値がとれないかなというわけで、

prototype.jsでラジオボタンの値を取得 : せつないぶろぐ

とれたことはとれたのだけど、デフォルトのcheckedがないと、no propertyで怒られる。

たとえば、r0,r1,2という名前(グループ)のラジオボタンがあると想定して、下記のようなコードにしてみた。

for(i=0;i<3;i++){
var s = 'r'+i;
var r = $A(document.f.elements[s]).find(function(v) {
return v.checked;
});

if(r){
alert(r.value);
}
}

json to java 2007/11/24

jsonのデータを気軽にjavaで扱える方法を模索中です。

【ハウツー】LL時代のデータ形式 - JavaプログラマのためのYAML/JSON (5) JavaでYAML/JSONを利用する - JSON-lib | エンタープライズ | マイコミジャーナル

という記事を読んで、なるほどと思う。

Maven - Json-lib::Welcome

ちょっと依存するlibが多そうなので、もっと簡単なのないかな。

It is based on the work by Douglas Crockford in http://www.json.org/java.

というふうにあったので、JSON in Javaにいってみる。

むきだしのjavaコードがあったので、ひとつづつダウンロードしてみた。

依存するものがないようなので、ちょっと試してみた。



jsonデータ

{
arr:[
{
name:"o_o!",
val:"Ohh"
},
{
name:"o_o2!",
val:"Eeeehh"
}
]
}


で適当に読み込むコード


import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Scanner;

public class JSONtoJava {

public static void main(String[] args) throws UnsupportedEncodingException,
JSONException {
InputStream stream = JSONtoJava.class
.getResourceAsStream("../data2.js");
BufferedReader reader = new BufferedReader(new InputStreamReader(
stream, "utf-8"));

Scanner scanner = new Scanner(reader);
StringBuilder builder = new StringBuilder();
while (scanner.hasNextLine()) {
builder.append(scanner.nextLine());
}

JSONTokener tokener = new JSONTokener(new String(builder));
JSONObject object = new JSONObject(tokener);

JSONObject object2 = (JSONObject) object.getJSONArray("arr").get(0);
System.out.println(object2.get("val"));

}

}


ファイルから一気に読み込むコードが思いつかなかったので、scannerでぐるぐると。
ファイルの読み込みなんて、ユーティリティクラスつくっていつも動かしていたから、こういった基本コードの書き方忘れるOrz...

えーと、JSONTokenerを作成して、JSONObjectに渡してあげればOK

Internal Server Errorがでるよ 2007/11/23



なれないことすると戸惑いますね。
web serverにperlで書いたcgiを配置して実行するとInternal Server Errorがでました。
Helo Worldしたいだけなのに。

で、print "Helo World"しただけだとだめ。

Webサーバーで上使うときのおまじない。
Content-typeを出力しないといけないんですよね。

PHPとか使ってると意識しないですむのでついついはまってしまったわけです。

まずオーソドックスな方法

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "o_o!";


つぎにCGIを使う方法
#!/usr/bin/perl
use strict;
use warnings;

use CGI;

my $q = new CGI;
print $q->header;

print "Well come deiji World.";


おまけ
ruby
#!/usr/local/bin/ruby
print "Content-type: text/html\n\n"
print "Hello world\n"

php noticeがでる インデックスがないアクセスで。 - エラー制御演算子 2007/11/23

phpです。

Notice: Undefined index: content inほにゃらら

とかでた場合
contentというインデックスは定義されてないよとかなんとか。

この対処方法として下記のような方法もあるらしい。
この方法がお作法としていいのかどうかはわからないですが...

$js_source_text = @$_REQUEST['content'];


@はエラー制御演算子

既に実装済みの処理を変更したい。- javassit 2007/11/23

そんなことは滅多にないと思うけど、既に実装した処理の動作を変更したい場合、javassitがいいのかなぁ。

それで、前回、書いたコードをベースに、既存の処理を変更するためのひとつの方法です。

まず、該当アプリケーションのmainをを呼び出すmainを用意して、そこで処理を変更したいクラスのメソッドを置き換えるということをしています。

で、うまくいくとこの処理以降のクラスは変更が適用されます。
クラスローダーのことは考慮に入れてないので、クラスローダーをごりごり使っている場合は自信がありません....



下記のコードでは、org.apache.commons.lang.StringUtilsの処理を変更しています。

該当アプリケーションクラス

package test_javassist;

import org.apache.commons.lang.StringUtils;

public class Main {

public static void main(String[] args) {

String a = "aaaa";
System.out.println(StringUtils.isEmpty(a));

}

}


置き換えクラス

package test_javassist;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;

public class MyMain {

/*
* !!!! static !!!!
*/
static {
ClassPool cp = ClassPool.getDefault();
CtClass cc = null;
try {
cc = cp.get("org.apache.commons.lang.StringUtils");
CtMethod m = cc.getDeclaredMethod("isEmpty");
// 処理を上書き
m.setBody("return true;");
// このコードはテスト
m.insertBefore("{ System.out.println(\"o_o! Hello.say():\"); }");
// freeze!!
cc.toClass();

} catch (NotFoundException e) {
e.printStackTrace();
} catch (CannotCompileException e) {
e.printStackTrace();
}

}

public static void main(String[] args) {
Main.main(args);
}

}

javassist static初期化を利用して、クラスの振る舞いを変えてます。 2007/11/22

javassistを使ったサンプルです。

static初期化を利用して、クラスの振る舞いを変えてます。
static { }
が実行されると、その後で対象のクラスをnewしても変更が効いてますね。
クラスローダーは意識してませんが。。。

package t;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;

public class Test {

/*
* !!!! static !!!!
*/
static {
ClassPool cp = ClassPool.getDefault();
CtClass cc = null;
try {
cc = cp.get("t.Hello");
CtMethod m = cc.getDeclaredMethod("say");
m.insertBefore("{ System.out.println(\"o_o! Hello.say():\"); }");
// freeze!!
Class c = cc.toClass();

} catch (NotFoundException e) {
e.printStackTrace();
} catch (CannotCompileException e) {
e.printStackTrace();
}

}

public static void main(String[] args) throws Exception {
Hello h = new Hello();
h.say();
}

}

class Hello {
public void say() {
System.out.println("Hello");
}
}

poj 2799 憎き IP Networks その2 2007/11/20

2799 -- IP Networks

一応通ったコード。

package p2799;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

int n = scanner.nextInt();
scanner.nextLine();

M mm = new M();
while (0 < n--) {
mm.add(toInt(toInts(scanner.nextLine())));
}

int a = mm.s2;
int b = mm.s1;

int m = mask(a, b);

printIPAddress(m & a);
printSubnet(m);
}

static class M {

int s1;
int s2;
boolean isInit = false;

public void add(int s) {
if (!isInit) {
s1 = s;
s2 = s;
isInit = true;
return;
}

s1 = min(s, s1);
s2 = max(s2, s);

}

int min(int a, int b) {

if ((b0(a) != b0(b)))
return b0(a) < b0(b) ? a : b;
if ((b1(a) != b1(b)))
return b1(a) < b1(b) ? a : b;
if ((b2(a) != b2(b)))
return b2(a) < b2(b) ? a : b;
if ((b3(a) != b3(b)))
return b3(a) < b3(b) ? a : b;

return b;
}

int max(int a, int b) {
if ((b0(a) != b0(b)))
return b0(a) < b0(b) ? b : a;
if ((b1(a) != b1(b)))
return b1(a) < b1(b) ? b : a;
if ((b2(a) != b2(b)))
return b2(a) < b2(b) ? b : a;
if ((b3(a) != b3(b)))
return b3(a) < b3(b) ? b : a;

return a;
}

int b0(int i) {
return (i >>> 24) & 0xff;
}

int b1(int i) {
return (i >>> 16) & 0xff;
}

int b2(int i) {
return (i >>> 8) & 0xff;
}

int b3(int i) {
return (i >>> 0) & 0xff;
}

/*
* デバッグ用
*/
static String net(int i) {
int b0 = (i >> 24) & 0xff;
int b1 = (i >> 16) & 0xff;
int b2 = (i >> 8) & 0xff;
int b3 = i & 0xff;
return String.format("%03d.%03d.%03d.%03d", b0, b1, b2, b3);
}

/*
* デバッグ用
*/
public String toString() {
return String.format("%s %s", net(s1), net(s2));
}
}

/**
* <p>
* ネットワークマスクを求めます。
* </p>
*
* @param a
* @param b
* @return
*/
public static int mask(int a, int b) {
for (int i = 0; i < 32; i++) {
if (a >>> i == b >>> i) {
return 0xffffffff << (i);
}
}
return 0x0;
}

/**
* <p>
* intの配列からipアドレスのint表現にします。
* </p>
*
* @param b
* @return
*/
static int toInt(int... b) {
int l = b[0] << 24;
l += b[1] << 16;
l += b[2] << 8;
l += b[3];
return l;
}

/**
* <p>
* サブネットマスクを印字します。
* </p>
*
* @param i
*/
static void printSubnet(int i) {
int b0 = (i >> 24) & 0xff;
int b1 = (i >> 16) & 0xff;
int b2 = (i >> 8) & 0xff;
int b3 = i & 0xff;
System.out.printf("%d.%d.%d.%d%n", b0, b1, b2, b3);
}

/**
* <p>
* ipv4の値をint値にします。
* </p>
*
* @param b0
* @param b1
* @param b2
* @param b3
* @return
*/
static int toInt(int b0, int b1, int b2, int b3) {
int l = b0 << 24;
l += b1 << 16;
l += b2 << 8;
l += b3;
return l;
}

/**
* <p>
* int値からipv4の値を出力します。
* </p>
*
* @param i
*/
static void printIPAddress(int i) {
System.out.println(ipv4(i));
}

/**
* <p>
* int値からxxx.xxx.xxx.xxxの表現にします。
* </p>
*
* @param i
* @return
*/
static String ipv4(int i) {
int b0 = (i >> 24) & 0xff;
int b1 = (i >> 16) & 0xff;
int b2 = (i >> 8) & 0xff;
int b3 = i & 0xff;
return String.format("%d.%d.%d.%d", b0, b1, b2, b3);
}

/**
* <p>
* int値からxxx.xxx.xxx.xxxの表現にします。
* </p>
*
* @param i
* @return
*/
static String ipv4_2(String s) {
String[] ss = s.split("\\.");

int b0 = Integer.parseInt(ss[0]);
int b1 = Integer.parseInt(ss[1]);
int b2 = Integer.parseInt(ss[2]);
int b3 = Integer.parseInt(ss[3]);
return String.format("%03d.%03d.%03d.%03d", b0, b1, b2, b3);
}

/**
* <p>
* ipアドレス表現の文字列からintの配列にします。
* </p>
*
* @param s
* @return
*/
static int[] toInts(String s) {

String[] ss = s.split("\\.");

return new int[] { Integer.parseInt(ss[0]), Integer.parseInt(ss[1]),
Integer.parseInt(ss[2]), Integer.parseInt(ss[3]) };
}

static int[] toInts(int i) {
int b0 = (i >> 24) & 0xff;
int b1 = (i >> 16) & 0xff;
int b2 = (i >> 8) & 0xff;
int b3 = i & 0xff;
return new int[] { b0, b1, b2, b3 };
}

}

poj 2799 憎き IP Networks 2007/11/20

2799 -- IP Networks

解き方はわかっていたのにぐだぐだサブミットしてしまいました。

いろいろ反省すべきことがあります。
まず、コードを書いたら検証ですね。
バグ以前にそれが正しいかどうか、練れていないとだめですね。。。

どいうふうに解いたかたといいます。
まず、与えられたIPアドレスの大きいのと小さいのを求めて、サブネットマスクを求めます。
あとは、そのサブネットマスクを利用してネットワークアドレスを求めます。

サブネットマスクの求め方は、ふたつのIPアドレスから共通の先頭ビットから求めます。

それで、引っかかったのは、大きいアドレスと小さいアドレスを求めるときでした。
単純にTreeSetを使って順序づけを行い、firstとlastを利用して行うとtime limit exceededがでてしまいました。


非常にいい加減ですが、検証用コード

package p2799;

import java.util.Random;
import java.util.Set;
import java.util.TreeSet;

public class CopyOfMain {

public static void main(String[] args) {

M mm = new M();

Set<String> set = new TreeSet<String>() {

private static final long serialVersionUID = 1L;

public String toString() {
return String.format("%s %s", first(), last());
}
};

String[] ss = { "192.168.131.046", "192.168.244.150",
"192.168.001.242", "192.168.255.022" };

// for (String s : ss) {
// mm.add(toInt(toInts(s)));
// set.add(s);
// }

// 192.168.131.046
// 192.168.244.150
// 192.168.001.242
// 192.168.255.022

for (int i = 0; i < 100; i++) {
String s = randomIp();
mm.add(toInt(toInts(s)));
set.add(s);
}

int a = toInt(toInts(mm.s2));
int b = toInt(toInts(mm.s1));

System.out.println(mm);
System.out.println(set);

int m = mask(a, b);

}

static class M {

int s1;
int s2;
boolean isInit = false;

public void add(int s) {
if (!isInit) {
s1 = s;
s2 = s;
isInit = true;
return;
}

// System.out.printf("%d%n%d %n", s1, min(s, s1));
s1 = min(s, s1);

s2 = max(s2, s);

}

int min(int a, int b) {

// System.out.printf("%d %d %s%n", b0(a), b0(b), b0(a) < b0(b));
// System.out.printf("%d %d %s%n", b1(a), b1(b), b1(a) < b1(b));
// System.out.printf("%d %d %s%n", b2(a), b2(b), b2(a) < b2(b));
// System.out.printf("%d %d %s%n", b3(a), b3(b), b3(a) < b3(b));
// System.out.println("-------------------");
if ((b0(a) != b0(b)))
return b0(a) < b0(b) ? a : b;
if ((b1(a) != b1(b)))
return b1(a) < b1(b) ? a : b;
if ((b2(a) != b2(b)))
return b2(a) < b2(b) ? a : b;
if ((b3(a) != b3(b)))
return b3(a) < b3(b) ? a : b;

return b;
}

int max(int a, int b) {
if ((b0(a) != b0(b)))
return b0(a) < b0(b) ? b : a;
if ((b1(a) != b1(b)))
return b1(a) < b1(b) ? b : a;
if ((b2(a) != b2(b)))
return b2(a) < b2(b) ? b : a;
if ((b3(a) != b3(b)))
return b3(a) < b3(b) ? b : a;

return a;
}

int b0(int i) {
return (i >>> 24) & 0xff;
}

int b1(int i) {
return (i >>> 16) & 0xff;
}

int b2(int i) {
return (i >>> 8) & 0xff;
}

int b3(int i) {
return (i >>> 0) & 0xff;
}

static String net(int i) {
int b0 = (i >> 24) & 0xff;
int b1 = (i >> 16) & 0xff;
int b2 = (i >> 8) & 0xff;
int b3 = i & 0xff;
return String.format("%03d.%03d.%03d.%03d", b0, b1, b2, b3);
}

public String toString() {
return String.format("%s %s", net(s1), net(s2));
}
}

public static int mask(int a, int b) {
for (int i = 0; i < 32; i++) {
// printB(a >>> i);
if (a >>> i == b >>> i) {
// System.out.println("aaa:" + i);
return 0xffffffff << (i);
}
}
return 0x0;
}

static int toInt(int... b) {
int l = b[0] << 24;
l += b[1] << 16;
l += b[2] << 8;
l += b[3];
return l;
}

static void printSubnet(int i) {
int b0 = (i >> 24) & 0xff;
int b1 = (i >> 16) & 0xff;
int b2 = (i >> 8) & 0xff;
int b3 = i & 0xff;
System.out.printf("%d.%d.%d.%d%n", b0, b1, b2, b3);
}

/**
* <p>
* ipv4の値をint値にします。
* </p>
*
* @param b0
* @param b1
* @param b2
* @param b3
* @return
*/
static int toInt(int b0, int b1, int b2, int b3) {
int l = b0 << 24;
l += b1 << 16;
l += b2 << 8;
l += b3;
return l;
}

/**
* <p>
* int値からipv4の値を出力します。
* </p>
*
* @param i
*/
static void printIPAddress(int i) {
System.out.println(ipv4(i));
}

/**
* <p>
* int値からxxx.xxx.xxx.xxxの表現にします。
* </p>
*
* @param i
* @return
*/
static String ipv4(int i) {
int b0 = (i >> 24) & 0xff;
int b1 = (i >> 16) & 0xff;
int b2 = (i >> 8) & 0xff;
int b3 = i & 0xff;
return String.format("%d.%d.%d.%d", b0, b1, b2, b3);
}

/**
* <p>
* int値からxxx.xxx.xxx.xxxの表現にします。
* </p>
*
* @param i
* @return
*/
static String ipv4_2(String s) {
String[] ss = s.split("\\.");

int b0 = Integer.parseInt(ss[0]);
int b1 = Integer.parseInt(ss[1]);
int b2 = Integer.parseInt(ss[2]);
int b3 = Integer.parseInt(ss[3]);
return String.format("%03d.%03d.%03d.%03d", b0, b1, b2, b3);
}

static int[] toInts(String s) {

String[] ss = s.split("\\.");

return new int[] { Integer.parseInt(ss[0]), Integer.parseInt(ss[1]),
Integer.parseInt(ss[2]), Integer.parseInt(ss[3]) };
}

static int[] toInts(int i) {
int b0 = (i >> 24) & 0xff;
int b1 = (i >> 16) & 0xff;
int b2 = (i >> 8) & 0xff;
int b3 = i & 0xff;
return new int[] { b0, b1, b2, b3 };
}

static int r() {
return new Random().nextInt(256);
}

static String randomIp() {
return String.format("%03d.%03d.%03d.%03d", r(), 168, r(), 10);
}

}

32ビット 2進数で表示 2007/11/19

javaです。
32ビット 2進数で表示
また横着コードです。

static void printB(int i) {
String s = String.format("%32s", Integer.toBinaryString(i)).replaceAll(" ", "0");
System.out.println(s);
//System.out.println(s.length());
}


まず、toBinaryStringを使って基本変換。
次にformatterを使用して、桁そろえ。その際、空白でパディングされるので、空白を0になおしています。

Integer.MIN_VALUE

10000000000000000000000000000000


Integer.MAX_VALUE

01111111111111111111111111111111



0xff
0xffff
0xffffff
0xffffffff


00000000000000000000000011111111
00000000000000001111111111111111
00000000111111111111111111111111
11111111111111111111111111111111


まえいにも似たようなことしたけど。
うーんビットでみないといまいちイメージがわかないのです。
他にいい方法があるといいんだけど。

firefoxとsafariのjson 2007/11/18
2007/11/20

えーと
firefoxでオッケーでsafariでだめなケースがあったのでメモ。

jsonで、配列の後ろが無いのにカンマをおくとsafariだとだめだった。





で別のパターン
macのosx、safariではオッケーだったけど、winのieではだめだった※特にバージョンは気にしてないです。



意識しないといけないですね。
言語仕様的にはOKなのかな?

サブネットマスク/ビットマスクの換算表を印字します。 2007/11/15

Nippon Kaisho システムツール [ IP換算表:サブネットマスク ]

上記のサイトを参考にしています。

結果

0 0.0.0.0
1 128.0.0.0
2 192.0.0.0
3 224.0.0.0
4 240.0.0.0
5 248.0.0.0
6 252.0.0.0
7 254.0.0.0
8 255.0.0.0
9 255.128.0.0
10 255.192.0.0
11 255.224.0.0
12 255.240.0.0
13 255.248.0.0
14 255.252.0.0
15 255.254.0.0
16 255.255.0.0
17 255.255.128.0
18 255.255.192.0
19 255.255.224.0
20 255.255.240.0
21 255.255.248.0
22 255.255.252.0
23 255.255.254.0
24 255.255.255.0
25 255.255.255.128
26 255.255.255.192
27 255.255.255.224
28 255.255.255.240
29 255.255.255.248
30 255.255.255.252
31 255.255.255.254
32 255.255.255.255



/**
* <p>
* サブネットマスク/ビットマスクの換算表を印字します。
* </p>
*
* @author nakawaka
*
*/
public class PrintSubnet {

public static void main(String[] args) {

for (int j = 0; j <= 32; j++) {
System.out.printf("%d ", j);
printSubnet(j);
}

}

/**
* <p>
* 指定されたビットマスクで、サブネットマスクを印字します。<br>
* 0 <= mask && mask <= 32<br>
* </p>
*
* @param mask
* とりうる値の範囲は、0 <= mask && mask <= 32<br>
*/
static void printSubnet(int mask) {
if (mask == 0) {
printIPAddress(0);
return;
}
int i = (0xffffffff << (32 - mask));

printIPAddress(i);
}

/**
* <p>
* ipv4の値をint値にします。
* </p>
*
* @param b0
* @param b1
* @param b2
* @param b3
* @return
*/
static int toInt(int b0, int b1, int b2, int b3) {
int l = b0 << 24;
l += b1 << 16;
l += b2 << 8;
l += b3;
return l;
}

/**
* <p>
* int値からipv4の値を出力します。
* </p>
*
* @param i
*/
static void printIPAddress(int i) {
int b0 = (i >> 24) & 0xff;
int b1 = (i >> 16) & 0xff;
int b2 = (i >> 8) & 0xff;
int b3 = i & 0xff;
System.out.printf("%d.%d.%d.%d%n", b0, b1, b2, b3);
}
}

int値からipアドレス ipアドレスからint値へ 2007/11/14

int値からipアドレス ipアドレスからint値へ
変換です。

static int toInt(int b0, int b1, int b2, int b3){
int l = b0 << 24;
l += b1 << 16;
l += b2 << 8;
l += b3;
return l;
}


static void printIPAddress(int i){
int b0 = (i >> 24) & 0xff;
int b1 = (i >> 16) & 0xff;
int b2 = (i >> 8) & 0xff;
int b3 = i & 0xff;
System.out.printf("%d.%d.%d.%d%n", b0, b1, b2, b3);
}


うまくいっていると思う。

java でxml xpathで、ネームスペース 2007/11/14

Java XPath API


java5以上です。
ネームスペースを使ってXPathを使って値をとるサンプルです。

package a;

import java.io.IOException;

import java.net.URISyntaxException;

import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import java.util.Iterator;
import javax.xml.namespace.NamespaceContext;

public class TestMain {

public static void main(String[] args) throws SAXException, IOException,
XPathExpressionException, ParserConfigurationException,
URISyntaxException {

DocumentBuilderFactory domFactory = DocumentBuilderFactory
.newInstance();
domFactory.setNamespaceAware(true);// 重要!!
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(TestMain.class.getResource("a.xml")
.toURI().toString());
a(doc);
System.out.println("----");
b(doc);

}

static void a(Document doc) throws XPathExpressionException {
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath
.compile("//book[@year='1969']/title/text()");

Object result = expr.evaluate(doc, XPathConstants.STRING);
System.out.println(result);

}

static void b(Document doc) throws XPathExpressionException {
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
xpath.setNamespaceContext(new MyNamespaceContext());

XPathExpression expr = xpath
.compile("//my:book[@year='2007']/my:title/text()");
Object result = expr.evaluate(doc, XPathConstants.STRING);
System.out.println(result);
}

static class MyNamespaceContext implements NamespaceContext {
public String getNamespaceURI(String prefix) {
if (prefix == null)
throw new NullPointerException("Null prefix");
else if ("my".equals(prefix))
return "http://deiji.jp";
else if ("xml".equals(prefix))
return XMLConstants.XML_NS_URI;
return XMLConstants.NULL_NS_URI;
}

public String getPrefix(String uri) {
throw new UnsupportedOperationException();
}

public Iterator getPrefixes(String uri) {
throw new UnsupportedOperationException();
}

}

}



<my xmlns="http://deiji.jp">
<book year="1969">
<title>aaaaa</title>
<author>nakawaka</author>
</book>
<book year="2007">
<title>bbbbb</title>
<author>shigeto</author>
</book>
</my>

commons configurationでのメモ XMLConfigurationでの出来事 2007/11/13
2007/11/14

Commons Configuration - Java Configuration API

org.apache.commons.configuration.XMLConfiguration
を使用していて、下記のような例外がでた場合には、

java.lang.IllegalArgumentException: prepareAdd: Passed in key must contain a whitespace!
at org.apache.commons.configuration.tree.xpath.XPathExpressionEngine.prepareAdd(XPathExpressionEngine.java:211)
at org.apache.commons.configuration.HierarchicalConfiguration.addPropertyDirect(HierarchicalConfiguration.java:303)
at org.apache.commons.configuration.AbstractHierarchicalFileConfiguration.addPropertyDirect(AbstractHierarchicalFileConfiguration.java:112)
at org.apache.commons.configuration.HierarchicalConfiguration.setProperty(HierarchicalConfiguration.java:545)
at org.apache.commons.configuration.AbstractHierarchicalFileConfiguration.setProperty(AbstractHierarchicalFileConfiguration.java:130)


ExpressionEngineをDefaultExpressionEngineにすると例外がでなくなった。

DefaultExpressionEngine defaultExpressionEngine = new DefaultExpressionEngine();
xmlConfiguration.setExpressionEngine(defaultExpressionEngine);


プログラムの他の実装で、

XPathExpressionEngine engine = new XPathExpressionEngine();
HierarchicalConfiguration.setDefaultExpressionEngine(engine);

している箇所があったので、それが影響したようだ。

正規表現 java ファイルのパスだけ 2007/11/13

javaです。正規表現です。
うーん
こんなのでいいのか自信がないけど。

String s = "file:///aaa/bbb/ccc/ddd.xml";
s = s.replaceFirst("[^/]*$", "");
System.out.println(s);


後ろからみてっていって、スラッシュまで消すという感じ。。。。

poj 3077 rounders 2007/11/12

3077 -- Rounders

丸めの問題です。

いつものごとく簡単そうな問題を選んでいます。

正直どうしていいかわからなくて、ごちゃごちゃしていたらacceptedされた感じです。
BigDecimalを使ってます。この使い方がいいのかどうかはわかりません。

precisionは精度。

HALF_UPの説明は下記

「もっとも近い数字」に丸めるモードです。ただし、両隣りの数字が等距離の場合は切り上げます。破棄される小数部が 0.5 以上の場合は RoundingMode.UP のように動作し、それ以外の場合は RoundingMode.DOWN のように動作します。これは我々の大半が小学校で習った丸めモードのことです。jdk1.5 javadoc RoundingMode


package p3077_Rounders;

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
while (0 < n--) {
int a = scanner.nextInt();
System.out.println(round(a));
}
}

static int round(int a) {
BigDecimal decimal = new BigDecimal(a);
for (int i = decimal.precision() - 1; 1 <= i; i--)
decimal = decimal.round(new MathContext(i, RoundingMode.HALF_UP));

return decimal.intValue();
}

}

isAssignableFrom オブジェクトがどのクラス、インターフェイスと等しいか調べる。 2007/11/11

オブジェクトがどのクラスのインスタンスかどうか調べるときは、instanceofを使用しますね。

if(new Object() instanceof String){
System.out.println("bingo");
}


つぎに、ClassにあるisAssignableFromを使っても検査できます。

if(new Aaaa().getClass().isAssignableFrom(String.class)){
System.out.println("bingo2");
}


ためしに実験
if (new Object().getClass().isAssignableFrom(String.class)) {
System.out.println("bingo");
}

の結果はどうなるか。
bingo
となりました。

RadialGradientPaintはjdk1.5にはない。 2007/11/08

jdk1.5にはRadialなGradientを表現できる、RadialGradientPaintクラスがないようです。
なので、org.apache.batik.ext.awt.RadialGradientPaintを使うようです。

ためしてみました。



protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
float[] fractions = {0.0f, 0.3f, 0.7f};
Color[] colors = {Color.white, Color.lightGray, Color.gray};
RadialGradientPaint gradient = new RadialGradientPaint(
80.0f,
100.0f,
120.0f,
fractions,
colors
);
g2.setPaint(gradient);
g2.fill(new Rectangle2D.Double(20, 20, 200, 130));

}


こんな感じのものが描けます。



参考
Java2D:色属性の設定:RadialGradientPaintクラスによるグラデーションの指定

ラスベガスでmac osx(leopard)版 java6を望む声 2007/11/07

Code To Joy: Las Vegas Lobbies for Java 6 on Leopard

mac osxではまだjava6が登場してきてません。ラスベガスからmac版java6を登場を働きかけてます。

jasperreports 外字への道 アイデアレベル 2007/11/07

java オープンソースの帳票とかつくれるjasperreportsで、外字を表示でお悩み中

JasperForge - Home

対象のjasperreportsのバージョンは1.2.8でちょっと古いので試しています。
いまいち外字なるものの理解が足りてないので、あやういです。
windows上でのはなしです。

まず、windows xpで、C:\WINDOWS\FontsにEUDC.ttfという外字のためのフォントを作成してあると仮定して、jasperereportsでレンダリングした場合、外字(EUDCをフォントで指定という意味で)は表示されます。

で、ここまではいいのですが、問題は、外字以外のものを表示すると表示されなかったです。
java上だと、混合でうまく表示してくれるときがあります。

で、推測ですが、帳票という性質上あいまいなデザインは許さないと思うのできっちりフォントを指定するとそれを律儀に守ってくれるのだと思います。そこがつらい。

全然ためしていないのですが、解決策として考えたこと

(A)IPAとかで配布されているフォントに外字をプラスして、それを使うようにする(どうだろう?)
(B)jasperreports上でフォントを指定している箇所で、外字なら別のフォントを使うようにする。もしくは、指定されたフォントマップにフォントがない場合、別のフォントを使うようにする。(コードに手を加える、jasperreportsはLGPL!!、さあどうする)
(C)外字と使いたいフォントをファミリーにする(この言い回しが正しいかどうかはわからない...)

実験した結果、(JRViewでのレンダリングを対象)
net.sf.jasperreports.engine.export.TextRenderer
で、renderParagraphとかのメソッドで、外字だったら指定された範囲の文字列のフォントを別で指定したらうまくいきました。

AttributedStringに、属性セットを文字列の部分範囲に追加できるメソッドがあるので、それで追加します。
下記のものを指定するよよいっぽい。


java.awt.font.TextAttribute(size),
net.sf.jasperreports.engine.util.JRTextAttribute(PDF_FONT_NAME),
net.sf.jasperreports.engine.util.JRTextAttribute(PDF_ENCODING),
java.awt.font.TextAttribute(family),
net.sf.jasperreports.engine.util.JRTextAttribute(IS_PDF_EMBEDDED),
java.awt.font.TextAttribute(foreground)

これで、混在できるようです。

で、結論として、表示できないフォントは第二指定フォントでレンダリングとかできたらうれしいのかもしれない。上記の案は的をはずしているかもしれない。


参考
フォント構成ファイル

11111111111111111111111111111111(32個の1)をInteger.parseInt に基数2を指定するとどうなるか。 2007/11/06

11111111111111111111111111111111(32個の1)をInteger.parseInt に基数2を指定するとどうなるか。

static void a() {
String s = "";
for (int i = 0; i < 32; i++)
s += "1";
System.out.println(s);
System.out.println("length:" + s.length());
int B32 = Integer.parseInt(s, 2);
}


結果は
11111111111111111111111111111111
length:32
Exception in thread "main" java.lang.NumberFormatException: For input string: "11111111111111111111111111111111"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:459)
at p2799_not_soleved.Test3.a(Test3.java:22)
at p2799_not_soleved.Test3.main(Test3.java:13)



参考
プログラマメモ2: ビットで表示しましょう。 - いまさらながらですが。

groovletでweb.xmlからデータをとるひとつの方法 2007/11/06

groovyでgroovletです。

web.xmlで、

<context-param>
<param-name>no</param-name>
<param-value>o_o!!!!</param-value>
</context-param>


で書くと、groovletから、

context.getInitParameter('no')

で値がとれました。

どうも下記の場所じゃないっぽいです。
<servlet>
<servlet-name>Groovy</servlet-name>
<servlet-class>groovy.servlet.GroovyServlet</servlet-class>
<init-param>
<param-name>no</param-name>
<param-value>Hello World</param-value>
</init-param>
</servlet>


参考
web.xml 要素リファレンス

いまさらながら感がありますが、java1.4でutf-8のBOM付XMLファイルをパースすると失敗するっぽい 2007/11/05
2007/11/06

javaです。バージョンは1.4です。

どうもutf-8のBOM付XMLファイルをパースすると失敗するようです。
下記のようなエラーがでるようです。

org.xml.sax.SAXParseException: ドキュメントのルート要素がありません。
at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3376)
at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3364)
at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:668)
at org.apache.crimson.parser.Parser2.parse(Parser2.java:337)
at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:448)
at org.apache.crimson.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:185)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:76)
at x.A.a(A.java:68)
at x.A.main(A.java:24)
Exception in thread "main"


utf-8のBOMなしでやるとうまくいきました。

使用しているコードは、
public static void a() throws ParserConfigurationException, SAXException,
IOException {

URL url = A.class.getResource("b.xml");
InputStream inputStream = url.openStream();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

System.out.println(">>" + builder);

Document doc = builder.parse(inputStream);

}



それで、H氏からの情報
かわりに Apache Xerces-J を使うとうまくいきます。


あと、

Xerces-J-bin.2.9.1.zip or tar.gz から xercesImpl.jar と xml-apis.jar を取り出し、
java 起動時に、これら二つを読み込みつつ、

-Djavax.xml.parsers.DocumentBuilderFactory=<DocumentBuilderFactoryImpl>
-Djavax.xml.transform.TransformerFactory=<TransformerFactoryImpl>


もう1.4からjava5の世界に移行しないと....

javaでlzh 2007/11/03

javaで、lzhなファイルを解凍したかったので、調べたら、ライブラリを公開している方がいたので使用してみました。
zipパッケージライクに使えます。



javadocもわかりやすかったです。

package a;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URISyntaxException;

import jp.gr.java_conf.dangan.util.lha.LhaFile;
import jp.gr.java_conf.dangan.util.lha.LhaHeader;

public class TestLha {

public static void main(String[] args) throws URISyntaxException,
IOException {
// A070330.lzh
File file = new File(TestLha.class.getResource("/A070330.lzh").toURI());
LhaFile lhaFile = new LhaFile(file);
LhaHeader[] headers = lhaFile.getEntries();
for (LhaHeader lhaHeader : headers) {
System.out.println(lhaHeader.getPath());
BufferedInputStream stream = new BufferedInputStream(lhaFile
.getInputStream(lhaHeader));

BufferedOutputStream outputStream = new BufferedOutputStream(
new FileOutputStream("/Users/nakawakashigeto/tmp/" + lhaHeader.getPath()));
byte[] bs = new byte[8192];
while(stream.read(bs) != -1){
outputStream.write(bs);
outputStream.flush();
}
stream.close();
outputStream.close();
}

}

}

角丸にチャレンジ 2007/11/03

角丸画像をつくります。javaです。
ドラッグアンドドロップで画像を渡して角丸にした画像を表示してみます。

仕様は
(1)ウインドウ画面を表示します。
(2)任意の画像をドラッグアンドドロップできます。
(3)ドロップされた画像を角丸にして表示します。

いろいろな方法で角丸ができると思いますが、
今回とった方法は、「Filty Rich Clients」のp.166のUsing SrcInを参考にしています。

Filthy Rich Clients: Developing Animated & Graphical Effects for Desktop Java Applications (The Java Series)
Filthy Rich Clients: Developing Animated & Graphical Effects for Desktop Java Applications (The Java Series)
Chet Haase Romain Guy

by G-Tools


まずドロップされた画像のサイズからGraphics生成して角丸レクタングルを作成します。
つぎに、compositeでドロップされた画像と合成します。

BufferedImageをnewして、Graphics2Dを作成する方法はいろいろ応用できそうです。

BufferedImage round = new BufferedImage(w, h,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = round.createGraphics();
// g2.setColor(Color.BLUE);
g2.fillRoundRect(0, 0, w, h, 37, 37);
g2.setComposite(AlphaComposite.SrcIn);
g2.drawImage(droppedImage, 0, 0, null);
g2.dispose();


おまけで、swingxのペインターをいろいろ使っています。

起動した画面


ドロップした画面


角丸の角丸がきれいではないです。

以下、ソースコードです。
package main.kadomaru;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

import org.jdesktop.swingx.JXPanel;
import org.jdesktop.swingx.painter.AbstractLayoutPainter;
import org.jdesktop.swingx.painter.CompoundPainter;
import org.jdesktop.swingx.painter.ImagePainter;
import org.jdesktop.swingx.painter.RectanglePainter;

public class ImagePanel extends JXPanel {
static DataFlavor urlFlavor;
static {
try {
urlFlavor = new DataFlavor(
"application/x-java-url; class=java.net.URL");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

}

DropTarget dropTarget;
BufferedImage droppedImage;
private static final long serialVersionUID = 1L;

public ImagePanel() {
RectanglePainter roundRect = new RectanglePainter(10, 10, 10, 10, 37,
37, true, Color.black, 10, Color.ORANGE);
// roundRect.setAntialiasing(RenderingHints.VALUE_ANTIALIAS_ON);
CompoundPainter compound = new CompoundPainter(roundRect);
setBackgroundPainter(compound);
initialize();
dropTarget = new DropTarget(this, new MyDrop());
}

private void initialize() {
this.setSize(300, 200);
this.setLayout(new GridBagLayout());
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
paintSuggestion(g);
paintDropedImage(g);
}

protected void paintSuggestion(Graphics g) {
if (this.droppedImage != null)
return;
Dimension dimension = this.getSize();
int w = (int) (dimension.getWidth() / 2);
int h = (int) (dimension.getHeight() / 2);
Font font = new Font("", 0, 32);
g.setColor(Color.WHITE);
g.setFont(font);
g.drawString("Drop Image", 18, h);
}

protected void paintDropedImage(Graphics g) {
if (this.droppedImage == null)
return;

int w = droppedImage.getWidth();
int h = droppedImage.getHeight();

BufferedImage round = new BufferedImage(w, h,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = round.createGraphics();
// g2.setColor(Color.BLUE);
g2.fillRoundRect(0, 0, w, h, 37, 37);
g2.setComposite(AlphaComposite.SrcIn);
g2.drawImage(droppedImage, 0, 0, null);
g2.dispose();
ImagePainter painter = new ImagePainter(round,
AbstractLayoutPainter.HorizontalAlignment.CENTER,
AbstractLayoutPainter.VerticalAlignment.CENTER);
// painter.setScaleToFit(true);
painter.setAntialiasing(true);

CompoundPainter cp = new CompoundPainter(painter);
setBackgroundPainter(cp);
}

class MyDrop implements DropTargetListener {
public void dragEnter(DropTargetDragEvent dtde) {
}

public void dragExit(DropTargetEvent dte) {
}

public void dragOver(DropTargetDragEvent dtde) {
}

public void drop(DropTargetDropEvent dtde) {
dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
Transferable transferable = dtde.getTransferable();
// dump(transferable);
boolean gotData = false;
if (transferable.isDataFlavorSupported(urlFlavor)) {
try {
URL url = (URL) transferable.getTransferData(urlFlavor);

BufferedImage tmpImage = ImageIO.read(url);
droppedImage = tmpImage;
repaint();
gotData = true;
} catch (UnsupportedFlavorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
dtde.dropComplete(gotData);
}
return;
}
}

public void dropActionChanged(DropTargetDragEvent dtde) {
}

public void dump(Transferable transferable) {
DataFlavor[] dataFlavors = transferable.getTransferDataFlavors();
for (int i = 0; i < dataFlavors.length; i++) {
DataFlavor flavor = dataFlavors[i];
System.out.println(flavor);
}
}
}

}

eclipse3.3 + veのためのメモ 2007/11/02

インストール手順をよく忘れるのでメモ
まとまりがないです....
mac osx上のeclipseで試しました。

必要なものをダウンロードします。






eclipseはclassicを使います。バージョンは現在,3.3.1.1です。
非公式なvisual editorはve_eclipse_33_v200709242300_lin_mac.zipを使用しました。



veはWTPが必要なのでまず最初に、インストールします。
WTPのインストールは、「Help - Software Updates - Find and Install」を利用します。

ve_eclipse_33_v200709242300_lin_macのインストールは、「Help - Software Updates - Manage Configuration」を利用します。

この場合、.eclipseextensionファイルを作成する必要があります。


ve_eclipse_33_v200709242300_lin_mac/eclipse/.eclipseextension


参考


スクリーンキャストしてみました。うーん、小さくてみづらいですね。

URIでfileをみるとき/が一本たりないことに注意 2007/11/02
2008/01/20

非常にはまったのでメモ

環境

Windows上で、Cドライブの直下にtmpというディレクトリがありそこにtest.propというファイルがあります。


ブラウザ上で、URLを入力する欄に
file://c:/tmp/test.prop

といれるとファイルが開けます。

これをjavaで指定すると開くことができませんでした。
それで、ただしくは、
file:///c:/tmp/test.prop


ちなみに出てくる例外は以下

Exception in thread "main" java.net.UnknownHostException: c
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:177)
at java.net.Socket.connect(Socket.java:519)
at java.net.Socket.connect(Socket.java:469)
at sun.net.NetworkClient.doConnect(NetworkClient.java:157)
at sun.net.NetworkClient.openServer(NetworkClient.java:118)
at sun.net.ftp.FtpClient.openServer(FtpClient.java:488)
at sun.net.ftp.FtpClient.openServer(FtpClient.java:475)
at sun.net.www.protocol.ftp.FtpURLConnection.connect(FtpURLConnection.java:270)
at sun.net.www.protocol.ftp.FtpURLConnection.getInputStream(FtpURLConnection.java:352)
at java.net.URL.openStream(URL.java:1009)
at prop.Test.main(Test.java:17)

FtpClientが動き出しています。

package prop;

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Properties;

public class Test {

public static void main(String[] args) throws URISyntaxException,
IOException {

URI uri = new URI("file:///c:/tmp/test.prop");
URL url = uri.toURL();
InputStream stream = url.openStream();
Properties properties = new Properties();
properties.load(stream);
System.out.println(properties.get("test1"));

}

}


その他、参考
プログラマメモ2: [java]URIとURL

eclipse buildpathの設定 2007/11/01



この設定が必要かどうかは正直不明...

getResourceで画像ファイル読めない場合があったので設定しました。
binのファイルに多分、srcから画像ファイルがコピーされないからだと考えて、設定しました。一応うまくいきました。

tomcat6でcometで java引数 -Djava.net.preferIPv4Stack=true 2007/10/31

tomcat6から使えるというcometをためしてみました。
環境はmac osxです。

自信がないですが、とりあえずメモです。

下記のようなエラーがでました。


java.net.SocketException: Invalid argument
at sun.nio.ch.Net.setIntOption0(Native Method)
at sun.nio.ch.Net.setIntOption(Net.java:152)
at sun.nio.ch.SocketChannelImpl$1.setInt(SocketChannelImpl.java:372)
at sun.nio.ch.SocketOptsImpl.setInt(SocketOptsImpl.java:46)
at sun.nio.ch.SocketOptsImpl$IP.typeOfService(SocketOptsImpl.java:249)
at sun.nio.ch.OptionAdaptor.setTrafficClass(OptionAdaptor.java:158)
at sun.nio.ch.SocketAdaptor.setTrafficClass(SocketAdaptor.java:330)
at org.apache.tomcat.util.net.SocketProperties.setProperties(SocketProperties.java:171)
at org.apache.tomcat.util.net.NioEndpoint.setSocketOptions(NioEndpoint.java:956)
at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:1169)
at java.lang.Thread.run(Thread.java:613)




参考サイト
web.paulownia.jp - Comet with Tomcat 6

上記のサイトで、何やら、java起動時の-Dオプションに渡したほうがいいようなことが書いてありためしたら動作しました。
-Djava.net.preferIPv4Stack=true

記述したのは、catlina.shに直接書きました。


export CATALINA_OPTS=-Djava.net.preferIPv4Stack=true (Unix)

して動かしてもいいのかも。

ちなみに
java.net.preferIPv4Stack (デフォルト: false)
IPv6 を利用可能なオペレーティングシステムでは、基本となるネイティブソケットは IPv6 ソケットです。このため、Java(TM) アプリケーションは、IPv4 ホストと IPv6 ホストの両方に接続したり、その両方のホストからの接続を受け入れたりできます。

IPv4 ソケットだけを使用するよう設定されているアプリケーションでは、このプロパティを true に設定できます。 つまり、そのアプリケーションは IPv6 ホストと通信できないということです。 ネットワークのプロパティ


IPv4を優先してくれるということらしい。

参考
【特集】Tomcat 6の実力を早速試す - 移行するべき? その時期は? (16) I/O機能の拡張によるCometのサポート(3) | エンタープライズ | マイコミジャーナル
Apache Tomcat 6.0 - Advanced IO and Tomcat
ネットワークのプロパティ
java.net パッケージの仕組み
2007-01-29 - KazzzのJとNのはざまで - HttpServletRequest#getRemoteAddr()とIPv6 その4 
Apache Tomcat 6.0 - Security Manager HOW-TO