Google App EngineでCompojure

ここ最近、Google App Engine(GAE)でCompojureのアプリを動かそうと試みていましたが、デプロイしたURLにアクセスすると

Error: Server Error

The server encountered an error and could not complete your request.
If the problem persists, please report your problem and mention this error message and the query that caused it.

と出てしまいました。管理画面でログを確認すると、

Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission getClassLoader)

と、どうやらクラスローダーでひっかかっているようです。

色々と試行錯誤した結果動くようになりましたが、結局Google App EngineでCompojureアプリを動かすポイントは以下の2点でした。

  • Compojureのソースから、compojure.http.multipartを呼んでいるところを探し、コメントアウトします。

ちなみに、対象ソースはcompojure.cljとhttp.cljの2ファイルでした。これをantでビルドし出来上がったcompojure.jarをWEB-INF/libに配置します。これは、GAEのクラスローダによる制約で、ファイルアップロード時にローカルファイルにアクセスしようとするクラスをロードできないための対策です。

  • コンパイルしたクラスをWEB-INF/classesに置かず、jarに固めてWEB-INF/libに配置します。

これで、NetBeans + enclojure + Compojure + GAE の開発環境が構築できました。

Pharo Smalltalkで入力補完(eCompletion)

MicrosoftVisual StudioeclipseのようなIDEには、入力したプログラムコードを補完してくれる機能がありますが、Pharo/Squeak Smalltalkにもそのような追加機能パッケージ(eCompletion)が存在し、最新版のPharoにも付属しています。

しかし、PharoにはeCompletionパッケージが付属しているものの、わたしの環境(Mac OS X 10.6)では、Tabを押してもCtrl+Spaceでも入力補完することができませんでした。

そこで、Monticello経由でeCompletionの全てのパッケージを最新版に更新したところ、アッサリと動くようになりめでたしめでたしです。

PharoでGlorp経由でPostgreSQLを利用する方法(日本語対応)

Glorp経由でPostgreSQLのデータベースにデータを登録しようと、ワークスペースで以下のようなコードを実行しましたが、エラーになりました。

login := Login new database: PostgreSQLPlatform new;
         username: 'postgres';
         password: 'postgres';
         connectString: '127.0.0.1_databasename'.

hoge := HogeModel new.
hoge title: '日本語は通る?'.

session := HogeModelDescriptorSystem sessionForLogin: login.
session login.
session save: hoge. "DB登録"
session logout .

スタックトレースをみると、どうやら暗号化のためのMD5クラスのところでこけています。

しかしPharoにはMD5クラス自体が存在しないため、このクラスをSqueakから持ってくることにします。

暗号化パッケージを追加

  1. Squeak 3.10からCryptography-Core, Cryptography-MD5の2つのパッケージをファイルアウトします。
  2. ファイルアウトすると、Squeakのあるフォルダに上記パッケージのファイルが生成されますので、それぞれのファイルをPharoにドラッグ&ドロップします。
  3. ファイル全体をファイルインします。

これで接続自体は成功するようになりました。

しかし、pgAdminでPostgreSQLのテーブルを見ると、日本語が文字化けしています。Glorpには梅澤さんの作成されたGlorpI18Nパッチがありますが、それをMoticelloでLoadしているのですが、文字化けしています。

Unicode対応

MonticelloでGlorpI18Nパッケージを選択し[Browse]ボタンを押すと、このパッチがGlorpのどこに変更しているか、その一覧が出てきます。その一覧のなかを調べていくと、DatabasePlatformクラスの*glorpI18N-overrideカテゴリのcharEncodingメソッドで、エンコーディングを指定していました。

characterEncoding
	"We hope that this will be set appropriately for the connection, but make sure the default is fairly harmless, and will in most cases complain rather than write characters incorrectly"
	characterEncoding isNil ifTrue: [characterEncoding := #utf8].
	^characterEncoding

文字エンコードがUTF8になっているので、ここをUCS2(Unicode)に書き換え、acceptします。どうやら、Squeak 3.10からは内部文字エンコードUnicodeになったようで、Sqeuakの後継であるPharoもその影響を受けているようです。(←これは間違いでした)

characterEncoding
	"We hope that this will be set appropriately for the connection, but make sure the default is fairly harmless, and will in most cases complain rather than write characters incorrectly"
	characterEncoding isNil ifTrue: [characterEncoding := #ucs2].
	^characterEncoding

以上で、PharoでGlorp経由でPostgreSQLを利用することが出来るようになりました。

Pharoで日本語フォント

Squeakの後継であるPharoで日本語が通らないという話がありますが、簡単な設定変更で日本語フォントが使えるようになります。

Pharo: Seaside One-Click Experience 2.8.4 (stable) (34.7 MB)
OS: Mac OS X 10.6

  1. クリックして[World]メニューを開く。
  2. [Sysmtem...]-[Preferences...]を開く。
  3. [System fonts...]を開く。

たとえば、ここでCode fontをクリックするとフォント選択の画面が開きますが、
最初は日本語フォントが入っていない状態です。

  1. そこで、右下の[Update]ボタンをクリックします。
  2. すると"Hiragino Sans GB W3"などのフォントが現れるので、クリックして[Apply]ボタンをクリックします。

以上で、Pharoで日本語フォントが使えるようになります。

NetBeans 6.8 + enclojure ではじめるClojureプログラミング

Clojureでプログラミングをはじめるにあたって、NetBeans 6.8 + enclojureで開発環境を構築してみよう。

IDEを準備する

NetBeans 6.8をNetBeans NetBeans 日本語サイトからダウンロードし、インストールします。
  • 私の場合、Mac OS X版をインストールしました。
enclojureをhttp://www.enclojure.org/homeからリンクを辿りダウンロードします。
  1. Downloads · EricThorsen/enclojure · GitHubからenclojure-plugin-2010-jan.nbmをダウンロード。
  2. NetBeansを起動します。
  3. [ツール]メニューから[プラグイン]を選択します。
  4. [ダウンロード済み]タブを開き、[プラグインの追加]ボタンを押します。
  5. ダウンロードしたenclojure-plugin-2010-jan.nbmを指定して[開く]をクリック。
  6. 以降は指示に従いインストールして、NetBeansを再起動します。

NetBeansClojureプラグインを利用可能にする

  1. [NetBeans]-[環境設定]から[オプション]を開き、[Clojure]タブを開きます。
  2. [REPL Settings]タブで、[Enable IDE Repl]をチェックします。
  3. [Clojure Platforms]でclojure-1.1.0を選択して[Set as default]にチェックします。

Clojureプロジェクトの作成

  1. NetBeansのプロジェクトウィンドウで右クリックし[新規プロジェクト]を選択します。
  2. カテゴリから[Clojure]を選び、プロジェクトペインで[Clojure Application]を選択し[次へ]。
  3. Project Name, Default namespace, Project location, Project folderを入力して[完了]です。

以上で、NetBeans 6.8 + enclojureによるClojure開発環境が整いました。