2010年04月27日
Javaコーディング規約が公開されました
エスエムジー株式会社にて、Javaのコーディング規約が公開されています。
Javaコーディング規約
このコーディング規約は、開発者自身の経験、および、最近のJavaの動向を踏まえ、
現場で本当に役に立つノウハウをまとめたものです。
そのため、Eclipseで自動でフォーマットできるような簡単なスタイルの規約については
記述を省略し、より重要となるコーディングテクニックや考え方について記述しています。
これからJavaを学ぶ新人の方はもちろん、開発者の技術力向上に繋がる内容に
なっていると思います。
Eclipseのコードフォーマッタの設定ファイルも公開されています。
2009年04月22日
Google App EngineのSMS認証ではまらないために
Google App Engineでは、Application IDを取得するために携帯電話のSMSを使った認証が間に入ります。
アカウント取得のタイミングではなく、Application IDを
取得するタイミングで、認証コードを送信する先の
携帯メールアドレスを要求されます。
ここで、過去の別アカウントの認証に利用したアドレスを
入力すると、既にそのアドレスは使われていると怒られてしまいます。
Python版の認証に利用したアドレスもNGです。
(少なくとも、私はダメでした。)
携帯電話の番号も指定できるのですが、auの場合は無理っぽいです。
そこで、やむを得ず友人のアドレスを借りました。
IT業界じゃないので、面倒でしたが。。。
携帯アドレスくらい、二つは持っておけということですかね。
2009年04月14日
Google App Engine for Javaのアカウント取れました
Google App Engine for Javaのアカウントは、先着10,000名に限定されているという話でしたが、
今日(4/14)の時点で取得できました。
Googleのドキュメントに10,000名という記述が
見当たらないので、制限を変えたかもしれませんね。
もしかしたら、まだ10,000名に達してないのかもしれませんが。
"Uploading Your Application"より
During this "early look" of Google App Engine for Java, the ability to upload Java applications to App Engine is reserved for a limited number of developer accounts. All users will be able to upload Java apps when we do a full release of Google App Engine for Java in the near future.
サインアップは、こちらからできます。
http://appengine.google.com/promo/java_runtime
その代わり、アカウントごとに10個のアプリIDしか取得できない、
つまり10個までしかアプリケーションをアップロードできない
という記述がありますので、不用意にアプリをアップしないように
注意したいところです。
同じく"Uploading Your Application"より
There is no way to delete an application in App Engine. You can register up to 10 application IDs per Google account. If you do not want to use one of your allotted application IDs for the tutorial, you can just read this section, and refer to it later when you are ready to upload your first application.
【追記】
登録開発者は、4/15の時点で2万5千人に達していたようです。
やはり、1万人の枠は拡大したみたいですね。
2009年04月13日
思ったよりGAEのJavaは制限されている
Google App Engine Javaについていろいろ調べながら、
Googleのドキュメント「The Java Servlet Environment」を読んでいた
のですが、思った以上に制限が厳しいですね。
当初から情報は見かけていましたが、以下のような制限が明記されています。
- ファイルシステムに書き込むことはできない
- システムコールの実行ができない
- スレッドの生成ができない
2番目は、システム的に無理なのは当然かな、という感じです。
このあたりは仕方ないでしょうね。
しかし、スレッド生成ができないのは厳しいですね。
使い慣れたプログラミングパターンが使えなくて困ることがありそうです。
ただ、current threadに対しては、メソッド実行が許可されているみたいですね。
加えて言うと、当然かもしれませんが、Java VMのオプションが指定できなそうです。
ドキュメントには明言されてませんが、そのための口が見つからないので、
たぶん間違いないと思います。
そのため、「-XX:+PrintClassHistogram」や「-javaagent」といった
解析に使われるオプションは全く使えませんね。
何かしら嵌った時には、痛い目にあいそうです。
2009年03月26日
なぜ「EclipseバンドルのGlassFish」がリリースされた
マイコミジャーナルより
「Sun Microsystems、EclipseバンドルのGlassFishをリリース」
私の知る限り、あれだけNetBeansを推しているSunが
EclipseバンドルのGlassFish(英語からすると「GlassFishバンドルのEclipse」が正しいような)
を出してきたのか謎である。
GlassFish同根版のNetBeansも存在するようではあるが。
やっぱりIBMのSun買収話は結構進んでいるのか
・・・というのは邪推のしすぎかなぁ。
この邪推はともかく、個人的にはIBMがSunを買収するとすれば、
UNIXサーバだけでなく、今流行の「クラウド」ビジネスも視野に入れている
と個人的には見ている。
IBMのBlue Cloudはいわゆる「プライベートクラウド」であり、
世間の流れとは間逆に進んできてしまったと言える。
一方のSunは、「Open Cloud Platform」を買収情報が流れた直後に
発表しており、IBMのBlue Cloudとは相補的な関係になると思う。
買収の情報が流れた後のSunの発表が
買収を促すための情報に見えて仕方ないのは私だけだろうか。
2008年02月24日
第39回 JavaEE勉強会
第39回のJavaEE勉強会に参加してきた。
今回は、ちゃんとポジションペーパーを作って参加。
先月参加したことで、あまり凝る必要は無いのが分かったので、
ノリで書いてすませた。
前回よりも今回は輪講の説明も丁寧だったし、
発表ネタも豊富にあって面白かった。
特に、koichikさんの「ソフトウェアトランザクショナルメモリ」と
その実装ライブラリ「DSTM2」についての発表、
もなじろうさんの「Android」の発表が面白かった。
Andoroidについては、当然のごとくニュースやblogを
追いかけていて、Dalvik(ダルヴィーク)の起源なんかも
知っているわけだが、プログラミングはしてなかったので、
改めてみると面白そうだと思った。
でも、Androidのコアの上で、Qtopiaを動かしたい
というのが本音なんだが(^^;
そういえば、以前見た時には気づかなかったが、
Androidのコアに「libc」って書いてあるのに気づいたのだが、
あれはどこ由来なんだろう?
glibcとは思えないし。
そういえば、ひがさんとsugaさんには
ずいぶんと久しぶりにお会いしたな。
2008年01月26日
第38回 Java EE勉強会
第38回 Java EE勉強会に行ってきました。
場所は、三田。
JavaEE勉強会への参加は、2006年3月25日の第17回
以来ということで、1年10ヶ月ぶり。
自己紹介(ポジションペーパーの発表)のところでは
約1年ぶりとか言っていたけど、それどころじゃなかった(--;
内容は、「Java 並行処理プログラミング」
の輪講であった。今日は、8章と9章が対象。
この本、頭からは読んでいないのだけど、
今日の内容は理解できた。Javaのマルチスレッド
プログラミングについて知っていれば、
たぶん難しい内容ではないのだろう。
できれば次回までには、一通り読みたいのだが、
「RESTful Webサービス」
も読みたいので、悩みどころだ。
会の途中でkoichikさんが間違って2冊目を買ってしまった
「デバッガの理論と実装」
をタダで頂いてしまった。
額と価値を考えれば、非常に貴重な頂き物である。
#みんなが遠慮したからで、力ずくでもらった
#わけじゃないですよ。
そういえば、koichkさんの今年の抱負でGHCって
キーワードがでていたけど、「Guarded Horn Clauses」の略
ってことで合っているのかな?
次回は、2/23が仮の予定日とのことで、
懇親会はまた無理そうだが、できるだけ参加したい。
2007年11月12日
Seasar Conference参加できず残念
体調が優れず、Seasar Conference参加できませんでした。
最近は、Seasar関係者の方々とお会いできてませんなぁ。
特に、t-wadaさんのテストについてのセッション、
S2Muleは興味が有ったので、見たかったな。
前みたいにビデオ放送してくれないだろうか。
それと、ひがさんが最近取り組んでいる、脱CoC、
「流れるようなインタフェース(Fluent Interface)」についての
議論もしてみたかったのだけど。
脱CoCの根拠として、学習コストが高いことと規約による
ブラックボックス化を挙げているけれども、
「流れるようなインタフェース」を本格導入すると
結局学習コストやブラックボックス化もするよねとか。
なぜなら、「流れるようなインタフェース」が適用されている
ドメインに対する「正しい(フレームワークと適合している)」
理解をしなければ、使えないだろうから。だから、ドメインについての
何らかの規定の記述と理解が必要になる。それに、Javadoc等の
APIドキュメントからじゃ使い方分からないしね。
どちらも使い方に関するドキュメントが整備されてなければ、
使いこなせないし、整備と徹底がされていれば
使いこなせるだろうと思っているのだが。
それに、どちらか一方というような宣伝文句は
なんか違う気がするのだが。私の理解が間違ってなければ、
CoCと「流れるようなインタフェース」は相互補完する
使い方の方が効果が高いと思っているのだけど。
まあ、S2JDBCの範囲なら、あまり議論してもしょうがない
気もするけど・・・とかね。
JDBCJavelinも評判が良かったようで。
遠めに協力している人間としても嬉しい限り。
そういえば、最近は技術とは全然関係ない交流会には
割と行っているだが、技術系には参加できていないような。
Java EE勉強会とか、HP-CA研究会とか行きたいなぁ。
2007年11月08日
RedHatがOpenJDKの開発に参加
RedHatがOpenJDKの開発に直接参加することになった。マイコミジャーナル:Red Hat、OpenJDKの開発に参加
現在のOpenJDKは、プロプライエタリなソフトウェアを一部含んでいた。
そのため、RedHatは、OpenJDKをベースにフルオープンソースのJDKを作る
The IcedTea Projectを開始していた。
今回の発表をきっかけに、同プロジェクトの成果がマージされることになれば、
真の意味でのOpenJDKが誕生することになる。
さらに、Java全体がオープンソース化されるだけでなく、コミュニティの成果が
取り込まれる方向に進めば、コミュニティの力でJavaが進化する
ことも考えられる。当然、Java開発者にも利益が出てくるだろう。
2006年05月15日
Seasar Conference 2006 Springに参加してきました
Seasar Conference 2006 Springに参加してきました。とても面白かったのですが、今日は時間が無いので、
詳細は、明日書く予定。
アンケートもまだ書いてない(帰宅時には、ページがなかった)
ので、書かなきゃ。
2006年04月29日
GEFのViewをリアルタイムに更新できない...
GEFを使ったアプリケーションで、Viewのリアルタイム更新ができなくて、はまってます。
draw2dのLabelやLayerに対して背景色等を変更した後
repaint()とか呼び出しても、何も起こらず。
でも、アプリの画面の上にウィンドウを持っていくなど、
強制的に再描画させると、更新されます。
うーむ...
2006年03月23日
第1回 S2Buri勉強会の資料が公開されました
待ちに待った、第1回S2Buri勉強会資料の公開が行われました。[event][S2Buri]勉強会の資料を公開しました(t-wadaの日記)
まだダウンロードしてませんが、週末にでもいろいろと中身を見てみようと思います。
2006年03月17日
『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』無料プレゼントキャンペーン
『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』無料プレゼント
欲しいので、素直に応募してみる。
当たらなかったら、自費で買うしか!
[追記 3/23]
残念ながら、落選したみたいですね。
2006年03月16日
Re: S2JSFとの関係その2
shotさんのblog:S2JSFとの関係その2
shotさんの説明だと、
S2JSF+MyFaces = Teeda Core + Teeda Extension
に読めるんですが、それで合っているんでしょうか?
ひがさんのblogを読み直すと、S2JSFは存在し続けるように読めるんですが。。
強引につなげると、
Teeda Extension = S2JSF
なんでしょうか。うーん、何か違うような。
これだけいろいろと出てくると、KDEのサイトのように
リリーススケジュールやFeatureプランのページを
作ってみたほうが良いのかもしれませんね。
こうなっていると、最新の予定が誰でも見られるので便利ですよ。
Geronimoのアーキテクチャを探索する1
を読んで、昨年末からGeronimoのアーキテクチャについて
調べた内容を今頃になってblogに起こすことにした。
最大の理由は、自分が当時書いたメモを読み直さないと、
その内容をだいぶ忘れていることに気づいたからだったりする(ぉぃ
ローカルマシンにしか残されていないので、自宅からでないと、
探しようがなかったりする。あと、まとめ過ぎていて、情報が欠落してる
という理由もある。
というわけで、当時のメモを片手に、1.0が出る直前に手元に落としてきた
コードを再度眺めて見る。
まずは、
Geronimoカーネルには、org.apache.geronimo.kernelパッケージが対応する。
このパッケージには、jmx、proxy、configといったサブパッケージが存在し、
JMXの機能、GBean間の通信(Proxy)、デプロイメント・プランの扱いが
Geronimoのコアとなっていることがよく分かる。
また、DIに相当する機能は、
org.apache.geronimo.kernel.Kernelインタフェースの実装クラスに加えて、
org.apache.geronimo.kernel.DependencyManagerインタフェースの実装クラス
が行っている。
このあたりは、以下の2点から分かる。
- DependencyManagerインタフェースの実装クラスである
BasicDependencyManagerでは、LifecycleListenerを使って
GBeanのunload時に依存関係の削除を行っている。 - デプロイメント・プラン等からGBeanをロードするConfigurationクラス
(と言っても本当は詳細は分かっていないが)のloadGBeanメソッドからは、
Kernl#loadGBeanメソッドと、DependencyManager#addDependencyメソッド
が呼ばれている。
次は、Geronimoカーネルの挙動からGBeanの詳細についての内容を書く予定。
2006年03月14日
Re: S2JSFの今後の計画
ひがさんのblog:
S2JSFの今後の計画shotさんのblog:S2JSFとの関係
思いっきり間違えて理解していました。TeedaはMyFaces+S2JSFに
相当するものと思ってました。
既存の資産も、割とTeeda+S2JSF1.1.xに移行しやすい
という感じになるのでしょうね。
2006年03月12日
第1回 S2Buri勉強会に参加してきました
第1回 S2Buri勉強会に参加してきました。アウトラインとしては、以下の通り
- 羽生さんがS2Buriの概要を説明
- t-wadaさんがサンプルを使ってS2Buriを使った開発方法の説明
- makotanさん中心に、質疑応答
- S2Buriを使うと何が嬉しいのか?
- 条件分岐の嵐がなくなる
- フローの変更・追加に容易に対応できる
- S2Buriを使った開発方法はどのように行うのか?
- マジカで業務の内容を聞き出す
- 新業務フローを作る
- 新業務フローから必要なER図を起こし、「フラグデータ」を洗い出す
- S2Buriに食わせるためのワークフロー図を作る
次回の勉強会が待ち遠しいです。次回は、
- 要件定義段階で作成した基本設計レベルの新業務フローから、
S2Buriに食わせる詳細設計レベルのフローへの落としこみ方法 - S2Buriを使った場合は何をどう実装すればいいのか?
- S2Buriの内部的な動作はどうなっているのか?
Seasarを使っていることの美味しさは何なのか?
プレゼン資料、サンプルの公開もお待ちしてます。
2006年02月13日
TeedaとS2JSFを探索する2:NavigationHandlerによるページの遷移2
MyFacesにおけるNavigationHandlerクラスの継承クラス、
org.apache.myfaces.application.NavigationHandlerImplクラスの
handleNavigation()メソッドをみて見る。
実際の遷移先を求める処理は、handleNavigation()メソッドから呼び出している
calcMatchingNavigationCase()メソッドにある。
1 private NavigationCase calcMatchingNavigationCase(List casesList,
2 String actionRef, String outcome)
3 {
4 for (int i = 0, size = casesList.size(); i < size; i++)
5 {
6 NavigationCase caze = (NavigationCase)casesList.get(i);
7 String cazeOutcome = caze.getFromOutcome();
8 String cazeActionRef = caze.getFromAction();
9 if ((cazeOutcome == null || cazeOutcome.equals(outcome)) &&
10 (cazeActionRef == null || cazeActionRef.equals(actionRef)))
11 {
12 return caze;
13 }
14 }
15 return null;
16 }
この処理自体は、単純にパターンマッチを行っているだけなので、キーになるNavigationCaseクラスを見てみる。
……とこれまた非常にシンプルなクラスなので、同じパッケージにNavigationRuleクラス
などがあることから判断して、faces-config.xmlの要素に対応すると推測する。
実際、仕様書や解説ドキュメントを読む限り、<navigation-case>の子要素として
<from-action>や<from-outcome>が存在するので、間違いないだろう。
----
次に、Teedaを見てみる。Teedaには、NavigationHandlerクラスの継承クラスは
3つあるようだ。そのうち二つは、テスト用と思われるMockクラス。
中心となるorg.seasar.teeda.core.application.NavigationHandlerImplクラス
のhandleNavigation()メソッドの中身は、MyFacesとはかなり内容が異なる。
1 public void handleNavigation(FacesContext context, String fromAction,
2 String outcome) {
3 if (context == null) {
4 throw new NullPointerException("context");
5 }
6 if (outcome == null) {
7 return;
8 }
9 ExternalContext externalContext = context.getExternalContext();
10 String viewId = context.getViewRoot().getViewId();
11 NavigationContext navigationContext
12 = getExactMatchNavigationCases(viewId, context);
13 NavigationCaseContext navigationCaseContext = null;
14 if(navigationContext != null){
15 navigationCaseContext
16 = getNavigationCaseContext(navigationContext, fromAction, outcome);
17 }
18 if(navigationCaseContext == null){
19 navigationContext
20 = getWildCardMatchNavigationCases(viewId, context);
21 navigationCaseContext
22 = getNavigationCaseContext(navigationContext, fromAction, outcome);
23 }
24 if(navigationCaseContext != null){
25 ViewHandler viewHandler = context.getApplication().getViewHandler();
26 String newViewId = navigationCaseContext.getToViewId();
27 if(isRedirect(navigationCaseContext)) {
28 String redirectPath
29 = getRedirectActionPath(context, viewHandler, newViewId);
30 redirect(context, externalContext, redirectPath, newViewId);
31 } else {
32 render(context, viewHandler, newViewId);
33 }
34 }else{
35 //Stay current ViewRoot.
36 }
37 }
それぞれのメソッド呼出しを追ってみる。12行目で呼び出しているgetExactMatchNavigationCases()メソッドでは、NavigationContextFactoryクラスの
getNavigationContexts()メソッドを呼び出している。
そのgetNavigationContexts()メソッドから、
org.seasar.teeda.core.context.servlet.ServletApplicationMapクラス
のインスタンスに、NavigationContextという<navigation-rule>に関する
コンテキストを保存させていることが分かる。
このあたりの動作を追えば、faces-config.xmlのLess Configuration化
の仕組みが分かりそうだが、とりあえず寝かせておく。
続いて、<navigation-case>の取得処理を見てみる。これは、22行目の
getNavigationCaseContext()メソッド呼出しで実現しているようだが、
読んでみるとずいぶんと泥臭い...
Less Configuration化のせいだろうか?
----
ここまで読んでみての感想としては、
- faces-config.xmlのLess Configuration化の仕組みも読んでみたい。
- ページの遷移を追えるようにするために、handleNavigation()メソッドか、
その内部の処理にアスペクトを適用できると良いなぁ。
TeedaとS2JSFを探索する1:NavigationHandlerによるページの遷移1
今日から、不定期でTeedaとS2JSFの調査を記録として残そうと思う。
第一回は、NavigationHandlerによるページの遷移。
#本当は、ページのレンダリングにしたかったのだが、
#まず分かるところから...
JSFの仕様や@ITの「JavaServer Facesを理解する」より、
Action実行後のページの遷移は、NavigationHandlerクラスがやっていることが分かる。
具体的には、NavigationHandler#handleNavigation()メソッド。
そこで、このメソッドを呼出している箇所をS2JSF内でみて見ると、
- org.seasar.jsf.application.ActionListenerImpl#processAction() メソッド
- org.seasar.jsf.runtime.ViewRendererImpl#executeInitAction() メソッド
ここでは、両者のメソッド呼出しの前後が似ていることと、JSFの仕様書に
(デフォルトでは)NavigationHandler#handleNavigation()メソッドを呼び出す
と書かれているjavax.faces.event.ActionListenerインタフェースの実装である
org.seasar.jsf.application.ActionListenerImpl#processAction() を選択する。
ActionListenerImpl#processAction()の中身は、以下の通り。
1 public void processAction(ActionEvent actionEvent)
2 throws AbortProcessingException {
3
4 FacesContext context = FacesContext.getCurrentInstance();
5 ExternalContext extContext = context.getExternalContext();
6 HttpServletRequest request = ExternalContextUtil.getRequest(extContext);
7 Application app = context.getApplication();
8 UICommand command = (UICommand) actionEvent.getComponent();
9 UIParameterUtil.saveParamsToRequest(command, request);
10 MethodBinding mb = command.getAction();
11 String fromAction = null;
12 String outcome = null;
13 if (mb != null) {
14 fromAction = mb.getExpressionString();
15 try {
16 outcome = InvokeUtil.invoke(mb, context);
17 } catch (EvaluationException ex) {
18 Throwable cause = ex.getCause();
19 ErrorPageManager manager = getErrorPageManager();
20 try {
21 if (manager.handleException(cause, extContext)) {
22 context.responseComplete();
23 } else {
24 throw ex;
25 }
26 } catch (IOException ioe) {
27 logger.log(ioe);
28 throw ex;
29 }
30
31 }
32 }
33 NavigationHandler navigationHandler = app.getNavigationHandler();
34 navigationHandler.handleNavigation(context, fromAction, outcome);
35 context.renderResponse();
36 }
そのうち、34行目のhandleNavigation()メソッドの呼び出し部分、
navigationHandler.handleNavigation(context, fromAction, outcome);
において、第一引数はFacesContext、第二引数は<navigation-rule>の<from-action>に対応、第三引数は<from-action>に対応する。
14行目の処理から、fromActionに関しては、Method Binding式で記述された
Actionメソッドの名前に対応していると考えて良さそうだ。
となると、問題は第三引数のoutcomeを取得している16行目の処理、
outcome = InvokeUtil.invoke(mb, context);
がポイントになる。
そこで、org.seasar.jsf.util.InvokeUtil#invoke()メソッドの処理を読んでみると、
SingletonS2Containerを使って対応するアクション・オブジェクトを取得した後、
- プロパティの設定
- メソッド呼出し
- プロパティの読み込み
を取得している。この処理は、JSFの仕様書や解説に一致するところだ。
ということで、これを元にNavigationHandler#handleNavigation()メソッドでの
ページの遷移処理の中身を見たいのだが、十分に長いエントリ
になっているので、いったん切ることにする。
#次は、実質MyFacesとTeedaの比較になるなぁ。
2006年02月11日
Seasar デブサミ2006 懇親会
デブサミ2日目の後、Seasar懇親会に参加してきました。参加人数は、なんと約40名。延べ人数だと、40名超だったと思います。
イベントのオフィシャルな懇親会以外で、これだけの人数が集まったのは、
はじめて見ました。Seasarへの関心の高さが伺えますね。
宴会開始のタイミングでは、運よく、ひがさんやkoichikさんの近くに
座れたので、Seasarの今後の構想について少し話を聞いてきました。
特に、このblogでもshotさんからコメントがあった
SeasarのDIコンテナがInjectionしたオブジェクトの監視機能ですが、
JMXへの対応と設定ファイルの吐き出しを候補として考えているとのことです。
その後、豆蔵の元社長の鈴木さんが隣のテーブルから加わり、
オブジェクト指向開発、特に要件定義の際のお客様への接し方、
モデリングの秘訣について話を聞きました。具体的には、
- 技術者は、現場における仕様やオブジェクトの重要度を感じるためにも、
実際の現場に行ってモデリングすることが必要である。 - 質の高いソフトウェアを作るためには、優れた命名規則の辞書を用意できると良い。
→ そのためにも、良いアーキテクチャのソースを読もう。 - 高品質のシステムを作るためには、お客さんの話を聞きながら、
空でモデリングし、リファクタリングできるくらいにならなければいけない。 - モデリング力の向上のために、現実世界でのモデリングを日々行っていくとよい
いやー、ラッキーでしたね。
そして、最後にshotさんの横に行ってご挨拶。
Teedaの開発頑張ってください。>shotさん
さらにその後、t-wadaさんにもご挨拶。
S2で「継続」を実現するプロジェクトS2Continuations期待してます。>t-wadaさん
そして、終電少し前に帰ってきましたとさ。
