Android:HTC EVOをレンタル中

WiMaxが速かったら、家のADSLを解約してDesireからMNPしてEVOにしようと思って電波状況チェックのためにレンタルしてきました。

そして、早速自宅から速度チェック。ちなみに比較のために家のADSLでも測りました。

EVO(WiMax): 下り:おおよそ13Mbps 上り:おおよそ2Mbps
MBA(ADSL): 下り 9Mbps 上り:おおよそ1.5Mbps

ADSLより速いじゃないか!?キタコレ!!

そう思ってとりあえずEVOのWi-Fiテザリングをオンにして計測してみた。

MBA(EVO経由WiMax): 下り:おおよそ3Mbps 上り:おおよそ1.0Mpbs

なぜ急激に落ちる…orz
まぁ3Mbpsも出ていれば、日常使いではなんの問題もないんですが、ときどき急激にスピードが下がるような気がしているので、ちょっとまだ安心できません…。でもWiMaxとAU回線でテザリングできるのは非常に魅力的…。レンタル期間は1週間なので、外出してみたりなど、もうちょっと試してみようと思います。


Slim3:JSPで関連Entityの値にアクセスする方法

Slim3だと、関連Entityが作成できます。片方向1対1とか、片方向1対多とか。双方向もできるけれど、自分は片方向1体多をよく使ってます。あんまり双方向で使う時がない???

Serviceとかで扱うときは、model.getHogeRef().getModel()とかで取得すればいいんで忘れないんだけど(というかEclipseが候補で教えてくれる)、JSPで使おうとすると忘れてしまう。よく考えたら、getを省略するだけなんすけどね…。

${comment.userRef.model.name}

みたいにするわけです。

<ul>
<c:forEach var="comment" items="${comments}">
    <li>
タイトル:${f:h(comment.title)}<br />
投稿者:${f:h(comment.userRef.model.name)}<br />
本文:${f:h(comment.body)}<br />
    </li>
</c:forEach>
</ul>

ちょっと長ったらしいですけどねー…。自分用のメモでした!


Slim3:AppRouterで.(ドット)付きの値でURLマッピング

Slim3でのURLマッピングはControllerパッケージ内のAppRouterクラスに書くことで行うことができます。
下記で言えば、/bbs/topic/123 は、/bbs/topic?id=123 にアクセスすることになります。

public class AppRouter extends RouterImpl {
    
    public AppRouter() {
        addRouting("/bbs/topic/{id}", "/bbs/topic?id={id}");
        addRouting("/list/{packageName}", "/list/index?packageName={packageName}");
    }
}

で、自分がやりたかったのは、Javaのパッケージ名をクエリに持たせたかったのですが、packageNameに.(ドット)が入った途端、Not foundのページが表示されてしまいました。なんでだろう?と思っていたら、.(ドット)が入ると拡張子扱いされて静的ファイルを見に行ってしまうんですね。そらー、そんなファイルあるわけないわー。

参考にしたサイトは下記。
Slim3における拡張子付きURIのマッピング 理系のためのTIPS集

上記のサイトでは、AppRouterにはisStaticというメソッドがあるので、それをオーバーライドして指定の拡張子(JSONとか)の場合のみfalseを返して静的ファイルじゃないよという宣言をしているようです。自分の場合は、パッケージ名のほうが大量になると思われるので、参考サイトとは逆に指定の拡張子の場合のみ静的ファイルだよと宣言してみました。

public class AppRouter extends RouterImpl {
    
    public AppRouter() {
        addRouting("/appli/image/{id}", "/appli/image?id={id}");
        addRouting("/list/{packageName}", "/list/index?packageName={packageName}");
    }

    @Override
    public boolean isStatic(String path) throws NullPointerException {
        boolean isStatic = super.isStatic(path);
        if ("png".equals(RequestUtil.getExtension(path))
                ||
                "jpg".equals(RequestUtil.getExtension(path))
                ||
                "gif".equals(RequestUtil.getExtension(path))
                ||
                "js".equals(RequestUtil.getExtension(path))
                ||
                "css".equals(RequestUtil.getExtension(path))
                ||
                "jsp".equals(RequestUtil.getExtension(path))
                ) {
            return isStatic;
        } else {
            return false;
        }
    }
}

これで、とりあえずは思った通りの動作になってくれました。よかったー。


Slim3:500byte以上のデータをEntityに保存する

Slim3の本家サイトに書かれている内容なので、わざわざブログに書くような内容ではないのですが、書かないと忘れてしまうので!
GAEのデータストアは1Entity当たり1MB以内と決まっているわけですが、まぁアイコンみたいなものはBlobで突っ込んだほうが早そうだなと思ったので、Entityに突っ込もうと思ってbyte[]でmodelクラスに定義してみたのだけれど、いざフォームからアップロードしてみると、エラーメッセージで「500byteより下じゃないとダメよ」と怒られた。

なるほど、Blobで定義するんかなーと思ってそのようにしようとしたのだが、そもそも参考にしていたページでBlobで定義してなかったのにはなんか理由があるに違いないと思ったら、本家に理由が書いてあった訳です。Slim3はアノテーションにちょこっと書いたら、byte[]とBlobの変換処理をラップしてくれるそうです。なんと!下記のように一行足すだけです。

// hoge.model以下の適当なパッケージ内のModelクラス
private byte[] icon;
↓
@Attribute(lob = true)
private byte[] icon;

ちなみに、StringとTextの変換も同じのようです。

// hoge.model以下の適当なパッケージ内のModelクラス
private String body;
↓
@Attribute(lob = true)
private String body;

Slim3すごいなー。まだまだ全然使いこなせてない…。
今回作っているものを通じて多少はマスターしたいです。


GAE:日付を日本時間かつ日本語で取得する

Androidアプリ『計画停電情報』のサーバ側のWebAPIで出力しているJSONは、今まで手書きでデータを書いていましたが、どうにもさすがに面倒だなと思ったので、自動化してみました。
その際に、時間の取得方法や日付の表示を日本時間・日本語にするのが割と面倒だったので、メモを残しておきます。

// 日本時間で日時を取得する
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo"));
// 07月29日(金)の形でフォーマットする
final SimpleDateFormat format = new SimpleDateFormat("MM月dd日(E)", Locale.JAPAN);
// フォーマット側のTimeZoneも日本にしておく
format.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));
// dateString = "07月29日(金)"になっている
final String dateString = format.format(calendar.getTime());

format.setTimeZoneメソッドをしていないと、ローカル環境では動いたのですが、GAEにデプロイしてから動かないのでこれが味噌ですね。

以上です。