http://www.bookscan.co.jp/ iPhoneとかを使って本(のPDF)を読むために、 裁断機とScanSnapを購入する人もちょこちょこいると聞きますが、 それを1冊100円という低価格で行うサービスが、ちょっと話題になってます。 いいなこれ。 とりあえず、本棚の本を、まとめてPDFにしてもらおかな。
Jadが大好きなんだけど、Java5以降の文法に対応してないから 若干やきもきしつつもガッカリしている皆さん、こんばんは。 名前そのまま、Java Decompilerというツールがありました。 http://java.decompiler.free.fr/ Java6まで対応しており、 Eclipseプラグインとしても、単体のGUIアプリとしても使えるスグレモノです。 Java5のアノテーションやGenrics、foreach文なんかの復元にも対応しており Jadが「デコンパイル失敗しました(><)」とすぐに根を上げていたクラスも 開けるようになるんじゃないかと思います。 ということで、早速試してみました。 GUI版 http://java.decompiler.free.fr/?q=jdgui#downloads ここからダウンロードして、解凍して実行するだけです。簡単です。 GUI版
「HashMapのputとgetを同時に行うと、無限ループが発生する」という事は Javaエンジニアな皆さんならご存知だと思います。 1. 無限ループの再現 まずは論より証拠、無限ループになることを確認してみましょう。 こんなテストコードを書けば、すぐに再現できます。 public void testHashMap_無限ループ() throws InterruptedException { final Map<Integer, Integer> map = new HashMap<Integer, Integer>(); Runnable runnable = new Runnable() { public void run() { for (int i = 0; i < 1000000; i++) { int key = i % 10000; if (map.containsKey(ke
JavaのBCIとかオンデマンドアタッチ(Attach API)じゃなく、 デバッガAPIでホゲればJava1.4でも使えるから便利だゼとかっていう アイデアだけはあったんですが、川口さんが形にしたようです。 YouDebugはデバッガであると同時にデバッガではありません。YouDebugは、Java Platform Debug Architecture上に作られているので、他のプロセスにアタッチしたり、変数を参照したりブレークポイントを設定したりと、デバッガができる全ての事ができます。そういった意味では、YouDebugはデバッガです。 しかし、YouDebugには対話性がなく、ソースコードも必要ありません。プログラマがGUIとマウスを使って駆動するわかりに、YouDebugはDSLライクなGroovyスクリプトを使って駆動されます。これによって、プログラムに関する知識を持ちスクリプト
Java7の細かな言語仕様の変更を扱うProject Coinですが、 色々な案が出ていたうち、採用するものが決まったそうです。 Joseph Darcy has published Project Coin's final list of approved changes to the Java language for the forthcoming version 7 release. Project Coin Announces Final List of Small Language Changes - InfoQ C#のusing風にリソースを扱うAutomatic Resource Managementもめでたく採用。 いちいち自前でcloseしなくても、自動的にcloseしてくれます。 try (InputStream in = new FileInputStream(sr
このorderメソッドの中で、itemオブジェクトの属性に 矛盾がないかどうかの整合性チェック(Verification)を行ないます。 Webアプリケーションを作るなら、まずサービス設計をする。 - 谷本 心 in せろ部屋 なにげにVerificationと書きましたが、 これについて、以前も書いたことがあります。 http://d.hatena.ne.jp/cero-t/20070731/1185892239 要するに、バリデーションは「ユーザビリティ向上」のためと捉えて、 それ以上のものは、全部Verificationで行ないます。 Verificationまで到達した段階で、 想定される用途で使っていたユーザーには、正常にデータをコミットさせますが 悪意を持って、あるいは意図しない操作を行なったユーザーには、エラーを返します。 ただ、Verificationのコードは、バリデーシ
HTMLベースのWebアプリケーション開発で、画面を設計する際のベストプラクティスは 「GUIベースのアプリケーションとして考え」「それをJSPとActionに分離する」です。 こうする理由は、「本質的にService呼び出しが必要な箇所を洗い出すため」です。 ちょっと長めのエントリになりますが、この結論に至る経緯を説明していきます。 まず、GUIで画面を考えたら、 これをJSPとAction、Serviceに分離していきます。 もちろん、GUIの1画面は、1つのJSPファイルでは実現できない事がほとんどなので 複数のJSPファイルに分割して、「入力1」「入力2」「確認」「完了」など ウィザード風の画面分割を行なっていきます。 ここで注意するのは、「GUIのクライアントで閉じた処理」(=画面の処理)に相当する処理は、 JSPとActionで書ききる、ということです。 画面に関連する処理を、
HTMLベースのWebアプリケーションを作る際のベストプラクティスは 「まずサービスを設計する」に尽きると思います。 HTMLからDBまでをひっくるめて設計したりするから、 ActionとServiceの切り分けがよく分からなくなったり、 多重リクエストや、ブラウザの「戻る」ボタン、URL直リンクなんていう ブラウザ独特の問題に悩まされたりするのです。 Webサービスからでも呼べるような、 あるいは、直接呼び出しても大丈夫なような 独立性の高いサービスから設計していれば、 健全・堅牢なシステムを構築できます。 具体的な例として「発注処理」で考えてみましょう。 発注を行なうためのサービスを以下のように定義します。 public void order(Item item); このorderメソッドの中で、itemオブジェクトの属性に 矛盾がないかどうかの整合性チェック(Verification
さて、昨日の続きです。 実は[Profiler]タブを開いた時に、Warningが出ています。 VisualVMは、問題がある時に、結構こうしたエラーメッセージが出て 何をすべきかを教えてくれます。 エラーメッセージに記載されたリンク先の解説を読めば 起動引数に「-Xshare:off」を入れろと書いてあります。 早速、Tomcatのbin/catalina.batでJAVA_OPTSを編集してる箇所に この起動引数を追加しましょう。 set JAVA_OPTS=%JAVA_OPTS% -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties" ↓ set JAVA_OPT
VisualVMを使って、 ローカルPC上のTomcatで動くWebアプリケーションの プロファイリングを行なってみましょう。 前準備 http://tomcat.apache.org/ よりTomcat6をダウンロードして解凍する。 http://sastruts.seasar.org/ より SAStrutsチュートリアルをダウンロードして解凍する。 SAStrutsのwebappのフォルダ名をsastrutsに変更して、Tomcatのwebapps直下にコピー。 Tomcatのbin/startup.batなどを叩いてTomcat6を起動する。 http://localhost:8080/sastruts/ にアクセスする。 これでWebアプリケーションが動き始めます。 今回はSAStrutsを使いましたが、別に何でも構いません。 VisualVMの起動 https://visual
最近、ちょこちょこJAXBを使ってるんだけど、 形の決まったXMLの読み書きが、すごくラク。 アノテーションとJAXBの組み合わせが、とてもヨイ。 どんな感じヨ? っていう人は、このあたり見ればピンと来るかも。 http://www.sbirobo.com/2007/11/jaxb.html このJAXBを使って、XHTML出力も出来るんじゃない? って思ったら 既に、うのるいもさんがやってた。 http://www.ruimo.com/2006/03/03/1141390674449.html JavaのオブジェクトモデルでXHTMLを記述する例ですが そういうのもアリだなって思います。 逆のXHTML → オブジェクトモデルの変換もできるのかな? もし相互変換ができれば、たとえばXHTMLを編集するような Eclipseプラグインを作る時に、モデルとしてそのまま使えそうだし。 ちなみに
S2Struts1.3.0-RC2と、S2Container2.4.19の組み合わせで publicフィールドを試してみた。 この組み合わせでバインドする/しないは以下の通り。 ○ : ActionにService ○ : ActionにHttpServletRequest × : ActionにActionForm × : Actionにクエリ文字列のパラメータ ○ : ActionにDxo ○ : ServiceにDxo ○ : ServiceにDao × : ActionFormのフィールド 予想通りの挙動でした。 Action絡みの所は、どうしてもprivate + setter/getterにせざるを得ず、 現時点では、全体をpublicフィールドで統一することは、出来ないようですね。 S2Struts自身がpublicフィールドに対応すれば、 ×の所も○になるのでしょうけど、さ
S2StrutsのMap-backed ActionForm絡みでもうひとつ。 クエリ文字列に xxx=yyy という記述を含めておいて、 Action側に setXxx(String str) メソッドを作っておけば 自動的に値がバインドされる。これは便利。 でも、クエリ文字列に xxx(yyy)=zzz という記述を含めて Action側にsetterやgetterを作っても、値はバインドされない。残念。 これができたら、簡単にMapを画面間で持ちませそうなんですけどね。 (もちろん、いっそうのセキュリティチェックは必要ですが) たとえば、検索条件をMapに入れておいて、 ページングのリンクにMapをクエリ文字列として入れておく、 みたいな用途に使えるかな、と思いました。 今のところ、 [JSP] 検索条件入力画面で検索条件を入力させる [Action] 検索条件をMap-backed
StrutsのActionFormは、 Map-backed ActionForm(マップバックドアクションフォーム)とか、 List-backed ActionForm(リストバックドアクションフォーム)とか使えて便利。 http://struts.apache.org/1.3.8/userGuide/building_controller.html#map_action_form_classes 使い方なんかは公式のドキュメントを参照。 で、S2Strutsで、このMap-backed ActionFormを使う場合、 JSP側の記述は、ドキュメント通り <html:text property="xxx(yyy)" />という記述でOKだけど、 ActionForm側の記述はドキュメント通りにいかない。 public String getXxx(String key) { return
旅行をする時には、その土地で一番旨いものを 食べなきゃ気が済まなかったりするわけですが、 土善旅館の周りにも、オススメのお店がありました。 割烹たべた (http://www2.ttcn.ne.jp/~tabeta/) 天然うなぎを、2000円代で食べられるお店。 土善旅館から多分2kmぐらい、歩いて2〜30分ぐらい。 マジウマー。 旨み成分たっぷりです。 僕、子供の頃から、小骨が多いせいでうなぎが苦手で、 長じてからも、うなぎを好きになる事はなかったんですが、 そのうなぎ嫌いが一変するぐらいの絶品。 ちなみに、前回行ってあまりにも旨すぎたので、 今回は自分だけ、天然ではなく、養殖うなぎを注文したんですが、、、 、、、 天然うなぎサイコー! 一山いけす ([http://www.ichiyamaikesu.co.jp/) 今回の合宿では、帰りに(反対方向の)銚子に足を伸ばしてみました。 で
もちろん、Action → Service間は、リモート呼び出しじゃなくて 同一コンテナ内のgetComponentでOK。 ただしその場合、Service内で動いているオブジェクトを 外側から書き換えられないようにする必要がある。 具体的には Dtoのライフサイクルをリクエストにする 1セッション1リクエストになるようにsynchronizedする Serviceの呼び出し前にディープコピーを作って渡す のいずれかをやればOK。
前から書く書く言って、書いてなかったので。 水色:クライアントサイドで処理 黄色:サーバサイドで処理(Action部) 緑色:サーバサイドで処理(Service部) 点線矢印:リモート呼び出し (REST、JSON、SOAP、getComponentなど) 実線矢印:同一マシン内呼び出し 実線棒線:同一マシン内のAOP的な呼び出し Webアプリケーションを構築するときに、 Actionまでまとめて「HTMLクライアント」って考えることで 「リッチクライアント」と同等に並べる事ができるよね、って話。 図から見ても分かるように、 FlexやSilverlight、あとSwingとかUrumaみたいな いわゆる「リッチクライアント(RIA)」の責務と、 「HTML + Action」の責務は、ほぼ同等でしょう。 それを利用して HTMLベースのアプリケーションを構築する時に、 いったん「RIAだ
セッションを使うと、 サーバサイドのリソースを食う なんて表向きな理由もあるんだけど、 それよりも自分が思っているのは、 セッションのオブジェクトがService以降を走ってる途中に、画面から書き換えられる可能性があるなんて怖すぎる ↑の問題を防ぐために、わざわざ1セッション1リクエスト制限(sessionオブジェクトでsynchronize)なんてやりたくない そもそも、セッションが切れただけでエラーになるのって、腹立つじゃん。 そうは言っても、ロードバランシングって面倒じゃん。 という辺り。 たぶん、この辺りが解消されない限り、 ステートフルなフレームワークを、自分が率先して使う/推薦する事はないと思う。 ついでに、JavaScriptを使いたくないのは ブラウザのバージョンを決められる要件だったら、むしろFlexかAIRかSilverLight使うから! ということ。
JJUGのパネルディスカッションを受けて、、、というわけじゃないんだけど、 結構前から、ステートレス&ブックマーカブル&Non JavaScriptな Webアプリをマジメに作るための方法を考えてます。 そんな考えの中身を、ちょっとだけ。 ■Webフレームワークの選択 「S2Struts」が結論。 S2JSF、TeedaみたいなJSF勢は、どうしてもコンポーネントツリーがセッションに保持されるし。 コンポーネントツリーをクライアントに保持することもできるそうだけど、、、ごめん、試したことない。 そもそもS2JSFもTeedaも、JavaScriptほぼ必須だし。 確か、S2JSFは内部でセッションを結構使ってたはずだし。 S2WicketやS2Clickは、ごめん、ちゃんと調べてない。 そんな感じで、無難にS2Strutsを選びました。 (2007/11/10修正。Teedaはセッションで
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く