かなり間があいてしまったが、前回書いたICレコーダーの話 の続き。が最後にもう一つある。うまく書けないので原稿のまま放置してあったのだが、実はこれが大本命である。

今回ICレコーダーを購入した理由は、パソコンにデータを転送したかったから、と最初に書いた。このデータ転送はUSBケーブルで接続して、専用ソフトで受けるという感じである。

このICレコーダーは、SONYの製品だから、実はメモリースティックDUOを使うこともできる。これだと、VAIO Z にスロットがあるので、データ転送は簡単だ。但し、メモリースティックDUOの場合、VAIO Z で使うには、アダプタを使う必要があるということで、微妙に使い勝手がよくないが、まあ仕方ない。そういえば PSP と VAIO の接続でも、同様の問題があるわけだが、それはそうとして、

一体何が起こったか。USBケーブルをまず接続する。そして、音声データ転送用のソフトウェアを起動する。恐ろしいことに、これで何もできなくなる。ソフトウェアの操作が一切できないのである。暴走したといか言いようがない状態である。

何が何だか分からない訳だが、USBケーブルを後から接続すればいいのではないか。実際にやってみた。今度は起動後に、ダイアログが表示される。接続先を指定しろというのだ。このダイアログが、先にICレコーダーを接続した場合には表示されないのである。

じゃあこれで問題解決かというと、そう甘くはない。データ変換を実行しようとしたら、いきなり無反応になった。VAIO Z のCPUクーラーのファンが回り始める。CPUの稼働率が100%になっているのだ。この状態で、にっちもさっちも行かない。こうなると、コントロールパネルからプログラムを強制終了させるのも苦労する。


つまり要するに、ユーザーインターフェースの評価どころではなくて、このソフトウェアは使えないのだ。ユーザビリティではなくて、can't use なのである。こうなると、ソニーに一言いってやろうということになるが、その前に何気なくソニーのサイトを見てみると、なんと、このソフトウェアの修正版が出ている。

発売開始して1か月も経ってないうちに修正版を出すというのも凄いと思うが、ソニーが凄いと思ったのは、修正版で上書きしたら、前述の問題は一切解消したのである。流石ソニーだ。やはり私の選択は正しかった。何か違うんじゃないかと思われるかもしれないが、結果よければ全ていいのである。ブログのネタにもなったし、まあ言うこともない。

ということで、ICレコーダーを買って Sony の Digital Voice Editor 2 というソフトの挙動がおかしいと思っている人は、Sony のサイト (パーソナルオーディオカスタマーサポート )から最新版 (2.31b 以降)をダウンロードして置き換えてみるのがいいと思う。

AD

開発実況中継中 (2)

テーマ:

このブログの読者になった方が「TDDでなんか作ってみる 」というブログを開いていることを知った。TDD というのは何かというと、Test Driven Development か? 「か?」というのは心もとないが、Test first というアレに近い。

Test first と何が違うかという話は、@IT の特集「テスト工藤開発」はプログラマのストレスを軽減するか? に書いてあった。ただ、申し訳ないが私はこの記事を読んでも Test first と TDD の違いが分からなかった。というか、これでは同じだと思うわけだが、余談はさておき、

先に紹介したブログにある「ハッシュを使おう 」という記事には、「恋するプログラム」という本が出てくる。この本、「裏の裏ページ 」でも紹介したのだが、買った。これはいい本だと思う。ただ、Ruby というマイナーの帝王のような言語で書かれているので、そこに抵抗がなければという話になってしまうが。

先に紹介した記事には、Java でハッシュはどう書くのかという話が出てきて、TDD で作ってみた、という話が出てくる。

Java では Ruby や Perl や PHP のハッシュ(連想配列)のことをおおむね Map と呼んでいる。おおむねというか、Map の方が圧倒的に多機能である。私がよく使うのは TreeMap だ。TreeMap は要素がキーでソートされた状態で格納されるので、Iterator を使って順番に取り出すことができる。Ruby のハッシュにはそのような機能はなかったと思う。

Mawou は掲示板の投稿を扱うので、投稿を順に取り出すという機能が必須、ということで TreeMap の出番になるのだが、これで Comparator を使ってハマった話は FPL の Java の掲示板に書いた通りである。

さて、例の本に出てくるハッシュの例は、

sound = {
'ジャブ' => '「バシッ」',
'ストレート' => '「ビシィッ」',
, 'ローキック' => '「ベチィッッ」',
}

である。(p.33)

これをテストケースでテストするには、こういうコードを書く。一部抜粋だが。

String key1 = "ジャブ";
String value1 = "「バシッ」";
assertEquals(value1, sound(key1));

リテラルを直接書かない理由は、後で修正したときに、各所に別々に書いてあったら、一部だけ直してもいいのかどうか分からないからだ。実際、同時に修正しなければならない場合には、必ず一部が修正漏れになることが経験的に知られている。

修正漏れでなくても、テストケースの中でリテラルのタイプミスというか打ち間違いが原因でヘンな結果が出ることは防ぎたい。前回書いたように、テストケースのロジックがバグっているというヘンな話になると、何のためにテストしているのか分からない。しかし実況チャットでよくあるのが、コレである。

本当は、このようなテスト用のキーと値のペアは、Map で持っていてもよさそうなものだが、Map でハッシュを実装する処理を作っているのに、テストケースの中で Map を使ってハッシュを実装しているというのは何かがおかしいのだ。

さて、このように、必要な値が出てくることのテストは誰でもやるのだが、もう一つ重要なテストだ思っているのが、false を返すテストである。前回の記事で「逆を書かない」という話だ。もっと具体的にいえば、sound("ジョブ"); の結果はどうなって欲しいか、というのもテストしろと言っているのだ。つまり、こういうテストである。

String keyX = "ジョブ";
assertEquals(null, sound(keyX));

Java では Map に対して登録していないキーを使って値を取り出そうとしたら null を返すことになっている。当たり前だが null に equals というメソッドはないが、assertEquals はこういう比較もしてくれる。そうなると、もう一つありそうな場合をテストしておいた方がいいことに気付く。この sound というメソッドに null を与えたらどうなるのか?

assertEquals(null, sound(null));


これは、もしかすると NullPointerException を出すという仕様でもいいかもしれない。そういうコードを書く方の責任だというのだ。とりあえず、今回はこの程度あればかなり十分だろ、というテストの内容は、例えば次のようになる。

String key1 = "ジャブ";
String value1 = "「バシッ」";
assertEquals(value1, sound(key1));

String keyX = "ジョブ";
assertEquals(null, sound(keyX));

// 特殊な場合
assertEquals(null, sound(""));
assertEquals(null, sound(null));

sound("") って何だ? いや、こういうのがどうも気になるというか、気になりませんか、そうですか。この程度、入れておいてもいいんじゃないの、ということで。

こういう特殊な状況下だけ思わぬふるまいをすることが結構ある。文字列だと、長さが0の場合。テストしたいメソッドが引数にCollection を要求しているなら、要素が一つもない状態で呼んでみる。そういう境界条件のテストも重要である。Mawou のテストでも、掲示板に発言が1つもないときにやられてしまった。まだテストしてないが、多分、フォーラムに掲示板が1つもないとヤバいと思うが、それってソフトじゃなくてそのフォーラムがヤバくないか、ということで気が付かなかったことにしている。

なお、紹介したページには、(String) というキャストが無作法ではないかという話が出てくるが、その感性は正しいと思う。Java としてもずっと気になっていたようで、J2SDK 5.0 (1.5) から、Generics という仕様が追加された。多分、それを使えば、

Map hash = new HashMap<String, String>();


とか書けて、

return hash.get(string);


と書けるんじゃないかな、5.0 の環境が手元にないので、試してないけど。

AD

開発実況中継中 (1)

テーマ:

久しぶりにプログラミングの話。FPROG では Mawou という開発コードで、@nifty のフォーラムを自動的に巡回するというプログラムを作っている。企画会議室もある。ただ、今のところ実際にコードを書いているのは私だけである。つまり、気楽に作れる状態である。

これは Java で Eclipse を使って書いているので、とりあえず、Junit でテストしながらの開発をしている。前回紹介した、@nifty の新チャットで、開発中の様子を生中継しながらである。フォーラムのチャットは6/15に入れ替えになるので、今のところ、とりあえず、フリートークCという特設チャットを使っている。フリートークCだが、言語はCではなくJava なのだ。

そういえば、C++ の場合は Junit みたいなのが何かあるか、という質問がかなり前にFPL であったのだが、私がちょっと探しただけだと見つからなかった。手ごわい。ないはずはないのだが。

さて、実況chatというか一人で勝手に喋っているのを見ているのは面白いらしいが、実況をみたことのある方はご存知のように、要するに Junit はokなのに、その後に実行したら

_| ̄|○

ということがよくあることが分かる。どういうことかというと、単体テストは通っても結合テストというか、全体の処理がダメなのだ。Junit には限界があるのは当然で、そのためのテストプログラムも結構あったはずだから、そちらを行えばいいのかもしれないが、Mawou はまだそこまで進んでいない。最近ハマったのは cookie の処理で、結局 cookie の処理をかなり書き直したのだが、こういうのは相手サーバーがいないとなかなか先に進めない。

もっとすごいのもある。テストケースがバグっているとか。まあそれはすごすぎるのだが、まさかテストケースのテストを書く人もいないだろうし。

冗談はさておき、テストケースを書くときに、「何をテストすべきか」ということが、よく問題になる。完璧なテストはもちろん無駄なことが多い。ある程度テストできれば吉、というアプローチは正しいのである。要は、コストの問題だ。このあたり、最近のJAVA WORLD でも出ていたと思うが、回収できないようなコストをかけて製品作っても意味ない、という話。

でも、最低限しなければならないテストは何か。「こうすればこうなるはず」というテストを忘れる人は、さすがにいないのだが、逆を書かない人は結構いそうだ。というか私がそうか。

(つづく)

AD
@niftyのフォーラムのチャットがリニューアルされるそうである。既にフォーラムトップで大々的に発表されているように、今回は Flash を使っているので「幅広いブラウザに対応」しているのがウリらしい。

(フォーラムトップ http://forum.nifty.com/ )

今までは Java だった。余談だが、どうすれば Java という最もプラットホームを選ばない言語を使って動作環境を超限定できるのか謎、というか、ニフティの開発者のスキルは私の想像をはるかに超えた高い所にあるのだ。tty時代に人気者だった「わかぬ」とか、Webフォーラムのchatに移植されていなくて本当によかった。というか密かに開発中でしたか?

フォーラムのchatはまだこれからだが、新しいchat は6月2日からサービスを開始している。6月末まで、プレゼントキャンペーン中で、いきなりニフティが乱入してきてキーワードだけ言ってすぐに退散してしまうのが面白い。2つキーワードが分かったところで3つめを想像したのだが、これを当てた人がいたというのも面白い。

また余談だが、乱入したときにニフティのプロフィールを表示できるか、と思ってトライしたのだが、右に出ているユーザー一覧画面に、ニフティは表示されないようだ。残念。

さて、どこがリニューアルされたか。要するに、新しいチャットは、現在のものが最終版だとはとても思えない完成度なのだが、とりあえず最新レポートとして紹介してみたい。

*

まず、使い勝手について。新機能として、会話した内容をファイルに保存する機能が付いている。すご~い♪。

何がすごいのかチンプンカンプンだって?

今までのchatは、ログを保存できなかったのだ。ウソじゃない、本当だ。だから私なんか、定例chatの時には、Ethereal を起動してパケットログを保存していたのだが、すぐに飽きた、いや、面倒すぎるのでやめてしまった。

さらに新機能がある。発言の一部を選択して、クリップボードにコピーすることができるのだ。超すご~い。

# なにが?

さて、URI が表示されたときにクリックして別ブラウザで表示する、という当たり前の機能は残念ながら実装されていない。コピーしてから、あらかじめ起動しあておいた別ブラウザに指定、ということになる。今までは、コピーするのも大変だった。ちなみに、コピーしたいときには、カーソルキーを使って、入力のテキストボックスに必要な行を表示させれば、そこだけコピーすることができる。これって裏技?

なお、新しいチャットでは、ダブルクリックで文字列選択もできる(Windows版で確認)。従って、URI を紹介するときに、(http://forum.nifty.com/fprog/) としないで、( http://forum.nifty.com/fprog/ ) とした方がいい。その方が選択しやすい。

動作対象の環境は広がったのか?

こちらの環境では、Fedora Core 3 上で Firefox を起動し、そこから実行してみたが、ほぼ問題なく実行できているようである。「ほぼ」というのは、どうにも発言が保存できなかったからだが、「ファイルに保存」ではなく、エディタを起動するように選択するとちゃんと起動するので、何かセキュリティの設定でも影響しているのかもしれない。


この後、どんどん @nifty の方の話になりますので、とりあえずこの続きは、今回、@nifty プログラマーズフォーラム掲示板 の、「ユーザーインターフェース考」に掲載しています。なお、この掲示板ご利用には @nifty ID が必要になります。(ID がない方は無料で登録可能です。)
チャットシステムのご利用にも、同じく、@nifty ID が必要です。