|
|
||
「Eclipseで学ぶはじめてのサーブレット&JSP」という本を執筆しました。
内容は Servlet3.0 で、プロトコルの説明から入り、最終的に簡易Twitterアプリケーションを作るというものです。
Webということで(?)、T2プロジェクトの id:c9katayama, id:shot6, id:skirnir, id:yone098 にもガチンコのレビューをしてもらいました。
Servlet3.0 は結構良いので、よければお手にとって見てみてください。だって、web.xmlを書かなくて済むんだから。
Amazonなどでは既に予約できます。10/1発売となっていますが、9/28くらいには書店に並ぶと思います。
献本ありがとうございます。
執筆はT2メンバーでおなじみの大谷 晋平さん、米林 正明さん、片山 暁雄さん、横田 健彦さん、監修はISIDです。
今回、私はレビュアーとして参加しました。
Java1.4以前のベースがあるために、Java5以降の構文などを後ろの方で付録的に扱っている書籍やコーディング規約もありますが、
そうではなく、今の現状に合わせた内容としてJava5以降の事柄も当たり前としてきちんと記述されています。
「プログラマが知るべきの97のこと」という書籍がありますが、このJavaルールブックに関しては、知っておくだけではなく、実際にコーディング出来ておいて当たり前のことが非常に多く書かれています。別のタイトルをつけるなら「Javaプログラマが出来ておくべき○○のこと」でもOKだと思います。
出来るためには、先に知っておく必要がありますよね。なので、是非読んでください。
もちろん、プロジェクトごとに異なるルールもありますよね。そういう場合でも大丈夫です。
書籍の中で、ルールにはランク付け(★★★★★ほぼ無条件で適用〜★このようなやり方もあるという紹介まで)
がされているので、この★の数を見ることでカスタマイズするときの指針にも使えます。
それから、付録によく使う「Eclipseのショートカットの一覧」が載っているのも非常にうれしいです。
お勧めしたい方
仕事でJavaを使う人全員
それから、全国発売は2/15からですが、2/7から下記の書店で先行販売しているそうです。
・紀伊国屋 新宿本店
・紀伊国屋 新宿南店
・三省堂神田神保町本店
・有隣堂ヨドバシAKIBA店
・ジュンク堂 池袋本店
・丸善丸の内本店
というわけで、書店でみかけたらチェックしてみてください。
そしてそのままレジにGOしてくださいw
http://d.hatena.ne.jp/wkoichi/20101128/p1
ログ出力が単純な文字列だけならあまり気になりませんが、
文字列連結をしているような場合や
logger.debug("BEGIN ["+ hoge + "]");
メソッド呼び出しを行っている場合や
logger.debug("BEGIN ["+ hoge.getClass().getSimpleName() + "]");
文字列だけしか出力しないログでfor文の中で大量にログ出力する場合なんかでも、
ログにコードの行数を出力する設定をしていると、Log4Jの中で例外をスローしまくり(GCしまくり)なので効果があります。
入門書とかで触れといた方がいいのか?
wkoichi
if文でいくら分岐しようがdebugレベルのログを取得したい時には結局ロギングしますよね?
その際には例外をスローしまくるというように読めましたが、その理解は間違ってないですか?
それとも、僕が読み取れてない前提条件がありますか?
フレームワークのような使われ方が想定しきれいないコードを書いたことがないので、こういう問題に突き当たったことがないのです。
そもそも、プロダクトコードをJavaで書いたこともないですが。
skimura
> if文でいくら分岐しようがdebugレベルのログを取得したい時には結局ロギングしますよね?
> その際には例外をスローしまくるというように読めましたが、その理解は間違ってないですか?
> それとも、僕が読み取れてない前提条件がありますか?
常にdebugレベルなら、if文を書く意味は無いです。
前提としてはINFO以上にしたときに効果があるということです。
> フレームワークのような使われ方が想定しきれいないコードを書いたことがないので、こういう問題に突き当たったことがないのです。
> そもそも、プロダクトコードをJavaで書いたこともないですが。
ロギングの話は、フレームワークに限った話ではないですね。
プロダクトコードでも同じです。
あと、Javaに限った話でもないです。例えばRubyには「isDebugEnabled()」に相当する「debug?」というのがあります。
wkoichi
いやいや、debugレベルでログを取ることを想定しているから、logger.debug()とコードするけれども、普段はdebugレベルログを出力しないようにしているので、パフォーマンスが劣化しないようにif文を書きましょうという主張ですよね。それは、分かってるんですよ。
ただ、Log4Jの中で例外をスローしまくりなんて書いてあったので、結局debugレベルのログが欲しいときには例外をスローしまくるんですか?という質問だったのです。趣旨から外れた質問だったので、誤解させてしまったようですが。Javaで書いたことがないのでって書いたのは、Log4J特有の問題なんかは知らないよというアピールのつもりだったのですが、わかりにくかったですね。
しつこいですけど、個人的な経験ではログメッセージを組み立てる位のオーバーヘッドは、問題になったことがないんですよね。だから、パフォーマンスと可読性(ノイズは一行たりともコードに持ち込みたくない)を天秤にかけて、if文はやっぱり書かないですね。もし、問題になったら、その時に考えますよ。
skimura
ログレベルに関係なく、ログ情報として「行数を出力する時」は例外がスローされます。これは特有の問題です。
最初からパフォーマンスを意識するよりは、キレイなコードを書いた方が良いとは思いますが、
よく利用されるライブラリや〜Utilのようなクラスはその辺を意識した方がエコですね。
あたらしいみかんのむきかた
http://www.amazon.co.jp/exec/obidos/ASIN/4092271468/amazonbooks08-22/ref=nosim/
うさぎとか
しました。
http://code.google.com/p/samurai-reloadable/
■変更点
V1.0.0からの変更点は次の通りです。
●Bug修正
・Issue 1 Servletの場合load-on-startupを付けないとNullPointerExceptionが発生する
「フレームワークの作り方の本を書いたので推薦の言葉を書いてもらえませんか?」と頼まれたとき、なんてニッチな本を書くんだろうと思いました。しかし実際に原稿を読んでみて思ったのは、この本は、アーキテクトを目指している人にとっての「はじめの一歩」にちょうどよい、ということです。
この本の中では、ハーベスト君とよばれる「アーキテクト見習い」が出てきて、先輩に導かれながら、アーキテクトとして知らなければならない知識を学んでいきます。その知識は、アーキテクトを目指すあなたにとっても役に立つはずです。
アーキテクトになるためには、これこれこれの本を読んだら終りということはありません。勉強に終わりはなく、勉強したことをつねに実戦で磨きあげていく必要があります。
間違った道に進まないための「はじめの一歩」として、本書はあなたの役に立つでしょう。
2010年6月 ひが やすを
358ページまでのコードを書いたのですが、ユーザー登録ができずエラーになります。一応サポートサイトの6章をダウンロードしてそのままeclipseにコピーしてみたのですが、それでも同じエラーが発生します。
エラー内容
HTTPステータス 500
説明 The server encountered an internal error () that prevented it from fulfilling this request.
例外
java.lang.NullPointerException
chapter6.utils.DBUtil.rollback(DBUtil.java:69)
chapter6.service.UserService.register(UserService.java:33)
chapter6.controller.SignUpServlet.doPost(SignUpServlet.java:46)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
chapter6.filter.EncodingFilter.doFilter(EncodingFilter.java:30)
CREATE TABLEしていない可能性などが考えられますが、どうでしょうか?
原因がつかめないようでしたら、下記のようにコードを変更してみてください。
} catch (RuntimeException e) {
e.printStackTrace(); // この行を追加
rollback(connection);
throw e;