Play2でTypeScriptを使う覚え書き
新規プロジェクトのためクライアントサイド開発に使うBetter JSを選定中。
2014/01/09現在の状況。
TypeScriptコンパイラの導入
TypeScriptコンパイラtscはNode.js上で実装されているので
- まずNode.jsをインストール http://nodejs.org/ (PATHも通す)
- npm install -g typescript
現時点で入るバージョンは0.9.5.0。
TypeScriptソースをJavascriptにコンパイルするプラグイン play2-typescript
play2-typescriptというのが出ているものの、これは最新版(0.3.0-RC1)がMavenリポジトリに上がっていない。上がっているのは古い0.2-RC10。
つまりREADMEに書いてあるインストール方法では動かない。
バージョン番号を古く書き直すとインストール自体は成功するのだが、実行時にTypeScriptのコンパイルでこける。tscの最近のバージョンではオプション指定が変更になったため(以前は--out と書いていたオプションが--outDirになった)。
play2-typescriptを自分でビルド
play2-typescriptはSBTでビルド構成されているので
- まずSBTをインストール http://www.scala-sbt.org/ (PATHは勝手に通る)
- play2-typescriptのソースを取ってきて展開し、そのディレクトリ上でsbt publish。最終段階でMavenリポジトリにアップロードしようとしてError出すけどそれは気にしない。
- できあがったtarget\scala-2.10\sbt-0.13の内容をすべて【個人フォルダ】\.m2\repository\com\github\mumoshu\play2-typescript_2.10_0.13\0.3.0-RC1 にコピーする。
これで、Play2がローカルディスクからplay2-typescriptを探してくれるようになる。
IDEの対応
IntelliJは未対応。
Eclipseではプラグインがリポジトリ http://eclipse-update.palantir.com/eclipse-typescript/ から導入可能。
使ってみる。
Play2プロジェクトのappディレクトリ内にassetsディレクトリを作って、その中にGreeter.tsを作る。
class Greeter { greeting: string; constructor(message: string) { this.greeting = message; } greet() { return "Hello, " + this.greeting; } bye() { return "Bye, " + this.greeting; } }
Play2アプリを起動して
Javascriptにコンパイルされたものが出て来ます。
C#, Java8のラムダで再帰関数を書く
C#はラムダ記法で無名関数が書けますし、Javaも8からラムダ記法が可能になりました。
しかし無名関数では再帰関数が書けません。
さてどういうことか。
再帰関数の代表選手として階乗計算を例にとってみましょう。
まず、メソッドとして再帰的に書いてみます。
int Pow(int n) { return (n > 1) ? n * Pow(n - 1) : 1; }
こうですね。では、これをラムダ記法で書こうとすると…
Func<int, int> pow = n => (n > 1) ? n * 【ここに書くメソッド名がない!】(n - 1) : 1;
そう、自分自身を呼ぼうにも自分自身は無名だから呼びようがないのです。困りました。
Javascriptを使う人は「arguments.calleeを使えばいい」と思うかもしれませんが、Javascriptだってもうarguments.calleeは非推奨ですからね。
さて、無名ゆえに自分自身を呼びようがないラムダ式で再帰処理が書きたい場合どうするかです。
続きを読むステートレスなPlay2でログイン状態を管理する
Play framework 2.x Java and 1.x Advent Calendar 2013*1の20日目(5日ぶり4回目)です。
寄稿予定表をみると、明日担当のgakuzzzzさんの内容とかぶってしまっている可能性がとても高いのですが、Play1とPlay2の違いがあるので許してもらえないものでしょうか。
さて、JavaEEにもPHPにもASP.NETにもあるのにPlay! frameworkにはないものはと問われれば。
セッションですね。アクセスしてくる閲覧者を識別して、閲覧者別にデータを保持できる容器です。Play!にはこれがありません(ドキュメントにはセッションと称する機能の記載がありますが、これは一般には一時クッキーと呼ばれるものです)。
Play!のキャッチフレーズ「ステートレス」というのがまさにセッション機能を持たないことを意味しています。機能が欠けていることが特長? そうです。
*1:Advent Calendarとはクリスマスまでのカウントダウン日めくりのことで、それになぞらえて12/1から12/25まで日替わりで参加者がブログ記事を寄稿するイベントです。
Play! 2.1 アプリを Play! 2.2 に移行した作業の覚え書き
Play framework 2.x Java and 1.x Advent Calendar 2013*1の15日目(4日ぶり3回目)です。
Play! 2.1(Java)で作り始めたWebアプリなのですが、まだ作り始めたばっかりのうちに2.2系列のPlay!が出て来たので、どうせなら今のうちにと乗り換えを敢行しました(BoneCPのコネクションリーク問題が解決したバージョン0.8.0が、Play! 2.2.1でやっと標準搭載されたからというのが直接のきっかけです)。
結論から言うと乗り換えはできたのですが、設定ファイルの名前も書式も変わっているなど一本道ではなかったので覚え書きをここに。
どうやって作業したかと言いますと、2.1と2.2とでそれぞれplay newして、できあがったプロジェクトディレクトリを差分取って差分を今のプロジェクトに反映して(手動)などとやっておりました。
*1:Advent Calendarとはクリスマスまでのカウントダウン日めくりのことで、それになぞらえて12/1から12/25まで日替わりで参加者がブログ記事を寄稿するイベントです。
顧客ログイン後にEBeanのアクセスDBを切り替える
Play framework 2.x Java and 1.x Advent Calendar 2013*1の11日目(5日ぶり2回目)です。
さて、法人向けクラウドサービスを提供するときに問題となる、顧客ごとのデータの分離についてが今日のトピックです。
個人向けのWebサービスであればすべての情報は1個のスキーマに放り込まれて、データアイテムは外部キー関連でログインIDと結びついているものです。ところが法人向けではそうはいかない。何かの間違いである顧客企業のデータが他社の画面に表示されてしまう事態は万が一にもあってはならないし、そもそものセキュリティ内規とか外部団体の規約とかで「独立保存されていること」が要件となっていたりします。
そこでデータの分離の話。
*1:Advent Calendarとはクリスマスまでのカウントダウン日めくりのことで、それになぞらえて12/1から12/25まで日替わりで参加者がブログ記事を寄稿するイベントです。
LINQで組み合わせを列挙する
先週から話題のこちらのプログラミング課題
アプローチの仕方はいろいろあると思うのですが、新宿Scala座主宰のid:numanuma08氏は「Scalaだったらリストからすべての組み合わせを生成するのもcombinationsメソッドで一発だよ」といつも通りScala全力押しです*1。
ところがその紹介の最後で
#新宿Scala座 で新入女子社員を救ってきた
今煽られました。
完全に煽られました。
LINQとやらで組み合わせ列挙書いてみろよほら張り子の虎とか笑わないからさと煽られました。
書いてやろーじゃねーの。
*1:組み合わせ全列挙は商品数に対してO(n^2)の時間とメモリを使うので冒頭の問題の解き方としては不利です。片割れをまず列挙してそれぞれに最適な相手を二分探索するのならO(n log(n) )でいけます。だからこの記事では新人女子プログラマ問題からは離れて組み合わせ列挙のことだけ考えています。