C Sharpens you up

http://qiita.com/yuba に移しつつあります

GitBucketのユーザ認証をActiveDirectoryと連携する

GitBucketは驚きの超お手軽GitHubクローンです。
そのお手軽さたるや、落としてきたgitbucket.warファイルをTomcatにデプロイするかjarとして実行java -jar gitbucket.warするかするだけで社内GitHubがもう構築完了。
あとはrootユーザ(初期パスワード root)でサインインして自分のパスワードを変えるだけでもう実使用可能な状態になっています。

そのGitBucket、社内の開発者全員分のユーザアカウントを各自に作ってもらうまでもなくActiveDirectoryの認証情報でサインインするように設定することが可能です。手探りでやってみて設定に成功したので、方法を解説します。

続きを読む

Play2でHaxeを使う覚え書き

HaxeActionScriptをベースにした汎用言語だが、Javascriptへのコンパイルが当初から実現されているのでBetter JSのひとつとしても人気。
実験的にJava, C#, C++へのコンパイルまでサポートされている。

特徴としては、強力な型推論を持ったクラスベースのオブジェクト指向言語
型システムの拡張性が高く

  • enum型が、単なる列挙体というよりは共用体、いや、OptionやEitherがそのまま書けてしまう合併型と呼ぶべき存在。
  • 構造的部分型と呼ばれる、持っているべきメソッドの集合によって表現された型がある。ダックタイピング型でありinterfaceと違ってクラス側が“実装”する必要が無い。GCCC++のSignatureに近いが、Signatureと違ってその場で書けるから柔軟性はより高い。Scalaにもあるやつです。

福岡方面でひんぱんに勉強会やってるらしい。福岡こわい。

コンパイラのインストール

Windowsならインストーラで一発。PATHも勝手に通る。PATHは勝手に通らない。通っていたのはHaxe 2.x時代のインストーラ
なんかC:ドライブのルートにインストールしようとしてくるのでProgram Files (x86)の下にそっと導いてやる。

HaxeソースをJavascriptに変換するPlay2プラグイン

plugins.sbtに

addSbtPlugin("com.github.hexx" % "play-haxe" % "0.0.2")

と書き加えるだけでOK。

IDEの対応

Eclipseではググるとeclihxというプラグインがすぐに見つかるがこれはおすすめしない。少なくともEclipse 4.3(Kepler)ではまともに動かなかった。
おすすめできるのはFDT5というプラグインFlash開発用のプラグインだが、Haxe開発用としても秀逸。
プラグインインストール用のリポジトリURLは http://fdt.powerflasher.com/update/fdt5/

ただしFDT5を使って開発するときちょっと問題になるのがプロジェクトの構成の仕方。
Haxeプロジェクトとして立ち上げたプロジェクト内でならコード補完もばりばり効くのだが、Javaプロジェクト内に置いてあるHaxeソースを開いた場合はまったく効かない。

Play2のサーバアプリとHaxeのクライアントコードは別プロジェクトとして管理するべき?
というか、別プロジェクトして扱うんだったら無理してEclipse使わなくてもFlashDevelp使いましょーよという話になります。

IntelliJの場合、標準リポジトリHaxeプラグインが完成度が高い。Javaプロジェクト内のHaxeソースでももちろんコード補完効きます。
Stringとかの標準型に波線引かれるのはなんでなんだろう…

実行

Play2プロジェクトのappディレクトリ内にassetsディレクトリを作って、その中にHaxe.hxを作ります。

package assets.javascripts;
class Haxe 
{
    static public function main()
    {
        var h = new Haxe();
        trace(h.hello("World!"));
    }

    public function new(){}
    public function hello(str: String) : String {
        return "Hello, " + str;
    }
}

Play2アプリを起動して

Javascriptコンパイルされたものが出て来ます。Haxeソースが複数本あっても一本のJSファイルにまとまります。

Play2でTypeScriptを使う覚え書き

新規プロジェクトのためクライアントサイド開発に使うBetter JSを選定中。
2014/01/09現在の状況。

TypeScriptコンパイラの導入

TypeScriptコンパイラtscはNode.js上で実装されているので

  1. まずNode.jsをインストール http://nodejs.org/ (PATHも通す)
  2. 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でビルド構成されているので

  1. まずSBTをインストール http://www.scala-sbt.org/ (PATHは勝手に通る)
  2. play2-typescriptのソースを取ってきて展開し、そのディレクトリ上でsbt publish。最終段階でMavenリポジトリにアップロードしようとしてError出すけどそれは気にしない。
  3. できあがった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を探してくれるようになる。

使ってみる。

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コンパイルされたものが出て来ます。

結論

TypeScript自体の良し悪しとは別次元で、導入手順的にチームに薦めにくい…
あとIntelliJ派がEclipseいやがるかも。

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まで日替わりで参加者がブログ記事を寄稿するイベントです。

続きを読む