myfinderの技術や周辺的活動のblog

2008年11月30日日曜日

GUIのスレッド処理

スレッド処理中にGUIコンポーネントを操作する場合、外部スレッドから操作するとGUIが壊れたりして大変。
そんなときはjava.awt.EventQueueのinvokeLater()とかinvokeAndWait()とかを使うとGUIのスレッド内で処理できる。


java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new ThreadSample().setVisible(true);
}
});

とか

java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
output.append("パネルとかフィールドにテキスト追加");
}
});

とかやる。

2008年11月29日土曜日

forでListを使うときのナントカ

1. いまいちなやり方

for (int i = 0; i < data.size(); ++i) {
String str = (String)data.get(i);
output.append(str + "\n");
}

2. イテレータを使ったやり方

for (Iterator i = data.iterator(); i.hasNext();) {
String str = (String)i.next();
output.append(str + "\n");
}

3. 拡張for文で記述量をさらに圧縮

for (String str : data) {
output.append(str + "\n");
}

ソースも読まずにJavaでRubyのinclude?みたいなのを書いてみる。

単に含まれているかどうか調べるならindexOfでいいんだけど。


public boolean include (String bodyText, String searchWord){

char btext[] = bodyText.toCharArray();
char bsearchWord[] = searchWord.toCharArray();

int n = 0;

while (n < btext.length - 1) {
boolean match = false;
int idx = 0;
while (idx < bsearchWord.length - 1) {
if (bsearchWord[idx] != btext[n + idx]) {
match = false;
break;
}
++idx;
match = true;
}
if (match == true) {
return true;
}
++n;
}
return false;
}

オブジェクトのコピーその2

オブジェクトをコピーするときはその「深さ」についてちゃんと考えないといかんようで、その顕著な例として、多次元配列がわかりやすそう。

今回は2次元配列で

int[][] arr = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};

int[][] copy = arr.clone();

という感じでオブジェクトをコピーすると、配列の外側だけがコピーされて、内側の配列への参照は同じものになる。

元データと、その変化シミュレーションみたいな表示をやりたいときにcloneを使ってしまうと、コピー後のオブジェクトの内側配列に対する操作がコピー前のオブジェクトの内側配列にも反映される。
同じものを参照しているから当然と言えば当然なんだけど、このへん忘れてcloneして喜んでしまいそうなので注意したい。

2次元配列をコピーするときは、多分こうするのがいいと思う。

int[][] arr = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};

int[][] copy = new int[arr.length][]; // とりあえず外側の配列の数合わせて宣言。
for (int i : arr) {
copy[i] = arr[i].clone(); // 改めて内側の配列をコピー
}

という感じで書いておけば、コピー元とコピー先で違うものになるので、妙な挙動はなくなる。

同じオブジェクトを共有したいのか、別々に取り扱いたいのかをはっきりさせるのが大事ってことかなと。

オブジェクトのコピー

単純なオブジェクトのコピーならcloneを使った方がいいのかもしれないけど、ちゃんとコピーしたい場合はコピーコンストラクタとかを作るのがよいようで。

class SampleClass {
SampleClass(int height, int width) {
}

SampleClass(SampleClass sc) {
this(sc.getHeight(), sc.getWidth());
}
}

とか書いて

SampleClass sc1 = new SampleClass(100, 50);
SampleClass sc2 = new SampleClass(sc1);

という風にコピーするのがよさげ。

参照型の性質 - 参照とnull -

例えば


try {
Obj obj = null;
obj.method();
} catch (NullPointerException ex) {
System.out.println("nullpo");
ex.printStackTrace();
}


という感じでNullPointerExceptionを誘発してみるようなプログラムはまずないと思うのだけど、プログラムの外(ファイルとか)から値を受け取る処理を書くときは


if (obj != null) {
obj.method();
}


とかして呼び出すようにしておくように習慣づけたい。

あと、参照型と文字列を「+」演算子で連結するときには、参照型は文字列に変換される。
そのときは自動的にtoString()が呼ばれている。

final static Hoge HOGE = "hoge"の注意点

Javaの話ですが。
忘れがちなのでメモ。

final static Hoge HOGE = "hoge"

とか書いて、宣言したのとは別のソースでその定数を使っている場合、バイトコードに値が入るので、定数が変わった場合はそのソースも再コンパイルが必要です。

以上。

Movable Type 4

ちょっと所用でMT4をセットアップすることがあったのだが、MT4って重厚長大な感じでいまいち。。。

2008年11月23日日曜日

myfinderが運用しているインフラについて

いろいろと技術ネタをまとめていくにあたっての前提となるインフラについて、書いておきます。

myfinderは自宅サーバとして、8ノードからなるシステムを構築しています。



様々な冗長構成を試すためにそれぞれの要素を2重化(DNSとかメールとか管理サーバは突っ込まないで><)して、LVSやmod_proxy_balancerをheartbeatなんかで多重化したりということを試しています。
LB-AP-DB間は2重化する設計なので、どの要素も両方ダウンしない限り基本的にはサービスが継続可能なように構成しています。

DBの多重化なんかも試しています。

これから書いていくネタは基本的にこのインフラをベースにやったことになります。

iptablesについて再度読書。

IPVS(LVS)の設定をするにあたり、一部iptablesの設定をいじることがあり再入門をしてみた。
その際に読んだRedHatLinux Firewallsという本があるのだが、これがなかなかの良書。

03年に出た本なので、出版から5年ほど経っているものの、ipchains以外の内容はあまり腐っていない。
iptablesはいまも現役なので、RedHat系のLinuxを使っていて、iptablesについて知りたい方向けかなと思う。

amazonのレビューにもある通り、初級者→中級者にレベルアップする本という位置づけと考えるといいかも。

やった内容なんかはRedMineにまとめているので、近いうちに公開していきます。

2008年11月20日木曜日

ライトニングトークに行ってきた

CyxxxxLightningTalkに行ってきました。

発表資料もUPしてあります。

2回連続サーバ運用ネタだったので、次からはしばらく違う方向でいくのもいいかも。

SolrのAnalyzerとTokenizer設定を変える

RedMine更新しました。

Solrのschema.xmlのTokenizerを変えれば日本語検索できます。

あとでまた追記。

2008年11月19日水曜日

SolrとかHadoopとかのこと。

興味があってまとめ始めたので、おいらのRedMineの当該プロジェクトを公開にしてみます。


http://repos.myfinder.jp/wiki/hadoop-and-lucene


Wikiに書き込みたい!という場合は適当にご連絡ください。

2008年11月18日火曜日

RedMineのURL処理にちょっと手を入れた。

RedMineデフォルトのURL処理だと、URLと文字列がくっついている場合にそのまま全体をAタグでかこってしまう。
単にURLを貼付けるときに、スペースを入れるように運用で工夫すればいいという話でもあるのだけども、気持ち悪いのでソースに手を入れてみた。
バージョンは0.7-stable

URLの文字列処理は「lib/redmine/wiki_formatting.rb」の124-154行目にある。
そこのコードの正規表現を揉むのもいいんだけど、下記のように書いてしまった方がシンプルで、RedMineのWiki用途くらいであればそこそこ満足いく精度で置換してくれる。


def inline_auto_link(text)
URI.extract(text) do |uri|
text.gsub!(url,"<a class='external' href='#{url}'>#{url}</a>")
end
end


やったことの記憶を頼りに再現してみただけなので、後でコードは直すかも直しました。

関係ないけど「Blogger Syntax Highlighter」がいい感じ。
いろんな言語に対応してて、使い方が簡単。

CodeRepos

CodeReposのコミッタになってみた。

http://coderepos.org/share/wiki/Committers/myfinder

タイミング的に肉が食えると聞いてちょっと作ろうかなと思うものがいくつかあったりなかったりして。
とはいえ自分のRedMineに置いておいても、なんて思うものについてコミットしていく予定。

Bloggerってどうなんだろと思いつつ。

bloggerに引っ越してみる。