スクエニを装ったメールがきた話

autoinfo_jp@account.square-enix.comってところから「あなたのスクウェア·エニックスアカウントの異常‏」っていう件名で、もうお前絶対フィッシングサイトだろ感満載のメールがきました。
HTMLメールなので一見正規のリンクに見えるんですけど、実際のところは「support.square-enix.pw」っていう罠サイトに誘導される感じ。


こわいわー。ちょうこわいわー。
何が怖いって結構な量の人が普通に引っかかりそうで怖い。
こういうの踏まないようにする術は義務教育で教えるべきだと思う。
やってたりするのかな。どうなのかな。

thymeleafのサンプルアプリを作ってみた


オヒサシブリデス!


わけあってまたthymeleafについて調べたりしてサンプルアプリを作ってgithubに公開してみました。
tm8r/thymeleaf_sample · GitHub
サンプルアプリって言っても基本的な使い方といくつか用例を書いてるだけなんですけど。


説明不足も甚だしいので時間があるとき気が向いたらもうちょっとちゃんと書きます…。
過去に書いた内容に加えて、独自dialectとかも書いてます。
thymeleafことはじめ - するめとめがね
thymeleafの基本的な記法を覚える その1 - するめとめがね
thymeleafの基本的な記法を覚える その2 - するめとめがね
thymeleafの基本的な記法を覚える その3 - するめとめがね


そういえばgithubのコミットも初でした。怖いわーgithub怖いわー。
SourceTree落としたけど全く分からなくて結局公式のクライアント使ったわー。

FreeMarkerで配列に要素を追加する

こんにちはこんばんは!ftl、書いてますか!


配列に要素追加したいんだけどできんの?ftlごときにそんなことできんの?どうなの?ねえどうなの?みたいな質問されたので。


めっちゃシンプルですけどこんな感じでできます。

<#assign array = ["1","2","3"]>
${array?size}<br>
<#assign array = array + ["4"]>
${array?size}


出力結果は以下のようになります。

3
4


hashならこんな。

<#assign hash = {"Kitashirakawa":"Tamako", "Makino":"Kanna", "Tokiwa":"Midori"}>
${hash?size},${hash.Kitashirakawa}<br>
<#assign hash = hash + {"Kitashirakawa":"Anko", "Asagiri":"Shiori"}>
${hash?size},${hash.Kitashirakawa}
3,Tamako
4,Anko


「+」の前後を変えれば先頭に追加、末尾に追加の制御は出来ます。
X番目に追加みたいな話になるとちょっとめんどくさそうです…。


したらな!

JMeterでリクエストパラメータを使いまわす

こんにちはこんばんは!JMeterシナリオ、書いてますか!
僕は書いてません!


例のごとく質問されて調べたりしたので覚書です。


以前こんなのを書いたんですけど、
JMeterでCSVファイルのランダムな行を抽出する! - するめとめがね
「ランダムに取るのはこれで出来るようになったけど、取った値を連続で次のリクエストに使うにはどうすればいいんだよコラ、教えろよコラ、お前のブログ情報足りねーんだよクソが」みたいな質問を受けました。
具体的にはデータ登録のリクエストを投げたのち、その更新が果たして成功してるか確認するリクエストを同じパラメータを用いて行うみたいなシナリオです。


確かに普通にやるとサンプラーごとに取れる値が変わっちゃうので上手くいきません。
またBeanShellみたいなめんどくさいことをせずに直後のリクエストまで参照可能な変数作れないかなーとか考えたんですけど、どうにも思いつかないので正規表現を使います。


まず、CSVファイルからランダムで値を取得して変数にセットする処理は上に書いた記事と同じ形にします。
すると、userIdとentryIdの組み合わせをランダムで取得することができます。
次にまず登録のリクエストを投げるサンプラーを作ります。
普通にサンプラー>HTTPリクエストを選択し、パスを以下のような感じにします。
※URLとかパラメータの型とかはご自分の環境に置き換えてください。

add?user_id=${userId}&entry_id=${entryId}


次に生成したサンプラーを右クリック、追加>後処理>正規表現抽出を選択し、以下のように設定します。

Response Field to Check : URL
参照名 : req_param
正規表現 : .*(user_id=([a-z0-9-]+)&&entry_id=([0-9]+))
テンプレート : $1$
一致番号 : 0


Response Field to Check項目はデフォルトだとBodyになっていて、この場合レスポンスの中身を参照しますが、URLにするとリクエストのURLが対象になります。
なのでURLを指定し、その中から必要な部分だけ抽出してやればいいわけです。
今回はまとめて取りましたけど、パラメータの名前が変わったりする場合は必要な部分だけ抜き出せばよいです。


で、仕上げに先ほどのサンプラーの下にサンプラーを追加し、パスを以下のような感じにします。

get?${req_param}


かんたんですね。
リダイレクトとかがあるとうまくいかないかもしれないので、その場合は2つ目のサンプラーを実行する前にロジックコントローラを噛ませてreq_paramの存在確認とかをしてやればよいかなと。


なんかもっとスマートな方法があるといいんですが、思いつかず。
とりあえずやりたいことは実現できたのでよいかなという感じで。

Ecllipse4.2SR1からSR2に乗り換える

15 個のパフォーマンス問題が改善! Eclipse 4.2 Juno SR2 リリース - C/pHeR Memo - Java とか。Eclipse とか。
とのことなので早速乗り換えます!


しかしEclipse公式にいってもSR2が見つからない…。
のでURLちょっと書き換えたらあった。
Eclipse downloads - mirror selection


とりあえずDLしたのを展開、既存のEclipseと異なる名前で配置します。
次に新しいEclipseを起動し、メニューバーのFile>Importを選択。
表示されたウィンドウでInstall>From Existing Installationを選択。
すると既存のEclipseでインストールしてたプラグインの一覧が表示されるので、必要に応じてインストールしていきます。


完了!らくちん!
ちなみに前に書いたEclipseJunoに乗り換える - するめとめがねのものを新しい方に移行しました。


jstyleだけ以下から新しいものをDLして入れました。
ダウンロード: JStyle - MergeDoc - SourceForge.JP

FreeMarker(ftl)のデフォルト値演算子と条件分岐の補足

こんにちは!Free(略)


昨日のやつの補足を少々。
FreeMarker(ftl)のデフォルト値演算子と条件分岐 - するめとめがね


変数numが存在するとき、これはエラーを吐きますが

<#if num!0 == 0>
true
</#if>

これはエラーを吐きません。

<#if 0 == num!0>
true
</#if>


ええーじゃあ左辺と右辺逆転すれば済む話じゃーん、みたいに思ったりもしなくもないですが、この後に条件を追加すると結局エラー吐いて死にます。

<#if 0 == num!0 && str?has_content == false>
true
</#if>

この場合、変数numが存在しない場合でも死にます。


というわけで結論は変わらず、デフォルト演算子をifの中で使う場合、デフォルト値ごと括弧でくくってやる必要がある
もしくはくくってやったほうが後々幸せになれるみたいな。そんなかんじ。


以上補足でございました。

FreeMarker(ftl)のデフォルト値演算子と条件分岐

こんにちは!FreeMarker、書いてますか!
僕はあんまり書いてません!
書いてませんけど、書いてる人から質問されて挙動を調べたので覚書です!


もうめんどくさいのでFreeMarkerじゃなくてftlって書きますけど、ftlにはデフォルト値演算子があります。

${str!}
${str!"hoge"}
${num!0}

こういうの。
FreeMarker Manual - Expressions


上みたいな感じで純粋に文字列を表示する分には特に困りません。
むしろ以下のような書き方をしなくて済むので便利です。

<#if str??>${str}<#else>hoge</#if>


ちょっと困るのはこいつをifの中で使う場合です。
たとえばnumという変数が存在しない、または0の場合にtrueをそれ以外はfalseを返す場合を考えます。
上の書き方を踏まえて単純に書くとこんなかんじですね。

<#if num!0 == 0>
true
</#if>


でもこれだと以下のようなエラーを吐きます。

Error on line 2, column 6 in Expecting a boolean (true/false) expression here Expression num!0 == 0 does not evaluate to true/false it is an instance of freemarker.template.SimpleNumber 

お前が指定したやつtrue/falseで評価できねーから!みたいな。かんじの。


あたかもこんなの書いたような感じのエラーです。

<#if 0>

ちゃんと数値比較してほしいので以下のように変更してみます。

<#if (num!0) == 0>
true
</#if>

エラーが出なくなりました!


次に数値じゃなくて文字列でやってみます。

<#if str!"hoge" == "hoge">
true
</#if>


案の定以下のようなエラーを吐きます。

Error on line 2, column 6 in Expecting a boolean (true/false) expression here Expression str!"hoge" == "hoge" does not evaluate to true/false it is an instance of freemarker.template.SimpleScalar 

同じような感じなので同じように直してみます。

<#if (str!"hoge") == "hoge">
true
</#if>

エラーが出なくなりました!


つまり、デフォルト演算子をifの中で使う場合、デフォルト値ごと括弧でくくってやる必要があるわけですね。


beanの中のnumって値に対してやる場合は以下のようにしてやらないといけないわけです。

<#if ((bean.str)!0) == 0>
true
</#if>

めんどい。
ちなみにエラーが出てたやつらですが、値が存在しない場合はエラー吐かないのでたちが悪いです。こわい。


あとデフォルト値演算子使うけどデフォルト値を明示的に指定しないことも出来るんですが、stringの比較の場合はこれが使えて、かつ括弧で囲わなくてもエラーが出なかったりします。

<#if str! == "hoge">
true
</#if>

もちろんこの場合は上の例と違ってstrが存在しないときfalseになりますけど。


余談ですが、じわじわブックマーク数が伸びたり伸びてなかったりする前に書いたエントリ。
FreeMarkerおぼえがき - するめとめがね


この中でデフォルト演算子でbooleanを扱うときは括弧で囲わないと必ず宣言された値になるみたいなことを書いてます。
こんなかんじ。

<#assign hoge = true>
trueを表示
<#if hoge!false == true>
true
</#if>

これもtrueを表示
<#if hoge!false == false>
true
</#if>

これも多分この問題の関係なんじゃないかなーと思ったりしました。
内部的には以下のように解釈されてるんじゃないかなー的な。

こう書いても
<#if hoge!false == true>
true
</#if>
値が存在する場合はこう解釈される
<#if hoge>
true
</#if>


ソース読んでないので想像ですけど!


日本ってftlのドキュメント少ないのでもうちょっと書きたいんですけど、大してネタないんですよね。
また何かあったら書こう。あったら。

スポンサーリンク