CodeZine連載記事

CodeZineCurlの連載が2本始まりました。

いずれもタイトルに「○○のための~」とありますが、特別VBJavaのバックグラウンドがない方にとっても分かりやすい記事です。(既にバリバリCurlでプログラミングをしているという人よりは、これからCurlを始めようと思っている人向けの内容となっています)
VLEでビジュアルプログラミングを試したいという方は「VB6プログラマのため~」がお勧めです。「Java開発者のための~」の方は普段Eclipseを使っていてCurlも同じ環境でプログラミングしたいという方にぴったりだと思います。

ちなみに「VB6プログラマのため~」の著者はあの矢沢久雄さんです。「プログラムはなぜ動くのか ― 知っておきたいプログラミングの基礎知識」があまりにも有名です。

もう一方の「Java開発者のための~」はSeasarプロジェクトのコミッタも務める木村聡さんです。木村さんも著書をお持ちです。

Eclipseで学ぶはじめてのJava

Eclipseで学ぶはじめてのJava

2回目以降の連載も非常に楽しみです。

Curl Developer Centerがすごい

全然更新してない間にいろいろ新しい話題がありました。特に日本の開発者向けサイトであるCurl Developer Centerの活動が最近活発です。少しまとめて紹介してみます。

http://developers.curlap.com/gallery/apps
Curlのアプリケーションが多数公開されています。ちょっとしたTIPSプログラムから本格的な分析系アプリケーションまで幅広く、そのほとんど(全部?)がオープンソースとなっています。アカウントを作成すれば、自分で作成したアプリケーションをギャラリーに登録・公開することもできるようです。
個人的に驚かされたのは↓のアプリケーション。

  • 3D Gallery

http://developers.curlap.com/gallery/apps/96
とりあえず「実行」ボタンを押して動かしてみてください。まるでゲームのような3Dです。Google SketchUpでモデルを作成すれば自分オリジナルの空間を作ることができます。他にもいろいろなことができるようで、ここで説明されています。

http://developers.curlap.com/re-reference/41-curl-orb-for-java/162-quick-start-orb.html
Javaで作成したサーバサイドのプログラムをCurlからシームレスに呼び出せるようにするためのオープンソースライブラリです。最近発表されたばかりです。まだ試してないので不明な点はありますが、上記の説明を見る限り大規模システムの開発でも使えるWSDKの有力な代替候補になりそうです。ちなみに現在はまだアルファ版ということで、機能的な制限や不具合があるかもしれません。SourceForgeのページはこちら


その他にもCurl Advanced UIなど、大きなプロジェクトがいくつか出てきており今後が期待されます。

プログラミング言語Curl

curlは one of RIAs としてしかほとんど知られていませんが、純粋にプログラミング言語としてもcurlは大変面白いです。このブログのタイトルもそうした思いからついています。
kwatchの日記というブログで、珍しくプログラミング言語としてcurlが取り上げられていました。Javaは近代、Rubyは現代で、Curlは未来の言語だそうです^^;


kwatchの日記 - Java は近代の言語、Ruby は現代の言語、Curl は未来の言語

タイトルは釣りでもなんでもなくて、大まじめ。

Curl というのは、MIT の人たちが作ったリッチクライアント用言語。もともと軍隊で兵士につけるデバイス用のアプリを作るために開発されたらしい。だから少ないリソースでも高速に動作し、バカでも分かるGUIを備え、ネットワークが繋がっていてもいなくても同じように動くよう設計されたんだとさ。

リッチクライアント製品としての Curl も面白いんだけど、プログラミング言語としての Curl はもっと面白い。まじで次世代の言語だと思う。

以下、その理由。

こうやって特徴を列挙されるとcurlはもっとプログラミング言語としてアピールしてもいいんじゃないかと改めて思う。それにしてもこの人詳しいなぁ。。curlの特徴的なところはほとんど押さえられてる。マクロに言及がないのが意外だけど目に止まってないだけでしょうか。独自構文を定義できるマクロはcurlの中でも特に強力な機能なのでぜひこういった人には評価してみてもらいたい。

このブログ中のコメントについて少しフォロー。

ただし、C# の var のような、初期値で型を決定するという機能はない。ここは残念。

定数限定ですがdef構文を使うと型推論します。(def構文でよりlightweightになるプログラミング

なので匿名プロシージャは

|| これはめんどくさい
{let comp:{proc-type {String, String}:bool} =
    {proc {s1:String, s2:String}:bool
        {return s1.size < s2.size}
    }
}

の代わりに

{def comp =
    {proc {s1:String, s2:String}:bool
        {return s1.size < s2.size}
    }
}

のように宣言できます。
ちなみに匿名プロシージャはfnマクロを使って定義する方法もあります。代入先の型をコンパイラが知ることができる場合に、fnマクロを使うと匿名プロシージャの定義自体から型の指定が省略可能になります。例えばArray-of.sortメソッドの比較関数であれば↓のような感じ。

{array.sort
    comparison-proc =
        {fn s1, s2 => s1.size < s2.size}
}

Eclipse IDE (CDE) パブリックベータ

今更ですがEclipseIDEのパブリックベータが公開されています。
ダウンロードはここから出来ますが、うまくダウンロードできない場合があります。その場合はダウンロードフォームのe-mailアドレスに ".com" で終わるアドレスを記入して、Countryには "JP" などと入力するとダウンロードできるようです。(理由はよく分かりませんが。。)

ちなみにインストール方法が↓で説明されています。
http://developers.curlap.com/re-reference/19-others/115-eclipse.html

起動中ダイアログを表示する(2)

時間のかかるアプレットの起動中にダイアログを表示する方法を前回紹介しました。前回は固定の(静的な)メッセージを表示するサンプルでしたが、今回は動くプログレスバーを表示する方法の紹介です。

アプレット起動中にプログレスバー動かすためにはサブアプレットという仕組みを使います。まずは次のようなクラスを定義します。

{import * from CURL.ENGINE.BROWSER}

{define-class public final SplashScreenManager
  
  field private applet-data:#AppletData
  field private applet-url:Url
  
  {constructor public {default}
    set self.applet-url =
        {string-url
            {stringify
                {curl 6.0 applet}
                {{Dialog
                     cursor = cursor-wait,
                     {ProgressBar indeterminate? = true},
                     {on e:WindowClose do {e.consume}}
                 }.show
                    title = "起動中",
                    modal? = false
                }
            }
        }
    {on-applet-suspend do
        {self.close}
    }
  }
  
  {method public {close}:void
    {if-non-null self.applet-data then
        {self.applet-data.destroy}
    }
  }
  
  {method public {show}:void
    def ag = {AppletGraphic}
    set self.applet-data = {AppletData ag, self.applet-url}
    {while self.applet-data.loading? do
        {dispatch-events true}
    }
    {if self.applet-data.what != "finished" then
        {self.close}
    }
  }
  
}

この SplashScreenManager クラスのポイントは

プログレスバーをモーダルダイアログで表示するだけのサブアプレットを作成します。
このサンプルでは別ファイルを作るのを少し横着してコンストラクタ内でサブアプレットをハードコードしています(stringifyマクロ内がそれ)。これは当然別の .curl ファイルにしても構いません。その場合は {string-url {stringify ...}} の部分を単純に {url "subapplet.curl"} などとします。

show メソッド内では AppletData というクラスを使ってサブアプレットインスタンス化しています(その次の while 文はサブアプレットのロード完了を待つためのコードです)。よって、この show メソッドが呼び出されるとサブアプレットが実行され、動くプログレスバー入りのダイアログが表示されます。

close メソッドでは、show メソッド内で生成された AppletData を destroy します。サブアプレットは終了してダイアログが閉じます。


以下はこの SplashScreenManager クラスを利用して起動中にプログレスバーを表示するサンプルです。(上記の SplashScreenManager クラスは splash-screen.scurl というファイルに定義されているものとします)

{curl 6.0 applet}
{curl-file-attributes character-encoding = "shift-jis"}
{applet manifest = "manifest.mcurl",
    {compiler-directives careful? = true}
}

{include "splash-screen.scurl"}

{def splash-screen = {SplashScreenManager}}
{splash-screen.show}

{import * from A-HEAVY-PACKAGE-TO-LOAD}

{View
    {Frame width = 8cm, height = 8cm, "サンプルアプレット"},
    visibility = "normal",
    owner = null,
    {on WindowClose do
        {exit}
    }
}

{splash-screen.close}

起動中ダイアログを表示する

アプレットの起動に時間がかかる場合は、起動中のダイアログを表示したい場合があります。
以下はデタッチドアプレットで起動中ダイアログを表示するサンプルです。
最初にダイアログを表示して、Viewが表示された後にダイアログを閉じています。

{curl 6.0 applet}
{curl-file-attributes character-encoding = "shift-jis"}
{applet manifest = "manifest.mcurl",
    {compiler-directives careful? = true}
}

{def dialog = {Dialog
                  margin = 10pt,
                  "アプリケーションを起動しています。"
              }
}

{dialog.show title = "起動中", modal? = false}
{def saved-cursor = {{get-gui-manager}.set-busy-cursor}}
{dispatch-events true}

{import * from A-HEAVY-PACKAGE-TO-LOAD}

{View
    {Frame width = 8cm, height = 8cm, "サンプルアプレット"},
    visibility = "normal",
    owner = null,
    {on WindowClose do
        {exit}
    }
}

{{get-gui-manager}.restore-cursors saved-cursor}
{dialog.close "launched"}


このサンプルのポイントは以下の通り。

  • import 文の前でダイアログを show する

アプレットの起動時間の多くはパッケージのロードとコンパイルによります*1。特に初回起動時はパッケージキャッシュが存在しないため、2回目以降よりも時間がかかります。パッケージのロード&コンパイル中にもダイアログを表示するために、import文よりも前にダイアログ表示のコードを記述します。

  • ジーカーソル(砂時計マウスカーソル)の設定には GuiManager.set-busy-cursor を使用する

必須ではありませんが、起動中ダイアログにビジーカーソルを設定できます。import 文は必ずトップレベルに記述する必要があるため with-busy-cursor マクロは使用できません。ここでは代わりに GuiManager.set-busy-cursor メソッドを直接呼び出しています。なお、これによって設定したビジーカーソルは GuiManager.restore-cursors によって復帰させます。

  • import 文の直前で dispatch-events を呼び出す

import の直前で dispatch-events を呼び出しています。これによってパッケージのインポートが始まる前にダイアログの描画処理を完了させます。

  • View に owner = null を指定する

些細なことですがこのケースでは View に owner = null を指定する必要があります。指定しなかった場合は View が起動中ダイアログの子ウィンドウとなってしまい、ダイアログを閉じたと同時に View も閉じてしまいます。

*1:当然アプリケーションの作りにもよります。

Curlプラットフォームの7つのナイスなこと

Developer Communityのブログのmgordonによるポストの翻訳です。

Developer Community Blog: Seven nice Things about the Curl Platform

What makes Curl such a great programming platform? Here are seven things.


Curlはプログラミングプラットフォームとしてどこがそんなに優れているのでしょうか?ここに7つの理由をあげます。


単一プラットフォーム: Curl RTEはあらゆるプラットフォームのどんなブラウザでも同じように動作します。ブラウザ毎の気まぐれな動きやバグに対処する必要はありません。

セキュリティ: Curlのセキュリティモデルは、非特権アプレットがユーザのコンピュータ上で無制限に動作をすることを防ぎます。安全性を考慮すると、私たちはほとんどのアプレットが非特権であるべきだと考えます。ファイルの読み込み/書き込みなど、一般的に必要とされるが安全でない可能性のある操作については、それを行う前にRTEによってユーザに許可が求められます。これは、常に許可したり、逆に常に禁止したりするよりもよい方法です。アプレットに完全な特権を与えることも当然可能ですが、これは気軽に採用すべき手段ではありません。

スピート: アプレットCurl RTEによってマシンコードにコンパイルされるため、実行速度は速いです。アプレットはWebサイトからダウンロードされると、インクリメンタルにコンパイル、評価されます。出力を生成する式はすぐにWebブラウザに表示されます。クラス定義やプロシージャ、パッケージなどは、コンパイル後にキャッシュされるため、その後のダウンロードが初回よりも高速になります。

ソフトウェア工学: Curlソフトウェア工学に真剣な方にも好まれる言語です。変数を"any"型として宣言できる一方で、強い型チェックが行われます。多重継承をサポートし、パラメータ化タイプ(genericクラス)、さらにはユーザ定義マクロを備えます。全てをクラスにする必要はありません。豊富なAPIが利用可能で、コンパイル時の型チェックがエラーの早期除去に役立つため、開発も円滑です。加えて、デバッグ時には一切"ビルド"を行う必要はありません。編集してブラウザをリロードするだけです。

単一言語: Curl言語は現代的なWebアプリケーションの全てに適しています。 クラス、アルゴリズム、データ、式、イベントとハンドラ、テキスト、グラフィックス、フォーム、テーブル、およびその他全てを同じ言語で表現できます。XMLJavaScript、HTML、ActionScript、その他様々な言語やフォーマットの煩雑な組み合わせを駆使する必要はありません。

サーバ配備: Curlアプレットの配布は、単にそれをWebサーバに置くだけです。Webサーバ上のファイルを更新すればアップデートされます。静的なWebサイトを更新するのと同じくらい簡単です。

サービス指向: CurlアプレットWebサービスとWeb APIの理想的なコンシューマです。あらゆるSOAPエンドポイントをCurlパッケージに変換して直接呼び出すことができます。REST APIの扱いも容易です。同期/非同期両方のリクエストをサポートします。


私たちは今後数週間にわたって、これらの内容やCurlプラットフォームのその他の利点についてさらに説明をしていきます。どれが特に興味深かったかをぜひ私たちに教えてください。

Webデベロッパの方は、フリーのIDEをダウンロード(必要であればRTEもインストールされます)してCurlを試してみてください。Webに配備する予定がなかったとしても、あらゆるプログラミングプロジェクトでCurlを使うことができます。どんな種類の計算やユーザインタラクションも、Curlによって簡単になります。入門用の開発者ガイドにはたくさんの例が載っています。