エンタープライズ・アプリには、シビアな現実(?)が多々ありますね。今回はメモリチューニングでヤラレました。
以下、単なる私的な覚書です。
・
引用元「サイズの大きいヒープを使用する際のアプリケーション固有の留意事項(HP-UX 11.0/11i PA-RISC)」
エンタープライズ・アプリには、シビアな現実(?)が多々ありますね。今回はメモリチューニングでヤラレました。
以下、単なる私的な覚書です。
・
引用元「サイズの大きいヒープを使用する際のアプリケーション固有の留意事項(HP-UX 11.0/11i PA-RISC)」
先日告知したイベント「G*ワークショップin仙台」ですが、何とか仕事の都合もついたので、急遽参加してきました。
久々に、takedaさんや、masanobuimaiさん、mattena31さんらと再会。TDC一周年記念以来だから、丸一年ぶりですわ。なんとも。
んで、肝心の中身ですが、えー、語れるほど理解できませんでしたので、印象に残った断片だけツラツラと書きます。
告知です。
最近、全くITコミュニティ関係のお役に立っていないので、せめてものツミホロボシに告知うっておきます。(あれ?前にもこんなエントリ書いたような・・・)
Groovy、Grailsやら、ヤワラカイ(?)Javaかんけいのイベントみたいです。
旧知のmasanobuimaiさんやBOOWYトリビュートでお世話になったmattena31さんらががんばったらしい。
気になる方は、ぜひぜひ足を運んでみてください。
いじょ。
あ、ワタシは多分しごとです・・・。残念。
えー、久々にお仕事ネタです。(たまには書かないと・・・)
Javaで、XMLのエスケープ処理とかの実装を調査する機会がありまして、ちょっとハマったので、覚書としてメモしておきます。
XML文書をパースする際には、定義済み実体参照を置換すること(例えば、<を<にするとか)は理解していたんですが、文字参照(&#で始まる10進や、&#xで始まる16進)を文字に置換するというのを忘れておりまして。
# 今日も二連投・・・。しかも仕事ネタ。
システムも運用フェーズに入り、バージョンアップを重ねると、単純なバグはほぼ出なくなります。
ということは、残ってるのはレアでやっかいなバグばかり・・・。解析に時間も掛かります。
で、この間ヤラれたのが、このStackOverflowErrorの問題。
最初に障害が発生したときには、ログにおかしなスタックトレースが出て、再現性も特定できなかったので解析不能でした。
その後、ある時、100%再現するケースを見つけたので、デバッグコメントをガンガン入れてやってみたら、どうもXMLParserのparseでコケてることが判明。
なので、その行をピンポイントでtryーcatch(Exception e)で括ってみたら、あれ?引っかからない!何で?
・・・で、試しにExceptionの親であるThrowableでcatchしたら、やっと取れた!
中を見ると、StackOverflowErrorだったんです。
どうやら、XMLをパースする際にスタックサイズが足りなくなったらしいです。
(なので、スタックトレース自体も壊れてて変なのが出てた?(これは不明))
ということで、jvmのスタックサイズを増やして(-Xssオプション)解決。
それにしても、xxxErrorって”catch Exception”じゃ拾えないんですね。知りませんでした。
ログから追えない障害って、ほんとツラいです。
ここのブログは、よく”DoJa”という検索キーワードでヒットすることが多いようですが、大して役に立つ記事は書いてませんでした。すんません・・・。
なので、もう少し有用なネタも残しておこうと思います。
註) 開発時点(2007/01)のバージョン(DoJa4.1、jdk1.4.2)をベースに話を進めます。
***
iアプリのビルドは、jarアーカイブの前に”事前検証(preverify)”という一手間が加わります。
また、一緒にjamファイルも生成(更新)しないといけません。
なので、普通はDoCoMo提供のiappliToolの画面から「ビルド」ボタンをポチっと押してビルドします。
でも、eclipse等のIDEでコーディングしてると、いちいち別ツールを立ち上げてビルドするのは結構な手間です。
というわけで、antで自動実行できるようにしました。
参考にしたのは、以下の記事です。
私の場合は、7zipやproguardといったサイズダウン用のツールは使用しませんでした。
使わずともjarサイズが上限(30KB)に収まったことと、ツールの検証が間に合わなかったため、です。
***
よって、上記サイトを参考にbuild.xmlに書いたタスクは、以下のようになりました。
(○のついたもののみ)
但し厳密には、#3と#4の間にリソースファイル(resフォルダ配下)のコピータスクも追加しました。
× 1.テスト用クラス、テスト用コードの除去
○ 2.コンパイル
○ 3.ベリファイ
○ 4.一旦jar作成(proguardの入力がjarなので) ←(※1)。
× 5.proguardによる圧縮(jar→jar)
× 6.ベリファイするために一旦解凍
× 7.もう一回ベリファイ
× 8.7zipでjar作成
○ 9.jam作成
※1)Antのjarタスクだと、MANIFEST.MFが勝手に作られてしまい、微妙にjarサイズがデカくなるので、execタスクにして、外部コマンドのjarを”-cfM”オプション付きで実行し、MANIFEST.MFを作らないようにしました。
以上です。
ちょっと仕事ネタです。
# 仕事以外のネタの方が食いつきが良いのは確かなんですが。ま、ちょっとした覚書です。しばしおつきあいください。
以前、当欄で”DoJaでスクロール”なるネタを書いたんですが、その続きです。
今回は、けーたいとサーバのやりとりをXMLでやろうと思ってまして。
で、普通はXMLを展開してくれるパーサっていう部品があるんですが、DoJa(4.1)のライブラリにはありません。(SunのMIDPにはJSR-172ナントカってのがあるんですが。)
そこで、ネットを探すと、どうやら、オープンソースのパーサはいくつかあるらしいというのがわかりましたが、どれもライセンスがややこしいので(後々お客様にご迷惑をおかけするとまずいし)。
悩んだ末、自前で作ってみることにしました。といっても、今回の業務用件に必要な機能に絞った、ごく簡単なものですが。
それでも、階層構造あり、繰り返しもありと、結構フルスペックなものになっちゃいまして。
しかも、当初、MapとListで木構造を作ろうと思ったんですが、DoJa4.1のベースのJ2MEには、HashTableとVectorしかなくて・・・。なんか一昔前に戻った気分でした。
とりあえずDOMツリーパーサもどきはできたので、明日はその逆をやってみようかと。
# ホントはソースとか載せられればいいんですが、まだ汚くて(^^;
お仕事ネタです。
タイトルについて軽くご説明します。
テストファーストというのは、文字通り「プログラム組む前にテストコードを書いてしまえ」ということなんですが、設計書を元に「こういう入力があったらこう出力されるべき」という条件をどんどん抽出していって実装漏れやバグを未然に防ぎましょう、という手法です。
で、JUnitというのは、簡単にいうと上記テストのためのJavaプログラム用ツール(テスティングフレームワークとか言うらしい)です。
長々と解説してしまいましたが、私はこのJUnitに苦い思い出がありまして(前にも雑記帳Ver1.0にちょっと書いたことがありますが)、一見、すばらしく理にかなっているかに見える手法ですが、適用するには色々と問題がありまして、私のプロジェクトではかなり悪評が高かったです。
で、当時この手法を先陣斬って旗振って進めてたのが私だったので、なんとなく責任を感じてしまい、それがトラウマになっていました。当時は、何がまずかったのかを考える余裕もありませんでした。ただ、「JUnit=悪」のような印象だけが残りました。
そんなこんなでしばらく記憶の彼方に追いやっていたのですが、今日、偶然「テストファーストの弊害 」なる記事が載ってるサイトを見つけまして、 「あぁ、私だけじゃなかったんだ。」と思うと同時に、何が悪くて何が良かったのかがだいぶ整理できました。
これで少しはトラウマから逃れられそうです。はい。
今日、また次女が”とびひ”(次女に言わせると「とびひげ」になるから可笑しい)にかかっちゃいまして、午前休をとって病院へ。
もう少し涼しくなると、出なくなるんだけどね。
で、久々にお仕事の話。
現在、iアプリで業務端末画面を作るにあたって色々しらべてるんですが、十字キーを使った縦横のスクロールができないことが判明しまして。
正しくは、高レベルAPI(Panelクラス)の場合に限り、キー操作はフォーカス制御にあてられるため、キーイベントという形では発生しない仕様らしいのです。(詳しくは下記参照)
http://q.hatena.ne.jp/1153887492
ということで、画面をスクロールするには、低レベルAPI(Canvasクラス)で実装しなければならないようです。
低レベルAPIは、主にグラフィックを制御する際に使用するので、我々のような業務アプリ画面(たとえばログイン画面とか)しか作ったことがない人間には未知の世界。どっちかというとゲームプログラミングに近い感じです。
まぁ、リーダーからの要望も「ドラクエみたいに動かして」って感じなので、ある意味理にかなっているんでしょうが。楽しいような不安なような。
明日からチャレンジです。