2010年03月27日 21:19

ScalaのインタープリタをJavaから呼び出すには

ScalaのインタープリタをJavaに埋め込むには、以下が参考。

to use Scala as a scripting engine
http://lampsvn.epfl.ch/trac/scala/ticket/874

scalaからappengineのapiをたたくシェルがようやくできたっぽい
http://d.hatena.ne.jp/marblejenka/20100301/1267455776

Embedding the Scala Interpreter
http://suereth.blogspot.com/2009/04/embedding-scala-interpreter.html

インタープリタのソースコード scala.tools.nsc
http://lampsvn.epfl.ch/svn-repos/scala/scala/trunk/src/compiler/scala/tools/nsc/

2010/04/10追記
参考:scala.tools.nsc.MissingRequirementError: object scala not found.
タグ:scala java
カテゴリ:テック
2010/03/27 Sat 21:19 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする

2010年03月27日 20:47

Scalaのメモ その4 リスト

Scalaのメモその3の続き。



配列は Array を使う。[] で要素の型を指定し、()で要素数を指定する。要素へのアクセスはJavaでは [] だが、Scalaでは () を使う。val で不変の変数を宣言しても配列自体は可変となるので、要素に代入が可能。
val a = new Array[Int](3);
a(0) = 3;
a(1) = 4;
a(2) = 5;
for(o <- a){
	println(o);
}



new で生成せずに、関数呼び出しと同じような構文で初期化された配列を生成することが可能。
val a = Array(1, 2, 3);
a(0) = 8;
for(o <- a){
	println(o);
}
// 8 2 3 が出力
引数で整数を指定しているので、a の型は Array[Int] と型推論される。



Listも配列だが、こちらは不変オブジェクト(イミュータブル)になるので、要素に代入しようとするとエラーになる。
val a = List(1, 2, 3);
// a(0) = 8; // この行を入れるとコンパイルエラーになる
for(o <- a){
	println(o);
}
// 1 2 3 が出力
a の型は List[Int] と型推論される。



List(1, 2.0, 3) とすると、要素に浮動小数点数が含まれるので、new List[AnyVal] という型に推論される。AnyValIntDoubleBooleanなどJavaのプリミティブ型のオブジェクトのスーパークラスだ。Javaのプリミティブ型もScalaではオブジェクトになっている。

さらに List(1, 2.0, "3") とすると、List[Any] という型に推論される。Anyは、どんな型のオブジェクトも収められる、全てのオブジェクトのスーパークラスだ。

AnyRef というのがあり、それがJavaの java.lang.Object と同じ。Any は、AnyValAnyRef の共通のスーパークラス。



::: は2つのリストを連結する。List は不変オブジェクトなので、2つのリスト自体は変化しないが、連結された新しいリストを式の評価結果として返す。

:: は1つの要素をリストの先頭に追加する。:: で複数の要素を並べた場合、最後はリストでなければいけない。NilList() と同じで空のリストを表すので、最後に Nil を置けばよい。Lispのリストみたいだ。
val a = List("green", "red", "yellow", "orange");
val b = List("white", "blue");
a ::: b
// List("green", "red", "yellow", "orange", "white", "blue")
"rubik" :: b
// List("rubik", "white", "blue")
"rubik" :: "cube"
// 最後がリストでないので、コンパイルエラーになる
"rubik" :: "cube" :: Nil
// List("rubik", "cube")



リストの先頭に要素を追加するのは、リストの大きさに寄らず一定のコストで実行できるが、リストの最後に追加するのはリストの大きさに比例するコストがかかるらしい。ますますLispのリストと同じだ。



タプル。複数の値をコンマ区切りで並べて括弧で囲むと、タプルになる。_1, _2,,, というようなフィールド名で要素にアクセスできる。関数から複数の値を返すときに便利だそうだ。タプルはJavaにはない。
val t3 = (3, "abc", 3.14);
println(t3._1); // 3
println(t3._2); // abc
println(t3._3); // 3.14
タプルの要素は個々のフィールドなので、同じ型である必要はなく、t3Tuple3[Int, java.lang.String, Double] という型に推論される。



マップは Map を使う。これは Array と違い、List と同様にイミュータブルである。Map にキーバリューを追加するには、+ で2値のタプルを追加する。
// var m = Map[String, String]; // () がないとコンパイルエラー
var m = Map[String, String]();
m += ("a" -> "abc"); // m += (("a", "abc")) と同じ意味。
m += (("b", "bcd"), ("c", "cde"));
// Map("a" -> "abc", "b" -> "bcd", "c" -> "cde")
"a" -> "abc"-> というメソッドを呼び出していて、2値のタプルを返す。なので、m += ("a" -> "abc")m += (("a", "abc")) と同じ意味。



要素へのアクセスは List と同様に括弧を使う。要素が見つからなかった場合は、java.util.NoSuchElementException がスローされる。この仕様は、java.util.Map と同じ。
m("b") // "bcd"
m("d") // throw java.util.NoSuchElementException



2010/04/18追記
その5に続く
タグ:scala
カテゴリ:テック
2010/03/27 Sat 20:47 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする

2010年03月25日 01:03

Scalaのメモ その3 関数・演算子

Scalaのメモその2の続き。



関数に返値がない場合、Javaと違って、ScalaではUnitと書く。Javaのvoidと同じ意味かどうかは不明。
def summation(n: Int): Unit = {
	var sum = 0;
	for(index <- 1 to n){
		sum += index;
	}
	println(sum);
}
summation(100);



Unit の場合は、返値型と中括弧 { の前のイコールを省略できる。
def summation(n: Int){
	var sum = 0;
	for(index <- 1 to n){
		sum += index;
	}
	println(sum);
}
summation(100);



引数のない関数呼出は、() を省略できる。副作用を目的とした関数呼び出しは () を省略せず、副作用がなく返値の取得を目的とした関数呼び出しは、() を省略するのがScalaの慣例らしい。
def summation(){
	println(5050);
}
summation;
summation();

副作用のない引数のない関数呼び出しで () を省略する慣例となっているのは、プロパティを取得する方法の実装をメソッドからフィールドに変更しても、それを利用する側のソースコードを変更しなくてもすむように、らしい。例えば、文字列の長さを取得するのは、Javaでは str.length() だが、Scalaでは str.length でもよい。長さの取得がメソッドかフィールドなのかは覚えている必要がない。Javaの配列の長さは arr.length であて、arr.length() でないのは、非常に紛らわしい。() が必要かどうかを覚えるのは手間だ。



for文で使う toIntで定義されているメソッドの扱いらしい。toメソッドの返値は範囲を表す scala.Rainge.Inclusive というクラスのオブジェクト。untilメソッドも同様。以下の4つの例は全部同じ動きをする。
for(i <- 1 to 10){
	out.println(i);
}
val range = 1 to 10;
for(i <- range){
	out.println(i);
}
for(i <- (1).to(10)){
	out.println(i);
}
val range = (1).to(10);
for(i <- range){
	out.println(i);
}



引数が1つのメソッドは、2項演算子と同じ構文で呼び出せる。逆に2項演算子はメソッドの構文でも呼び出せる。2項演算子はメソッドとして定義されている。1 + 2(1).+(2) と同じでシンタックスシュガーに過ぎない。1 to 10(1).to(10) と同じなのもこの理屈による。



2010/03/27追記
その4に続く
タグ:scala
カテゴリ:テック
2010/03/25 Thu 01:03 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする

2010年03月23日 00:40

Scalaのメモ その2

Scalaのメモの続き。



クラスのフィールにアクセス修飾子を付けなかった場合のデフォルトは public になる。フィールドを隠したい場合は private を付ける必要がある。

クラス定義の本体にフィールド定義と並列にコードを書くと、コンストラクタの中でそれが実行される。
class ComplexNumber(r: Double, i: Double){
	private val real: Double      = r;
	private val imaginary: Double = i;
	println(toString());
	override def toString(): String = {
		if(imaginary == 0)
			real.toString();
		else if(imaginary > 0)
			real + " + " + imaginary + " i";
		else
			real + " - " + (-imaginary) + " i";
	}
}
new ComplexNumber(1.0, 1.5); // ここで生成するだけでクラス定義中の println が呼び出される



Javaのプリミティブ型を1文字目大文字にしたものが、そのままScalaでも使える。Byte, Short, Int, Long, Float, Double, Boolean, Char, StringString はプリミティブ型ではないが)。Javaクラスファイルにコンパイルされるときには、プリミティブ型かラッパークラスに変換されている。



文字列はJavaと同じ構文のほか、Scala独自のものとして raw string 構文がある。""" で囲むとバックスラッシュはおろか改行もそのまま含めることができる。
val s1 = """12345
  67890""";
val s2 = """12345
  |67890""".stripMargin;
1つ目の例は、67890の前に改行とスペースが入る。ソースコードの見た目のためにインデントしたい場合は、2つ目の例のように、先頭に | をつけて、stripMargin を呼び出せばいい具合にしてくれるらしい。



Scalaの等価を調べる演算子 == はJavaでいうところのequalsメソッドと同じで、値が等しいかどうかをチェックしている。型が違っていても拡大変換されて比較されるようだ。
1==1 // true
1==1L   // true
1==1.0  // true
1=="1"  // false



2010/03/25追記
その3に続く
タグ:scala
カテゴリ:テック
2010/03/23 Tue 00:40 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする

2010年03月22日 00:46

Scalaのメモ

JavaプログラマがScalaを始めたときのメモ。



再代入できない変数(定数?)の設定は、val を使い、再代入できる変数は var で宣言する。
val a = 3;
var b = 4;



ifは文じゃなくて式なので、以下のようにできる。
println(if(1 > 2) 3 else 4)



インクリメント演算子はないみたい。i++ってのでエラーになる。



for文は、構文がJavaと違い、
for(index <- 1 until 100){
}
という感じ。until を使うと99まで。to を使うと100まで。
for(index <- 1 to 100)[
}
で100まで実行される。



2重ループはfor文を入れ子にしなくても、以下のようにforの中にセミコロンで連続して書ける。
for(ii <- 1 to 3; ij <- 1 to 4){
	println( ii + ", " + ij);
}



関数の定義は以下のよう。関数本体の最後の式が関数の返値になる。関数本体のブロック { の前にイコールを忘れないように。イコールを忘れるとなぜか関数本体の中で意味不明なコンパイルエラーが出て、イコールを忘れていることにしばらく気づかなかった。
def summation(n: Int): Int = {
	var sum = 0;
	for(index <- 1 to n){
		sum += index;
	}
	sum;
}
println(summation(100));



関数本体に式が1つしかなければブロックにする必要がない。{ } が不要。以下の2つは同じ意味になる。
def gcd(x: Long, y: Long): Long = {
	if (y == 0)
		x;
	else
		gcd(y, x % y);
}
def gcd(x: Long, y: Long): Long =
	if (y == 0)
		x;
	else
		gcd(y, x % y);



クラスの定義は以下のように。メソッドをオーバーライドするときは、overridedef の前に付ける必要がある。toString はJavaのObjectクラスに定義されているのでオーバーライドになる。
class ComplexNumber {
	var real: Double = 0;
	var imaginary: Double = 0;
	override def toString(): String = {
		if(imaginary == 0)
			real.toString();
		else if(imaginary > 0)
			real + " + " + imaginary + " i";
		else
			real + " - " + (-imaginary) + " i";
	}
}
val c = new ComplexNumber();
c.real = 1;
c.imaginary = -1;
println(c.toString());



不変オブジェクトの例。コンストラクタの引数はクラス定義自体に書く。
class ComplexNumber(r: Double, i: Double){
	val real: Double      = r;
	val imaginary: Double = i;
	override def toString(): String = {
		if(imaginary == 0)
			real.toString();
		else if(imaginary > 0)
			real + " + " + imaginary + " i";
		else
			real + " - " + (-imaginary) + " i";
	}
}
println(new ComplexNumber(100, 120));



2010/03/23追記
その2に続く
タグ:scala
カテゴリ:テック
2010/03/22 Mon 00:46 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする

2010年03月15日 22:07

3月15日のパキラ

Image340.jpg
いまは隣の人に世話を委託しております。
カテゴリ:植物成長記録
2010/03/15 Mon 22:07 | Comment(0) | TrackBack(0) | 植物成長記録 | このブログの読者になる | 更新情報をチェックする

2010年03月12日 20:49

巨大なファイルを一定のサイズで分割する方法

splitというコマンドが使える。大きなファイルをサイズを指定して分割できる。

巨大なファイルをWindowsパソコンの外付けハードディスクにダウンロードしたら、4GBぐらいで書き込みエラーになる、という罠にはまって、調べた。

以下の例では、巨大な backup.tar.gz というファイルを1GBごとに分割するコマンド。分割して結果できたファイルは、backup.tar.gz-00backup.tar.gz-01backup.tar.gz-02…というファイル名になる。元のファイルは削除されずに残る。
split -b 1073741824 -d --verbose backup.tar.gz backup.tar.gz-
-b はサイズを指定する。1073741824というのは、1GBが1073741824バイトだから。
-d は生成されるファイル名に連番を付ける。これがないとアルファベットがつくが、日本人には数字のほうがいい。
--verbose があると途中経過が表示される。なくてもいいけど、大きいファイルの処理だと時間がかかるので、あった方が安心する。
その後は、元のファイル名と、分割後のファイル名のプレフィックス。

結合するのは単純で、以下のようにする。backup2.tar.gz を生成している。
cat backup.tar.gz-* > backup2.tar.gz
タグ:Linux
カテゴリ:テック
2010/03/12 Fri 20:49 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする

2010年03月09日 20:34

Ubuntu に nagios をインストール

Ubuntu に nagios を apt-get でインストールした。
sudo apt-get install nagios2 nagios-images nagios-plugins

ブラウザでアクセスするためのBASIC認証のパスワードが /etc/nagios2/htpasswd.users に設定されているので、このファイルに適当なIDとPWを設定する

これで http://localhost/nagios2/ にアクセスすればいいと思ったが、アクセスするとページによっては以下のメッセージが出てしまう。赤字ボールドで表示される。(そんなに強調しなくてもいいのに。)

It appears as though you do not have permission to view the configuration information you requested...



いろいろ調べたら、/etc/nagios2/cgi.cfg の中にたくさん nagiosadmin というIDが設定されており、これと /etc/nagios2/htpasswd.users で設定するIDを一致される必要があるみたいで、 /etc/nagios2/htpasswd.usersnagiosadmin を設定しなおしたら、エラーメッセージが表示されなくなった。


あとは、/etc/nagios2/conf.d の中のファイルを適当にいじれば良さそうだ。ファイルをいじったら、
sudo /etc/init.d/nagios2 reload
とする必要あり。
タグ:nagios Linux
カテゴリ:テック
2010/03/09 Tue 20:34 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする

2010年03月08日 00:20

スライド600のアフターフォロー

Image337.jpg
約1年前に買ってもらったスライド600という丈夫な本棚の販売元からハガキが来た。1年に1回はここを点検しろよ、という内容。忘れたころにハガキがくるのは、なかなかしっかりしてると思った。

丈夫な本棚
タグ:
カテゴリ:日記
2010/03/08 Mon 00:20 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2010年03月07日 18:48

大橋ジャンクションのトンネルウォーク

山の手トンネルウォークに参加しました。中央環状線新宿渋谷間の開通前最後の一般公開で大橋ジャンクションを歩いてきました。

大橋ジャンクションは中央環状線と渋谷線の交差するところにあるジャンクションで、中央環状線は3月末に大橋ジャンクションから北、新宿・池袋方面が開通する。品川方面はまだモグラがトンネルを掘っているところ。品川方面も開通したら、2つの路線が十字に交差するジャンクションになり、首都高の完全な十字路のジャンクションとしては初めてとなる。

首都高以外の十字路のジャンクションとしては、三郷ジャンクション、川口ジャンクションとか、信号平面交差の美女木ジャンクションがあるが、首都高で都心の狭い敷地に作ってしまうのはすごい。そのかわり、ほかと違って、ぐるぐると螺旋を描いて高架の渋谷線と地下深くの中央環状線とを結ぶ構造。

走ると目が回りそうだが、単調なループにならないように、円ではなく楕円を描き、道路のペインティングも工夫されている。急カーブでバンクが効かせてあるので、少し歩きにくかった。

一般公開されたのは、中央環状線から大橋ジャンクション渋谷線方面に入った地点から渋谷線の直前までのぐるぐるループの部分。

大橋ジャンクションの内側。
大橋ジャンクションの内側


以下、中央環状線から渋谷線方面へのぐるぐるループを順番に。

東名と都心の分岐案内。中央環状線から大橋ジャンクションに入り、1車線から2車線になるところの案内標識。東名方面は青、都心方面は赤で案内されている。
大橋ジャンクション内の案内標識


シールドマシンの区間にある渋谷線方面の標識。丸いトンネル断面に合わせた変な形の標識。
大橋ジャンクション内の案内標識


ここまでがシールドマシンの区間になる。ここから2車線になる。大橋ジャンクションの渋谷線方面のループを逆に中央環状線に向かって歩いているときの写真。向こう側が中央環状線の新宿方面。丸いトンネル断面の右がふさがれているのは、中央環状線の品川方面からの合流用スペースと思われる。
シールドマシン


ぐるぐるループ内の道の傾斜が分かる図。
大橋ジャンクションの道路の傾斜


中央環状線から渋谷線方面の分岐案内 その3。
東名方面の青と都心方面の赤でわかりやすく案内される。道路にも赤と青でペインティングされている。
大橋ジャンクション内の案内標識


中央環状線から渋谷線方面の分岐案内 その4
大橋ジャンクション内の案内標識


渋谷線方面のぐるぐるループ末端、東名方面と都心方面の分岐部。ここまでずっとループを上っていき、ここから下り坂になる。ここはもう渋谷線よりも高い位置にある。
大橋ジャンクション分岐部


大橋のループ末端から渋谷線東名方面を見える。当然、車がたくさん走っている。
大橋ジャンクションから東名方面


分岐部の緩衝地帯。将来ここにどこかの車がぶつかる予定w
分岐部の緩衝地帯


車両やら模型やらプロジェクターでの映像がたくさん展示されていた。

トンネル内で事故が起きたときにクレーンが使えないので、トラックとかを動かすのに巨大な風船のようなもので持ち上げるらしい。
エアジャッキ


ウニモグ。詳細不明。首都高速道路の車。ナウシカに出てくるオウムみたいだった。
ウニモグ


清掃車両。
清掃車両


大橋ジャンクションの模型。
大橋ジャンクションの模型


山の手トンネルのシールドマシンの図と、解体された後の一部。
シールドマシン
シールドマシン


大橋ジャンクションの写真を投稿しているブログ記事リンク集
http://cafe-b.jugem.jp/?eid=1821
http://doragonfamily.blog56.fc2.com/blog-entry-445.html
http://x3domdom.cocolog-nifty.com/syarin/2010/03/post-df7b.html
http://d.hatena.ne.jp/kaeru_geko/20100307/1267965775
http://shibuya-west.cocolog-nifty.com/blog/2010/03/post-aeb4.html
http://hightimes.cocolog-nifty.com/blog/2010/03/post-905e.html
http://staff.setagaya-1.net/e3122.html
http://www.higuchi.com/item/507
http://blog.goo.ne.jp/faure64/e/f0ec7117780508aad8af50f2a5393031
http://yaplog.jp/rds/archive/63
http://suroisu.blog109.fc2.com/blog-entry-288.html
http://hotoke.cocolog-nifty.com/blog/2010/03/post-dee5.html
http://cyber1991.exblog.jp/13037387/
http://blog.goo.ne.jp/kohonaosumaka/e/b78dbba630a9474f187a024b8e7baba1
タグ:道路
カテゴリ:日記
2010/03/07 Sun 18:48 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。