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

目次

一意なiteratorにする。 2008/01/31

Jakarta commonsのcollectionsです。

コレクションにあるた値で一意(ユニーク)なものだけ取得したい。


org.apache.commons.collections.iterators.UniqueFilterIteratorが使えそうです。

package collections;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.collections.iterators.UniqueFilterIterator;

public class TestUniqueFilterIterator {

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

public static void a(){
String[] ss = {"1", "1", "2", "2", "3", "3"};
List<String> list = Arrays.asList(ss);
Iterator<String> iterator = new UniqueFilterIterator(list.iterator());
while (iterator.hasNext()) {
String s = iterator.next();
System.out.println(s);
}


}
}


結果
1
2
3

コントローラーを重ねる 2008/01/30

データオブジェクトを操作するためのクラスを積み重ねる。




import java.awt.GridBagLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JPanel;

public class TestPanel extends JPanel {

private static final long serialVersionUID = 1L;

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

public TestPanel() {
super();
initialize();
addMouseListener(new Controllers());
}


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

class Controllers extends MouseAdapter{
List<Controller> list = new ArrayList<Controller>();

@Override
public void mousePressed(MouseEvent e) {
for (Controller controller : list) {
controller.mousePressed(e);
}
}
}

class Controller extends MouseAdapter{

}
}

googleのcom.google.common.collect.Listsをちょこっと使ってみた。 2008/01/28

Javaです。
googleのcom.google.common.collect.Listsです。
ユーティリティクラスですね。
import static して使うとよさげだと思います。

google-collections - Google Code

newArrayList
immutableList
transform
を使ってみました。

newArrayListを使うと一行で複数値を使ってのコンストラクトができていいですね。
transformの動作は実際に使うときに評価されて動作するようです。Javadocみたほうがいいかもです。

package google_collections;

import java.util.List;

import com.google.common.base.Function;

import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Lists.immutableList;
import static com.google.common.collect.Lists.transform;
import static java.lang.System.out;

public class TestLists {

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

public static void a() {

//(1) newArrayList
List<String> list = newArrayList("foo", "bar", "baz");

out.println(list.getClass());// java.util.ArrayList

//(2) immutableList
list = immutableList("foo", "1", "bar", "2", "baz", "3");

out.println(list.getClass());// com.google.common.collect.Lists$ImmutableArrayList

//(3) transform
List<Integer> list2 = transform(list, new Function<String, Integer>() {
public Integer apply(String s) {
out.println(s);
Integer integer = 0;
try {
integer = Integer.parseInt(s);
} catch (Exception e) {

}
return integer;
}
});

// lazy evaluation
System.out.println(list2);
}

}

Yahoo! User Interface Library (YUI)を使ってなめらか横スクロールのためのメモ 2008/01/27
2008/01/27

どうしてもなめらか横スクロールを実現したくて、いろいろさまよって結果、YUIを使うほうが簡単かもというの現在の結論です。

僕が調べた範囲ではjQueryを使ったサンプルの多くが、aタグだったので、よく理解できず、間口を拡げて検索かけたら、YUIを使ったサンプル説明ページがあったので、ためしたらすんなりできたので、とりあえず、YUIで。



必要なスクリプトファイルの数が正確に把握できていないのですが、
animation-min.js,dom-min.js,event-min.js,yahoo-min.js
って感じです。

横の場合のパラメータは、[横,0]です。
overflowがhiddenなdiv id=scrollerにsectionをならべて、その幅分を移動させるって感じでしょうか。


YAHOO.namespace('aaa');

YAHOO.aaa.doScroll = function(pos) {

var anim = new YAHOO.util.Scroll(
'scroller',
{scroll:{to:pos}},
0.5,
YAHOO.util.Easing.easeOut
);

//
anim.animate();
}


YAHOO.aaa.doScroll をアクションにしかけます。
呼び出しはYAHOO.aaa.doScroll ([横,0])って感じです。

<a href="#books"
onclick="YAHOO.aaa.doScroll([700, 0]);return false;" title="book"
>Books</a>


YUI、いろいろできそうですね。

xhtmlファイルでブラウザにレンダリングしてもらいたいときには。 2008/01/27

自己流のxhtmlで、ブラウザがレンダリングしてくれない場合、xml名前空間をしていないかもしれない。



下記のようにしておく。
<html xmlns="http://www.w3.org/1999/xhtml">

Yahoo pipesを使ってみて感想 - ざっくばらんに。 2008/01/26

yahoo.comのpipesを使ってみてます。



あまりにも簡単にサイトのデータをスクラッピング(scrapping)できるのでびっくりしています。
※もちろんそれなりに苦労しましたけど。感覚としては楽しい!!

ビジュアル系のプログラミングツールってどうかなって思っていたのですが、考え方を改めようと思います。
パイプをつなげていく感覚がしっくりきます。

何故なのかなぁと思ったのですが、プログラムって極端な話、あるデータが、別のデータ形式に形を変えて移動するようなものじゃないですか。たとえば、データベースからデータを取得して、変形して表示するって感じで。

それをプログラマさんがせっせっと変数という箱に代入して、加工して、また別の箱にうつして、ユーザがみえる画面にこつこつ配置するって感じで。

まあ、その過程ってパイプをつなげてそのパイプがつながったさきでいろいろとごにょごにょするって感じと似ていると思うんですよ。

で、UMLなんかの図で線ひっぱてつなげていく感覚とも近いのかな。
ほんと、業務でもUMLみたいな図を書いたらプログラムが動けばいいのにと思いますよ。

まあとにもかくにも、下手な僕なんかががりがりコード書くよりしっかりと動くものがつくれるのがすごい!!

あとですね、UIの表現がいいですね。
感心したのが、透明の使い方です。
まず下のような状況で、配線がわからなくなりそうですが、


手前のウイジエットが半透明になってくれるおかげで、うしろの配線が見える!!


なんだろうなぁ、これからこういったところへの配慮がアプリケーションのよさにつながっていくんだろうなと思ったりしてます。

グラデエントや、トランスペアレントとか、動きのエフェクトとか、実は、この辺当たりが次のユーザビリティにつながっていくのかとかなんとか。脳はそういう刺激を望んでいるだと思います。

pipesを使いこなすには、あと正規表現の知識は重要かもと思いました。結局文字列操作なので、効率(実行効率という意味ではなく)よく書くためにはどうしても。

かなりおすすめでYahooのpipes。

phpです。おしりのカンマを削除したいときにrtrim 2008/01/26

PHPです。

CSV出力するときに、ぐるぐるまわしてお尻にカンマをつけて、最後に帳尻あわせで、カンマを削除を消すってプログラムしています。

そんな時には、PHPではrtrimが便利そうです。



このrtrim関数には、削除したい文字列を指定できます。

$s = rtrim($s, ",");

って感じです。

phpでファイルの内容をまるごと文字列で取得したい場合は、file_get_contents 2008/01/26

ファイルを開いて、内容を取得するとき、別に一行一行をを配列として取得したくない場合は、file_get_contentsを使います。

phpのlistは関数ではなく、言語の構成要素です。 2008/01/26

PHPのlistが便利だったのでメモ。



単一の操作で一連の変数に代入できます。
これが便利!!

コード参考
list($no,$date,$num1,$num2,$num3,$num4,$num5,$num6,$numb,$prize1_cnt,$prize1,$pr
ize2_cnt,$prize2,$prize3_cnt,$prize3,$prize4_cnt,$prize4,$prize5_cnt,$prize5,$ca
rrry_over,$amount) = preg_split("/[\s]+/", $s, -1, PREG_SPLIT_NO_EMPTY);


何をしているかといいますと、文字列をスペース、改行、タブなどで区切られていたら、配列にして、それをlistを使って、名前がついた変数に一気に代入しています。

これの何がうれしいかといいますと、次にこれからSQLを作成するときは、こんな感じでできたり。
$insert = "INSERT INTO loto6 VALUES($no,'$date',$num1,$num2,$num3,$num4,$num5,$n
um6,$numb,$prize1_cnt,$prize2_cnt,$prize3_cnt,$prize4_cnt,$prize5_cnt,$prize1,$p
rize2,$prize3,$prize4,$prize5,$amount,$carrry_over)";


変数の名前が、データベースのテーブルの列名と一緒だとわかりやすいですね。

listいいなぁ。
で、これはもちろん関数ではないんですよね。言語の表現力って感じですかね。
PHPのマニュアルに書いてありました。

array() と同様に、 この関数は実際には関数ではなく言語の構成要素です。 list() は、 単一の操作で一連の変数に値を代入するために使われます。PHP: list - Manual


Perlだと似たようなことが、もっといろいろできると思う。

参考

fopenのモードは小文字で 2008/01/26

fopenとかで、指定するmodeなのだけど、これって小文字じゃないと通らないような...



で、インターネットでの情報で大文字で書いてあったりして真に受けて大文字で書いて、動かないとか...
基本的な情報は、マニュアルを直接見る習慣がないとだめだと思うんです。

ところで、
MySQLとか、PHPとかドキュメントは充実しているなぁと思います。
日本語で読めますもんね。

あと、JavaならバージョンにあったJavadocを参照する習慣が是非とも欲しい...
検索してJavadocをインターネット使ってみるっていうのはありでしょうけど...
是非とも手元に...
いや、別にいいんですけど。

僕も含めてなのですが、コピペプログラマはゼロからつくるのは苦手ですよね。

正規表現 日付さがし - YYYY-MM-DDをさがしてクォートしたい。 2008/01/26

MySQLのDATEはYYYY-MM-DDです。


それで、データベースにINSERTする際に、クォートせずに2008-01-26としていて、'2008-01-26'とクォートせずにインサートしていまいました。※設定でクォートせずに入れるための方法があるのでしょうか?

ものの見事に、すべてが0000-00-00となってしまいました。

仕方がないのでSQLを全部つくりなおそうとして、全ての日付をクォートしようとしたのですが、ここでふと悩みました。で、愛用しているCotEditorの置換で、正規表現でマッチしたもの参照して置き換えしたかったのですが、勝手がわからず、結局、eclipseを立ち上げたのでした。

emacs系とかのエディターに慣れていら悩まずにすんだのかもとおもいつつ...
YYYY-MM-DD日付にマッチさせるための正規表現は

(\d{2,4}-\d{1,2}-\d{1,2})


eclipseの画面のキャプチャー


で、すべての日付をクォートするためには、Replaceのニュ力フィールドに'$1'といれます。



replace allで全部クォートできます。

参考

JTableのセルのエディターにコンボボックスを使う 2008/01/25

各セルのコンボボックスの選択リストが変化する場合に工夫が必要となります。

まず、専用のエディターを作成(TableCellEditorを実装)します。そのときに、エディターの雛形としてコンボボックスを使います。実装としては、javax.swing.AbstractCellEditorを継承して、javax.swing.table.TableCellEditorをインプリメントして実装したほうが無難かなと思いました。まちがいも少ないと思います。

おそらく仕組みとしては、getTableCellEditorComponentがテーブルからよばれて、ユーザーが操作するエディターが表示されます。ユーザーの操作が終わるとTableは、getCellEditorValueを呼んで、テーブルモデルに適用する値を取得します。

package swing;

import java.awt.Component;
import java.awt.GridBagLayout;

import javax.swing.AbstractCellEditor;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;

import java.awt.GridBagConstraints;

public class TestTable extends JPanel {

private static final long serialVersionUID = 1L;
private JScrollPane jScrollPane = null;
private JTable jTable = null;

public TestTable() {
super();
initialize();
}

private void initialize() {
GridBagConstraints gridBagConstraints = new GridBagConstraints();
gridBagConstraints.fill = GridBagConstraints.BOTH;
gridBagConstraints.gridy = 0;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.gridx = 0;
this.setSize(300, 200);
this.setLayout(new GridBagLayout());
this.add(getJScrollPane(), gridBagConstraints);
}

private JScrollPane getJScrollPane() {
if (jScrollPane == null) {
jScrollPane = new JScrollPane();
jScrollPane.setViewportView(getJTable());
}
return jScrollPane;
}

private JTable getJTable() {
if (jTable == null) {
jTable = new JTable();
DefaultTableModel tableModel = new DefaultTableModel(5, 2);
tableModel.setColumnIdentifiers(new String[] { "A", "B" });

/*
* コンボボックス用のエディター
*/
class MyEditor extends AbstractCellEditor implements
TableCellEditor {

JComboBox comboBox = new JComboBox();

public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {

comboBox.removeAllItems();
for (int i = 0; i < 5; i++) {
comboBox.addItem(String.format("item(row:%d) %d", row, i));
}

return comboBox;
}

/*
* コンボボックスの選択された値を返します。
* @see javax.swing.CellEditor#getCellEditorValue()
*/
public Object getCellEditorValue() {
return comboBox.getSelectedItem();
}

}

jTable.setModel(tableModel);
jTable.getColumn("A").setCellEditor(new MyEditor());

}
return jTable;
}

}

mapのgetに正規表現みたいなもの使えないかなと思いそのための手習い。 2008/01/24

mapのgetに正規表現みたいなもの使えないかなと思いそのための手習い。



package a;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class A {

public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>() {
{
put("1234", "1234");
put("123A", "123A");
put("1236", "1236");
put("1237", "1237");
put("12390", "12390");
}
};

List<String> list = a("123x", map);
System.out.println(list);
}

static List<String> a(String k, Map<String, String> map) {
k = k.replaceAll("x", "[0-9]");

Iterator<String> iterator = map.keySet().iterator();

List<String> list = new ArrayList<String>();
while (iterator.hasNext()) {
String s = iterator.next();
if (s.matches(k)) {
// System.out.println(s);
list.add(map.get(s));
}
}

return list;
}

}

XMLConfiguration デフォルトでの値の取得方法とXPathを使用してとる方法です。 2008/01/24

CommonsのConfigurationです。

Configuraionは、いいAPIだと思います。

デフォルトでの値の取得方法とXPathを使用してとる方法です。



import java.io.ByteArrayInputStream;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.commons.configuration.tree.DefaultExpressionEngine;
import org.apache.commons.configuration.tree.xpath.XPathExpressionEngine;

public class TestXMLConfiguration {

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

static String s = "<root><a><b>test</b><c>test2</c></a></root>";

public static void a() throws ConfigurationException {

// xxxExpressionEngine
XPathExpressionEngine xpathExpressionEngine = new XPathExpressionEngine();
DefaultExpressionEngine defaultExpressionEngine = new DefaultExpressionEngine();
XMLConfiguration xml = new XMLConfiguration();

xml.load(new ByteArrayInputStream(s.getBytes()));

// (a) XPathExpressionEngine
xml.setExpressionEngine(xpathExpressionEngine);

System.out.println(xml.getString("a/b"));

// (b) DefaultExpressionEngine
xml.setExpressionEngine(defaultExpressionEngine);

System.out.println(xml.getString("a.b"));
}


}


expression engineを指定することで、パスの記述方法を変更します。

デフォルトだとドット区切りでパス指定を行います。

elseの中を太らせる習慣 2008/01/24

好みの問題ですよねー
下記のようなコードは苦手です。

public static void a(boolean isC) {
if (isC) {
c();
return;
} else {
b();
return;
}
}


上記のより、下のほうが好みかなー
public static void a(boolean isC) {
if (isC) {
c();
return;
}
b();
return;
}


elseの中を太らせる習慣がある人って、ひとつのメソッドが大きくなる傾向があると思うんですけど、どうなんでしょうかね。

Javaです。透明なウィンドウや矩形以外の形をしたウィンドウを作りたいのですが? 2008/01/23

Javaです。

透明なウィンドウや矩形以外の形をしたウィンドウを作りたいのですが?


Javaの実装によるようですね。
以前、MacOSX上のJavaで、Windowを透明にできたので、Windowsで同じことできないかいろいろためしていたのですが、なかなか実現できなくて悩んでいるのです。



もう少し調べてみます。

自分ドリブン - 走り抜けろ自分 2008/01/22

今日、久しぶりに「サラリーマン」という言葉を聞きました。



たしかに会社からサラリーをもらって生活しているからサラリーマンなんですよね。どこかに自分の中で誤解があって、ネクタイしなければサラリーマンではないのかと...そんなわけないのですが。

サラリーもらえば、それは立派なサラリーマンなのですね。ほほほ。

で、これからどうやっていこうかなぁと考えつつも、どうも自分は「他人様ドリブン」もしくは「環境ドリブン」なのです。何か、「自分ドリブンで生きてますって!!」って感じになりたいんですけどね。

反省です。すぐにバグだといってしまう自分へ。 2008/01/22

プログラム書いていて、すぐにバグだという人が近くにいるとげんなりしますよね。
バグはバグでもバグなので、バグなのですが、ナイーブな僕は結構気にしてしまいます。

Bloggerを使っていて、ページのタイトルが表示されなくなって、Bloggerがバグったと思いました。
そういったときの行動はすぐにグーグルさんにお伺いたてます。それでも、わからなくて、時間たってテンプレートをみましたら、「<title><data:blog.pageTitle/></title>」となっていなければいけないところが「<title><data:blog.pagetitle/></title>」となっていました。

大文字であるとこを小文字にしていたからなのでした。

おそらくどこからコピペしたのがまちがいだったのか、自分でタイプしたミスなのか。
反省です。

参考
Bloggerのページタイトルの文字化けなら。

LinuxからWindowsのIIS付属のFTPサーバーにアクセスするFTPクライアントのサンプルです。jakartaのcommonsのnetを使ってます。固まらないと思います。 2008/01/21

どうもLinuxの環境設定によって、FTPクライアントが固まるようになる場合があるので、それをさけるために、enterRemotePassiveMode、enterLocalPassiveModeを続けて呼んでいます。

この呼び出し順序でも動作が変わるようです。

サーバーがWindowsなので、setControlEncodingを設定しています。

多分、動くと思います。

org.apache.commons.net.ftp.FTPClient

よかったら動かしてみてください。


import java.io.IOException;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;

public class TestFtpClient4 {

/**
* LINUXからWindowsのIIS付属のFTPサーバーに接続します。
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
FTPClient client = new FTPClient();

// エンコーディング
client.setControlEncoding("SJIS");

try {

client.setDefaultPort(21);

// (1)
client.connect("アドレス"); // FTPサーバーのIPアドレス
// (2)
client.login("Anonymous", "passowrd"); // FTPサーバーのID,パスワード

// (3)
boolean isRemotePassive = client.enterRemotePassiveMode();

// (4)
client.enterLocalPassiveMode();

// (5)
boolean isOk = client.changeWorkingDirectory("/");
System.out.println("isOk" + isOk);

// (6)
FTPFile[] list = client.listFiles();
for (int i = 0; i < list.length; i++) {
String name = list[i].getName();
String group = list[i].getGroup();
System.out.println("group : " + group);
System.out.println("name : " + name);
}

} catch (SocketException e) {
throw e;
} catch (IOException e) {
throw e;
} finally {
if (client != null && client.isConnected()) {
try {
client.logout();
client.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("終了");
}
}
}

FTPClient簡単なサンプル 2008/01/21

使っているのは、commonsのnetです。

import java.io.IOException;
import java.net.SocketException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;

public class TestFtpClient {

public static void main(String[] args) throws Exception {
FTPClient client = new FTPClient();
client.setControlEncoding("SJIS");
try {
System.out.println("開始");
client.setDefaultPort(21);
client.connect("localhost"); // FTPサーバーのIPアドレス
client.login("Anonymous", "passowrd"); // FTPサーバーのID,パスワード
boolean isOk = client.changeWorkingDirectory("/");
System.out.println("isOk" + isOk);

FTPFile[] list = client.listFiles();
for (int i = 0; i < list.length; i++) {
String name = list[i].getName();
String group = list[i].getGroup();
System.out.println("group : " + group);
System.out.println("name : " + name);
}
} catch (SocketException e) {
throw e;
} catch (IOException e) {
throw e;
} finally {
if (client != null && client.isConnected()) {
try {
client.logout();
client.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("終了");
}
}
}

実行時のエンコーディングを指定します。 2008/01/21

javaです。

実行する際にデフォルトエンコーディングを指定します。

java -classpath ./ -Dfile.encoding=sjis A_Moji

java -classpath ./ -Dfile.encoding=utf-8 A_Moji

java -classpath ./ -Dfile.encoding=euc-jp A_Moji

って感じでしょうか。

話し変わって、
よくはまるのは、ssh,telnetとかでサーバーで接続して、ターミナルのエンコーディングの指定をまちがえてしまってアプリケーションが文字化けした文字列を出力していると勘違いすることでしょうか。

参考
Kawamura's ChangeLog - java のデフォルトエンコードの指定 -

JoSQL - JavaオブジェクトをSQL操作します。 2008/01/20
2008/01/20




おもしろそうなので試してみました。使い方がわからないので、適当につくってみました。実用的ではない、あまりおもしろみのないサンプルになってしまいました。

FROM区に指定するものがない場合は、nullで、Queryのexecuteにnullで渡せば動作するようです。

package josql;

import java.util.List;

import org.josql.Query;
import org.josql.QueryExecutionException;
import org.josql.QueryParseException;

public class A {

public A() {
}

public static void main(String[] args) throws QueryParseException,
QueryExecutionException {

final String s = "SELECT convert (12345), 12345, 1 + 1 FROM null";
Query q = new Query();
q.addFunctionHandler(new A());
q.parse(s);

List results = q.execute(null).getResults();
System.out.println(results);
}

public int convert(Number o) {
return o.intValue();
}
}


実際にはどう使うのだろう?


どうも、必要なファイルの集合を作成するとかにさくっと使えそうな感じです。あとは、パーソンオブジェクトとかを大量に作成して、その中の属性で集合を作成したりとか...

.NETにはLINQという統合言語クエリなるものがあるらしい




.NET LINQ (Language Integrated Query : 統合言語クエリ) というそうです。

それで、Java版にはJLINQなるものがあるそうです。




駆け足でサイトをみたのですが、むむ、結構いけてる気がする。そもそも、この領域ってマイクロソフトのほうが先行しているのかしら。

たしかにオブジェクトを集合の操作で扱えると便利かも。


たしかにオブジェクトを集合の操作で扱えると便利かもしれませんね。
とまえまえから思ってたのですが、LINQなるものがあるとは!!

結論


JoSQL的アプローチはおもしろいかも。

Blogger 関連ありそうな記事のリンクをつける。 2008/01/19
2008/01/20

I saw seashells.: Bloggerに「関連記事リスト」を。
上記のサイトを参考にさせてもらっています!!

詳細に関しては、もう少しデザインとか汎用性を高めてから書きたいと思いますが、気になる方はこのページなりJavascriptなファイルなりを参照して下さい。
I saw seashells.: Bloggerに「関連記事リスト」を。


とありましたので、javascriptを拝見して、ちょこちょこと書き直して適用してみました。

参考
I saw seashells.: BloggerのLabel Feedでエラーが・・。

Blogger TIpsです。目次をつける。 2008/01/19
2008/01/19

どうもこの「プログラマメモ2」は使い勝手がよくないです。
コードの断片を残しておいてあとから、それをコピペで使いたい場合は、検索で事足りるですが、過去の記事をみて、いろいろ考えようかなぁと思うとき、ブラウジングがよくない。

少しづつ打開したいので、「目次」をつけるにチャレンジしてみました。

clmemo@aka: Blogger に目次を設置する
clmemo@aka: Blogger の目次に投稿日を表示する



ついでに何故かnextprevが表示されていないことに気がつきました。
<data:newerpagetitle/>がうまく表示されていないのです。
しかたがないので、コードはそのままにして直で表示文字を入れました。
ホーム、新しいページ、より過去のページ

<b:includable id="nextprev">
<div class="blog-pager" id="blog-pager">
<b:if cond="data:newerPageUrl">
<span id="blog-pager-newer-link">
<a class="blog-pager-newer-link"
expr:href="data:newerPageUrl"
expr:id="data:widget.instanceId + &quot;_blog-pager-newer-link&quot;"
expr:title="data:newerPageTitle">
<data:newerpagetitle />新しいページ </a>
</span>
</b:if>
<b:if cond="data:olderPageUrl">
<span id="blog-pager-older-link">
<a class="blog-pager-older-link"
expr:href="data:olderPageUrl"
expr:id="data:widget.instanceId + &quot;_blog-pager-older-link&quot;"
expr:title="data:olderPageTitle">
<data:olderpagetitle />より過去のページ </a>
</span>
</b:if>
<b:if cond="data:blog.homepageUrl != data:blog.url">
<a class="home-link" expr:href="data:blog.homepageUrl">
<data:homemsg />ホーム </a>
<b:else />
<b:if cond="data:newerPageUrl">
<a class="home-link"
expr:href="data:blog.homepageUrl">
<data:homemsg />ホーム </a>
</b:if>
</b:if>
</div>
<div class="clear" />
</b:includable>


ちょっといい加減だなぁ

Javassistをまちがって、Javassitと書いたらグーグルの検索結果で上位にでた 2008/01/17
2008/01/20

かなり恥ずかしいですが、仕方がありません。誤字脱字誤解なんでもありの僕なので、見事な綴りまちがいで、グーグルの検索結果の上位になってしまいました。

javassitではなく、正しくはjavassistでした。

javassit

検索
http://www.google.co.jp/search?hl=ja&rls=GGGL%2CGGGL%3A2006-43%2CGGGL%3Aja&q=javassit&btnG=%E6%A4%9C%E7%B4%A2&lr=

雑記 ふとしたところからアスペクト指向 2008/01/17
2008/01/17

つれづれなるままに...

インターフェイスで結びついていると、インターフェイスを実装したモジュールをとっかえれば、ふるまいがかわる。
だけど、インターフェイスを使ってどう呼び出すかとという実装は、呼び出しもとに含まれている。
「他のクラスの定義の中に入りこんでいる」といえる。

インターフェイスを通して何もさせてくないと思い、必要ないならNullObject(何もしないインターフェイス実装)をとりいれたとしても、その呼び出しは残ったままとなる。

で、そもそその呼び出しもとに書かないで、必要なときにそれを織り込むということができるということ。

AOP(Aspect-Oriented Programming)
アスペクト指向プログラミング

アドバイズ:実行処理の単位
ポイントカット:《いつ》アドバイスを実行するか

関心の分離(separation of concerns)

プログミング言語の制約で、なかなか《関心の分離》がうまくいかない。

4774125814アスペクト指向入門 -Java ・ オブジェクト指向から AspectJプログラミングへ
千葉 滋
技術評論社 2005-11-18

by G-Tools

Javaコマンドの引数 -classpathについて 2008/01/17

Javaです。

本日ミスったのは、javaコマンドの-classpathで、直接、commons-loggin.propertiesを指定しまったことです。
-classpathで指定するのは、サーチ対象ディレクトリ、もしくはjar,zipファイルなんですよね。

それに気がつかず、直接、propertyファイルをパス指定したのがだめでしたOrz...

-classpath
A : separated list of directories, JAR archives,
and ZIP archives to search for class files.

Groovyで配列 2008/01/15
2008/01/20

うーん
そういわれれば、はてどうしたものかと一瞬悩んだ。

ついつい

def a = [1,2,3,4,5,6,7]

こうしてしまいます。これだとListなので、

def Object[] a = [1,2,3]
def b = [1,2,3] as Object[]


このどちらかでつくるっぽい。

参考
2007-12-18 - marsのメモ - Groovyで配列を作成する方法

流水算 2008/01/14

流水算は算数の文章問題でよくでてくるようですね。

式は、

静水での速さ=(下りの速さ+上りの速さ)/2
流れの速さ=(下りの速さ-上りの速さ)/2
上りの速さ=静水時の速さ-流れの速さ
下りの速さ=静水時の速さ+流れの速さ


速さを求める式は、
速さ=道のり/時間



参考
流水算 - Wikipedia

Java コレクションを演算できるのはやはり便利だと思う。 2008/01/13
2008/01/15

コレクションを演算できるはやはり便利だと思う。
CommonsのCollectionsはまだジェネリックに対応していないようですね。




import java.util.ArrayList;
import java.util.List;
import static org.apache.commons.collections.CollectionUtils.subtract;

public class A {

public static void main(String[] args) {
List<String> a = new ArrayList<String>(){{add("1");add("2");add("3");}};
List<String> b = new ArrayList<String>(){{add("6");add("2");add("7");}};

//差
List<String> c = (List<String>) subtract(a, b);
System.out.println(c);

}

}


Groovyで同じことをしてみます。
import static org.apache.commons.collections.CollectionUtils.subtract;

def a = [1,2,3,4,5,6,7]
def b = [1,2,4]

def c = subtract(a, b)

print c



Groovyだともっと直感的にできるっぽい。
そのまま引けばよい。

import static org.apache.commons.collections.CollectionUtils.subtract;

def a = [1,2,3,4,5,6,7]
def b = [1,2,4]

def c = subtract(a, b)
def d = a - b

assert c == d


といってもこの使い方でよいかわからないけど。

あと、共通の値を求めることができるintersectは、Groovyに用意されていた。
で、commonsのものとあわせてためしてみた。要sort。
import static org.apache.commons.collections.CollectionUtils.intersection

def a = [1,2,3]
def b = [1,2,3]

def c = intersection(a, b).sort()
def d = a.intersect(b)

assert c == d


グーグルのコレクション


Rubyのほうをちらりと見てみたら、いろいろできるようです。
Rubyリファレンスマニュアル - 機能別索引

JRubyのコンソールで試してみた。



関連

Arrays - Computing Union, Intersection, or Difference of Unique Lists

半径をrとしたときの、円周の長さをlとして、l = 2πr 2008/01/12
2008/01/12

半径6400kmの地球の赤道に沿ってロープを張るとします。地表から1m離してロープを張ると、何m余分に必要でしょう。これだけは知っておきたい数学の公式・定理 p.28


円周の長さを求める式は、「半径をrとしたときの、円周の長さをlとして、l = 2πr」です。

Javaで求めてみます。

public class A20080112 {

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

public static void a() {
double d = circumferentialLength((6400 * 1000) + 1)
- circumferentialLength(6400 * 1000);
System.out.printf("%gm%n", d);
System.out.printf("%.5gm%n", d);
System.out.printf("%.3gm%n", d);
System.out.printf("%em%n", d);
System.out.println(d + "m");
}

/**
* <p>
* 円周を求めます
* </p>
*
* @param radius
* @return
*/
public static double circumferentialLength(double radius) {
return 2 * radius * Math.PI;
}
}


結果
6.28319m
6.2832m
6.28m
6.283185e+00m
6.283185310661793m


あと、
System.out.printfで小数点を表示させるときは、%fを使用。


参考
円 (数学) - Wikipedia
半径 - Wikipedia
円周率 - Wikipedia

Oracle 集合Aから集合Bを引いてその結果を得たい。 2008/01/12
2008/01/13

集合Aから集合Bを引いてその結果を得たい。


手元にOracleデータベースがないので実験していなのですが、職場の方に教えてもらったのですが、MINUSが使えそうですね。


下記のサイト勉強になります!!

RDBに苦手意識が....

Java InputStreamのread(byte[] b)メソッド ありがちなまちがい 2008/01/10
2008/01/20

Javaです。
java.io.InputStreamのありがちなまちがいです。

下記のメソッドbadが悪い理由はわかるでしょうか?
※あまりいい例が浮かばなかった...

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class A {

public static boolean eq(Object o1, Object o2) {
if (o1 != null && o2 != null)
return o1.equals(o2);
return false;
}

public static String randomData(int length, String source) {

StringBuilder builder = new StringBuilder();
for (int i = 0; i < length; i++) {
builder.append(source.charAt((int) (Math.floor(Math.random()
* source.length()))));

}
return new String(builder);
}


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

String data = randomData(10, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
System.out.println(eq(data, bad(data)));

data = randomData(256, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
System.out.println(eq(data, bad(data)));

data = randomData(30000, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
System.out.println(eq(data, bad(data)));

data = randomData(10, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
System.out.println(eq(data, good(data)));

data = randomData(256, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
System.out.println(eq(data, good(data)));

data = randomData(30000, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
System.out.println(eq(data, good(data)));

}

/**
* <p>
* このメソッドは正しく文字列読めない.
* </p>
*
* @param data
* @return
* @throws IOException
*/
public static String bad(String data) throws IOException {
BufferedInputStream bis = null;
try {
bis = new BufferedInputStream(new ByteArrayInputStream(data
.getBytes()));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bs = new byte[256];
while (bis.read(bs) != -1) {
baos.write(bs);
}

return new String(baos.toByteArray());
} finally {
if (bis != null) {
bis.close();
}
}

}

/**
* <p>このメソッドはまずくない。</p>
* @param data
* @return
* @throws IOException
*/
public static String good(String data) throws IOException {
BufferedInputStream bis = null;
try {
bis = new BufferedInputStream(new ByteArrayInputStream(data
.getBytes()));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bs = new byte[256];
int size = 0;
while ((size = bis.read(bs)) != -1) {
baos.write(bs, 0, size);
}

return new String(baos.toByteArray());
} finally {
if (bis != null) {
bis.close();
}
}

}

}


結果は、
false
true
false
true
true
true
となります。

ありがちなのは、InputStreamのread(byte[] b)メソッドに渡すバッファの値が読み込まれるたびにクリアになって、読みこんだサイズ分しかバイトの配列ができないと思い込んでしまうことかなと。
(冷静になって考えれば、配列オブジェクトを渡しているのだからのその長さは変えられないことに気がつきそうですが...あせっていると...)

Javadocにはこう書かれています。
最初に読み込まれたバイトは要素 b[0] に格納され、次のバイトは b[1] に格納されます。読み込まれるバイト数の上限は、b の長さと同じです。ここで、k を実際に読み込まれたバイト数とします。読み込まれたバイトは、要素 b[0] 〜 b[k-1] に格納され、要素 b[k] 〜 b[b.length-1] は影響を受けません。JavaTM 2 Platform Standard Ed. 5.0


なので、ファイル読み込むメソッドで使用したりしてデータが壊れてみえてしまうということがおこるわけですね。


参考
指定した文字を使って、ランダムな文字列を作成する - Enjoy*Study

Commons Configuration XMLConfigurationの値をMapにうつす方法 2008/01/09

Commons Configuration - Java Configuration API

CommonsのConfigurationって好きなライブラリのひとつです。
アプリケーションのコンフィギュレーションで使わせてもらっています。

XMLConfigurationで設定した値をMapにして使いまわしたかったので調べてみました。

XMLConfigurationの値をMapにうつす方法

MapConfigurationを作成して、ConfigurationUtilsを使ってcopyします。
思ったより簡単にできる!!

サンプルコード

import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.ConfigurationUtils;
import org.apache.commons.configuration.MapConfiguration;
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.commons.configuration.tree.DefaultExpressionEngine;

public class Sample {

public static void main(String[] args) throws ConfigurationException {
XMLConfiguration xmlConfiguration = new XMLConfiguration();

// {
// DefaultExpressionEngine defaultExpressionEngine = new DefaultExpressionEngine();
// xmlConfiguration.setExpressionEngine(defaultExpressionEngine);
// }
xmlConfiguration.setProperty("aaa.bbb", "ok");
StringWriter writer = new StringWriter();
xmlConfiguration.save(writer);
System.out.println(xmlConfiguration.getString("aaa.bbb"));
Map map = new HashMap();
MapConfiguration mapConfiguration = new MapConfiguration(map);
ConfigurationUtils.copy(xmlConfiguration, mapConfiguration);
System.out.println(writer);
System.out.println(map);

}

}


結果

ok
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<configuration>
<aaa>
<bbb>ok</bbb>
</aaa>
</configuration>

{aaa.bbb=ok}

n進法 2008/01/07
2008/01/08

n進法とは、nのかたまりで位が上がること。


n進数で表現してみます。

簡単ルールで行えます。
(1)対象の数をnで割ります。余りを記録しておきます。
(2)1.の商をnで割ります。余りを記録しておきます。
(3)2.を割れなくなるまで続けます。
記録した余りを、最後に記録した順に右から書いていけば、n進数で表現できると思う...
※まちがってないとは思うけど...

お手軽Javaコード
5213を5進数で表示
public class B {

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

int t = 5213;//対象数字
int n = 5;//n進数
int[] a = {t, 0};
StringBuilder builder = new StringBuilder();
while(a[0] != 0){
a = a(a[0], n);
//System.out.println(a[0] + " " + a[1]);
builder.insert(0, a[1]);
}
System.out.println(builder);
}

static int[] a(int t, int b){
return new int[]{t / b, t % b};
}

}



参考
n 進数について
位取り記数法 - Wikipedia
すぐるゼミ・N進法

Groovy + Processingでドーナツをまわす。 2008/01/07


http://deiji.jp/tools/websupport/groovyconsole2/g.jnlp?processing=true&load=http://deiji.jp/tools/websupport/groovyconsole2/groovy/Toroid_3D.groovy&autorun=on

上記のリンクでJava Web Startが起動します。

わざわざ、Groovy + Processingで書く必要性はまったくないのだけど。
よくみるとドーナツの形がおかしいのは、適当にintでキャストしてしまったからか...


使ったコードは下記のサイトから。
Toroid \ Learning \ Processing 1.0 (BETA)

Groovyでインナークラスってまだ対応していないようです。 2008/01/07

[#GROOVY-917] Cannot instantiate Java inner class - jira.codehaus.org

インナークラスを使おうとしたら無理だったので調べたらまだ使えないようです。
1.6から対応するということなのかしら。

Groovyを本格的に使っているわけではないので、気にならなかったのですが、Javaのコードをそのまま使おうとすると怒られますね...

このコードが怒られる。

class A{

void main(args){
new A()
}

class B {

}
}

Groovy グラフを書いてみる 2008/01/06



Groovy - Graphs
Groovy - SwingXBuilder

SwingXBuilderを使用して、グラフを書いてみます。

SwingXBuilderを使うためには、SwingX自体と、swingxbuilderxxx.jarが必要になります。

下記のリンクでJava Web StartでGroovy Consoleが起動します。
http://deiji.jp/tools/websupport/groovyconsole2/g.jnlp?swingx=true&load=http://deiji.jp/tools/websupport/groovyconsole2/groovy/SwingXBuilder_plot.groovy&autorun=on

単利と複利 2008/01/06

単利計算:(元金) x {1 + (利率) x (期間)}
複利計算:(元金) x {1 + (利率)}期間

単利とは元金だけに利子がつく計算方法
複利とは元金と前についた利子を合わせた金額に対して利子がつく計算方法

複利 - Wikipedia

以前作成したコードを使用して計算させてみます。
プログラマメモ2: javascriptで逆ポーランド記法

すべて逆ポーランドで書かずに、途中で、Math.powを使いました。



元金:
利率:%
期間:
実行をクリックすると上記の入力したスクリプトが実行されます。
実行

 

GroovyからProcessingを使ってみる 2008/01/06
2008/01/06

GroovyからProcessingを使ってみた。
単純にprocessingのcore.jarを含めれば、それで使えます。

processing.core.PAppletを継承して使えばよいです。
引数の型でおこられる場合は、as intとかしてます。

Java Web Startで起動するようにしました。
下記のリンクで、Groovy Console + Processingで起動します。
http://deiji.jp/tools/websupport/groovyconsole2/g.jnlp?processing=true&load=http://deiji.jp/tools/websupport/groovyconsole2/groovy/ProcessingSample.groovy&autorun=on
サンプルプログラム

import processing.core.*
import javax.swing.*

class ProcessingSample extends PApplet {
public void setup(){
size(200, 200);
stroke(155,0,0);
}

public void draw(){
line(mouseX as int,mouseY as int, (width/2) as int ,(height/2)as int );
}

static void main (String[] args){
def a = new ProcessingSample()
a.init()
a.start()

JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(a);
frame.setVisible(true);
}
}

プロクシサーバー経由でアクセス 2008/01/05

以前、java.net.URLを使って、プロキシサーバー経由で接続していた。
プログラマメモ2: java proxyを利用して接続したい。URLクラスの初期化で行えます。

で、どうもうまくいかないケースがあったので、
Java ネットワークとプロキシ
を参考にしたらうまくいった。

うまくいなかかったケース※僕が思い違いしてるかも...
mac osx上でDeleGateを使ってHTTPのproxy serverを動かす。
osx上のネットワーク設定で、WWWプロクシをプライベートアドレス指定。
仮想マシン上のWindows2000(FireFox + JavaWebStart(Java6環境))から接続させると、サーバからHTTP 502エラーがでた。この時のコードがURLのコンストラクタにプロクシの設定を渡していた。

自分が勘違いしている可能性大。Orz...

うまくいったコード(適当だけど)
ProxySelectorクラス,Proxyクラスを使用しています。

public static URLConnection testProxy(URI uri) throws IOException {
try {

System.setProperty("java.net.useSystemProxies","true");
List l = ProxySelector.getDefault().select(
uri);

for (Iterator iter = l.iterator(); iter.hasNext(); ) {

Proxy proxy = (Proxy) iter.next();

System.out.println("proxy hostname : " + proxy.type());

if(!Type.HTTP.equals(proxy.type())) continue;

InetSocketAddress addr = (InetSocketAddress)
proxy.address();


System.out.println(proxy.toString());
if(addr == null) {

System.out.println("No Proxy");

} else {

System.out.println("proxy hostname : " +
addr.getHostName());

System.out.println("proxy port : " +
addr.getPort());


URL url = new URL(uri.toASCIIString());
URLConnection conn = url.openConnection(proxy);

return conn;
}
}
} catch (Exception e) {
e.printStackTrace();
}

return new URL(uri.toASCIIString()).openConnection();
}



参考
Java Tips - How to detect Proxy Settings for Internet Connection

Java プロクシ関連リンク 2008/01/05

ONJava.com -- URLs and URIs, Proxies and Passwords
Java Tips - How to detect Proxy Settings for Internet Connection
プロキシ構成
JavaAppletのSocketの接続について質問です。 - Java Solution
JAVAのランタイムを1.4から1.5に変更したらNetBIOSコマンドが発行されるのは? - 教えて!goo
SourceForge.net: Java Embedding Plugin
プログラマメモ2: java proxyを利用して接続したい。URLクラスの初期化で行えます。

Java Web Startで、windows,osxで違うところ 2008/01/05

いまいちよく理解してきれていないのですが、どうもHTTPのプロクシの設定あたりでどうも、windowsとmacの動作が違う。

これでlinuxとか調べはじめたら、違いに頭がさらに混乱しそう。

目指しているのは、Java Web Startの起動をブラウザで行い、HTTPのプロクシ設定はブラウザに設定されているものを使用したいわけです。



windowsでのコントロールパネルの設定には、ネットワークという項目があってそこでブラウザの設定を使うか、直接接続するとかの設定できるのだけど、osxの場合その項目がみあたらない。

うーん。

mac osx(TigerいまだにTigerだけど)の場合、HTTPのプロクシサーバーは、os側の設定で行う。それでSafariはブラウザ自体にこの設定をもっていなくて、os側で設定した値を使っている。ためしに別のブラウザcaminoでプロクシの設定をさがしたけど、なかった。これもos側の設定を使っているようだ。

FireFoxを調べるとブラウザの環境設定にプロクシの設定がある。これはosxもwindowsと同じ。

ためしてみたところ、FireFoxの場合、os上で設定したHTTPのプロクシサーバーをみにいってないっぽい。
で、その状態でJava Web Startを実行してjavaplugin.proxy.config.listの値をみると、osで設定した値が入っていた。

Safari経由でJava Web Startを実行した場合もosで設定した値が、javaplugin.proxy.config.listに入っていた。

mac osxの場合、Java Web Start(javaplugin)は、os側で設定した値を使用するのかもしれない。

そうすると、特にos(ブラウザ)のことを気にせず、javaplugin.proxy.config.listに記述があるサーバーを素直にプロクシ設定として利用するのがいいのかもしれない。


Java 1.5 から ProxySelector というのが導入されている。これも調べないと...

異なる証明書によって署名された複数の JAR ファイルを使用するにはどうしたらよいですか ? 2008/01/05

異なる証明書によって署名された複数の JAR ファイルを使用するにはどうしたらよいですか ?
Java Web Start - よくある質問 (FAQ)


ひとつのJNLPでは無理なようですが、「コンポーネント拡張機能機構と複数の JNLP ファイル」を使うことで可能になるみたい。

Eclipseで開発途中でクラスパスからファイルの読み込みができなかった場合 2008/01/05

Eclipseで開発途中でクラスパスからファイルの読み込みができなくて、試行錯誤。
たした理由ではなく、自分が以前に行った設定変更が原因。

通常、srcで追加されたファイルはアウトプットフォルダに出力されます。
その際に、どのファイルを含めるのかどうかという設定ができます。

Javaでのクロージャーについて 2008/01/01

InfoQ: クロージャとJavaらしさの維持
Javaへのクロージャ導入は、苦労じゃ? - Grな日々(uehajの日記)

以前は、Javaにクロージャーが入るかもと楽しみにしていたんだけど、言語的に複雑になるのは確実なんですよね。

関連
プログラマメモ2: Java7にクロージャー搭載に一票