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

ドキュメントは大切だ 2006/10/31
2006/11/25

ドキュメントにもいろいろありますが、お仕事でプログラム開発していると、ドキュメントを要求されます。



コーディングが終わっていないと必然的に後回しによくされます。そんな場合、設計書自体がぼろぼろというケースがよくあります。残念なことに、たいていの場合、設計する人も設計しながら学び、発見しながらすすめているので、はじめからいいものがでてきません。



というわけでコーディング先行です。



ドキュメントには二種類あると思います。



1.内的欲求からでてきたもの

2.強制されたもの



1.であれば、開発の助けになるとか、考えを明確化するためと、コミュニケーションのためとか、メンテナンスのためとか、役にたちます。

2.はたいていやっつけです。役に立たない項目をうめていくための、ものです。おそらく誰のためにもならないです。誰かが役に立つだろうと、目を通して、前の開発者はへぼだと陰口をたたかれるねたになるぐらいのものでしょう。





ちなみにUMLを全面的採用したからといってプログラムは動きません。

現在のUMLって仕様が大きくてはじめに学ぶにはしり込みしてしまいます。



でも、UMLはすごくいいです。多分。組み込み用とか、リアルタイム分野とかで、使用するUMLの図とか、考え方を限定して使うとハッピーになれるかもしれません。

Welcome to DdlUtilsはcommonsではなくapache.orgのトップからdbで 2006/10/30
2006/11/25

DdlUtilsはジャカルタのcommonsからたどるのではなく、apache.orgトップから、dbプロジェクトにもぐってからみつけられるよ。

Welcome to DdlUtils



素晴らしいなオープンソースプロジェクトに素早くアクセスしたいものですね。

JSAN - Home 2006/10/29
2006/11/25

perlのCPANは便利ですね。あとjavaのmavenは便利ですね。

といいつつもさほど活用しきれていませんが。



javascriptでも似たような仕組みを行っているようです。

JSAN - Home



とにかく迅速に開発を行いたいものですね。

jdk5 ジェネリック 2006/10/28
2008/08/04

プログラミング言語は進化しています。現場では、古いバージョンを使って開発しなければいけなくても、プログラミング言語は勝手に先にいってしまいます。



以前作成したプログラムをJDK5にしてみました。



シナリオ:コンテナから指定された名前、型のコンポーネントをみつける





public static <K extends Component> K findComponent(Container container,

String name, Class<K> k) {



Component[] components = container.getComponents();

for (Component component : components) {



if (component instanceof Container) {

K findComponent = findComponent((Container) component, name, k);

if (findComponent != null)

return findComponent;

}



if (k.isInstance(component) & eq(component.getName(), name))

return k.cast(component);

}



return null;

}





JDK5が世にでて結構時間がたってしまいいまさらながらなのですが、

作成してびっくりしたことのひとつはキャストせずにすむことと、コンパイラできちんとあやまった型を使用するとおこってくれることでした。



ちょっとわかりずらい例ですが、

JDK5よりまえのコードでは

  JButton button = (JButton)findComponent(container, "btn", JButton.clas);

というふうに使用していましたが、

  JButton button = findComponent(container, "btn", JButton.clas);

というふうに使えるうえに、

  JTextField txt = findComponent(container, "btn", JButton.clas);

というふうに使用しようとすると、JtextFieldとJButttonが違うとコンパイラが注意してくれます。





身近に注意してくれるコンパイラがいるとうれしくなりますね。

groovyをプログラムの中から使用するひとつの例 2006/10/27
2006/11/25

JDK6からスクリプトが普通にJavaでサポートされます。

非常にたのしみです。長年親しんだJavaからいろいな言語との連携がしやすくなると思うと、いろいろ妄想が拡がっていきますね。



groovyをプログラムの中から使用するひとつの例です。





シナリオ:プログラムロジックを外にだす(スクリプト)して実行したい。





まず、Javaから呼び出し方法をインターフェイスにします。

オブジェクトを配列で受け取るようにしています。



public interface IProcess {

public Object process(Object ...objects);

}





次に、Groovyを処理しやすいようにユーティリティークラスを作成します。ファイル名が指定されるとそれを読み込んでインスタンス化して利用するために使用します。



import java.io.File;

import java.io.IOException;

import java.io.UnsupportedEncodingException;

import java.net.URL;

import java.net.URLDecoder;



import org.codehaus.groovy.control.CompilationFailedException;



import groovy.lang.GroovyClassLoader;



public abstract class GroovyUtils {



public static Object getGroovyScript(String groovyFile)

throws InstantiationException, IllegalAccessException,

CompilationFailedException, ClassNotFoundException, IOException {



GroovyClassLoader gcl = new GroovyClassLoader(Thread.currentThread()

.getContextClassLoader());

Class clazz = gcl.parseClass(getResourceFile(gcl, groovyFile));

Object object = clazz.newInstance();

return object;

}



static public File getResourceFile(ClassLoader classLoader, String name)

throws UnsupportedEncodingException {

URL url = classLoader.getResource(name);

String filename = null;

File returnFile = null;



filename = url.getFile();

filename = URLDecoder.decode(filename, "UTF-8");

returnFile = new File(filename);



return returnFile;

}



}







次にGroovyスクリプトです。単純にもらったオブジェクトを足し算するというものです。

いかにもJavaっぽいコードですがgroovyスクリプトです。



public class Calc implements IProcess

{



public Object process(Object[] os){

return os[0] + os[1]

}



}





最後にテスト実行クラスです。

import java.io.IOException;



import org.codehaus.groovy.control.CompilationFailedException;



public class TestMainForGroovy {



public static void main(String[] args) throws InstantiationException,

IllegalAccessException, CompilationFailedException,

ClassNotFoundException, IOException {



new MyTest().doProcess();

}



static class MyTest {

public void doProcess() throws CompilationFailedException,

InstantiationException, IllegalAccessException,

ClassNotFoundException, IOException {



String result;

IProcess process = (IProcess) GroovyUtils

.getGroovyScript("calc.groovy");



result = "" + process.process("aaa", 1);



System.out.println(result);

}

}

}







テストクラスを実行をするとgroovyスクリプトが実行されます。





頻繁にロジックが変化する場合は便利かもしれませんね。





groovyにしろjavaプログラマは他の言語にもっと挑戦したほうがハッピーになれるのでしょう。

※僕は、Smalltalk勉強したいんですが成せていません。Orz

MACアドレス 2006/10/27
2006/11/25

javaを使用してMACアドレスを取得する方法は大別して3つあります。



1.JNIを使用して、ネイティブなコードから取得する

2.OSのもつコマンドを実行してその結果を解析して利用する

3.JDK6に組み込まれた機能を利用する



悲しいかな現実の現場では、いまだにJDK1.3よくてJDK1.4という場合が多いのではないでしょうか。



JDK6:機能

Networking Features



もう少し制約が少なければ多くのプログラマさんが車輪の再発明にあくせくしなくてもよくなるかもしれませんね。

※車輪の再発明はスキルを磨くにはもってこいとは思いますがOrz

実行しているメソッド名の取得 2006/10/26
2006/11/25

現在実行しているメソッド名を取得したいときがあります。

デバッグなどを使用せず、簡単なデバッグ文を埋め込みたいときなどのです。





new Throwable().getStackTrace()[0].getMethodName()



で取得できます。



参考にさせていただいたサイトJava/TIPS集 - きのさいと



簡単にメソッド名を取得したいものですね(そんなことはないか。。。)

httpclient 2006/10/25
2006/11/25

javaプログラムから、httpを利用してファイルをアップロードする方法です。

使用するのは、
http://jakarta.apache.org/commons/httpclient/

あと必要なのは、
http://jakarta.apache.org/commons/codec/

実際のコードサンプル

PostMethod post = new PostMethod("http://アドレス");
HttpClient httpclient = new HttpClient();
File file = new File(アップロードファイル);
try {
Part[] parts = { new FilePart("file", file),
new StringPart("key", "xxxxxx") };

post.setRequestEntity(new MultipartRequestEntity(parts,
post.getParams()));
post.setRequestHeader("Content-type", "multipart/form-data;");

int result = httpclient.executeMethod(post);
// resultのコードをみて判断させてもよい 200 404等。
} catch (IOException e) {
e.printStackTrace();
} finally {
post.releaseConnection();
}



参考にさせていただいたサイト commonsの使い方がいろいろまとめられていて勉強になります。


java上から簡単にwebサイトに接続できて便利ですね。

httpclient 2006/10/25
2006/11/25

javaプログラムから、httpを利用してファイルをアップロードする方法です。

使用するのは、
http://jakarta.apache.org/commons/httpclient/

あと必要なのは、
http://jakarta.apache.org/commons/codec/

実際のコードサンプル

PostMethod post = new PostMethod("http://アドレス");
HttpClient httpclient = new HttpClient();
File file = new File(アップロードファイル);
try {
Part[] parts = { new FilePart("file", file),
new StringPart("key", "xxxxxx") };

post.setRequestEntity(new MultipartRequestEntity(parts,
post.getParams()));
post.setRequestHeader("Content-type", "multipart/form-data;");

int result = httpclient.executeMethod(post);
// resultのコードをみて判断させてもよい 200 404等。
} catch (IOException e) {
e.printStackTrace();
} finally {
post.releaseConnection();
}



参考にさせていただいたサイト commonsの使い方がいろいろまとめられていて勉強になります。


java上から簡単にwebサイトに接続できて便利ですね。

osx netbeansでプロファイラが使える!? 2006/10/16
2006/11/26

開発が終了し安定稼働しますと、次に求められるのはパフォーマンスです。

パフォーマンス向上にかかせないのがプロファイラです。mac osxのnetbeans5.0で動作しなかったプロファイラが動きそうです。NetBeans Profiler 5.5 RC 2 のダウンロードページにいままでなかったプロファイラのダウンロードページがありました。これからためしてみようと思います。



NetBeansはこちらから

あとでかく 2006/10/15
2006/11/26

IBM Eclipse GMF を 15 分で学ぶ - Japan



http://www.atmarkit.co.jp/fwcr/rensai/cairngorm01/01.html



http://www-06.ibm.com/jp/developerworks/web/library/x-xml2json/index.shtml

やはりapacheのjakarta commonsは便利 2006/10/13
2006/11/26

いろいろ現実逃避をしています。最近の現実逃避の方向は、統計処理です。といいましても、数学がからっきしだめなので、数式がほとんどでてこない本で学習しながら、試行錯誤しています。といっても現実を忘れるためなので、生産的ととわれるといささか自信はありませんが。



現実逃避の過程のなかで人は以外と何かを学んでいるのかもしれません。



完全独習 統計学入門

小島 寛之

4478820090



数式がでてこないので、日本語をそのままコードにおとしやすいです。





マイクロソフトのofficeをもっていないので、計算結果をグラフィック表示するためにRを使ったりしています。mac osx版のgnuplotをためそうとしたのですが、インストールでうまくいかなったのでRにしました。Rおもしろいです。



データ解析環境「R」―定番フリーソフトの基本操作からグラフィックス、統計解析まで

舟尾 暢男 高浪 洋平

4777511847





Rの使い方はもっぱらjavaでコーディングして計算してその結果をテキストファイルにおとしてRで表示という感じです。



javaで簡易な統計用のライブラリとしてapache jakartaのcommonsのmathライブラリを使っています。便利だと思います。いままで平均のことをaverageというメソッド名にして書いていたりしたのですが、meanが正しいです。

標準偏差はstandard deviationです。commonsのライブラリは本当に便利です。ですので書籍紹介。webで調べているより本で調べた方が、アイデアがいろいろわいてくるのは何故なのでしょうか。

Jakarta Commons クックブック―Javaプロジェクト必須のレシピ集

ティモシー・M. オブライエン Timothy M. O’Brien 長瀬 嘉秀

4873112427







攻略Jakarta Commons

たなか ひろゆき

4797325208





数学を本格的に勉強するなら英語で学んだほうがよいような気がします。日本語だと曖昧な感じするからです。



先日購入した本にベイジアン関連の本があります。まだ全然読んでいませんが。

ベイジアンネットワーク技術 ユーザ・顧客のモデル化と不確実性推論ベイジアンネットワーク技術 ユーザ・顧客のモデル化と不確実性推論

本村 陽一 岩崎 弘利



by G-Tools

よく忘れるので 配列をメソッドに渡す 2006/10/09
2006/11/26

よく書きかたを忘れるのでメモ



void a(String[] ss){

}

というメソッドに配列を渡すとき。



String[] ss = {"aaa"};

a(ss);

もいいのだが、

どうせテンポラリーに宣言するのであれば、

a(new String[]{"aaa"});



一行ですむ。



この書き方すぐ忘れるんだ。

防衛的特許 2006/10/07
2006/11/26



特許というものは,アイデアがあって,とある特殊な作文技術があって,手数料と申請の手間暇を払いさえすれば,具体的なrunning codeが無くても取れてしまう.ナイーブなぼくは,正直これを「ズルい!」と感じるのだが,生き残っていくためには,折り合いを付けねばならないということなのだろう.



防衛的特許戦術を行使する権利を担保するものとしてのApache License Version 2







大企業、もしくはそういった生業でなければ、攻めの特許ではなく守りについての特許は視野に入れておいたほうがよいのだろう。



残念ながら、自分が思いついたアイデアがかならずしもオンリーワンではないことが多分ほとんど。でもアイデアを実現させるのは自分な分だ。前向きにいこう。

Be a Specialist 2006/10/05
2006/11/26

何千人ものJavaのスペシャリストが応募してきたが、ほとんど全員がJavaクラスローダの動作も、Java仮想マシンでメモリ管理が通常どのように処理されるかも説明できなかった。
My Job Went To India オフショア時代のソフトウェア開発者 サバイバルガイド p.23

[Java IDEによるGUIイベント処理コードの生成の違いについて]考えたこと 2006/10/05
2006/11/26

まだしっかり考えがまとまっていませんが、IDEで作成したコードにGUIイベント処理(リスナーのロジック)を含めないほうがよいような気がします。



別のブログでfindComponentというユーティリティメソッドを利用した代替案をまとめてみました。





他のソースコードを自動生成するツールにおいてでも、問題になりやすいのはツールが生成したソースコードに、ユーザがカスタマイズしたソースコードをマージする時ではないでしょうか。自動生成をすることで楽をできると思ったのが、自動生成のルールを熟知しないと使えないということになりやすい。



生成されたものにコードをカスタマイズする場合はそのアプローチの仕方を統一させないといけないでしょう。



生成されたソースコードにはリンクするだけで、それ自体に手を加えず使うのが吉だと思います。



参考:torutkの日記 - Java IDEによるGUIイベント処理コードの生成の違い

デザインについて 2006/10/04
2006/11/26

GUIアプリケーションの顔(デザイン)が多くの企業でどうなされているのだろうかと興味をもっています。プログラムがこなれていないと、見かけのデザインを変更するのに苦労したりしますが、なんとなく開発者がつくった顔をそのまま使うケースが多いと思います。





Googleでは、デザインはあらかじめ設定されている評価指標に対して、そのデザインがどのような結果を出しているか、によって決定される。

Google流会議のための6か条

How to Run a Meeting Like Google







デザインのもつ効果を意識して開発したいものですね。

[java]Apache Jackrabbit 2006/10/02
2006/11/26

Zopeで有名な会社がjavaプラットフォームに対応するという記事を読みました。



javaプラットフォームを選択した理由が下記

http://www.nuxeo.org/sections/about/java-switch/about-nuxeo5



EasyOfDevelopmentになったJAVA5、EE5も大きな理由なのでしょう。





コンテンツレポジトリーがapacheから提供されていました。

Apache Jackrabbit

http://www-06.ibm.com/jp/developerworks/java/060804/j_j-jcr.shtml





なにやらいいアイデアが浮かんできそうな予感です。

UUID (Java 2 Platform SE 5.0) 2006/10/01
2006/11/26

シナリオ:

可能な限りユニークな識別子が必要です。




システムの仕様上どうしても、ユニークな識別子が必要なのですが、なかなかいい方法が思いつきません。

Java5から導入されたjava.util.UUIDがお手軽なようです。





UUID (Java 2 Platform SE 5.0)



下記のコードから



UUID uuid = UUID.randomUUID();

System.out.println(uuid.toString());



3b8579ec-9359-4fe4-b01e-244be1d6b66c

というコードが生成されます。



wikipediaでのUUIDの定義