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

目次

java 証明書を作成する際に、期限の設定をする 2007/07/31

証明書を作成する際に使用するkeytoolで、期限の設定の仕方は、-validityで日にちを設定するようです。

keytool -genkey -keystore myKeyStore -alias myAlias -validity 4000


この例だと4000日ということになります。

java commonsがトップレベルになっていた。 2007/07/31

commonsがトップレベルになっていた。

java jnlpでファイルの読み書きごとにユーザに問いあわせれば証明書はいらないようだ。 2007/07/30



JNLP API の FileOpenService を使用すると、証明書などを用意しなくても、ユーザがFileChooserで指定したローカルファイルだけを読み書きすることができます。Java Web Start - てんぷらメモ

eclipse プラグインのインストールの仕方 - またはもうひとつの方法 2007/07/30

eclipseのプラグインをインストールするまたもうひとつの方法です。

インストールするプラグインのイメージがファイルで提供されている場合です。

(1)
インストールしたいファイルを任意のディレクトリで展開します。

(2)eclipse上から展開したプラグインのディレクトリを指定します。
具体的には、
メニューから
[Help] - [Software Updates] - [Find and Install]を指定します。

次に、


から、



の[New Local Site]を選択して後に展開したプラグインのディレクトリを指定します。
画面であのプラグインがたりないこのプラグインがバージョンがあわないとかでてきたら、それにあわせて調整するという感じです。

アイデア ローカルホストサーバをたてて、firefoxと通信 2007/07/26

アイデアレベル。

閲覧しているwebページから、特定の部分データをクリッピングする場合、firefoxでgreasemonkeyを動かして、自分のマシン上にlocalhostのwebサーバを動かして、通信させて、ローカルに保存するというのはどうだろうと考えた。

(1)greasemonkeyを使用して、特定部分のデータを取得。
(2)GM_xmlhttpRequestを使用してhttp://localhost:8080/clippingとかに送信して、ローカルサーバがファイルに保存なり、データベースなり保存して後から利用できるようにする。

って感じ。

何故そうしたいかというと、greasemonkeyを使って特定のページの特定の部分を取得してファイルにして保存できるかなと考えていたのだけども、どうも、greasemonkeyから直接ファイル保存はできないみたいだから。

作るなら、jettyをクリッピングサーバーにしてgroovyでコード書いてみたいなぁ

今週は時間がないので来週ためしてみよう。

java classpathの設定のための参考シェル 2007/07/26
2007/08/03

もとネタはtomcatの設定だった思う。
for ~ in ~
って書き方


#!/bin/sh
# Set standard CLASSPATH
export CLASSPATH="$JAVA_HOME"/lib/tools.jar
export BASEDIR=`pwd`
export TARGET_DIR="$BASEDIR"/lib
if [ -d "$TARGET_DIR" ]; then
for i in "$TARGET_DIR"/*.jar; do
CLASSPATH="$CLASSPATH":"$i"
done
fi


20070803 H氏からコメントをいただいたので掲載

OLDIFS=${IFS}
IFS='
'
for f in `find "${TARGET_DIR}" -name "*.jar" -o -name "*.ZIP" -o -name "*.zip" 2> /dev/null`
do
if [ -f "$f" ]; then
CLASSPATH=${CLASSPATH}:"$f"
fi
done
IFS=${OLDIFS}

javascript ブログに書いて簡単に実行する方法 2007/07/25

ブログで簡単にjavascriptを実行する方法です。

404 Blog Not Found:javascript - Lambda Calculus


(1)まず、タグにidをふります。document.getElementById(id).valueで中の値をとりだします。
※中の値をとる方法は他にもあります、しようするタグ(node?)によっても変わるかもしれません。
(2)evalを使ってとりだした値を実行。

スクリプトを入力欄:


実行をクリックすると上記の入力したスクリプトが実行されます。
実行

このタグのidはR20070726です。上記の入力欄にdocument.getElementById('R20070726').innerHTML='o_o!'と入れるとたしかめられます。

 

java splitとStringTokenizerと... 2007/07/25
2007/08/03

年に一度は何故かはまるjavaの文字列の切り分け。
単純にStringのsplitを使ってはじめはよろこんで、何か、思い通りにいかず、StringTokenizerを使っても、思い通りにいかず、最後に実装をjakarta コモンズにたよってしまったというパターン。

カンマ区切りでためしてみました。

シナリオ:

カンマ区切りを行いたい。値がない区切りデータも受け取りたい。


ターゲットの文字列は、
aa,,bb,,,,

結果
StringTokenizer
[aa]
[bb]
-------------
split
[aa]
[]
[bb]
-------------
commons StringUtils splitPreserveAllTokens
[aa]
[]
[bb]
[]
[]
[]
[]
-------------
using indexof substrin
[aa]
[]
[bb]
[]
[]
[]




使用したソースです。
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import org.apache.commons.lang.StringUtils;

public class TestTokenizer {

public static void main(String[] args) {
String s = "aa,,bb,,,,";
System.out.println("StringTokenizer");
a(s);
System.out.println("-------------");
System.out.println("split");
b(s);
System.out.println("-------------");
System.out.println("commons StringUtils splitPreserveAllTokens");
c(s);
System.out.println("-------------");
System.out.println("using indexof substring ");
d(s);
}

/**
* 途中の値が入っていない値、お尻がとれない。
*
* @param s
*/
public static void a(String s) {
StringTokenizer tokenizer = new StringTokenizer(s, ",");
while (tokenizer.hasMoreTokens()) {
System.out.println("[" + tokenizer.nextToken() + "]");
}
}

/**
* お尻がとれない。
*
* @param s
*/
public static void b(String s) {
String[] strings = s.split(",");
for (String string : strings) {
System.out.println("[" + string + "]");
}
}

/**
* この値の取得が求めていたもの。
*
* @param s
*/
public static void c(String s) {
String[] strings = StringUtils.splitPreserveAllTokens(s, ",");
for (String string : strings) {
System.out.println("[" + string + "]");
}
}

/**
* この実装はたまたまみつけたもの。この実装だとお尻がとれない。
*
* @param s
*/
public static void d(String s) {
String delim = ",";
List<String> list = new ArrayList<String>();

int delimCharIndex = 0;
while (s.length() != 0) {
delimCharIndex = s.indexOf(delim);
if (delimCharIndex == -1) {
list.add(s);
s = "";
} else {
String subString = s.substring(0, delimCharIndex);
list.add(subString);
s = s.substring(delimCharIndex + 1);
}
}

for (String string : list) {
System.out.println("[" + string + "]");
}
}
}



20070803 H氏からコメントをいただいたので掲載

String[] strings = s.split(",");



String[] strings = s.split(",", -1);

とすれば「カンマ区切りを行いたい。値がない区切りデータも受け取りたい。」ができます。


あっなるほど。

javascript greasemonkey上から関数を上書き 2007/07/24

どうもIEにしかない命令をよんで、javascriptがエラーになっていたようなので、greasemonkey上から関数を上書きしてみた。


var root = typeof unsafeWindow == 'undefined' ? window : unsafeWindow ;

root.override = function (value) {
alert('override OK');
}



greasemonkeyでいろいろアイデアがでてきそう。


参考:

java CollectionUtils - コレクション同士の演算 2007/07/24

jakarta commonsのcollectionsです。
コレクション同士の演算です。
なかなか使う機会がないので試してみました。


集合の共通部分(intersection, meet)または積集合(product)を計算します。
A∩B

です。

package ccc;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;

public class C {

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

public static void a(){
class D {
String s;
public String toString(){
return s;
}
}
D d = new D();
d.s = "i am D.";

List<D> a = new ArrayList<D>();
List<D> b = new ArrayList<D>();

a.add(d);
b.add(d);

/* 積集合 */
Collection<D> e = CollectionUtils.intersection(a, b);
System.out.println(e.size());
System.out.println(e.toArray()[0]);

}
}

XML文書内に改行を含めたい。 2007/07/24

XMLファイルに改行を含めたい場合、文字参照?を使用します。


具体的には、
スペース文字(#x20)
改行(#xA)
タブ(#x9)
復帰+改行(#xD#xA)
復帰(#xD)
を使用するようですね。

それで、XMLには下記のように記述します。

<?xml version="1.0" encoding="UTF-8"?>
<a>
<b prop="スペース&#x20;です。" />
<b prop="改行&#xA;です。" />
<b prop="タブ&#x9;です。" />
<b prop="復帰+改行&#xD;&#xA;です。" />
<b prop="復帰&#xD;です。" />
</a>




javaのプログラムを利用してパースします。
結果は、
nodename:[#text] nodevalue:[
]
nodename:[b] nodevalue:[null]
attr:[prop] attrvalue:[スペース です。]
nodename:[#text] nodevalue:[
]
nodename:[b] nodevalue:[null]
attr:[prop] attrvalue:[改行
です。]
nodename:[#text] nodevalue:[
]
nodename:[b] nodevalue:[null]
attr:[prop] attrvalue:[タブ です。]
nodename:[#text] nodevalue:[
]
nodename:[b] nodevalue:[null]
attr:[prop] attrvalue:[復帰+改行
です。]
nodename:[#text] nodevalue:[
]
nodename:[b] nodevalue:[null]
attr:[prop] attrvalue:[復帰
です。]
nodename:[#text] nodevalue:[
]


下記のコードを利用しました。

import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class TestReadXml {

public static void main(String[] args) throws ParserConfigurationException,
SAXException, IOException {
a();
}

public static void println(String s) {
System.out.println(s);
}

public static void printNode(NodeList list) {
if (list == null)
return;
Node node;
for (int i = 0; (node = list.item(i)) != null; i++) {
println("nodename:[" + node.getNodeName() + "] nodevalue:[" + node.getNodeValue() + "]");
printAttr(node);
printNode(node.getChildNodes());
}
}

public static void printAttr(Node node) {
NamedNodeMap attrMap = node.getAttributes();
if(attrMap == null) return;
int attrs = attrMap.getLength();
for (int i = 0; i < attrs; i++) {
Node attr = attrMap.item(i);
println(" attr:[" + attr.getNodeName() + "] attrvalue:[" + attr.getNodeValue() + "]");
}
}

public static void a() throws ParserConfigurationException, SAXException,
IOException {
InputStream inputStream = TestReadXml.class
.getResourceAsStream("a.xml");

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(inputStream);

Element element = doc.getDocumentElement();
NodeList list = element.getChildNodes();
printNode(list);
}
}


java 全角、半角スペースが前後にある文字列のトリム 2007/07/23

シナリオ:

全角、半角スペースが前後にある文字列のトリムをしたい。


String付属のtrimだと期待する結果にならなかったので、正規表現使って削除を行っています。

String s = "    新宿    神楽坂    ";
System.out.println("[" + s + "]");
System.out.println("[" + s.trim() + "]");
s = s.replaceAll("^[\\s ]*", "").replaceAll("[\\s ]*$", "");// correct!!
System.out.println("[" + s + "]");


全角スペースをコードの中に含めています。

結果は、
[    新宿    神楽坂    ]
[   新宿    神楽坂   ]
[新宿    神楽坂]

groovy injectがよくわからない - rubyのレファレンスを参照 2007/07/22

injectがよくわからないので考えてみる。

rubyのinjectと似ているらしいのでrubyの説明をさがしてみる。

inject([init]) {|result, item| ... } (ruby 1.7 feature)
最初に初期値 init と self の最初の要素を引数にブロックを実行します。2 回目以降のループでは、前のブロックの実行結果と self の次の要素を引数に順次ブロックを実行します。そうして最後の要素まで繰り返し、最後のブロックの実行結果を返します。

要素が空の場合は init を返します。

初期値 init を省略した場合は、最初に先頭の要素と 2 番目の要素をブロックに渡します。この場合、要素が 1 つしかなければブロックを実行せずに最初の要素を返します。要素が空なら nil を返します。Rubyリファレンスマニュアル - Enumerable


Enumerableは、辞書で調べると、【形】 可算{かさん}の とか 帰納的{きのうてき}という意味があります。

えーと
例えば、
[1,2,3,4,5]という配列があって、
[1, 2, 3, 4, 5].inject(0){i, j -> i + j }
と書く場合は、えーと、[1,2,3,4,5]という配列があって、それにinjectという命令をだして、その初期値が0で、
ループ開始は、i の値は、初期値の0,   j は配列の最初の値で、1になって、i + jが次のループの i になる。
イメージしやすくするために、下記のようなコードを実行すると、

println( "result:" + [1,2,3,4,5].inject(0){i, j -> print "(${i} + ${j}) "; i + j })

結果は、
(0 + 1) (1 + 2) (3 + 3) (6 + 4) (10 + 5) result:15

となる。

少しはイメージできるかな。

h-index - 情報食物連鎖末端でgroovy



というのがあった。

単純にコードのうつしかえをしてみようとしたが、Arrayを拡張したような使い方?(なんという仕組みだろう)をgroovyで表現する方法がわからなかったので、それは断念。


class h {
/* static */
static def hiindex (arr){
arr.reverse().inject( 0 ){ result, item -> if(item <= result) return result ; result + 1}
}

static void main(args) {

def h = {
it.reverse().inject( 0 ){ result, item -> if(item <= result) return result ; result + 1 }
}

println( "result:" + [1,2,3,4,5].inject(0){i, j -> print "(${i} + ${j}) "; i + j })
println( [1,2,3,4,5].reverse().inject( 0 ){ result, item -> if(item <= result) return result ; result + 1})
println( [0,10,20,30,40].reverse().inject( 0 ){ result, item -> if(item <= result) return result ; result + 1})
println(hiindex([0,10,20,30,40]))

assert 4 == h([0,10,20,30,40])
assert 4 == h([0,10,20,30,40])
assert 4 == h([10,20,30,40])
assert 3 == h([20,30,40])
assert 2 == h([30,40])
assert 1 == h([40])

assert 3 == h([1,2,3,4,5])
assert 2 == h([1,2,3,4])
assert 2 == h([1,2,3])
assert 1 == h([1,2])
assert 1 == h([1])

assert 3 == h([3,3,3])
assert 2 == h([3,3])
assert 1 == h([3])

assert 0 == h([0,0])
assert 0 == h([0])
assert 0 == h([])

}

}

Smalltalkを学びたいと思うもうひとつの理由 2007/07/22

私は,20代の中頃,縁に恵まれてSmalltalkを勉強し始め,13年もの長きに渡って使い続けてきました。私たちは,話す能力というか,抽象化する能力というか,構造化する力を持って生まれてきます。しかし,インドのアマラとカマラの姉妹や,アヴェロンの野生児に見るように,ある時期に,ある言語の世界というか,ある社会の中に置かれなければ,言語を操ることができなくなってしまいます。この本は,ぜひ,母国語としてのプログラミング言語を探し求めているプログラマに読んでいただきたいと思います。また,Basic, C++, Java, HTMLなどの多くのプログラミング言語を,そこそこ操れるのだけれど,これぞという決め手の言語に欠けるプログラマにもお薦めします。Smalltalk Idioms, Chapter 1

lispを勉強しないといけないなと思うもうひとつの理由 2007/07/21

「S式は異星人の言葉」というのは、S式が森羅万象ってことが理解できない
人が多いってことね。プログラムばっかりやってるから、わからないんだよ。
 文学と哲学を勉強しましょう。\(^O^)/
 (と)の間に全宇宙があるんです。\(^O^)/
 (と)の間に何を入れてもいいし、それをどう解釈してもいいのがLispの基本。
 ただし、無限の自由は人を不安にするから、CLやSchemeの標準では、デフォ
ルトではこういうものを入れて、こういう解釈をしますよと決めてるだけ。そ
れだけわかれば、あとは所詮プログラムという下世話な話。\(^O^)/Gauche Night: ホットコーナーの舞台裏

Dylan - 気になる言語 2007/07/21

気になる言語。


下記のリンク経由で知りました。

java アプリケーション引数の処理 - jakarta commons CLI 便利ですね。 2007/07/20

アプリケーション引数(コマンドラインオプション)の解析です。
いまとなっては自分でつくるより、CLI(Command Line arguments parser)を使用したほうがよさげ。
調べればすぐみつかるけど、とりあえず簡単な使い方の流れ。
(1)欲しい引数を決定
(2)引数をチェック、失敗したら使い方表示
(3)引数の値をとりだして使用

おおまかにこの流れだと思う。

ライブラリは、ここから取得。


最近、まとめて更新しているようですね。

とりあえずサンプル。

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;


public class Aaa {

public static void main(String[] args) {
final String PARAM = "PARAM";

/*
* アプリケーション引数設定
*/
Options options = new Options();
Option optProp = new Option(PARAM, true, "説明");
optExecuteClass.setRequired(true);
options.addOption(optExecuteClass);


/*
* 引数チェック
*/
GnuParser parser = new GnuParser();
CommandLine line = null;

try{
line = parser.parse(options, args);
} catch(ParseException e){
HelpFormatter helpFormatter = new HelpFormatter();
helpFormatter.printHelp("使い方", options);
return;
}

/*
* オプションの値を取得
*/
System.out.println(line.getOptionValue(PARAM));
}
}

Oh groovy girl - 最近、groovyが好きなので。 2007/07/19



Groovy girl!!

perl 正規表現 あとで調べる 2007/07/19
2007/07/22

正規表現の勉強中


ででてきた、

$str =~ s{\A # start of the string
\s* # spaces
( [\(\)] # open/close paren
| [^\s\()]+ # or atom
)
}{}x


現在わかっている範囲だと、
置換オペランド
$text =~ s{
... ここに多くのコメントを伴う大きな正規表現がくる...
} {
...評価されると置換テキストを生成するPerlの部分プログラム...
}ex;

ちなみに、詳説正規表現にあった。



をあとで調べる。

groovy grovletから別groovyファイルを読み込む - クラスローダー使用版 2007/07/17

groovletから別のgroovyを読み込む方法です。

シナリオ:

groovletから別のgroovyファイルに定義されたクラスを利用したい。


ちょっと調べた範囲だと、groovletからクラスローダーを使用してインスタンスをつくるという方法しかないような...

DIコンテナを使用して、上から依存するオブジェクトを渡す(注入する)というのがベストな解な感じがしますが、そうするとDIコンテナに依存してしまうのがちょっと嫌かな。

groovletからクラスローダーを使用してgroovyファイルを読み込むサンプルです。
groovletと同じ場所にgroovyファイルがあることを想定しています。

しかし、この方法だと毎回コンパイルしているのだろうか?
要調査。

ベースのコードはgrooveletのサンプルです。

import java.util.Date
import java.lang.ClassLoader
import groovy.lang.GroovyClassLoader

if (session == null) {
session = request.getSession(true);
}

if (session.counter == null) {
session.counter = 1
}

ClassLoader parent = getClass().getClassLoader();
GroovyClassLoader loader = new GroovyClassLoader(parent);
Class groovyClass = loader.parseClass(new File(context.getRealPath('/') + 'z.groovy'));

// let's call some method on an instance
GroovyObject z = (GroovyObject) groovyClass.newInstance();

println """
<html>
<head>
<title>Groovy Servlet</title>
</head>
<body>
Hello, ${request.remoteHost}: ${session.counter}! ${new Date()} ${ z.ok() }
</body>
</html>
"""
session.counter = session.counter + 1



class z {

static void main(args) {
print z.ok()
}

static public String ok(){
"ok o_o! ok"
}
}

java 非公式なVE eclipseプラグインが更新されていました。 2007/07/17

今までのあらすじ

現状の最新のeclipse3.3では、公式なvisual editorのプラグインが提供されていません。
それで、Erik Hechtさんという方が非公式なvisual editorを作成して公開していました。


非公式なVE eclipseプラグインが更新されていました。

ニュースグループ


Erik Hechtサイト

groovy i=nからmまでの関数値f(i)の総和Σf(i)だそうです。 2007/07/16

groovyの練習になるような題材がないかなとさがしていて、

というのをみつけたので、ためしてみました。

たんにwhileをforに書き換えてみただけですが。

シナリオ:
i=nからmまでの関数値f(i)の総和Σf(i)




class test_closure_2 {

static void main(args) {

def sigma = {n, m, f ->
int total = 0
for(i in n..<(m+1)){
total += f(i)
}
total
}

println sigma(1, 10, {x->x})
println sigma(1, 10, {x-> x * x })
}
}




groovy switchステートメントでClosureを判定 2007/07/16

groovyのswitchです。
いろいろなものがcaseに使えて便利ですね。



ふとクロージャーもCaseとして判定できるのかなと思って試してみました。
判定できますね。



class test_switch {

static void main(args) {

def c = {
println "i am closure ${it}"
}
a(c)
a('inList')
a(17)
}

static void a(x){
def result = ""

switch ( x ) {
case "foo":
result = "found foo"
break
case [5, 6, 7, 'inList']:
result = "list"
break
case 12..30:
result = "range"
break
case Integer:
result = "integer"
break
case Number:
result = "number"
break
case Closure:
result = "closure"
break
default:
result = "default"
}

println result
}

}

オブジェクトのまとめかた、操作について、なんとなく考えたことのメモ 2007/07/15

ところで、デコレートパターンについて考えた。結論はないのだけども。

javaでこのパターンの適用として成功しているものとしての説明としては、java.io.*がよく例にあげられるみたい。

さて、このパターンがうまくいく場合って、実際にはどういう場合なんだろう?



ひとつのオブジェクトが別のオブジェクトから構成されるような図のオブジェクトグラフを操作単一クラスで操作したい場合にさてデコレートパターンを適用するってどういう感じになるのだろう。そもそも

何か勘違いしているような気がするな。

ちなみに、図のオブジェクトグラフは、データオブジェクトの集まりとして、さらにこれをMapにしてみたとする。下記の図のようになるのかな。



で、データオブジェクトをMapで作成したいという考えには、Mapのキーを文字列にした場合に、他の定義との親和性が高くなるからそうしたい気持ちがあるだと思う。

例えば、プロパティとgetter,setterのデータオブジェクトの場合(javaならPOJO)、他の定義とマッピングする場合、コード上の変換が面倒になるから。getter,setterをコードで書くの面倒だということなんだよね。

Mapだとキーの配列があってぐるぐるまわせば、値の出し入れができるから。

しかし、Mapだとオブジェクトグラフを表現する場合にその性質上、なんでも格納することが可能なので、厳密ではなくなる。木構造で保持したいオブジェクトグラフが簡単に壊すことができる。
とはいってもMapに格納するデータの型を決定してしまえばいいのだけれども。

それとはべつにどこにデータオブジェクトのキーを設定するのかということも気にしないといけない。

そもそもドメインオブジェクトの実装をMapにするというアイデアはあまりよくないのかもしれない。
オブジェクト構造をもたないフラットなデータの集まりであれば、いいのだが、関連をもつオブジェクトグラフをMapにうつすのはできないと思う。

クラスのもつ型が強力な制約になると考えているのだけども、それをすててしまうのももったいない気がする。

とつらつら考えた。
全然、的を得ていないな。

groovy パスカルの三角形 - 簡単なルールから作成してみた。 2007/07/15

groovyの練習がてらに作成。
やはり目的指向のプログラミングのほうが調べる努力しますね。

自分がgroovyの配列、ループがよくわかっていないことがよくわかりました。。。

シナリオ:

パスカルの三角形を10段まで表示してください。


結果:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
[1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]


class A {

static void main(args) {
a()
}

public static void a() {
def n = [0];
n[0] = 1;
for (i in 0..<11) {
println(n);
n = n(n);
}
}

public static int[] n(n) {
def is = []
is[0] = n[0];
for (i in 1..<n.size()){
is[i] = n[i - 1] + n[i]
}

is[(n.size() + 1) - 1] = 1;
return is;
}

}

java パスカルの三角形 - 簡単なルールから作成してみた。 2007/07/13

確率とかの本ででてきたので、ちょっとためしてました。

シナリオ:

パスカルの三角形を10段まで表示してください。


パスカルの三角形とは、パスカルの三角形 - Wikipediaです。

簡単なルールは、
この三角形の作り方は単純なルールに基づいている。まず最上段に1を配置する。それより下の行はその位置の右上の数と左上の数の和を配置する。例えば、5段目の左から2番目には、左上の1と右上の3の合計である4が入る...パスカルの三角形 - Wikipedia


ルールがわかればプログラムに落とすのはなんとなくできますね。

結果です。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
1 10 45 120 210 252 210 120 45 10 1


コードはjavaです。

package pascal;

public class Test {

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

public static void a() {

int[] n = new int[1];
n[0] = 1;
for (int i = 0; i < 11; i++) {
print(n);
n = n(n);
}

}

public static int[] n(int[] n) {

int[] is = new int[n.length + 1];
is[0] = n[0];
for (int i = 1; i < n.length; i++) {
is[i] = n[i - 1] + n[i];
}
is[is.length - 1] = 1;
return is;
}

static void print(int[] is) {
for (int i : is) {
System.out.print(i + " ");
}
System.out.println();
}

}

groovy Groovlets - jettyで動かす。 2007/07/12

javaとの親和性がたかそうなので、しばらくgroovyで遊ぼうという一貫で、Groovletsをためしてみる。

Groovy - Groovlets

コメットをサポートしているという話なので、jetty6を使用して、Groovletsを動かすことにチャンレンジ。
上記のサイトをみれば簡単なのだけども、必要なライブラリをantとantlrをまちがえてしばし悩む。

java.lang.NoClassDefFoundError: antlr/TokenStreamException


まちがえると実行時に例外が発生します。

動作させるのに使用したlibは、
asm-2.2.jar
groovy-1.0.jar
antlr-2.7.5.jar

java cglibでmixin - mixinってなんだろう。 2007/07/11

既に生成されたオブジェクトにたいして、あらたにマーカーインターフェイスを付加できたらいいなと考えました。それでCGLIBを使用した方法です。

参考:
cglib メモ
非常に参考になりました。

CGLIB
Code Generation Library - Code Generation Library

シナリオ:

既に生成されたオブジェクトにたいして、あらたにインターフェイスを付加する


package mixin;

import net.sf.cglib.proxy.Mixin;

public class Test {

public static void main(String[] args) {
new Test().testMixin();
}

void testMixin() {

C c = mixin(new A() {

@Override
public void a() {
System.out.println("o_o i am A!!");
}
});

/* もとの型を保持しているかチェック */
if (c instanceof A) {
((A) c).a();
}
c.c();
}

/*
* クラス配列とクラス配列を連結します。
*/
static Class[] concat(Class[] a, Class[] b) {
Class[] arr = new Class[a.length + b.length];
System.arraycopy(a, 0, arr, 0, a.length);
System.arraycopy(b, 0, arr, a.length, b.length);
return arr;
}

interface A {
public void a();
}

interface C {
public void c();
}

/*
* もとのオブジェクトにたいして、Cインターフェイスを付け加えます。
*/
public C mixin(Object o) {

Class[] interfaces = concat(new Class[] { C.class }, o.getClass()
.getInterfaces());

Object[] delegates = new Object[] { new C() {

@Override
public void c() {
System.out.println("i am C o_o!");
}
}, o };
Object obj = Mixin.create(interfaces, delegates);

C c = (C) obj;

return c;
}
}


ちなみに変な挙動する箇所を一箇所みつけたのですが、時間があるときに追求しようと思います。
というのは、

Object[] delegates = new Object[] { new C() {

@Override
public void c() {
System.out.println("i am C o_o!");
}
}, o };

のオブジェクトの配列を変えるだけで、
Exception in thread "main" java.lang.ClassCastException: mixin.Test$2 cannot be cast to mixin.Test$A
at mixin.Test$C$$MixinByCGLIB$$e894d247.a()
at mixin.Test.testMixin(Test.java:23)
at mixin.Test.main(Test.java:8)

といった例外が発生してしまいます。

何故でしょうか?

java window SetWindowPosのまたちがった使用方法 - 隠れたwindowを表にだす方法として使えるか? 2007/07/10
2007/07/19

windowsで隠れたjava画面を表にだすためのアイデア
使えるだろうか。

javaバージョンは1.4
プラットフォームはwindows XP

eclipseのswtを使用している。

他にもいろいろ使用してみたのだけども、画面が表にでてくる方法をみつけることができなかった。
単純だけど、下記のコードは効果があった。


final int hWnd = OS.FindWindow(null, new TCHAR(OS.CP_INSTALLED,
windowTitle, true));
if (hWnd == 0) {
System.out.println("failed find window:[" + hWnd + "]");
return;
}

RECT rect = new RECT();
OS.GetWindowRect(hWnd, rect);
System.out.println("rect=" + rect.left + " " + rect.top + " "
+ rect.right + " " + rect.bottom);
RECT client = new RECT();
OS.GetClientRect(hWnd, client);
POINT pt = new POINT();
OS.ClientToScreen(hWnd, pt);
OS.SetWindowPos(hWnd, OS.HWND_TOPMOST, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, OS.SWP_ASYNCWINDOWPOS);


OS.HWND_TOPMOSTだとずーとトップに画面がでっぱなしになるので、これをOS.HWND_TOPと変更するとよいです。

もとねたはVBのコードから
SetForegroundWindow でアクティブにならない場合には?

win32でJNI気分 2007/07/10

win32でJNI気分で作成手順、自分のためのメモ

ちなみに、いまボーランドというよりコードギアって感じですかね。

Borland C++ Compiler 5.5日本語版のインストールの方法

civic site : JNIを使ってWin32 APIを実行するサンプル

忘れないようにとりあえず、

ヘッダーつくるのは下記のような感じで。

javah -classpath ../bin -d . Native


下記のような感じでコンパイル
bcc32 -WD -I"C:\Program Files\Java\jdk1.6.0\include" -I"C:\Program Files\Java\jdk1.6.0\include\win32" Native.cpp

並行処理のための手習い - java 複数の処理を同時に行いたい 2007/07/10

シナリオ:

複数の検索エンジンを同時に検索して、その検索結果をまとめて取得したい。


javaを使用しています。
なんとなくできているようにはみえるけど。

Thread.sleepを使用して時間がかかっている感じをだしてます。
invokeAllで一斉に作業させている感じですね。
それで、それぞれ仕事がおわって結果リストになるという感じ。


package th;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Test {

public static void main(String[] args) throws InterruptedException,
ExecutionException {
new App().search("検索文字列");
}

interface Searcher {
String search(String target);
}

static class App {
ExecutorService executor = new ThreadPoolExecutor(10, 10, 30000,
TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>());

Searcher searcher = new Searcher() {

@Override
public String search(String target) {
/*
* do search!!
*/
return target;
}
};

/**
* <p>
* 擬似的に複数検索を行っているように振舞います。
* </p>
*
* @param searchWord
* @throws InterruptedException
* @throws ExecutionException
*/
void search(final String searchWord) throws InterruptedException,
ExecutionException {

List<Callable<String>> list = new ArrayList<Callable<String>>();
list.add(new Callable<String>() {
public String call() throws InterruptedException {
Thread.sleep(5000);
return searcher.search("yahoo:" + searchWord);
}
});

list.add(new Callable<String>() {
public String call() throws InterruptedException {
Thread.sleep(1000);
return searcher.search("google:" + searchWord);
}
});

list.add(new Callable<String>() {
public String call() throws InterruptedException {
Thread.sleep(1000);
return searcher.search("other search engine:" + searchWord);
}
});

List<Future<String>> list2 = executor.invokeAll(list);
Iterator<Future<String>> it = list2.iterator();
/*
* 結果を表示します。
*/
while (it.hasNext()) {
Future<String> future = it.next();
System.out.println(future.get());
}
executor.shutdown();
}

}

}


8人の女王に再再チャレンジ - 一応バックトラック 2007/07/06

8人の女王はバックトラックの例題でよくでてくるようです。

バックトラッキング - Wikipedia

バックトラックとは、だめだったらひとつもどって再チャレンジという感じです。


8X8で92みつかりましたので、正解だと思います。

下記のコードは一応バックトラックしてます。
8人の女王はほかにビットをつかったりして計算させる方法など、高速化の方法もあるようです。


package queen8;

public class TestQueen8 {

static class Board {

boolean[][] B;
int N;

public Board(int N) {
this.N = N;

B = new boolean[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
B[i][j] = false;
}
}

}

public void set(int x, int y) {
B[x][y] = true;
}

public boolean check(int x, int y) {

// check H
if (!checkHLine(x, y)) {
return false;
}

// check V
if (!checkVLine(x, y)) {
return false;
}

// check cross
if (!checkCross(x, y)) {
return false;
}

return true;
}

public void unset(int x, int y) {
B[x][y] = false;
}

public boolean checkHLine(int x, int y) {
for (int i = 0; i < N; i++) {
if (get(i, y) && !(x == i)) {
return false;
}
}
return true;
}

public boolean checkVLine(int x, int y) {
for (int i = 0; i < N; i++) {
if (get(x, i) && !(y == i))
return false;
}
return true;
}

public boolean checkCross(int x, int y) {
if (get(x, y))
return false;

int ux, uy;
ux = x;
uy = y;

// up left
for (;;) {
ux -= 1;
uy -= 1;
if (!(0 <= ux && 0 <= uy))
break;
if (B[ux][uy])
return false;
}
// up right
ux = x;
uy = y;

for (;;) {
ux += 1;
uy -= 1;
if (!(ux < N && 0 <= uy))
break;
if (B[ux][uy])
return false;
}
// down left
ux = x;
uy = y;
for (;;) {
ux -= 1;
uy += 1;
if (!(0 <= ux && uy < N))
break;
if (B[ux][uy])
return false;
}

// down right
ux = x;
uy = y;
for (;;) {
ux += 1;
uy += 1;
if (!(ux < N && uy < N))
break;
if (B[ux][uy])
return false;
}
return true;
}

public boolean get(int x, int y) {
return B[x][y];
}

public int size() {
return N;
}

public int countQueen() {
int cnt = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (B[i][j])
cnt++;
}
}
return cnt;
}

public void disp() {
int cnt = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
System.out.print((B[i][j] ? "1" : "0") + " ");
if (B[i][j])
cnt++;
}
System.out.println();
}
}
}

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

public static void a() {
int N = 8;
Board board = new Board(N);

fill(0, board);

System.out.println();
System.out.println("total:"+cnt);
}
public static int cnt = 0;

public static void fill(int k, Board board) {
if (k < board.N) {
for (int i = 0; i < board.N; i++) {
if (board.check(k, i)) {
board.set(k, i);
fill(k + 1, board);
board.unset(k, i);

}
}
} else {
board.disp();
System.out.println("count:" + board.countQueen());
cnt++;
}
return;
}
}

8人の女王に再チャレンジ - 一応できたけど... 2007/07/05

8人の女王に再チャレンジ、一応ひとつ解をもとめることはできたけども、どうもいい感じではないです。

一応、コードは再帰しているのでそれっぽい感じにはなっています。

1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
count:8



package queen8;

public class TestQueen8 {

static class Board {

boolean[][] B;
int N;

public Board(int N) {
this.N = N;

B = new boolean[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
B[i][j] = false;
}
}

}

public void set(int x, int y) {
B[x][y] = true;
}

public boolean check(int x, int y) {

// check H
if (!checkHLine(x, y)) {
return false;
}

// check V
if (!checkVLine(x, y)) {
return false;
}

// check cross
if (!checkCross(x, y)) {
return false;
}

return true;
}

public void unset(int x, int y) {
B[x][y] = false;
}

public boolean checkHLine(int x, int y) {
for (int i = 0; i < N; i++) {
if (get(i, y) && !(x == i)) {
return false;
}
}
return true;
}

public boolean checkVLine(int x, int y) {
for (int i = 0; i < N; i++) {
if (get(x, i) && !(y == i))
return false;
}
return true;
}

public boolean checkCross(int x, int y) {
if (get(x, y))
return false;

int ux, uy;
ux = x;
uy = y;

// up left
for (;;) {
ux -= 1;
uy -= 1;
if (!(0 <= ux && 0 <= uy))
break;
if (B[ux][uy])
return false;
}
// up right
ux = x;
uy = y;

for (;;) {
ux += 1;
uy -= 1;
if (!(ux < N && 0 <= uy))
break;
if (B[ux][uy])
return false;
}
// down left
ux = x;
uy = y;
for (;;) {
ux -= 1;
uy += 1;
if (!(0 <= ux && uy < N))
break;
if (B[ux][uy])
return false;
}

// down right
ux = x;
uy = y;
for (;;) {
ux += 1;
uy += 1;
if (!(ux < N && uy < N))
break;
if (B[ux][uy])
return false;
}
return true;
}

public boolean get(int x, int y) {
return B[x][y];
}

public int size() {
return N;
}

public int countQueen() {
int cnt = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (B[i][j])
cnt++;
}
}
return cnt;
}

public void disp() {
int cnt = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
System.out.print((B[i][j] ? "1" : "0") + " ");
if (B[i][j])
cnt++;
}
System.out.println();
}
}
}

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

public static void fail_3() {
int N = 8;
Board board = new Board(N);

fill(0, board);

board.disp();
System.out.println("count:" + board.countQueen());
}

public static boolean fill(int k, Board board) {

if (k < board.N) {
for (int i = 0; i < board.N; i++) {
if (board.check(k, i)) {
board.set(k, i);
if (!fill(k + 1, board)) {
board.unset(k, i);
}
}
}

}
return board.countQueen() == board.N;

}
}

swt-awt swtのBrowserをswingの上で表示するための準備 2007/07/03
2007/07/04

引数でもらったCanvasにSWTのBrowserを貼り付けます。
注意しないといけないのが、このCanvasはもちろん他のJFrameのような部品に既にのっていて、setVisibleしていないといけないようです。

SWT: The Standard Widget Toolkit

peerが生成されていない場合に発生する例外

ERROR_INVALID_ARGUMENT - if the parent's peer is not created


参考:

public static void b(java.awt.Canvas canvas, File file)
throws MalformedURLException {

Display display = new Display();
Shell shell = SWT_AWT.new_Shell(display, canvas);
shell.setLayout(new FillLayout());

Browser browser = new Browser(shell, SWT.NONE);
boolean rc = browser.setUrl("http://www.yahoo.co.jp");
shell.setSize(canvas.getWidth(), canvas.getHeight());
shell.pack();

while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}

}

eclipse プラグイン ルビーでルビルビ Ruby - Eclipse Plugin 2007/07/03
2007/07/16

Dynamic Languages Toolkit

ぼーとしている間に、IDEが動的言語をつぎつぎサポートしていますね。

DLTをためしてみてますが、いい感じですね。
試しているのは、rubyのwindows版とjrubyでなのですが、両方ともプラグインからアクセスして実行できました。Hello Worldしか実行していませんが。。。

たまに実行モジュールへの設定がなくなってしまうのが気になりますが。

他にもeclipse上でRuby用のプラグインがあるようなので試してみたいところです。

現在のアップデートサイトは
http://download.eclipse.org/technology/dltk/updates

eclipse プラグイン グルービーでノリノリ Groovy - Eclipse Plugin 2007/07/03
2007/07/14

Groovy - Eclipse Plugin

eclipse3.3にインストールは簡単にできました。

現在のプラグインのアップデートサイトは
http://dist.codehaus.org/groovy/distributions/update/

eclipseでjavascript Adobe Labs - JSEclipse 2007/07/03

Adobe Labs - JSEclipse
がいいかんじです。

コード補完してくれるプラグインをさがしていたのですが、上記のプラグインはいいかんじです。

VEは死ぬのか、死んでいるのか? EclipseZone - Is VE Dead? ... 2007/07/03
2007/07/11

EclipseZone - Is VE Dead? ...

eclipse3.3になって3.2からあげたいのだけども、VEが使えないようなので困っています。
3.3になってeclipse上でrubyとかやりつつveでGUIとかの開発も同時にしたいなぁと考えているのに...

veのちょっと動向が気になります。

20070704(現在)、Erikさんという方が非公式ですが、3.3用のveを作成しています。
非公式な3.3用ve www.ehecht.com

ためしてみたところ、eclipse3.3のEclipse IDE for Java EE Developers 向けのwindows版を使用して、みたところ使えました。

WTPでないといけない理由は、2.0.0のorg.eclipse.jem.xxxxがふくまれているからのようです。どうもこのjemがキーみたいです。

ニューズグループ eclipse.tools.ve
Newsgroup: eclipse.tools.ve (web interface)

開発者のメーリングリスト
ve-dev Archive (Date View)

しばらくウォッチしていこうと思います。

2007-07-08


ve newsgroupで
Requested operation cannot be performed because it would invalidate the current configuration. See details for more information.
Visual Editor (1.3.0.200707070308) requires plug-in "org.eclipse.jem (2.0.0)", or compatible.

という質問をなげた人がいました。
やはりjemではまっているようでした。
それで、Erikさんは、下記のように回答していました。

to get it working simply install the WTP sdk, there is it included,
Otherwise wait until my next update I will include JEM.
I think its on Tuesday, because I'm actually remove warnings to bring some Packages to Java 1.5


単純にインストールするならWTPをインストールすればよいということです。
Erikさんはjemを含んだ版のveを用意しているようです。

僕自身は、EE開発版で動作させました。が、jdk1.4ターゲットのプロジェクトでは、veが動作しないところまでは確認しています

Active Record - 活動的なレコード? 2007/07/02

データと振る舞いを両方兼ねそなえている。

データベースにたいするドメインロジックを含んでいる。インサート、アップデート、デリートなどを含んでいる。

ドメインロジックが複雑な場合、ActiveRecordを使用するのではなくDataMapperを代わり使用するとよいようだ。

isomorphic 2007/07/02

isomorphic
同一構造の

有向グラフのための手習い 2007/07/01

A={a, b, c, d}の中の関係RがR={(a, a), (a, b), (a, d), (b, a), (b, b), (b, c), (c, a), (c, b), (d, c)}で与えられたとき、これをグラフで表現すると下記イメージとなります。



a, b, c, dをひとつの状態とみたてて、与えられた状態から次の状態へ遷移できるか判定する。


public class TestA {

enum A {
a, b, c, d
};

A[][] R = { { A.a, A.a }, { A.a, A.b }, { A.a, A.d }, { A.b, A.a },
{ A.b, A.b }, { A.b, A.c }, { A.c, A.a }, { A.c, A.b },
{ A.d, A.c } };

A nowState = A.a;

public boolean changeState(A state) {

for (int i = 0; i < R.length; i++) {
if (R[i][0] == nowState && R[i][1] == state) {
nowState = state;
return true;
}
}

return false;
}

public static void main(String[] args) {
TestA testA = new TestA();
A[] as = { A.a, A.d, A.b };
for (A state : as) {
if (!testA.changeState(state)) {
System.out.println("failed change state nowstate["
+ testA.nowState + "] nextstate[" + state + "] ");
break;
}
}

}

}