2011年9月11日日曜日

「7つの言語7つの世界」を読了

まぁ、洋書で「seven languages in seven weeks」というタイトルの本です。
PDFで洋書なら読めるようなんですが、ちょっとPDFより本で読む方が好きなので、
和訳が出たので購入しました。

原文では7つの言語を7週間といっているが、1つの言語を三日間にわけて説明していますが、
7言語*3日=21日じゃね?とは思います。

Ruby、Io、Prolog、Scala、Erlang、Closure、Haskelの7つなんですが、やはり関数型の趣向が強いですよね。
Io,Prolog,Erlangはほとんど触ることのない言語について、学べたことは大きいし、ScalaやHaskellなどは
Erlangのアプローチを引き継いでいるので、その元となる言語を学べるのは大きい。
Prologの論理プログラミングの考え方もルールを与えて計算は言語に任せるというアプローチは非常に
面白いものだし、これはErlangも使っているし、他の言語でも使われていくのではないか?と思いました。


あと、この筆者はRuby好きで、静的型付けを嫌いなんだなぁということが見え見えなのがちょっと。。。。。
Scalaのの章の後Erlangの章では動的型付けについて、すばらしいだろうかと言わんばかりの説明だったのが
ちょっと嫌だなぁと思うところがありました。

あと、これは第一版だからしょうがないかもしれないが、誤字があったりもします。

  • 句読点が正しくない。(これはどうでもいい)
  • 説明がおかしい点がいくつか?(どこだったか忘れてしまった)
    • これについては、後日のせます。


でも、本当にいい本です。!!!っていうか、言語を知りたいという人は必読だとは思います。

2011年9月8日木曜日

Eclipse Virgo3.0がリリースだと

Eclipse Virgo3.0がリリースされたとInfoQで載っていたので、翻訳してみました。
お勉強もせねばという意味も持って。


Eclipse Virgo 3.0 Released



EclipseにSpring DM Serverプロジェクトの移行が完了した3.0のリリースをアナウンスしました。
リリースはWABデプロイメントに対してOSGiエンタープライズのテストのすべてをパスした最後の一部のパズルGemini Web Componentを含む。
Eclipse Virgoは、Tomcatに似た実行環境を提供する。
バンドルまたは、バンドル(PARs)のセットをインストールでき、アプリケーションサーバとして扱えるような実行環境。
Virgoはユーザインストールプログラムを使って、Virgoのランタイムの空間を分離するための領域の概念を使用する。

以前は、ネストするフレームワークを分離したが、最近は、パーティショニングを提供するフレームワークフックのEquinox実装を使ったBundle digraphをサポートのためアップデートした。

Equinoxの一部のため、EquinoxベースのOSGi実行環境でVirgoの外部で使用することができます。
他のOSGiフレームワークが新しいリゾルバフックをサポートしたとき、同様に他のOSGi実行環境に移植可能にすべきです。

このリリースの新しい点はWeb ComponentのためのJettyのサポートを含むバンドルです。
(Tomcat サポートも含まれている)
これは、Equinox RTスタック内の他のコンポーネントとの緊密な統合を提供します。

領域の分離の実装のため、実行環境はFelixからEquinoxに移行している。
しかしながら、これはデフォルトでFelixi Gogo shellを含むVirgoなので直接気づかされることはない。



サーバと同様Web app frameworkのsnapsがある。
snapsはweb applicationが重複するURLをいくつかのデータを共有して同一のWebサーバで共にホストになれる。
WABs(OSGi-ified WARS)がhostアプリケーションへサービスやURLを登録できる仕組みを提供する。
また、動的に利用可能なインストールされたコンポーネントを通して、ホストアプリがどのように反復できるかの方法も提供する。
Snapsは実行するためにEclipse Virgoを必要としている。
Eclipse VirgoをサポートするIDEプラグインのセットは開発中である。

WebベースOSGi開発や、多くのSpring概念を使ったりするのは、Eclipse VirgoをOSGiの世界へ簡単に遷移をさせることができる。
ユーザ、プログラマードキュメント同様利用可能チュートリアルがある。Virgo3.0はすぐにダウンロード可能である。



2011年9月2日金曜日

SBTを使い始める

とりあえず、sbtを使ってみるということで、インストールログを簡単に。

> curl -O http://simple-build-tool.googlecode.com/files/sbt-launch-0.7.7.jar
※
> wget http://simple-build-tool.googlecode.com/files/sbt-launch-0.7.7.jar
> ln -s sbt-launch-0.7.7.jar sbt-launch.jar
> vi  sbt
> java -Xmx512M -jar `dirname $0`/sbt-launch.jar "$@"
> chmod +x sbt
> ./sbt
kaz@earlgray:~/work/scala/sbt> ./sbt 
Project does not exist, create new project? (y/N/s) y
Name: SampleProject
Organization: ponta
Version [1.0]: 
Scala version [2.9.0]: 
sbt version [0.7.7]: 

ヘルプの内容

ヘルプ 内容
actions Shows all available actions
reload Reloads sbt, picking up modifications to sbt.version or scala.version and recompiling modified project definitions
current Shows the current project, Scala version, and logging level.
trace 'on', 'nosbt', 'off', or <integer> Configures stack trace logging. 'nosbt' prints stack traces up to the first sbt frame. An integer gives the number of frames to show per exception.
project <project name> Sets the currently active project. Use 'project /' to change to the root project or 'project ..' to change to the parent project.
projects Shows all available projects.
exit, quit Terminates the build.
set <property> <value> Sets the value of the property given as its argument.
get <property> Gets the value of the property given as its argument.
console-project Enters the Scala interpreter with the current project definition bound to the variable 'current' and all members imported.
builder Set the current project to be the project definition builder.


以下はプロジェクト作成時のログ


Getting net.java.dev.jna jna 3.2.3 ...
:: retrieving :: org.scala-tools.sbt#boot-app
confs: [default]
1 artifacts copied, 0 already retrieved (838kB/32ms)
Getting Scala 2.7.7 ...
:: retrieving :: org.scala-tools.sbt#boot-scala
confs: [default]
2 artifacts copied, 0 already retrieved (9911kB/54ms)
Getting org.scala-tools.sbt sbt_2.7.7 0.7.7 ...
downloading http://databinder.net/repo/org.scala-tools.sbt/sbt_2.7.7/0.7.7/jars/sbt_2.7.7.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#sbt_2.7.7;0.7.7!sbt_2.7.7.jar (3128ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/launcher-interface/0.7.7/jars/launcher-interface.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#launcher-interface;0.7.7!launcher-interface.jar (336ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/compile_2.7.7/0.7.7/jars/compile_2.7.7.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#compile_2.7.7;0.7.7!compile_2.7.7.jar (342ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/interface/0.7.7/jars/interface.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#interface;0.7.7!interface.jar (341ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/ivy_2.7.7/0.7.7/jars/ivy_2.7.7.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#ivy_2.7.7;0.7.7!ivy_2.7.7.jar (515ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/io_2.7.7/0.7.7/jars/io_2.7.7.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#io_2.7.7;0.7.7!io_2.7.7.jar (352ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/classpath_2.7.7/0.7.7/jars/classpath_2.7.7.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#classpath_2.7.7;0.7.7!classpath_2.7.7.jar (333ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/compiler-interface/0.7.7/jars/compiler-interface-bin.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#compiler-interface;0.7.7!compiler-interface-bin.jar (344ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/compiler-interface/0.7.7/jars/compiler-interface-src.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#compiler-interface;0.7.7!compiler-interface-src.jar (335ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/control_2.7.7/0.7.7/jars/control_2.7.7.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#control_2.7.7;0.7.7!control_2.7.7.jar (336ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/precompiled-2.8.1_2.8.1/0.7.7/jars/compiler-interface-bin.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#precompiled-2.8.1_2.8.1;0.7.7!compiler-interface-bin.jar (344ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/precompiled-2.9.0_2.9.0/0.7.7/jars/compiler-interface-bin.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#precompiled-2.9.0_2.9.0;0.7.7!compiler-interface-bin.jar (346ms)
downloading http://databinder.net/repo/org.scala-tools.sbt/precompiled-2.8.0_2.8.0/0.7.7/jars/compiler-interface-bin.jar ...
[SUCCESSFUL ] org.scala-tools.sbt#precompiled-2.8.0_2.8.0;0.7.7!compiler-interface-bin.jar (345ms)
:: retrieving :: org.scala-tools.sbt#boot-app
confs: [default]
17 artifacts copied, 0 already retrieved (4379kB/58ms)
[success] Successfully initialized directory structure.
Getting Scala 2.9.0 ...
downloading http://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.9.0/scala-compiler-2.9.0.jar ...
[SUCCESSFUL ] org.scala-lang#scala-compiler;2.9.0!scala-compiler.jar (15211ms)
downloading http://repo1.maven.org/maven2/org/scala-lang/scala-library/2.9.0/scala-library-2.9.0.jar ...
[SUCCESSFUL ] org.scala-lang#scala-library;2.9.0!scala-library.jar (6277ms)
downloading http://repo1.maven.org/maven2/org/scala-lang/jline/2.9.0/jline-2.9.0.jar ...
[SUCCESSFUL ] org.scala-lang#jline;2.9.0!jline.jar (199ms)
downloading http://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.4/jansi-1.4.jar ...
[SUCCESSFUL ] org.fusesource.jansi#jansi;1.4!jansi.jar (244ms)
:: retrieving :: org.scala-tools.sbt#boot-scala
confs: [default]
4 artifacts copied, 0 already retrieved (20442kB/83ms)
[info] Building project SampleProject 1.0 against Scala 2.9.0
[info]    using sbt.DefaultProject with sbt 0.7.7 and Scala 2.7.7

2011年8月31日水曜日

Scalaの変位


不変、共変と反変について。Scalaプログラミング入門のP.218について


  • Javaのクラスの配列は共変
  • あるクラスの配列を引数として、宣言している場合、サブクラスの配列を引数として渡せる。String[] をObject[]を代入可能
  • Javaのジェネリクスは共変ではなく、不変List<string> はList<Object>に代入できない。 Javaのクラスの配列は共変となっているが、型の安全性をコンパイル時に保証してくれない。

Scalaでは不変、共変、反変について指定することが可能

  • 不変:[T]
  • 共変:[+T]
  • 反変:[-T]

不変

ScalaではArray[T]は不変です。foo(a:Array[String])メソッドに渡せるのはArray[String]のみです。
ミュータブルの場合に、型引数を不変にすることが望ましい。

class Holder[T](var data: T)
    def add(in: Holder[Int]) { in.data = in.data + 1 }
    val h = new Holder(0)
    add(h)
    println(h.data)

Holder[Number]はDoubleも保持できます。

val nh = new Holder[Number](33.3d)
    def round(in: Holder[Number]) { in.data = in.data.intValue }
    println(round(nh))
    println(nh.data.getClass)

    val dh = new Holder(33.3d)
    round(dh)   &lt;--コンパイルエラー

共変

共変にする場合には、型引数の前に+をつける。
共変の型引数は読み取り専用のコンテナに便利
List[+T]と定義して、List[String]をList[Any]を引数としてメソッドに引数として渡すので、
Listのすべての要素はAnyである要件を満たしているため、Listは共変となります。Listの内容は変更できません。

サンプル

    class Getable[+T](val data: T)
    def get(in: Getable[Any]) { println("It's " + in.data) }
    val gs = new Getable("String")
    get(gs)

    def getNum(in: Getable[Number]) = in.data.intValue
    import java.lang.{ Double => JDouble }
    val gd = new Getable(new JDouble(33.3))
    println(getNum(gd))    
つまり、Getable[+T]で定義したときGetable[String]をGetable[Any]に代入することができる。
子クラスの型に対して親クラスの型に代入することができる。

反変

Putable[String]を引数とするメソッドに対してPutable[AnyRef]を渡して呼び出せます。
    class Putable[-T] {
      def put(in: T) { println("Putting " + in) }
    }
    def writeOnly(in: Putable[String]) { in.put("Hello") }
    val p = new Putable[AnyRef]
    writeOnly(p)
    //
    trait DS[-In, +Out] { def apply(i: In): Out }
    val t1 = new DS[Any, Int] { def apply(i: Any) = i.toString.toInt }
    def check(in: DS[String, Any]) = in("333")
    println(check(t1))


Putable[-T]で定義したときにPutable[AnyRef]をPutable[String]に代入
反変は共変の反対で親クラスの型に対して、子クラスの型に代入することができる。

変位ルール

  • ミュータブルなコンテナは不変
  • イミュータブルなコンテナは共変[+T]
  • 変換処理の入力は反変[-T]に、出力は共変[+T]

ScalaのFunctionNトレイトは反変の引数と共変の戻り値を持っている。


2011年8月15日月曜日

X++って初めて知った。

世の中には色んな言語があるなぁと、思います。
InfoQの記事を見てX++を初めて知りました。infoQの記事

設計の方針としては、Javaのデータアクセス機能を強化したスーパーセットとのことです。
現在の開発はMicrosoft Dynamics AXとなったようです。
そのため、microsoftのページでの説明はすべてC#との比較となっています。
MicroSoftのページ

InfoQでは、SQLについての説明がメインですが、Microsoftのページを見ると逆にSQLについてはあまり記述していなく、以下の点がサポートされていますと記載されていた。
  • ファイル入出力
  • フォームやレポートなどのUI項目の操作
  • 動的配列のサポート
  • オブジェクトのコレクション
  • XMLビルディング、パース

記事を見る限りわかったことはこんな感じ

  • サポート機能
    • retry
    • case文に式、複数の値の記述
    • イテレータの途中の追加削除
  • 未サポート
    • finnaly
    • オーバーロード


今回はへぇ、こんなのがあるんだレベルでしか調べなかったので、機会があればもうちょっと調べてみようかなぁとは

2011年8月12日金曜日

VisualStudioでScala

Scala comes to .NET
にも記述されていますが、Visual Studioでscala開発が可能になるとこのこと。
まぁ、C#,F#とかJVMになっているし、あり得る方向なのかなぁ。。。。
microsoft にもscalaの有用性があると認識されたということだな。

リンク先の翻訳は時間があれば


2011年7月28日木曜日

Scala勉強会に行ってきました。

最近scalaを勉強しなきゃなぁ〜と思っていたんだけど、scalaの勉強会を見つけたため、参加しました。
これです。

今回の議題はActorについてでした。
Actorについては本で読んだだけで、実際に実装したことはないため、理解を深めるいい機会かなと。
発表を聞いていて、Actorモデル自体の思想はまぁ、1973年からある考えなので、元々の思想
の組み合わせにすぎないと思う。
メッセージキューとカプセル化の合成なのかなと理解した。
最後に今日の復習のため、Actor,Futureについてまとめてみました。
こういう資料を作ることにより、自分の理解が深まるかなぁと思うんで。

Actor復習資料


毎週やっているといことなので、次回も参加だな。