yuu_nkjm blog
2010-07-12(Mon) [長年日記] 編集
[Eclipse] Eclipseでヒープ・ステータス(メモリの状態)を表示
Eclipseでどのくらいのメモリを使っているかを常時監視したいときは,以下の画像のチェックボックスにチェックを入れる.そうすることで,Eclipseの画面の右下に現在のメモリ使用量を表すバーが表示される.
2010-07-13(Tue) [長年日記] 編集
[Java] Javaでapache.commons.lang.SerializationUtils.clone()を使ったディープコピー(Deep Copy)
ディープコピー(Deep Copy)とシャローコピー(Shallow Copy)の区別がつかずにやられるのは誰もが通る道.標準ライブラリを使って自前で実装するのもありだけど,apache.commons.lang.SerializationUtils.clone()を使うのが簡単っぽい.こちらのページには,シャローコピーの例も出ている.
deepCopy関数の内側でキャストするのも良いと思うけど,DataManagerクラス内で,いろんなオブジェクトのdeepCopyをしたかったので,キャストはdeepCopy関数の外側にした.これだと,SerializationUtils.clone()を直接呼ぶのと変わらないんだけど,何をしているかを自分にとって分かりやすくしたかった.
import org.apache.commons.lang.SerializationUtils;
import java.io.Serializable;
public class DataManager {
private EleSimulationState simulationState;
private List histories;
public void finalizeSimulationState() {
histories.add(simulationState);
this.eleSimulationState = (SimulationState) deepCopy(this.simulationState);
}
public Object deepCopy(Serializable state) {
Object dest = SerializationUtils.clone(state);
return dest;
}
}
cloneする対象はSerializableをimplementsする.
public class SimulationState implements Serializable{
private Map<Id, Facility> facilities;
private Map<Id, Vehicle> vehicles;
}
cloneする対象のメンバ変数に含まれるクラスはSerializableをimplements(interface定義ならextends)する.
public interface Facility extends Serializable{}
public interface Vehicle extends Serializable{}
シリアライズ(直列化)の対象から外したいメンバ変数には,transientという修飾子をつける.
参考文献
XStreamを使ったdeep copy
com.thoughtworks.xstream.XStreamというライブラリでもディープコピーが出来るらしい.以下のページには,「XStreamなら、対象のオブジェクトがSerializableを実装していなくても書き出せるのがポイントですね。」と書かれている.
2010-07-14(Wed) [長年日記] 編集
[R言語] Rでベクトル内の重複した要素を取り除く&Rでベクトル内の要素をソートする
Linuxで使うuniqコマンドやsortコマンドに近いことをしたい.そういうときは,unique関数とsort関数が使える.
イディオム
unique(x)
sort(x)
使用例
単純に重複の削除とソートをした例.
x$id
> [1] 22 10 11 12 21 20 90 92 91 10 22 11 12 21 20 203 339 121 90 92 91
unique(x$id)
> [1] 22 10 11 12 21 20 90 92 91 203 339 121
sort(unique(x$id))
> [1] 10 11 12 20 21 22 90 91 92 121 203 339
データフレームxの中のデータをidによって切り出して,valueをプロットする例.
for(targetId in sort(unique(x$id))){
z <- subset(x, id==targetId)
plot(z$time, z$value, xlab = "", ylab = "", axes=F);
par(new = T);
}
まあ,これだと線が一色しかないし,XY軸も書いてないので,使い物にはならないんだけど.
参考ページ
2010-07-15(Thu) [長年日記] 編集
[R言語] Rのコードが書かれた文字列を評価(eval)する
イディオム
eval(parse(text="評価対象文字列"))
使用例
データフレームxのSEX,HEIGHT,WEIGHTというベクトルに対してsummary関数を適用する.
sex <- c("F","F","M","M","M");
height <- c(158,162,177,173,166);
weight <- c(51,52,72,57,64);
x <- data.frame(SEX=sex, HEIGHT=height, WEIGHT=weight);
i=1
z <- as.list(NULL)
for(col in c("SEX","HEIGHT","WEIGHT")){
z[[i]] <- eval(parse(text=paste("summary(x$",col,")",sep="")))
i=i+1
}
z
> [[1]]
> F M
> 2 3
> [[2]]
> Min. 1st Qu. Median Mean 3rd Qu. Max.
> 158.0 162.0 166.0 167.2 173.0 177.0
> [[3]]
> Min. 1st Qu. Median Mean 3rd Qu. Max.
> 51.0 55.0 57.0 59.8 64.0 72.0
注意1
どういうコンテキストでevalが行われるのか良く分からないと言う人は,"eval.parent"といったキーワードでググってみると良いかも.
注意2
上記のサンプルコードのforループ内で,
という様には書けないけど,
summary(x$col)
とは書けるので,良い例ではなかったな.
summary(x[[col]])
参考ページ
2010-07-16(Fri) [長年日記] 編集
[R言語] 文字列をsplitした結果をイテレータとして使う
イディオム
for(element in unlist(strsplit(分割対象, セパレータの正規表現))){}
使用例
文字列を分割した結果をイテレータとして使いたいことがあるじゃないですか.Javaで書くと,ノリとしてはこんな感じ↓
String countries = "Japan|USA|EU";
for(String country :Arrays.asList(contries.split("\\|"))){
System.out.println(country);
}
これと似たことをやろうとして,Rでこう書いたら意図通り動かなかった.
countries <- "Japan|USA|EU"
for(country in strsplit(countries, "\\|")){
str(country)
}
> chr [1:3] "Japan" "USA" "EU"
そもそも分割した結果はなんやねんと見てみると
strsplit(countries, "\\|")
>[[1]]
>[1] "Japan" "USA" "EU"
というお答え.
リストの第1成分にベクトルが入っちゃってるのが悪いのか.そこで,
for(country in unlist(strsplit(countries, "\\|"))){
str(country)
}
> chr "Japan"
> chr "USA"
> chr "EU"
とするか,
for(country in strsplit(countries, "\\|")[[1]]){
str(country)
}
> chr "Japan"
> chr "USA"
> chr "EU"
としたらいけた.デバッグ開始時は,
as.vector(strsplit(countries, "\\|"))
>[[1]]
>[1] "Japan" "USA" "EU"
としてしまって,はまった.リストはベクトルだから,これでは何も変換されないんですね.
2010-07-17(Sat) [長年日記] 編集
[R言語] 追加パッケージのインストール
GUIのメニューバーより「パッケージ→パッケージのインストール」を選び,インストールしたいパッケージ名を選択する.もし,その一覧にインストールしたいパッケージがない場合は,「パッケージ→CRANミラーサイトの選択」や「パッケージ→ダウンロードサイト(レポジトリ)の選択」で設定を変更すると見つかるかもしれない.
2010-07-18(Sun) [長年日記] 編集
[R言語] ある分布からランダムにサンプルを取り出す
イディオム
書式 sample(x, size, replace = FALSE, prob = NULL) 引数 x : (数値、複素数、文字列、論理値)ベクトル。もしくは単一の整数(1:x と解釈) size : 選ばれる項目の数 (省略時は lenngth(x)) replace: 論理値。復元抽出か非復元抽出か? prob : 各項目を選び出す確率のベクトル(比率を与えるだけで良い)。省略時は等確率。 Rの確率分布システム - RjpWiki
使用例
hist(sample(c(0,1,2,3),1000,prob=c(100,100,300,500),replace=TRUE),freq=FALSE)
2010-07-19(Mon) [長年日記] 編集
[Java][リンク] Javaでの文字列結合
つまり、文字列の結合を1行でしか使わない場合は、わざわざ自分でStringBuilderに書き換える意味は無い。
複数行にまたがって結合する場合は、自分でStringBuilder#append()を使ってやらないと実行効率が悪い。
(中略)結合をループで使う場合や複数行で使う場合はStringBuilderを使うべき。
Java文字列メモ(Hishidama's Java String Memo)
上記リンク先に,JDK1.5でStringに対する+演算子がどう変換されるかを,jadを使って解析した結果が出ている.これを見ると,抜粋したまとめに従うのが良さそう.
結合をループで行う場合の解析結果が出ていないが,ループを行う場合は必然的に複数行で結合を行うことになるので,最終行の様な結論になるのだろう.
参考ページ
- ひしだまのコンピューター関連技術メモ(Hishidama's Programming MemoPage)
今回引用したページでは,StringBufferとStringBuilderの違いとか文字列の比較に関する考察とか,時々思い出したくなる情報がよくまとまっている.それだけでなく,本サイトには,Javaに関するちょっとマニアックな情報がたくさん載っている.さらに,技術系に関しても役立つTipsがいっぱい.Javaに関して網羅的な勉強が出来るといったまとめかたではないが,Tipsが雑然とならんでいるのでもなく,Tipsがテーマ毎にほどよいサイズにまとめられているので非常に有用だと思う.
2010-07-28(Wed) [長年日記] 編集
[研究][MABS] 社会システムのモデリング・シミュレーション技術分野のアカデミック・ロードマップ@経産省
経済産業省が,平成20年度技術戦略マップローリング事業(アカデミック・ロードマップ)として,学会横断型アカデミック・ロードマップ報告書というものを発表している.第4章 社会システムのモデリング・シミュレーション技術分野のアカデミック・ロードマップ(PDF)では,社会シミュレーションやマルチエージェントシミュレーションについて報告されている.
社会システムシミュレーションの社会学的課題に関する論文の紹介|辻 竜平 信州大学 人文学部によると,「社会モデリング・社会システムシミュレーションにかかわる社会学的課題」という論文がこのロードマップの一節として使われているとのことだ.この記事で述べられているように,施策への提言に役立てるような社会シミュレーションの実現には,工学/情報学の人間と社会学/社会科学の人間が協力するような枠組みが必要だと思う.