うっかり忘れそうなのでメモ。
【ダメダメな例】
インクリメントしようとして、インクリメントできていないときが600万回くらいあります。
「int型をインクリメントするくらいで、スレッド間の競合を考えなくてもいいだろ。」という考えはスパっと切り捨てましょう。
【正しい例】
MyThreadだけ書き換えます。
今度は大丈夫です。
【もうひとつの正しい例】
もちろんsynchronizedを使ってもかまいません。
ただし、処理時間でAtomicIntegerに負けるそうです。
また、MyThreadのみ変更します。
これでも期待通りの結果が得られます。
参考にさせていただきました:
AtomicIntegerを追ってみた
2012年9月30日日曜日
2012年7月14日土曜日
Google App Engine とGitHub
最近は、もっぱら、GoogleAppEngine と GitHubの勉強をゆっくりと、ゆっくりと行っています。
1個、学習用アプリ作りました。
ひたすらコンピュータとじゃんけんをするという、何の意味もないアプリですが、
公開します。
アプリのURL:http://yyama-001.appspot.com/jangkeng
ソースのURL:https://github.com/yyama695/jangkeng.git
GitHubに関して、EclipseのプラグインであるEGitを使っているのですが、
いまいち、紹介しているサイトが少なくて、使い方があっているのかどうかも、
微妙な感じです。まあ、1人で作ったアプリだし、たいした問題も
ありませんでした。
アプリに対する指摘や、ソースに対する指摘は大歓迎です。
それでは第2弾の作成に移るとします。
では。
1個、学習用アプリ作りました。
ひたすらコンピュータとじゃんけんをするという、何の意味もないアプリですが、
公開します。
アプリのURL:http://yyama-001.appspot.com/jangkeng
ソースのURL:https://github.com/yyama695/jangkeng.git
GitHubに関して、EclipseのプラグインであるEGitを使っているのですが、
いまいち、紹介しているサイトが少なくて、使い方があっているのかどうかも、
微妙な感じです。まあ、1人で作ったアプリだし、たいした問題も
ありませんでした。
アプリに対する指摘や、ソースに対する指摘は大歓迎です。
それでは第2弾の作成に移るとします。
では。
2012年5月2日水曜日
seasar2 AOP
seasar2を使った、簡単なAOPのサンプルです。
seasar2に用意されているorg.seasar.framework.aop.interceptors.TraceInterceptorをアドバイス(インターセプタ)としてそのまま利用しています。
org.seasar.framework.aop.interceptors.TraceInterceptorは、ポイントカットとなるメソッドの前後にメソッド名や引数、戻り値をコンソールに出力してくれるアドバイス(インターセプタ)です。
今回のサンプルでは、log4jは使用していません。
log4jのjarは、クラスパスに置いていないので、 自動でjava.util.logging.Loggerが使用されます。
org.seasar.framework.aop.interceptors.TraceInterceptorはデバッグレベルでログを出力します。
java.util.logging.LoggerのログレベルはFINEにしておいてください。
参考URL:http://www.alles.or.jp/~torutk/oojava/maneuver/2001/logging/logging.html
(1)パッケージ構成
main()を実行すると以下の実行結果が得られます。
メソッドの前後にログが出力されています。
続いてapp.diconを以下のように変更してみます。
「<aspect pointcut="methodA">traceInterceptor</aspect>」の部分を修正しています。
すると、methodAの前後にだけアドバイスが織り込まれている(ウィービングされている)ことがわかります。
seasar2に用意されているorg.seasar.framework.aop.interceptors.TraceInterceptorをアドバイス(インターセプタ)としてそのまま利用しています。
org.seasar.framework.aop.interceptors.TraceInterceptorは、ポイントカットとなるメソッドの前後にメソッド名や引数、戻り値をコンソールに出力してくれるアドバイス(インターセプタ)です。
今回のサンプルでは、log4jは使用していません。
log4jのjarは、クラスパスに置いていないので、 自動でjava.util.logging.Loggerが使用されます。
org.seasar.framework.aop.interceptors.TraceInterceptorはデバッグレベルでログを出力します。
java.util.logging.LoggerのログレベルはFINEにしておいてください。
参考URL:http://www.alles.or.jp/~torutk/oojava/maneuver/2001/logging/logging.html
(1)パッケージ構成
(2)ソース
main()を実行すると以下の実行結果が得られます。
メソッドの前後にログが出力されています。
続いてapp.diconを以下のように変更してみます。
「<aspect pointcut="methodA">traceInterceptor</aspect>」の部分を修正しています。
すると、methodAの前後にだけアドバイスが織り込まれている(ウィービングされている)ことがわかります。
Java Logging API ハマリポイント
Java Logging APIを使用して、はまった箇所の備忘録
Java Logging APIの基本的な使い方は、他のページを参照
・http://www.alles.or.jp/~torutk/oojava/maneuver/2001/logging/logging.html
・http://struts.wasureppoi.com/util/04_javalog.html
ロギングの簡単な操作を覚えるために簡単なサンプルを作成した。
設定ファイル※1の内容(デフォルトのままいじらず)
出力結果
さて、ログレベルを変えてやってみるかと、設定ファイルを変更した。
が、これでは、出力結果が変わらない!?
調査した結果、こっち↓も変えないといけなかった。
無事に出力できました。
結局、グローバルログレベルでログ出力を制限し、さらにコンソールハンドラレベルでそれ以上に絞りたいのであれば絞ることができる。
したがって、コンソールハンドラレベルにおいて、グローバルログレベル以上のログを出力しようとしても無理なことが判明した。
(設定ファイル※1のコメントに「グローバルログレベルのほかに、コンソールハンドラでもレベルを設定できるから注意しろよ!」と英語で書いてあった。)
※1 JDKインストールディレクトリ以下の「~\lib\logging.properties」もしくは、JREインストールディレクトリ以下の「~\lib\logging.properties」。
このファイルは、すべてのアプリに対して影響するので、普通は編集しません。正しくは、アプリ固有の設定ファイルを準備し、そのファイルを参照しにいくようVMの起動パラメータを指定する必要があります。
Java Logging APIの基本的な使い方は、他のページを参照
・http://www.alles.or.jp/~torutk/oojava/maneuver/2001/logging/logging.html
・http://struts.wasureppoi.com/util/04_javalog.html
ロギングの簡単な操作を覚えるために簡単なサンプルを作成した。
設定ファイル※1の内容(デフォルトのままいじらず)
出力結果
さて、ログレベルを変えてやってみるかと、設定ファイルを変更した。
が、これでは、出力結果が変わらない!?
調査した結果、こっち↓も変えないといけなかった。
無事に出力できました。
結局、グローバルログレベルでログ出力を制限し、さらにコンソールハンドラレベルでそれ以上に絞りたいのであれば絞ることができる。
したがって、コンソールハンドラレベルにおいて、グローバルログレベル以上のログを出力しようとしても無理なことが判明した。
(設定ファイル※1のコメントに「グローバルログレベルのほかに、コンソールハンドラでもレベルを設定できるから注意しろよ!」と英語で書いてあった。)
※1 JDKインストールディレクトリ以下の「~\lib\logging.properties」もしくは、JREインストールディレクトリ以下の「~\lib\logging.properties」。
このファイルは、すべてのアプリに対して影響するので、普通は編集しません。正しくは、アプリ固有の設定ファイルを準備し、そのファイルを参照しにいくようVMの起動パラメータを指定する必要があります。
2012年4月30日月曜日
seasar2 コンポーネント自動登録
seasar2のコンポーネント自動登録の基本
初めて使ったときに悩んだのでメモ。
コンポーネントの自動登録を理解するために、最もシンプルにしたプロジェクトでサンプルを提示します。
1.自動登録を使用しない場合(プロジェクト名:ComponentManualRegisterSample1)
(1)パッケージ構成
(2)各ソース
ClassAImpl.java
Driver.java
app.dicon
mainを実行した結果
Driver.java
(さっきと一緒)
app.dicon
mainを実行した結果
3.いくつか解説
■自動登録する場合のapp.diconについて
app.dicon(抜粋)
1番目の引数は見てわかるとおり、自動登録するクラスのパッケージを指定しているが、
子供のパッケージも再帰的に検索するので、
や、
でも、同様の動きとなった。
ただし、これはだめだった。
デフォルトパッケージに自動登録したいクラスがあった場合、どうすればいいんだろう?
暇なときソースを追いかけてみるか。。。
■DefaultAutoNamingクラスの役割について
Driver.java(抜粋)
コンポーネントの自動登録をしない場合は、app.diconで明示的に「classA」という名前をコンポーネント名に設定している。一方、自動登録する場合には、「classA」というコンポーネント名は、どこにも設定していない。
にもかかわらず、「classA」というコンポーネント名が利用できるのは、app.diconで指定したDefaultAutoNamingクラスが、
app.dicon(抜粋)
初めて使ったときに悩んだのでメモ。
コンポーネントの自動登録を理解するために、最もシンプルにしたプロジェクトでサンプルを提示します。
1.自動登録を使用しない場合(プロジェクト名:ComponentManualRegisterSample1)
(1)パッケージ構成
(2)各ソース
ClassAImpl.java
Driver.java
app.dicon
mainを実行した結果
2.自動登録を使用した場合(プロジェクト名:ComponentAutoRegisterSample1)
(1)パッケージ構成
さっきと一緒
(2)各ソース
ClassAImpl.java
(さっきと一緒)
app.dicon
mainを実行した結果
3.いくつか解説
■自動登録する場合のapp.diconについて
app.dicon(抜粋)
1番目の引数は見てわかるとおり、自動登録するクラスのパッケージを指定しているが、
子供のパッケージも再帰的に検索するので、
や、
でも、同様の動きとなった。
ただし、これはだめだった。
デフォルトパッケージに自動登録したいクラスがあった場合、どうすればいいんだろう?
暇なときソースを追いかけてみるか。。。
■DefaultAutoNamingクラスの役割について
Driver.java(抜粋)
コンポーネントの自動登録をしない場合は、app.diconで明示的に「classA」という名前をコンポーネント名に設定している。一方、自動登録する場合には、「classA」というコンポーネント名は、どこにも設定していない。
にもかかわらず、「classA」というコンポーネント名が利用できるのは、app.diconで指定したDefaultAutoNamingクラスが、
app.dicon(抜粋)
自動でクラス名からコンポーネント名を導き出し、設定してるから。
サンプルの場合、以下のとおり。
・クラス名「org.yama.study.pk1.ClassAImpl」からパッケージ部分を除去し「ClassAImpl」という文字列を作成
↓
・「ClassAImpl」のImplを取り除き「ClassA」という文字列を作成
↓
・「ClassA」の先頭を小文字に変換し「classA」の出来上がり
この、変換ルールは、DefaultAutoNamingクラスのプロパティやメソッドで、ある程度変更可能。
登録:
投稿 (Atom)