2011年12月3日土曜日

Languages on JavaVM

最近JavaVM上の言語をよくみるようになったので、メモ

Java
とりあえず
JavaFX
気づいたら増えていて、気づいたら消えていたような言語
Scala
割とRubyを意識してるように感じる文法。型システムが強いらしい。
Clojure
Lispの方言な感じ言語
Groovy
テストでよく使われてると聞いたが……
Ceylon
よく知らないがBetter Javaな方向らしい
Xtend
Eclipseでがんばっている言語。パーサフレームワークを強化したらこうなったっぽい?
Kotlin
JetBrain(InteliJのところ)が作っている言語。やっぱりBetter Javaな方向。

おそらく幾つかの漏れがあるはずなので、見つけ次第追記します。

これを全部フォローするのは大変そう

おまけ?

JRuby
RubyのJVM実装。それなりに良いらしい
Jython
PythonのJVM実装。JRubyほど話を聞かない。逆に.NET実装のほうではIronPythonしか話を聞かない

2011年10月15日土曜日

Ubuntuセッティング

ディレクトリ名を英語表記に


ターミナルから"デスクトップ"とか打ってられないので
"Desktop"にしたいわけです。

端末より以下を入力してあとはいい感じに。

LANG=C xdg-user-dirs-gtk-update

参考:
http://ubulog.blogspot.com/2007/10/ubuntu.html

2011年9月13日火曜日

Project Lambda 現状

延ばし延ばしにしていたProjectLambda後半の和訳ですが,どうやらそんな必要もなくなったかもしれません。
というのも,現在和訳中のLambda式の構文が代わってしまいました。
参考:InfoQメーリングリスト

マジで続きどうしよう……
あとブライアン,次に書くときはもうちょっと読みやすい文でお願いします。

2011年8月28日日曜日

和訳: Project Lambda (前半)

注:この文書はProject Lambdaの提案を和訳したものです。訳の正確性は保証しません。
この文章におかしなところがあればオリジナルを参照してください。

Brian Goetz 2010/10/10

この文書はJava言語にラムダ式を追加する案です。このスケッチはMark Reinholdによって 2009/12に作られた原案をもとに作られました。前のバージョンは2010年7月に発表されました。

2011年8月13日土曜日

Facadeパターン : 隠蔽 or not 隠蔽?

デザインパターンねたの続きです。

Facadeパターンというものがあるんですが、一言で言えば、
「複数の(低水準な)オブジェクトをまとめて扱えるような(高水準な)窓口用クラスを作る」
というものです。

HeadFirstデザインパターンから例を引用すると、
低水準なコンポーネントである
アンプ、スピーカー、プロジェクタ、照明、・・・
といったものを、
高水準クラスである"ホームシアター"で一気に調整する、とかそんな感じです。

HeadFirstデザインパターンでは、
Facadeを使うクラスが、Facadeクラスに低水準コンポーネントを渡す
という形で説明されています。
したがって、高水準な機能だけでは実現できないような"微調整"が必要なときには、
低水準コンポーネントに直接アクセスすることが可能である、と説明されています。
つまり、Java風擬似コードで言うとこうです。

class FacadeUser{
	...
	func(){
		...
		LowLevelComponent1 comp1 = new LowLevelComponent1();
		LowLevelComponent2 comp2 = new LowLevelComponent2();
		Facade facade = new Facade(comp1, comp2);
		...
	}
	...
}
class Facade{
	LowLevelComponent1 comp1;
	LowLevelComponent2 comp2;
	// constructor
	Facade (LowLevelComponent1 comp1,  LowLevelComponent2 comp2){
		this.comp1 = comp1;
		this.comp2 = comp2;
		...
	}
	...
}
一方、wikipediaなんかでは、
Facadeとなるクラスの中で、privateに低水準コンポーネントを作る、ということをしています。
したがって、Facadeを使う側は、直接低水準コンポーネントを触れない、というわけです
(setterやgetterを作れば別ですが)。
特に、日本語版wikipediaでは低水準コンポーネントを隠蔽する点にしっかり言及しています。
擬似コードだとこんなです。
class FacadeUser{
	...
	function(){
		Facade facade = new Facade();
		...
	}
	...
}
class Facade{
	private LowLevelComponent1 comp1;
	private LowLevelComponent2 comp2;
	// constructor
	Facade (LowLevelComponent1 comp1,  LowLevelComponent2 comp2){
		this.comp1 = new LowLevelComponent1();
		this.comp2 = new LowLevelComponent2();
		...
	}
	...
}

隠蔽するかしないかで、クラス図的にはほぼ同じでも、
正直相当違うんじゃないかと思うのですが、どうなんですかねえ。
どっちが正解とかそういうことは無いとは思うのですけども、
せっかく名前をつけている以上はっきりしておいてもらいたいなあと思います。

ま、そもそもFacadeパターンなんて、
わざわざ言われなくても勝手に使っているものにしか見えない、というそもそもの問題がありますが。
この辺の「何をいまさら」感は、Template methodパターンとどっこいどっこいでしょう。