goo blog サービス終了のお知らせ 

Psalm

プログラマ向け技術メモ

Muninのグラフ単位が荒すぎる件。

2012-04-05 11:22:25 | お知らせ
これだけ苦労して結局使えないのか・・・と目の前が暗くなった瞬間。
閃いた。
確かに単位は変えられないが、グラフのサイズは変えられるのだ。
グラフをどーんと大きくすれば、1時間のメモリ幅が広がるんじゃないの?
ということで、

# vi /etc/munin/munin.conf

graph_height
graph_width

を5倍くらいの値にどーんと変更。
実行時メモリが足りなくなる可能性もあるので必要ないプラグインは
すべて外す。
まあ、とりあえずは使えるレベルになった・・・と思う。

はー・・・。

メモリ監視したいんですけど。

2012-04-05 11:21:53 | お知らせ
Muninインストール、起動まで成功。
さて、いざメモリ監視と思ったらPC全体のメモリしか表示されないので
目的のWebアプリケーションがどれだけメモリを使ってるのかなんて
さっぱりだ。
このままではいかん、ということで指定したTomcatのメモリを監視してくれる
プラグインを入れることにした。
jstat__heap pluginってやつだ。
まずはプラグインをダウンロード。
http://exchange.munin-monitoring.org/plugins/jstat__heap/details

/usr/share/munin/plugins/ に入れて、/etc/munin/plugins/に
シンボリックリンクを貼る。

# ln -s /usr/share/munin/plugins/jstat__heap plugin /etc/munin/plugins/jstat__heap plugin

んで、プラグインの設定をする。
まずこのプラグインを使うにはTomcatをjsvcで起動する必要があるので
jsvcをインストールする。

Tomcatのbin/の下に、commons-daemon-native.tar.gzがあるので解凍する。

# tar -xzf commons-daemon-native.tar.gz
# cd 1.0.2-native-src/unix

autoconfを利用してconfigureスクリプトを作成。

# autoconf

configureを実行。/xxx/jdk は任意のJAVA_HOMEディレクトリ。

# ./configure --with-java=/xxx/jdk

make実行。

# make clean
# make

makeの前にmake cleanしないと、

ar : libservice.a : Malformed archive

とか言って怒られる。バグだ。
さらに、configureに --with-java=/xxx/jdk とか入れないと

error:jni.h そのようなファイルやディレクトリはありません

とか言って怒られる。
これだけやってもまだ怒られた。

Cannot dynamically link to /xxx/xxx/xxx/libjvm.so
Cannot restore segment prot after reloc: Permission denied.

SELinuxがセキュリティーの問題でライブラリをロードできないように
しているからだそうだ。
しらねーよー・・・
解除してやる。

# chcon -c -v -R -u system_u -r object_r -t textrel_shlib_t /xxx/xxx/xxx/libjvm.so

コンパイルが通ったら、jsvcというファイルができているので
所有者をtomcatユーザにしてTomcat/bin に移動する。

# chown tomcat:tomcat jsvc
# mv -f jsvc /opt/tomcat6/bin


次はjsvcの起動スクリプトを作成する。

# vi /etc/rc.d/init.d/jsvc

スクリプトの中身。

#!/bin/sh
#
# chkconfig: - 80 20
# description: jsvc

# Source function library.
. /etc/init.d/functions

JAVA_HOME=/usr/java/jdk1.6.0_11
CATALINA_HOME=/opt/tomcat6
TOMCAT_USER=tomcat
TMP_DIR=/tmp
CATALINA_OPTS=
CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar
PIDFILE=/var/run/tomcat.pid
LOCKFILE=/var/lock/subsys/tomcat
DAEMON=$CATALINA_HOME/bin/jsvc

start(){
    #
    # Start Tomcat
    #
    
    echo -n "Starting jsvc: "
    $DAEMON \
    -pidfile $PIDFILE \
    -user $TOMCAT_USER \
    -home $JAVA_HOME \
    -Dcatalina.home=$CATALINA_HOME \
    -Djava.io.tmpdir=$TMP_DIR \
    -outfile $CATALINA_HOME/logs/catalina.out \
    -errfile '&1' \
    $CATALINA_OPTS \
    -cp $CLASSPATH \
    org.apache.catalina.startup.Bootstrap
    
    #
    # To get a verbose JVM
    #-verbose \
    # To get a debug of jsvc.
    #-debug \
    RETVAL=$?
    if [ $RETVAL = 0 ]; then
        echo_success
        touch $LOCKFILE
    else
        echo_failure
            fi
        echo
    }

stop(){
    #
    # Stop Tomcat
    #
    echo -n "Shutting down jsvc: "
    $DAEMON \
    -stop \
    -pidfile $PIDFILE \
    org.apache.catalina.startup.Bootstrap
    RETVAL=$?
    if [ $RETVAL = 0 ]; then
        echo_success
        rm -f $PIDFILE $LOCKFILE
    else
        echo_failure
    fi
    echo
}

case "" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
        status $DAEMON
        RETVAL=$?
        ;;
    *)
        echo $"Usage: jsvc {start|stop|restart|status}"
        exit 1
        ;;
    esac 




スクリプトの作成が終わったら、ファイルに実行権限を付与。

# chmod 755 /etc/init.d/jsvc

起動してみる。

# /etc/init.d/jsvc start

これでjsvcの設定は完了。
jstat__heap pluginの設定に戻る。

# vi Tomcat/conf/server.xml

して、監視したいWebアプリのHostName の設定を探して
<Alias>の設定をする。


<Host name="localhost" >
<Context path="xxxx" ... />
<Alias>localhost</Alias>
</Host>


設定したエイリアスの名前を、プラグインのファイル名に入れる。

# mv /etc/munin/plugins/jstat__heap /etc/munin/plugins/jstat_localhost_heap

プラグインの実行権限をrootに設定する。

# vi /etc/munin/plugin-conf.d/munin-node

以下を追加。

[jstat*]
user root

プラグインの実行権限を設定していないとmuninのログに

cat: /var/run/jsvc.pid : Permission denied.

が出力される。
ちなみに、/etc/munin/plugins.conf はダミーなのでキニシナイ。
・・・なんで設定ファイルが二つもあるんだ?
紛らわしい。

試しに実行してみる。

# /etc/munin/plugins/jstat_localhost_heap

メモリの値が取れれば成功。
Muninに設定を読み込ませる。

# /etc/init.d/munin-node restart

Muninのプラグインのインストール状況を確認する。

# munin-node-configure -suggest

jstatがyesになっていることを確認。
これで、よーーーーーーやく、メモリ監視ができる!
と喜んだのも束の間。
グラフの単位が[by a day]しかないっ!
もっと細かい監視がしたいんだよ!!!
分単位のさあ!

続く。

Muninを起動してみよう。

2012-04-05 11:21:27 | お知らせ
前回の続き。
インストールできたので、とりあえず設定をしてみる。
今回は監視する側とされる側が同一マシンなので、難しいことは考えない。

#vi /etc/munin/munin-node.conf

して

host_name 自分のマシン名

を入れるだけ。
起動してみよう。

# /etc/init.d/munin-node start

うん、怒られた。
Muninのログは、/var/log/munin/munin-node.log 辺りに出ている。
なになに。

Starting Munin Node : Can't locate Net/Server/Fork.pm in @INC ...

ずばり、Muninを起動するための前提条件を満たしてないから。
Perl関連のモジュールが足りない状態。
CPANとやらを使って必要なモジュールを入れる。
・・・CPANってナニ。

# perl -MCPAN -e shell

初回起動時は色々と設定事項を聞かれる。
基本的にデフォルトでよさげ。
一応、[xxxx]を確認して[]になってるところで、必要そうなら
パスを入れたり、なんだったり。
参考:http://y-kit.jp/saba/xp/cpan.htm
linksは空でも大丈夫だった。

初期設定が終わったら

cpan>

が出るので、必要なモジュールをインストール。

cpan> install Date::Manip
cpan> install HTML::Template
cpan> install Net::SNMP
cpan> install Net::Server

はー、やれやれ。
今度こそ起動!

# /etc/init.d/munin-node start

起動した。5分待つ。
何も起こらない。グラフが出力されない。
ログにも何も出ていない。何故なのだ。
クーロンを手動実行してみる。

# /usr/bin/munin-cron

はい、怒られた。

Can't locate Munin.pm in @INC ...

あーそー。

# find /usr -name 'Munin.pm'

恐らく、/usr/lib/perl5/vendor_perl/5.8.x/Munin.pm が見つかるので
パスをコピー。

# vi /usr/bin/munin-cron

2行目に以下を追加。

export PERL5LIB=$PERL5LIB:/usr/lib/perl5/vendor_perl/5.8.x

起動!

# /etc/init.d/munin-node start

ヨシ。
自動起動設定もして、と。

# chkconfig munin-node on
# chkconfig --list munin-node

Muninのプラグインのインストール状況を確認する。

# munin-node-configure -suggest

初期状態ではほとんどが「Used no」のはず。
使えるもの全部をyesにした場合は

# munin-node-configure --shell | sh

を使うと楽らしい。
今回はメモリ監視したいだけなのでやらない。

これにてインストール完了。

続く。

Muninをインストールしてみよう。

2012-04-05 11:20:01 | お知らせ
DevPartnerが動かないので、仕方なくMuninなるツールを
使ってみることにした。
このツール。
あらゆるサイトに「インストール簡単!設定簡単!」と書かれている。

ウソツキ。

あらゆる設定に躓きたおしたので怒りのメモ。
あ、OSはCentOS 3.4です。

インストールはコマンドを2つ打つだけ

#yum -y install munin
#yum -y install munin-node

はい、嘘です。
CentOS-Base.repoにはmuninが入ってないのでyumレポジトリの追加が必要。
wgetでrpmパッケージをダウンロードする。

#wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el3.rf.i386.rpm

はい、失敗。名前が解決できないとか言われた。
原因はプロキシの設定が「してあった」こと。
昔社内LANにあったものをインターネットに移したので
古いプロキシ設定が残っていたのだった。
/etc/yum.conf の proxy=XXX と
/etc/wgetrc の http_proxy=XXX あたりをコメントアウト。
改めて

#wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el3.rf.i386.rpm
#wget http://apt.sw.be/RPM-GPG-KEY.dag.txt

取得成功。
rpmで展開。

#rpm -Uhv rpmforge-release-0.5.2-2.el3.rf.i386.rpm
#rpm --import RPM-GPG-KEY.dag.txt

展開後は不要ファイルを削除。

#rm -Uhv rpmforge-release-0.5.2-2.el3.rf.i386.rpm
#rm --import RPM-GPG-KEY.dag.txt

rpmforgeの設定でenabled = 0 に変更する。

#vi /etc/yum.repos.d/rpmforge.repo
 (enabled = 0 にする!)

さて、やっとインストールにこぎつけた。

#yum --enablerepo=rpmforge install munin
#yum --enablerepo=rpmforge install munin-node

インストール成功、おめでとう。
まだ先は長いがな。

DevPartnerが重すぎる。

2010-11-24 14:35:32 | お知らせ
レスポンスが返ってくるまでに5分以上かかる。
当然、途中でタイムアウトする。
なーぜー。
頭を抱えて唸って、メモリを足してみたり
他のプロセス止めてみたりして3日経過。

どうやら、TomcatがJDK1.5でコンパイルされていたのが原因らしい。
JAVA_HOMEはJDK1.6、アプリケーションのコンパイルも1.6なのに
TomcatだけJDK1.5でコンパイルされたものだった。

実行環境より古いバージョンのJDKでコンパイルされた
クラスファイルがあった場合、プロファイル処理が非常に遅くなる

のだそうだ。
・・・いや、気づきませんて。汗
とりあえず、Tomcatを1.6でコンパイルすればいいんだろうなあ。
もう時間がないからやらないけどネ!
暇なときに試してみたいネ!

DevPartnerが動かない。

2010-11-18 13:41:50 | お知らせ
苦労しました。
マニュアルがとっても 親 切 で。
ネット上に情報がなくて。
いつか再び苦悩する自分へ、めも。

前提。
Linux版 for Javaの話。
Apache-Tomcat連携で、DBはOracle。
まあ、ApacheとDBはあんまり関係ないけど。
コマンド中の「DPJ」はDevPartnerをインストールしたディレクトリの
パスを意味している。はず。
その他、TomcatとかJDKとかFirefoxとかのインストール先は
適宜読み替えるべし。

まず最初に間違えてはいけないポイント。
DevPartner自身を動かすTomcatと、アプリケーションサーバの
Tomcatは別物。当たり前だけど。

では設定開始。

1、インストール
ディスクを入れてボタンをポチポチ押すだけなので割愛。

2、デフォルトブラウザの設定
インストール中に設定していない場合は手動で。
DPJ/var/conf/nmDefaultBrowser がなければ作成。
中身。

#!/bin/sh
exec /usr/lib/firefox-3.0.10/firefox $*

firefoxのパスは環境に合わせて。
ちなみにこの部分、マニュアルの記述は間違っているので
コピペでは動かない。なんでexecで改行するのかな?

3、ブラウザのポップアップブロックを解除
してください。

4、ブラウザにJavaプラグインをインストール
URLに[about:plugins]を指定してブラウザを開くと
現在インストールされているプラグインが表示されるので
Javaがなければ入れる。
firefoxのインストールディレクトリのpluginsディレクトリ配下で
下記コマンドを実行。

ls -n JDKのパス/jre/plugin/i386/ns7/libjavaplugin_oji.so

5、DevPartnerのサーバ設定
デフォルトでいいはずだけど、動かなかったら確認すべき項目。

DPJ/tomcat/conf/server.xml のポートと
DPJ/var/conf/DPJ.conf のTOMCAT_PORTは一致している必要がある。

DPJ/var/conf/DPJServer.args はDevPartnerのTomcatの
起動パラメータを指定する。
アプリケーションサーバのではないので注意。

6、アプリケーションサーバのConfigurationを作成する
DPJ/bin/dpjadminをコマンドラインで実行する。
GUIが開くので、上のリストから「Generic App Server」を選択する
「Start Command」に「XXXX/bin/startup.sh」
「Stop Command」に「XXXX/bin/shutdown.sh」
「Installation Location~」にTomcatのホーム
「Java Home」にJDKのホーム
「Process Executable」に「java」
「Enter enough command~」にはTomcatのプロセスを特定するための情報。
例えば、ps -ef | grep tomcat を実行して表示されるプロセスの
-Djava.util.logging.config.file=...
~中略~
org.apache.catalina.startup.Bootstrap start
まで全部を書く。当然、試験したい対象のTomcatのプロセスを
書くこと。
「Detach session」にはチェックを入れたほうがいいかも。

7、Tomcatのスタート用シェルを変更
6の手順で何故デフォルトのTomcat Configurationを
使わなかったかというと、デフォルトのTomcatConfigで起動すると
起動ユーザがrootになってしまうのだ。
大抵のアプリケーションではtomcatの起動ユーザはtomcatにしているはず。
ということで、DevPartnerでもtomcatで起動したい。
が、これが上手くいかない。
tomcatで起動したTomcatプロセスをDevPartnerは認識しないのだ。
メモリリークの監視ができないのでは意味がない。
ので、仕方なくTomcatはrootで起動し、oracle_env.shに必要な
環境変数を書くことにした。
今回はORACLE系の環境変数が必要だったので、それらをoracle_env.shに
書いておいて、Tomcatのstartup.shの後ろから2行目
起動スクリプトの前に

. /パス/oracle_env.sh

を追加。パスの前の「.」がミソ。これがないとシェルの環境に
環境変数が設定されない。

8、DevPartnerを起動
ようやく、起動にこぎつけた。
まずはDevPartner自身をスタートさせる。

DPJ/bin/devpartnerj start

起動の確認。

DPJ/bin/devpartnerj status

ついでに、DPJ/var/ncs に ncs.lock があることも確認。
なければ
DPJ/bin/sendncs -start も実行してみる。

ここまでできたら

DPJ/bin/dpj

を実行。
UIが立ち上がった人、おめでとう。
立ち上がらなかった人、残念。
ログは、DPJ/var/logs に出ている。
健闘を祈る。

JTest(JUnit)のスタブの書き方。

2010-11-16 15:25:16 | お知らせ
めも。

doGet()メソッドの試験をする場合。
HTTP関連のクラスはXXXXAdapterが用意されている。

テストメソッド例:

public void testDoGet1() throws Throwable {
 HttpServletRequestAdapter httpServletRequestAdapter = new HttpServletRequestAdapter();
 httpServletRequestAdapter.addParameter("type", "1");
 HttpServletResponseAdapter httpServletResponseAdapter = new HttpServletResponseAdapter();
 MainServlet testedObject = new MainServlet();

 testedObject.doGet(httpServletRequestAdapter, httpServletResponseAdapter);
}

スタブ例:

public Object stubsDoGet1(Member method, Object _this, Object[] args) throws Throwable {
 Class[] argument_types;
 if (Stubs.matches(method, クラス名.class)) {
  argument_types = new Class[] { 引数のクラス名.class };
  if (Stubs.matches(method, "メソッド名", argument_types)) {

   // 複数回呼ばれるメソッドで異なる結果を返したい場合は_stubs_iterationを利用
   int index = _stubs_iteration.getIterationCount("java.io.BufferedReader.readLine()");
   switch (index) {
    case 1:
     return "test";
    default:
     return Stubs.NO_STUB_GENERATED;
   }
  }
 }
 return Stubs.NO_STUB_GENERATED;
}

_stubs_iterationを使う場合は、setUp()メソッドに次の1行を追加。

_stubs_iteration = new jtest.StubIterationCounter();

更に、テストクラス内で_stubs_iterationの宣言をしておくこと。

private jtest.StubIterationCounter _stubs_iteration;



ちなみに。
privateメソッドの場合は、JT.invokeを使用。

MainServlet testedObject = new MainServlet();
JT.invoke(MainServlet.class, testedObject, "privateMethod",
   new Object[] { "string" }, new Class[] { String.class });

Flash Lite1.1のしょーもないバグ

2010-10-08 16:44:08 | お知らせ
1、rotationさせるとMCが小さくなる
2、scaleを変えるとrotationが書き換わる

ええー?
MCをrotationさせるときは、セットでscaleを100にすること。
かならず、先にscaleを100にしてからrotationさせること。

なんだそりゃ?

iPhoneでFlashが再生できるブラウザ。

2010-09-06 10:20:07 | お知らせ
iPhoneでFlashが再生できるブラウザ「Skyfire 2.0 for iPhone」が
AppleStoreに提出された。
現在、審査待ち。
Safariベースで、Flash部分をH.264ストリーミング動画に
変換して再生するらしい。
果たして審査を通るのか。
ていうか、これ通らなかったらどういう理由で通らないのか
説明が難しそうです。
「Appleが気に入らないから」はさすがに横暴だろー。笑
Safariと被るから?
でもWebKitを公開してるのはAppleですよ。

まあ何にしろ、これが公開されたらiPhone唯一の弱点
「Flashが見れない」が解決される訳で
ますます手放せなくなります。
あとはキャリアだけだな。
伊豆に行ったら全く使えなかったし。
お笑い大会とかどうでもいいからアンテナ増やせ。

フィールド関係のショートカット

2008-09-18 17:30:46 | お知らせ
Alt + Shift + D
DATE フィールド (フィールド : 文字列、図、ページ番号などの情報を文書中に自動的に挿入するための命令。たとえば、Date (日付) フィールドは、現在の日付を挿入します。)を挿入します。

Alt + Ctrl + L
LISTNUM フィールドを挿入します。

Alt + Shift + P
PAGE フィールドを挿入します。

Alt + Shift + T
TIME フィールドを挿入します。

Ctrl + F9
空白のフィールドを挿入します。

Ctrl + Shift + F7
Word のリンク元ファイルのリンクされた情報を更新します。

F9
選択したフィールドを更新します。

Ctrl + Shift + F9
フィールドのリンクを解除します。

Shift + F9
選択したフィールド コード (フィールド コード : データ ソースの指定情報が表示される場所を示すテキストが入る枠。フィールドの実行結果を生成するフィールドの要素です。フィールド コードには、フィールド文字、フィールドの種類、および命令が含まれています。)の表示と実行結果 (フィールドの実行結果 : フィールドの命令が実行されたときに文書に挿入される文字列や図。文書を印刷したり、フィールド コードを非表示にすると、フィールド コードがフィールドの実行結果に置き換えられます。)の表示を切り替えます。

Alt + F9
すべてのフィールドについて、フィールド コードと実行結果の表示を切り替えます。

Alt + Shift + F9
フィールドの実行結果を表示しているときに、GOTOBUTTON フィールドまたは MACROBUTTON フィールドを実行します。

F11
次のフィールドへ移動します。

Shift + F11
前のフィールドへ移動します。

Ctrl + F11
フィールドをロックします。

Ctrl + Shift + F11
フィールドのロックを解除します。