yuu_nkjm blog
2011-02-05(Sat) [長年日記] 編集
[bash][Linux][Java] シェルスクリプトの設置場所に移動してからのコマンド実行
状況
"/home/hoge/deep/path/project/sh/"という位置にJavaプロジェクトの起動スクリプトを置きたい.Javaのクラスパスの関係から,"/home/hoge/deep/path/project/"でjavaコマンドを発行したい.
スクリプト
起動スクリプトとしてboot.shを作成し,"/home/hoge/deep/path/project/sh/"に設置する.
シェルスクリプトの$0という環境変数には,スクリプトの相対パス付ファイル名が入っている.dirnameコマンドを使って,そこからファイル名を取り除いている.
以下では,全てを絶対パスに変換してから渡しているが,Javaに渡す引数は絶対パスではなく,javaコマンドを実行するパスからの相対パスにした方が良いかもしれない.
#!/bin/bash
SCRIPT_CALLED_DIR=`pwd`
echo This script is called from ${SCRIPT_CALLED_DIR}
SCRIPT_LOCATED_DIR=${SCRIPT_CALLED_DIR}/`dirname $0`
echo This script is located at ${SCRIPT_LOCATED_DIR}
cd ${SCRIPT_LOCATED_DIR}
echo Move to script dir ${SCRIPT_LOCATED_DIR}
cd ../
PROJECT_DIR=`pwd`
echo Move to Project dir ${PROJECT_DIR}
`java -cp bin:jar/log4j-1.2.15.jar info.nkjm.yuu.Hoge`
実行結果
どこからboot.shを実行しても,javaコマンドを実行したい"/home/hoge/deep/path/project/"に移動できている.
[hoge@info /home/hoge]$ deep/path/project/sh/boot.sh
This script is called from /home/nkjm
This script is located at /home/hoge/deep/path/project/sh
Move to script dir /home/hoge/deep/path/project/sh
Move to Project dir /home/hoge/deep/path/project
[hoge@info /home/hoge/deep/path]$ project/sh/boot.sh
This script is called from /home/hoge/deep/path
This script is located at /home/hoge/deep/path/project/sh
Move to script dir /home/hoge/deep/path/project/sh
Move to Project dir /home/hoge/deep/path/project
関連ページ
- この記事のwindows版?バッチファイルが存在するディレクトリへ移動する
-
shスクリプト内で安全に相対パスを使うで紹介されているように,
というのを定番にしても良いかも.#!/bin/bash SCRIPT_DIR=`dirname $0` cd $SCRIPT_DIR # これ以下に処理を書く
2011-02-06(Sun) [長年日記] 編集
[Windows][bat] バッチファイルで呼び出したコマンドの標準出力,標準エラーがリダイレクトできない
リダイレクト成功
(1)
SET CONF_DIR="conf/"
java ^
info.nkjm.yuu.Generator %CONF_DIR% 2>%SCRIPT_LOCATED_DIR%/syserr.log
(2)
SET CONF_DIR="conf/"
java ^
info.nkjm.yuu.Generator ^
%CONF_DIR% 2>%SCRIPT_LOCATED_DIR%/syserr.log
(3)
java ^
info.nkjm.yuu.Generator ^
conf/ 2>%SCRIPT_LOCATED_DIR%/syserr.log
(4)
SET CONF_DIR=conf/
java ^
info.nkjm.yuu.Generator ^
%CONF_DIR% 2>%SCRIPT_LOCATED_DIR%/syserr.log
リダイレクト失敗
(5)
SET CONF_DIR="conf/"
java ^
info.nkjm.yuu.Generator ^
%CONF_DIR% 2>%SCRIPT_LOCATED_DIR%/syserr.log
(6)
java ^
info.nkjm.yuu.Generator ^
"conf/" 2>%SCRIPT_LOCATED_DIR%/syserr.log
まとめ
(1)が成功で(5)が失敗なのが意味不明だった.(4)と(5)の差から,変数CONF_DIRにダブルクォーテーションで囲んだディレクトリ名を格納していることが原因と分かる.エディタにハイライトして欲しいからって無駄にダブルクォーテーションで囲ったのが敗因か….
(一)
java -version 2>ver1.log
(二)
java "-version" 2>ver2.log
(三)
""java ""-version" 2>ver3.log"
(四)
""java ""-version" "2>ver4.log""
(五)
""java ""-version ""2>ver5.log""
上記の例では,(三)だけlogが作成されない.自分としては(二)を書いたつもりだったが,(三)のように解釈されてしまったんだと思う.
2011-02-07(Mon) [長年日記] 編集
[bash][Linux][bat][Windows] リダイレクトいろいろ
標準エラー出力のみをパイプに出力する
command 2>&1 >/dev/null | command2
ちなみに,Windowsでは/dev/nullはnulが相当する.
command 2>&1 >nul | command2
「標準出力 → ファイル,標準エラー → 画面,ファイル」に出力する.「とあるプログラムの標準出力が膨大であり,画面には出したくないがファイルに保存はしたい.標準エラーは大事なので,画面にもファイルにも出力したい」という状況なので,こんなことがしたい.
基本的にリダイレクトを頑張りつつ,teeコマンドに流し込む作戦.
command 3>&1 1>&2 2>&3|tee hoge.log
1(commandの標準出力の中身)→標準エラー出力
2(commandの標準エラーの中身)→標準出力(パイプに渡される.teeにより画面とファイルに出力される)
3(空)→標準出力
teeの-aオプションを使ってもいけるか.
command 2>&1 1>hoge.log|tee -a hoge.log
1(commandの標準出力の中身)→hoge.log
2(commandの標準エラーの中身)→標準出力(パイプに渡される.teeにより画面に出力され,-aオプションによりファイルに追記される)
参考ページ
2011-02-10(Thu) [長年日記] 編集
[MABS][CitySim][MATSim][OSM] OpenStreetMap(OSM オープンストリートマップ)のデータを道路ネットワークに変換する
以下,書きかけ
道路ネットワークのデータが欲しいというとき,OpenStreetMapがなかなか便利.緯度経度だけでなく道路の接続状況も分かるし,取り扱いが簡単.基盤地図情報|国土地理院も使ったことがあるけど,道路と道路の結合情報をどのように作るのが良いのかが分からない.
マルチエージェント交通シミュレーションツールボックスMATSim(Multi-Agent Transport Simulation)には,OpenStreetMap形式のデータを変換する機能がある.この変換方法は日本の座標系と合っていないようだが,ネットワークの生成はできた.なお,MATSimはJavaで書かれたプログラムであるため,予めJavaをインストールしておく必要がある.
ダウンロード
- OpenStreetMapにアクセスする.OpenStreetMap Japanからのたどり方はよく分からないので,http://www.openstreetmap.org/からアクセス.
- 適当なエリアに移動する.
- エクスポートタブを選択する.
- エクスポートするファイル形式で,OSM XMLデータを選択する.
- 「別の範囲を指定する」を選択する.地図上でエクスポートしたい範囲を選択する.
- 出力ボタンを押す.map.ocmという名前でダウンロードされる.
道路ネットワークに変換
-
MATSimで使える形に変換するには,以下の様にする.MATSimは,公式サイトからダウンロードする.0.2以外でNetworkFromOSMクラスが用意されているかは分かりません.
java -cp matsim-0.2.0.jar org/matsim/evacuation/tutorial/NetworkFromOSM map.osm network.xml
-
作成した道路ネットワークデータの定義はwww.matsim.org/files/dtd/network_v1.dtdである.
<!ELEMENT network (nodes,links)> <!ATTLIST network name CDATA #IMPLIED type CDATA #IMPLIED capDivider CDATA #IMPLIED xml:lang NMTOKEN "de-CH"> <!ELEMENT nodes (node)*> <!ELEMENT links (link)*> <!ATTLIST links capperiod CDATA #IMPLIED effectivecellsize CDATA "7.5" effectivelanewidth CDATA "3.75" capPeriod CDATA #IMPLIED capDivider CDATA #IMPLIED capdivider CDATA #IMPLIED> <!ELEMENT node EMPTY> <!ATTLIST node id CDATA #REQUIRED x CDATA #REQUIRED y CDATA #REQUIRED type CDATA #IMPLIED origid CDATA #IMPLIED> <!ELEMENT link EMPTY> <!ATTLIST link id CDATA #REQUIRED from CDATA #REQUIRED to CDATA #REQUIRED length CDATA #REQUIRED freespeed CDATA #REQUIRED capacity CDATA #REQUIRED permlanes CDATA #REQUIRED oneway CDATA #FIXED "1" volume CDATA #IMPLIED origid CDATA #IMPLIED nt_category CDATA #IMPLIED nt_type CDATA #IMPLIED type CDATA #IMPLIED modes CDATA "car">
- シミュレーションをする上で,linkとlinkの連結情報(fromノードとtoノード)があるのが便利.
- MATSimの緯度-平面直角座標系変換はドイツ(?つまり日本以外)を基準にした変換を行っている.自分の欲しい地図データに適した変換を行うには,ちょっとプログラムを書く必要がある.CoordinateTransformationというクラスを継承して,自前で変換ルールを書く.一部を付録として末尾に掲載.MATSimのモジュール使わなくても,OSMプロジェクトでJava用のデータ処理ライブラリが用意されてる気がするが,未調査.
緯度・経度と平面直角座標の変換
世界測地系,日本測地系,平面直角座標系,緯度経度のあれこれ
付録:日本測地系用の変換プログラムの一部
// 道路ネットワークを作成するクラス public class NetworkFromOSMKyoto { public static void main(String[] args) throws SAXException, ParserConfigurationException, IOException { (snip) Scenario sc = new ScenarioImpl(); Network net = sc.getNetwork(); // 自分で作成した変換ルールをネットワークリーダーに渡す. CoordinateTransformation ct = new CoordinateTransformationKyoto(); OsmNetworkReader onr = new OsmNetworkReader(net, ct); onr.parse(osm); new NetworkWriter(net).write(networkFileTmp, networkDtd); new NetworkWriter(net).write(dbNetworkFileTmp, dbNetworkDtd); (snip) } }
import jp.jasminesoft.gcat.scalc.DMSconv; import jp.jasminesoft.gcat.scalc.LatLong2XY; import org.matsim.api.core.v01.Coord; import org.matsim.core.utils.geometry.CoordImpl; import org.matsim.core.utils.geometry.CoordinateTransformation; // 日本測地系用の変換ルール public class CoordinateTransformationKyoto implements CoordinateTransformation { @Override public Coord transform(Coord coord) { LatLong2XY latLong2XY = new LatLong2XY(6); double lat = DMSconv.deg2dms((float) coord.getY()); double lon = DMSconv.deg2dms((float) coord.getX()); latLong2XY.setLatitude(lat); latLong2XY.setLongitude(lon); // TODO nkjm X-Y coord on Matsim and X-Y coord in Japan is // different. double convX = latLong2XY.getY(); double convY = latLong2XY.getX(); return new CoordImpl(convX, convY); } }
2011-02-11(Fri) [長年日記] 編集
[Programming] プログラミングコンテストの過去問ができるオンラインジャッジシステム
- Saratov State University :: Online Contester
- Sphere Online Judge (SPOJ)
- University of Aizu Online Judge System
- Welcome To PKU JudgeOnline
- Practice and Learn - Google Code Jam
上記リストは,アリさんマークのプログラミングコンテストチャレンジブックのリストを参考にしました.
プログラミングコンテストチャレンジブック(秋葉 拓哉/岩田 陽一/北川 宜稔)2011-02-18(Fri) [長年日記] 編集
[Java][Eclipse] Java標準ライブラリのソースコードのコメントを日本語化する
Eclipse上でShift+F2を押すと,添付されたJavadocを開くことができる(※).しかし,それだけでなく,Ctrl+左クリックでソースコードそのものにジャンプしたいことがある.jdkをインストールすると,src.zipというソースコードのアーカイブが付いてくるが,このzipに含まれるソースコードは英語のJavadocコメントが書かれたものである.このコメントを日本語に置換する方法を記す.
- ドキュメントのダウンロード - JDK 6のインストールと環境設定 - Javaダウンロードとインストールから,「Java SE 6 ドキュメント」をたどり,日本語のドキュメントをダウンロードする.
- MergeDoc - Eclipse NetBeans ホバー日本語化から,MergeDocをダウンロードをして展開,実行する.
- JDK 1.6u21のドキュメントを使う場合,設定をAPIドキュメントディレクトリの文字コードを「EUC-Linux」,入力ソースと出力ソースを「UTF-8」とする.
- 最後に,元のjdkに含まれていたsrc.zipをsrc-en.zipに変更し,新しく生成したsrc-ja.zipをsrc.zipに変更する.
(※)jarとソースコードを結びつけるには,「eclipse jar ソース 添付」あたりでぐぐる.
2011-02-19(Sat) [長年日記] 編集
2011-02-20(Sun) [長年日記] 編集
[find][command] 特定のディレクトリ以下のファイルの行数を調べる
find . -type f -print0 | xargs -0 wc -l| grep total
find . -type f -name "*.java" -print0 | xargs -n100 -0 wc -l | grep total
find . -type f -regex "*.java" -print0 | xargs -n100 -0 wc -l | grep total
UnxUtils | Download UnxUtils software for free at SourceForge.netのxargsを使ってるんだけど,-nオプションを指定してやらないと,引数が長すぎるというエラーが出る時がある.