2002年02月02日(土)
■ 会社
- 13:35 今日も仕事するでー。
- 17:45 ほとんど進んでない。会社の中で50円拾っちゃった(^_^)。
- hgBedというバイナリエディタをインストールした。悪くないんだけど、「あ」などちゃんと表示されない文字がある。惜しい。
- 23:25 帰ろう。記入画面はめちゃ大変だ。部品だけ作ったけどそれぞれに動作を定義する必要がある。ううううう。月曜日は詳細画面にもっと色々出すようにしようかな。
■ [dev] コーディングスタイルカタログ (リンク切れ)
コーディング規約の作り方を書いてみたそうです。XP-jp MLより。
■ [web] 日本トップ・ウェブサイト テスト プロジェクト報告書
もじら組みがウェブサイトをテストした結果の報告書。fj.net.www.authoringより。
■ [web] HTML-LINT RANKING Front Page
HTML-lintを使ったランキングを公開している。fj.questions.miscより。アドバイスも書かれている。
■ テレビ/本
- なし。
2004年02月02日(月)
■ 生活
- 朝起きようとするとお腹がキューっと痛くなり起きられずしばらく休んでから起きようとするとまたキューっと痛くなり起きられず、というのを繰り返す夢を見てうなされていた。目覚めてみると腹は全く痛くなかった。
- 今日の行数:4845
■ やること
- 決算
- 不動産屋
- 定期券を買う
2005年02月02日(水)
■ [soft][java] 「Dumbster」
The Dumbster is a very simple fake SMTP server designed for unit and system testing applications that send email messages.
Javaで書かれたテスト用のSMTPサーバみたい。TECHMemoより。
■ やること
- リンク元のスリム化
- tDiaryバージョンアップ
- FSWikiバージョンアップ
- オーブンレンジ用べんり棚
- 確定申告書作成
- 蛍光灯買う
- ブラウンの安い電動歯ブラシ買う
2006年02月02日(木)
- ドライヤーが壊れてきた。コードのねじり具合を変えると止まったり動いたり。15年くらい使ったかなあ。
- 遅めの昼食をとっていたらTVで徹子の部屋をやっていた。今日で30周年だそうで、第1回の放送が流れ森繁久彌が出ていた。30年前の森繁は若いが徹子は変わってない。
- 今日こそは早く寝たかったのに。3時半になってしまった。
■ [soft] 「mozless」
Firefox 用のキーボード向けのナビゲーション。 mozless (モズレス) はless 風のキーバインドを提供する。
これは試したけど、職場のFirefoxにもインストールしたいのでメモ。
(追記)
Ctrl-FでFirefoxの検索バーを出すと、mozlessは動作しなくなってしまうようだ。
mozlessのUser Notesにコメントがあって、Ctrl-F ではなく / を使って検索バーを出現させるようにすれば大丈夫だった。解決方法らしきものも投稿されているので、次のバージョンで直るかも。
■ やること
- 決算
- カレンダーを買う
- ドライヤーを買う
- 書留を受け取る
2009年02月02日(月)
■ [java] NetBeans の Code Coverage Plugin が NullPointerException になる
NetBeans 6.5でカバレッジを取りたいと思い「使用可能なプラグイン」画面で探したら、Code Coverage Plugin(たぶんこれ)というプラグインがあったのでインストールしてみた。
問題点
んが、これをインストールすると「プロジェクト」のツリービューでプロジェクトを右クリックしたときのコンテキストメニューが表示されなくなってしまった。ウィンドウの右下で赤丸が点滅しているのでクリックすると、
java.lang.NullPointerException at org.netbeans.modules.coverage.config.Config.getProjectType(Config.java:163) at org.netbeans.modules.coverage.config.Config.isNbModuleProject(Config.java:188) at org.netbeans.modules.coverage.config.Config.isSupportedProject(Config.java:192) at org.netbeans.modules.coverage.ProjectMenuAction$ProjectContextAwareMenuAction$ProjectMenuItems.<init>(ProjectMenuAction.java:146) at org.netbeans.modules.coverage.ProjectMenuAction$ProjectContextAwareMenuAction.getPopupPresenter(ProjectMenuAction.java:126) at org.openide.util.Utilities.actionsToPopup(Utilities.java:2676) at org.openide.util.Utilities.actionsToPopup(Utilities.java:2756) at org.openide.explorer.view.TreeView.createPopup(TreeView.java:953) at org.openide.explorer.view.TreeView$PopupAdapter.showPopup(TreeView.java:1427) at org.openide.awt.MouseUtils$PopupMouseAdapter.maybePopup(MouseUtils.java:182) at org.openide.awt.MouseUtils$PopupMouseAdapter.mouseReleased(MouseUtils.java:177) at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:273) at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272) at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272) at java.awt.Component.processMouseEvent(Component.java:6134) at javax.swing.JComponent.processMouseEvent(JComponent.java:3265) at java.awt.Component.processEvent(Component.java:5899) at java.awt.Container.processEvent(Container.java:2023) at java.awt.Component.dispatchEventImpl(Component.java:4501) at java.awt.Container.dispatchEventImpl(Container.java:2081) at java.awt.Component.dispatchEvent(Component.java:4331) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4301) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3965) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3895) at java.awt.Container.dispatchEventImpl(Container.java:2067) at java.awt.Window.dispatchEventImpl(Window.java:2458) at java.awt.Component.dispatchEvent(Component.java:4331) [catch] at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:104) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
というスタックトレースが表示された。Code Coverage Pluginはプロジェクトを右クリックして設定するようなので、これでは使うことができない。
解決方法
色々いじっていると、右クリックしてもエラーにならずコンテキストメニューが表示されるプロジェクトもあった。
どうやら、「主プロジェクト」に設定したものだけ右クリック時にエラーになるようだ。だから、主プロジェクトを解除する、というのが解決方法。
主プロジェクトの解除は、別のプロジェクトを主プロジェクトにするか、プロジェクトを一旦閉じて開きなおせばできるみたい。
使用感
使えるようになったので試してみたが、あまり便利じゃなかった。
プラグインをActivateした後でテストを実行するとカバレッジが計測されて結果画面にカバレッジ率が表示されるけど、それだけ。結果画面は見難いし、そこからソースコードにジャンプできないようで不便。
■ [java] JMockitでカバレッジ結果の一部が表示されない
Code Coverage Plugin が気に入らなかったので、NetBeans上でカバレッジを計測するのは諦めた。Antに組み込んで計測するのでいいやと思ってカバレッジツールを探すと、
が見つかった。EMMAは2005年、Coberturnalは2007年から更新されていないようだが、JMockitは2008年10月に更新されていたので、JMockitを使ってみることにした。
問題点
頑張って設定し、計測結果のHTMLが出力できて喜んでいたが、よく見るとHTMLに出力されていないクラスがあった。
正しいかどうかわからないけれど、「aaa.bb」「aaa.bbc」のように先頭部分が一致するパッケージがあったときに、「aaa.bbc」の方が結果画面に出力されないみたい。
解決方法は分からない。のでJMockitも諦める。せっかく設定したので設定方法を以下にメモ。
インストール
jmockit-0.95.zip(トップページにあるDownloadのリンクは0.94を指しているので注意)をダウンロードして展開すると、 トップディレクトリにjarファイルが4つある。用途に応じてこれらのうち必要なものをクラスパスに含めればいいのだと思う。
Antに組み込んでカバレッジを測る
JUnitを使ってテストを行うAntターゲットが既にあるとして、その中のjunitタスクに
<jvmarg value="-javaagent:/pathpath/jmockit.jar=coverage=AAA:BBB:CCC:DDD"/>
のようなjvmarg要素を追加すればいいようだった。
- javaagentの後ろにはjmockit.jarへのパスを指定
- coverageの後ろには、classSelectionRegex、outputFormat、outputDir、srcDirsの4つを指定する。コロン区切りで指定するみたい。省略も可能。
- classSelectionRegexで計測対象のクラスを指定するみたいだが、上に書いたように「aaa.*」と指定しても aaa.bbc 配下のクラスはHTMLに出力されなかった(正確に言うと、クラス個別のHTMLファイルは生成されているが、index.htmlに必要なリンクが出力されない)。正規表現を書けるようなので、ここをうまく書けば問題が解決するのかも。
- outputFormatはxml, xml-nocp, html, html-nocpから選べる。nocpの意味はよく分からない。
- outputDirは結果の出力ディレクトリ。
- srcDirsはソースファイルの在処。カンマ区切りで複数書いてみたら認識してくれた。
詳しくは(あまり詳しくもないけど)ドキュメントのHow to run tests with code coverageを参照のこと。
junitタスク自体の書き方にあまり自信がないが、次のような感じで書いていた。クラスパスには jmockit.jar だけでなく coverage.jar も含める必要がある。
<target name="coverage" depends="..."> <junit fork="yes"> <formatter type="plain" usefile="no"/> <classpath> <pathelement location="..."/> </classpath> <jvmarg value="-javaagent:${basedir}/lib/jmockit.jar=coverage=abc.*:html::nantoka/src,kantoka/src"/> <batchtest fork="yes"> <fileset dir="..."> <include name="**/*Test.java"/> </fileset> </batchtest> </junit> </target>
2023年02月02日(木)
■ [shell][unix] Bashでリダイレクト時のディスクリプタ番号自動生成
Bashのリダイレクトについては以前にメモした。
このときメモしていなかったが、件のメモで「[n]」と書いている部分は「{varname}」のように書くことができる。こう書くと、ファイルディスクリプタの番号が自動的に生成され、その番号が変数varnameに設定される。
$ echo hello {a}>/tmp/oreore hello $ echo $a 10
Bashのmanから引用しておく。
ファイル・ディスクリプター番号で始まるリダイレクトでは、 代わりに {varname} という形式の単語で始めることもできます。 この場合、>&- と <&- 以外のリダイレクト演算子では、 シェルは 10 より大きいファイル・ディスクリプターを割り当て、 varname に代入します。 {varname} で始まる >&- や <&- の場合には、varname の値は クローズするファイル・ディスクリプターを示します。