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

関連ページ


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オプションによりファイルに追記される)

参考ページ

  • UNIXの部屋 コマンド検索:リダイレクト (*BSD/Linux) Linuxのリダイレクトについてはここが定番だと思ってます.他のトピックも素晴らしいです.

  • 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] プログラミングコンテストの過去問ができるオンラインジャッジシステム

    上記リストは,アリさんマークのプログラミングコンテストチャレンジブックのリストを参考にしました.

    プログラミングコンテストチャレンジブック(秋葉 拓哉/岩田 陽一/北川 宜稔)

    2011-02-18(Fri) [長年日記] 編集

    [Java][Eclipse] Java標準ライブラリのソースコードのコメントを日本語化する

    Eclipse上でShift+F2を押すと,添付されたJavadocを開くことができる().しかし,それだけでなく,Ctrl+左クリックでソースコードそのものにジャンプしたいことがある.jdkをインストールすると,src.zipというソースコードのアーカイブが付いてくるが,このzipに含まれるソースコードは英語のJavadocコメントが書かれたものである.このコメントを日本語に置換する方法を記す.

    1. ドキュメントのダウンロード - JDK 6のインストールと環境設定 - Javaダウンロードとインストールから,「Java SE 6 ドキュメント」をたどり,日本語のドキュメントをダウンロードする.
    2. MergeDoc - Eclipse NetBeans ホバー日本語化から,MergeDocをダウンロードをして展開,実行する.
    3. JDK 1.6u21のドキュメントを使う場合,設定をAPIドキュメントディレクトリの文字コードを「EUC-Linux」,入力ソースと出力ソースを「UTF-8」とする.
    4. 最後に,元のjdkに含まれていたsrc.zipをsrc-en.zipに変更し,新しく生成したsrc-ja.zipをsrc.zipに変更する.

    (※)jarとソースコードを結びつけるには,「eclipse jar ソース 添付」あたりでぐぐる.

    画像の説明

    2011-02-19(Sat) [長年日記] 編集

    [Windows][bat][Linux][bash] Windowsコマンドプロンプトとbashでif文を使う

    「C:\dos」ディレクトリの存在を調べたい場合、

    if exist C:\dos\nul copy C:\a.txt C:\dos\b.txt
    

    自分が使用した例で言うと,「ログディレクトリがなかったとき,ログディレクトリを作る」という時に使っている.

    if not exist %LOG_DIR%/null mkdir %LOG_DIR%
    

    bashだとこうかな.

    if [ ! -d ${LOG_DIR} ]; then
      mkdir ${LOG_DIR}
    fi
    

    関連ページ


    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オプションを指定してやらないと,引数が長すぎるというエラーが出る時がある.


    トップ «前月 最新 翌月» 追記 設定
    2006|01|06|12|
    2007|06|09|
    2008|01|03|04|06|07|08|09|10|12|
    2009|01|02|05|06|07|08|10|11|12|
    2010|03|04|05|06|07|08|09|10|11|
    2011|01|02|03|04|05|06|07|08|09|11|12|
    2012|01|02|04|06|07|08|10|11|12|
    2013|01|02|03|07|08|10|11|12|
    2014|01|02|04|05|06|07|08|09|10|11|
    2015|01|02|07|11|12|
    2016|01|03|05|07|08|09|