2012年12月25日火曜日

Play文字化け対策

WindowsのcmdでPlayをコンパイルなどしていじる際発生する"文字化け".
こいつを回避するには先に

set _JAVA_OPTIONS="-Dfile.encoding=SJIS"

と打っておいてやるといいらしい.







ぶっちゃけよくわからないけど('A`)

参考 

2012年12月18日火曜日

Play! ~チュートリアルをやってみた後編

前回からのさらに続き. いい加減終わりたい(;ω;`)

7. Taskフォームの作成

今回はTaskクラスなのでTaskフォーム. UserクラスならUserフォーム. まんまですね(・ω・`)
イメージは中身のクラスを運ぶコンテナ的な何か.
準備としてはTaskクラスの方に
import play.data.*
が必要とのこと. しかし例ではいきなり必要な部分だけimportしてるし('A`)
準備ができたら今度はコントローラの方に,
 Form<Task> taskForm = form(Task.class);
を宣言. これにより, ビューとコントローラの間でのデータのやり取りができるほか, 制約を簡単に加えることができる.
制約に関しては, 例えばTaskでは必須入力項目としてタスクのラベルに制約をかけたいなら, Taskクラスの方で
@Required
public String label;
としてやるだけで, やれデータが入っているかー, なんてif文とか書かなくて済むのである.

8. トップページ描画

Taskフォームを用いて実際にページを見てみる. Application.java のtasks()の戻り値を,
return ok(views.html.index.render(Task.all(), taskForm));
Task.all()はstaticな関数, Taskのリストを返す. これとFormを投げて準備完了.
これでここまできちんとコピペしてきていたら, 適当にブラウザを立ち上げ 「localhost:9000」で見られるはず. (ちゃんと play run していれば)
ただしこの時点ではTaskのCreate機能を積んでいないので, 次の項目で作る.

9. Createボタンの実装

もう訳とかどうでもよくnこの項目でタスクの新規作成処理を積み込む.
Application.javaのnewTask(), この内容を作成する.
public static Result newTask() {
  Form<Task> filledForm = taskForm.bindFromRequest();
  if(filledForm.hasErrors()) {
    return badRequest(views.html.index.render(Task.all(), filledForm));
  } else {
    Task.create(filledForm.get());
    return redirect(routes.Application.task());
  }
}
さらっと書かれていてコピペしてスルーしてしまいそうなところだが, 実はイロイロ大事な部分が含まれているという罠. チュートリアル汚い.

2行目 bindFromRequest() これはリクエストからFormを取り出すメソッド. これをしないといつまでもこのクラスの最初に作成した空のtaskFormを参照してしまい, なにも表示されないことに折れるまで首を傾げるハメになる. もちろんリクエストが無いときは取れません.

3行目 filledForm.hasErrors() 2行目で取得したものにエラーが無いかチェックするメソッド. エラーがあったらtrueが返り, 4行目のようにバッドリクエストを返すようにする大事な処理.

6行目 filledForm.get() これでFormの中に含まれるTaskを取り出す. Formのまま投げないように. この6行目でTaskクラスから新規タスクを作成する.


10. データベースによるTaskの保存

正直わかんないorz なんでいきなりH2DBが絡んでくるのよ…('A`) 前に使ってH2DBの準備してたからいいけど, これ準備無かったらどうなるんだろう…
超簡単に.
conf/application.conf, ここまでずっと横をスルーされてきたこいつをいじる. 中身はいろいろ必要なことが書かれているので下手にいじると爆死します. "#" がその行のコメントアウト. チュートリアルではaddと言っているが, 既に書かれた上でコメントアウトされているので, 混乱を避けるためにも#を外して対処しましょう. ちなみにその下にパスワード設定なんかもありますがいじって無いので省略.  このちょっと下に次の設定もコメントアウトされているのでこちらも対処.
その後Taskクラスをチュートリアルのように書き換えると, 見事タスクが増えるようになりました.
うん, よくわからんorz.

11. タスクの削除

これ逆に章分ける必要あるのか?
DBへの接続の設定は済んでいるので, 削除部分をApplication.javaへ書き込む.
以上.


デプロイはやっていないので今回は省略. なのでここで終了.
こっちを見るとより詳しく見ることができる.





最後グダグダだぁ…('A`)



2012年12月17日月曜日

Play! ~チュートリアルをやってみた中編②

はたしてここで終われるのか…終われなかった…orz
前回からの続き.


3. 開発ワークフロー

直訳でも気にしない. 要は app/controll/Application.java をいじるとこうなるよ! ってお話. 前回の1. でやっちゃった気がしなくも無い(・з・)
1. では他のViewを呼び出していたけど, Stringを直に放り込むことも可能. この場合Content-Typeは text/plain となりなんとも味気ないページがでてきます.
また, コードを変えたときにコンパイルとサーバ再起動を自動でやってくれるのはPlayの利点の一つ. 特にエラーが起きたときや構文エラーがあったときは, ブラウザ上にその箇所を表示してくれる親切設計. ただそのことを,
「As you can see, errors are beautifully displayed directly in your browser.(ご覧の通り, エラーはあなたのブラウザ上に直接美しく表示されます)」
美しくって…. しかもエラーによっては文字化けするし('A`)

4. アプリケーションの準備

直訳でも(ry. conf/routesを編集することで, アクションの振り分けができるよー, ってお話.
また最終行の,
POST    /tasks/:id/delete       controllers.Application.deleteTask(id: Long)
ここで, アクションに引数が持たせられる他,  URL部分に「:id」と入れると, 引数に使ったidをURLに埋め込むことができるよ!(・∀・)といったことも.
当然このconf/routesだけをいじってもアクションのほうを書かないとエラー吐かれるよ, ってことをわざわざ3. で出たブラウザ表示を用いて例示している. 当然ですね('A`)
なのでapp/controller/Application.javaにアクションを書いていきましょう. この時, まだ内容が決まっていないなら,
return TODO
としておくことで, とりあえずコンパイルは通るようになるよ, ということらしい.
ちなみにこのまま走らせると 「501 Not Implemented(未実装)」 が返ります. 便利.
最後はリダイレクトのお話. Viewを通さず, 別のアクションを呼びたいときは,
return redirect(routes.Application.tasks());
と書くことで, 直接conf/routesに飛び, アクションの振り分けから再開できるよ!(・∀・)ってこと.
このときのステータスはちゃんと 「303 See Other(他参照)」 でリダイレクトされる. これまた便利.

5. Taskモデルの準備

直(ry. ようやっとModelの登場. しかしデフォルトではディレクトリは作ってくれないので, まずは app/models ディレクトリを作る必要がある.
ディレクトリを作ったら中に Task.javaを作成. それだけ. ( ゚д゚ )
このあたりで今回では終わらないことを悟り 中編②とか妙なタイトルに変更. どうしてこうなったorz.


6. アプリケーションテンプレート

逆に訳すに訳せない('A`) Todoリストを表示するためのHTMLを作成する…のだが.
なんかやたらすっきりしてる. 2. でもちょっと書いたが, @~というのはPlay!フレームワークが関数のように扱ってくれて, 自動でHTML文を生成してくれる便利なツールとの事. ただし使うためには,
@import helper._
を宣言しておく必要がある.
中でも, @form は重要. この宣言だけで<form>タグを生成してくれる. マジ便利. もちろん例のように引数を放り込むことも可能.
また, 他にもテキストボックスなど<input>タグシリーズを生成する@input等もある. これもまた便利.
チュートリアルにある最後の数行,
@form(routes.Application.newTask()){
  @inputText(taskForm("label"))
<input type="submit" value="Create">
}

この宣言で,
<form action="/tasks" method="POST">
  <dl class=" " id="label_field">
    <dt><label for="label">label</label></dt>
    <dd><input type="text" id="label" name="label" value=""></dd>
  </dl><input type="submit" value="Create">
</form>
とこれくらい作ってくれる. idなんかを追加で指定してやることも可能.
ちなみに生成するHTMLをカスタムすることもできるらしい.
@inputは他にも@inputPasswordなんてのもあるが, ボタンに関してはまだ見つかっていない.
無いのかな…(・ω・`)






次だ…次で終わらせる…('A`)


2012年12月13日木曜日

Play! ~チュートリアルをやってみた中編

前回に引き続きPlay!チュートリアル.
ついにコードをいじり始める


Playちゅーとりある後編


0. 準備いろいろ

とりあえず前回の3. でサーバが run している状態から続き.
run していなければとりあえず run.
そしてもうひとつ必要なことが, MVCモデルの理解.
理解といっても詳細に説明できるほど, なんてことはなく, 
「まぁ役割に応じてそれぞれ管理するところを分けてんだへぇー('A`)」
くらいの認識があれば十分.(なはず(・ω・`)大丈夫かな)
詳しくはグーグル先生あたりに聞くといろいろ教えてくれるはず.
まぁMVCが
「M(モデル), V(ビュー), C(コントローラ)」
を表現してることだけ知ってれば自分はどうにかなってる('A`)たぶん

1. アクションとコントローラ

まずはアクションとそれをまとめるコントローラのお話らしい. もう少し構造について話してからでも遅くない気がするんだけどなぁ…(・д・`)
conf/routesファイルをテキストエディタあたりで開くとチュートリアルにあるような文が見られるはず.
GET /       controllers.Application.index()
いきなりなんじゃいorz特に右のお前.
これだけだとらちが明かないのでapp/controllers/Application.javaも隣に開いてみる.
すると中にはjavaコード. よく見てみるとなにやらメソッドが入ってる.
  public static Result index() {
    return ok(index.render("Your new application is ready."));
  }
このindex(), これがちょうど先ほどroutesファイルに入ってた右のあいつにあたる.
なのでApplication.javaではなく, Hoge.javaのindex()を呼びたいなら,
GET /       controllers.Hoge.index()
になるはず.
そして左はリクエストの情報. なのでチュートリアルのほうで和訳すると,
「GETメソッドで localhost:9000 でアクセスしてきた時, controller.Application.javaのindex()を呼び出すよ!(・∀・)」
という設定を書いてることになる.

そしてApplication.index(), こちらが返すResult型がresponseとして扱われる, との事.
return しているものも簡単に和訳すると,
「index に"Your new application is ready."というStringを与えて, ステータス200 OK で返すよヽ(・ω・)/」
って事らしい, ok の部分を badrequest などに変えるとステータスを変えてreturnできます, index.render()についてはもうちょっと後に出てきます.

簡単にまとめると,
 conf/routes -> リクエストに対するアクションの振り分けをします.
  app/controllers/ -> アクションを内包するコントローラクラスを入れます.
ってことらしい.
ちなみに今更だけど, ここではアクションとはindex()なんかのメソッドにあたります. たぶん(・з・)

2. ビュー

別にチュートリアルでは分かれて無いけど. だいぶ冗長なので.
こんどはapp/views/index.scala.htmlをテキストエディタで開いてみましょう. ファイル名気持ちわる('A`)
ちなみにこいつが1. ででてきた index.render() のindexにあたる.
なので main.render() にするとすぐしたの main.scala.html を指定することになる.
さてindex.scala.html の中身はというと…
@(message: String)

@main("Welcome to Play 2.0") {
    
    @play20.welcome(message)
    
}
これだけ.
これまた @ だらけで良くわからん.
少しずつ見ていくと, まず最初の
@(message: String)
いきなりわけがわからないが, なにやら変数の宣言にも見えなくは無いか.
しかしこれはどちらかというと引数の宣言に当たる.
すなわち, 1. のApplication.index() で与えられたString「"Your new application is ready."」はここで message に格納される.
ここで引き受けたら後は5行目のように, コード内で使えるようになる.
そして
@main("Welcome to Play 2.0") {
    
    @play20.welcome(message)
    
}
mainはちょうどmain.scala.htmlにあたる, 後ろの2つは引数. 
 @play20.welcome(message)
こいつは良くわからない('A`)が働きとしては message を引数にデフォルトのページのhtmlを返すメソッドとして働く.
ということは@main以下は,
「main.scala.htmlに, String型 と Html型 2つの引数を投げてここに貼るよ!(・з・)」といったところ.
なのでmain.scala.htmlも開いて確認してみる.
@(title: String)(content: Html)

<!DOCTYPE html>

<html>
    <head>
        <title>@title</title>
        <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">
        <link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")">
        <script src="@routes.Assets.at("javascripts/jquery-1.7.1.min.js")" type="text/javascript"></script>
    </head>
    <body>
        @content
    </body>
</html>

はい, 一番上にStringとhtmlを受け取る準備ができていました.

これが大体の流れ. チュートリアルの内容にだいぶいろいろ足したけど('A`)
おかげで終わらなかったorz

続きはまた次回にでも.







次で…終わらない気がするーヽ(;´Д`)ノ

2012年12月12日水曜日

Play! ~チュートリアルをやってみた前編

最近Unity, Playをいじり始めました.
おまけにいじり始めたBlenderに泣かされてます.
インタフェースが実に変態的です. でもすごい.


いろいろごちゃごちゃになってきたのでPlayから少しメモメモφ(・ω・ )


Playちゅーとりある


Playとは要するにWebアプリを簡単に作るためのフレームワークらしい. 実にわかっていない感想.
とりあえずここのチュートリアルをやってみる.


1. 下準備

とりあえずDownloadからPlayを貰ってくる. 現時点ではplay-2.0.4.zip. 地味に時間がかかる…(・ω・`)
もらえたら展開しつつ適当な場所に丸ごと移動. 自分はC:\の下にPlayディレクトリを作ってそこに.
さらに展開した中に入っているplay.bat. これを使うためにこのディレクトリにパスを通しておく.

ここまできたら下準備は完了.

2. アプリケーションの作成

C:\あたりでコマンドプロンプトを開いて, とりあえず

play help

とでも打ってパスが通っていることを確認. 確認できたらAndroidでいうプロジェクトを作成する.
コマンドは
play new アプリケーション名
名前はお好きに. これでコマンドプロンプトを開いた場所にディレクトリを作成する準備が整う. なので別の場所で作りたいならそこでコマンドプロンプトを開きましょう.

上記コマンドではアプリケーション作成の準備が整っただけ. コマンドプロンプトはこんな感じかと
AAには若干無理を感じる(・ω・`)
とりあえずアプリケーション名, そしてテンプレートにどの言語を用いるかを聞いてくる.
言語はscala or java



…scalaわからないからjavaで作る('A`)
これで最低限必要なものは一通りそろった!

3. デフォルトページを見る

とりあえずデフォルトはどんなものか見に行きましょう. できたディレクトリの中には結構イロイロ入ってます.
一通り眺めたら今度はブラウザで表示するやり方をデフォルトページで練習.
上で開きっぱなしのコマンドプロンプトで
cd 作ったディレクトリ名
で移動. 移動できたらとりあえず
play
と入力
するとまたAAのようなplayの文字が. 無事出現したら最後のコマンド
run
これでPlayがサーバの役割も果たしてくれる(らしい)

落ち着いたら今度は適当なブラウザを起動. アドレスに「localhost:9000」と打ってみると…

でました.+(・ω・0)*
このデフォルトページはそのままチュートリアルっぽい内容にもなってます.

4. サーバを切る

終わったからっていきなりコマンドプロンプトを消すのはちょっと危険. サーバを止めるときは
ctrl + d
これで止まったら今度はplayを終了する.
exit
これでPlayも終了できる.
なお, 3. においてplayと打ったところを
play run
と打つと直接サーバがrunします. サーバを止めるときも一緒にPlayも止まります.
消し忘れ防止にいいかも?






これでチュートリアル前半終了.
次からコードを見ていく…いつになるかわからないけどヽ(;´Д`)ノ






画像に変なもの写ってないよな…('A`)

AWS CDKで立てたEC2インスタンスのTimeZoneとかいじりたかった話

EC2を立てることはできたけど、立てたインスタンスは UTCのままだし設定ファイルとかいちいちscpしてくるのはダルい。 当初UserDataでなんとかしようとしたものの、「書く量がヤバいしメンテしにくい」と悩んでいたところ見かけたのが  AWS::CloudFormation:...