RubyでScalaをコンパイルするツールをつくる
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[SCALAの記事一覧]]
#areaedit
*RubyでScalaスクリプトをコンパイル補助するツールを作成す...
**目的 [#t615c205]
HelloWorld程度ならば、コンパイルツールをつくることは必要...
使えるプログラムというものは、はたくさんのjarをインクル...
以下の問題点を解決
-標準のコンパイル方法ではクラスパスにJARファイルを追加す...
-かといって、Mavenをつかってみたんですが無駄な動作をして...
--大量のJARファイルを読み込む
--更新していないファイルもコンパイルしだす。
-かといってEclipseはコンパイル結果にちょっと癖があって使...
となれば、自分で簡潔に動作する最速のツールをつくってしま...
#areaedit(end)
**目次 [#k5be5712]
#contents
#areaedit
*仕様 [#df26398e]
**ツール1 タイムスタンプスナップ機能 [#ac9ea477]
フォルダ内の.scalaファイルのタイプスタンプのスナップを取...
**ツール2 更新ファイル抽出機能 [#g2830135]
既存のタイムスタンプと現在のファイルのタイムスタンプを比...
#areaedit(end)
*scalacc.batの例 [#n0b705be]
-説明 このバッチファイルはSCALAファイルをコンパイルする際...
BASEが2回出てきているが、どちらも自動的にJarファイルを読...
@echo off
setlocal ENABLEDELAYEDEXPANSION
set CP=.
set BASE=C:\scala\lib
for %%f in (%BASE%\*) do set CP=!CP!;%%f
set BASE=C:\scala\lib\user
for %%f in (%BASE%\*) do set CP=!CP!;%%f
SET SCALA_DOC_HOME="C:\scala\doc"
ECHO %CP%
scalac -classpath %CP% %1
*ツール1 タイムスタンプスナップ機能 [#la5cc9ff]
**rubyのディレクトリ関連の処理 [#q1973441]
***ディレクトリ中のファイル一覧を取得する [#ic08cdb2]
-コード例
p Dir::entries("/home/take")
--結果
[".", "..", "WorkbookScala.scala"]
***ワイルドカードにマッチしたファイル全てに処理を行う [#n...
-コード例
p Dir::entries("/home/take")
--結果
[".", "..", "WorkbookScala.scala"]
---注意点
フォルダの区切り文字は\ではなく、/を使うこと
***ファイルのタイムスタンプを取得する [#ud2674ec]
-例
s = File.stat("c:/scala/user/src/WorkbookScala.scala")
puts File.mtime(fname).strftime("%Y/%m/%d %H:%M:%S") # ...
-結果
c:/scala/user/src/WorkbookScala.scala
2009/12/05 22:16:11
***snap_timestamp.rb [#hffed54a]
path=ARGV[0].gsub("\\","/")
ext="scala"
outfile="timestamp.txt"
buffer = ""
# **は再帰的検索。\0は複数パターンの区切り。.*は隠しファ...
Dir.glob("#{path}/**/*\0#{path}/**/.*" + ext).each{|name|
puts name
buffer = buffer + name + "\n"
s = File.stat(name)
timestamp = File.mtime(fname).strftime("%Y/%m/%d %H:%M:%...
puts timestamp
buffer = buffer + timestamp + "\n"
}
# タイムスタンプスナップを上書き更新します。
file = File.open(path + "/" + outfile, "w");
# 書き込む
file.write(buffer);
file.close
-使い方
ruby c:\scala\bin\snap_timestamp.rb "c:\scala\user\src"
--指定したフォルダにtimestamp.txtが出力されファイルのタイ...
**snap_timestamp_diff.rb [#a7a5adf5]
更新したファイルを出力する
#第一引数はフォルダ名
path=ARGV[0].gsub("\\","/")
ext=/.*\.scala$/
outfile="timestamp.txt"
current={}
# **は再帰的検索。\0は複数パターンの区切り。.*は隠しファ...
Dir.glob("#{path}/**/*\0#{path}/**/.*" ).each{|name|
if ext =~ name
s = File.stat(name)
current.store(name,File.mtime(name).strftime("%Y/%m/%d ...
end
}
# タイムスタンプ保存用ファイル読み込み
before={}
file = open(path+"/"+outfile)
buffer = file.read().split("\n");
file.close
#2行を1つの配列にまとめた配列を作成
newItem=""
newItem = nil
buffer.each{|line|
if newItem == nil
newItem=line
else
if ext =~ newItem
before.store(newItem,line)
end
newItem = nil
end
}
#タイムスタンプの比較 更新・新規追加したファイルを出力
current.each{|filepath, timestamp|
if timestamp != before.fetch(filepath)
puts filepath
end
}
-使い方
ruby snap_timestamp_diff.rb "c:\scala\user\src" > update...
***備考 [#w8c99c3c]
RubyをWindowsのDOSで動作させるとRubyからバッチファイルを...
システムのShellが使用している
-ruby\lib\ruby\1.8\shell\command-processor.rb
のPathの分割処理がバグっているというかcygwinしか想定して...
使えません。
動かしてもwindows版rubyにはfork関数が最初から実装されて...
つまり複数プロセスの同時実行には対応していない。
*Scala でコマンドの実行結果を文字列として取得 [#m4deff0b]
別途prototype.jarをつくって、簡単に取得できるようにつくっ...
-コマンド結果を取得する例
"dir".exeresult
簡潔でしょ?
下記の例は簡潔にかけているんだけど、実際にはInputStreamを...
その点上のprototype.jarを使えば、その点が考慮されているば...
開発効率がアップしますよん。
**「java -version」を実行する例 [#ddc5fad5]
Runtime r = Runtime.getRuntime();
Process p = r.exec("java -version");
**複数の引数の指定方法 [#dfda1e31]
Runtime r = Runtime.getRuntime();
Process p = r.exec(new String[] {
"C:\\Program Files\\Java\\j2re1.4.2_13\\bin\\java",
"-version" });
**「echo zzz」を実行する例 [#sc8628a2]
Runtime r = Runtime.getRuntime();
Process p = r.exec("cmd /c echo zzz");
// Process p = r.exec(new String[]{ "cmd", "/c", "echo",...
**環境変数の指定 [#jab4f667]
String[] env = new String[2];
env[0] = "TEST=サンプル";
env[1] = "PATH=" + System.getProperty("java.library.path...
Runtime r = Runtime.getRuntime();
Process p = r.exec("cmd /c echo %TEST%", env);
***参考URL 外部プロセス起動 [#qeb4d144]
http://www.ne.jp/asahi/hishidama/home/tech/java/process.h...
***Javaで,子プロセスを使うときの注意点 [#f56f123d]
http://isolinear.info/wiki/index.php/Java/Tips/Java%A4%C7...
*バッチファイルからだと連続して2つめのコンパイル以降が無...
バッチファイルからだと、どういうわけかわかりませんが、1つ...
startコマンドをつかうと、非同期にコンパイルされてしまい、...
そこで、対策として、SCALAでコンパイルごとにプロセスをたて...
-scala
import prototype.Prototype._
args(0).read{line :String =>
("scalacc " + line).exe
}
**説明 [#z100501f]
--prototype.Prototypeは自作のprototype.jarファイルをクラ...
--readは文字列をファイル名と見なし、該当するファイルから1...
--exe は文字列をコマンドラインの文字列とみなし実行し結果...
**余談 コマンドラインの実行結果を環境変数に格納する方法で...
コマンドラインの実行結果を環境変数に格納する方法に
FOR /F %t IN ('TIME /T') DO SET NOWTIME=%t
というサンプルがある。これをDOS窓から実行すると,DOS窓が閉...
cmd
と打ち込んで、もう一段DOS窓をかませて実行すると、DOS窓は...
バッチファイル実行は、どうなるんだろうか。。。
-結果
コマンドの構文が誤っています。
と出てきました。OSはWindowsXPです。
なんでやねん。って言いたいです。
色々サイトをみていたときに、%tではなく%%t表記の表現がある...
FOR /F %%t IN ('TIME /T') DO SET NOWTIME=%%t
-結果
画面が閉じる
ただし
cmd
でコマンド画面を1段かませた場合には画面は閉じない
-考察
--FOR文をつかうとDOSの起動オプション/cと同様の状態になり...
-対策
--FOR文はBATファイルからの起動専用と認識し、%%t表記を使い...
cmd /c バッチファイル
という起動方法が良い
-結論
--基本的にDOSコマンドから実行パスを得るスクリプトを書くく...
--基本的にカレントディレクトリは「.」ドットで済ませる。
Explorer .
さもないと次に示すバッチファイルを2段構えにしたファイルが...
--e_for.bat
FOR /F %%t IN ('cd') DO SET CDIR=%%t
echo %CDIR%
Explorer "%CDIR%"
--e.bat
e_for.bat
---使い方:
上記のバッチファイルをパスが通った場所に配置しておく
--- 任意のコマンドラインで
e (リターン)
*DOSからエディタを簡単に開くバッチ [#w038ce95]
DOS画面からファイルを編集したい場合がちょくちょくある。
そこで次のバッチファイルをパスが通ったところに置くと改善...
-ed.bat もしくは edit.bat
start cmd /c "c:\Program Files\sakura\sakura.exe" %1
エディタは自分の好みに合わせて変えるといい。
***cygwinのシェルから呼び出す場合 [#we3e7a62]
上記のバッチファイルを呼び出す例
フォルダの位置は参考まで
#! /usr/bin/sh
/cygdrive/c/userbin/edit.bat "$1"
*というか、DOSのよりもCYGWINのシェル環境のほうが少なくて...
DOSはなぜかXPになっても石器時代のままだ。できればcygwin環...
しかしながらcygwin上からscalaを実行しようとすると下記の問...
**cygwin上からscalaをつかう際の問題点 [#y18a835d]
-連続キー入力を受け付けない。
-矢印キーの入力がおかしい
-時々ハングアップっぽくなる(ctrl+z リターンで8割は回避で...
インタプリタでつかうには、使いづらいので困りものである。
**対策 [#qc6715fd]
cygwin上からscalaを呼び出す際には下記のコマンドで開く
cmd /c start scala
つまり、DOS上かつ別プロセスで実行してやれば問題ないのであ...
**.zshrcの設定 [#z4cd6ead]
以上のことから、cygwinのシェルの設定を修正するため .zshrc...
alias scala=cmd /c start scala
#areaedit
*バッチファイルの例 [#i2203c7c]
copy "C:\Documents and Settings\Administrator\workspace\...
:CHECK_UPDATE
ruby "c:\scala\bin\snap_timestamp_diff.rb" . >updatelist...
FOR /F %%t IN ('cd') DO SET CURRENTDIR=%%t
REM
scalac "c:\scala\bin\scalacc.scala"
-説明
コンパイルしたい対象をコピーしてカレントディレクトリにも...
更新したファイルがないか確かめています。
カレントディレクトリを取得して
コマンドに渡しています。
*scalacc.scala [#l867c1b0]
**目的 [#gbda6f56]
付属のscalacでコンパイルを行うと、連続複数ファイルのコン...
**仕様 [#t54ec363]
拡張子が.scalaであれば、単体ファイルのコンパイル、そうで...
認識する
**実行方法 [#e5e5c6f6]
-例1
-- scalaa "c:\scala\bin\scalacc.scala" コンパイルしたいフ...
-例2
-- scalaa "c:\scala\bin\scalacc.scala" コンパイルしたいフ...
ただ、これだと書き方が助長なので下記のバッチファイルを作成
**scalaccc.bat [#tbf494e6]
scalaa "c:\scala\bin\scalacc.scala" %*
-例3
-- scalaccc コンパイルしたいファイル.scala
-例4
-- scalaccc コンパイルしたいファイルリスト.txt
#areaedit(end)
終了行:
[[SCALAの記事一覧]]
#areaedit
*RubyでScalaスクリプトをコンパイル補助するツールを作成す...
**目的 [#t615c205]
HelloWorld程度ならば、コンパイルツールをつくることは必要...
使えるプログラムというものは、はたくさんのjarをインクル...
以下の問題点を解決
-標準のコンパイル方法ではクラスパスにJARファイルを追加す...
-かといって、Mavenをつかってみたんですが無駄な動作をして...
--大量のJARファイルを読み込む
--更新していないファイルもコンパイルしだす。
-かといってEclipseはコンパイル結果にちょっと癖があって使...
となれば、自分で簡潔に動作する最速のツールをつくってしま...
#areaedit(end)
**目次 [#k5be5712]
#contents
#areaedit
*仕様 [#df26398e]
**ツール1 タイムスタンプスナップ機能 [#ac9ea477]
フォルダ内の.scalaファイルのタイプスタンプのスナップを取...
**ツール2 更新ファイル抽出機能 [#g2830135]
既存のタイムスタンプと現在のファイルのタイムスタンプを比...
#areaedit(end)
*scalacc.batの例 [#n0b705be]
-説明 このバッチファイルはSCALAファイルをコンパイルする際...
BASEが2回出てきているが、どちらも自動的にJarファイルを読...
@echo off
setlocal ENABLEDELAYEDEXPANSION
set CP=.
set BASE=C:\scala\lib
for %%f in (%BASE%\*) do set CP=!CP!;%%f
set BASE=C:\scala\lib\user
for %%f in (%BASE%\*) do set CP=!CP!;%%f
SET SCALA_DOC_HOME="C:\scala\doc"
ECHO %CP%
scalac -classpath %CP% %1
*ツール1 タイムスタンプスナップ機能 [#la5cc9ff]
**rubyのディレクトリ関連の処理 [#q1973441]
***ディレクトリ中のファイル一覧を取得する [#ic08cdb2]
-コード例
p Dir::entries("/home/take")
--結果
[".", "..", "WorkbookScala.scala"]
***ワイルドカードにマッチしたファイル全てに処理を行う [#n...
-コード例
p Dir::entries("/home/take")
--結果
[".", "..", "WorkbookScala.scala"]
---注意点
フォルダの区切り文字は\ではなく、/を使うこと
***ファイルのタイムスタンプを取得する [#ud2674ec]
-例
s = File.stat("c:/scala/user/src/WorkbookScala.scala")
puts File.mtime(fname).strftime("%Y/%m/%d %H:%M:%S") # ...
-結果
c:/scala/user/src/WorkbookScala.scala
2009/12/05 22:16:11
***snap_timestamp.rb [#hffed54a]
path=ARGV[0].gsub("\\","/")
ext="scala"
outfile="timestamp.txt"
buffer = ""
# **は再帰的検索。\0は複数パターンの区切り。.*は隠しファ...
Dir.glob("#{path}/**/*\0#{path}/**/.*" + ext).each{|name|
puts name
buffer = buffer + name + "\n"
s = File.stat(name)
timestamp = File.mtime(fname).strftime("%Y/%m/%d %H:%M:%...
puts timestamp
buffer = buffer + timestamp + "\n"
}
# タイムスタンプスナップを上書き更新します。
file = File.open(path + "/" + outfile, "w");
# 書き込む
file.write(buffer);
file.close
-使い方
ruby c:\scala\bin\snap_timestamp.rb "c:\scala\user\src"
--指定したフォルダにtimestamp.txtが出力されファイルのタイ...
**snap_timestamp_diff.rb [#a7a5adf5]
更新したファイルを出力する
#第一引数はフォルダ名
path=ARGV[0].gsub("\\","/")
ext=/.*\.scala$/
outfile="timestamp.txt"
current={}
# **は再帰的検索。\0は複数パターンの区切り。.*は隠しファ...
Dir.glob("#{path}/**/*\0#{path}/**/.*" ).each{|name|
if ext =~ name
s = File.stat(name)
current.store(name,File.mtime(name).strftime("%Y/%m/%d ...
end
}
# タイムスタンプ保存用ファイル読み込み
before={}
file = open(path+"/"+outfile)
buffer = file.read().split("\n");
file.close
#2行を1つの配列にまとめた配列を作成
newItem=""
newItem = nil
buffer.each{|line|
if newItem == nil
newItem=line
else
if ext =~ newItem
before.store(newItem,line)
end
newItem = nil
end
}
#タイムスタンプの比較 更新・新規追加したファイルを出力
current.each{|filepath, timestamp|
if timestamp != before.fetch(filepath)
puts filepath
end
}
-使い方
ruby snap_timestamp_diff.rb "c:\scala\user\src" > update...
***備考 [#w8c99c3c]
RubyをWindowsのDOSで動作させるとRubyからバッチファイルを...
システムのShellが使用している
-ruby\lib\ruby\1.8\shell\command-processor.rb
のPathの分割処理がバグっているというかcygwinしか想定して...
使えません。
動かしてもwindows版rubyにはfork関数が最初から実装されて...
つまり複数プロセスの同時実行には対応していない。
*Scala でコマンドの実行結果を文字列として取得 [#m4deff0b]
別途prototype.jarをつくって、簡単に取得できるようにつくっ...
-コマンド結果を取得する例
"dir".exeresult
簡潔でしょ?
下記の例は簡潔にかけているんだけど、実際にはInputStreamを...
その点上のprototype.jarを使えば、その点が考慮されているば...
開発効率がアップしますよん。
**「java -version」を実行する例 [#ddc5fad5]
Runtime r = Runtime.getRuntime();
Process p = r.exec("java -version");
**複数の引数の指定方法 [#dfda1e31]
Runtime r = Runtime.getRuntime();
Process p = r.exec(new String[] {
"C:\\Program Files\\Java\\j2re1.4.2_13\\bin\\java",
"-version" });
**「echo zzz」を実行する例 [#sc8628a2]
Runtime r = Runtime.getRuntime();
Process p = r.exec("cmd /c echo zzz");
// Process p = r.exec(new String[]{ "cmd", "/c", "echo",...
**環境変数の指定 [#jab4f667]
String[] env = new String[2];
env[0] = "TEST=サンプル";
env[1] = "PATH=" + System.getProperty("java.library.path...
Runtime r = Runtime.getRuntime();
Process p = r.exec("cmd /c echo %TEST%", env);
***参考URL 外部プロセス起動 [#qeb4d144]
http://www.ne.jp/asahi/hishidama/home/tech/java/process.h...
***Javaで,子プロセスを使うときの注意点 [#f56f123d]
http://isolinear.info/wiki/index.php/Java/Tips/Java%A4%C7...
*バッチファイルからだと連続して2つめのコンパイル以降が無...
バッチファイルからだと、どういうわけかわかりませんが、1つ...
startコマンドをつかうと、非同期にコンパイルされてしまい、...
そこで、対策として、SCALAでコンパイルごとにプロセスをたて...
-scala
import prototype.Prototype._
args(0).read{line :String =>
("scalacc " + line).exe
}
**説明 [#z100501f]
--prototype.Prototypeは自作のprototype.jarファイルをクラ...
--readは文字列をファイル名と見なし、該当するファイルから1...
--exe は文字列をコマンドラインの文字列とみなし実行し結果...
**余談 コマンドラインの実行結果を環境変数に格納する方法で...
コマンドラインの実行結果を環境変数に格納する方法に
FOR /F %t IN ('TIME /T') DO SET NOWTIME=%t
というサンプルがある。これをDOS窓から実行すると,DOS窓が閉...
cmd
と打ち込んで、もう一段DOS窓をかませて実行すると、DOS窓は...
バッチファイル実行は、どうなるんだろうか。。。
-結果
コマンドの構文が誤っています。
と出てきました。OSはWindowsXPです。
なんでやねん。って言いたいです。
色々サイトをみていたときに、%tではなく%%t表記の表現がある...
FOR /F %%t IN ('TIME /T') DO SET NOWTIME=%%t
-結果
画面が閉じる
ただし
cmd
でコマンド画面を1段かませた場合には画面は閉じない
-考察
--FOR文をつかうとDOSの起動オプション/cと同様の状態になり...
-対策
--FOR文はBATファイルからの起動専用と認識し、%%t表記を使い...
cmd /c バッチファイル
という起動方法が良い
-結論
--基本的にDOSコマンドから実行パスを得るスクリプトを書くく...
--基本的にカレントディレクトリは「.」ドットで済ませる。
Explorer .
さもないと次に示すバッチファイルを2段構えにしたファイルが...
--e_for.bat
FOR /F %%t IN ('cd') DO SET CDIR=%%t
echo %CDIR%
Explorer "%CDIR%"
--e.bat
e_for.bat
---使い方:
上記のバッチファイルをパスが通った場所に配置しておく
--- 任意のコマンドラインで
e (リターン)
*DOSからエディタを簡単に開くバッチ [#w038ce95]
DOS画面からファイルを編集したい場合がちょくちょくある。
そこで次のバッチファイルをパスが通ったところに置くと改善...
-ed.bat もしくは edit.bat
start cmd /c "c:\Program Files\sakura\sakura.exe" %1
エディタは自分の好みに合わせて変えるといい。
***cygwinのシェルから呼び出す場合 [#we3e7a62]
上記のバッチファイルを呼び出す例
フォルダの位置は参考まで
#! /usr/bin/sh
/cygdrive/c/userbin/edit.bat "$1"
*というか、DOSのよりもCYGWINのシェル環境のほうが少なくて...
DOSはなぜかXPになっても石器時代のままだ。できればcygwin環...
しかしながらcygwin上からscalaを実行しようとすると下記の問...
**cygwin上からscalaをつかう際の問題点 [#y18a835d]
-連続キー入力を受け付けない。
-矢印キーの入力がおかしい
-時々ハングアップっぽくなる(ctrl+z リターンで8割は回避で...
インタプリタでつかうには、使いづらいので困りものである。
**対策 [#qc6715fd]
cygwin上からscalaを呼び出す際には下記のコマンドで開く
cmd /c start scala
つまり、DOS上かつ別プロセスで実行してやれば問題ないのであ...
**.zshrcの設定 [#z4cd6ead]
以上のことから、cygwinのシェルの設定を修正するため .zshrc...
alias scala=cmd /c start scala
#areaedit
*バッチファイルの例 [#i2203c7c]
copy "C:\Documents and Settings\Administrator\workspace\...
:CHECK_UPDATE
ruby "c:\scala\bin\snap_timestamp_diff.rb" . >updatelist...
FOR /F %%t IN ('cd') DO SET CURRENTDIR=%%t
REM
scalac "c:\scala\bin\scalacc.scala"
-説明
コンパイルしたい対象をコピーしてカレントディレクトリにも...
更新したファイルがないか確かめています。
カレントディレクトリを取得して
コマンドに渡しています。
*scalacc.scala [#l867c1b0]
**目的 [#gbda6f56]
付属のscalacでコンパイルを行うと、連続複数ファイルのコン...
**仕様 [#t54ec363]
拡張子が.scalaであれば、単体ファイルのコンパイル、そうで...
認識する
**実行方法 [#e5e5c6f6]
-例1
-- scalaa "c:\scala\bin\scalacc.scala" コンパイルしたいフ...
-例2
-- scalaa "c:\scala\bin\scalacc.scala" コンパイルしたいフ...
ただ、これだと書き方が助長なので下記のバッチファイルを作成
**scalaccc.bat [#tbf494e6]
scalaa "c:\scala\bin\scalacc.scala" %*
-例3
-- scalaccc コンパイルしたいファイル.scala
-例4
-- scalaccc コンパイルしたいファイルリスト.txt
#areaedit(end)
ページ名: