2012年8月31日金曜日

Java Play framework 2.0で、キャッシュの利用

Java Play framework 2.0で、キャッシュの利用です。item.key をキーとして、キャッシュに保存(Cache.set)、取得(Cache.get)となります。いろいろなデータ型で保存できるのですが、取得したデータの展開方法がわからず、結局、String型でデータをキャッシュして動くようになりました。正しい使い方なのかどうかは、甚だ疑問です。ちなみに、3600の部分は、キャッシュの有効時間す。また、キャッシュの削除 Cache.remove("item.key") も用意されていますが、Playのバグで、まだ利用できないようです。

import play.cache.Cache;

Object strCache = Cache.get("item.key");
if( strCache == null ) {
    String strCache = "" ;
    Cache.set("item.key", strCache, 3600);
} else {
    strCache = strCache.toString();
}

実際のサンプルが、こちら
左サイドのカレンダーをキャッシュから表示しています。

参考
play/play/cache/Cache.java
Java Play! 2 - Cache.remove(Stack Overflow)

2012年8月30日木曜日

Java Play framework 2.0、Cache APIの使い方がわからず

Java Play framework 2.0Cache APIの使い方がわからず、立ち往生です。ブログを書いている意味がありません。また無益な時間を過ごしてしまった。毎度のことですが、自分の実力の無さを痛感です。ガックリ。

2012年8月29日水曜日

Java Play framework 2.0で、ページリスト形式のデータ表示

Java Play framework 2.0で、ページリスト形式のデータ表示です。下の例で言うと、iloop にインデックスのキーが入るので、適当なところで追加タグなどを指定できます。今回は、3列表示にして折り返すのに、ul タグを追加しました。それにしても、scala のテンプレート記入には、毎回つまづきます。

/app/views/Items/list.scala.html
@(currentPage: Page[Item])

<ul class="thumbnails">
@for((item, iloop) <- currentPage.getList.iterator.zipWithIndex) {
    <li>
        <p><a href="@routes.Items.show(item.id)">@item.name</a></p>
        <p>¥ @item.price</p>
    </li>
    @if( iloop % 3 == 2 ) {
        </ul><ul class="thumbnails">
    }
}
</ul>

実際のサンプルページは、こちら

2012年8月28日火曜日

Java Play framework 2.0のebeanで、OR検索

Java Play framework 2.0ebeanで、OR検索です。例えば、商品名(name)と商品説明(detail)のどちらか一方で検索をヒットさせたい場合、ebean に用意されている ilikelike を重ねると、AND検索になってしまいます。そこで、エレガントではありませんが、SQL文を指定するかたちにすると、OR検索でデータを取得することができました。他にうまい方法があるのかもしれませんが、探しきれなかったので、とりあえずこれで行く事にします。

public static Page page(int page, int rows, String sortBy, String order, String filter) {
    return 
        find.where()
            .ilike("name", "%" + filter.trim() + "%")
            .ilike("detail", "%" + filter.trim() + "%")
            .orderBy(sortBy + " " + order)
            .findPagingList(rows)
            .getPage(page);
}
↓↓↓

public static Page page(int page, int rows, String sortBy, String order, String filter) {
    return 
        find.where("name like :keyword OR detail like :keyword")
            .setParameter("keyword", "%" + filter.trim() + "%")
            .orderBy(sortBy + " " + order)
            .findPagingList(rows)
            .getPage(page);
}

実際のサンプルページは、こちら

2012年8月27日月曜日

Java Play framework 2.0のヘルパー「@inputDate」にハマる

Java Play framework 2.0のヘルパー「@inputDate」にハマったので、対処法のメモです。@inputDate で入力指定をすると、HTML5で表示されるため、モデルの日付指定で微調整が必要です。日付は「yyyy-MM-dd」形式で引き渡ってくるらしいので、pattern を指定している場合は、それに合わせた指定にしなければなりませんでした。意味がわからず、しばらく考えこんでしまいました。

/app/views/Bulletins/editForm.scala.html
@inputDate(bulletin("published"), '_label -> "投稿日")
↓↓↓

<input type="date" name="published">

/app/models/Bulletin.java
@Constraints.Required
@Formats.DateTime(pattern="yyyy/MM/dd")
public Date published;
↓↓↓

@Constraints.Required
@Formats.DateTime(pattern="yyyy-MM-dd")
public Date published;

参考
HTML5でinput要素に追加された新しいタイプ13連発(@ITさん)

2012年8月26日日曜日

Java Play framework 2.0で、CSV出力

Java Play framework 2.0で、CSV出力です。まだ不十分で、出力がUTF8のCSVファイルになってしまいます。しかし、今回はここで、力尽きました。setHeaderの部分でSJISに変換すればいいのかな? とにかく、改善の余地、大ありです。

/app/models/Item.java
public static List<Item> csv() {
return 
    find.where()
        .orderBy("id DESC")
        .findList();
}
/app/controllers/Items.java
public static Result admin_download() {
    String filename = "download.csv" ;
    response().setHeader("Content-Disposition", "attachment; filename=" + filename);
    return ok(csv.render(Item.csv())).as("text/csv");
}
/app/views/Items/csv.scala.html
@(item: List[Item])id,name,price @import helper._
@for((item, i) <- item.iterator.zipWithIndex) { 
@item.id,@item.name,@item.price}

参考
Play Framework 2.0】CSVの作成とダウンロード(Java Solution会議室)

2012年8月25日土曜日

30GBの無料ストレージ「KDrive」に登録

30GBの無料ストレージ「KDrive」に登録してみました。さすがに、30GBは心に余裕がもてます。ウェブUIの使い勝手も、まずまず。回線スピードは、ストレスのないレベルといったところでしょうか。試しに700MBのisoファイルをアップしてみましたが、問題なく保存できています。1ファイルのサイズ上限はあるのでしょうか? とにかく、ありがたいサービスです。

2012年8月24日金曜日

Java Play framework 2.0と1.xの簡易比較ページ

Java Play framework 2.0と1.xの簡易比較ページの紹介です。いろいろ参考になったので、メモとして記録です。これだけ見てもわかりますが、1.xと2.0系とでは全くの別物です。時代の急激な変化を思わずにはいられないのですが、使いこなすには、覚悟と割り切りが必要でしょう。過去の資産を顧みない姿勢といい、情報量の少なさといい、人を寄せ付けない要素が満載となっています。しかし、それがまた良いじゃないかと思うようになって来ました(笑)。

2012年8月23日木曜日

Java Play framework 2.0、ビューテンプレート内でのCookie取得

Java Play framework 2.0、ビューテンプレート内でのCookie取得です。長い間、懸案事項だった謎が、ようやく解けました。コントローラー側では、すんなりCookieデータを読み込めていたのですが、ビューでの取得方法がわからず、喉に刺さった魚の骨のごとく、モヤモヤした状態が続いていました。こうして取得方法がわかると、今まで、とんでもない回り道をしていたものだなと思います。とにかく、よかった。

<p>@request.cookies.get("email").value</p>
<p>@request.cookies.get("name").value</p>
参考
Difference between creating a session and a cookie?(Stack Overflow)

2012年8月22日水曜日

Java Play framework 2.0で、「ValidationException: Call to TraversableResolver.isReachable()」のエラー

Java Play framework 2.0で、「ValidationException: Call to TraversableResolver.isReachable()」のエラーが表示された場合の対処法です。何が悪いんだろうかと、ソースを幾重も見直しするも、解決の糸口が見つからず。散々、試行錯誤を繰り返し、最終的に、play clean コマンドで問題が解決しました。原因は不明。Playは、理不尽なことが多い(笑)。

play clean
良い機会なので、play コマンドについて、調べてみました。
$ play 
Enter the play console

$ help command* 
Displays this help message or prints detailed help on requested commands.

$ classpath 
Display the project classpath.

$ clean 
Clean all generated files.

$ compile
Compile the current application.

$ console
Launch the interactive Scala console (use :quit to exit).

$ dependencies
Display the dependencies summary.

$ dist
Construct standalone application package.

$ exit
Exit the console.

$ h2-browser
Launch the H2 Web browser.

$ license
Display licensing informations.

$ package
Package your application as a JAR.

$ play-version
Display the Play version.

$ publish
Publish your application in a remote repository.

$ publish-local  
Publish your application in the local repository.

$ reload
Reload the current application build file.

$ run <port>
Run the current application in DEV mode.

$ test
Run Junit tests and/or Specs from the command line

$ eclipsify 
generate eclipse project file

$ idea
generate Intellij IDEA project file

$ sh <command to run>  
execute a shell command

$ start <port>
Start the current application in another JVM in PROD mode.

$ update
Update application dependencies.

$ about
Displays basic information about sbt and the build.

$ reboot [full] 
Reboots sbt and then executes the remaining commands.

$ < file* 
Reads command lines from the provided files.

$ !! 
Execute the last command again

$ !: 
Show all previous commands

$ !:n
Show the last n commands

$ !n 
Execute the command with index n, as shown by the !: command

$ !-n
Execute the nth command before this one

$ !string 
Execute the most recent command starting with 'string'

$ !?string
Execute the most recent command containing 'string'

$ ~ <command> 
Executes the specified command whenever source files change.

$ exit 
Terminates the build.

$ reload
Loads the project in the current directory

$ projects
Displays the names of available projects.

$ project [project] 
Displays the current project or changes to the provided `project`.

$ - command 
Registers 'command' to run if a command fails.

$ iflast command
If there are no more commands after this one, 'command' is run.

$ ( ; command )+
Runs the provided semicolon-separated commands.

$ shell
Provides an interactive prompt from which commands can be run.

$ set <setting-expression>
Evaluates the given Setting and applies to the current project.

$ tasks
Displays the tasks defined for the current project.

$ inspect <key> 
Prints the value for 'key', the defining scope, delegates, related definitions, and dependencies.

$ eval <expression> 
Evaluates the given Scala expression and prints the result and type.

$ alias
Adds, removes, or prints command aliases.

$ append command
Appends `command` to list of commands to run.

$ last <key>
Prints the last output associated with 'key'.

$ last-grep <pattern> <key> 
Shows lines from the last output for 'key' that match 'pattern'.

$ session ... 
Manipulates session settings.For details, run 'help session'..

$ show <key>
Displays the result of evaluating the setting or task associated with 'key'.
参考
[ValidationException: Call to TraversableResolver.isReachable() threw an exception](OSDir.com)

2012年8月21日火曜日

Java Play framework 2.0で、SimpleEmail を利用してのメール送信

Java Play framework 2.0で、SimpleEmail を利用してのメール送信です。今まで、調子に乗って、typesafe mailer plugin を利用して送信していましたが、文字化けに悩まされ、完全に行き詰っていました。今回、org.apache.commons.mail の SimpleEmail に切り替えて、あっさり解決です。今までの苦労は何だったのでしょうか。

import org.apache.commons.mail.*; 

SimpleEmail email = new SimpleEmail();  
try{
    email.setHostName("mail.myserver.com");
    email.setAuthentication("userid", "password");
    email.setDebug(true);
    email.setSmtpPort(587);
    email.setCharset("ISO-2022-JP");
    email.addHeader("X-Mailer","SimpleEmail");
    email.addTo("receiver@sampleemail.com", "receiver", "ISO-2022-JP");
    email.setFrom("sender@sampleemail.com", "sender", "ISO-2022-JP");
    email.setSubject("メールの件名");
    email.setMsg("メールの本文");
    email.send();
}catch (EmailException e) {

}

参考
Apache Commons EmailによるEメール送信(Java入門さん)
Commons Email Examples(Apache Commons)

2012年8月20日月曜日

herokuでの環境変数の変更

herokuでの環境変数の変更です。目的があって、設定を変えてみたのですが、思った成果が得られず、ガックリ。何の進展もなし。結果、環境変数を変えただけという、しょぼいブログとなりました。自分の実力の無さを、改めて痛感した次第です。

# 設定確認
heroku config

# 設定追加
heroku config:add LANG=ja_JP.UTF-8
heroku config:add LC_ALL=ja_JP.UTF-8

# 設定削除
heroku config:remove LANG
heroku config:remove LC_ALL

参考
Herokuでステージング環境を作る(アインシュタインの電話番号さん)

2012年8月19日日曜日

YouTubeの音楽ビデオをジャンル別に集めた「Ivy FM」

YouTubeの音楽ビデオをジャンル別に集めた「Ivy FM」、次々と演奏が続いていくので、バクグラウンドミュージックとして楽しめます。高品質な音楽が集められていて、しかもジャンル別とは言え、そのランダム具合が実にいい具合で、新たな音楽発見の連続となります。音の高さも一定で、全く違和感がなく、連続再生していても、いちいち調整する必要がありません。非常によく出来ています。

2012年8月18日土曜日

Java Play framework 2.0で、ビューのHiddenタグ

Java Play framework 2.0で、ビューのHiddenタグです。これがまた、エレガント(難解)。最初は何をやっているのか理解できませんでしたが、時間をかけて眺めているうちに、朧気ながら、わかってきました。このscalaの書き方、慣れるまでには時間がかかりそうです。今まで、確認画面を表示せずに処理することが多く、Hiddenタグを利用する機会がなかったのも、これまた驚きです。

/app/controllers/Invoices.java
Form invoiceForm = form(Invoice.class).bindFromRequest();
if(invoiceForm.hasErrors()) {
    return badRequest(createForm.render(invoiceForm));
}

return ok(confirmForm.render(invoiceForm));
/app/views/Invoices/confirmForm.scala.html
@definingの部分で、Hiddenタグを作り出しています。
@(invoiceForm: Form[Invoice])

@defining(invoiceForm("name")) { nameField =>
    <div class="control-group">
        <label for="name">氏名</label>
        <div class="controls">
            @nameField.value
            <input type="hidden" name="@nameField.name" id="@nameField.id" value="@nameField.value">
        </div>
    </div>
}

参考
Play 2.0 generate hidden field without div wrapper(Stack Overflow)

2012年8月17日金曜日

Unicode から UTF-8 への変換(JAVA)

Unicode から UTF-8 への変換という記事を見つけ、これはメモしておかねばなるまいということで、備忘録です。まだまだ知らないことが多いです。精進せねば。それにしても、ややこしいですね。気をつけて見ていないと、間違えそうです。

try {
    String string = "abc";

    // Unicode → UTF-8
    byte[] utf8 = string.getBytes("UTF-8");

    // UTF-8 → Unicode
    string = new String(utf8, "UTF-8");

} catch (UnsupportedEncodingException e) {

}

参考
Unicode ~UTF-8、UTF-16との違い~
Converting Between Unicode and UTF-8

2012年8月16日木曜日

JavaのBASE64エンコードで、sun.misc.BASE64Encoder から org.apache.commons.codec.binary.Base64 に乗り換え

JavaのBASE64エンコードで、sun.misc.BASE64Encoder から org.apache.commons.codec.binary.Base64 に乗り換えました。Java Play framework 2.0で、何の前触れもなく、突然「警告:sun.misc.BASE64Encoder は Sun が所有する API であり、今後のリリースで削除される可能性があります。」と表示されるようになり、身動きが取れなくなってしまいました。前々から、同様の警告が出ていたのはわかっていたのですが、問題なく利用できていたので、そのままにしていたのですが、そのツケが回ってきました。仕方なく対処です。とりあえず動いてくれています。

文字列から文字列への変換です。バイナリへの変換は、参考サイトをどうぞ。
import org.apache.commons.codec.binary.Base64;

public static String base64encode(String raw) {
    try {
        return new String(Base64.encodeBase64(raw.getBytes()), "ASCII");
    } catch (UnsupportedEncodingException e) {
        return null;
    }
}

public static String base64decode(String base64) {
    try {
        return new String(Base64.decodeBase64(base64.getBytes("ASCII")));
    } catch (UnsupportedEncodingException e) {
        return null;
    }
}
参考
Base64Encoder.java

2012年8月15日水曜日

herokuでのデバック「heroku logs」の活用

herokuでのデバック「heroku logs」の活用についてです。不十分な状態でデプロイしたことが原因で、痛い目にあっていたのですが、何とか救われました。Java Play framework 2.0では、下記のようなフォーマットでエラーが出力されますので、その近辺を探ってみるのが手がかりになります。

! @6bc2834bl - Internal server error, for request [GET /] ->
! @6bc2834bm - Internal server error, for request [GET /] ->
! @6bc2834bn - Internal server error, for request [GET /] ->
! @6bc2834bo - Internal server error, for request [GET /] ->
! @6bc2834bp - Internal server error, for request [GET /] ->
grepで、エラー番号だけ抜き出すと、わかりやすいです。
heroku logs -n 200
heroku logs | grep -i "\@[a-z0-9]\{9\}"

参考
Logging(heroku)

2012年8月14日火曜日

Java Play framework 2.0で、ebeanを利用した直接SQL

Java Play framework 2.0で、ebeanを利用した直接SQLです。集約関数SUMCOUNTを利用したかったわけですが、直接SQL文を投げるのが最良の策(?)と判断しました。GROUP BYも試してみましたが、同じ方法で問題なく結果を取得できました。Listで結果が返ってきますので、後はそれを処理すれば、いろいろな使い方ができると思います。

/app/controllers/Carts.java
import com.avaje.ebean.*;

public class Carts extends Controller {
    String sql = " SELECT COUNT(name) as cnt, SUM(subtotal) as total FROM cart WHERE member_id = :mid "; 

    List<SqlRow> sqlRows = Ebean.createSqlQuery(sql)
        .setParameter("mid", member_id)
        .findList();

    return ok(list.render(sqlRows));
}
/app/views/Carts/list.scala.html
@(result: List[SqlRow])

result.get(0).getInteger("total")
result.get(0).getInteger("cnt")

2012年8月13日月曜日

Java Play framework 2.0で、テンプレートビュー側での変数割り当て

Java Play framework 2.0で、テンプレートビュー側での変数割り当てです。本来は、コントローラーで全て準備しておくべきなのでしょうが、View内で処理したい場合に有効です。「defining」を利用して、変数を割り当てています。それにしても、Scalaの難解さ(エレガントさ)には、頭が割れそうです。「foldRight」って、どう動いてるのか、よくわからない。

Listのデータ(items)を集計しています。
@(items: List[Item])

@defining(items.foldRight(0)((item, sum) => item.price + sum)) { sum =>
    合計 @sum
}

参考
Calculation in Play 2.0 Framework template engine(Stack Overflow)
Scalaを使ってみる: (4) Mapのメソッド(屯遁のパズルとプログラミングの日記さん)

2012年8月12日日曜日

セカイカメラの「tab」に登録してみました。

セカイカメラの「tab」に登録してみました。お気に入りや興味のあるものを探し(Browse!)、それらが見つかったら忘れないように保存し(Tab!)、実際にそれらがある場所へ行く(Act!)。これがこの「tab」の基本的な楽しみ方3ステップとあります。Pinterestに位置情報が加わったサービスといった感じでしょうか? iPadやスマホでこそ威力が発揮されるサービスだと思います。特に、若い女性などには、受けるんでしょう。UIや画面構成などは、まさに最近、流行のそれで、とにかく、いろいろ勉強になります。


2012年8月11日土曜日

Java Play framework 2.0で、フォームの初期ディフォルト値

Java Play framework 2.0で、フォームの初期ディフォルト値の設定です。もちろん、エンティティモデルに関連づかないフォームです。エンティティモデルの場合は、何も考える必要がないので楽です。

さて、ドキュメントを参考に設定してみましたが、うまくいかないので、あれこれ試行錯誤し、なんとか動くようになったので備忘録です。直接「userForm.fill()」の部分でインスタンスを指定するのではなく、前もって用意しておくと、うまくいきました。どうしてなんでしょう? 意味はわかりません。初心者ぶりが露呈していますね。それにしても、この設定、回りくどすぎます(笑)。

ちなみに、bind() も試しましたが、こちらはサンプル通りで見事に動いてくれました。

Form<User> userForm = form(User.class);
userForm = userForm.fill(new User("bob@gmail.com", "secret"))


Form<User> userForm = form(User.class);
User user = new User() ;
user.email = "bob@gmail.com" ;
user.password = "secret" ;
userForm = userForm.fill(user)

実際のサンプルがこちら
商品数を指定する部分です。

参考
JavaForms, Filling a form with initial default values(Play2 Wiki)

2012年8月10日金曜日

Java Play framework 2.0で、GETとPOSTデータの受信

Java Play framework 2.0で、GETとPOSTデータの受信です。何を今頃という感じですが、まだまだ基本がわかっていないなと痛感しています。DynamicForm を利用してデータを受け取ると、GETでもPOSTでも変数を受け取る事ができます。

DynamicForm form = form().bindFromRequest(); 
String parameter_name = form.get("parameter_name");

実際のサンプルがこちら

参考
How do I access POST variables in my controller?(Stack Overflow)

2012年8月9日木曜日

Herokuでデプロイすると、SSL証明書が既に有効になっている

Herokuでデプロイすると、SSL証明書が既に有効になっています。これだけお世話になっていて、今、気づきました(笑)。すごいサービスですね。DigiCertのSSL証明書が設定されていて、HTTPS通信することができます。感激です。改めて、その人気の理由を実感してしまいました。まさに時代はクラウドです。

http://talkativepg.herokuapp.com/
https://talkativepg.herokuapp.com/

と、喜んだのも束の間、新たな問題発生です。画像を置かせていただいている FileDen.com がSSLに対応していない。ショック。我が「無料プロジェクト」に、見事な亀裂が生じてしまいました。とにかく、前に進むしかありません。

参考
Announcing Better SSL For Your App(Heroku)
heroku で ssl を使用する(kaz_shuの日記さん)

2012年8月8日水曜日

Java Play framework 2.0のアクセス元判別 request().remoteAddress()

Java Play framework 2.0request().remoteAddress() でユーザーのアクセス元を取得したかったわけですが、期待した結果が得られず、さんざん悩んでいました。意味不明で、ルーターのIP(?) らしきものを返して来てしまいます。長く苦しい、無益な時間が流れ、ようやく解決です。Httpのリクエストヘッダ「x-forwarded-for」を取得することで、アクセス元IPを取得することができました。疲れた。

/app/controllers/Application.java
import play.mvc.Http.Request;

public static Result ip() {

    Request req = play.mvc.Http.Context.current().request();
    String remote_address = req.getHeader("x-forwarded-for") ;

    String remoteaddress = request().remoteAddress() ;

    String user_agent = request().getHeader("User-Agent");

    return ok(ip.render(remote_address, remoteaddress, user_agent));
}

実際のサンプルがこちら

参考
X-Forwarded-For(Wikipedia)
play2-xforward

2012年8月7日火曜日

Java Play framework 2.0で、RSS配信

Java Play framework 2.0で、RSS配信です。コントローラーで、必要な情報を取得し、フォーマットに「application/xml」を指定してレンダリングしています。ビューでは、RSS2.0のフォーマットを参考に、データを当てはめているだけです。複数のRSSリーダーで購読を試してみましたが、問題無さそうなので、使えそうです。

/app/controllers/Application.java
public static Result rss() {
    (省略)
    return ok(rss.render(Bulletin.rss(), updateTime)).as("application/xml");
}
/app/views/rss.scala.html
最初の1行目を詰めて書いているのがミソです。
日付の部分は、書き方がわからないので、カッコ悪いですが(笑)。
@(currentPage: Page[Bulletin], updateTime: String)<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:admin="http://webns.net/mvcb/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

    <channel>
        <title>Java Play2 CMS</title>
        <link>http://talkativepg.herokuapp.com/</link>
        <description>実験中です</description>
        <dc:language>ja</dc:language>
        <dc:creator>talkativepg</dc:creator>
        <dc:date>@updateTime</dc:date>
    
@if(currentPage.getTotalRowCount > 0) {
    @for(bulletin <- currentPage.getList) {
        <item>
        <title>@bulletin.title</title>
        <link>@routes.Bulletins.show(bulletin.id)</link>
        <description>@bulletin.detail</description>
        <dc:subject>@bulletin.category</dc:subject>
        <dc:creator>@bulletin.nickname</dc:creator> 
        <dc:date>@bulletin.published.format("yyyy/MM/dd")T@bulletin.published.format("HH:mm:ss")+09:00</dc:date>
        </item>
    }
}
    </channel>
</rss>

実際のサンプルがこちら

参考
RSSのフォーマット・仕様・構造 - RSS1.0、RSS2.0、Content-Type(MEMORVAさん

2012年8月6日月曜日

Java Play framework 2.0で、PDF出力

Java Play framework 2.0で、PDF出力です。「Play 2.0 PDF module」というモジュールを組み込むと、簡単にPDFのページを作成することができます。Build.scala ファイルに設定を追加して、再起動します。コントローラーは、return ok の 部分を return PDF.ok に変更するだけです。後は、ビューで適当にデザインして、出来上がりです。当然かも知れませんが、日本語は使えませんでした。日本語フォントを指定できれば、利用できそうな気もします。画像も挿入できず。ビジネス利用には、ちょっと、制限がありますかね(笑)。

/project/Build.scala
val appDependencies = Seq(
    // Add your project dependencies here,
    "mysql" % "mysql-connector-java" % "5.1.21",
    "com.typesafe" %% "play-plugins-mailer" % "2.0.4",
    "pdf" % "pdf_2.9.1" % "0.3",
)

val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
    // Add your own project settings here      
    resolvers += Resolver.url("Violas Play Modules", url("http://www.joergviola.de/releases/"))(Resolver.ivyStylePatterns)
)
/app/controllers/Application.java
public static Result document() {
    String message = "hello" ;
    return PDF.ok(document.render(message));
}
/app/views/document.scala.html
@(message: String)

<!DOCTYPE html>
<html>
<head>
    <title>PDF</title>
    <style type="text/css">
    <!--
        CSSの定義(省略)
    -->
    </style> 
</head>
<body>
    @message 
</body>
</html>

実際のサンプルはこちら

参考
Play 2.0 PDF module

2012年8月5日日曜日

Chromeブラウザの可能性を感じる「Chrome Experiments」

Chromeブラウザの可能性を感じる「Chrome Experiments」、HTML5、CSS3、WebGLなど、次世代の規格が「てんこ盛り」です。面白いサンプルが数多く紹介されていて、飽きません。私のお気に入りは、こちら。普段、ゲームなど、全く興味が無いのですが、ハマッテしまいました。いくら時間があっても足りません(笑)。

FastKat 2

2012年8月4日土曜日

Java Play framework 2.0.3がリリース、即座にバージョンアップ

Java Play framework 2.0.3がリリース、そして、即座にバージョンアップです。plugins.sbt ファイルを編集し、再起動すればOKのようです。これは楽ですね。今までのプログラムも、問題なく動いているようです。

/project/plugins.sbt
addSbtPlugin("play" % "sbt-plugin" % "2.0.2")
↓
addSbtPlugin("play" % "sbt-plugin" % "2.0.3")

ダウンロードはこちら

参考
Meet the Play framework community

2012年8月3日金曜日

Java Play framework 2.0で、Ebeanのレコード「Set」取得

Java Play framework 2.0で、Ebeanのレコード「Set」取得です。ここで言う Set は、List や Page などのデータベースから取得したデータの塊のことです。うまく伝わっていないと思いますが、私自身、よくわかっていませんので、なんとか汲み取って下さい(笑)。List や Page のサンプルはよく見かけましたが、Set はなかったように思いますので、取り上げてみました。

/app/models/Bulletin.java
public static Set topNews(int count) {
    return 
        find.where()
            .orderBy("published DESC")
            .setMaxRows(count)
            .findSet();
}
/app/controllers/Application.java
return ok(index.render( Bulletin.topNews(2) ));
/app/views/index.scala.html
@(bulletinSet: Set[Bulletin])

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

@menu("ニュース") {

    @for(bulletin <- bulletinSet) {

        @bulletin.title
        @bulletin.published.format("yyyy/MM/dd")

    }

}

実際のサンプルがこちら

2012年8月2日木曜日

Java Play framework 2.0で、テンプレートへのJavaScript埋め込み

Java Play framework 2.0で、テンプレートへのJavaScript埋め込みです。それぞれのページに固有のJavaScriptは、どうやったら効率良く埋め込んで利用できるようになるのだろうかと、ずっと考えていたのですが、きちんとその方法が用意されていました。ドキュメントは、真面目に読まなければダメですね。「scripts: Html = Html("")」を設定するのがミソです。

/app/views/main.scala.html
@(title: String, scripts: Html = Html(""))(content: Html)

<!DOCTYPE html>
<html>
     <head>
          <title>@title</title>
          <script src="@routes.Assets.at("javascripts/jquery-1.7.1.min.js")" type="text/javascript"></script>
          @scripts
     </head>
     <body>
          <div class="container">
                @content
          </div>
     </body>
</html>
/app/views/Bulletins/show.scala.html
@scripts = {
     <script type="text/javascript">alert("sample message");</script>
}

@main("Title",scripts){

    コンテンツ部分です。

}

実際のサンプルがこちら
地図を埋め込んでみました。

参考
Common template use cases

2012年8月1日水曜日

Java Play framework 2.0で、カレンダー表示

Java Play framework 2.0で、カレンダー表示機能です。もろ、Java Driveさんの書いている「日時を取得して表示する」のコピーです(笑)。わからない人間にとっては、本当に有難い限り。感謝の気持を持って、利用させてもらいました。そういったわけで、ソースを一部でも紹介できればと思ったのですが、あまりにも芸がないので、組み込んだぞという日記になりました。



実際のサンプルはこちら
良い感じで動いてくれているのではないでしょうか。

参考
日時を取得して表示する(Java Driveさん)
[Heroku]タイムゾーンを設定する(func09さん)