2012年7月31日火曜日

Java Play framework 2.0で、Twitter APIを利用する(Twitter4J)

Java Play framework 2.0で、Twitter APIを利用してみました。Twitter4Jを使うと、簡単に利用できるようになるようです。と言っても、私には、ずいぶん時間がかかりましたが。Build.scala ファイルに設定を追加し、再起動すると利用できるようになりました。

/project/Build.scala
"org.twitter4j" % "twitter4j-core" % "2.2.6"」の1行を追加しました。
val appDependencies = Seq(
  // Add your project dependencies here,
  "mysql" % "mysql-connector-java" % "5.1.21",
  "com.typesafe" %% "play-plugins-mailer" % "2.0.4",
  "org.twitter4j" % "twitter4j-core" % "2.2.6"
)

実際のサンプルはこちら
タイムラインを取得するだけの簡単なものです。

参考
Managing library dependencies
Twitter4J

2012年7月30日月曜日

直リンク可能な無料の1GB写真共有ストレージ「FileDen.com」

直リンク可能な無料の写真共有ストレージ「FileDen.com」をテスト中です。先日登録した「minus.com」は、使い勝手は素晴らしいのですが、直リンクには制限があり、全く別のホスティングサーバーにあるホームページに写真のリンクを貼り付けて利用するには適していませんでした。直リンクを禁止しているサービスが多い中、FileDenは、直リンクOK「Hotlinking allowed for all files.」と謳っています。本当にありがたい。1GBのディスクスペースと、1ヶ月、5GBの転送量まで無料で利用することが可能です。

ちょっと無理はありますが、これでHerokuでも、無料でありながら、リッチなコンテンツを配信できるかな?

リンク例
<img src="http://www.fileden.com/files/〇〇.jpg" alt="〇〇.jpg" />


実際のサンプルはこちら
写真だけ、FileDenから読み込んでいます。

2012年7月29日日曜日

NHKのロンドンオリンピック「ネット生中継」でライブ映像を楽しめる!

NHKのロンドンオリンピック「ネット生中継」でライブ映像を楽しめる! 解説の声が入らないので、新鮮な映像を、緊張感を持って視聴できます。水球、ボート、アーチェリー、馬術といった、メジャーではない競技の映像もチェックできますので、ファンには見逃せないでしょう。画質もスポーツ観戦するのに、十分高画質です。本当に、素晴らしい時代です。

2012年7月28日土曜日

無料で10GBの写真ストレージ「minus.com」

無料で10GBの写真ストレージ「minus.com」に登録してみました。ありがたいことに、写真をアップすると、サムネイル写真も同時に作成してくれます。ダイレクトリンクも作成してくれますし、写真共有のための機能が非常に充実していて、言うことなし。UIも洗練されていて、使いやすいです。写真以外にも、映像やドキュメント、音楽ファイルなどもアップできる模様。



2012年7月27日金曜日

Java Play framework 2.0で、ファイルアップロード

Java Play framework 2.0で、ファイルアップロードです。なんとか、うまいこと写真のアップロードは出来たのですが、1つ大きな問題が。Herokuでは、このまま使えないようです。ファイルは、Amazon S3のようなファイルストレージに保存する必要があるらしい。Amazon S3は、無料じゃないんですよね、セコイ(笑)。

/app/views/Bulletins/editForm.scala.html
@form(action = routes.Bulletins.upload(id), 'enctype -> "multipart/form-data") {

    <input type="file" name="picture">
    <p><input type="submit" value="アップロード"></p>

}
/app/controllers/Bulletins.java
@BodyParser.Of(BodyParser.MultipartFormData.class)
public static Result upload(Long id) {

    Http.MultipartFormData multipartFormData = request().body().asMultipartFormData();
    String[] data = multipartFormData.asFormUrlEncoded().get("picture");
    Http.MultipartFormData.FilePart image = multipartFormData.getFile("picture");

    if (image != null) {

        String fileName = image.getFilename();
        String contentType = image.getContentType();
        File file = image.getFile();

        if ( contentType.equals("image/jpeg") ) {
            String myUploadPath = "/〇〇/public/img/bulletins/" ;
            file.renameTo(new File(myUploadPath, fileName));
        }

        return ok(index.render("写真が追加されました。"));
    } else {
        return ok(index.render("写真の追加に失敗しました。"));
    }
}

参考
Handling file upload (Playframework Documentation)
Play 2 How to get DataPart from MultipartFormData (Stack Overflow)
第11回 Herokuでファイルアップロードを実装しよう(技術評論社)

2012年7月26日木曜日

Java Play framework 2.0で、基本認証

Java Play framework 2.0で、基本認証です。BasicAuth.javaを作成し、@Withで読み込んでいます。テスト用なのでユーザー名とパスワードの「youruserid」と「yourpassword」は、直に埋め込んでいます。実際に利用するには、参考のページにもある通り、「User.authenticate(username, password)」などの認証機能を追加するべきでしょう。

/app/controllers/BasicAuth.java
package controllers;

import play.*;
import play.mvc.*;
import play.mvc.Http.*;

import models.*;

public class BasicAuth extends Action.Simple {

    private static final String AUTHORIZATION = "authorization";
    private static final String WWW_AUTHENTICATE = "WWW-Authenticate";
    private static final String REALM = "Basic realm=\"Enter your login ID and password, please.\"";

    public Result call(Http.Context ctx) throws Throwable {
        String authHeader = ctx.request().getHeader(AUTHORIZATION);
        if (authHeader == null) {
            ctx.response().setHeader(WWW_AUTHENTICATE, REALM);
            return unauthorized();
        }

        String auth = authHeader.substring(6);
        byte[] decodedAuth = new sun.misc.BASE64Decoder().decodeBuffer(auth);
        String[] credString = new String(decodedAuth, "UTF-8").split(":");

        if (credString == null || credString.length != 2) {
            return unauthorized();
        }

        String username = credString[0];
        String password = credString[1];

        if ( username.equals("youruserid") && password.equals("yourpassword") ) {
            return delegate.call(ctx);
        } else {
            return unauthorized();
        }
    }
}
/app/controllers/Application.java
@With(BasicAuth.class)」で基本認証を追加しています。
@With(BasicAuth.class)
public static Result adminarea() {
    return ok(adminarea.render());
}

実際のサンプルはこちら

参考
Basic Authentication in the Play Framework Using A Custom Action Annotation

2012年7月25日水曜日

Java Play framework 2.0で、View(ビュー)からセッションデータを参照

Java Play framework 2.0で、View(ビュー)からセッションデータを参照することができました。お恥ずかしい話、今まで、コントローラーで取得して、ビューに橋渡ししていたわけです。どうもおかしいと思っていたのですが、ようやく、悩みの種が1つ解消できました(笑)。

/app/controllers/Application.java
session("email", "sample@sampledomainname.com");
/app/views/index.scala.html
※セッション情報を読めるかどうかで、ログイン判定が可能です。
@session.get("email")

@if( session.get("email") == null || session.get("email") == "" ) {

    <h1>一般メニュー</h1>

} else {

    <h1>会員メニュー</h1>

} 

2012年7月24日火曜日

Java Play framework 2.0.2で、メール送信(typesafe mailer plugin)

Java Play framework 2.0.2で、メール送信です。「typesafe mailer plugin」というプラグインを追加するとSMTPでメールを送信することが可能となります。ありがたいことに、GmailをSMTPサーバーとして利用することができました。素晴らしすぎます!

1, Build.scala ファイルに設定追加
2, 「conf」フォルダに play.plugins ファイルを追加
3, application.conf にSMTPサーバー設定情報を追加
4, コントローラー内で、「import com.typesafe.plugin.*;」を設定し、メール送信

/project/Build.scala
"com.typesafe" %% "play-plugins-mailer" % "2.0.4" to your dependencies (project/Build.scala)

/conf/play.plugins
1500:com.typesafe.plugin.CommonsMailerPlugin

/conf/application.conf
※smtp.userとsmtp.passwordは、「"」で囲って下さい。
smtp.host=smtp.gmail.com
smtp.port=587
smtp.ssl=true
smtp.user="yourmailaddress@gmail.com"
smtp.password="yourpassword"

/app/controllers/Application.java
import com.typesafe.plugin.*;

public class Application extends Controller {
    public static Result index() {
        MailerAPI mail = play.Play.application().plugin(MailerPlugin.class).email();
        mail.setSubject("マイクテスト");
        mail.addRecipient("to@samplemailaddress.com");
        mail.addFrom("from@samplemailaddress.com");
        mail.send("マイクのテスト中です。");
        return ok(index.render("メール送信されました。"));
    }
}

参考
typesafehub/play-plugins

2012年7月23日月曜日

Java Play framework 2.0で、カスタムヘルパー

Java Play framework 2.0で、カスタムヘルパーです。数字のフォーマット表示ヘルパーのサンプル。もっと賢い方法があるのでしょうが、とりあえず動いているので、良しとしましょう。

1, app配下に「helpers」フォルダを作成し、Html.javaを追加します。
2, ビューでは「@import helpers.Html._」を指定して利用します。

/app/helpers/Html.java
package helpers;

public class Html
{
    public static String number_format(long number) {
        return String.format(java.util.Locale.JAPAN, "%,d", number);
    }
}
/app/views/index.scala.html
@(price: Long)

@import helper._
@import helpers.Html._

@main {
    (省略)
    <p>@Html(number_format(price))</p>
    (省略)
}


123456789

123,456,789

といった具合に、カンマ区切りで表示できるようになります。
実際のサンプルはこちら。「表示テスト」の数字部分です。

2012年7月22日日曜日

ITベンチャーを募集中「金沢クリエイティブ・ベンチャーコンテスト」、賞金200万円

金沢クリエイティブ・ベンチャーコンテスト」が開催され、ITベンチャーのビジネスプランを募集中です。グランプリ賞金は、200万円。金沢市内で事業化を目指すもので、選ばれたビジネスプランには、集中的に事業化に向けた支援を行なっていただけるとのこと。金沢だと、観光ベンチャーが期待されているのでしょうか。とにかく、興味のある方は、是非、挑戦してみて下さい。

2012年7月21日土曜日

Java Play framework 2.0で、cookieの書き込みと読み取り

Java Play framework 2.0で、cookieの書き込みと読み取りです。書き込みは良いとして、読み取りは指定が長い。使い方が間違っているのかもしれませんが、面倒ですね(笑)。

クッキー書き込み
response().setCookie("email", "username@samplemailaddress.com");
クッキー読み込み
String email = request().cookies().get("email").value().toString();
参考
Using cookies(playframework/Play20 Wiki)
play2.0 クッキー(cookie)の入出力(プロジェクトcolibriさん)

2012年7月20日金曜日

Java Play framework 2.0で、アクション別のログイン確認

Java Play framework 2.0で、アクション別のログイン確認です。掲示板の書き込み、変更、削除といった処理で、ログインしている必要がある場合のチェック機能です。一方、一覧や詳細表示などの誰でも閲覧できる画面では、ログイン確認を設けていません。

@With(Secure.class)」で実現しています。意図しているように設定できていると思うのですが、全く自信はありません。話半分に聞き流して下さい。

ログインを確認し、ログインしていない場合は、ログイン画面にリダイレクトさせています。ちなみに「email」がログイン時、セッションに設定されているデータです。

/app/controllers/Secure.java
public class Secure extends Action.Simple {

    public Result call(Http.Context ctx) throws Throwable {
        String email = ctx.session().get("email") ;
        if ( email == null || email.equals("") ) {
            return redirect(routes.Application.login());
        } else {
            return delegate.call(ctx);
        }
    }
}  
一覧表示と詳細画面表示では、ログインの確認はなし。
新規登録、変更、削除のアクションでは、ログインを確認しています。

/app/controllers/Bulletins.java
public class Bulletins extends Controller {
    public static Result index() {
    (省略)
    }

    public static Result show(Long id) {
    (省略)
    }

    @With(Secure.class)
    public static Result create() {
    (省略)
    }
    
    @With(Secure.class)
    public static Result save() {
    (省略)
    }

    @With(Secure.class)
    public static Result edit(Long id) {
    (省略)
    }
    
    @With(Secure.class)
    public static Result update(Long id) {
    (省略)
    }

    @With(Secure.class)
    public static Result delete(Long id) {
    (省略)
    }
}

実際のサンプルはこちら

参考
Action composition(Playframework Documentation)
Lv.7 カスタムActionはサーブレットフィルターみたいなもの(ソイラテさん)
アクションの実行にログインを要求する方法(The net is vastさん)

2012年7月19日木曜日

Java Play framework 2.0で、ユーザーログイン

Java Play framework 2.0で、ユーザーログイン機能を追加してみました。「ZenTasks」サンプルを参考に作成しています。Loginクラスのvalidateは、Playに備わっている既存のメソッドだそうです。とにかく、深く考えずに、こういうものだと思うことにします。

/app/controllers/Application.java
// ログイン認証
public static class Login {
    public String email;
    public String password;
    public String validate() {
        if(Member.authenticate(email, password) == null) {
            return "error";  
        }
        return null;
    }
}

// ログインフォームの表示
public static Result login() {
    return ok(
        login.render(form(Login.class))
    );
}

// ログイン結果
public static Result authenticate() {
    Form loginForm = form(Login.class).bindFromRequest();
    if(loginForm.hasErrors()) {
        flash("error", "ログインIDとパスワードが一致しません。");
        return redirect(routes.Application.login());  
    } else {
        session("email", loginForm.get().email);
        flash("success", "ようこそ。");
        return redirect(routes.Application.index());
    }
}
/app/models/Members.java
public static Member authenticate(String email, String password) {
    String passwd = Crypto.sign(password) ;
    return find.where()
        .eq("email", email)
        .eq("password", passwd)
        .findUnique();
}
サンプルはこちら

2012年7月18日水曜日

Java Play framework 2.0で、フォームのPostデータを取得し、DB登録

Java Play framework 2.0で、フォームのPostデータを取得して、DBに登録するには、以下のような手順で、とりあえず登録はできるようです。データのチェックが働いていないのと、コントローラー部ではなく、モデル内で処理するのが本筋なんでしょうが、わからないので、ここまで。まだまだ、先は遠い。

/app/controllers/SignUp.java
Form<User> filledForm = signupForm.bindFromRequest();

Member member = new Member();
member.email = filledForm.get().email;
member.password = Crypto.sign(filledForm.get().password);
member.save();

2012年7月17日火曜日

Java Play framework 2.0で、エンティティモデルに関連づかないフォーム

Java Play framework 2.0で、エンティティモデルに関連づかないフォームです。フォームサンプルをちょっと変更しただけですが(笑)。

エンティティモデルに関連づかないフォーム
public class User」となっている。
/app/models/User.java
package models;

import javax.validation.*;

import play.data.validation.Constraints.*;

public class User {

    ...
    (以下省略)
    ...
エンティティモデルに関連づいたフォーム
@Entityを宣言して、「public class Member extends Model」となっている。
/app/models/Member.java
package models;

import java.util.*;
import java.text.*;
import javax.persistence.*;

import play.db.ebean.*;
import play.data.format.*;
import play.data.validation.*;

import com.avaje.ebean.*;

@Entity 
public class Member extends Model {

    ...
    (以下省略)
    ...

実際のサンプルはこちら

2012年7月16日月曜日

Java Play framework 2.0で、フォームの入力チェック

Java Play framework 2.0で、フォームの入力チェックです。EbeanでDBに関連づいたデータは、下記の要領でチェックできるようです。

/app/models/Bulletin.java
// タイトル「title」(5文字以上で必須)
@Constraints.Required
@Constraints.MinLength(5)
public String title;

// 本文「detail」(5文字以上、1000字以下で必須)
@Constraints.Required
@Constraints.MinLength(5)
@Constraints.MaxLength(1000)
public String detail;
エラーメッセージが、英語なので日本語化の設定を追加です。次の一行をapplication.conに加えます。

/conf/application.conf
application.langs=ja
さらに、日本語メッセージファイルmessages.jaを追加します。

/conf/messages.ja
constraint.required=必須です
constraint.minLength={0}文字以上
constraint.maxLength={0}文字以下

実際のサンプルはこちら

参考
Play frameworkのDB操作を楽にするEBeanの基礎知識
Play 2.0 の i18n のはじめかた(イトウ アスカ Blogさん)

2012年7月15日日曜日

CentOS 6.3をネットワークインストール

CentOS 6.3をネットワークインストールしてみました。今回利用したインストールイメージ(CentOS-6.3-x86_64-netinstall.iso)はこちら。FTPの接続先は、下記の通りです。

ftp://ftp.iij.ad.jp/pub/linux/centos/6.3/os/x86_64

今回もウェブサーバーとしてインストールしました。デスクトップの評価などはできませんでしたが、特に大きな変更もなく、サーバー用途としては堅実な進化と言えるでしょう。

















2012年7月14日土曜日

Java Play framework 2.0の View helperに感激

Java Play framework 2.0View helperに感激してしまいました。特に「inputDate」が素晴らしいです。jQuery UI(?)のカレンダー入力機能(Datepicker)がそのまま利用できます(その後、html5の「Date」typeと判明)。日付入力が、だいぶ楽になります。

@inputText(bulletinForm("title"), '_label -> "タイトル")
@textarea(bulletinForm("detail"), '_label -> "本文", 'rows -> 10, 'cols -> 80)
@inputDate(bulletinForm("published"), '_label -> "投稿日")
実際のサンプル画面はこちら



参考
Lv.16 フォームヘルパー勢ぞろい!(ソイラテさん)

2012年7月13日金曜日

HerokuにJava Play framework 2.0.2を設定

HerokuJava Play framework 2.0.2を設定することになりました。実は、Cloudbeesにこだわって設定していたのですが、どうしてもうまくいかずに、また挫折してしまいました。今までお世話になったので、今後も「Cloudbees一筋でいこう」と思っていたのですが、無念です。

Herokuでの設定です。登録したアカウントにログインして、gitでアップすると、自動でJava Playを検知し、デプロイが完了します。素晴らしい。
heroku login

git init
git add app
git add conf
git add project
git add public
git add test
git commit -m init

heroku create -s cedar
git push heroku master
plugins.sbtでハマったので、参考に設定を載せておきます。
/project/plugins.sbt
// Comment to get more information during initialization
logLevel := Level.Warn

// The Typesafe repository
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"

// Use the Play sbt plugin for Play projects
addSbtPlugin("play" % "sbt-plugin" % "2.0.2")
実際に動いているサイトがこちら。無事、DB接続もできました。
talkativepg.herokuapp.com

2012年7月12日木曜日

Cloudbees.comにMySQLサービスを追加

Cloudbees.comMySQLサービスを追加してみました。外部から接続できて、非常に便利です。下のビデオで解説されているように、MySQL Workbenchなどで、直接DB操作が可能です。本来は、スクリプトを書いてDB操作するべきなのでしょうが、慣れない環境下では、これが非常にありがたいサービスです。

2012年7月11日水曜日

2012年7月10日火曜日

cloudbees.comにJava Play framework 2.0を設定

cloudbees.comJava Play framework 2.0を設定することができました。手順は、以下の通りです。

1. CloudBees SDK のインストール
2. play2-war-plugin の設定
3. warファイルをアップして、デプロイ

CloudBees SDK のインストール

curl -L cloudbees-downloads.s3.amazonaws.com/sdk/cloudbees-sdk-1.1-bin.zip > bees_sdk.zip
unzip bees_sdk.zip
export BEES_HOME=~/play/cloudbees-sdk-1.1
export PATH=$PATH:$BEES_HOME
解凍してできたフォルダのパスを上記のように設定
vi ~/.bash_profile
source ~/.bash_profile

bees help
「bees help」コマンドが動けば設定できています。 詳しくはこちら

play2-war-plugin の設定

plugins.sbtファイルに、play2-war-pluginの設定を2行追加。
/project/plugins.sbt
resolvers += "Play2war releases" at "http://repository-play-war.forge.cloudbees.com/release/"
addSbtPlugin("com.github.play2war" % "play2-war-plugin" % "0.6")
Build.scalaファイルにも、設定を追加。
/project/Build.scala
val appName         = "myproject"
val appVersion      = "1.0-SNAPSHOT"

val appDependencies = Seq(
  // Add your project dependencies here,
  "com.github.play2war" %% "play2-war-core" % "0.6"
)

val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
  // Add your own project settings here      
  resolvers += "Play2war releases" at "http://repository-play-war.forge.cloudbees.com/release/"
)
更に、logger.xmlファイルを追加。
/conf/logger.xml
<configuration>

  <conversionRule conversionWord="coloredLevel" converterClass="play.api.Logger$ColoredLevel" />

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%date - [%level] - from %logger in %thread %n%message%n%xException%n</pattern>
    </encoder>
  </appender>

  <logger name="play" level="INFO" />
  <logger name="application" level="INFO" />

  <!-- Off these ones as they are annoying, and anyway we manage configuration ourself -->
  <logger name="com.avaje.ebean.config.PropertyMapLoader" level="OFF" />
  <logger name="com.avaje.ebeaninternal.server.core.XmlConfigLoader" level="OFF" />
  <logger name="com.avaje.ebeaninternal.server.lib.BackgroundThread" level="OFF" />

  <root level="ERROR">
    <appender-ref ref="STDOUT" />
  </root>

warファイルをアップして、デプロイ

まずは、warファイルを作成。
cd ~/play/myproject
play war
すると、myproject-1.0-SNAPSHOT.warが、targetフォルダの中に出来上がっています。
/target/myproject-1.0-SNAPSHOT.war

最後に、アプリケーションID(今回は、「firststep」)を作成して、cloudbeesにデプロイします。 「talkativepg」は、cloudbees.comのユーザーIDです。
bees app:create firststep
bees app:deploy -a talkativepg/firststep -t jboss target/myproject-1.0-SNAPSHOT.war
bees app:update talkativepg/firststep disableProxyBuffering=true

実際に動いているページがこちら。何もないページですが、嬉しすぎます(笑)。
firststep.talkativepg.cloudbees.net




参考
http://wiki.cloudbees.com/bin/view/RUN/Play+2.0

2012年7月9日月曜日

dotcloud.comに登録してみましたが。。。

dotcloud.comに登録してみましたが、再び挫折。Java Play 2.0は、まだ利用できないようです(涙)。チュートリアルに書かれた手順通りに進めてみても、うまくいかないので調べてみたところ、Java Play 2.0はWARパッケージに対応していないとのこと。何も知らないって怖いですね。play2-war-pluginというのがあるらしいですが、完全に及び腰。しばらくは、自前の開発環境で試してみるしかなさそうです。

$sudo easy_install pip && sudo pip install dotcloud

$dotcloud
Enter your api key (You can find it at http://www.dotcloud.com/account/settings):

$ cd myproject
$ play war myproject -o ~/play/myproject/myproject.war --zip
[info] Loading project definition from /home/yourhome/play/myproject/project
[info] Set current project to myproject (in build file:/home/yourhome/play/myproject/)
[error] Not a valid command: war (similar: start, run)
[error] Not a valid project ID: war
[error] Not a valid configuration: war
[error] Not a valid key: war (similar: watch, run, target)
[error] war
[error]
参考
Play war command not working

2012年7月8日日曜日

Java Play frameworkで、Cometの「comet-clock」サンプル

Java Play frameworkで、Cometの「comet-clock」サンプルです。いや~、プログラムを覗いてみましたが、なんだかわかりません(笑)。

Cometが実現できるのか、Play frameworkはスゴイな、さすがはJAVAだな」と、今回Java Play frameworkをはじめる一番の食いつきポイントだったわけですが、見事に挫折です。まあ、今までのサンプルソースも、よくわかっちゃいませんでしたが(笑)。しかし、これだと、Java Play frameworkを選択した意味がなくなってしまうんですよね。しかたがないので、将来、「こういうこともできる(かも?)」と気持ちを切り替え、先に進むしかありません。

コントローラーで、ビューの「clockChanged」を呼んでいるらしいのは分かるんですが、中身がさっぱり。

コントローラー
/app/controllers/Application.java
public static Result liveClock() {
    return ok(new Comet("parent.clockChanged") {  
        public void onConnected() {
           clock.tell(this); 
        } 
    });
}
ビュー
/app/views/index.scala.html
<script type="text/javascript" charset="utf-8">
    // Called for each Comet message
    var clockChanged = function(time) {
        $('#clock').html(time.replace(/(\d)/g, '<span>$1</span>'))
    }
</script>

<iframe id="comet" src="@routes.Application.liveClock.unique"></iframe>

2012年7月7日土曜日

Java Play frameworkで、ログインユーザー認証の「ZenTasks」サンプル

Java Play frameworkで、ログインユーザー認証の「ZenTasks」サンプル(/samples/java/zentasks/)です。立ち上げると、「computer-database」の場合と同様、最初に赤い(エラー?)画面が表示されます。「Apply this script now!」をクリックし、DBを作成します。ログイン画面が表示されますので、

ログインID : guillaume@sample.com
パスワード : secret

でログインすることができます。仕事リストを追加することができる簡単なタスク管理アプリケーションです。興味があるのはログイン認証部分なので、そこだけでも追ってみることに。

コントローラー
/app/controllers/Application.java
ログイン認証部分
// -- Authentication

public static class Login {
    
    public String email;
    public String password;
    
    public String validate() {
        if(User.authenticate(email, password) == null) {
            return "Invalid user or password";
        }
        return null;
    }
    
}
ログインフォーム表示
/**
 * Login page.
 */
public static Result login() {
    return ok(
        login.render(form(Login.class))
    );
}
ログイン結果
/**
 * Handle login form submission.
 */
public static Result authenticate() {
    Form loginForm = form(Login.class).bindFromRequest();
    if(loginForm.hasErrors()) {
        return badRequest(login.render(loginForm));
    } else {
        session("email", loginForm.get().email);
        return redirect(
            routes.Projects.index()
        );
    }
}
モデル
/app/models/User.java
コントローラーの User.authenticate は、モデル内でDBアクセスし、結果を返していますね、多分?
/**
 * Authenticate a User.
 */
public static User authenticate(String email, String password) {
    return find.where()
        .eq("email", email)
        .eq("password", password)
        .findUnique();
}





2012年7月6日金曜日

Java Play frameworkで、Form作成「Forms」サンプル

Java Play frameworkで、Form作成「Forms」サンプル(/samples/java/forms/)を試してみました。フォームの要素をViewのscala.htmlで定義して作成しています。「@」で始まり、「()」で設定項目が囲まれていますので、なんとなくわかってきます。

/app/views/signup/form.scala.html

テキスト入力
@inputText(
    signupForm("username"), 
    '_label -> "Username", 
    '_help -> "Please choose a valid username.",
    '_error -> signupForm.globalError
)
パスワード入力
@inputPassword(
    signupForm("password"), 
    '_label -> "Password",
    '_help -> "A password must be at least 6 characters. "
)
セレクトボックス
@select(
    signupForm("profile.country"), 
    options = options(Countries.list),
    '_default -> "--- Choose a country ---",
    '_label -> "Country",
    '_error -> signupForm("profile.country").error.map(_.withMessage("Please select your country"))
)
テキストエリア
@textarea(
    signupForm("profile.address"), 
    '_label -> "Address", 'cols -> 50
)
チェックボックス
@checkbox(
    signupForm("accept"), 
    '_label -> None, '_text -> "You aggree the Terms and conditions",
    '_showConstraints -> false
)

コントローラーの SignUp.java を見ると、最初に、blank() が表示され、サブミットで、submit() メソッドが処理されているのがわかります。

/app/controllers/SignUp.java





2012年7月5日木曜日

Java Play frameworkで、DB接続「computer-database」

サンプルの「computer-database」を利用し、Java Play frameworkで、DB接続です。play-2.0.2を解凍してできた、サンプルフォルダの /sample/java/computer-database をコピーして立ち上げてみました。最初に赤い(エラー?)画面が表示されますが、慌てず、急がず。DBがまだないためで、正常な動作です。「Apply this script now!」のボタンをクリックすると、DB作成のスクリプトが起動し、テーブルが作成され、初期のシードデータが挿入されます。application.confで、DB接続情報を定義しているようです。

/conf/application.conf
# Database configuration
# ~~~~~ 
# You can declare as many datasources as you want.
# By convention, the default datasource is named `default`
db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play"
H2というDBを利用してますね。ロケットじゃないです(笑)。詳しくはこちら

実際に起動されているスクリプトは、下記にあるsqlファイルらしい。
/conf/evolutions/default/1.sql
/conf/evolutions/default/2.sql

「Add a new computer」のボタンをクリックし、データを追加してみました。追加後に、一覧表示されましたので、とりあえず、成功です。







参考
Play frameworkのDB操作を楽にするEBeanの基礎知識

2012年7月4日水曜日

phpPgAdmin の config.inc.php に、どっぷりとハマる

phpPgAdmin の config.inc.php に、どっぷりとハマり、無益な時間を過ごしてしまいました。解決はしましたが、今でも意味がわからず。疲れがどっと出ました。pg_hba.conf、postgresql.conf と設定し、ウェブ経由でアクセスできるはずなのですが、なぜかアクセス出来ません。長い時間、試行錯誤して、ようやく原因を突き止めました。ちなみに環境は、以下の通り。

postgresql - 8.4.11
php - 5.3.3
phpPgAdmin - 5.0.4

phpPgAdmin /conf/config.inc.php の「$conf['servers'][0]['host']」部分の設定を「localhost」から「127.0.0.1」に変更したら、接続できるようになりました。hostsファイルを確認してみても、問題ないようなのです。

// Hostname or IP address for server.  Use '' for UNIX domain socket.
// use 'localhost' for TCP/IP connection on this computer
$conf['servers'][0]['host'] = 'localhost';
↓↓↓

「localhost」に設定するように書いてあります(汗)。
// Hostname or IP address for server.  Use '' for UNIX domain socket.
// use 'localhost' for TCP/IP connection on this computer
$conf['servers'][0]['host'] = '127.0.0.1';
結果オーライということで、深く考えないことにしましょう。

参考
Phpadmin Failed To Login After Installed Postgres 8.4

2012年7月3日火曜日

Java Play frameworkで、再びHello World

Java Play frameworkで、再びHello Worldです。helloworldサンプルアプリケーションがありましたので、そちらを試してみました。Viewを覗くと、Scalaベースのテンプレートエンジンになっているということで、プログラムとHTMLが混在しています。Formを作成している部分ですが、良く言えば、自由に書けるし、悪く言えば、見づらいソースになってしまうような気がします。慣れるかなぁ(笑)。MVCで、UIデザイン部分をを切り離しているのは分かるんですが、これでデザイナーさんにメンテナンスをお願いして、管理してもらえるのかな?!

samples/java/helloworld/app/views/index.scala.html
@(helloForm: Form[Application.Hello])

@import helper._

@main(title = "The 'helloworld' application") {
    
    <h1>Configure your 'Hello world':</h1>
    
    @form(action = routes.Application.sayHello, args = 'id -> "helloform") {
        
        @inputText(
            field = helloForm("name"),
            args = '_label -> "What's your name?", 'placeholder -> "World"
        )
        
        @inputText(
            field = helloForm("repeat"),
            args = '_label -> "How many times?", 'size -> 3, 'placeholder -> 10
        )
        
        @select(
            field = helloForm("color"), 
            options = options(
                "" -> "Default",
                "red" -> "Red",
                "green" -> "Green",
                "blue" -> "Blue"
            ),
            args = '_label -> "Choose a color"
        )
        
        <p class="buttons">
            <input type="submit">
        <p>
        
    }
    
}

2012年7月2日月曜日

Java Play frameworkでHello World

Java Play frameworkでHello Worldを表示してみました。まずは、お約束のはじめの一歩です。挫折しないように、ゆっくりと亀の歩みで進めていこうと思います。

app/controllers/Application.java
public static Result index() {
  return ok("Hello world!");
}
無事、「Hello world!」と表示できました。ここでは、私でもつまずかないでしょう。

次に、「world」を変更できるようにしてみます。
app/controllers/Application.java
public static Result index(String name) {
  return ok("Hello " + name + "!");
}
conf/routes
# Home page
GET  /:name  controllers.Application.index(name: String)
http://yourhostname:9000/Taro

にアクセスすると、「Hello Taro!」と表示されました。よしよし(笑)。

2012年7月1日日曜日

CentOS 6.2にJavaのPlay framework 2.0.2をインストール

CentOS 6.2にJavaのPlay framework 2.0.2をインストールしてみました。簡単だと書かれていたのですが、JAVAは全くわかっていないので、環境を作るだけで四苦八苦しました。

まずは、JAVAの環境構築から。
javacが利用できるかどうかを、まず確認。

which javac
私は、javacが利用できない環境で進めていたため、原因がわかるまで、かなりの時間を要しました。初心者です。笑ってやって下さい。

java -version
最初に、JAVAのバージョンを確認して、インストールされているじゃないかと安心していたのがいけませんでした。JRE(Java Runtime Environment)は、実行環境のみで、javacのコンパイラは付属していないとのこと。 JDK(Java Development Kit)をインストールして、ようやく利用できるようになりました。

Oracleのページから、JDKをダウンロード。今回利用したのは、Java SE 6 Update 33のjdk-6u33-linux-i586-rpm.binです。ページ中央の青い「Download」ボタンから入手可能です。


ダウンロードしてきたファイルに実行権限を与えて、インストール。
cd /usr/local/src/
chmod +x jdk-6u33-linux-i586-rpm.bin
./jdk-6u33-linux-i586-rpm.bin
export JAVA_HOME=/usr/java/default
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
profileファイルに、上記の環境設定を書き込んで、パスを設定。
vi /etc/profile
source /etc/profile
これで、which javacで確認しても、コマンドが利用できる状態になりました。

次に、Play frameworkをダウンロードして、解凍。

解凍してできた、「play」がplayコマンドになっているようなので、これにもパスを設定します。
README.md
documentation
framework
play
play.bat
repository
samples
PATH=$PATH:$HOME/bin:$HOME/play/play-2.0.2
.bash_profileファイルに上記のパスを追加しました。今回、ホームの「play」フォルダの中に、play-2.0.2を解凍しています(/home/yourusername/play/play-2.0.2)。
vi ~/.bash_profile
一度、ログアウトし、ログインしなおして、
which play
として、パスが通っていればOKです。

後は、解説にある通り。
$play new projectname
       _            _
 _ __ | | __ _ _  _| |
| '_ \| |/ _' | || |_|
|  __/|_|\____|\__ (_)
|_|            |__/

play! 2.0.2, http://www.playframework.org

The new application will be created in /home/yourusername/play/projectname

What is the application name?
> projectname

Which template do you want to use for this new application?

  1 - Create a simple Scala application
  2 - Create a simple Java application
  3 - Create an empty project

> 2

OK, application projectname is created.

Have fun!

$cd projectname
projectnameフォルダに、以下のようなファイル群がコピーされています。
.gitignore
README
app
conf
project
public
ウェブサーバーを立ち上げます。起動するまで、しばらく時間がかかります。
$ play run
[info] Loading project definition from /home/sample/play/projectname/project
[info] Set current project to projectname (in build file:/home/sample/play/projectname/)

[info] Updating {file:/home/sample/play/projectname/}projectname...
[info] Done updating.
--- (Running the application from SBT, auto-reloading is enabled) ---

[info] play - Listening for HTTP on port 9000...

(Server started, use Ctrl+D to stop and go back to the console...)
http://yourhostname:9000/

にアクセスすると、ウェルカムページが表示できるようになりました。いや~、疲れました。ここから先が問題なのですが、前途多難です(笑)。


参考
CentOSにJava SE Development Kit (JDK)をインストールするメモ
Java開発で泣かないためのPlay frameworkの基礎知識
Play 2.0 documentation