2014年2月23日日曜日

String.splitで標準入力された文字列から改行コードによってStringの配列に分けるコードについて

今回はJavaについてのお話。

今回やりたかったこと
条件:入力を「◯◯\r\n△△\r\n□□」とする。
結果:以下のように表示される。
◯◯
△△
□□
考え:「\r\n」を認識して、String配列に変換できれば良いかな…?

ということで、こんなコードを作ってみます。
Wrong.java
class Wrong {
    public static void main(String[] args) {
        String[] sentence = args[0].split("\r\n")
        for(int i=0;i<sentence.length;i=++){
            System.out.println(i + 1 + "行目は " + sentence[i] + " です");
        }
    }
}
そして、これに、
java Wrong 最初の行\r\n次の行\r\n最後の行

と入力すると、

1行目は 最初の行\r\n次の行\r\n最後の行 です。

と表示されてしまい、残念ながら、文字列の分割が行われず…。
ということで「きっと『\』をエスケープしてないことが原因なんだ!」と思い、リトライ。
Wrong.java
class Test {
    public static void main(String[] args) {
        String[] sentence = args[0].split("\\r\\n")
        for(int i=0;i<sentence.length;i=++){
            System.out.println(i + 1 + "行目は " + sentence[i] + " です");
        }
    }
}

こうすることで、きちんとエスケープされて「\r\n」と認識してくれるはず…!
と思ったけど、またしても
1行目は 最初の行\r\n次の行\r\n最後の行 です。

と表示されてしまい、失敗。

デバッグで一つ一つ見ていくと、標準入力された「\r\n」はエスケープされ
「\\r\\n」としてargs[0]に入力されるらしい。
その「\\」をそれぞれエスケープしないといけないので…
Correct.java
class Correct {
    public static void main(String[] args) {
        String[] sentence = args[0].split("\\\\r\\\\n")
        for(int i=0;i<sentence.length;i=++){
            System.out.println(i + 1 + "行目は " + sentence[i] + " です");
        }
    }
}

とすることで、きちんと、
1行目は 最初の行 です。
2行目は 次の行 です。
3行目は 最後の行 です。

となってくれました。

2014年2月11日火曜日

PlayFrameworkでサニタイズから逃れる方法

先日に引き続き、PlayFrameworkの話です。

PlayFrameworkを使っていて、便利だが困ることが一つ。
それは、自動的にサニタイズされてしまうという点。

例えば、

controllers/Application.java
package controllers;

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

import views.html.*;

public class Application extends Controller {

    public static Result index() {
        return ok(main.render("'hoge'"));
    }

}


view/main.scala.html
@(autoEscape: String)

<!DOCTYPE html>

<html>
    <head>
        <title>テスト</title>
    </head>
    <body>
        @autoEscape
    </body>
</html>

というコードがあったとすると、実際にmain.scala.htmlに入るautoEscapeには、
「'hoge'」ではなく、「&#39;hoge&#39;」が入ってしまいます。

もちろん、<html>タグの中なら勝手に判断してくれるので、別に問題はないのですが、
例えばview/main.scala.htmlの中に<script>タグを置き、その中に@autoEscapeを
持ってきて処理したい場合は、ちょっと困る。
なぜなら、<script>タグの中では上手い具合に判断してくれないから。

このような事態の回避方法を調べても、ほとんどのサイトで出てくるのは、
「.raw()を使え」という言葉ばかり。

特に、引数で持ってきた値をエスケープさせないで使う方法が書いてない!!!


ということで、辿り着いたページがココ↓
Stack Overflow - How to pass raw html to Play framework view?

そして試してみたのが以下の書き方。
@(notEscape: String)

<!DOCTYPE html>

<html>
    <head>
        <title>テスト</title>
    </head>
    <body>
        @Html(notEscape)
    </body>
</html>

このように、 @html(引数名) と書くことで、「'hoge'」という記載で通ってくれるよ!
やったね!

と思ったら、ちゃんと以前紹介したサイトにも書いてありましたorz
ちゃんと読もう、自分。
@IT - Java開発者がScalaでPlay frameworkのビューを作るには (2/3)


2014年2月9日日曜日

まっさらな状態からMySQLを使いつつPlayFrameworkで動かせる状態まで色々なものをダウンロードした話

タイトルの通り。

今回ダウンロードしたものは以下の通り。
・JDK
・Eclipse
・MySQL
・PlayFramework

作業時間は1日。
ただし、ソチオリンピックを見ながら。


やり方を教えるというよりも、「ここのページを参考にするといいよ~」
というリンクの紹介と、「リンク先と作業が違ったよ~」というメモ書きだけ。