2010-12-13

MHP3 モンハンポータブル3rd入手!

12/1(水)に発売されて約一週間で200万本を出荷、店頭では売り切れ状態というものすごい売れ行きのようですね。
12/11(土)にやっとMHP3を入手できたので、その経緯を書いておく。

発売日当日は、さすがに予約のみの販売で予約なしの購入は不可でした。
予約申込みのカードが一枚だけ残っていたので息子の分を予約、4日の午後以降来店してくださいとのこと。自分の分は、まだゴッドイーターバーストが終わっていないので、通常販売分が店頭に並んだら買うことにした。
そして4日午後、店に行き無事入手(^^)v
さて自分の分だが、MHP3の販売コーナーに貼り紙があり、“'8日午後入荷予定“とのこと。う~ん土曜日まで残ってるかなぁ?

さて土曜日(12/11)、午前中は用事があったので午後一に店に行った。
あった!\(^^)/ 販売コーナーに10本弱並んでいたので即、手に取りレジへ…
前に2人並んでいて手元を見るとMHP3が! おお!狩仲間!
支払を済ませてゲット!!(^^)v
翌日、別の用事で店に行って見ると販売コーナーには一つもなく次回入荷の貼り紙が…
いゃぁ、買っておいて良かった。

この調子で売れると年内に300万本とか400万本とかいくかもね!?

2010-10-08

X06HT Android2.2インストール失敗?! ビビった(-_-;

今日10時以降に、X06HTのAndroid2.2(Froyo)へのアップデートが始まりました。
中々アップデート通知が来ないので、待ちきれずに11時頃に手動アップデートしてしまいました。(仕事中にも関わらず(^_^ゞ)
無事ダウンロードが終わりインストールが開始された途端...
エラーが発生しインストールができない、とのメッセージが表示された。
メッセージをよく読むと25MB以上の空きメモリが必要とのこと。メモリを食ってる大きなアプリをアンインストールして再チャレンジしてみた。
今度はインストールが続行され、待つこと10分ほどで再起動され、パーセント表示のカウントアップが始まりさらに数分待ち、完了した。
エラーが表示されたので、まさか起動できなくなってしまうのでは? とビビってしまったが無事アップデート完了しました。(^_^)v
しかし、こういう注意事項はダウンロード前に明記しておいて欲しいな。

アプリケーション一覧を見てみると、いくつか新しいアプリケーションが追加されている。
  • お勧めメッセージ
  • ニュースと天気
  • ビデオプレイヤー(2.1からあったかなぁ?)
  • フラッシュライト

SDカードへのアプリケーションインストールをやってみた。マーケットからのインストール時にインストール先を選択できるのかと思ったが違った。
手順は以下のとおり。
インストール済みのアプリをSDカードに移動する場合は"手順2"から実行すればよい。
  1. マーケットから今まで通りインストールする
  2. [menu]-[設定]-[アプリケーション]-[アプリケーションの管理]
  3. アプリケーションをタッチ
  4. [SDカードに移動]をタッチ

2010-09-29

ニンテンドー 3DS、2001.2.26に発売決定!

今日行われた「Nintendo Conference 2010」でニンテンドー3DSの発売に、価格が発表されました。
  • 発売日: 2011.2.26
  • 価格: \25,000
「ニンテンドー 3DS」の詳細はこちら「任天堂:ニンテンドー3DS
カメラで顔写真を撮影して自動でMiiを作成する機能とか、すれちがい通信とか、バーチャルコンソールでゲームボーイ/ゲームボーイカラーのソフトがプレイできるとか面白そうな機能が色々ある。
価格は\20,000前後くらいと予想していたので少し高いなぁ、という印象です。ソフトのラインナップをみて買う時期を考えようかな?

2010-09-24

X06HTへのAndroid2.2提供日決定!

10月上旬にAndroid2.2の提供と発表されていましたが、本日提供開始日が発表されました。
10/8から提供開始ということです。
ニュースリリースはこちら『「HTC Desire」向けにAndroid™ 2.2を10月8日より提供
二週間後だねぇ。SDカードへのアプリインストールができるようになるので、メモリ残量の関係でインストールできないアプリが使えるようになるのが嬉しいな。

2010-08-27

X06HTにAndroid 2.2とS!メールアプリ提供、正式発表!

X06HT, X06HTⅡ向けのAndroid2.2とS!メールアプリ提供が正式に発表されました。
10月上旬以降提供だそうです。

ソフトバンクのサイトも更新されていますね。

たしか、S!メールアプリは9月中旬頃という話だったような...
でも絵文字対応ということだし気長に待ちましょう。
Android 2.2になればアプリをSDカードにインストールできるようになるので、今インストールできないアプリもインストールできるようになる。(Google Earthとかインストールしたい)
それと2.2からはDalvik JITコンパイラが採用されるので、アプリが今より快適・高速に動作するようになるでしょう。
もう一つテザリング機能があるんだけど、ソフトバンクから提供される場合は無効化されるんだろうな...

9.24追記:提供日決定「X06HTへのAndroid2.2提供日決定!

2010-08-25

X06HTにインストールして使い続けているアプリ(2)

X06HTで色々試した結果今使い続けているソフトを列挙してみる。...その2
最近、疲れ気味なのですこしづつ...(^_^;

[AR/カメラ]
  • セカイカメラ
    あの「セカイカメラ」、アプリとしては面白いんだけど私の周りにはエアタグが少ないんだよね。(--;
  • Layar
    これもARアプリ、学校や駅、コンビニなどをマップ上やカメラ映像に重ねて表示できる。
  • QRコードスキャナー
    バーコードやQRコードを読み取るアプリ、PCでWebブラウズしていて見つけたアプリをダウンロードするのに使っている。
  • Facetter Camera
    顔をアイコンで隠した写真を取れるアプリ、攻殻機動隊 S.A.Cを見ていた人には「笑い男」と言えば分かりやすいかな?
  • FxCamera
    色々なイフェクトを施した写真が撮れるアプリ、Fisheye(魚眼),SymmetriCam(上下、左右に鏡写し)は笑える。
  • はちゅねカメラ
    はちゅねミクと一緒に写真が撮れるアプリ、宴会とかのネタとしてインストールしてある。オートフォーカス機能が無いのが残念。
[マップ]
  • コンパスと地図
    実際の北と地図の北が合うように、地図(Google Map)を回転表示するアプリ。知らない土地に行ったときに便利かなと思ってインストールしてあるアプリ。
  • My Tracks
    移動中のGPS情報を記録して、地図上に移動経路を表示したり、移動時間、最高/平均速度、高度を表示できるアプリ。通勤中に記録してみたら最高速度が108kmと表示されていた。電車って意外とスピード出ているんだなぁ。

2010-08-18

X06HTにインストールして使い続けているアプリ(1)

X06HTを入手してから10日経ったので、色々試した結果今使い続けているソフトを列挙してみる。
[システム系]
  • NetCounter
    Wifiと3Gの通信料をバックグラウンドでカウントしてくれるアプリ
  • Android System Info
    仕事柄中身が気になるので...
  • CallFilter
    非通知や指定番号の着信を拒否するアプリ。
  • 発信確認 Call Confirm
    電話発信する際に確認ダイアログを表示してくれる。何回か操作ミスで電話してしまったことがあるのでその防止用にインストールしてある。 CallFilterに同じ機能があったのでアンインストールした
  • GPS Test
    GPSの信号強度とか衛星の情報を表示する
  • WiFi Analyzer
    WiFiの電波状況を表示するアプリ。4パターンの表示形式があって移動中に見ていると面白い。FONのアクセスポイントをさがすときに重宝する。
  • KTPocketLaunch2
    ランチャー・タスクマネージャー、前機種X01TでWindowsMobile用の同じソフトを使っていて、使用頻度の高いアプリが先頭に表示されるのが気に入っていたので。
  • MySettings
    GPS,WiFiなどのOn,Offを変更する。使い勝手がイマイチだが、気に入ったアプリが見つかるまで使うことにする。
  • Wi-Fiスポット設定
    パケットし放題フラット、ケータイWiFiを契約したのでインストールしておいた。ソフトバンクWiFiスポットで自動接続してくれる。
  • バッテリーモニタ
    ステータスバーとウィジェットでバッテリー残量を表示できる。残量変化、残量頻度、温度頻度のグラフ表示ができる。結構バッテリーの減りが早いので、これでチェックして残量を気にしながら使っている。
  • アストロ ファイルマネージャーz
    ファイルマネージャー、これがないと暗闇の中を進んでいるようで気持ち悪い。
[文字入力]
  • Simeji
    ようやくフリック入力に慣れてきた。
  • ClipStore
    マッシュルーム対応、クリップボードの履歴から貼りつけができる。
  • Kaomoji List
    マッシュルーム対応、顔文字の入力ができる。今のところ、メールに絵文字が入力・表示できないので、顔文字で代用している。
  • メアド・ピッカー
    マッシュルーム対応、複数アドレスを入力するのに便利。今のところ使用頻度は高くない。
  • 日英マッシュ
    マッシュルーム対応、日本語を入力すると英語に翻訳してくれる。

2010-08-11

X06HTのバッテリのもち具合

X06HTを数日間使ってみてのバッテリの持ち具合について

  • 最初の数日はほぼ一日色々動かしていたこともあって、一日持たなかった。
  • 仕事のある日は、通勤中に色々いじって遊ぶ(GPSや無線LANの状態を調べたり...)のと休憩時間にセカイカメラで遊ぶといった使い方で、残50%だった。この間12時間位で自動更新はオンの状態だった。
  • 試しに自動更新オフ状態で一日使ってみたら残60%だった。自動更新オンでもオフでもあまり変わらない。あまりヘビーに使わなければ何とか2日持つかどうか、という感じ
この状況から考えると、予備バッテリや充電用バッテリの常備は必須だな。("何回か充電して慣らせば長持ちするようになる"ということらしいが、どの程度変わるのかなぁ?)
以前、X01T用に購入した充電器(「X01T用に非常用充電器を買った」)があるので、念のため充電できるか試してみたらバッチリOKでした。(^_^)v
今度、何パーセント位充電できるか試してみよう。

2010-08-10

X06HT使用感と基本設定

土曜日(8/7)、ショップが開店した直後に受け取りに行ってきた。
料金プランの変更(パケットし放題フラット)も行ったので、なんだかんだで一時間弱くらい。
家に帰ってきて、早速設定をしたり、色々なソフトをインストールして試してみた。
二日間使ってみての端末自体の感想は、キビキビ動いてストレスなく動いて問題なし。
前機種のX01Tは若干モッサリ感があって、最近はメールソフトの立ち上げが10秒位かかるようになっていて、何か操作する度に"イラッ"としていたので、これと比べると気持ちよく操作できる。(^_^)
画面:はやはりキレイだね。液晶に比べると発色がいいのかな。
タッチパネル:X01Tはペンで操作することが多かったので、指でのタッチが慣れていないせいか押したいところを押せないことが多い。まぁ慣れれば大丈夫でしょう。でも指で操作するので画面が汚れる(;_;) 早めに保護シートを買おうかな。

端末の設定周りで行った操作は下記のとおり。
  • WiFi設定
    • 締め日の関係で10日までは旧料金プランとなってしまうので、まずはWi-Fi接続ができるようにする。
    • [設定]-[無線とネットワーク]-[Wi-Fi設定]-[Wi-Fiネットワークを追加]で自宅の無線LANアクセスポイントを追加したが繋がらない。
    • ウチの無線ルーターは"ステルス"に設定してあるので、"もしや?"と思いネットで調べてみると...ありました! 「SoftBank X06HT Wiki:ルータによってはESSIDステルスでつながらないことが」に書かれているとおりに設定したら見事に繋がりました。
  • 連絡先(電話帳)の移行
    • Androidでは、端末にGmailのアカウントを設定すれば、Gmailの連絡先を自動で取り込んでくれるので、前機種X01Tから連絡先データを取り出してGmailアカウントにインポートすれば完了ということになる。
    • Windows Mobile機の連絡先をvCard形式に変換する。これには「ConvVCF2」というソフトを使った。
    • 変換されたvCardファイルを、Windows Mobile機からPCに転送する。
    • PCで、X06HT用に作成したGmailアカウントでGmailにログインする。
    • [連絡先]-[インポート]でvCardファイルをインポートする。
    • X06HTで、Gmailを起動して[menuキー]-[アカウント]-[アカウントを追加]で作成してあったGmailアカウントを設定する。
    • あとはネット接続可能な状態にしておけば、同期されて先程PCでインポートした連絡先が「連絡先」に表示されるようになる。
    • う~ん、簡単だ(^_^)
  • その他諸々:着信音とか壁紙とか...

主な設定はこんなところかな?
次回は、X06HT入手後インストールしたアプリの内、常用するようになったアプリを紹介する。

2010-08-06

キタ~! X06HT入荷連絡、来たよ~!(^_^)v

今日、15時頃にショップから電話があった。
「予約されていたX06HTが入荷しました」
きたよ~、やっときたよ~\(^o^)/
6月中旬に予約して1ヶ月半、待ちかねていた入荷連絡がやっと来ました。
ショップは10時開店なので朝一で行って、手続きしてくる。
土日は遊び倒すぞ!!!

2010-07-30

Slim3本 発売!!

Slim3本「オープンソース徹底活用 Slim3 on Google App Engine for Java」が発売されました。内容は「ひがやすを blog - Slim3本予約開始」を参照してください。
Amazonでは、"一時的に在庫切れ"だそうなので、明日近くの書店に行ってみるかな?

2010-07-27

X06HT、未だ入荷連絡来ず...(;_;)

今日現在、X06HT入荷の連絡はまだない...(;_;)
という経過からすると、そろそろ「入荷しました」なり、「すみません、延期となりました」といった連絡があってもよさそうなんだが... 仕方がないから週末まで待ってみるか。
でもこの状況から考えると、「すみません、延期となりました」の可能性が高いかな。

2010-07-22

X06HTⅡだと?!

またまたX06HTのニュース!なんとX06HTⅡが発表されました。
詳細はこちら「ソフトバンク、TFT液晶を搭載した「HTC Desire X06HTII」を発表
ソフトバンクのプレスリリースはこちら「「HTC Desire X06HTII」の開発およびS!メールへの対応について

昨日のニュースの「X06HT、7/29で予約締切り」というのはこの伏線だったのかな?
スペックはディスプレイが有機ELからTFT液晶に変更されている以外は違いがない。これってもしかして「HTC、有機 ELの在庫不足からHTC Desire、Nexus Oneなどのディスプレイをソニーの液晶へ変更か?」のことじゃないの?
そう考えると、"7/29で予約締切り"→"X06HTⅡ発売"の流れが分かる。
X06HTのウリの一つが"有機EL"だったから、"TFT液晶"版をそのままX06HTとして売るわけにはいかず「X06HT」として発売する。そして、「X06HT」はこれ以上受注しても納品できる可能性がほとんでないから予約締切りとする。
...ということだね。

有機ELの調達問題があるから「X06HT」より「X06HTⅡ」の方が入手できる時期が早かったりして...(-_-;
「X06HTⅡ」は8/3から予約開始、9月下旬以降発売ということなので、これから予約する人はどちらにするか悩んでしまうね。

S!メール対応の件も一緒に正式発表されました。9月中旬以降にAndroidマーケット経由で無料で提供開始ということです。(んっ?、Android 2.2は?)

X06HTのS!メール対応とAndroid 2.2への対応!

またX06HTのニュース、前回「X06HT、7/29で予約締切り!」はちょっと寂しいニュースだったが、今回は嬉しいニュース!
発売以降、全く音沙汰なしだったS!メール対応とAndroid 2.2への対応についての動きがありました。詳細はこちら"「HTC Desire X06HT」 のMMS対応とAndroid 2.2へのアップデート予定を公表"
S!メールは9月中旬頃、Android 2.2アップデートは11月頃を予定しているそうです。これで機種変更する際の懸念事項がなくなりました。(^_^)
S!メール非対応ということで、二の足を踏んでいた方、ショップへ急ごう!まだ予約できるぞ!

X06HT、7/29で予約締切り!

昨日(7/21)、毎日見ているニュースサイトで[「HTC Desire X06HT」 7月29日で予約締め切り、販売終了へ]という記事を見つけた。「当初予定していた販売台数に達するので販売を終了する」とのことで、予約分の出荷で販売終了だそうです。(7/21の時点で、ソフトバンクのWebにはまだ発表されていない)
4/27発売、7/29予約締切りということで 3ヶ月というのは早くないか?
有機ELディスプレイが確保できなくて、TFT液晶ディスプレイに切り替えるという話を聞いたことがあるけど、もしかしてこれが影響している?
私が予約した分は大丈夫だよね?
「7月末以降に延期」という連絡がきたということは、ちゃんと予約されているということだよね?
信用して入荷連絡を待っていて大丈夫だよね?

ソフトバンクさん、iPhoneが好調で力を入れたいのは分かるけど、iPhone一本でいいのか?
これからAndroidは大きくなるよぉ、いいのかなぁ? ドコモ、auに取られちゃうよ。

2010-07-13

ジェイムズ・P・ホーガン氏が亡くなられました

ジェイムズ・P・ホーガン氏が 7/12にアイルランドの自宅で亡くなられました。(東京創元社 「SF作家ジェイムズ・P・ホーガン 逝去」)
ハードSF作家で「星を継ぐものから始まる"巨人たちの星シリーズ"を読んでハマりました。
邦訳された作品は全て読みました。
ソフトウェア開発という仕事をしているので「未来の二つの顔はワクワク・ドキドキしながら楽しく読めた好きな作品の一つです。

楽しめる多くの作品をありがとうございました。ご冥福をお祈りします。

2010-06-30

X06HTの保護ケース

X06HTはまだ入手できていないんだが、ストラップホールがないのでケースを探している。
バッファローコクヨサプライから6月下旬にHTC Desire専用レザーケースが発売された。
液晶保護フィルム付きで\2,390、直販サイトでは\1,780だった。(価格.comでは、2010.6.30時点で最安値が\1,300だった)
金額的には、まあ手頃かな。液晶保護フィルムも付いているし。
X06HTを実際に入手するまでには、まだ時間が掛かりそうだから他にも色々探してみるかな。

2010-06-25

X06HT 予約状況

今日、ショップから電話があった。
「ソフトバンクから連絡があり、入荷予定が"6月下旬以降"から"7月下旬以降"に変更になりました」とのこと。
まあ、最初から入手に時間がかかることは承知の上だったので驚かないけどネ。
気長にまつことにしよう。

2010-06-22

X06HT、入手できるのはいつになることやら...(~_~)

今日、Web見てたらこんな記事を見つけた。
ソフトバンク「HTC Desire」が手に入らない!――品薄状態続くDesireの入荷・販売状況
この記事を書いた方は、5月初旬に予約して現時点で7月末あるいはそれ以降に入荷ということらしい。
私は6月中旬に予約したので同じ状況だとすると、9月とかになるっていうこと? 一季節(夏)過ぎてしまうね。
待ちきれない人がiPhone4に流れて、X06HTの品薄状態が解消されたりしないかなぁ...と薄い期待をしている今日この頃でした。

2010-06-19

GAE/J + Slim3 : メール受信アプリを作ってみる(4)

今回はMailServiceを作成する。
前回作成したテスト MailServiceTest#receive_plainText_UTF8()をパスするように MailService#receive()を実装する。
◎まずはコンパイルエラーをなくすように必要最低限のコードを書いてみる。
public MailItem receive(String pAddress, InputStream pInputStream) {
    MailItem mailItem = null;
    return mailItem;
}
これで、コンパイルは通るのでテストを実行してみる。
結果は...NullPointerExceptionでRed、receive()の戻り値がnullなので当たり前だな。
◎次はテストをパスするようにコードを書く。
public MailItem receive(String pAddress, InputStream pInputStream) {
    MailItem mailItem = null;
    Properties prop = new Properties();
    Session session = Session.getDefaultInstance(prop, null);

    try {
        MimeMessage message = new MimeMessage(session, pInputStream);
        mailItem = new MailItem();
        mailItem.setFrom(message.getFrom()[0].toString());
        mailItem.setTo(message.getRecipients(RecipientType.TO)[0].toString());
        mailItem.setSubject(message.getSubject());
        InputStream in = (InputStream)message.getInputStream();
        Reader reader = new InputStreamReader(in);
        BufferedReader bufReader = new BufferedReader(reader);
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = bufReader.readLine()) != null) {
            sb.append(line + "\n");
        }
        mailItem.setBody(sb.toString());
        Datastore.put(mailItem);
    } catch (MessagingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return mailItem;
}
◎コンパイルは通っているので、テストを実行してみる。もちろんGreen、これで基本パターンはOK (^_^)v
次回は通常のメールと同じように文字コードが"ISO-2022-JP"の場合を考えてみる。

2010-06-17

GAE/J + Slim3 : メール受信アプリを作ってみる(3)

今回はMailServiceTestを作成する。
まずは受信メールを表すモデルクラス MailItemを作成しておく。
  • メール受信のサービス: "gen-model"で /src/../model/MailItem.java と /test/../model/MailItem.java を生成する。
  • 属性はfrom, to, subject, bodyを作成する。型は全てStringとする。

では、MailService#receive(String pAddress, InputStream pInputStream)のテストを作成する。
文字コードは、現時点では余計なことは考えたくないので"UTF-8"としておく。またマルチパートも現時点では考慮しない。
最初は、単純で基本的な処理から考えていくのが"吉"です。(^_^)

テストメソッドは以下のようになった。
public class MailServiceTest extends AppEngineTestCase {
    private MailService service = new MailService();

    /**
     * シングルパート(text/plain)を入力し{@link MailItem}オブジェクトが生成されること
     * @throws UnsupportedEncodingException
     */
    @Test
    public void receive_plainText_UTF8() throws UnsupportedEncodingException {
        String mailFormat = "Received: by 10.115.25.19 with SMTP id c19mr2897164waj.34.1275464064977;\n"
            + "Wed, 02 Jun 2010 00:12:34 -0700 (PDT)\n"
            + "Return-Path: <%1$s>\n"
            + "Received: from smtp.hoge.org (ml.hoge.org [128.1.2.3])\n"
            + "by gmr-mx.google.com with ESMTP id u10si11332059wak.6.2010.06.02.00.34.24;\n"
            + "Wed, 02 Jun 2010 00:12:34 -0700 (PDT)\n"
            + "Received-SPF: pass (google.com: best guess record for domain of sender@hoge.org designates 128.1.2.3 as permitted sender) client-ip=128.1.2.3;\n"
            + "Authentication-Results: gmr-mx.google.com; spf=pass (google.com: best guess record for domain of sender@hoge.org designates 128.1.2.3 as permitted sender) smtp.mail=sender@hoge.org\n"
            + "Received: from [128.1.2.3] (unknown [128.1.2.3])\n"
            + "by smtp.hoge.org (Postfix) with ESMTPA id 8F1C716838E\n"
            + "for <%2$s>; Wed,  2 Jun 2010 00:12:34 -0700 (PDT)\n"
            + "Message-ID: <4C060983.1090109@hoge.org>\n"
            + "Date: Wed, 02 Jun 2010 00:12:34 -0700\n"
            + "From: SENDER <%1$s>\n"
            + "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.1.9) Gecko/20100317 Thunderbird/3.0.4\n"
            + "MIME-Version: 1.0\n"
            + "To: RECEIVER <%2$s>\n"
            + "Subject: %3$s\n"
            + "Content-Type: text/plain; charset=UTF-8\n"
            + "\n"
            + "%4$s\n";
        String encodedSubject = MimeUtility.encodeText("これは件名", "UTF-8", "B");
        String mailStr = String.format(mailFormat, "sender@hoge.org", "reciever@fuga.org", encodedSubject, "本文1行目\n本文2行目");

        byte[] bytes = mailStr.getBytes();
        InputStream in = new ByteArrayInputStream(bytes);
        MailItem mailItem = service.receive("sender@hoge.org", in);
        assertThat(mailItem.getFrom(), is("SENDER <sender@hoge.org>"));
        assertThat(mailItem.getTo(), is("RECEIVER <reciever@fuga.org>"));
        assertThat(mailItem.getBody(), is("本文1行目\n本文2行目\n"));
        assertThat(mailItem.getSubject(), is("これは件名"));
    }
}
内容は、
  • encodedSubjectに、件名を"UTF-8"でエンコードした文字列をセットする(=?UTF-8?B?44GT44KM44Gv5Lu25ZCN?= となる)
  • mailStrにヘッダーを含めた受信メールの文字列を作成する
  • 次の2行でこのmailStrをInputStramに変換する
    byte[] bytes = mailStr.getBytes();
    InputStream in = new ByteArrayInputStream(bytes);
    
  • MailService#receive()メソッドを実行する
  • 生成されたmailItemの内容を検証する
となっている。

この時点ではコンパイルエラー(MailService#receive()が未定義)となっているはず。
次回はこのテストをパスするようにMailService#receive()を実装していく。

2010-06-14

おかえり「はやぶさ」、そしてお疲れ様

はやぶさ君がとうとう帰ってきました。
生中継サイトを見ていたんだが中々繋がらなかったので、管制室の中継サイトをみていた。
20時ころに騒がしくなって、みんなでバンザイをしていたんだが、どうやらカプセル分離に成功した瞬間だったらしい。
結局大気圏突入の生中継は見られなかった。(;_;)

JAXA - ISAS トピックス」によると
  • 2010.6.13 19:51 : カプセルの分離に成功
  • 2010.6.13 22:51 : 大気圏突入
  • 2010.6.13 23:56 : カプセル発見
ということで、無事ミッションを終えました。
カプセルも今日(6.14)回収されたそうです。
上記サイトに大気圏突入直前に「はやぶさ」が撮影した地球の写真が掲載されています。
最後の最後までよく頑張ったネ、はやぶさ君

NASAが観測用航空機から撮影した大気圏突入の映像が公開されています。
バラバラになりながら燃え尽きていく姿を見ると何だか泣けてきますねぇ(T_T)

私がいつもチェックしているITmediaに「お帰りなさい、はやぶさ! 総まとめ」に情報がまとめられています。
あらためて「はやぶさ」の7年の旅を見てみると、すごいことをやってのけたんですね。
はやぶさ君、そして運用関係者の方々、お疲れ様でした。m(_ _)m

2010-06-13

「はやぶさ」が帰ってくる

小惑星イトカワの探査機「はやぶさ」が、7年 50(60?)億kmの旅を終えて今日地球に戻ってきます。(6/13 9:00時点[日本時間]で地球から282,110km)
毎週「今週のはやぶさ君」でチェックしていたが、毎週約300万kmづつ地球に近づいてきていよいよ今日(6/13 22:51[日本時間])地球の大気圏に突入する。
イトカワのサンプルが入っている(と思われる)カプセルは分離されて回収され、「はやぶさ」本体は燃え尽きてしまう。
「はやぶさ」君、もう少しだ頑張れ!!

2010-06-12

X06HT(HTC Desire)予約してきた

今さらだが、今日X06HTを予約してきた。(iPhone4が発表された後なので余計に今更感があるが...)
6月下旬以降ということだったので気長に待つことにしよう。
予約したときに
  • MMSが使えない
  • 電話帳の移行ができない
ことをしつこく確認された。
それを分かった上で予約しに行っているんだけどネ

2010-06-10

GAE/J + Slim3 : メール受信アプリを作ってみる(2)

仕事で他プロジェクトの応援に借り出されて忙しかったので間が空いてしまった。(-_-;

前回、メール受信ができるように設定を行ったので、メール受信するプログラムを作っていく。
まずは必要となるソースを生成しておく。とりあえずコントローラとサービスは必要なので、これらを生成しておく。
  • メール受信のコントローラ: "gen-controller"で /src/../controller/mail/ReceiveController.java と /test/../controller/mail/ReceiveControllerTest.java を生成する。
  • メール受信のサービス: "gen-service"で /src/../service/MailService.java と /test/../service/MailServiceTest.java を生成する。

さて最初はMailServiceのテストだが、仕様を考えなければいけないのでGAE/Jでのメール受信について調べてみる。
メール受信に関しては「Google App Engineドキュメント」の[Java]-[Services]-[Mail]-[Receiving Email]に書かれている。
ここの「Handling Incoming Email」を読むと下記のコードでMimeMessageオブジェクトが取得できる。
import java.util.Properties;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;

Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
MimeMessage message = new MimeMessage(session, req.getInputStream());

ということで、メール受信のサービス MailServiceの仕様は次のようにする
[receiveメソッド]
  • 引数
    • 受信メールアドレス: コントローラに渡される受信メールアドレス
    • InputStream:メールの内容(上記コード例のreq.getInputStream())
  • 処理内容
    • 引数 InputStreamからMimeMessageを生成する
    • MimeMessageから"From", "To", "件名", "本文"を取り出す
    • 取り出した項目から受信メールを表すモデルクラス(MailItem)を生成する
    • 生成したMailItemを戻り値として返す

風邪気味なので今日はここまで、次回はMailServiceTestを作成する。

2010-06-03

GAE/J + Slim3 : メール受信アプリを作ってみる(1)

会社で開発しているGAE/J + Slim3アプリの開発作業がようやく起動に乗ってきたので、"個人的興味"で"個人的"なアプリを作ってみる。
単なるWebアプリではつまらないので、メールで処理依頼を受け付けられるようにしてみる。
ということで、メールを受信するアプリをGAE/J + Slim3で作ってみる。

まずは設定関係から...
この設定を行えば、アプリ宛のメール"abc@xyz.appspotmail.com"が受けられるようになる。
[war/WEB-INF/appengine-web.xml]
<inbound-services>
    <service>mail</service>
</inbound-services>

[war/WEB-INF/web.xml]
<security-constraint>
    <web-resource-collection>
        <url-pattern>/_ah/mail/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
    </auth-constraint>
</security-constraint>

受信したメールをどのようにアプリで受け取るかというと、URL "/_ah/mail/メールアドレス"にマッピングされるのでサーブレットで処理すればよい。
Slim3の場合、AppRouter.javaでメール受信処理を行うコントローラのURLへのルーティングを定義すればよい。(Slim3 Controller - URL mapping参照)
[controller/AppRouter.java]
public AppRouter() {
  addRouting("/_ah/mail/{address}", "/mail/receive?address={address}");
}
このコードでは、メールを受信すると /mail/receiveにリクエストがくることになる。またメールの宛先(To)アドレスはリクエストパラメータ"address"として渡されてくる。

これでメールを受信する準備が整ったのでメール受信用のコントローラを作ってみる。もちろん、テストもネ!

2010-04-23

クラブニンテンドーのプラチナ特典が届いた!! (^_^)

4/20にクラブニンテンドー2009年度プラチナ会員特典が届いた。
今回の特典は30年前に発売された「ゲーム&ウオッチ ボール」の復刻版です。
懐かしく遊ばせてもらいました。単純だけど、ついついのめり込んでしまうんだよね。
「ゲーム&ウォッチ」開発者へのインタビューが任天堂サイトの「社長が訊く『ゲーム&ウォッチ』」に掲載されています。
ハード屋とソフト屋の違いはあるけど、同じ技術屋として興味深く読ませてもらいました。

2010-04-21

「R∞M for PSP」開発中止だそうです

おおっ、R∞M for PSP クローズドβ当選!!」で書いたPSP向けのコミュニティサービス"R∞M for PSP"だが、先日メールで案内があり、開発中止となったそうです。
新規性が感じられなかったし、興味を引くような仕掛けもなかったので仕方がないかなぁという感じです。

PSP向けということで、対象ユーザを限定できるのでコミュニティは作りやすく、PSP+ネットワークでユーザー間の横のつながりを強くしてユーザーの繋ぎ止め、ユーザー数の増加を狙ったのかもしれません。
しかし、内容が普通すぎでした。
最初は、同じPSPユーザー同士ということで変な探り合いめいたこともなくコミュニケーションがとれたので面白かったのですが、内容的には一般的なSNSとさほど変わるところがなく、しばらくたつと飽きてしまいました。
文字入力方法に不満を持つユーザーが多かったのが印象的でした。「R∞M」内では通常のPSPでの文字入力とは異なった方法となっていて、入力しづらいという意見が結構ありました。
私としては、確かに入力しづらかったですが、慣れれば新方式の方が早く入力できそうだなと感じたので我慢しながら使っていました。
文字入力というUI部分をガラッと変えてしまうのは冒険しすぎてしまってのではないかな?
最初に"~という方針で文字入力方法が通常と異なる"という説明があれば、ユーザーの不満も多少減らせたのではないかなと思います。
基本的なUIは使い慣れた方法が最良の方法なので、変更するにはかなり用意周到に準備をしないといけないですね。

Softbank HTC Desire、初回出荷分が予約で完売

SoftbankのAndroid端末"HTC Desire"が「"HTC Desire"、予約だけで初回出荷分が完売」だそうです。
今、X01Tを使っているんだがイマイチ面白みに欠けて期待していたほどではなかったのと、最近不安定だし、二年以上経ったので、そろそろ機種変しようかなと思っていたところに春にAndroid端末発売の発表があった。
発表されたスペックを見てみると"S!メール"に対応していないとのことなので様子見をしていたのだが、これほど人気があるとは?!
iPhoneも魅力的だけど、作る側からみるとAndroidの方が敷居が低いんだよね。
まあ、慌てることもないので購入者の感想と"S!メール"対応を待つこととしよう。
夏あたりにAndroid端末第二弾とか出ないかなぁ?

2010-04-18

PCが修理から戻ってきた(^_^)

自宅のノートPCのディスプレイが故障したので修理に出していたが、やっと戻ってきました。
液晶駆動部のインバーターの交換で¥25,000かかってしまった。(;_;)
これでやっとGAE/Jアプリの開発に取り掛かれるぞ!

2010-03-27

GAE/J本買いました

GAE/J本「Google App Engine for Java [実践]クラウドシステム構築」を買いました。
発売は2009/9なので内容的には若干古いですが(メール受信に関する記述がない...リリースされたのが発売後なので当たり前ですが)、基本はしっかり押さえられていて GAE/J特有の制限について大変勉強になりました。
実際の開発では「Slim3」を使うことになるので直接扱う知識は多くはないけど、ベースをしっかり理解しておかないと何かトラブったときに困ってしまうので、この本でキチンと理解しようと勉強中です。

2010-03-26

「ひが」さんのインタビュー

Slim3開発者の「ひが」さんのインタビューがここに掲載されています。
「Slim3の設計哲学は、“Less is more”を実現すること」だそうです。
開発をしていると、とかく機能がテンコ盛りに成りがちで複雑な作りになってしまうので、これは肝に銘じておきたいですね。
アジャイルプラクティス」にも、設計、ソースを"シンプル"に保つことの大切さが書かれていました。
普段の開発では、
  • 今必要なものだけを作る
  • 開発のサイクル内でリファクタリング作業を必ず行う
といったことを心掛けています。

2010-03-23

Slim3 1.0リリースされました(^_^)

3/18にSlim3 1.0がリリースされました。
自宅PCが壊れているので今日まで気がつかなかった。(;_;)
会社でGAE/J上の開発案件があり、4月から開発開始予定だったのでグッドタイミングでした。

2010-03-18

自宅PCのディスプレイが壊れた?(T_T)

昨日、家に帰ってPC起動したらディスプレイに何も表示されない! (-_-;
電源ランプは点いているし、再度電源ボタンを押すと電源が切れる(シャットダウン?)ので、どうやらOSは正常に起動しているようだ。
ということはディスプレイが死んだ?
バックライトとか液晶自体に問題があってディスプレイが真っ暗な状態になっているみたいだ。
これからGAE/J上に自作アプリを作ろうと考えていたのに...
はぁ、出鼻をくじかれた感じ (;_;)

2010-03-13

GAE/J + Slim3 [はじめてのSlim3(5)]

今回でSlime3公式サイトの「Getting Started」チュートリアルは最後、「Listing tweets」で入力したtweetが一覧表示されるようになる。

  • まずはMVCモデルのViewの部分となる war/twitter/index.jspを修正する。<form>~</form>の後に下記コードを追加する。
    ここでやっていることは
    1. "forEach"でtweetListから要素を一つづつ取り出す
    2. その要素をh()でエンコードして表示
    3. <hr />で水平線を表示
    で、この部分に一覧表示されることになる。
    <c:forEach var="e" items="${tweetList}">
    ${f:h(e.content)}
    <hr />
    </c:forEach>
  • では http://localhost:8888/twitter/ にアクセスして表示してみる。
    ...
    一覧に何も表示されない、これはJSPで表示しようとしている"tweetList"が作成されていないからだ。
  • war/twitter/index.jspに対応するのはcontroller.twitter.IndexContorollerとなるので、このクラスで"tweetList"を作成することになる。
    ということで、まずはテスト(仕様)を書く。controller.twitter.IndexContorollerTest#run()の最後に下記を追加する。
    assertThat(tester.requestScope("tweetList"), is(notNullValue()));
  • それじゃ、テスト実行(もう慣れたかな?リズムに乗ろう!)
    結果は...Red(NG) なぜかというと、まだIndexControllerに"tweetList"を作成するコードを書いていないから、ということでこの段階では"正常"。
  • では、IndexControllerを修正しよう。
    ここで一つTips、eclipseに「moreUnit」プラグインがインストールされていれば"Ctrl+J"でテストクラスと対象クラスを行き来できるようになるので切り替えが楽チンです。
    修正後は下記のようになる。
    ここでやることは
    1. TwitterService#getTweetList()でTweetのリストを取得する。
    2. それをrequestScope("tweetList", tweetList)でアトリビュート"tweetList"にセットする。
    public class IndexController extends Controller {
        private TwitterService service = new TwitterService();
        @Override
        public Navigation run() throws Exception {
            List<Tweet> tweetList = service.getTweetList();
            requestScope("tweetList", tweetList);
            return forward("index.jsp");
        }
    }
  • ここでgetTweetList()が未定義というエラーが出る。そう、TwitterService#getTweetList()はまだ存在していない。getTweetList()を作ることになるのでが、その前にテストを作る(「テスト駆動」だね(^_-))
    TwitterServiceTestに下記のテストメソッドを追加する。ここで"getTweetList()"がエラーとなっているはず。
    @Test
    public void getTweetList() throws Exception {
        Tweet tweet = new Tweet();
        tweet.setContent("Hello");
        Datastore.put(tweet);
        List<Tweet> tweetList = service.getTweetList();
        assertThat(tweetList.size(), is(1));
        assertThat(tweetList.get(0).getContent(), is("Hello"));
    }
  • では続いてビルドエラーをなくすためにTwitterService#getTweetList()メソッドを作る。エラーの出ている箇所にカーソルを合わせて"Ctrl+1"を押す。
    "型TwitterServiceのgetTweetListメソッドを作成します"を選ぶ。
  • するとTwitterServiceのソースが開いてgetTweetListメソッドの雛形ができているので下記のように修正する。
    フィールド t を定義
    private TweetMeta t = new TweetMeta();
    getTweetListメソッドを次のように修正する
    public List<Tweet> getTweetList() {
        return Datastore.query(t).sort(t.createdDate.desc).asList();
    }
  • さあ、これでコンパイルエラーがなくなったので、テストを実行する。
    ...
    結果はGreen(OK)
    全てのテストを実行していない場合はこれが最後なので実行しておこう。
    全テストを実行してもさほど時間はかからないので、必ず全テストを実行するようにしよう。(ちょっとした修正が思わぬところに影響を及ぼすこともあるので)
  • テストがAll Green(OK)となっていることを確認して http://localhost:8888/twitter/ にアクセスして動きを確認してみよう。
    何か文字列を入力して[tweet]ボタンをクリックすると一覧が表示される。
  • GAEにデプロイしてアクセスしてみよう。ローカルと同じように動くのが確認できる。うーん、簡単すぎる(^_^;
  • これでTutorialが終了した。
    ここで、一通り終えてみての感想を...
    • 全般的に、サクサクとストレスなく進められて気持ちイイ
    • Slim3 DatastoreのAPIが「S2JDBC」のような"流れるようなインタフェース"でスラスラ書けて読みやすい
    • 「テスト駆動(TDD)」は、普段の開発(主に「Teeda」)で実践しているので、特に違和感なく進められる。
      未経験の人はぜひ実践を。「アジャイルプラクティス 第5章 作る前から使う」に書かれているがシンプルな設計になり易い
開発(特に仕事の場合)は、様々なストレス要因があってプログラミングに集中できないことが多い。集中できないとミスをおこす可能性も高くなるので、余計な事に気を使わずにテンポよくプログラミングが進められる「Slim3」は気に入りました。
 今度、会社でGAE/J上に構築する予定のシステムがあるので「Slim3」を使ってみようかと思います。
個人でもアカウントは作ってあるので家族で使うようなアプリを作ってみようかな。

2010-03-12

GAE/J + Slim3 [はじめてのSlim3(4)]

一日、間が空いてしまいました。m(_ _)m
隣の部署で大火事状態のプロジェクトがありヘルプにかり出されたので、更新する時間が取れなかった(;_;)

前回の続き、「Creating a form」の最後のところ...TwitterService#tweet()メソッドを作成してテストがGreen(OK)となった続きから。
  • 次に進む前にTwitterService#tweet()メソッドで何をしているのか確認してみる。
    public Tweet tweet(Map<String, Object> input) {
        Tweet tweet = new Tweet();
        BeanUtil.copy(input, tweet);
        Transaction tx = Datastore.beginTransaction();
        Datastore.put(tweet);
        tx.commit();
        return tweet;
    }
    • BeanUtil.copy()でTweetオブジェクトに入力値を設定している。
      このcopy()メソッドが便利で第一引数(Mapオブジェクト)のKey値と同じ名前の"第二引数のプロパティ"にValue値をセットしてくれる。(contentに値が設定されることになる)普通は一つ一つgetter()メソッドを使ってセットするコードを書くのだが、こういう単純作業は人がやるべき作業じゃないよね。
    • Datastore.put(tweet)でTweetオブジェクトをデータストアに格納している。
      App Engineデータストアを扱う場合「Datastore Java API」で説明されているように、JDO, JPA, 低レベりAPIのいずれかを使用することになるが、ここではSlim3のDatastoreを使っている。これはタイプセーフな低レベルAPIのラッパーということでJDO,JPAを使うより早いらしい。
  • では、続き...
    今作ったTwitterService#tweet()メソッドをTweetControllerから呼んで、入力された"tweet(つぶやき)"をデータストアに格納されるようにする。
    ということで、この仕様をTweetControllerTestに書く。既にテストメソッドrun()は作成されているので下記のように修正する。
    @Test
    public void run() throws Exception {
        tester.param("content", "Hello");
        tester.start("/twitter/tweet");
        TweetController controller = tester.getController();
        assertThat(controller, is(notNullValue()));
        assertThat(tester.isRedirect(), is(true));
        assertThat(tester.getDestinationPath(), is("/twitter/"));
        Tweet stored = Datastore.query(Tweet.class).asSingle();
        assertThat(stored, is(notNullValue()));
        assertThat(stored.getContent(), is("Hello"));
    }
  • テストクラスを修正したので、テスト実行...Red(NG)
    TweetControllerはまだ修正していないので、今の時点ではRed(NG)で"正常"
  • では、テストが通りようにTweetControllerを修正する。"return redirect(basePath)"の前に一行追加する。
    service.tweet(new RequestMap(request));
  • テストを実行して...はい、Green(OK)
  • では実際に動かしてみる。「GAE/J + Slim3 [準備]」で作成しておいた"Webアプリケーション"が起動されていることを確認して、ブラウザから http://localhost:8888/twitter/ にアクセスする。
  • テキスト欄に何か文字を入力して[tweet]ボタンをクリックする。何も変化はないけど、入力した文字列がデータストアに格納されているはず。
  • データストアの内容を確認するにはブラウザで http://localhost:8888/_ah/admin/ にアクセスする。これはローカル開発用のコンソールでデータストアやTask Queueの内容が確認できる。
  • "Datastore Viewer"をクリックして、[List Entries]をクリックすると、データストアに格納されているデータの内容が表示される。ここに先ほど入力した文字列のデータが表示されているはずだ。
あと残りは入力したtweetを一覧表示する処理をつくる「Listing tweets」だ、今度の土日でやろう。p(^^)g

2010-03-10

GAE/J + Slim3 [はじめてのSlim3(3)]

前回の続き、「Creating a form」の途中から...TweetControllerクラスのrun()メソッドを修正してテストがGreen(OK)となった続きから。
  • モデルクラスのTweetクラスを生成する。build.xmlのgen-modelタスクを実行し、モデル名に"Tweet"と入力すると以下のソースが作成される。
    • src/(ルートパッケージ)/model/Tweet.java
    • test/(ルートパッケージ)/model/TweetTest.java
  • 新しくソースを生成したのでテストを実行する...はい、Green(OK)(^_^)
  • この時点で、Tweetクラスはデータストアに格納するための必要最低限の属性(key, version, schemaVersion)しか持っていない。
    このクラスは"/twitter/index.jsp"から入力された「tweet(つぶやき)」を表すクラスなので、それに必要な属性(content, createdDate)を追加する。以下のフィールドを追加してgetter,setterも追加する。
    private String content;
    private Date createdDate = new Date();
  • ソースを修正したのでテスト実行...はい、Green(OK)だね(^_^)
    ここでテストクラスの作り方について...元サイトにも書かれていることだが、教科書的にテストクラスを作るとgetter, setter一つ一つにテストメソッドを作ることになるんだが、実際の開発現場ではそんな事してられない。(-_-)
    というのは、Tweetクラスのソースを見てみるとgetter, setterは、フィールドをそのまま返す、設定するとしているだけであり、問題が起こる可能性はまずない。このようなgetter, setterのテストメソッドをイチイチ作っていたら時間がいくらあっても足らない。
    ということで、実際の開発現場ではgetter, setterのテストに関しては何らかのデータ加工を行っている場合だけ作っています。...閑話休題
  • 次はサービスクラスTwitterServiceを作成する。このクラスはモデルのTweetクラスをデータストアに格納する役目を担うことになる。
    では、build.xmlのgen-serviceタスクを実行し、サービス名に"TwitterService"と入力すると以下のソースが作成される。
    • src/(ルートパッケージ)/service/TweetService.java
    • test/(ルートパッケージ)/service/TweetServiceTest.java
  • 新しくソースを生成したのでテストを実行する...今回もGreen(OK)
    ここまで何回かテストを実行してきたけど、Red(NG)となったのは確か一回だけ。Green(OK)となるのが分かっているのに何でイチイチ実行しなければならないんだ、と思うよね。たしかにTweetServiceのソースは中身空っぽだし、TweetServiceTestではnotNullValue()[nullでない]のテストなのでGreen(OK)になるのは当たり前だよね。
    でも、ここで大事なのは「テスト作成」-「テスト実行」-「ソース修正」-「テスト実行」のサイクルを回して"リズム"に乗ること。さあ、リズムに乗って次に進もう。
  • 次はTweetService#tweet()メソッドのテストを作る。テストメソッドは下記のとおり。
    @Test
    public void tweet() throws Exception {
        Map<string, object=""> input = new HashMap<string, object="">();
        input.put("content", "Hello");
        Tweet tweeted = service.tweet(input);
        assertThat(tweeted, is(notNullValue()));
        Tweet stored = Datastore.get(Tweet.class, tweeted.getKey());
        assertThat(stored.getContent(), is("Hello"));
    }
    はい、ここで「あれ?」と気づいた人(^_^)/
    ……
    そう、TweetService#tweet()メソッドはまだ存在していない、eclipseのエディタで"tweet"のところに赤い波線がついていて「メソッド tweet(Map) は型 TwitterService で未定義です」とコンパイルエラーになっている。
    これが「テスト駆動」!
    テスト=仕様を書く→テストが通る(仕様を満足する)コードを書く、という具合にテストによって駆動される。
  • では、TweetService#tweet()メソッドを実装しよう。
    eclipseでは簡単、
    • エラーの出てる箇所("tweet")にカーソルを合わせて"Ctrl+1"を押す
      Tweet tweeted = service.tweet(input);
    • ポップアップから"型 'TwitterService'のメソッド 'tweet(Map)'を作成します"を選択する。
    • TweetService#tweet(Map)メソッドが作成される
  • これでコンパイルエラーが無くなったので、テスト実行...Red(NG)(-_-)
    tweet()メソッドはeclipseが自動生成して
    "return null"
    となっているので
    "assertThat(tweeted, is(notNullValue()));"
    でNG、ということでこの時点では正常。(テストが通らないことを確認することも大事)
  • それでは、テストを通すようにtweet()メソッドを実装する。
    public Tweet tweet(Map input) {
        Tweet tweet = new Tweet();
        BeanUtil.copy(input, tweet);
        Transaction tx = Datastore.beginTransaction();
        Datastore.put(tweet);
        tx.commit();
        return tweet;
    }
    
  • では、テスト実行...Green(OK)
あともう少しなんだが、日付が変わったしまったので今日はここまで。
m(_ _)m

※追記[2010.3.10 22:00] ソースコード部分を見やすくしました。(ソースコードHTMLコンバーターを使わせて頂きました)

2010-03-09

GAE/J + Slim3 [はじめてのSlim3(2)]

前回の続きで「Creating a form
  • war/twitter/index.jspのbodyタグ内を下記のように編集する
    <p>What are you doing?</p>
    <form method="post" action="tweet">
    <textarea name="content"></textarea><br />
    <input type="submit" value="tweet"/>
    </form>
  • 続いてこのフォームをsubmitした際の処理を行うTweetControllerを生成する。build.xmlのgen-controller-without-viewタスクで"/twitter/tweet"と入力すると以下のソースファイルが生成される("without-view"なのでjspは生成されない)
    • src/(ルートパッケージ)/controller/twitter/TweetController.java
    • test/(ルートパッケージ)/controller/twitter/TweetControllerTest
  • テストを実行してGreen(OK)となることを確認する
  • 次にテストクラス:TweetControllerTestを修正する。TweetControllerクラスは/twitter/tweet からリクエストを受けて/twitter/にリダイレクトすることになるので、それをテストするように修正する。
    run()テストメソッドの最後の2行を下記のように修正する。
    assertThat(tester.isRedirect(), is(true));
    assertThat(tester.getDestinationPath(), is("/twitter/"));
  • ここからが「テスト駆動開発」の面白いところ。(^_^)/
    テストを実行してRed(NG)になることを確認する。
    これはまず対象クラスのテスト=仕様をコードで記述すること、そしてそのテストが失敗となることを確認することである。
    この時点でテストがOKとなってしまったら変だよネ。だから"正しく"失敗することを確認しなければならない。
  • では、次にテストが通るようにTweetControllerのreturn文を下記のように修正する。これでbasePath="/twitter"にリダイレクトされるようになる。
    return redirect(basePath);
    
  • これでテストが通るはず。テスト実行...よし!Green(OK)だ(^_^)v
このセクションは少し長いので、今日はここまで。

ついでに「テスト駆動」について。「テスト駆動」では基本的に下記手順で開発を進める。
  1. テストを書く
  2. テストを実行して結果(通常失敗(Red))を確認する
  3. コードを修正する
  4. テストを実行して成功(Green)することを確認する
  5. リファクタリングする
  6. テストを実行して成功(Green)することを確認する
実際にソフト開発作業で「テスト駆動」で行っているが、旧来の開発作業と比べて一番のメリットは、精神的に楽に開発できること。(^_^)
 旧来のやり方だとテストを始めるのは、一クラス全部コーディングしてから、または複数のクラスをコーディングしていきなり結合レベルのテストをしていた。
仕様通りに動作するかどうか分からない状態のまま(精神的にはものすごく不安な状態)黙々とコーディングし続け、いきなり単体テスト/結合テストを行う。こんなの動くわけないでしょ(-_-
それに精神的に不安で高ストレスの状態でコーディングしていたらミスを起こす可能性も高くなる。
 テスト駆動では、まずテスト(javaの場合はJUnit)を書く。"テスト"というよりは"仕様"をコードで表すと言った方がピッタリくるかな。このテストもいきなりたくさん書くのではなくて、テスト対象メソッド一つについてのテストを書く。(テスト要因が多い場合には、まず正常系、次に異常系という具合に進めていくと整理しやすい)
このように少しづつ進めることで一歩一歩確実に前に進めるので、精神的に非常に安定した状態で開発ができる。それと[テストを書く]-[テスト実施]-[コードを書く]-[テスト実施]-[リファクタリング]というサイクルを繰り返すことでリズムが出てきて、「ここまでOK」、「次...ここまでOK」という感じでスイスイ前に進み感覚になり、楽しくなる。
もう一つのメリットは「回帰テスト」が楽にできること。テストプログラムなので何十項目のテストも実行すれば一瞬で完了する。なので区切りのついた時やコミットする前などには必ずすべてのテストを実施してレベルダウン(デグレード)が無いことを確認するようにしている。

 ユニットテストの効用については2年位前に買ったお気に入りの本「アジャイルプラクティス 達人プログラマに学ぶ現場開発者の習慣」の[5章 アジャイルなフィードバック]に色々説明されている。
この本、行き詰まった時などに読み返して[アジャイル]の初心にかえるようにしている。もう何回読んだかな?(結構影響受けたので、いずれこの本について書こうかな)
開発者なら「達人プログラマー―システム開発の職人から名匠への道」と並んで必読の本なので、まだ読んでない人はぜひ読んでくださいナ。
(↑Amazonの"商品プレビュー"を設定してみた、書籍名にマウスカーソルを合わせると本の画像がポップアップ表示されますよ)

2010-03-07

GAE/J + Slim3 [はじめてのSlim3(1)]

Slim3でアプリを作ってみる。
Slim3「Getting Started」-「Creating a controller and a test」に沿って進める。
  • プロジェクトの名前を"slim3-blank"から変更する
  • (プロジェクトroot)/war/WEB-INF/web.xmlの下記箇所の"param-value"の値をルートパッケージ名に変更する
    <context-param>
        <param-name>slim3.rootPackage</param-name>
        <param-value>tutorial</param-value>
    </context-param>
  • build.xmlの"gen-controller"タスクを実行する
  • コントローラのパス入力のダイアログが表示されるので手順通り"/twitter/"と入力する
  • すると以下のファイルが生成される(コントローラクラスとそのテストクラス、それとJSP)
    • src/(ルートパッケージ)/controller/twitter/IndexController.java
    • test/(ルートパッケージ)/controller/twitter/IndexControllerTest.java
    • war/twitter/index.jsp
  • "Webアプリケーション"が起動していなかったら起動する
  • ブラウザで http://localhost:8888/twitter/ にアクセスする
  • Hello twitter Index !!! と表示されればOK
  • テストクラスもあるのでテストを実行してみると...もちろん、Green(OK)
ここまで「あっと言う間」、テストクラスも含めて"サクっ"と作れてしまうのは凄く楽チン(^_^)
余計なことに惑わされずに中身に集中できそうだ。

仕事で「Teeda」を使った開発をしているが、これと同じ感覚で"サクサク"と進められそうだ。

2010-03-06

GAE/J + Slim3 [準備]

まずは、開発環境の準備から。
基本的には「スタートガイド」 に書かれているとおりに準備すればOK

次はSlim3、公式サイトの「Getting Started」に沿って進める。
まずはslim3-blankプロジェクトをダウンロード or エクスポートして、eclipseのプロジェクトとしてインポートする。
  • ダウンロード: http://code.google.com/p/slim3/downloads/list
  • Subversionリポジトリからダウンロードまたはエクスポート:http://slim3.googlecode.com/svn/trunk/slim3-blank/

Getting a blank project」に従って設定を進めて、このページの最後の[7.Running the Project]でプロジェクトが正常に起動できるか確認してみる。
  • eclipse[実行の構成]で"Webアプリケーション"を選択して新規作成する。
  • プロジェクトにインポートしたslim3-blankを指定する
  • すると
    [引数]: Projects using App Engine 1.2.6 or later require a Java agent. Add this VM argument:
    というエラーが表示されたので、表示された通りに[引数]タブの"VM引数"に下記のように指定する。
    -javaagent:(GAE SDKインストールパス)\com.google.appengine.eclipse.sdkbundle.1.3.1_1.3.1.v201002101412\appengine-java-sdk-1.3.1\lib\agent\appengine-agent.jar
  • エラーが消えたので実行してみると、今度はコンソールに下記のようなエラーが表示された。
    警告: Your working directory, (C:\e\workspace\slim3-blank) is not equal to your 
    web application root (C:\...\workspace\slim3-blank\war)
    「"working directory"が違ってるぞ」ということなので、「実行の構成」の[引数]タブの作業ディレクトリで"${workspace_loc:slim3-blank/war}"を指定して再度実行してみた。
  • 今度はエラーが出ず正常に起動された。とりあえず、ここまではOK! (^^)

「Google App Engine for Java」と「Slim3」に手を出してみる(^_^)

GAE/J(Google App Engine for Java)」が面白そうなので手を出してみることにした。
Slim3」を使うとアプリ開発するのが楽しくなりそうなのでこれを使ってみる。
ということで、「GAE/J」+「Slim3」で何か作ってみる。

GMailの容量、その後(3)

久々にGMailの容量を気にして見てみたら 7430MB(3/6 14:00時点)になっていた。
「GMailの容量、その後(2)」の時点(20092008/1/4)で 6280MBだったから2年で1GB増えたことになる。
使用率が 3%だから、これは当分使いきれないネ(^_^;

ページのテンプレートを変更してみた。ベース色は緑系で変わらないけど少し雰囲気が変わったかな。

2010-02-15

「Google 日本語入力」が快適(^_^)

2009.12に公開された「Google 日本語入力」が非常に快適だ。
公開された直後から自宅と会社のPCにインストールして2ヶ月ほど使い続けているが、それまで使っていた「MS IME」と比べると誤変換が少なくストレスを感じずにタイプできる。
誤変換があっても学習能力が高くてすぐに変換候補の上位に表示されるようになる。
また数文字タイプすると候補が出てくるので、以前に比べてタイプ量が減り、あまり思考が途切れず文章入力ができるようになった。
ゲーム、アニメ系の単語が候補に出てくる事があって、思わずニヤリとしてしまうところも好みだな。
「MS IMS」があまりにもアホなので「ATOK」に乗り換えようかとずっと悩んでいたが、今のところ特に問題はないので使い続けてみようと思う。(「ATOK」はもっと快適なのかな?)
今度は以前使っていた顔文字辞書をいれてみようかな。

2010-01-29

冷や汗タラッ...(-_-; VMwareホストに接続できない

VMware ESXでサーバーを仮想化して運用しているんだが、今日設定を見直していたところ"VMware vSphere Client"からホストに接続できなくなってしまった。(-_-;
何とか元通り接続できるようになったので、そのメモを残しておく。

問題が起きたのはホストのネットワーク構成を見直していいたとき、サービスコンソール用の物理アダプタの接続スピードが100Mと表示されていて、たしか1000Mだったはずと勘違いして(実際は100Mで正解)、"1000M"に変更してしまった。
すると...いくつかエラーダイアログが表示されて"VMware vSphere Client"からホストに接続できなくなってしまった。
ゲストOSにはWeb,SSHなどで接続できで正常に動作しているようなので、サービスコンソールの接続だけができなくなってしまったようだ。
サーバーを見に行ってみると、サービスコンソール用NICのアクセスランプが点灯しない。
どうやらサービスコンソール用NICの設定を変更したことでネットワーク接続できない状態となっているようだ。
こうなるとVMホストのローカルコンソールで操作して復旧するしかないのだが、VMwareのCUIコマンドなんて一つも知らない(;_;)
で、いつものようにGoogle先生に聞いてみたがそのものズバリの答えが見つからない。しかし"esxcfg-vswif"というコマンドがあることが分かったので、VMホストのローカルコンソールで"esxcfg-"で始まるコマンドを探してみたところ、"esxcfg-nics"というそれっぽいコマンドを見つけた。
さっそくヘルプを表示してみると
# esxcfg-nics --help

"-a"オプションがあって
"Set speed and duplex automatically. Requires a NIC parameter."
ということなので、これで設定してみた。
#esxcfg-nics -a nic名

設定内容を確認するには"-l"オプションを指定する。
#esxcfg-nics -l


これで大丈夫だろう...と若干不安を抱きながら自席に戻って"VMware vSphere Client"からホストに接続してみる。(ドキドキ)
IDとパスワードを入れて[接続]をクリック...
おぉっ、繋がった\(^_^)/
無事復旧しました。