タダで表現の場を提供していただいたgoogleさんには申し訳ないけど、引っ越しました。
ここ→山崎屋の技術メモ
理由:
①hatenaのほうがソースが見やすい
②ジャヴァラーがいっぱいいるので
③ブログランキングが充実していて張り合いがある
でも、デメリットもありました。
・google検索にヒットしずらくなった・・・
・google検索の順位が低い・・・
山崎屋のメモ
2013年2月14日木曜日
2012年9月30日日曜日
スレッド間で共有される変数にはintを使うなかれ。AtomicIntegerを使うべし。
うっかり忘れそうなのでメモ。
【ダメダメな例】
インクリメントしようとして、インクリメントできていないときが600万回くらいあります。
「int型をインクリメントするくらいで、スレッド間の競合を考えなくてもいいだろ。」という考えはスパっと切り捨てましょう。
【正しい例】
MyThreadだけ書き換えます。
今度は大丈夫です。
【もうひとつの正しい例】
もちろんsynchronizedを使ってもかまいません。
ただし、処理時間でAtomicIntegerに負けるそうです。
また、MyThreadのみ変更します。
これでも期待通りの結果が得られます。
参考にさせていただきました:
AtomicIntegerを追ってみた
【ダメダメな例】
インクリメントしようとして、インクリメントできていないときが600万回くらいあります。
「int型をインクリメントするくらいで、スレッド間の競合を考えなくてもいいだろ。」という考えはスパっと切り捨てましょう。
【正しい例】
MyThreadだけ書き換えます。
今度は大丈夫です。
【もうひとつの正しい例】
もちろんsynchronizedを使ってもかまいません。
ただし、処理時間でAtomicIntegerに負けるそうです。
また、MyThreadのみ変更します。
これでも期待通りの結果が得られます。
参考にさせていただきました:
AtomicIntegerを追ってみた
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クラスのプロパティやメソッドで、ある程度変更可能。
2011年7月23日土曜日
ApacheモジュールをWindows環境で開発⑤
今回は「mod_hoge.so」というモジュールを作ります。
/hoge/にアクセスがあった場合、「The sample page from mod_hoge.c」というメッセージをだす
簡単なものです。
適当なフォルダ(C:\work\module のような感じ)で以下のコマンドを打ちます。
apxs -g -n hoge
作ったぞ!的なメッセージがでます。
Use of assignment to $[ is deprecated at C:\ApacheSoftware\Apache2.2\bin/apxs.bat line 120.
Creating [DIR] hoge
Creating [FILE] hoge/Makefile
Creating [FILE] hoge/mod_hoge.c
Creating [FILE] hoge/.deps
ディレクトリが作成され、
3つのファイルが作成されました。
C:\work\module>tree /f hoge
フォルダ パスの一覧
ボリューム シリアル番号は XXXX-9035 です
C:\WORK\MODULE\HOGE
.deps
Makefile
mod_hoge.c
次はコンパイルです。(ソースファイルもいじらず、このままいきます。)
自動で作成されたhogeディレクトリに移動してください。
詳しい人ならmakeでビルドできるようにMakefileを修正するでしょうが、
私にはできないので、gccコマンドで堅実にコンパイルしていきます。
gcc -mwindows -I C:\ApacheSoftware\Apache2.2\include -L C:\ApacheSoftware\Apache2.2\lib -c mod_hoge.c
※includeディレクトリとlibディレクトリはご自分の環境に合わせて変更してください。
エラーです....
----------------------------------------
C:\work\module\hoge>gcc -mwindows -I C:\ApacheSoftware\Apache2.2\include -L C:\A
pacheSoftware\Apache2.2\lib -c mod_hoge.c
In file included from C:/ApacheSoftware/Apache2.2/include/ap_config.h:25,
from C:/ApacheSoftware/Apache2.2/include/httpd.h:43,
from mod_hoge.c:40:
C:/ApacheSoftware/Apache2.2/include/apr.h:618:1: warning: "IN6_IS_ADDR_V4MAPPED"
redefined
In file included from C:/ApacheSoftware/Apache2.2/include/apr.h:101,
from C:/ApacheSoftware/Apache2.2/include/ap_config.h:25,
from C:/ApacheSoftware/Apache2.2/include/httpd.h:43,
from mod_hoge.c:40:
C:/Perl/site/lib/auto/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/ws2
tcpip.h:236:1: warning: this is the location of the previous definition
In file included from C:/ApacheSoftware/Apache2.2/include/httpd.h:43,
from mod_hoge.c:40:
C:/ApacheSoftware/Apache2.2/include/ap_config.h:234:28: ap_config_auto.h: No suc
h file or directory
C:/ApacheSoftware/Apache2.2/include/ap_config.h:235:30: ap_config_layout.h: No s
uch file or directory
----------------------------------------
ワーニング2つはあえて無視(笑)したとして、
ヘッダファイルが2つ(ap_config_auto.hとap_config_layout.h)ありませんと出ています。
そんなファイル確かにないし、、、
いろいろ調べたり、試したりしましたが、結論としてこの2つはインクルードしないことにしました。
(いいのかどうかは不明です。たぶんダメだと思います。情報お待ちしております。)
ap_config.hの中で上記2ファイルをインクルードしようとしている箇所をコメントアウトし、
再度コンパイルします。
成功するとmod_hoge.oができます。
続いて、.soファイルをつくります。以下のようなgccを実行してください。
gcc -mwindows -I C:\ApacheSoftware\Apache2.2\include -L C:\ApacheSoftware\Apache2.2\lib -shared -o mod_hoge.so mod_hoge.o -llibhttpd
成功するとmod_hoge.soができます。
あとはapacheの設定です。
①できたmod_hoge.soファイルをモジュールのフォルダに移動してください。(私の場合、C:\ApacheSoftware\Apache2.2\modules)
②httpd.confに以下の行を追加(LoadModule が並んでいるところの最後尾)
LoadModule hoge_module modules/mod_hoge.so
③もう1つhttpd.conf の下のほうに
<Location /hoge>
SetHandler hoge
</Location>
Apacheを起動してhttp://localhost/hogeと、入力してください。
The sample page from mod_hoge.c とブラウザに表示されれば成功です。
/hoge/にアクセスがあった場合、「The sample page from mod_hoge.c」というメッセージをだす
簡単なものです。
適当なフォルダ(C:\work\module のような感じ)で以下のコマンドを打ちます。
apxs -g -n hoge
作ったぞ!的なメッセージがでます。
Use of assignment to $[ is deprecated at C:\ApacheSoftware\Apache2.2\bin/apxs.bat line 120.
Creating [DIR] hoge
Creating [FILE] hoge/Makefile
Creating [FILE] hoge/mod_hoge.c
Creating [FILE] hoge/.deps
ディレクトリが作成され、
3つのファイルが作成されました。
C:\work\module>tree /f hoge
フォルダ パスの一覧
ボリューム シリアル番号は XXXX-9035 です
C:\WORK\MODULE\HOGE
.deps
Makefile
mod_hoge.c
次はコンパイルです。(ソースファイルもいじらず、このままいきます。)
自動で作成されたhogeディレクトリに移動してください。
詳しい人ならmakeでビルドできるようにMakefileを修正するでしょうが、
私にはできないので、gccコマンドで堅実にコンパイルしていきます。
gcc -mwindows -I C:\ApacheSoftware\Apache2.2\include -L C:\ApacheSoftware\Apache2.2\lib -c mod_hoge.c
※includeディレクトリとlibディレクトリはご自分の環境に合わせて変更してください。
エラーです....
----------------------------------------
C:\work\module\hoge>gcc -mwindows -I C:\ApacheSoftware\Apache2.2\include -L C:\A
pacheSoftware\Apache2.2\lib -c mod_hoge.c
In file included from C:/ApacheSoftware/Apache2.2/include/ap_config.h:25,
from C:/ApacheSoftware/Apache2.2/include/httpd.h:43,
from mod_hoge.c:40:
C:/ApacheSoftware/Apache2.2/include/apr.h:618:1: warning: "IN6_IS_ADDR_V4MAPPED"
redefined
In file included from C:/ApacheSoftware/Apache2.2/include/apr.h:101,
from C:/ApacheSoftware/Apache2.2/include/ap_config.h:25,
from C:/ApacheSoftware/Apache2.2/include/httpd.h:43,
from mod_hoge.c:40:
C:/Perl/site/lib/auto/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/ws2
tcpip.h:236:1: warning: this is the location of the previous definition
In file included from C:/ApacheSoftware/Apache2.2/include/httpd.h:43,
from mod_hoge.c:40:
C:/ApacheSoftware/Apache2.2/include/ap_config.h:234:28: ap_config_auto.h: No suc
h file or directory
C:/ApacheSoftware/Apache2.2/include/ap_config.h:235:30: ap_config_layout.h: No s
uch file or directory
----------------------------------------
ワーニング2つはあえて無視(笑)したとして、
ヘッダファイルが2つ(ap_config_auto.hとap_config_layout.h)ありませんと出ています。
そんなファイル確かにないし、、、
いろいろ調べたり、試したりしましたが、結論としてこの2つはインクルードしないことにしました。
(いいのかどうかは不明です。たぶんダメだと思います。情報お待ちしております。)
ap_config.hの中で上記2ファイルをインクルードしようとしている箇所をコメントアウトし、
再度コンパイルします。
成功するとmod_hoge.oができます。
続いて、.soファイルをつくります。以下のようなgccを実行してください。
gcc -mwindows -I C:\ApacheSoftware\Apache2.2\include -L C:\ApacheSoftware\Apache2.2\lib -shared -o mod_hoge.so mod_hoge.o -llibhttpd
成功するとmod_hoge.soができます。
あとはapacheの設定です。
①できたmod_hoge.soファイルをモジュールのフォルダに移動してください。(私の場合、C:\ApacheSoftware\Apache2.2\modules)
②httpd.confに以下の行を追加(LoadModule が並んでいるところの最後尾)
LoadModule hoge_module modules/mod_hoge.so
③もう1つhttpd.conf の下のほうに
<Location /hoge>
SetHandler hoge
</Location>
Apacheを起動してhttp://localhost/hogeと、入力してください。
The sample page from mod_hoge.c とブラウザに表示されれば成功です。
登録:
投稿 (Atom)