2010年12月23日木曜日

複数ファイル内のテキストを一括置換

研究に使用しているプログラム群をバックアップや(簡単な)バージョン管理のため、Dropboxで管理しようと思い、"program"という名前のディレクトリをDropbox/Private/の下に移動をさせた。


それに伴い、いくつかのスクリプト内で記述してあるパス表記を、"~~/Mydocument/program/~~"から"~~ /Mydocument/DropBox/Private/program/~~"に変更する必要が出てきたので、sedコマンドによって一括で置換を行なった。


置換したいファイルが一つの場合は、

sed -i "s|置換前のテキスト|置換後のテキスト|" 対象ファイル

とシンプルだが、


現在のディレクトリ以下の特定拡張子のファイル(例えば*.sh)について、一括置換したい場合は以下の通り。



#/bin/bash


SUFFIX=".sh"

ORIGINAL_TEXT="Mydocument/program"
REPLACED_TEXT="Mydocument/Dropbox/Private/program"


target_file_list=$(find . -type f -name "*${SUFFIX}" \! -name $0 )

for target_file in ${target_file_list}
do

    target_file=${target_file#./}
    nword=$(cat ${target_file} | grep ".*${ORIGINAL_TEXT}.*" | wc -l )


    if [ ${nword} -gt 0 ]; then
    echo "Taregt file name: "${target_file}
    echo "Number of replacement: "${nword}


        echo ""
        cat ${target_file} | grep ".*${ORIGINAL_TEXT}.*" --color=always
        echo -e "\n"
       
        # sed -i s/"*${ORIGINAL_TEXT}*"/"${REPLACED_TEXT}"/ ${target_file}
        sed -i "s|${ORIGINAL_TEXT}|${REPLACED_TEXT}|" ${target_file}

        echo ""
        cat ${target_file} | grep ".*${REPLACED_TEXT}.*" --color=always
        echo -e "\n"

    echo -e "------------------\n"
   
    nhit=$((${nhit} + 1))
    fi

done


echo "----Summary information----"
echo -e "Root directory for search:\t "$(pwd)
echo -e "Search text:\t\t\t "${ORIGINAL_TEXT}
echo -e "Replaced text:\t\t\t "${REPLACED_TEXT}
echo -e "Number of hit files:\t\t "${nhit}"\n"




参考サイト
http://norian.blog50.fc2.com/blog-entry-45.html

2010年12月22日水曜日

Nautilusスクリプト

UbuntuではNautilusスクリプトという機能を使うと、簡単に右クリックの機能を拡張することができます。

今開いているフォルダでターミナルを開くとか、デスクトップにリンクを作るなど、"nautilusスクリプト"で検索すると多くの情報が出てきますが、個人的に欲しいと思って以下のようなスクリプトを作ってみました。


ファイル名:backup_file.sh
用途:指定ファイルに日時の情報をいれてバックアップをとるだけ。



#!/bin/bash

filename=$1
bk_time=$(date +%y%m%d_%Hh%Mm)

cp ${filename} bk_${bk_time}_${filename}



この用にスクリプトファイルを作ったら、以下の場所にファイルを置きます。
ディレクトリが無い場合は作成してください。

$HOME/.gnome2/nautilus-scripts/


このスクリプトを使うと例えば"maintext.doc"というファイルは"bk_101222_10h11m_maintext.doc"というように、頭にバックアップを示すbk、日付、時刻と行った情報をつけたコピーを作ることができます。


大きなプログラムのソースコードはsubversionなどのバージョン管理を使ったほうが楽ですが、ちょっとしたプログラムや、Officeファイルなどのバックアップを作業の一区切りごとにつくりたい場合は、このやり方が手軽でおすすめです。


ちなみにこの"bk_*"ファイルが増えてうっとうしくなったら、


mkdir backup
cp bk_* backup

とコマンドを打つだけで、簡単に整理できます。



参考サイト
https://forums.ubuntulinux.jp/viewtopic.php?id=2959

2010年12月14日火曜日

LaTeX原稿のスペルチェック

Wordで作成した英語の文章は簡単にスペルチェックができるが、LaTeXの原稿をスペルチェックしたい場合はちょっと面倒な手順が必要。


ぱっと思いつく選択肢としては
  1. TeXソースコードを直接WordなりOpenOffice Writerに読み込む
  2. aspell
  3. latex2rtfでRTFを作って、WordなりOpenOffice Writerに読み込む
1の選択肢は一番簡単だけれども、随所にあるLaTeXコマンドもエラーとして拾われるのでうっとうしい。
2の選択肢は昔ながらの(?)LaTeXファイルのスペルチェック法、ちょっと難しい。

3が個人的にはおすすめなので以下に紹介します。


Linuxコマンドの"latex2rtf"コマンドを使うとTeXソースコードからRTF(リッチテキスト形式)に変換できるので、あとはWordなり、Writerによんで、スペルチェックを開始すればOK。


ちなみに、auxファイルがないとエラーが出た場合は、latexコマンドをうったのちにlatex2rtfを打つと良い。また、 EclipseプラグインのTexlipseでLaTeXを使用している場合はlatex2rtfコマンドの-aオプションでauxファイルを指定すると 良い。


例.
latex2rtf -a tmp/document.aux document.tex



GISとかリモセンの話題を載せてくブログのつもりが、気がついたらLaTeXだらけになってる(汗)。
D論作成の備忘録として書いてるところがあるのでしかたないかも。
D論終わったら本気出す。


…もちろんD論も本気出す。

2010年12月10日金曜日

FoursquareからのtwitterからのGoogle buzz

Android携帯のGoogle mapで表示できるGoogle buzzを見ると、時々http://4sq.com/〜とかいうURL付きのbuzzをみかけ、たぶんFoursquareと連携しているんだけど、どうやってFoursquareとbuzzを連携するのかわからなかった。

最近連携の仕方がようやくかりました。ただTwitterを間に挟めばいいだけなんですね。


手順は以下の通り。

  1. FoursquareのSettingで、Linked AccountsでTwitterを選択し、自分のTwitterアカウントと紐付ける。
  2. GmailのSettingのbuzzタブを選択、Your connected sitesのView and editを選んで、Twitterを追加する。


Foursquareでのチェックイン時にコメントをつけた場合は、

コメント(@場所名)

コメントをつけなかった場合は、

I'm at 場所名

と表示がされる。

2010年12月9日木曜日

GMTでポリゴンデータを用いてグリッドデータをマスキング

GMT (The Generic Mapping Tools)でポリゴンデータで、グリッドデータをマスキングのやりかた。

以下の処理はDEMで計算した標高変化の分布図から、関心のある領域(例えば特定の氷河のポリゴンなど)だけを取り出す場合。

変数の説明
【グリッドデータ】
${trend_nc}:標高変化の分布データ
${trend_nc_cut}:標高変化の分布データを処理対象領域のみを切り抜いたデータ
${mask}:マスクグリッド(1か0の2値データ:ポリゴン内部が1、外部は0)
${mask_na}:マスクグリッドの0をNAN値に置き換えたもの
${trend_nc_masked}:標高変化の分布データのうち、ポリゴンの内部のみを切り抜いたデータ(←一番欲しいデータ)

【ベクター】
${GLACIER_OUTLINE}:くり抜きに用いるポリゴンデータ(GMT形式)

【その他】
${utm_range}:処理対象範囲(今回の例ではUTM座標)
${image}:GMTの出力画像ファイル
${trend_cpt}:makecptなどで生成したカラーパレットファイル


#標高変化のデータから処理対象流域のみを切り抜く
#(マスクグリッドと範囲を同一にするため)
grdcut ${trend_nc} -R${utm_range} -G${trend_nc_cut}

#ポリゴンからマスクグリッドの作成
grdmask -F -m ${GLACIER_OUTLINE} -G${mask} -R${utm_range} -I${CELLSIZE}

#マスクグリッドの0の値をNANの値に変更
grdmath ${mask}  0 NAN = ${mask_na}

#標高変化のデータ×マスクグリッドを計算することによって、
#ポリゴンの外部の値を全てNANに変える。
grdmath -N ${mask_na} ${trend_nc_cut} MUL = ${trend_nc_masked}

#出来上がったデータから図の出力
grdimage ${trend_nc_masked} -C${trend_cpt} -Q -R -J -K > ${image}

ステレオ図化ソフトLPSを見学

北大での研究集会(二日目)の終了後に、ステレオ図化ソフトのLPSを見学させていただきました。

空中写真やステレオペアのある衛星画像をもとにDEM生成を行うソフトなのですが、下の写真にあるようなディスプレイシステムによって、偏光メガネ(写真下部にあるサングラスみたいなの)を通して見ると、アバターのように3Dで見ながら作業を行うことができます。




昔、都立大の解析図化機を使用した経験はありますが、同時に複数人が見えることや、図化作業のやりやすさなどは全然快適です。

過去のステレオ衛星写真のDEM生成ももちろん魅力的ですし、個人的にはASTERのDEM精度向上などにも使えそうだと思いました。

例えばプロダクトとして配布されているDEMには明らかに、コントラストの低い領域で自動マッチングの困難さから精度の低い領域がありますが、コンピュータの自動マッチングでは拾えなくても、人間では視認できるというテクスチャなどに関して、精度向上の可能性があります。

研究室に欲しいなあ。
いや北大に出張すればいいのか。いつか時間が出来たら。

2010年12月1日水曜日

LaTeXの図の取り込みでずれた場合の対処

前のエントリのやり方でぺたぺたPNGファイルのBB (BoundingBox)を指定して取り込む作業をやっていたら、
なぜかLaTeXで出力したPDFでずれる画像が出てきた。

対象画像はInkscape上で複数のPNGファイルを取り込み、配置を行なったのちPNG出力した図で、
ebbコマンドでbbファイルを出力した後、BB情報のみをコピーして、LaTeXソースコードに記述をし、
bbファイルを消した(ファイルが増えるのが嫌だったので)。


ずれた図はbb情報の数値を調整したら、いい感じの位置に持ってくることが出来たので、その手順を以下に記述する。

1. InkscapeでEPSファイル出力をする。

2. 出力したEPSファイルをエディタで開きBoundingBoxの情報をコピーして、LaTeXソースコードに張り付ける。

3. BB情報の数値を以下のように微調整する。
LaTeXソースコード上のBB情報は例えば"bb=0 0 530 720"というように記述するが、
この数値は画像ファイル上の座標に対応しており"bb=左 上 右 下"の座標値となっている(※Y座標は下向きに増加)。

・この画像が出力PDF上で右にずれていた場合は、BBの幅の数値(右-左)を保ったまま、右と左の数値を増やす。
例"bb=100 0 630 720"

・この画像が出力PDF上で上にずれていた場合は、BBの高さの数値(下-上)を保ったまま、下と上の数値を増やす。
例"bb=0 100 530 820"

といった具合。

pdflatexで日本語が使えたらいいのに。。。もしくはdvipdfmxでもpdflatexみたいにBB情報の指定無しにPNGを読み込めたらいいのになあ。

日本語LaTeXで図の取り込み

日本語でLaTeXを書くのにはdvipdfmxを使用する必要がある。
dvipdfmxで図の取り込みをする際、通常はEPSファイルを指定して読み込むのだが、Inkscapeなどで編集し、
PNGとして出力した画像などを取り込みたい場合は、BoundingBoxを指定する必要がある。

BoundingBoxは画像ファイルのプロパティに表示される画像サイズとは異なり(※要注意)、
ebbコマンドで出力されるbbファイルを見るとわかる。

実際取り込む場合は、以下の二通りの方法がある。

1. bbファイルを作成し、画像ファイルと同じ場所においておく。
(※ファイルが増えてうっとうしいのが難点)

2. LaTeXソースコード上でbb情報を記述。
例.\includegraphics[width=40mm, bb=0 0 784 978]{sample.png}
(※ソースコードに記述するのが面倒)

参考サイト

Google EarthでGPSの軌跡をみる

Google EarthではGPSのログファイルを読み込み表示することができます.

GPSのログファイルのフォーマットとしてはGPX形式がよく使われており,
私 が持っているAndroidスマートフォン(Softbank X06HT)でもGPX形式でGPSログを記録することができ,MyTrackというGPSアプリやJogtrackerというジョギング用のGPSアプ リでもGPX形式で移動の軌跡を保存することができます.

ジョギングコースのGPXファイルをGoogle Earthに読み込むと,図のように表示されます.


図.GPSログ(GPX形式)をGoogle Earth 6.0に読み込んで表示している.
(名古屋市内の東山公園一万歩コース)


読み込んだGPSデータは時間情報も含んでいるため,Google Earthのトラック再生機能を使って,ジョギングの軌跡をビジュアルに追うことができます.

GPSデータのトラック再生の手順は以下の通りです.

1. Google Earthのメニューの"Tools" >> "Options" の"Touring"タブで"Fly along lines"チェックボックスにチェックをする.

2. Google Earthの左側パネルで読み込んだGPSデータを選択した状態で(水色になる),"Play Tour"ボタン(上の図では"Earth Gallery"というボタンの真上にあるフォルダマーク)を押す.

するとGPSの軌跡沿いに自動で動いてくれます.

2010年11月30日火曜日

Google Earth 6.0をUbuntu 10.10 (64 bit)にインストール

Google Earth 6.0がでたらしいので、早速Ubuntu 10.10 (64 bit)にインストールを試みてみました。

ところがいろいろなエラーが出まくってすんなりインストールをできず。
いろいろ調べた結果、ようやくインストールができました。

原因はたぶん64bit機のせいだと思うのですが、、、一応手順は以下のとおりです。


1. lsb-coreをパッケージマネージャよりインストール。

2. Google EarthのページよりGoogleEarthLinux.binをダウンロード。

3. 実行権限を変更
chmod +x GoogleEarthLinux.bin

4. ファイルを解凍
./GoogleEarthLinux.bin --target /tmp/ge

5. 解凍ファイルを一部リネーム
cd /tmp/ge/setup.data/bin/Linux/x86/
mv setup.gtk setup.gtk2

6. インストールスクリプトを実行
cd /tmp/ge
sudo ./setup.sh


以上の手順です。
当たり前のことですが、エラーがでて困ったときは、
エラーメッセージでググるのが一番ですね。
同じエラーで困った人たちがすでに情報のやりとりをしていたので大変助かりました。


参考サイト

2010年11月23日火曜日

Rのrgdalパッケージのインストール方法について

Rのrgdalパッケージのインストール方法について


windows版Rの場合は普通にメニューバーからパッケージの追加でrgdalパッケージを簡単にインストールができるが、Ubuntuの場合は若干手順が面倒で、以下の通りにインストールする必要がある。

1. Synapticパッケージマネージャーから"gdal"、"libgdal-dev"、"libproj-dev"をインストールする。
2. Rを起動し、install.packages("  rgdal")とコマンドを入力する。
※使用しているPCの性能によっては、その後インストール処理にしばらく時間がかかるかもしれない。

ちなみにGeoTIFF以外にも、GDALライブラリで使用可能なさまざまなデータ形式を読み込むことができるのだが、GMT形式(というかnetCDF形式)も扱いたい場合はrgdalパッケージのインストールの前にnetcdfもインストールする必要があるかも。

2010年11月22日月曜日

QGIS plugin (Value Tool)

QGISのプラグインの"Value Tool"は重なったラスターデータについて、各ラスター値をまとめてみたい時に便利。

使用OS:Ubuntu 10.10
QGIS: version 1.5


インストールのやり方は、メニューバーの"Plugins" -> "Fetch Python Plugin"ででてくるウィンドウから"Value Tool"を選択し、インストールする。

インストールするとLayer パネルの下に"Value Tool"というパネルが表示される。
(※表示されてない又は、消してしまった場合は"View" -> "Panel" -> "Value Tool"を選ぶと表示される。)


    図. Value Toolでラスター値の表示例
重ね合わせた違う時期のDEM標高値と、DEM標高値の変化率(m / a)をまとめて表示している。


図の左下パネルがValue Toolのパネルで、左の列がラスターの名称、右の列がラスターの値を示す。図中の手のマークのあるグリッド(薄紫色)の値が左下パネルに表示されている。



ちなみにグラフもみたい場合はQwt(python-qwt5-qt4)が必要なので、synaptic managerなどでインストールする必要がある。

2010年11月19日金曜日

Latexの文献番号の変更のしかた

Latexの文献番号の変更のしかた


論文原稿を本文とそのサプリメンタリーに分けて作る場合、サプリの方の文献の参照番号を本体から通しでつけたいのに、また番号が1から始まってしまうのを防ぐ方法。
※\setcounter{enumiv}{開始したい番号}というやり方もあるのだが、自分の環境ではなぜかできなかった。


サプリの方のthebibliographyの中のbibitemにオプションでつけたい番号をつける。

例:30から始めたい場合
\begin{thebibliography}{99}
\bibitem[30]{***}
\bibitem[31]{***}
\end{thebibliography}



また、サプリで本文の文献を引用したい場合はサプリのthebibliographyの手前で以下のように番号を指定すると、サプリの文章中では番号が表示されるが、サプリの文献の項目には表示されない。

例:本文で文献番号29の文献を、サプリで引用したい場合
\bibitem[29]{***}
\begin{thebibliography}{99}

\end{thebibliography}


setcounterでできたら楽なのだろうが、なぜできないのだろう?
ちなみに使用している環境は
OS:
      Ubuntu linux 10.10 (64bit)

使用してるtexクラスとか(リファレンス用の)パッケージとか:
     \documentclass{article}
     \usepackage[super]{natbib}

コンパイラ:
     pdflatex

encoding:
     UTF-8


2010年11月17日水曜日

latexdiffで修正箇所の表示

latexファイルの修正履歴をわかりやすくするlatexdiffという便利なプログラムがあるそうです。

使い方は
latexdiff old_filename.tex new_filename.tex > output.tex
pdflatex output.tex


bibliographyを使っている場合は二行目のコマンドを二回入力する必要があるみたい。
(たぶん一回目でauxファイルを生成するため)
コマンド入力後処理が止まることがあるが、Enterを何度か入力すると最後まで処理が完了した。

出力されたpdfファイルは以下のように修正箇所がハイライトされる。

図:latexdiff&pdflatexで出力されたpdfファイルの例
取り消し線付き赤字:新しい原稿で消した箇所
波線付き青字:新しい原稿で追加した箇所

2010年11月15日月曜日

Rで座標系の変換

rgdalパッケージで読み込んだオブジェクトの座標系の情報はproj4stringというスロットに格納されている。
例えば以下のように"work.data"という名前の変数を作ってオブジェクトを格納した場合は


library(rgdal)

work.data <- readOGR("glacier_polygon.shp", layer="glacier_polygon")
work.data@proj4string 
 
 
UTM座標zone 45 northの場合は以下のようにターミナルに表示される +proj=utm +zone=45 +ellps=WGS84 +datum=WGS84 +units=m +no_defs +towgs84=0,0,0   
これをWGS84地理座標系に変換したい場合は以下のように入力すると 座標系の変換された"work.data.wgs84"というオブジェクトが得られる。 new.crs <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs") work.data.wgs84 <- spTransform(work.data, CRS=new.crs) 
 
  
XY座標を確認してみると以下のように表示され、 座標系がDecimal degree(十進経緯度)になっているのが確認できる。

> coordinates(work.data2)
          [,1]     [,2]
 [1,] 86.88998 27.93553
 [2,] 86.93320 27.87881
 [3,] 86.87982 27.87656
 [4,] 86.70286 28.02150
 [5,] 86.63027 28.03838
 [6,] 86.57888 28.05175
 [7,] 86.59177 27.77458
 [8,] 86.85842 27.98194

ちなみにspTransform関数で使っているCRS引数の中の文字列は、 projライブラリで使われる座標系を指定する文字列で、QGISのオプションのCRSの項目を見ると、 それぞれの座標系ごとの文字列の書き方が容易に確認できて便利。

Rを用いたポリゴンの重心の求めかた

Rを使ってポリゴンGISデータから重心を求める方法


必要なパッケージ: rgdal及びその依存パッケージ群

例えば読み込みたいポリゴンGISファイルが"glacier_polygon.shp"の場合は、以下のようなスクリプトとなる。




## rgdalパッケージの読み込み
library(rgdal)

## shpファイルをオブジェクトデータとしてRにインポート
work.data <- readOGR("glacier_polygon.shp", layer="glacier_polygon") 

## オブジェクトデータからXY座標値だけを取り出す 
xy.data <- coordinates(work.data) 

## XY座標値のデータの列に便宜上名前をつける
##(名前は自由、例えば"longitude"&"latitude"とか"utm_x"&"utm_y"とか) 
colnames(xy.data) <- c("x", "y")

## CSVファイルにエクスポート(他のソフトウェアで処理する場合など)
write.csv(xy.data, "output.csv", row.names=FALSE, quote=FALSE)




出力されたCSVファイルは例えばこんな感じ
x,y
489176.444420473,3090064.99763659
493424.399256412,3083779.43936747
488170.237572687,3083534.23702388
470790.340086085,3099618.51899252
463659.468505326,3101508.27126506
458614.355215818,3103005.81160067

2010年11月8日月曜日

鉄板ナポリタン

日曜に,中国出張の彼女を送りついでに,エスカ地下街で食事.噂に聞いてた鉄板ナポリタンを発見したのでそこで昼食.

Foursquareで地下街のVenueにチェックインしようとしたが,Venueがぱっと見つからない,店舗名で検索すると見つけるとこができた.店舗内からなのに,すごく遠くに判定されている.
まあ地下街なのでGPSは受信できなく,携帯の基地局位置から判定しているので当たり前なのだけど.


名古屋のナポリタン
名古屋ではナポリタンはなぜか鉄板にのっており,卵が鉄板とスパゲティの間に敷かれている.写真はエスカ地下街の喫茶リッチというところで食べたもので,メニュー名は「鉄板ナポリタン」.
ちなみにWikipediaによるとイタリアンスパゲッティというらしい.


2010年10月26日火曜日

Androidアプリ"JogTracker"でジョギングの軌跡を記録。

使用携帯はSoftbankのX06HTII。
10/22は本山〜東山公園周辺コースを走ってみた。




JogtrackerではWeb siteでユーザー登録をすると、携帯のJogtrackerアプリからWeb上にデータをアップロードし、Web上で走行ルート、時間、それらから計算される平均速度などが表示できるので便利。