「Javaツール完全理解」という本を書きました(プレゼントもあるよ)

3/14に日経BP社より「Javaツール完全理解」というムック形式の本が発売されました。

Javaツール完全理解 (日経BPパソコンベストムック)

Javaツール完全理解 (日経BPパソコンベストムック)


私は「第1部」と「第3部」の約150ページ分を執筆しました。2010〜2011年に日経ソフトウエアで連載していた「じっくり学ぶJavaツール」の記事と、2010年に寄稿した特集記事、プラス今回のための書き下ろした記事などが収録されています。

第1部では、Java開発を行う上で欠かせないツールである Eclipse, JUnit, Ant, Subversion, Hudson(Jenkins), Maven, Coberturaなどの活用方法を紹介しています。第3部では、Javaを用いたWebアプリケーションの設計・実装・テスト手法を詳細に解説しています。

とくに第1部で紹介しているツールは、自分自身が仕事をしていく上で欠かせないと感じているものだけを取り上げているので、実際の開発現場でもすぐに活用できるような内容になっていると思います。ある程度Javaでプログラムを書けるようになったけど、もっと効率よく開発できるようになりたい、という方に読んでいただけると嬉しいです。

なお、第2部、第4部はじゅんいち☆かとうさんによる記事です。http://d.hatena.ne.jp/j5ik2o/20110313/1300001708 でも紹介されています。

で、編集部より見本誌を2冊多く頂いたので、もし読んでみたい(タダで!)と言う方がいれば、Twitter(@kenmaz)やgmail(kentaro.matsumae@...)などで連絡していただければプレゼントいたします。どしどしご応募ください(・・・希望者がいなければ実家の両親あたりに記念品として押し付けよう)。

CakePHPのmodel.phpをオーバーライドしたらFatal Error

最近CakePHPを使い始めたんだが、いきなりハマったのでその詳細を書いておく。

再現手順

  • 環境:PHP5.3.5+CakePHP1.3.6
  • CakePHPでは、すべてのモデルクラスの共通処理をapp/app_model.phpに書くのが流儀である。
  • というわけで、app_model.phpを以下のように書いてみる
class AppModel extends Model{
   function __construct() {
        parent::__construct();
        //なにか処理
    }
}
  • 次に、次のようなモデルを定義する。hasManyでBlogモデル同士で親子関係をもたせている。
class Blog extends AppModel {
    var $hasMany = array(
        'Parent' => array(
            'className' => 'Blog',
            'foreignKey' => 'parent_id',
        ),
    );
}
  • 最後にwebブラウザで適当なコントローラにアクセスすると・・・・
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 523800 bytes) in /xxx/cake/libs/debugger.php on line 94
  • Fatal errorで落ちます

何が駄目だったのか

  • AppModelのコンストラクタ引数が空だったのが問題
  • Modelクラスのコンストラクタ内でClassRegistry::addObjectしてるのだがコンストラクタを上書きして隠してしまっているので、いつまでたってもClassRegistryにクラスが登録されず、hasManyの解釈時に「Blogクラスがいないよー、Blogクラスがいないよー、・・・」といつまでも騒ぎ続けて、そのうちメモリがいっぱいになるのであった。
  • コンストラクタをオーバーライドしたいのなら以下のようにすべし
class AppModel extends Model{
   function __construct($id, $table, $ds) {
        parent::__construct($id, $table, $ds);
        //なにか処理
    }
}

結論

  • フレームワークのクラスをオーバーライドしたいときは、とりあえず対象のコードに目を通しておこう
  • エラーが発生するのはいいんですけど、このエラーメッセージから原因を特定するのは難しい
  • てかCodeZineで紹介されているこの記事(http://codezine.jp/article/detail/670?p=2)のサンプルコードはダメなんじゃないか
  • CakePHP触ってまだ1週間くらいなんで間違っている点があれば教えてください

ドラム練習

今日はドラムの練習をしに五反田のスタジオに個人練習に行った。バンドやってたときなんかは何度もスタジオ入ってたけど、ひとりで、しかもドラムを叩きにスタジオに入るなんて初めて。何でドラムを叩く必要があるのかと言われれば特に大きな理由はない。なんとなくドラムを練習したい年頃なのである。で、はじめての個人練の感想を書く。

  • セッティングに時間がかかる。最初の10分はひたすら各楽器の調整。やたらとハイハットが高い位置にあったりクラッシュの角度が微妙だったりするので調整は必須。バンドで入るとだいたいドラマーのセッティングが遅くて早くしろよ、と思っていたけどこういうことだったのね・・・。
  • バスドラム難しい。全体的にドラムって難しいんだが特にバスドラムが思った以上に難しい。かかとをつけて踏むと割と安定するけど脛がしびれてくるし、かと言ってかかとを上げて踏むと雑になってしまう。自宅で練習するときはいつも床を足で直接叩いてバスドラムの練習をしているので、ペダルに慣れないと話にならないっぽい。
  • テンポキープできない。とくに足がモタる。
  • ライドシンバルのリムショットを一定の音量・音質で叩くのが難しい。
  • タム回しはなんか適当にやったら意外とそれっぽい感じに叩ける
  • iPodで音楽を聞きながら練習すると楽しいけど、ヘタさがごまかせるので、あんまり練習になっていない。
  • 1時間はあっという間

とかとか。またそのうちはいろう。

あけましておめでとうございます

いまさらだけど、あけましておめでとうございます。昨年の今頃はちょうどニコ生アプリの開発とかで楽しく忙しく過ごしてましたが、今年も年明け早々新規プロジェクトをすすめており、楽しみな毎日を送っております。仕事以外では、なんといっても初ジュニア誕生という大イベントが控えているので、そちらもドキドキワクワクしています。
ところで、今日ふと本屋で「グーグルで必要なことは、みんなソニーが教えてくれた」という本を見つけて、すごく気になったので早速購入して一気に読み終わりました。

グーグルで必要なことは、みんなソニーが教えてくれた

グーグルで必要なことは、みんなソニーが教えてくれた


著者は、元ソニーでVAIOスゴ録を産み出し、その後グーグルの日本法人の社長をやっていた辻野晃一郎さん。特に面白かったのが、前半から中盤にかけてのソニーの栄光と凋落のくだり。いかにしてソニーが駄目な感じになっていき、そのなかでいろいろ苦労してきたか、ということが書かれている。「コクーン」やら「PSX」やら「ソニックステージ」やら「ATRAC」やら、いろいろ懐かしい製品の話が取り上げられていて、なるほど内部ではこんな経緯があったのかって感じ。そーいや俺が新卒の初任給で買ったのがソニーのNW-MS70Dだったなー。当時はデザインがかっこいいと思って買ったけど、物理的に速攻で壊れたし、ソニックステージやATRACは糞だった記憶しかないな。
SONY NW-MS70D ネットワーク ウォークマン

SONY NW-MS70D ネットワーク ウォークマン


で、本の後半はグーグルがいかにすごいか、クラウドがあーだこーだの話で、まあどーでもいい感じだったけど、全体としては結構おもしろかった。ソニー関連の話が多いだけあって、品川やら大崎やらウチのご近所もいっぱい登場したし。。。
それにしても久しぶりにブログ書いたな。

AdMob広告の威力を調査するためのアプリ「剣道」をリリースしたのだった

AdMob広告ってどれくらい儲かるのかなーと興味があったので、過去に作ってお蔵入りしていたiPhoneアプリを適当に手直しして適当に審査だした。AppStoreより無料でダウンロードできます。

ダウンロードはこちら。http://itunes.apple.com/jp/app/id392501848?mt=8

でAdMobがどれくらい儲かるかというと、アプリ一本あたりコンビニのアルバイト1〜3時間/日って感じかな。もちろんアプリの人気具合にもよりますが。

実装tips

iPhoneアプリを作る上で、よくハマるところや忘れがちなテクニックについてメモっておく。Twitterだと検索しづらいので。

IBを使ってUITableViewCellをカスタマイズする

http://d.hatena.ne.jp/KishikawaKatsumi/20081024/1224857278
基本的には上記エントリで紹介されている方法を使えばOK。必要なければUIViewControllerのサブクラスは作らなくてもいい。

IBを使ってUITableViewを内包したビューをつくると罫線がにじんだように表示される

サブビューにUITableViewを追加して、UITableViewのStyleを「Grouped」にすると、デフォルトでUITableViewのSeparatorが「Single Line etched」になる。この状態でアプリを起動すると、グループ化されてたテーブルの上端の罫線がにじんだように表示される。Separatorを「None」にすればOK。

AdMobの広告が表示されない

AdMob SDK付属のREADME.txtで説明されているIBを使った実装手順どおりに実装しても広告が表示されない。手順書に漏れがあるため。README.txtの「Step5(iPhone)」の、パブリッシャーIDを登録する前に以下の作業が必要。

In the UIViewController that owns the xib, create an AdViewController
IBOutlet that retains. Establish a connection from the owner UIViewController to the AdViewController. Remember to release the AdViewController in the UIViewController's dealloc method.

ちなみに上記説明文は「Step5(iPad)」のほうには書いてあるのに、iPhoneのほうには書いてない。