R フォルダー毎に処理を繰り返す。

R言語でフォルダー毎に処理を繰り返す方法について説明します。

面倒なのでプログラムを以下に

# ディレクトリリストを作成
dir_list <- list.dirs(recursive=T)

#関係するフォルダーを抽出(…/abcで終わるフォルダーを抽出
abc_dirs <- dir_list[c(grep(“\\/abc$”,dir_list))]

for(dir_name in abc_dirs){

# ここでフォルダー毎の処理を行う。

}

対象となるフォルダー数を確認して、フォルダーのリストをグリグリ回そうと思ったのですが、意外と面倒だったので、抽出したフォルダーリストをそのまま使いました。

以下はファイル毎に処理をしたい場合に、ファイルのリストを

all_list <- list.files(“.”,recursive=T,pattern=”sample.csv”)
# abcフォルダーのcsvのみを抽出する。
csv_files <- file_list[c(grep(“/abc/”,all_list))]

#————————————
# フォルダーの分割リストを作る
#   aaa/bbb/ccc/abc/sample.csv => “aaa” “bbb” “ccc” “abc”  “sample.csv”
#————————————

# あとでフォルダー名の一部を使いたいので分解して保存しておく

flist_split <- strsplit(csv_files,”/”)

dst_fname <- paste(“../xyz”,”.csv”,sep=””)

#————————————
# csvを読込む
#————————————
i <- 1
for (fname in dbf_files){
src_csv <- read.csv(fname)

tmp <- src_csv[,c(“COL1″,”COL5”)]

# フォルダー名の一部をCOL_Xに設定しているだけ。
# 単にどこのフォルダーのデータかをカラムに入れたかった
tmp$COL_X <- flist_split[[i]][1]

# 順番を並び替えている

dst_csv <- tmp[,c(“COL1″,”COL_X”,”COL5″)]

#  テキスト形式で書き出してみた。

write(t(dst_csv),dst_fname,ncolumns=3,sep=”,”,append=T)
i <- i + 1
}

write文で本来ならばwrite.csvで一気に書き込みたいところだったのですが、文字列に”aaaaa”とダブルクォーテーションマークが入ってしまうのを避けるため、この様な方法を取ってみました。
他に良い案があれば良かったのですが、初心者なのでこれで一応OKです。

参考になるんだろうか?

とにかく、備忘録です。

P.S. 上記のプログラムは都合によりプログラムの一部のみを記載しております。
ライブラリが足りないなどの場合は適宜ライブラリを追加してやってください。
また、プログラム掲載時に多少変更を加えています。
間違ってしまっている場合もあるかと思いますので動作の保証は致しません。

R 文字列の分割と使い方

R言語で文字列の分割は出来たのだが、その後の使い方が解り難かったので書いておく。
Rの基本的書き方なんでしょうね。

> str1 <- “abs/svf/sss”
> str2 <- strsplit(str1,”/”)
> str2
[[1]]
[1] “abs” “svf” “sss”

分割した要素の一部を取り出すには、以下の様に指定する。
(1番目に分割された文字列を指定した場合)

> str2[[1]][1]
[1] “abs”

リストの中身を指定する方法が解らなくて、他言語と違うと悩みますね。

OpenLayersでタイル画像のキャッシュを消したい!!(追記:ダメだった)

OpenLayers 2.13.1の環境で、一度表示されたタイル画像が邪魔になる場合がある。
開発途中などで、画像を差替えたりする場合には良く発生する為、ごっそりタイル画像を更新した場合などは、ブラウザのキャッシュクリアを行っていた。
この操作は、ブラウザ毎に設定があったり、消したくないキャッシュまでクリアしなければならず面倒だし不便。

そこで、以下のファンクションを呼び出すことで、タイルキャッシュだけをクリアしてしまおうというのが今回の狙い!

追記:単純にこれだけやっても上手く消えないことが判明・・・
どうやって使うか解らないのだが・・・ということで、誰かがアドバイスしてくれるのを期待するが、参考にしないでください。

これで上手く出来そうなんだけど・・・やってみる!!

レイヤを指定してクリアできると嬉しいのだが、そこまでの機能は無いみたい。OL3で実現では出来るのかな?

余談・・・・

まだOL3は使ったことが無い。
ドラスティックに変わり過ぎてしまって、OpenLayers 2.xとは全く異なってしまっている。
コンバートするとかいうより、完全に書き換えが必要となる雰囲気である。
もう少し安定した事例が発表されるまで待つつもりだけど・・・業界の流れにも注目したいところである。

TigerVNCをLinux上で起動して、Windowsから接続する。

TigerVNCのインストール方法については割愛する。

1.環境

環境としては、

・Linux(CentOS 6.5)側にTigerVNCサーバをインストール済み。
・Windows 8.1側にTigerVNCのサーバーとクライアントをインストール済み

以前にインストール方法の記録を書いたと思ったのだが、書いてなかったみたい(^^ゞ。その内、書くことにして今回はインストール後の使用方法のみとする。

2.VNCサーバー側

2.1 起動方法

時折使う、TigerVNCの起動コマンドを以下に備忘録として書き残す。
勝手に起動していると、セキュリティ上気になるので、個人的には必要な時に必要なだけサーバーやクライアントを起動しているので、よく忘れるw

まず、TeraTermなどのターミナル端末を使って、Linux側で以下のコマンドを実行する。
TigerVNCの起動コマンドはこれだです。

> vncserver :1 -geometry 1600×900

:1はnumberとだけなっておりますが、vncserverが起動されている番号になるのでしょう。ある意味で、VNCのIDの様なものとでも覚えておけば良いと勝手に思っています。

 

2.2 その他の確認コマンド

起動方法以外によく使うコマンドは以下の通りです。

1)Help

vncserver –helpでヘルプ見れます。

# vncserver –help

usage: vncserver [:<number>] [-name <desktop-name>] [-depth <depth>]
[-geometry <width>x<height>]
[-pixelformat rgbNNN|bgrNNN]
[-fp <font-path>]
[-fg]
<Xvnc-options>…

vncserver -kill <X-display>

vncserver -list

2)起動リスト
vncserverの起動状況を一覧で確認することが出来ます。

vncserver -list

TigerVNC server sessions:

X DISPLAY # PROCESS ID
:1 10950
:3 27447

上記の場合は、1と3のX DISPLAYが与えられており、:1もしくは:3でvncserverへアクセスすることが可能であることが判ります。

3)VNCサーバーを個別に殺す

そのままkillです。

vncserver -kill :3
Killing Xvnc process ID 27447
Xvnc process ID 27447 already killed

なんか既に殺された後の様なメッセージが帰ってきましたが・・・
listを確認してみると・・・

vncserver -list

TigerVNC server sessions:

X DISPLAY # PROCESS ID
:1 10950

:3が消えているので、無事殺されていることが判りました。

以上でサーバー側の説明は終わりです。

3.クライアント側

クライアント側はWindows 8.1を使用しています。
Vistaや7でも動いているので同じだと思います。

TigerVNC Viewer  でアクセス先を指定して接続しパスワード入力でログイン完了!ちなみに、TightVNC Viewer for Windowsでもほぼ同じです。

xxx.xxx.xxx.xxxには、もちろんIPアドレスもしくはサーバー名を指定。
:1は、vncserver起動時に指定したパラメタと同じ値を指定する。

これでデスクトップ画面が表示されたら成功です。
画面サイズが小さかったり大きかったりする場合は、サーバー起動時の-geometryオプションのサイズを調整して適当なサイズにします。
なので、適当なサイズが見つかるまでに、Killしたり起動したり繰り返しですねw

取りあえず、本当に備忘録です。

以上

Windows環境にPerlをインストールする!(Strawberry Perl)

Windows環境にPerlをインストールする方法について記述します。

Active Perlが有名ですが、フリー版での商用利用はライセンスに抵触するため、個人利用以外の場合はStrawberry Perl がもう一つの選択肢と判断しました。

Strawberry Perlのライセンスは、GPLもしくはArtistic ライセンスになっているので、Active Perlよりは使い勝手が良さそうです。
また、Active Perlにおける以下の問題も気になった次第です。

  • CPANが標準で使用できない。(現在は改善されているみたいですね)
  • Perl本体のバージョンが詳細までは確認できなかった。
    Perl本体最新バージョン:5.20.1
    Active Perl:Perl本体バージョン 5.20
    Strawberry Perl :Perl本体バージョン 5.20.1.1

ということで、Strawberry Perl をインストールします。

Strawberry Perl のダウンロード

下記URLよりダウンロードします。
https://strawberryperl.com/

インストール

ダウンロードしたファイルをダブルクリックしてインストーラーを起動します。
対象ファイル:strawberry-perl-5.20.1.1-64bit.msi

NEXTで次へ

 ライセンス内容を確認したら、I Accept the terms in the License Agreement にチェックを入れて、NEXTで次へ

Linuxでは/usr/bin/perlなのですが・・・Perlのプログラムで記述する最初の一行目にパスを記述するので、変更してみる。

変更したら、NEXTで
<<<追記>>>
変更しても意味有りませんでした。
実際に作成されるperlの実行モジュール(perl.exe)は、下記のパスに作成されています。
c:\usr\bin\perl\bin\perl.exe

無駄な抵抗でしたという落ちですね。
まあ、気分ということでご勘弁ください。

Installを開始する。しばしお待ちを・・・ユーザアカウント制御の画面が出てきたらOKを押して続けてください。

完了すると以下の画面が表示される。

 README.txtがメモ帳などで開いているはずなので、一応一通り目を通して。。。。コマンドプロンプトを起動します。

コマンドプロンプトで以下のコマンドを実行すると、バージョン情報が表示されます。

perl -v

 以上でStrawberry Perl  のインストールと動作確認は完了です。

この後の使い方などについては、いずれまた。

 

Linuxでプロセスの性能測定を行う。

Linux上でプログラムの実行時間を計測する場合、timeコマンドを使用します。

私の場合、CentOS上で動作させることが多いのですが、その際に使用するのがtimeコマンドなのですが、bashに組み込まれているtimeコマンドが勝手に(当然ですが・・・)使われてしまいます。
そんな愚かな私のために、メモを残しておきます。

timeコマンドは、/usr/bin/timeを使用します。
いっそのこと、aliasで切りなおしたろか!?と思うくらいwww

で、使用方法はmanページに任せるとして、詳細な計測結果を以下のオプション付きコマンドで得ることが可能です。

$ /usr/bin/time -v command

-vオプションを指定することで、詳細な計測結果を出力してくれます。

その際、気になるのが以下の項目です。

Maximum resident set size 直訳すると、最大使用実メモリサイズ?となるのでしょうか?
ps auxで得られるメモリ使用量と比較してみても、大きく値に隔たりがあります。
起動時に使用するメモリが大きいのか?そんなはずはない!・・・ということで調べてみることに・・・・

Voluntary context switches この値が影響しているみたいです。
本当かどうかは微妙ですが、コンテキストスイッチが行われると、使用メモリも移動してしまう?そのために、Voluntary context switchesの値を掛けた値がMaximum resident set sizeになっているようだ。

つまり、Maximum resident set sizeをVoluntary context switchesで割った値が実質的な最大使用メモリサイズになる。

<まとめ>

/usr/bin/time -v command

で計測された結果で実行時間の計測が可能。

実質的な使用最大メモリは、

Maximum resident set size / Voluntary context switches

となる。

ps auxやpmapsで確認すると、概ね正しい結果をえられる。

今時のPCで数キロ単位のメモリ消費が異なっていても誤差にしか過ぎないと考えて、この値を採用することにしよう!

これを見て、間違っているようでしたら、どなたかご指摘してください。

セキュリティの関係上、コメント時にはメールアドレスを入力することになっていますが、実のところ、メールアドレスは存在しないメールアドレスでもOKです。
こうしておくと、下手な人がコメントすることもないので・・・・(^^♪

postGISでシェープファイルを登録する。

とうとう手を出してしまった。。。。(TT)

DB大嫌いな私が、とうとうこの世界に手を出してしまった。
まだ入口に足を踏み入れただけだから、初歩的なところから始めます。

今回のお題は、postGISを使ってシェープファイル(SHP)とCSVファイルを空間結合して、新たなシェープファイルを作成するところまでです。

Rを使ってなんとか頑張ってみようと試みたところまでは良かったのですが、以下の課題が発生しました。

  • シェープファイルを読込むのが遅い
  • 空間結合に至っては、遅すぎて戻ってこない。
    もしかするとやり方がまずかったか?
    こちらも初心者なので、まずかったかな?

少なくとも、シェープファイルを読込むのが遅い段階で、使えないなと諦めに入っている状況です。ただし、トータルメリットについては考える余地があるので、別途検討は進めたいと思っています。詳細は、気が向いた時にでも報告します。

さて、postGISを使ってシェープファイルを読込む方法について纏めます。

ステップは2段階です。

1)DBを作る。
#ネットで調べると意外と別々に記載されていて、調べるの面倒なので、ここにまとめてメモしておく。

既にDBを作成されている場合は、新たにDBを作る必要はありません。
この作業をスキップしてください。

createdb -U username -T postgis_21_sample new_dbname

 username : postgreSQLのユーザー名
new_dbname:新規にDB作成する場合のデータベース名
postgis_21_sample:テンプレートになるDB名称です。
postGISをインストールする時にインストールしたものを使うのでしょう。

2)シェープファイル(SHP)を登録する。

shp2pgsql [-d] shape_file.shp table_name | psql -U username dbname

もっともシンプルな書き込みで、DBに対しINSERT命令を繰り返し行います。
-dオプションは、既にデータが存在する場合に、一度削除してから書き込みます。

これを高速に行ってくれるコマンドをもう一つ見つけました。

shp2pgsql -D [-d] shape_file.shp table_name | psql -U username dbname

-Dオプションを使うと、postgresqlのDumpフォーマットを使って書き込みを行うので速くなります。基本的に問題がないならこちらがおすすめです。

今回はここまで。次回はこのデータにCSVを空間結合してシェープファイルを作成するところまで進めたいと思います。
シェープファイルの出力は分けた方が良いかも知れないので、次回考えます。

 

地域メッシュをQGISで作成する。

地域メッシュをダウンロードして使おうと思ったのですが、1/8地域メッシュが見つからなかったので、作成することにしました。

一から作ると意外と面倒なのですが、QGIS用に作ってくれている方が居たみたいです。

QGISのプラグインに「JapanMesh」なるプラグインを発見!!早速入れていました。

使い方はReadme.txtを見ると書いてあります。

まず、1次メッシュを作成します。

次に、2次メッシュを作りたい場所の1次メッシュを選択して、2次メッシュを作成します。

後は、この繰り返しです。

欲しかったメッシュは1/8メッシュだったのですが、求めていたコード体系と異なっていたので、変換ロジックを作って変換しました。

この時行ったロジックでは以下のコード体系(3次メッシュ以降)を変換しています。

元)

333 334 343 344 433 434 443 444
331 332 341 342 431 432 431 432
313 314 323 324 413 414 423 424
311 312 321 322 411 412 421 422
133 134 143 144 233 234 243 244
131 132 141 142 231 232 241 242
113 114 123 124 213 214 223 224
111 112 121 122 211 212 221 222

 

変換後)

0700 0701 0702 0703 0704 0705 0706 0707
0600 0601 0602 0603 0604 0605 0606 0607
0500 0501 0502 0503 0504 0505 0506 0507
0400 0401 0402 0403 0404 0405 0406 0407
0300 0301 0302 0303 0304 0305 0306 0307
0200 0201 0202 0203 0204 0205 0206 0207
0100 0101 0102 0103 0104 0105 0106 0107
0000 0001 0002 0003 0004 0005 0006 0007

 

変換に用いたロジックは以下です。

floor("m6code"/1000)*10000+(floor((("m6code"%1000)-100)/200)*2^2+floor((("m6code"%100)-10)/20)*2+floor((("m6code"%10)-1)/2))*100+(floor((("m6code"%1000)-100)/100)%2)*2^2+(floor((("m6code"%100)-10)/10)%2)*2+(floor((("m6code"%10)-1))%2)

それと、このプラグインはデフォルトで2000メッシュまでしかサポートしていません。
JapanMesh.pyの中に「2000」と記述されているので、ちょっと増やしてあげると便利です。

変更するプログラムファイルの保管場所を説明します。

対象ファイル:C:\Users\<ユーザ名>\.qgis2\python\plugins\JapanMesh\JapanMesh.py

ファイルの保管場所は、「プラグイン」→「プラグインの管理とインストール」→「JapanMesh」にインストールされているバージョンと保存場所が記載されています。
該当するフォルダーを開いて対象ファイルを変更すればOKです。

ちなみに、リミッターが2000メッシュまでとされているのですが、拡張して50mメッシュの4.8万程度を10mメッシュに分割したところ、すごく重たかったです。1時間くらい掛かるかな?根気よく待つべし!
大量のメッシュを作成したい場合には、細分化して実行するか、もしくは他の方法を考えた方が良いかも知れません。
お手軽ではありますが、時間が掛かります。