<< 10月 2008 | Home | 12月 2008 >>

円高便乗 - アローシャフトを注文

劇的な円高が続いている中、ちょうど矢がへたって来たのでシャフト(羽とかが付いてない矢の軸の部分)を輸入しました。



X10 が£191.49(=28,000円くらい)、A/C/Eが£149.79(22,000円くらい)でした。さすがに日本で買うよりうんと安いですね。もちろん自分で責任をもってカット、羽つけ、ポイント付け、名前入れを行う必要がありますが。
もちろん送料と海外送金手数料(クレジットカード使えないお店だった)、消費税が別途かかりますが今回は3人分のシャフトを買ったので一人当たりの負担は1/3に。
ちなみにアーチェリー用品は関税はかかりません。

最近愛用していたLancasterはシャフトの輸出をするなとイーストンに言われているとかで売ってくれませんでした。
メーカーが小売店にそんなことを言っていいんでしょうか?
もちろん強制力はないでしょうけど、競技用のシャフトは独占企業なのでなんとも抵抗できないんでしょうね。

タグ :
このエントリーをはてなブックマークに追加   

JBoss COMPASS Tokyo 2008

今日は JBoss COMPASS Tokyo 2008 でした。

私は『パフォーマンスチューニング、マイグレーションの落としどころ』というトラックでパフォーマンスチューニングのパートを喋らせていただきました。
大勢の方にお申込頂き事前に申し込みを締め切ってしまうほどの満員御礼。ありがとうございます。
最後のトラックということもあり油断して長々と喋ってしまいました。後に用事があった方、マイグレーションのパート担当の方!、申しわけありません。

実際のパフォーマンスチューニング案件でよく見られるボトルネック箇所をまとめてみました。
色々パラメータを変えながらおいしいところを見つけるタイプのチューニングを想像
ていた方にはもしかしたら期待はずれだったかもしれません。

スライドは近日中に公開予定です。URLが確定しましたらお知らせいたします。

2つだけ写真をとったので置いておきます。

JBoss jBPM 開発レシピ


BOF - Bruno, Pete, JBossエンジニアが語る、これからの JBoss

直接 JBoss とかレッドハットとは関係ないプロジェクトですが、「で便利してますっ」、とか虚無僧愛してる!」といった声を聞くこともできて嬉しかったです!

ちなみに冒頭で紹介した JBoss や RedHat のニュースを流してくれる Twitter ボットは JBossNewsRedHatNewsです。

もし感想など書かれましたらトラックバックやコメントでお知らせいただけるととっても嬉しいです。
質問などももちろんどうぞ!

関連記事:
JBoss COMPASS Tokyo 2008 に行ってきた - tokuryoのJavaEE5日記
JBossCOMPASS行ってきましたw - ぼちぼち日記
2008-11-29 - わきぶろぐ2008
マロマゴ: JBoss COMPASS に行ってきました

タグ :
このエントリーをはてなブックマークに追加   

パンク修理 その前に - 虫ゴムを交換

最近駅まで自転車を使うようになりました。別にダイエットとかじゃなくて・・・、ただ、乗るようになっただけです。


あたりまえですが、久しぶりに乗る自転車は空気が抜けていて漕ぐのが重いですね。
思い切り空気をいれて快適・・・なのもつかの間、1週間半ほどでタイヤがぷよぷよになってきました。
パンクだったらもっと早く空気抜けるだろうし、おかしいなーと思い空気を入れ直してみると、入れたそばから「シュー」と少しずつ空気が漏れているではありませんか!
音がするのは今まさに空気を入れたところ。どうも弁がイカれてしまったみたい。

弁の部分だけ買えるのかなーと100円ショップをさまよってみれば、あるじゃないですか!
弁の部分の肝のパーツ、虫ゴムというみたい。知りませんでした。ただのゴム管ですが、構造的にはなかなか面白いです。
40cmの細いゴム管で、100円。弁一つにつき22mmしか使わないのでとても経済的!!!

空気が抜けやすくなったらまず虫ゴムを交換ですね。これ今日から常識!!!!


愛車


これ、ブログに書いていませんでしたが太陽石油のキャンペーンで当選したキルビルロゴ入りのレアモノ


空気入れるトコ。この一般的なのは英式バルブと呼ぶそうです


弁を抜いたところ。ピントが合っていませんが、黒いゴムチューブの途中で金属部分が露出しているのが見えます


古い虫ゴムを取り除いたところ。劣化していたのでモロモロとはがれました


新しいゴムをつけたところ


虫ゴムの交換、有名なメンテナンス方法なのでしょうか?全く知りませんでした。定期的に買えると自転車が長持ちしていいかもしれませんね。

ところで、ゴム管ってどうやって製造するんでしょう?

Amazon でパンク修理キットを購入:

オッフル パンク修理セットDX <№2/ワックス付> Y3459
オッフル パンク修理セットDX <№2/ワックス付> Y3459

Amazonで詳しく見る
by G-Tools


楽天でパンク修理キットを購入:

このエントリーをはてなブックマークに追加   

Time Machine - バックアップの作成を完了できません。 - その2

Time Machine でバックアップ中にエラーが発生してしまった件の続き。

インデックス作成に失敗しているっぽいファイルを削除してもだめでした。
また別のファイルで同じエラーが発生してしまったのできりがなさそうです。

他に解決策はないかと調べたら、apple のディスカッションボードに行き着きました。

I've managed to get Time Machine to resume doing backups using this backup volume without re-initialising the disk and losing the existing backups.

If you check in the Backups.backupdb directory under the name of the machine you're trying to use Time Machine on, you will see a directory with directories consisting of a date and time, as well as a directory called "Latest". If backupd is interrupted it looks like it leaves behind a folder with the date and time of the last backup and .inProgress on the end. So in my case, it was called "2008-11-24-100439.inProgress". If you delete this directory and resume Time Machine, it appears to not have the same error.

I still need to check whether there are any problems with the other backups on the volume, but at least Time Machine is working at the moment.
- Apple - Support - Discussions - Reproducable TimeMachine indexing ...

Backups.backupdb ディレクトリ中の YYYY-MM-DD-hhmmss.inProgress というディレクトリを削除したらうまくタイムマシンが動くようになったとのこと。

現在試しているところですが、1.2GB 中 1.0GB までバックアップが進んでおり順調です!

追記:
無事バックアップできました。

関連記事:
[N] 「TimeMachine」バックアップ中にファイルコピーでエラー

タグ :
このエントリーをはてなブックマークに追加   

Time Machine - バックアップの作成を完了できません。

自宅サーバを持っていると大量ファイルをドカドカ置いておけたり、weblog を作って好き勝手にカスタマイズできたりと便利なのですが運用はかなり気を遣います。

もちろん電源はいれっぱななし。ノートパソコン内蔵の 2.5 インチのハードディスクなどは長時間運用に耐えられないのか結構頻繁に壊れます。
#なんか、以前よりも最近のハードディスクの方が耐久性が低くなってきたような・・・・。

サーバのハードディスクのクラッシュは2,3回経験しているので最近は贅沢に 3.5インチ、1TB のハードディスク2つを RAID1 でミラーリングしています。
さらに、1時間おきにタイムマシンでバックアップをとるという用意周到さ。
まだ雷、火事では両方ダメになる可能性がありますが・・・

で、Time Machine 困ったことにたまに止まってしまいます。
「Time Machine のエラー バックアップの作成を完了できません。バックアップボリュームにファイルをコピー中にエラーが起きました。」というエラーダイアログがでてしまいます。


困ったことにコレが一度発生すると過去のバックアップを捨てて1からバックアップしなおさないと直りません。

今回2度目に発生したのでさすがに他に事例があるだろうと、しらべてみるとたくさんヒットしました。
Time Machineがエラーを吐いた - griffin-stewieの日記
Burggarten Studio:TimeMachineのエラー解決法 - livedoor Blog(ブログ)
Time Capsule: Initial backup is interrupted

Apple のナレッジベースは残念ながらあまり役に立ちませんが、上の二つのブログで照会されている方法で解決しました。

やり方は簡単で、/Library/Preferences/com.apple.TimeMachine.plistを捨てて Time Machine の設定をし直すだけ。

これでまた安心して眠れそうです。
だめでした。続きはこちら↓
Time Machine - バックアップの作成を完了できません。 - その2 - 侍ズム

タグ :
このエントリーをはてなブックマークに追加   

JBoss AS 5 は12月にリリース

アーキテクチャを刷新したり、JavaEE 5 に対応したりと盛りだくさんな JBoss AS 5 のリリース日が 12月に決まったようです。
J-Development » Jboss AS 5 GA release date
JBoss.com - Forums - Jboss 5 release date?

レッドハットで検証した上でリリースする JBoss EAP 5 のリリースはまたその先になります。
Fedora とRed Hat Enterprise Linux みたいな関係です。

タグ :
このエントリーをはてなブックマークに追加   

Seam の Refcard

Seam のアンチョコが dzone.com に掲載されていました。
これは便利そう!!
Core Seam | Refcardz

ちなみに dzone.comokyuu.comの英語版みたいなもの(それともokyuu.comdzone.comの日本語版?)で、技術的なものに特化した新鮮な記事がどんどん掲載されるサイトです。お勧め。

関連記事:
Seam2.1.0GA リリース
実践! JBoss Seam テクニカルセミナー 8月28日開催
mavenize されたプロジェクトを簡単に作成 - archy

タグ :
このエントリーをはてなブックマークに追加   

iPhone 2.2 - 絵文字を i.softbank.jp 以外のアカウントでも使えるようにする - ちょっと半端に

iPhoneをもっているけれども、メールのプッシュが便利なのでソフトバンクユーザとも @mac.com、または @me.com でやりとりしているという方も多いはず。
ファームウェアが2.2 にバージョンアップされ、絵文字が使えるようになったのは良いのですが、i.softbank.jp のアカウントでしか有効にならないのが困りもの。

:): Simple Hack Enables Roughly One Gazillion Japanese Emoticons On Any iPhone

/User/Library/Preferences/com.apple.Preferences.plist を Cyberduck とか scp で転送し、
‘true’: KeyboardEmojiEverywhere というキーを追加するだけ。
#やってみたら PropertyListEditor で選択するのは 'true' じゃなくて 'yes' でした。

変更済みのファイルを元の位置に戻して iPhone を再起動してみると・・おぉ!確かに絵文字が mac.com のアカウントでも使える!!!


・・・でもテストで自分宛に送ったメールは文字化けしてしまいました。


ぐむむ。これではダメですね。
あと一歩!

タグ :
このエントリーをはてなブックマークに追加   

Twitter4J 1.1.1 リリース

Twitter4J 1.1.1 をリリースしました。
maven central repository に数時間以内にアップされます。

Twitter4J は Twitter API 用のオープンソースかつ maven 対応の Java ライブラリで BSD スタイルのライセンスで提供されています。
http://yusuke.homeip.net/twitter4j/index.html


Twitter4J 1.1.1 はいくつかのバグ修正を含んでおり、全てのユーザが適用することを推奨します。

Bug

  • [TFJ-54] - Show method should take long instead of int
  • [TFJ-55] - Show method shouldn't require userid and password
  • [TFJ-56] - TwitterResponse from AsyncTwitter is not Serializable
  • [TFJ-57] - Date is encoded twice, and therefore "since" doesn't work
  • [TFJ-60] - hashCode and equals are not properly implemented

Improvement

  • [TFJ-47] - implement toString()


ちなみに私のアカウントは http://twitter.com/yusukeyです。
お気軽に follow してください。

Twitter4J を使ってくれているらしいプロジェクト:
Twitter Analytics
Twitter の発言をクライアント、国などの観点から統計を取って公表しているサイト。
Suittar! - Java-based Twitter Client.
Pure Java の Twitter クライアント。
Mots - yet another Java Based Twitter Client
Suittar! よりシンプルな Pure Java クライアント。
ブログなんだよもん - Twitterクライアント作ってみたよ!(TwitCafe)
Pure Java の Twitter クライアント。GUI に JavaFX を使うことを予定しているらしい!!
TwitterMail.com - 8209 people sent 173236 messages to Twitter!
メールで Twitter の操作、通知ができるサービス。
Twittercal — tweet your google calendar
Twitterで予定を簡単に管理できるサービス。
Twitter Plugin - hudson - Hudson Wiki
継続ビルドシステム、Hudson のプラグイン。
ぽすったー - cactusman日誌
Twitter の CUI クライアント。
さぼったー 0.0.1.SNAPSHOT - 都元ダイスケ IT-PRESS
Eclipse のプラグイン。
IntelliJ IDEA Plugins
頼まれもしないのにSabotterを移植してみた - marsのメモ
さぼったーの IDEA 版。
tweetPad
Twitter の発言をビジュアルに表現してくれるソフト。

ご利用ありがとうございます!
他にありましたらコメント、またはメーリングリストで教えてください。

関連エントリ:
Twitter4J 1.1.0 リリース
Twitter4J 1.0.6 リリース
Twitter4J 1.0.5 リリース
Twitter4J 1.0.4 リリース
Twitter4J 自前 maven リポジトリを公開
Twitter4J 1.0.3 リリース
Google Calendar と Twitter を連携 - Twittercal
Suitter Public beta 1.0
メールで Twitter! - TwitterMail.com
Twitter4J 1.0.2 リリース
Twitter4J 1.0.1 リリース
Twitter4J 1.0 リリース

このエントリーをはてなブックマークに追加   

JBoss のログ設定

メモ
Configuring Logging in JBoss | Javalobby
JBoss のログは広く普及している log4J を使っているので設定は難しくありませんが。

タグ :
このエントリーをはてなブックマークに追加   

CPNI-957037 - SSH脆弱性の対策

とりあえず SSH なら大丈夫、と思っていましたが SSH でデータが漏洩する可能性があるとのこと。
CPNI-957037: SSH 通信において一部データが漏えいする可能性

成功する可能性は低く、実際に漏洩してしまったとしても通信内容が漏れ続けるようなことはないそうなので驚異としては低い分類になるみたいです。
が、対策しておくに越したことはありません。

対策は .ssh/config に Ciphers aes256-ctr,aes192-ctr,aes128-ctr と書いておくことだそうで。
OpenSSH情報

/Users/yusukey/.ssh$ cat config
...
Ciphers aes256-ctr,aes192-ctr,aes128-ctr
...

効いているかどうかは -v スイッチで確認できます。
/Users/yusukey/.ssh$ ssh -v yusuke.homeip.net
...
debug1: kex: server->client aes256-ctr hmac-md5 none
debug1: kex: client->server aes256-ctr hmac-md5 none
...

このエントリーをはてなブックマークに追加   

NASA が隠している Mars Phoenix の発見の数々

水(氷)どころか大変なものを発見していたようです。
Mars Phoenix: 30 Mars Phoenix Discoveries NASA Will Never Show the World

こういうの嫌いじゃありません。

このエントリーをはてなブックマークに追加   

JBoss 上の JIRA 3.13.1 へ FishEye プラグイン 2.3 をインストール

FishEyeJIRAは同じAtlassianの製品なので当然仲が良いです。
JIRA用のFishEye プラグインを使うことでスムースに連携させることができるようになります。

インストールガイドはこちら。
・英語 - FishEye for JIRA Installation Guide - JIRA Extensions - Confluence
・日本語 - FishEye インストールガイド - FishEye オンラインマニュアル (1.5版) - Atlassian Confluence

例によって日本語でメモを書いておきます。

- README.txt の内容
1. jira-fisheye-plugin-2.3.jar と atlassian-p4package-2007.12.14.jar を JIRA の WEB-INF/lib ディレクトリにコピー

2. 古い FishEye プラグイン jar ファイルを WEB-INF/lib から削除
JIRA 3.13.1 にはデフォルトでバージョン 2.2.1 のプラグイン jar ファイルが入っていたのでこれは削除しました。
Finder では「使用中」ということで削除させてもらえなかったのでコマンドラインから rm コマンドで無理矢理削除しました。

最初からチョット古い FishEye プラグインが入っている

3. JIRA Perforce プラグイン jar ファイルを削除
JIRA 3.13.1 にはデフォルトでバージョン2.3 付属のと同じ atlassian-p4package-2007.12.14.jar が入っていました。
なので手は触れていません。

4. 古い atlassian-p4package jar ファイルを WEB-INF/lib ディレクトリから削除 例) atlassian-p4package-2006.12.5.jar
atlassian-p4package は導入していなかったのでそもそも存在しませんでした。

- FishEye プラグインの有効化
5. JIRA を再デプロイすることで FishEye プラグインを有効化します。
展開ディレクトリ形式でデプロイしてあるので web.xml を touch(タイムスタンプを更新)すれば再デプロイできます。

$ touch deploy/jira.war/WEB-INF/web.xml


- FishEye プラグインのセットアップ
6. FishEye API の有効化
JIRA と FishEye は FishEye の XML-RPC ベースの API を通して連携します。
デフォルトで API は無効になっているので FishEye の管理画面で有効化します

[Server Settings > Web Server > Remote API] から設定できます。

FishEye API を有効化

7. JIRA を開いて [Administration > FishEye Configuration] へ

FishEye プラグインの Welcome 画面

FishEye 使っているならセットアップに進んでね、と書いてありますので [Setup FishEye] を押下

8. FishEye プラグインの設定 その1
色々細かい設定があるけど、今回設定したのは以下の4つだけ
FishEye URL: http://yusuke.homeip.net/fisheye/
API URL: http://localhost:8060/fisheye/api
FishEye Username: FishEye の管理画面で作っておいたユーザID
FishEye Password: FishEye の管理画面で作っておいたユーザのパスワード

API URL は書かなくても良いのですが、JIRA と FishEye が会話するのにいちいち Apache が介在する必要はないのでこうしてみました。


FishEye の設定-1

9. FishEye プラグインの設定 その2
FishEye プラグインはコミットログから JIRA の issue id を探し出してリンクを張る仕組みになっています。

どのリポジトリにどのプロジェクトが入っているのか、プロジェクトのキーをスペース、またはカンマ区切りで入力します。
プロジェクトのキーはBROWSE PROJECTS で確認できます。
特に入力しなければ JIRA でホストしているプロジェクト全てを探します。
今回はリポジトリ一つに全てのプロジェクトが入っているので何も書いていません。

FishEye の設定-2

10. 完了!
これで FishEye プラグインの設定が完了しました。
Issue を開くと FishEye というタブが表示されます

FishEye タブを開くとその issue に関連するチェックイン履歴が確認できます。
何行追加されたのか、削除されたのかという情報と、diff へのリンクなどがあります。subversion プラグインよりも細かい情報が見られて便利ですね。
[#TFJ-34] Status#getCreatedAt(), UserWithStatus.getCreatedAt() and DirectMessage.getCreatedAt() should return java.util.Date - JIRA


FishEye プラグインの様子

さぁ、セットアップが完了したらあとはコードを書くだけ!

関連記事:
JIRA をバージョン 3.13.1 へアップデート
FishEye 1.6.3 のインストール
JIRA をバージョン 3.12.3 へアップデート

JIRA(バグトラッキングシステム), Confluence(Wiki) など Atlassian 社の製品は日本では代理店であるイマヒマ社より購入していただくことも可能です。
チームウェア - アトラシアン JIRA(ジラ):画期的な課題トラッキング! Confluence(コンフルエンス):企業向けウィキ

タグ :
このエントリーをはてなブックマークに追加   

JIRA をバージョン 3.13.1 へアップデート

JIRA はAtlassian社のJava ベースのバグトラッキングシステムで、ApacheJBossでも使われています。
とっつきやすさと高機能をうまく両立しており、また見た目が洗練されている素晴らしい製品です。
オープンソースプロジェクトへは無償ライセンスを提供してくれるので私のプロジェクトでも使っています

日本ではイマヒマ社が代理店をしており日本語版を販売しています。
チームウェア - アトラシアン JIRA(ジラ):画期的な課題トラッキング! Confluence(コンフルエンス):企業向けウィキ
JIRA(ジラ) - 画期的な課題トラッキング!

先日アップデートしたばかりなのですが、3ヶ月のうちにちょこまかとアップデートされましたので、またまた最新版にしました。
README に沿って作業しただけですがメモを残しておきます。
今回はアップデートですが、新規インストールの手順もほとんど同じです。

JIRA のバージョンは 3.12.3 から 3.13.1 になりました。

1. 現行 JIRA のバックアップ、新規インスタンスでインポート
既存 JIRA インスタンスより、
ADMINISTRATION > Import & Export > Backup Data to XML
File name: バックアップ先/jirabackup.xml > "Backup"

2. トラックバックを削除
先日トラックバックスパム攻撃を受けたのでバックアップした xml から TrackbackPing 要素を vi で削除しました。

%s/^ <TrackbackPing.*$//g

1. Atlassian より最新版をダウンロード
http://www.atlassian.com/software/jira/JIRADownloadCenter.jspa
デフォルトではスタンドアロン版のみ表示されています。今回は自前の JBoss にデプロイするので "Show all" をクリックして Enterprise - WAR/EAR 版を表示、ダウンロードしました。

3. MySQL にデータベース作成
既存データベースに接続させることもできるけれども、最適なスキーマを作るには新規にデータベースを用意した方が良いとのことです。
$ ./mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 26441
Server version: 5.0.45 MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database jira313 character set utf8;
Query OK, 1 row affected (0.03 sec)

mysql> Bye

$JBOSS_HOME/server/$MYCONFIG/deploy 以下に以下のファイルを作成してコネクションプール/データソースを作成。
jira313-ds.xml
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>JIRA313DS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/jira313</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<connection-property name="useUnicode">true</connection-property>
<connection-property name="characterEncoding">UTF8</connection-property>
<user-name>yusukey</user-name>
<min-pool-size>10</min-pool-size>
<max-pool-size>10</max-pool-size>
<prepared-statement-cache-size>32</prepared-statement-cache-size>
</local-tx-datasource>
</datasources>

4. JIRA のデータソース設定
atlassian-jira-enterprise-3.13.1/edit-webapp/WEB-INF/classes/entityengine.xml を修正
接続 DB を hsql から mysql に、schema-name を削除。
99:    <datasource name="defaultDS" field-type-name="hsql"
100: schema-name="PUBLIC"

99: <datasource name="defaultDS" field-type-name="mysql"
100: <!--削除-->

atlassian-jira-enterprise-3.13.1/edit-webapp/WEB-INF/jboss-web.xml を作成。
<jboss-web>
<context-root>/jira</context-root>
<virtual-host>yusuke.homeip.net</virtual-host>
<resource-ref>
<res-ref-name>jdbc/JIRADS</res-ref-name>
<jndi-name>java:/JIRA313DS</jndi-name>
</resource-ref>
<resource-ref>
<res-ref-name>mail/MailSession</res-ref-name>
<res-type>javax.mail.Session</res-type>
<jndi-name>java:/Mail</jndi-name>
</resource-ref>
</jboss-web>

これでローカルJNDI に jdbc:/JIRA313DS としてバインドされているデータソースをアプリケーションローカルの JNDI ツリーにリンクします。

atlassian-jira-enterprise-3.13.1/webapp/WEB-INF/web.xml を編集
以下をアンコメントてデータソースのリンクを有効にします。
    <!-- resource references -->
<!-- Uncomment for WebSphere
<resource-ref>
<description>Database for JIRA</description>
<res-ref-name>jdbc/JIRADS</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>SERVLET</res-auth>
<res-sharing-scope>Unshareable</res-sharing-scope>
</resource-ref>
Uncomment for WebSphere -->


5. メールセッションの設定
atlassian-jira-enterprise-3.13.1/webapp/WEB-INF/web.xml を編集し、以下の行を追加してメールセッションを有効にします。
    <resource-ref>
<res-ref-name>mail/MailSession</res-ref-name>
<res-type>javax.mail.Session</res-type>
<res-auth>Container</res-auth>
</resource-ref>


6. Subversion プラグインの導入
http://confluence.atlassian.com/display/JIRAEXT/JIRA+Subversion+plugin
subversion-jira-plugin.properties を設定し、atlassian-jira-enterprise-3.13.1/edit-webapp/WEB-INF/classes/subversion-jira-plugin.properties に配置
atlassian-jira-enterprise-3.13.1/edit-webapp/WEB-INF/ に lib ディレクトリを作成し、atlassian-jira-subversion-plugin-0.10.4.jar、svnkit-1.1.6.jar を配置
subversion-jira-plugin.properties で編集したのは以下場所。
15c15
< svn.root=http://svn.atlassian.com/svn/public/contrib/jira/subversion-jira-plugin/samplerepo/
---
> svn.root=file:///Users/yusukey/repos/
25c25
< svn.display.name=Sample Repository
---
> svn.display.name=Samuraism Repository
95,100c95,100
< linkformat.changeset=http://svn.atlassian.com/fisheye/changelog/public?cs=${rev}
< linkformat.file.added=http://svn.atlassian.com/fisheye/viewrep/public${path}?r=${rev}
< linkformat.file.modified=http://svn.atlassian.com/fisheye/viewrep/public${path}#${rev}
< linkformat.file.replaced=http://svn.atlassian.com/fisheye/viewrep/public${path}#${rev}
< linkformat.file.deleted=http://svn.atlassian.com/fisheye/viewrep/public${path}
< linkformat.copyfrom=http://svn.atlassian.com/fisheye/viewrep/public${path}
---
> linkformat.changeset=http://yusuke.homeip.net/fisheye/changelog/svn?cs=${rev}
> linkformat.file.added=http://yusuke.homeip.net/fisheye/viewrep/svn${path}?r=${rev}
> linkformat.file.modified=http://yusuke.homeip.net/fisheye/viewrep/svn${path}#${rev}
> linkformat.file.replaced=http://yusuke.homeip.net/fisheye/viewrep/svn${path}#${rev}
> linkformat.file.deleted=http://yusuke.homeip.net/fisheye/viewrep/svn${path}
> linkformat.copyfrom=http://yusuke.homeip.net/fisheye/viewrep/svn${path}

7. Subversion プラグインインデックスの削除
rm -Rf ~/jiraindex/plugins/atlassian-subversion-revisions


これをしないと Subversion プラグインが以下のような例外を吐くことがあります。
15:20:33,896 INFO  [STDOUT] 2008-08-23 15:20:33,887 ajp-0.0.0.0-8009-6 ERROR [ext.subversion.projecttabpanels.SubversionProjectTabPanel] Error retrieving actions for project
java.lang.NumberFormatException: For input string: "117b7e0d-5933-0410-9d29-ab41bb01d86bhttp://localhost/svn"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Long.parseLong(Long.java:412)
at java.lang.Long.parseLong(Long.java:461)
at com.atlassian.jira.plugin.ext.subversion.revisions.RevisionIndexer.getLogEntriesByProject(RevisionIndexer.java:659)
at com.atlassian.jira.plugin.ext.subversion.projecttabpanels.SubversionProjectTabPanel.getRecentCommits(SubversionProjectTabPanel.java:159)
.
.
.

8. warのビルド、デプロイ
atlassian-jira-enterprise-3.13.1$ ./build.sh war
Buildfile: build.xml

init:
.
.
.
--------------------------------------------------
Deployable WARs generated:

TOMCAT: /Users/yusukey/Downloads/atlassian-jira-enterprise-3.13.1/dist-tomcat/atlassian-jira-3.13.1.war
GENERIC: /Users/yusukey/Downloads/atlassian-jira-enterprise-3.13.1/dist-generic/atlassian-jira-3.13.1.war


See http://www.atlassian.com/software/jira/docs/latest/servers/ for install instructions
--------------------------------------------------


BUILD SUCCESSFUL
Total time: 1 minute 38 seconds
$ mv dist-tomcat/tomcat-6/atlassian-jira-3.13.1.war $JBOSS_HOME/server/default/deploy/jira.war


9. 新規インスタンスでインポート
新規インスタンスにアクセスし、インポート。
Import Existing Data
File name: /Users/yusukey/jirabackup.xml

インポート画面。ここだけなぜか日本語


以上でバージョンアップが完了。

今回はなぜか Subversion プラグインが登録する Quartz タスクが重複しているとかいうエラーがでました。以下のページを見て解決。
JSP-21957 - Multiple services with name 'Subversion Revision Indexing Service' exist - Atlassian KnowledgeBase - Confluence

見かけはほとんど変わりませんでした。

せっかくFishEye を入れたので連携させたいですね。
もちろんプラグインがあります。
FishEye for JIRA - JIRA Extensions - Confluence
05.06 プロジェクトでFishEyeのコミット情報を見る - JIRA オンラインマニュアル (3.12.2版 - 最新) - Atlassian Confluence

関連記事:
JIRA 3.13.1 へ FishEye プラグイン 2.3 をインストール
FishEye 1.6.3 のインストール
JIRA をバージョン 3.12.3 へアップデート

このエントリーをはてなブックマークに追加   

FishEye 1.6.3 のインストール

FishEye はJBoss や Apache で使われているバグトラッキングシステム JIRA を開発している Atlassian の製品で、ソースコードリポジトリの変更履歴を確認したり、統計情報を確認したりできる Web アプリケーションです。
例によってオープンソース製品には無償のライセンスが用意されていてJBoss.orgでも使われています。

今回 自宅の JIRA とあわせて使ってみることにしました。

インストールガイドは以下のページにあります。
・英語 - FishEye Installation Guide - FishEye 1.6 - Confluence
・日本語 - FishEye インストールガイド - FishEye オンラインマニュアル (1.5版) - Atlassian Confluence

1. FishEye 1.6.3 のダウンロード
ダウンロードページより zip アーカイブをダウンロードします。FishEye はどういうわけか JIRA と違って JBoss や WLS 等の既存のアプリケーションサーバにデプロイすることはできず、スタンドアロン版しかないそうです。
ちなみに Jetty を内蔵しているようです。

FishEye Downloads

2. FishEye インストールディレクトリの作成
FishEye は自己完結型のディレクトリ構成を持っていますが、そのまま利用するとアップグレードが面倒になるため、運用環境ではデータは別ディレクトリに配置することを推奨しています

というわけで好きな位置に fisheye ディレクトリを掘ってみました。
また、fisheye ディレクトリには fisheye-1.6.3/config.xml ファイルをコピーしておきます。

3. FishEye を起動
まずは起動してからセットアップします。

$ export FISHEYE_INST=~/server/fisheye
$ export FISHEYE_HOME=~/server/fisheye-1.6.3
$ cd /FISHEYE_HOME/bin
./run.sh
INFO - FishEye 1.6.3 (build-336), Built on 2008-11-04
INFO -
INFO - =======================================================
INFO -
INFO - Welcome to FishEye!
INFO -
INFO - You need to configure an admin password and enter your
INFO - license key. You can do this by accessing FishEye through
INFO - a web browser:
INFO -
INFO - http://hostipaddress:8060/
INFO -
INFO - Alternatively you can edit config.xml, refer to the
INFO - FishEye administration guide for more infotmation:
INFO -
INFO - http://confluence.atlassian.com/x/N4CDBQ
INFO -
INFO - =======================================================
INFO -
Could not find a FishEye license.
Please visit http://my.atlassian.com and quote ****-****-****-**** to obtain a valid license,
or visit http://www.atlassian.com/fisheye/renew to renew your license.
INFO - Periodic polling for software updates is disabled.
INFO - Server started on :8060 (http) (control port on 127.0.0.1:8059)
WARN - No license info available, not starting FishEye repositories.


起動すると Server ID という 16 ケタの16進数の ID が発行されます。
これを控えておき、http://my.atlassian.com で評価用ライセンスを取得します。

4. ライセンスの入力
http://my.atlassian.com でライセンスキーを取得できたら http://ホスト:8060にアクセスし、ライセンスキーを入力します。

ライセンスキーを入力


ライセンスが受け入れられたところ

5. リポジトリのセットアップ
http://ホスト:8060/adminにアクセスすると、管理画面になります。

fisheye 管理画面
[Repository List > Add repository] より、リポジトリを追加するフォームが表示されます。
Name*: リポジトリの名前
Repository type: SVN, CVS, perforce の中から選択
SVN URL*: プロトコルスキームから始まるリポジトリのパスを入力
Path: リポジトリのうち特定のディレクトリだけを fisheye で表示したい場合は入力
trunk/branch/tag structure: /project/trunk/..., /project/branches/NAME/..., /project/tags/NAME/...


リポジトリ追加フォーム

フォームに必要事項を記入したら [add] でリポジトリの追加が完了。
自動的にリポジトリのスキャンが始まります。

6. コンテクストパス、ajp コネクタのセットアップ
FishEye はデフォルトでルートコンテキストで動作するようです。
今回は FishEye 用のサブドメインを立てるのではなく、http://yusuke.homeip.net/fisheye/ というパスでアクセスできるようにしたいのでコンテクストパスを設定することにしました。
コンテクストパスやその他 Web サーバの設定は [Server Settings > Web Server > Edit settings] より行えます。
以下のように設定しました。
WebContext: fisheye
Http Bind Address: 8060
Ajp13 Bind Address: 8069

Bind Address のところは特定の NIC だけでリスンてほしければ IPアドレス:ポート のフォーマットで入力すればokです。
今回は Wifi でも Ethernet でもリスンして欲しいのでポートだけ入力しました。

7. 起動スクリプト設定
デフォルトではヒープサイズや GC ログの設定がされていないようです。
最低限どれくらいのヒープサイズで動くのかわかりませんのでざっくりと 64mb に設定し、-XX:+PrintGCTimeSamps オプションで GC 状況のログを取っておくことにしました。
設定は fisheyectl.sh に書きます。
1: #!/bin/sh
2: FISHEYE_OPTS="$FISHEYE_OPTS -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xmx64m -Xms64m"
3: FISHEYE_INST=/Users/yusukey/server/fisheye
4: FISHEYE_HOME=/Users/yusukey/server/fisheye-1.6.3

8. mod_jk 設定
8060番ポートに穴を空けたくないので mod_jk を以下のように設定して Apache と連携させました。
worker.properties
worker.fisheye.port=8069
worker.fisheye.host=127.0.0.1
worker.fisheye.type=ajp13

uriworkermap.properties
/fisheye=fisheye
/fisheye/*=fisheye

9. 起動設定
FishEye は run.sh で簡単に起動できますが、サーバ(再)起動時に手動で起動するのは面倒なので自動起動できるように設定しました。

# cd /Library/StartupItems/
# mkdir fisheye

MacOSX 独自の起動スクリプトを書く
# cd /Library/StartupItems/fisheye
# vi fisheye

#!/bin/sh

##
# fisheye
##

. /etc/rc.common

StartService ()
{
ConsoleMessage "Starting FishEye"
cd /Users/yusukey/server/fisheye-1.6.3/bin
sudo -u yusukey ./start.sh
}

StopService ()
{
ConsoleMessage "Stopping FishEye"
cd /Users/yusukey/server/fisheye-1.6.3/bin
sudo -u yusukey ./stop.sh
}

RestartService ()
{
ConsoleMessage "Restarting FishEye"
cd /Users/yusukey/server/fisheye-1.6.3/bin
sudo -u yusukey ./stop.sh
sudo -u yusukey ./start.sh
}

RunService "$1"

# vi StartupParameters.plist
{
Description = "fisheye";
Provides = ("fisheye");
Requires = ("DirectoryServices");
Uses = ("Disks");
OrderPreference = "None";
}

これで fisheye/StartupParameters.plist の2つのファイルを見て Mac OSX 起動時に勝手に FishEye を起動してくれるようになります。
コマンドラインから操作する際は
# SystemStarter start|stop|restart fisheye
でできます。
標準(エラー)出力は $FISHEYE_INST/var/log に記録されます。

10. robots.txt の設定
FishEye をセットアップしたことで、Google や Yahoo! にコードリポジトリそのものの索引を作ってもらう必要がなくなりましたので以下のように設定して検索対象からはずしました。
FishEye のコードは検索でヒットしても良いので Disallow に入れていません。
User-agent: *
Disallow: /svn/


11. 完了
以上の設定で無事 FishEye をインストールできました。
FishEye: browsing yusuke.homeip.net/

しばらく使ってみて特に問題無ければオープンソースプロジェクト向けライセンスの発行を依頼したいと思います。

関連記事:
JIRA 3.13.1 へ FishEye プラグイン 2.3 をインストール
JIRA をバージョン 3.13.1 へアップデート
JIRA をバージョン 3.12.3 へアップデート

JIRA(バグトラッキングシステム), Confluence(Wiki) など Atlassian 社の製品は日本では代理店であるイマヒマ社より購入していただくことも可能です。
チームウェア - アトラシアン JIRA(ジラ):画期的な課題トラッキング! Confluence(コンフルエンス):企業向けウィキ

タグ :
このエントリーをはてなブックマークに追加   

Pebble 2.3.1 インストール

もう2ヶ月以上も前になりますが自宅サーバの blogware として使っている Pebble をバージョン1.9 から最新の 2.3.1 にアップデートしました。
Pebble はオープンソースのブログソフトで、Simon Brown という最近ニュージャージーに引っ越したイギリス人が主に開発しています。
メーリングリストはそこそこ活発で今でもアクティブにアップデートが行われている製品です。

Pebble のインストールは何も難しいことはありませんが、手順を記しておきます。
アプリケーションサーバは JBoss AS 4.2.2 です。

1. ダウンロード
Sourceforgeより最新版をダウンロード。

2. メールセッションの有効化。
Pebble 1.9 では直接 JavaMail を叩いているようで Pebble の設定内に SMTP サーバなどがありました。
Pebble 2.3.1 ではメールセッションを使ってメールの設定を外だしできます。
JBoss の default コンフィギュレーションにはメールセッションの機能がなかったため、all コンフィギュレーションより mail-ra.rar と mail-service.xml をコピーしてきて、mail-service.xml を以下のように変更しました。

<?xml version="1.0" encoding="UTF-8"?>
<server>
<mbean code="org.jboss.mail.MailService"
name="jboss:service=Mail">
<attribute name="JNDIName">java:/Mail</attribute>
<attribute name="User">yusuke@homeip.net</attribute>
<attribute name="Password">**********</attribute>
<attribute name="Configuration">
<configuration>
<property name="mail.store.protocol" value="pop3"/>
<property name="mail.transport.protocol" value="smtp"/>
<property name="mail.pop3.host" value="pop3.gmail.com"/>
<property name="mail.smtp.host" value="smtp.gmail.com"/>
<property name="mail.smtp.port" value="465"/>
<property name="mail.from" value="yusuke@yusuke.homeip.net"/>
<property name="mail.smtp.socketFactory.class" value="javax.net.ssl.SSLSocketFactory"/>
<property name="mail.smtp.socketFactory.fallback" value="false"/>
<property name="mail.smtp.socketFactory.port" value="465"/>
<property name="mail.smtp.auth" value="true"/>
<property name="mail.smtp.user" value="yusuke@homeip.net"/>
<property name="mail.smtp.password" value="**********"/>
<property name="mail.debug" value="false"/>
</configuration>
</attribute>
<depends>jboss:service=Naming</depends>
</mbean>
</server>


jboss-web.xml には以下のように設定
<jboss-web>
<context-root>/</context-root>
<resource-ref>
<res-ref-name>mail/Session</res-ref-name>
<jndi-name>java:/Mail</jndi-name>
</resource-ref>
</jboss-web>


3. デプロイ
ルートコンテキストにデプロイしたいので、jboss-web.deployer/ROOT.war を削除。
続いて pebble.war を deploy ディレクトリに移動。

4. アクセス
http://host:port/ にアクセスし、ユーザ名:username、パスワード:password でログイン

ほんと簡単です。

以上

タグ :
このエントリーをはてなブックマークに追加   

Mars Phoenix の最後の Tweet を IntelliJ IDEA 8 と Twitter4J を使ってデコードする

Mars Phoenix は火星で発見したことを逐一 Twitter に報告してくれていました。
先日のバイナリデーに発せられた 最後のメッセージ、気になりますね。

どうやら8ビットで表現された文字コードが7つ並んでいる様子。
でも残念ながら私はバイト列を見ただけで文字が頭に浮かんでくるほどのスキルはありません。

なのでデコードするコードを書くことにしました。
せっかくですから登場したばかりの IDEA 8 を使いましょう。

続きを読む...

このエントリーをはてなブックマークに追加   

11月28日 - JBoss COMPASS Tokyo 2008

先日もご紹介したイベントですが、そろそろ満員御礼間近になってきました。

うれしいことに私のしゃべるトラック T-3:『パフォーマンスチューニング、マイグレーションの落としどころ』は特に申し込みが多く、残りわずかとなっています。

申し込みはお早めに!

JBoss COMPASS Tokyo 2008


日時:2008年11月28日(金) 13:00〜17:00 (受付開始 12:30より)
場所:ベルサール西新宿 ホール&Room1, Room2
TEL:03-3346-1396 FAX:03-3346-1399
定員:300名
参加費用:無料

タグ :
このエントリーをはてなブックマークに追加   

Mars Phoenix からの通信途絶える

火星からの鮮明な画像を送ってきたり、水(氷)を発見したりと活躍してきた Mars Phoenix からの通信が途絶えてしまったようです。

彼女の最後の tweet はこれ↓
Twitter / MarsPhoenix: 01010100 01110010 01101001 ...

01010100 01110010 01101001 01110101 01101101 01110000 01101000 <3
Twitter / MarsPhoenix: [From Phoenix mission ops: ...
[From Phoenix mission ops: Phoenix is no longer communicating with Earth. We'll continue to listen, but it's likely its mission has ended.]

元々寿命を大幅に超えてだましだまし運用していたもの。
冬を迎えて太陽電池パネルの発電量が少なくなりうまく動作しなくなるかも、と言われていましたがその通りになったようです。

水を見つけてくれたことで、地球がひとりぼっちじゃない可能性を示してくれた非常にロマン溢れるプロジェクトでしたね。
Mars Phoenix Returns to Ashes | Wired Science from Wired.com
Phoenix Mars Mission - Home

このエントリーをはてなブックマークに追加   

メモリリークトラブルシューティング記 - その5: Memory Analyzer でヒープダンプを解析(最終回)

- その1: 自宅サーバがハング

- その2: フリーズの原因はガベージコレクション

- その3: 侍でヒープ使用量を確認

- その4: リーク箇所を確認する色々な方法

- その5: Memory Analyzer でヒープダンプを解析(最終回)

延々と連載してきたメモリリークトラブルシューティング記もいよいよ最終回です。

今回のメモリリーク現象はリークの再現方法がわからないため、運用環境から詳細なデータが取得できるheapdumpを取得した、というのが前回までのあらすじです。

次は、ヒープダンプの解析。
ヒープダンプは JDK に付属の jmap コマンドで取得します。
jmap -heap:format=x [pid] または jmap -heap:format=b [pid] といった形で実行するとヒープダンプを xml 形式、またはバイナリ形式で記録できます。
通常生のヒープダンプを人間の目で読むことはないので xml 形式は使いません。バイナリ形式で取得します。
バイナリ形式のヒープダンプはEclipse Memory Analyzerというツールで解析できます。
Eclipse Memory Analyzer は SAP が開発した Eclipse RPC ベースのマルチプラットフォームアプリケーションです。
非常に良くできています。


Memory Analyzer を起動したところ

Memory Analyzer を起動したらヒープダンプの読み込みは簡単。
[File > Open Heap Dump...] でファイルダイアログを開き、ヒープダンプを選択するだけです。


ヒープダンプを読み込んだところ

メモリリーク問題の調査は大きく分けて2段階あります。
1. ヒープ中を占める割合の高いオブジェクトを見つけること
これはヒープダンプ一つ開けば解析できます。

2. アプリケーションを動作させていく過程で単調増加し続けるオブジェクトを見つけること
具体的にはヒープダンプを2回(以上)取得して差分を取ることで解析できます。

"1." で大きなオブジェクト、または大量に存在するオブジェクトを見るだけでピンと来ればしめたもの。その原因を取り除いてやりましょう。
しかし、そういったオブジェクトは予定通りドカっと確保したキャッシュであることも多いです。増加し続けているわけではなく、単にあるべくしてあるだけの場合は調べてもしかたがありません。
本当にリークしているオブジェクトを確認するためには "2." で単調増加し続けているオブジェクトを確認しないといけません。


1. ヒープ中を占める割合の高いオブジェクトの確認
ではやってみます。ヒープダンプを Memory Analyzer で開いたら表示されるオーバービュー画面で "Leak Suspects" というリンクをクリックします。
するとやたらと大きいオブジェクトを「なんとなく怪しい」と判断してピックアップしてくれます。
「なんとなく」ですので、かならずしもリークしているオブジェクトが検出されるとは限らないことに注意してください。

Leak Suspects を開いたところ

今回は org.apache.jasper.runtime.BodyContentImpl クラスのインスタンスが 108 つで、合計419MB(ヒープ中72.26%)も占めているとのレポートが出ました。
明らかに怪しいです。
org.apache というパッケージから Apache プロジェクトのコンポーネントであることがわかります。また jasper という名前は Apache の jsp 実装です。
インスタンスの数としては 108 つと多すぎるわけではありませんが、一つ一つのサイズが尋常ではありません。一体このインスタンスには何が記録されているのでしょう?
今度は dominator treeビューよりオブジェクトの中身を確認してみます。
dominator treeを開くには、ツールバーの箱3つが繋がれたアイコンをクリックします。

dominator treeを開くためのアイコン

dominator tree を開くと大きなオブジェクト順にソートされたインスタンスの一覧が見られます。
また、それぞれのインスタンスツリーを展開することで、保有しているフィールドやまたその中身を確認することができます。

dominator tree 表示

今回は dominator tree より、BodyContentImpl には非常にサイズの大きな char 配列が格納されていることがわかりました。
Inspector ペインで簡単に配列の中身をプレビューできますが、ほんの部分部分しか見られないのでもっとざっくりと見たいときは中身をファイルに保存することができます。

オブジェクトの中身をファイルに保存


保存した char 配列の中身を確認

中身を view コマンドで確認すると、html が記録されていることを確認できました。
さらによく見てみると・・・・あまり大きな声で口に出せないような英単語が<div class="trackbackheader">..</div>というタグに囲まれて大量にならんでいました。
これはトラックバックスパムですね。
<img border="0" src="/jira/images/icons/document_exchange.gif" width=16 height=16 align=absmiddle> という要素が見られるので Jira が絡んでいるようです。
Jira自分のオープンソースプロジェクトのバグトラッキングに使っている Web アプリケーションです。
を使うと何か JBoss Web(JBoss 内蔵の Tomcat ベースのコンテナ)でリークするのでしょうか?

BodyContentImpl 以外にも増加しているオブジェクトがないか、ヒープダンプの差分も確認してみることにしました。

2. 単調増加し続けるオブジェクトの確認
ヒープダンプの差分をとるには、ヒープダンプを2つ開き、ヒストグラムビュー(棒グラフのアイコン)を開いた状態で左右に矢印が伸びるアイコンをクリックします。

ヒープダンプの比較

すると Select baseline というダイアログが現れるので差分を取りたいもう一方のヒープダンプを選択します。

Select baselineで差分を取る対象のヒープダンプを選択

差分がとれたら、"Objects" - つまりインスタンス数でソートしてみます。
すると興味深いオブジェクトが浮かび上がってきました。
com.atlassian.trackback.Trackback というオブジェクトが20,211個も増えていることがわかります。

差分取得で浮かび上がってきたオブジェクト - com.atlassian.trackback.Trackback

atlassian は Jira を開発している会社です。どうもトラックバックスパムを大量に受けてトラックバックを表現するオブジェクトが増えまくっているようですね。

"com.atlassian.trackback.Trackback" で検索してみましたが、リークにまつわる情報はみつかりませんでした。

今度は
"jira tomcat leak"で検索。ビンゴ!
05.03.04 Tomcat 6.0 - JIRA オンラインマニュアル (3.12.2版 - 最新) - Atlassian Confluence

Tomcatのメモリー設定の修正

Tomcatは、大きなJSPのページをリクエストするとメモリリークしてしまいます。
これを避けるために、bin/setenv.shを編集して(もしなければ作成して)、次のように設定してください。

export CATALINA_OPTS="$CATALINA_OPTS -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true"


ちゃんとドキュメントに書いてある設定をしていなかったのが原因でした。
LIMIT_BUFFER オプションについては以下のページで導入の経緯が詳しく説明されています。
Bug 37793 – org.apache.jasper.runtime.BodyContentImpl doesn't reset the 'cb' character array, causes memory leak

Jira の issue ではこれ。
[#JRA-10145] Set tomcat flag to not re-use buffers, as they result in OutOfMemoryErrors - Atlassian JIRA

どうも、Tomcat は書き込みバッファを再利用する仕組みがあるらしく、非常に大きなコンテンツを出力するとバッファでヒープがあふれてしまうようです。
この書き込みバッファを無尽蔵に増やさないためのオプションが LIMIT_BUFFER ですね。

つまり、今回のメモリリーク問題の発生ステップはこう想像できます。
1. トラックバックスパムを大量に受けて、特定のページのサイズが膨らむ
2. 検索エンジンのクローラかなにかが膨らんだページを閲覧する
3. 書き込みバッファが膨れる

ウチのサーバは Tomcat ではなく JBoss で運用していますが、Webコンテナである JBoss Web は Tomcat 由来なのでこのオプションがちゃんと効きました。

トラックバックオブジェクトが大量にあるのはよろしい状態なのかどうかわかりませんが、そもそもトラックバック機能は現在の所必要ないので、管理画面から無効に設定してしまいました。

トラックバック機能を OFF に設定

LIMIT_BUFFER オプションの設定とトラックバックの OFF 設定を実施してから1週間以上経ちますが、現在の所ヒープ使用量は一定しており安定稼働しています。

5回に渡るエントリで長々とトラブルシューティングの様子を説明してみました。
メモリリークのトラブルシューティングというと、じっくりソースコードを眺めたり、プロファイラを使ってがんばって現象を再現させたりという調査方法が有名ですね。
しかし、ヒープダンプや Memory Analyzer を使う方法はご存じない方も多いのではないでしょうか。
メモリリークトラブルは長期間稼働して初めて現れることも多い厄介な問題です。
トラブルが発生してからあわてることのないよう、あらかじめヒープダンプを使った解析の練習をしておくと良いかもしれません。

タグ :
このエントリーをはてなブックマークに追加   

メモリリークトラブルシューティング記 - その4: リーク箇所を確認する色々な方法

- その1: 自宅サーバがハング

- その2: フリーズの原因はガベージコレクション

- その3: 侍でヒープ使用量を確認

- その4: リーク箇所を確認する色々な方法

前回のエントリではOld 領域にオブジェクトが溢れていることを突きとめた経緯を書きました。

次は、ヒープ領域にどんなオブジェクトが溜まっているのか確認する必要があります。
リークしているオブジェクトを検出する方法はいくつかあり、それぞれ以下のような特徴があります。

1. プロファイラ
リーク検出を行う上で一番有名な方法。
JVM に特殊なフックをかけ、オブジェクトの生成、GC 等の挙動を監視します。
アプリケーションを動作させながら増加してくオブジェクトだけを抽出したり、オブジェクト生成に至るスタックトレースを確認したりと様々な視点で VM を調査できるのが特徴です。
一般的にプロファイラを使うと VM のパフォーマンスが劣化するため運用環境では利用できません。
再現方法が分かっている場合にプロファイラをアタッチさせて VM を起動させ、再現テストケースを数回だけ回して増分オブジェクトを解析するのが一般的です。
ただし、JRockit Runtime Analyzer だけは例外でパフォーマンスの劣化が少ないため運用環境でも利用できます(※)。
これは元々 VM が自己チューニングに利用するために収集している統計情報を見せているだけで、プロファイリングを行う上で追加で情報収拾を行う必要がないからです。

プロファイリングを行える製品としては、NetBeans ProfilerJProbeJRockit Runtime AnalyzerYourKit Profiler などがあります。

それぞれのプロファイラの個人的な印象は以下の通り。
ちなみに YouKit Profiler はまだ試したことがありません。

製品名無償版の有無運用環境の解析オブジェクト生成
スタックトレースの取得
特徴
NetBeans Profiler無償でフル機能のプロファイラ。
まだ登場して間もなく、若干安定性に欠ける印象。
JRockit Runtime Analyzer✔(※1)パフォーマンスほぼ無劣化。
無償でVM起動後1時間まで使えるのでリークの再現方法が分かっていれば結構使える。
YourKit Profiler✔(※2)まだ使ったことないけれども良いらしい。
比較的安価。
JProbe抜群の実績。
ちょっと古めかしいインターフェース。
OptimizeIt Profiler以前はプロファイラといえば OptimizeIt か JProbe と言うくらいだったが今は・・?
しばらく音沙汰がない。
Embarcadero TechnologiesCode Gearを買い取ってからなおさら音沙汰がない。

※1 運用環境の解析は有償(VM起動後1時間までは無償利用可能)
※2 オープンソース開発者には無償ライセンス提供

2. クラスヒストグラム
-XX:+PrintClassHistogram オプションをつけて kill -3 [pid] か、jmap コマンドで取得できるヒープのサマリ情報。
ヒープ中に存在する各クラスのインスタンス数、ヒープ中を占めるバイト数などの情報を取得できる。
取得負荷は低く、運用環境でも手軽に取得できるのが特徴。
オブジェクトグラフ(インスタンス間の参照関係)はわからないので詳細な解析は行えない。
一般に解析するツールが出回っていないため解析がやや面倒。

とある会社内にはクラスヒストグラムを解析するすばらしいツールがあるのを最近見かけたのですが、今のところ公開されていないようです。
Java 界の幸せのためにも是非販売、またはオープンソース化して欲しいところです・・・

3. ヒープダンプ(heapdump)
jmap コマンドで取得できるヒープの詳細情報。
ヒープ中の全てのオブジェクトのインスタンスの数、各インスタンスの参照関係、ヒープ中を占めるバイト数などの情報を取得できる。
JVM を落とさず取得できるが、ヒープ内を全てダンプするため取得負荷が高い。
ヒープ 512mb あたりざっくり5〜10分くらいかかる。


今回は現象の再現方法がわからず、運用環境を解析したいためプロファイラを使う方法は候補からはずれました。
また、クラスヒストグラムは軽く使えて運用環境の解析には向いているのですが、再現周期が不定で、次回発生したときには確実に問題箇所をつきとめたいためこれも候補からはずしました。
というわけで、ヒープダンプで解析することに。

ヒープダンプを取得する方法は簡単。
コマンドラインから
$ sudo jmap -heap:format=b [pid]

と打つとカレントディレクトリに heap.bin という巨大なファイルが生成されます。
増加したオブジェクトを突きとめるためには差分を確認する必要があるので、一般的にはアプリケーションを起動してウォームアップをした後と、リークが発生した後の2回(またはそれ以上)取得する必要があります。

ヒープダンプのファイル名は(たぶん) heap.bin という名前で固定なので上書きしないよう気をつける必要があります。
今回は本番環境のサーバを起動して1時間後、それからフリーズ現象が発生したときの2回取得しました。
繰り返しになりますがヒープダンプの取得は結構時間を要するので気をつけてください。
今回はミッションクリティカルでない個人の自宅サーバの解析です。
なので待機系も用意せず SPOF な JBoss インスタンスから問答無用でダンプを取得しました。
そんなテキトーな運用なので「たまに止まってますよね?」とか時々言われるのですが・・^^;
一般的に運用環境でダンプを取得する際はロードバランサや mod_jk による転送を停止し、別系統でサービスを続行できるようにしておく必要があります。

- その5: Memory Analyzer でヒープダンプを解析(最終回)

タグ :
このエントリーをはてなブックマークに追加   

JBoss トレーニングコース開催中

#最近多いですがまた宣伝のエントリです
JBoss はレッドハットが扱っているオープンソースの商用 Java アプリケーションサーバです。

ワールドワイドでは数多くの事例があるのもの、日本ではまだ知名度が低いというのが正直なところです。

JBoss はもちろん J2EE / JavaEE 準拠のアプリケーションサーバなので、WebLogic や WebSphere、Tomcat、JRun、Glassfish などを利用したことのある方であればすんなりと馴染める製品です。
オープンソースの製品なのでどなたでもソースコードが読める、とはいえ業務でご利用いただくにはやはり最初はトレーニングコースで体系的に学んで頂くのが一番スムースです。

レッドハットでは今年から JBoss のトレーニングコースを開催しており、私も一部のコースで講師を担当させて頂いています。

以下簡単にコースの紹介を。

続きを読む...

タグ :
このエントリーをはてなブックマークに追加   

IDEA 8 リリース

私のお気に入り IDE、IDEA の最新版がリリースされました。


詳しいアップデート内容は「marsのメモ」でチェック!
maven 対応がかなり便利そうです。
[IDEA] - marsのメモ

タグ :
このエントリーをはてなブックマークに追加   

メモリリークトラブルシューティング記 - その3: 侍でヒープ使用量を確認

- その1: 自宅サーバがハング

- その2: フリーズの原因はガベージコレクション

- その3: 侍でヒープ使用量を確認

前回のエントリで、フリーズの原因が Full GC の頻発にあることまで書きました。

GC 、特にマーキングと呼ばれるオブジェクトが回収可能かどうかを確認する処理は重たいです。
Sun, HP, Apple, OpenJDK といったブランド/ベンダの JVM は世代別GC(Generational GC)と呼ばれるアルゴリズムを採用しています。
#最近の IBM JDK は Generational GC を選択することもできるようになっています

世代別 GC では VM のヒープ領域を大きく New 領域、Old 領域と分けておき、生成されたばかりのオブジェクトは New 領域に、長生きするオブジェクトは Old 領域にわけます。
長生きしているかどうかはオブジェクトの世代数(GCをくぐり抜けて生き続けた回数)で区別します。
普段の GC(マイナーGC)では New 領域のオブジェクトのみのマーキング、回収処理を行います。
以前 Old 領域に「昇格」したオブジェクトについてはマイナーGCは無関心です。

Full GC は一般的に Old 領域が一杯になったタイミング、または Permanent 領域と呼ばれるクラスの定義情報を格納している領域が一杯になったタイミングで発生します。
さて、今回の Full GC ログはいかがでしょうか。
取得した GC ログと、読み方を以下に示します。

306133.182: [Full GC 306133.182: [Tenured: 546169K*1->546169K*2(546176K*3), 4.2429345 secs] 607609K->607600K(607616K), [Perm : 60798K*4->60798K*5(60928K*6)], 4.2433055 secs]

*1Full GC 前のOld領域の使用サイズ
*2Full GC 後のOld領域の使用サイズ
*3Old領域の確保サイズ
*4Full GC 前のPermanent領域の使用サイズ
*5Full GC 後のPermanent領域の使用サイズ
*6Permanent領域の確保サイズ
※色々な情報が読み取れますが重要な箇所だけ注釈を書きました

残念ながら、この GC ログでは Old 領域も Permanent 領域もほぼ一杯になっているのでどちらの領域の枯渇が Full GC 発生のトリガになっているのかひと目ではわかりません。
この様な場合は GC ログメッセージを先頭から追っていって Old 領域と Permanent 領域の増加傾向を確認することになります。
Old 領域が足りない場合は多くの場合 Old 領域のヒープ使用量がぶれて、Permanent領域の使用量はほぼフラットになります。
Permanent領域が足りない場合は Permanent 領域、Old 領域両方の使用量がぶれます。
GC ログを目で追って確認したり、awk で処理して CSV 化して Excel で読み込んだり・・・とかは面倒なので今回は自作ツールであるを使いました。

使い方は簡単、GCログを含むテキストファイルをドラッグ&ドロップで侍のウィンドウに渡すだけです。
すると「メモリ」という名前のタブが現れて、GCログの解析結果がビジュアル表示されます。


侍で解析した結果

上段が New 領域、中段が Old 領域、下段が Permanent領域になります。
するとどうでしょう、「昇格」したオブジェクトが Old 領域に運ばれては Full GC が発生し、なんとかして不要になったオブジェクトを回収しつつだましだまし VM が動いている様子が確認できました。
Permanent 領域はほぼフラットで微増も微減もしていません。
恐らく Old 領域が枯渇していますね。OutOfMemoryError が発生するのも時間の問題です。
ただ Full GC の処理が重たくてアプリケーションがほとんど稼働していないため OutOfMemoryError には至っていませんが。

実は今回 Permanent 領域のサイズは指定していなかったのでPermanent領域の最大サイズはデフォルトの 64mb になっています。
このことからも 60mb までしか確保されていない Permanent 領域はまだ余裕があると推測することもできます。

というわけで Old 領域に何が溜まっているのかを確認することにしました。

- その4: リーク箇所を確認する色々な方法

- その5: Memory Analyzer でヒープダンプを解析(最終回)

タグ :
このエントリーをはてなブックマークに追加   

ヤフーがビジネスパーソン向けSNSを開始 - 本命は既に会員数7万超の SBI Business?

人材の流動化が高まってきている日本では、半年前に名刺をもらったあの人に連絡しようとしてもメールアドレスも電話番号も変わっていて連絡がつかない、なんてことも増えてきました。

友達同士だけでなく、ビジネス上の繋がりもオンラインでメンテナンスしようというサービスが海外では LinkedInplaxoなどが以前からあります。
人々の経歴が確認でき、知り合いとコネクションを張っておくとアクティビティが分かるようになっています。
部署移動、転職に伴い繋がりが失われてしまうことがなくなりますし、「お、あの人は今度はあそこに行ったんだ、じゃぁ***の用件があればあの人に声を掛けてみよう」ということも可能。
経歴も登録できるので、自分のそれを見たヘッドハンターが声を掛けてくれたり(たぶん手当たり次第ですが・・)もします。

ヤフーも LinkedIn 的な新しいWebサービス、CUを始めたことで話題になっています。
日本版LinkedInとなるか--ヤフーがビジネスSNS「CU」を開始:ニュース - CNET Japan

現在の所、mixi のように招待がないと利用できないようで試せていません。
今後日本でも同様なサービスは増えていくんでしょうね。

今のところ日本での本命は既に会員数が7万人を突破しているSBI Business でしょうか。

すでにこの手のサービスは LinkedIn と Plaxo の競争でコモディティ化を果たしている感があり、SBI Business はうまくそれらのインターフェースを日本語化しています。
探せば業界の誰も彼も見つかるという状態ではありませんが、招待も不要で登録でき、Google からも検索可能なので「自分SEO」としても非常に有効なサイトだと思っています。
同姓同名でヒジョーに溢れる私でも登録したらすぐに Google の検索結果1ページ目にヒットするようになりました。
これはつまり SBI Business に登録していない人でも私のことを必要とする人がすぐに見つけてくれるようになるということです。

追記:
XING、wizli、bizzoと、SBI Business 意外にも似たサービスが立ち上がっているんですね。
okyuu.com のコメントで知りました。
ヤフーがビジネスパーソン向けSNSを開始 - 本命は既に会員数7万超の SBI Business? - 侍ズム ニュース [okyuu.com]
XING
ハイクラスビジネスパーソンの集まるビジネスSNS[wizli(ウィズリ)]
人脈が広がる ビジネスにつながる-BiZZO-


最近この weblog にも貼り付けていますが、改めて SBI Business、LinkedIn、Plaxo のバッジをこのエントリにも貼っておきます。
ビジネス上でも、個人的にでも繋がりのある方は是非コネクションを張らせてください。

山本裕介

View Yusuke Yamamoto's profile on LinkedIn


このエントリーをはてなブックマークに追加   

メモリリークトラブルシューティング記 - その2: フリーズの原因は GC

- その1: 自宅サーバがハング

- その2: フリーズの原因はガベージコレクション
JBoss のサーバログ(server/$MY_CONFIG/logs/server.log) を見ても特に顕著なメッセージは見られません。

普段からフリーズしたらとにかくスレッドダンプ!と口を酸っぱくしています。
私自身スレッドダンプを見るのが趣味みたいなものですが、今回はスレッドダンプは必要ありませんでした。

標準出力をみると、原因は明らか。

.
.
.
306122.554: [Full GC 306122.554: [Tenured: 546171K->546171K(546176K), 4.0978385 secs] 607611K->607602K(607616K), [Perm : 60798K->60798K(60928K)], 4.0982228 secs]
306126.672: [Full GC 306126.672: [Tenured: 546171K->545982K(546176K), 6.4798504 secs] 607611K->607421K(607616K), [Perm : 60798K->60797K(60928K)], 6.4801261 secs]
306133.182: [Full GC 306133.182: [Tenured: 546169K->546169K(546176K), 4.2429345 secs] 607609K->607600K(607616K), [Perm : 60798K->60798K(60928K)], 4.2433055 secs]
フリーズの原因は(GC)ガベージコレクションです。
この標準出力に記録されているメッセージは JVM のオプション、"-XX:+PrintGCTimeStamps -XX:+PrintGCDetails" で記録されるもので、GC の状況を報告しています。
一般的な GC アルゴリズムではヒープ領域が一杯になるとアプリケーションのスレッドは一旦停止し、Stop the world と呼ばれる GC 処理に専念する期間に入ります。
そして一回の GC が終了すると上記のようなメッセージが記録されます。
今回注目したいのは GC ログの最後にある時間。これが GC にかかった処理時間 = Stop the world の期間を示します。
この時間が1秒を超えたら危険信号、要チューニングと言って良いでしょう。
今回のログでは4〜7秒ほどの GC が立て続けに発生していることがわかります。
これでは Stop the world だらけでアプリケーションスレッドが全然動けません。

次回は GC が頻発する原因を探ります。

- その3: 侍でヒープ使用量を確認

- その4: リーク箇所を確認する色々な方法

- その5: Memory Analyzer でヒープダンプを解析(最終回)

タグ :
このエントリーをはてなブックマークに追加   

メモリリークトラブルシューティング記 - その1 : 自宅サーバがハング!

- その1: 自宅サーバがハング
現在このweblogをホストしている自宅サーバの構成は以下の通りです。
ハードウェア: iBook G4(1GB / 1TB)
OS: Mac OSX 10.5.5
VM: JDK1.5.0_16
APサーバ: JBoss AS 4.2.x
データベース: MySQL 5.0.x, PostgreSQL 7.4.x

正直 Mac OSX の JVM は安定性に欠けており、bus error で落ちることもしばしば。
bus error のときは単に JBoss を再起動することでしのいできました。
ただ、最近のアップデートで VM の安定性はだいぶ向上した感があります。

替わりに最近なんだかフリーズすることがあります。
2週間くらい安定して稼働していることもあれば起動して2,3日でフリーズすることも。

特にミッションクリティカルなアプリケーションが動いているわけではないので、しばらくは構わずJVMを kill / 再起動をしていました。
今回連休中にようやく重い腰を上げてトラブルシュートしたので過程を記します。

- その2: フリーズの原因は GC

- その3: 侍でヒープ使用量を確認

- その4: リーク箇所を確認する色々な方法

- その5: Memory Analyzer でヒープダンプを解析(最終回)

タグ :
このエントリーをはてなブックマークに追加   

Twitter4J 1.1.0 リリース

Twitter4J 1.1.0 をリリースしました。
maven central repository に既にアップされています。

Twitter4J は Twitter API 用のオープンソースかつ maven 対応の Java ライブラリで BSD スタイルのライセンスで提供されています。
http://yusuke.homeip.net/twitter4j/index.html


Twitter4J 1.1.0 は細かいバグ修正に加え、メモリ利用効率が大幅に改善されています。
今回のリリースは過去のバージョンと若干互換性に影響のある修正がくわえられているので注意してください。
マイグレートする際には jar ファイルを差し替えるだけでなく、アプリケーションを再コンパイルすることをお勧めします。

更新されたメソッド:
TFJ-41: ステータスIDがいずれInteger.MAX_VALUE(2147483647)を超えそうなので、Status の id は int のかわりに long を返すようになりました。

long Status.getId()
long UserWithStatus.getStatusId()
long getInReplyToStatusId()
TFJ-34: Following methods now return java.util.Date instead of String.
java.util.Date Status.getCreatedAt()
java.util.Date DirectMessage#getCreatedAt()

追加されたメソッド:
TFJ-45:
List<User> getFollowers(int page)
List<User> getFollowers(String id)
List<User> getFollowers(String id, int page)

削除されたメソッド:
TFJ-43: Following methods are no longer supported by the Twitter API and removed as of release 1.1.0.
Twitter.getPublicTimeline(String sinceID)
Twitter.archive()
Twitter.archive(int page)


全ての更新内容は以下の Jira ページより確認できます:
http://yusuke.homeip.net/jira/browse/TFJ/fixforversion/10100

ちなみに私のアカウントは http://twitter.com/yusukeyです。
お気軽に follow してください。

Twitter4J を使ってくれているらしいプロジェクト:
Twitter Analytics
Twitter の発言をクライアント、国などの観点から統計を取って公表しているサイト。
Suittar! - Java-based Twitter Client.
Pure Java の Twitter クライアント。
Mots - yet another Java Based Twitter Client
Suittar! よりシンプルな Pure Java クライアント。
ブログなんだよもん - Twitterクライアント作ってみたよ!(TwitCafe)
Pure Java の Twitter クライアント。GUI に JavaFX を使うことを予定しているらしい!!
TwitterMail.com - 8209 people sent 173236 messages to Twitter!
メールで Twitter の操作、通知ができるサービス。
Twittercal — tweet your google calendar
Twitterで予定を簡単に管理できるサービス。
Twitter Plugin - hudson - Hudson Wiki
継続ビルドシステム、Hudson のプラグイン。
ぽすったー - cactusman日誌
Twitter の CUI クライアント。
さぼったー 0.0.1.SNAPSHOT - 都元ダイスケ IT-PRESS
Eclipse のプラグイン。
IntelliJ IDEA Plugins
頼まれもしないのにSabotterを移植してみた - marsのメモ
さぼったーの IDEA 版。
tweetPad
Twitter の発言をビジュアルに表現してくれるソフト。

ご利用ありがとうございます!
他にありましたらコメント、またはメーリングリストで教えてください。

関連エントリ:
Twitter4J 1.0.6 リリース
Twitter4J 1.0.5 リリース
Twitter4J 1.0.4 リリース
Twitter4J 自前 maven リポジトリを公開
Twitter4J 1.0.3 リリース
Google Calendar と Twitter を連携 - Twittercal
Suitter Public beta 1.0
メールで Twitter! - TwitterMail.com
Twitter4J 1.0.2 リリース
Twitter4J 1.0.1 リリース
Twitter4J 1.0 リリース

このエントリーをはてなブックマークに追加