Zabbix-java-gatewayでTomcat7をファイアウォール越しに監視する

以下はVirtualBox上で構築。ホストとはNATでつないで、ゲスト同士は内部ネットワークで接続。

f:id:shrkw:20130702181239p:plain

  • Zabbixサーバー: 192.168.56.2
  • Java Appサーバー: 192.168.56.3

Zabbix関連はyumでzabbix.comのリポジトリから追加。

rpm -ivh http://repo.zabbix.com/zabbix/2.0/rhel/6/x86_64/zabbix-release-2.0-1.el6.noarch.rpm

openJDKはyumで、Tomcatapache.orgからダウンロード。

Tomcat

RMIでサーバーのIPアドレスを解決できるようにする

http://netbuffalo.doorblog.jp/archives/4446395.html がとてもわかりやすくて助かる。 これはjconsoleだけの問題ではないので、すべからく解決する必要がある。 上記のサイトの通り、選択肢は3つ。

  • 起動オプションで -Djava.rmi.server.hostname=172.16.0.100 を指定
  • 起動オプションで -Djava.rmi.server.useLocalHostName=true を指定して、DNSで解決させる
  • /etc/hosts にホスト名とIPアドレスの紐付けをする

アプリケーションの起動時にRMIのサーバーのIPアドレスが解決されるので、反映には再起動が必要。

setenv.shにjmxremoteまわりの設定を追加

server.xmlのほうでRMIポートを指定するので、ここではポートの指定 [com.sun.management.jmxremote.port] は不要。 [java.rmi.server.hostname], [java.rmi.server.useLocalHostName] については、上記の通り、どこでRMIサーバーのIPアドレスの解決をさせるかによる。hostsで解決させていないのであれば、指定すること。

CATALINA_OPTS="\
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
";
export CATALINA_OPTS;

今回はauthenticateとかなしでやってるけど、本番では認証もSSLも設定する。その場合は以下のようになる。

CATALINA_OPTS="\
-Dcom.sun.management.jmxremote.authenticate=true \
-Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password \
-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access \
-Dcom.sun.management.jmxremote.ssl=true \
";
export CATALINA_OPTS;

この例では、confの下に jmxremote.password, jmxremote.access のふたつのファイルがあるという設定になっている。passwordファイルについては

でなければならない。 ちなみにそれぞれの内容は以下のような感じ。

$CATALINA_BASE/conf/jmxremote.access

monitorRole readonly

$CATALINA_BASE/conf/jmxremote.password

monitorRole tomcat

http://tomcat.apache.org/tomcat-7.0-doc/monitoring.html

JMXのポートを固定する

JMXが利用しているRMI(?)では2つのポートを使用するが、実行時オプションで [com.sun.management.jmxremote.port] で指定した場合、もうひとつのポートはランダムに使用される。そのため、ファイアウォールで制限された環境ではポートをフルで開くなどしない限り、RMIの疎通ができない。そのため、Tomcatには使用するポートを固定するための措置が存在する。

catalina-jmx-remote.jar を $TOMCAT_HOME/lib に配置

追加のjarが必要。

curl -O http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/tomcat/tomcat-7/v7.0.41/bin/extras/catalina-jmx-remote.jar

server.xmlにListenerを追加

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />

useLocalPorts="true" にすると、リモートから繋ごうとすると java.net.ConnectException connection refused になるので注意。

サービススタート

あとは適当にスタートすればOK。

参考

Zabbix-java-gateway

Zabbixサーバーに同居。/etc/zabbix/zabbix_server.conf みても、複数gatewayが設定できなそうだったし。

JMXで繋がるか試す

コマンドラインJMXクライアントで、とりあえず疎通できるか試す。

curl -O http://crawler.archive.org/cmdline-jmxclient/cmdline-jmxclient-0.10.3.jar
curl -O http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/tomcat/tomcat-7/v7.0.41/bin/extras/catalina-jmx-remote.jar

RMIの対向側なんで、catalina-jmx-remote.jarが必要。 こんな感じでclasspathにjarを追加して実行する。
指定するポートはrmiRegistryPortPlatformとして指定した10001だけでよい。rmiServerPortPlatformの10002ポートのほうは、とくに指定しなくても勝手にパケットが通るので、ファイアウォールで10001も10002も許可すること。

java -classpath /usr/sbin/zabbix_java/lib/catalina-jmx-remote.jar:cmdline-jmxclient-0.10.3.jar org.archive.jmx.Client - 192.168.56.3:10001

結果で、MBeanのリストが返ってくればOK.

 Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=HTMLManager
Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/manager,j2eeType=Servlet,name=Manager
java.lang:type=Memory
Catalina:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/examples,j2eeType=Servlet,name=stock
JMImplementation:type=MBeanServerDelegate
Catalina:context=/host-manager,host=localhost,name=StandardContextValve,type=Valve
(snip)

catalina-jmx-remote.jar を $zabbix_java/lib に配置

さっきダウンロードしたのを、java-gatewayのlibに置く。initスクリプト見たら、ここに置いたら実行時にクラスパスに追加してくれてた。

mv catalina-jmx-remote.jar /usr/sbin/zabbix_java/lib/

zabbix_java_gateway.confは編集しない

/etc/zabbix/zabbix_java_gateway.conf はそのままのでよいようだ。

サービススタート

あとは適当にスタートすればOK。

Zabbixサーバー側

Java Gatewayを設定

/etc/zabbix/zabbix_server.conf に設定を追加。

JavaGateway=127.0.0.1
JavaGatewayPort=10052
StartJavaPollers=5

JMXインターフェースの追加

これで終わり。ホストの追加のときにJMXインターフェースで

192.168.56.3:10001

を追加してやればOK. ここで指定するのも、rmiRegistryPortPlatformとして指定した10001だけ。10001だけなんだけど、上記の通り、rmiServerPortPlatformの10002ポートのほうもパケットが通るので、ファイアウォールで開けておく必要がある。

https://www.zabbix.com/forum/showthread.php?t=27111

JMXの設定の際にクレデンシャルを指定している場合はユーザー名とパスワードを設定する必要がある。でもホストのインタフェース設定では見つからない。では、どこで設定するかというと個別のアイテムで設定する。 https://www.zabbix.com/documentation/doku.php?id=2.0/manual/config/items/itemtypes/jmx_monitoring

マクロを使えるとはいえ、クレデンシャルはホストで指定するほうが素直というのはすでにフォーラムで話題に上がってた。ぼくもそう思う。

https://www.zabbix.com/forum/showthread.php?t=31764

あとは Template JMX Generic とか Template JMX Tomcat 7 のテンプレート[ https://gist.github.com/hgomez/3209196 ]を適用させていいんじゃないかと。

f:id:shrkw:20130702202612p:plain

アイコンが緑になると気持ちいい。

参考

migrate Redmine from 1.3.0 to 2.3.1 stable

You and I can normally follow the official article. http://www.redmine.org/projects/redmine/wiki/RedmineUpgrade

Keep DB available or start it

sudo service mysqld start

Requirements

sudo gem install bundler
sudo yum install -y gcc ruby-devel libxml2 libxml2-devel libxslt libxslt-devel
sudo yum install -y libffi libffi-devel

sudo bundle install --without development test postgresql sqlite rmagick

If you cannot accomplish with above command (I was so...), you should run following commands.

sudo yum install postgresql-devel
sudo yum install sqlite-devel
sudo yum install ImageMagick ImageMagick-devel

Download and extract Redmine and copy some files

wget http://rubyforge.org/frs/download.php/76933/redmine-2.3.1.tar.gz
tar xzf redmine-2.3.1.tar.gz
cp redmine-1.3.0/config/database.yml redmine-2.3.1/config/database.yml
cp redmine-1.3.0/config/configuration.yml redmine-2.3.1/config/configuration.yml
cp -pr redmine-1.3.0/files/ redmine-2.3.1/files/

cp -pr redmine-1.3.0/public/themes/* redmine-2.3.1/public/themes/

Migrate

rake generate_secret_token
rake db:migrate RAILS_ENV=production

Clean up

rake tmp:cache:clear
rake tmp:sessions:clear

Plugins

使っているプラグインはこんなの。

redmine_banner

0.0.9 is good

https://github.com/akiko-pusu/redmine_banner/tree/0.0.9

rake db:migrate_plugins RAILS_ENV=production

redmine_issue_templates

Should use trunk.

https://bitbucket.org/akiko_pusu/redmine_issue_templates/get/tip.zip

以前に入れていたのが最初期版だったため、migrationがうまくいかないので、手動でmigrateする。

ALTER TABLE issue_templates RENAME TO bak_issue_templates;
ALTER TABLE issue_template_settings RENAME TO bak_issue_template_settings;
DELETE FROM schema_migrations WHERE version LIKE '%redmine_issue_templates';

do install

rake db:migrate_plugins RAILS_ENV=production

do migrate manually

INSERT INTO issue_templates SELECT id, title, project_id, 9 , 3, note, description, true, updated_at, updated_at, issue_title, position, false FROM bak_issue_templates;
INSERT INTO issue_template_settings SELECT * FROM bak_issue_template_settings;

redmine_issue_extensions

Use 0.2.0. It is ok just replacing.

https://bitbucket.org/changeworld/redmine_issue_extensions/downloads/redmine_issue_extensions-0.2.0.zip

redmine_lightbox

https://github.com/zipme/redmine_lightbox

zipme版で。Undev版も動くけどサムネイルの表示がなかった。

桐谷さんの動画を集めてみた

誰の心のなかにも桐谷さんはいるっていう話ですよ。

4度目のTOEIC受験の点数は720点

  • LISTENING: 380
  • READING: 340

の720点だった。 LISTENINGがREADINGより良かったのって、はじめてのはず。 4回目でけっこう慣れてきて、かつ、毎日英語を書いたり喋ったりしてるわりには伸びてないなあ。隣席のひとは980点とかだし。

3回目の記録を書いてなかったけど、去年にも受けてた。たしか少し下がって、610点くらいだったはず。

See also: 2度目のTOEIC受験の点数は630点 - Bouldering & Com.

xenon基盤のXBOX360を修理した話

XBOX360の基本情報

  • 購入月 2007年4月
  • スタンダードモデルベース

  • HDMI端子非搭載、HDD20GBモデル

  • Xenon基盤
  • 2006-09製造

道具など

  • ダイソーのワッシャーセット
  • M5 x 10mmネジ * 4 (GPU側に使用)
  • M5 x 12mmネジ * 4 (CPU側に使用)
  • 超低頭ネジを使用
  • グリス

あとは T8とT10のトルクスドライバーとか適当に。

前段

4月の半ばに久しぶりに起動してみたらレッドリング RRoDがでた。タオル療法を試みたらいちおうレッドリングはでなくなったけど、起動してから2分くらいでフリーズしてしまう。丸6年なら保ったほうだ。

サポートのページを見ると、8100円で直してくれるらしい。もしかして360Sで返ってくれたりせんかと思って、いちおう、サポートに電話して訊いたら、修理前のと同じモデルを返す、今回のならHDMIなしのが返ってくるとのこと。そりゃそうだよね。
なので

  • 360Sを買う + HDDを移植する
  • 補償が切れるのを理解してつなぎで360を直してみる

の二本立てで行く。
と思っていたら、新型XBOXのニュースが。今のタイミングで360Sを買うのは止めて、360の自前修理だけで行くことに変更。
それに、HDD移植用に22日にdealextremeで360S用ハードディスクケースを注文してみたけど、まだ届いてないし。

分解

参考サイト

上から順に参考になった。

分解

古いテレホンカードとかで外のガワのプラスチックケースを開ける用の治具を作ってみたけど、後ろ側はけっきょく開けられず。
前だけ開けて引っこ抜いた。

修理

参考サイトと同じで、ペケ字の留め金をネジ式に変更。

ヒートシンク - ワッシャー - ワッシャー - 基盤 - ワッシャー - ネジ

な感じ。
最初、GPU側もダイソーで買ったM5 x 12mmを使ったら、ネジがアルミケースに干渉して閉まらない。なので、ハンズで超低頭ネジを買ってきた。

これは超低頭ネジに変える前の写真。GPU側のネジが高すぎる。

f:id:shrkw:20130429202952j:plain

CPU側もそうしたけど、こっちはダイソーのナベ小ねじでもいいと思う。
グリスはヨドバシで250円くらいで売ってた安いやつ。ちゃんと薄く塗ればこれでも十分だと思う。
あとは逆手順で組立て。アルミケースを固定する長いネジが一本収まらなかったのでなしにした。
ヒートシンクに着いてた留め金固定ネジには、アルミケースと基盤を固定するネジのデポ穴がある構造だけど、ネジを変えたので当然これも収まらず。
なので取り外して余った備品は以下。

  • ペケ字の留め金 * 2
  • 留め金固定ネジ * 8
  • 短いネジ * 8
  • 長ネジ * 1

復活

ヒートシンク再固定直後はやっぱりレッドリングになる。なので、参考サイトの通りに2分回して電源断。十分冷ましてから再度電源を入れたら復活した。

Motorola razr IS12Mの解除コードによるsimロック解除に失敗した(そのあと返金してもらえた)話

sim-unlock.netにIS12Mの選択肢がでていたのでトライしてみたけど解除できんかった。

see also http://www.doggisma.com/motorola/razr-xt909/razr-xt909_unlock

端末の情報

  • IS12M
  • システムバージョン 67.52.11.IS12M.KDDI.en.JP
  • ビルド番号 6.7.5-50_MR1-11

申し込み

現状、sim-unlock.netで該当する型番は以下の3つがみつかる。どれが正しいのかは不明。訊いても教えてくれんかった。 申し込みしたのは一番上の。

そういえば申し込みするときの電話番号であたまに+81をつけ忘れてたな。それは関係せんだろうけどなあ。

解除作業

だいたいこんな感じ。

  1. ワイヤレスとネットワーク->モバイルネットワーク->ネットワークモード->GSM/UMTSに変更
  2. ダイヤルから#073887*を押す
  3. 出てきたUIMロック解除画面にコードを入力

でも、

ネットワークロックを解除できませんでした。

というメッセージがでて失敗する。なんど試してもダメ。 なのでメールした。

送ったメール

Unfortunately I cannot unlock my IS12M a.k.a. Motorola razr for au KDDI (au KDDI is japanese mobile carrier).

1. Insert the foreign sim
2. Start the phone
      The phone indicate "au IC card errror. This sim card is invalid"
4. Open configuration
5. Change network modefrom Global to GSM/UMTS
6. Open dial pad
7. Input #073887* to dial pad
8. Input unlock code: ********
    The phone indicate "cannot reject network locking"

Do you give me any help?
Or do you give me refund?
I can take a video if you need.

そしたら、

こっちのコードを試しな

というメールが新しいコードとともに来たので試した。けど、それでも同じだった。 やっぱ解除コードではダメなんかな。

4/10追記: 返金までのやり取り

返金してもらえました。sim-unlock.netは安心して使えるところです!グイグイ問い合わせしたほうがいいだろうけど。

上記のメールを送ったのが 2013年4月3日 23:05 それ以降のやり取りを以下に貼り付け。

2013年4月3日 23:09 From: info@sim-unlock.net

Hi,
please enter 22222222 

2013年4月3日 23:57 From: me

Hi,
I encountered same error "Network unlock request unsuccessful" even when I entered 22222222.

2013年4月4日 0:14 From: info@sim-unlock.net

Please make a short video.

Basis for the complaints of non working codes is a video proof (using camera, mobile phone, etc), which will be visible: 
- Your phone IMEI number - this should be done from the keyboard by typing the key combination *#06#. 
- moment of entering unlock code and a message of any mistake. 
Film should be upload on YouTube.

2013年4月5日 0:06 From: me

I uploaded. http://youtu.be/11111111
Please check it.

2013年4月6日 0:40 From: me

Did you check the video?
Would you please give me refund?

2013年4月6日 0:44 From: info@sim-unlock.net

The film was sent to the supplier waiting for a decision.

2013年4月9日 21:56 From: me

How about the progress?
Iet me know when you will reply to me?

2013年4月9日 22:47 From: info@sim-unlock.net

I do not know yet.

という流れのあとに以下のメールが来て、Paypal経由で払ったのでPaypalで返金がありました。

2013年4月10日 0:36

Hello
Dear Hiroyuki Shirakawa
We are sorry that we could not unlock your phone.
We have just done refund of payment for your order.
We invite you to continue using our site.
Regards
http://sim-unlock.net/

Rubyを知らないひとがSinatraを使ってみる話 2013年3月版

Rubyとか全然知らないけどSinatraを調べて試してみた自分のための簡単なメモ。 参考は以下など。

ツールなど

それぞれのバージョンはこんなの。

[root@localhost mob_conf_gen]# bundle list
Gems included by the bundle:
  * backports (3.1.1)
  * bundler (1.3.2)
  * cgi_multipart_eof_fix (2.5.0)
  * daemons (1.1.9)
  * eventmachine (1.0.3)
  * fastthread (1.0.7)
  * gem_plugin (0.2.3)
  * haml (4.0.0)
  * mongrel (1.1.5)
  * rack (1.5.2)
  * rack-protection (1.4.0)
  * rack-test (0.6.2)
  * sinatra (1.3.5)
  * sinatra-contrib (1.3.2)
  * tilt (1.3.5)

ファイルいろいろ

最終的にはこんな感じ。あとは、staticなりmodelsなりviewsなり、適当に置いていけばいいみたい。

[root@localhost myproject]# ls -la 
total 60
drwxrwx---. 1 root vboxsf   646 Mar 11 12:39 .
drwxrwx---. 1 root vboxsf  1156 Mar  8 16:56 ..
drwxrwx---. 1 root vboxsf   102 Mar 11 11:53 .bundle
-rwxrwx---. 1 root vboxsf   190 Mar 11 11:56 Gemfile
-rwxrwx---. 1 root vboxsf   813 Mar 11 11:56 Gemfile.lock
-rwxrwx---. 1 root vboxsf   283 Mar 11 12:22 app.rb
-rwxrwx---. 1 root vboxsf    71 Mar 11 12:39 config.ru
drwxrwx---. 1 root vboxsf   102 Mar 11 10:48 vendor

Gemfile

pom.xmlのdependenciesタグみたいなもの。環境も指定したうえで必要なライブラリを書ける。

最終的なGemfile

source 'https://rubygems.org'
gem 'sinatra'
gem 'haml'
gem 'rack'

group :development do
  gem 'mongrel'
  gem 'sinatra-contrib', :require => 'sinatra/reloader'
end

config.ru

Rackupの起点になるファイル。 #\で起動オプションが書ける。 http://arika.org/2011/07/04/options-in-config-ru/

#\ --server mongrel

require 'app'
map '/app' do
  run MyApp
end

app.rb

Sinatraアプリ。

require 'bundler'
Bundler.require

class MyApp < Sinatra::Base
  configure :development do
    Bundler.require :development
    register Sinatra::Reloader
  end 
  get '/' do
    'index'
  end
  get '/hello' do
    'Hello, Frank.'
  end

コラム:rubygemsは不要?

require 'rubygems' は1.9系以上ならいらないらしい。 でも、上記のコードは1.8.7の環境でも動く。これは、/usr/bin/rackup のあたまで

require 'rubygems'

してるから。

[root@localhost ~]# head /usr/bin/rackup 
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'rack' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require 'rubygems'

なるほどねー。rackupを使わないなら require 'rubygems' 必要。 そして、普通にirbしただけならもちろん、 require 'rubygems' 必要。

irb(main):001:0> require 'bundler'
LoadError: no such file to load -- bundler
from (irb):1:in `require'
from (irb):1
irb(main):003:0> require 'rubygems'
=> true
irb(main):004:0> require 'bundler'
=> true

Bundlerでgemをインストール

bundle install --path vendor/bundle

起動

rackup

すれば、ワーキングディレクトリのconfig.ruをみていい感じに起動してくれる。

curl http:/localhost:9292/app

でレスポンスが返るはず。

Webrickの代わりにMongrel使う

普通にrackupするとWebrickが起動して遅い。なので、Mongrelを使ってみる。

Gemfileに

gem 'mongrel'

を追記してインストール。

bundle install

サーバー指定して起動。

rackup -s mongrel

毎回指定するのは面倒なので、config.ruに書く。 http://arika.org/2011/07/04/options-in-config-ru/

config.ru

#\ --server mongrel

require 'app'
map '/app' do
  run MyApp
end