2008年1月17日木曜日

Radiant, Scala, Groovy, Grails, Objective-C, Smalltalk...

Rails 周りでは Radiant, Instiki が意外と使えそうな事を発見。もう少しいじってみよう。

Java Posse の影響もあるのだが、Scala や Groovy が気になる。JRuby は少し触ったので今はどうしても新しい言語が気になる。Scala はカッコいいけど、深く理解するのは大変そう。Groovy は Ruby や Python の言語機能をある程度知ってからみると面白く見えてきた。Rails の基礎をやった事で GRails もすんなり入れたし興味深い。Spring や Hibernate をベースにしているところも何か面白そうだ。

そういえば Java Posse の 2007 総括の回では python/jython は評価が低いようだ。システム言語として python がある程度実績があり、Google も利用している事から評価している向きもあるようだが... 個人的な好みで言えばやはり Ruby になってしまう。なんか、python は古くさい感じがする。とはいえ、熱狂的な支持者がいる事も確かで、もっと使い込んでみる事も必要だろう。

OS X のフレームワーク Cocoa を使ったアプリケーションを作ってみようと、情報を集めてみた。 XCode (free) を使えばできる事はわかった。*.app ディレクトリの構造と仕組みが少し気になっていたのである。ネイティブな言語は Objective-C という事になるが、これも実際にはみた事も、書いた事もないので少し調査。C++ とはだいぶかわった文法で、解説によると C++ 的な拡張というよりは C に SmallTalk 的プログラム記述の皮をかぶせたようなもので、 サンプルを見ると二つの言語が入り交じっているようにも見えるし、クラス、オブジェクトの動的側面から言うと Reflection 相当の機能が入っている点から C++ よりオブジェクト指向が進んでいるとも言える。

ここで、改めて思い返すと Smalltalk の経験もない。GNU の smalltalk があるので、これで少し勉強してみよう。OS X で簡単にビルドできたし、gst でいくつか簡単なプログラムを動かす事もできた。

Oracle to get BEA

new.com.com によるとどうやら Oracle が以前の提案より少し高い額で BEA の買収を行いそうだ。
無念。以前から定評のあった WebLogic サーバーの市場での奮闘ぶりや、様々な機能には関心させられて
いたし、VMWare ESX / Xen のようなハイパーバイザ上でゲストとして JVM を OS のオーバーヘッド
なしに高速動作させるしくみは目から鱗だったし、Business Integration の分野ではとるべきもの(BPEL など)
はとり、JBI には仕様が不十分と強く意思表示したりと技術的に骨のある会社なので、ずっと独自性を
持ち続けられる体制を続けてほしかったのだが...

Oracle は実は web application server の分野では苦戦していて、現在の OC4J も大きな声では言えない
問題を抱えている。金は余っている訳だから、市場で既に十分検証された実績のあるソフトウェアが
ちょっとした出費で手に入るならということで、こんなことになったのだろう。とうの昔に枯れてしまった
古い DB ソフトウェアで膨大なライセンス料を濡れ手に粟で手に入れているが、ある時期以降は
買収で体制を維持しているように見えなくもない。「何かおこったらどうしよう、でも有名大手にまかせて
おけば大丈夫、少なくとも自分は」という日本の無責任 IT マネージャは格好のカモで、口では立派な
ことを言うが、裏では責任のなすり付け合いとその手はずに大半の時間を使っている日本企業の IT
部門が Oracle の様な会社を増長させ、結果的にこのような残念な結果を招いているのかもしれない。

また、ニュースにも書かれているが本当の仕掛人は乗っ取り屋アクティビスト投資家 Carl Icahn
(カール・アイカーン)だ。経済の世界からみると結果的に金になれば成功と見なされるので、
氏のようなやりかたもありなのだろうが、振り回される方はたまったものではないだろう。
金にものを言わせて攻撃的な、横暴ともとれる要求をターゲットにされてしまった企業に
迫ってくるやり方には嫌悪感を覚えずにはいられない。最も、一般人がこんなことを述べても
「だからどうした貧乏人?」とあしらわれるだけだろうが... 世の中、結局金ですか???

コンピュータ関連企業の中で比較的方向性の近い企業との協業、あるいは合併といった平和的な
解決ができなかったのが残念である。まぁ、Oracle もうまく BEA の技術をのばしていって
くれるのかも知れないが... ただ、Carl Icahn がかんでいる時点で、BEA が M&A による
金儲けのカモにされた感は拭えない。

Sun, Apple, Azul といったポリシーをもった技術先行の(イメージがある)会社には
末永くがんばってほしいし、同じようなことは勘弁してほしい。でもアメリカ式経済では
いつこれらの会社が消えても不思議ではない(とくに Azul)訳で、それを防ぐには
それなりの防衛手段が必要にもなる。ただ、それが金儲け第一主義にいつの間にか化けて
しまうととたんにつまらなくなってしまうので難しいところだ。理念と、製品、成果物に
高い価値を認められる企業はもう少し、乗っ取り屋におびえる事なく本業に専念できる
ような法整備はできないものだろうか?

BEA が名実共に SOA, web から退場となるかどうかはわからないが、乗っ取り屋の気まぐれで、
業界から活気が失われるような事にだけはならないことを祈りたい。

2008年1月9日水曜日

最近の言語

Ruby は何年も前に買った本を発掘したので、たぶん2000年前後に勉強した
はず、でもほとんど記憶にない。でも、最近の Rails, JRuby, Goldspike
のブームで面白さを再発見。やっぱり、strict type checking の言語は
肩が凝るのだろうか... 従来の言語にない言語要素も新鮮だ。
ただ、実際の手持ちのアプリケーションの移植先と
して考えた場合、Ruby/JRuby には残念な点もある。ひとつはエラー自身や、
問題箇所の特定が面倒なこと。このあたりは Java/C++ の方がずっと
わかりやすい。もうひとつ、C++ でメモリマップ経由で様々なデータを
アクセスしていたコードを Ruby で記述しようとすると結構面倒(な気がした)。
ターゲットに想定しているシステムは残念ながらネイティブな ruby が
ない(オープンソースにとても弱い OS なのでビルドするのも面倒)
困ったものなので JRuby だよりになるのだが、どうも細かい点で
動作が不安になる。Rails のそっけないエラーから根本原因を調べて
行くのはとても面倒だ...

Rails は簡単なダイナミックサイトにはもってこいだ。最初のうちは
簡潔で、独特の記述方法にとまどったが、よくみれば Ruby のコードだ。
ただ、active* など一連のものは Ruby のモジュールで、その詳細、
慣例などは結構慣れを必要とするようだが、何かポイントだけ切り出した
よい本はないものだろうか...

Goldspike も動いたときは感動したものの、war ファイルのあまりの大きさと
結局 JRuby + Rails + App をラップしているだけと気づくと何かさめて
しまった。

括弧を省いた記述ができたり、わかっている人にはわかる簡潔な書き方が
色々とあるところは気に入った。

Scala は正直とっつきにくい。なぜなら関数型言語の経験値が低いから。
ただ、java との親和性は比較的たかく、お互いをコンポーネントとみなせる
位の粒度で組むのであれば問題ない。ただし、java/Scala 間でクラスや
インターフェイスを使った継承を持ち込むとすこし大変。推測で色々と
試すと動いたりもしたが、果たして正しいのかどうかが難しい。
Scala のエレガントな記述を使いこなすだけのベースがないのが残念な
ところ。色々と用意された簡潔な記述方法はすばらしい。

Python ... いまさらだが、昔、少しやってやめてしまっていた。
ただし、機能は一通りあるわけだし、あとはどれだけ興味が維持できるかが
ポイント。なんというか、少しあくとすぐにかけなくなる(すぐに文法を
忘れてしまう...)。 Jython で java のクラスライブラリを使えるところはよい。

Groovy も昔、入門だけしてご無沙汰でした。でも、改めていろんな
入門ページをみて、Grails を試して、正直、気に入った。

2007年12月27日木曜日

JRuby idioms

* Java を使う

- require 'java'
- include_class 'java.lang.String' to short name access
- java.lang.String.new("abc")

* File I/O

- read

f = open(filename)
while line = f.readline
:
end
f.close


begin
line = readline
rescue EOFError
break
end

2007年12月26日水曜日

Google Chart API

Google Chart API の整理

もっとも、Eastwood のためだが...

- user 1日 50000 リクエストまで。

http://chart.apis.google.com/chart?
chs=200x125
&chd=s:helloWorld
&cht=lc
&chxt=x,y
&chxl=0:|Mar|Apr|May|June|July|1:||50+Kb

- chs=wwwxhhh は pixel 単位のサイズ
- chd=.... はデータ
- cht=... はチャートの種類
- chxt=x,y は x, y 両方のラベルが必要ということを指定
- chxl=... は x, y 軸のラベル

- HTML に embed するときは & ではなく & をつかう。

- char data には3種類のエンコーディングがある。
-- Simple 62 までの値 chd=s:...
A=0,B=1,Z=25,a=26,z=51,0=52,9=61,_=missing value
data set separator=","
-- Text 1000 までの値 chd=t:...
0.0=0,1.0=1,100.0=100, -1=missing value
data set separator="|"
-- Extended 4096 までの値 chd=e:
use char pair, A-Za-z0-9-._
AA = 0, AZ = 25, Aa = 26, Az = 51, A0 = 52, A9 = 61, A- = 62, A. = 63
BA = 64, BZ = 89, Ba = 90, Bz = 115, B0 = 116, B9 = 125, B- = 126, B. = 127
.A = 4032, .Z = 4057, .a = 4058, .z = 4083, .0 = 4084, .9 = 4093, .- = 4094, .. = 4095.
'_' = missing value
data set separator=","

(書きかけ...)

NetBeans 6 / ruby gems OutOfMemoryError

Java heap size はどうもハードコーディングされているらしい。

http://deadlock.netbeans.org/fisheye/rdiff/netbeans?csid=MAIN:mkrauskopf:20071216155725&u&N

Index: ruby/platform/src/org/netbeans/modules/ruby/platform/RubyExecution.java
===================================================================
RCS file: /cvsup/nb_all/ruby/platform/src/org/netbeans/modules/ruby/platform/RubyExecution.java,v
diff -u -N -r1.2 -r1.3
--- ruby/platform/src/org/netbeans/modules/ruby/platform/RubyExecution.java 16 Dec 2007 15:48:05 -0000 1.2
+++ ruby/platform/src/org/netbeans/modules/ruby/platform/RubyExecution.java 16 Dec 2007 15:57:25 -0000 1.3
@@ -170,7 +170,7 @@

String extraArgs = System.getenv("JRUBY_EXTRA_VM_ARGS"); // NOI18N

- String javaMemory = "-Xmx256m"; // NOI18N
+ String javaMemory = "-Xmx512m"; // NOI18N
String javaStack = "-Xss1024k"; // NOI18N

if (extraArgs != null) {

JRUBY_EXTRA_VM_ARGS に -Xmx512m を指定することでこれは解決。

rake がなかなか動いてくれない。以下のキーワードで探してみるが、
これといったのが見つからない...

"adding Java library jruby-complete-1.0.2" "rake aborted!" "execution expired"

何とか war ファイルはできたものの、アクセスするとディレクトリリストが
見えてしまう。アプリケーションとしては動かない。rake task で run すると
jetty が起動されるが、JSP サポートがないと出る。
ただ、war をデプロイしたのは Tomcat 5.5.1 だ。なぜだ???

2007年12月21日金曜日

Scala

Java Posse の Martin Odersky の interview から、Scala の作者である
だけではなく 1.3 以降の javac の開発もやってきた人だと関心。Scala
自身は初見だったが、よく pod cast にでてきたのは覚えている。言語に
うるさい人には気になるようだ。

Scala のコンパイラ、実行環境はオープンソースでダウンロードできて、
1.4 あたりからの java があれば実行できる。

* Hello World

package hello;
object HelloWorld {
def main(args: Array[String]) {
println("Hello World!")
}
}

- package は java と同様
- object Name { ... } は Name というシングルトンを作る
- メソッドの定義は def ではじめる。引数は "名前: 型" で宣言する
- println は組み込み
- import も同様に使えるが、機能が拡張されている。最後の要素で
{class1, class2} のようにまとめて指定でき、import a.b.C._ で
C がクラス名とすると、これは C に関する static import として
働く。

- ソースの拡張子は .scala, scalac でコンパイル。ファイル名とクラス名の
 一致の必要はないようだ。

* クラス定義

class Complex(real: double, imaginary: double) {
def re = real
def im = imaginary
override def toString() =
"" + re + (if (im < 0) "" else "+") + im + "i"
}

クラス名のあとに引数のリストが来る。これは primary constructor の
シグネチャで、class の body がパースされる。ボディがパースされるのは
ruby に似ている。

def re = real

は初期値の設定と re という getter/setter の宣言でもある。プロパティを
作っているといってもいいかも知れないが、うるさい人は色々と意見がある
だろう。本当のプロパティはコンポーネントモデルにおけるプロパティであり、
参照、設定のほかにもイベント機能なども備えないとなど云々...

Ruby のように自明なものは関数のあとに () を書かなくても呼べる。
またオブジェクトのオペレーションを呼ぶときに "." すら省略できるケースが
ある。

インスタンス化は java とほぼ同じ。

val c = new Complex(1.2, 3.4)

これは厳密に書けば

val c: Complex = new Complex(1.2, 3.4)

* Generics / Genericity

Generics/Template 相当の機能を備えている。Genericity と呼んでいる。
下の例では a は任意の型。

class Reference[a] {
private var contents: a = _
def set(value: a) { contents = value }
def get: a = contents
}

* Mixin 機能。

Ruby のものと似ている。AOP の手法の一つともいえる。実態つき、拡張可能な
インターフェイスのようなものと言ってもいい。

* call-by-value/call-by-name

関数呼び出しは call-by-value と call-by-name があり、引数の評価の
仕方が異なる。デフォルトは call-by-valude であるが、reduction が
完了しない事がある。その場合にはパラメータの型の前に => を入れると
call-by-name になる。

def constOne(x: Int, y: => Int) = 1

* if-else は conditional expression の様にも使える。

def abs(x: Double) = if (x >= 0) x else x

* Unit は java の void とほぼ同様。()

* Nested function

inner class の様に関数の中に関数を定義できる。一番外側の関数の変数は
nested function からも参照できる。

* Tail Recursion

一見、再起呼び出しに見えても、スタックを余計に消費しないように実行できる
場合はそうしてくれる。

* First-Class Functions

関数は first-class value と呼ばれ、他の関数に渡すことができる。そのような
関数を受け取ったり、返したりする関数は higher-order functions と呼ばれる。

関数のパラメータの型は "Int => Int" (Int をとり Int を返す) という形で
指定できる。その例として下のものは a から b の間の値に f 適用してその
合計をとる関数となる。

def sum(f: Int => Int, a: Int, b: Int): Int =
if (a > b) 0 else f(a) + sum(f, a + 1, b)

def sumInts(a: Int, b: Int): Int = sum(id, a, b)
def sumSquares(a: Int, b: Int): Int = sum(square, a, b)
def sumPowersOfTwo(a: Int, b: Int): Int = sum(powerOfTwo, a, b)

def id(x: Int): Int = x
def square(x: Int): Int = x * x
def powerOfTwo(x: Int): Int = if (x == 0) 1 else 2 * powerOfTwo(x 1)