2011年12月19日月曜日

NAS導入

ブレーカが飛び,BuffaloのLS-QL/1Dが壊れた.

ディスクは生きていたけど,結構ショック.

なかなか気に入ってたのにサ...

泣いていても仕方がないので後継機を買いにビックカメラへ.

色々と悩んだあげく,

裸族のインテリジェントビルNAS(CRIB35NAS)を購入した.

作りがしっかりしてたのと,NFSにも対応していたのが決めてになった.

本当は自分で組むべきなのかもしれないけど,

色々と面倒だし,パッケージングされている方が家族も使いやすい.

buffaloのディスクからmount -t xfsでデータを取り出し,

運用開始.

さあ,どうなることやら.

とりあえず,長生きしてね.

2011年12月17日土曜日

Apache POI:Not enough data (1) to read requested (2) bytes

Apache POIライブラリ(3.7)でxlsファイルを読み込んだら次のようなエラーが表示された.
 Exception in thread "main" org.apache.poi.hssf.record.RecordFormatException: Unable to construct record instance
  at org.apache.poi.hssf.record.RecordFactory$ReflectionConstructorRecordCreator.create(RecordFactory.java:65)
  at org.apache.poi.hssf.record.RecordFactory.createSingleRecord(RecordFactory.java:300)
  at org.apache.poi.hssf.record.RecordFactoryInputStream.readNextRecord(RecordFactoryInputStream.java:270)
  at org.apache.poi.hssf.record.RecordFactoryInputStream.nextRecord(RecordFactoryInputStream.java:236)
  at org.apache.poi.hssf.record.RecordFactory.createRecords(RecordFactory.java:442)
  at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:263)
  at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:188)
  at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:305)
  at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:286)
  at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:60)
  at org.sheepcloud.lab.Parser.<init>(Parser.java:26)
  at org.sheepcloud.lab.Parser.main(Parser.java:53)
 Caused by: org.apache.poi.hssf.record.RecordFormatException: Not enough data (1) to read requested (2) bytes
  at org.apache.poi.hssf.record.RecordInputStream.checkRecordPosition(RecordInputStream.java:216)
  at org.apache.poi.hssf.record.RecordInputStream.readUShort(RecordInputStream.java:267)
  at org.apache.poi.hssf.record.common.UnicodeString$PhRun.<init>(UnicodeString.java:311)
  at org.apache.poi.hssf.record.common.UnicodeString$PhRun.<init>(UnicodeString.java:297)
  at org.apache.poi.hssf.record.common.UnicodeString$ExtRst.<init>(UnicodeString.java:178)
  at org.apache.poi.hssf.record.common.UnicodeString.<init>(UnicodeString.java:438)
  at org.apache.poi.hssf.record.SSTDeserializer.manufactureStrings(SSTDeserializer.java:55)
  at org.apache.poi.hssf.record.SSTRecord.<init>(SSTRecord.java:250)
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
  at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
  at org.apache.poi.hssf.record.RecordFactory$ReflectionConstructorRecordCreator.create(RecordFactory.java:57)
  ... 11 more
原因がわからずなんともならなかったのでベータ版(3.8beta4)に切り替えたら,あっさりと動いた.

気持ち悪いが,とりあえず動いたからよしとしよう.

2011年12月4日日曜日

ダイクストラ法

ダイクストラ法をRとigraphを使って表現する.

igraphのshortest.paths関数で一発でできるのだけど,お勉強のためということで.

まずは最短経路を求めるグラフを用意する.
library(igraph)
g<-graph.empty(5)
V(g)$name<-c("A","B","C","D","E")
g<-add.edges(g,c(0,1,0,2,0,3,1,2,1,3,1,4,2,3,3,4))
g<-as.undirected(g)
E(g)$weight<-c(2,1,7,5,6,1,1,8)
lay<-rbind(c(1,3),c(2,3),c(1,1),c(2,1),c(3,2))
plot(g, layout=lay,vertex.label=V(g)$name,vertex.size=12,edge.label=E(g)$weight)


こんな感じ.今回はノード「E」をゴールとする.

つぎに各ノードのコストを初期化する.
V(g)$cost<-c(Inf,Inf,Inf,Inf,0)
V(g)$fixed=FALSE
V(g)$color<-"skyblue"
plot(g, layout=lay,vertex.label=V(g)$cost,vertex.size=12,edge.label=E(g)$weight,vertex.color=V(g)$color)
つぎはコスト計算.
V(g)[nei(V(g)[fixed==FALSE & cost==min(V(g)[fixed==FALSE]$cost)]) & fixed==FALSE][V(g)[nei(V(g)[fixed==FALSE & cost==min(V(g)[fixed==FALSE]$cost)]) & fixed==FALSE]$cost>(E(g)[V(g)[fixed==FALSE] %->% V(g)[fixed==FALSE & cost==min(V(g)[fixed==FALSE]$cost)]]$weight)+(V(g)[fixed==FALSE & cost==min(V(g)[fixed==FALSE]$cost)]$cost)]$cost<-(E(g)[V(g)[fixed==FALSE] %->% V(g)[fixed==FALSE & cost==min(V(g)[fixed==FALSE]$cost)]]$weight)+(V(g)[fixed==FALSE & cost==min(V(g)[fixed==FALSE]$cost)]$cost)
ながい...もっと短くできるかもしれない.
V(g)[fixed==FALSE & cost==min(V(g)[fixed==FALSE]$cost)]$color="yellow"
V(g)[fixed==FALSE & cost==min(V(g)[fixed==FALSE]$cost)]$fixed=TRUE
計算が終わったノードは黄色に塗りつぶす.
plot(g, layout=lay,vertex.label=V(g)$cost,vertex.size=12,edge.label=E(g)$weight,vertex.color=V(g)$color)

これを計算するノードが無くなるまで繰り返す.
もう一回.

もう一回.
もう一回.

もう一回.


これで終わり.

実際にグラフを描きながらだと楽しいね.








2011年12月1日木曜日

R + igraph + Cytoscape


まずはR+igraphでネットワークグラフを作成する.

> library(igraph)
> d<-matrix(c(0,0,1,1,1 ,0,1,1,0,2,0,3,1,0,1,6,0,0,0,2,1,8,5,2,0),ncol=5,nrow=5)
> ls()
[1] "d"
> d
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    6    1
[2,]    0    1    3    0    8
[3,]    1    1    1    0    5
[4,]    1    0    0    0    2
[5,]    1    2    1    2    0
> g<-graph.adjacency(d,weighted=TRUE)
> summary(g)
Vertices: 5
Edges: 15
Directed: TRUE
No graph attributes.
No vertex attributes.
Edge attributes: weight.
> degree(g)
[1] 5 6 7 4 8
> png("c:/tmp/myplot.png",width=600, height=600,pointsize=14)
> plot(g,layout=layout.fruchterman.reingold,vertex.label=V(g)$smr,vertex.size=degree(g)*4)
> dev.off()
null device
          1
なかなか,いい感じ.

つぎはCytoscape(http://www.cytoscape.org/)を使って描画してみる.

まずは,Rからグラフをエキスポートする.

このときファイルタイプとして”ncol”を指定するのを忘れずに!

> write.graph(g,"c:/tmp/mygraph.ncol","ncol")



Cytoscapeを起動して[File]>[Import]>[Network from Table(Text/MS Excel...)]を選択する.

先ほどエキスポートした「c:/tmp/mygraph.ncol」を読み込む.

[Source Interaction]に「Column 1」,[Interaction Type]に「Column 3」,[Target Interaction]に「Column 2」を設定する.


[Import]ボタンをクリックする.

これでグラフをインポートできた.

あとはCytoscpae上でグラフを色々と見やすくしてやればいい.