今、4年ほど前に作ったシステムの改修・機能追加を手がけている。
その中に、Excelでレポートを出力する機能があって、当然4年も経てばMS-Officeのバージョンも変わるから今のバージョンでの動作試験をしないといけない。
Excelの出力処理はクラスを分割して切り分けているとはいえ、そのクラスのすべてのメソッドを網羅テストするのは骨の折れる作業である。
そんな中で、コードをリポジトリからチェックアウトする際に、ふと思い出した。
4年前、このコードは将来的にOfficeのバージョンが上がった場合に再テストする必要があるはずだから、ユニットテストのテストコードを書け、と指示していたのではなかったか?
納期が逼迫し、かなりつらい開発だった記憶がある。
TDDなど導入しておらず、テストコードは後付けだ。すべてのメソッドのテストケースを書くのは、大変な作業だ。ただでさえ、納期も迫っている中で、逆に生産性を下げかねないテストの実装をすべきかどうか、かなり悩んだ。
しかし、僕らは決断した。フレームワークと、共通部品だけはテストコードを書こうと。
当時からそのシステムは継続的な開発が見込まれていたし、将来的にWindowsやOfficeなど、システムが依存している環境のバージョンアップに伴う網羅テストは、必ず必要となるはずだった。
そして僕らは必死の力を振り絞ってテストを書いた。
あれから4年。網羅テストの機会は訪れた。
今回も工数に余裕はない。可能なかぎり、生産性を上げ、効率よく開発を進めねばならない。
しかし、今回の僕らには強い味方がいる。新規開発のときに書いた、テストコードだ。
今日ほど過去の自分や、当時のメンバーに感謝したことはない。
素晴らしい贈り物をもらった。
そう、テストコードは、未来の自分への贈り物なのだ。
当ブログはamazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。
2011年2月2日水曜日
2011年1月31日月曜日
IS03 & MBAで最強のモバイル環境キタコレ!
やっぱり勉強会にPC持っていくにはモバイルの通信環境が欲しいなー、と思った。とはいえ、今からポケットWiFi的なものを契約したら、いったい通信回線どんだけ持ってるんだ、という状態になる(自宅の光回線、携帯、iPadの3G)。
そこでいろいろ考えたら気づいた。あれ?Andoroidってデザリングできるんじゃね?
そこで、EasyTetherをIS03とMBAにインストールしてみた。
EasyTetherってなんぞや、とか、インストール手順とかについてはわざわざここに書かなくても大量の良記事があるので「IS03 デザリング」とかで適当にググッて欲しい。
ソフトのセットアップが終わればあとは簡単。写真のようにUSBでPCとつなぐだけ。
今日、TOEICを受けた帰りにHUBでギネスビールを飲みながら小粋に接続してみたのだが、回線速度などまったくストレスを感じない。ニコニコ(プレミアム会員)も普通に見れたよ。
試しにここで回線速度を測ってみた。
下り 1.481Mbps、上り 731.60Kbps。
外出先で使う分には全然いいじゃないの。ADSL時代は自宅回線もこんなもんだったんじゃないかな。
参考として、今の自宅回線(フレッツ光)の速度はこんな感じ。
下り 20.808Mbps、上り 4.01Mbps。
まぁ、こんな回線速度、フル活用する局面なんてめったにないからな。
そこでこうなるとますますiPadの用途に悩んでしまうなー。ただ持ち運びの容易さという部分ではiPadが圧倒的なんだが、softbankの3Gはストレスフルなんだよなー…。
3G解約して電子書籍端末として割りきってしまうのも手だな。
そんなわけで、EasyTether おすすめ!
※無料版だとhttpsに制限があるので、Gmailとか使えない。僕は9.99$で有料版買った。
2011年1月24日月曜日
凄い…。こんなの初めてっ…!
今日、飲み会があり、二次会でベルギービールのお店に連れて行ってもらい、衝撃を受けた。
ビールというカテゴリにおけるこの多様性はなんなのだ!?
コルクで栓がされているビールなど見たことがなかった僕は、今日の経験でまたひとつ世界が拡がった。おそらく、「これ、スパークリングワインだよ」といって出されても違和感なく飲んでしまっていたのではないだろうか。
それほどに、「ビール」という概念が自分の中で変わった。
世の中にはまだまだ自分の知らない、オモシロイ事がたくさんあるのだなー。
とりあえずこの世界をもう少し深く知るために、「ベルギービール勉強会」を開催せねばなるまい!
ビールというカテゴリにおけるこの多様性はなんなのだ!?
コルクで栓がされているビールなど見たことがなかった僕は、今日の経験でまたひとつ世界が拡がった。おそらく、「これ、スパークリングワインだよ」といって出されても違和感なく飲んでしまっていたのではないだろうか。
それほどに、「ビール」という概念が自分の中で変わった。
世の中にはまだまだ自分の知らない、オモシロイ事がたくさんあるのだなー。
とりあえずこの世界をもう少し深く知るために、「ベルギービール勉強会」を開催せねばなるまい!
2011年1月17日月曜日
失われた記憶を取り戻す
以前使っていたPCがお亡くなりになったとはいえ、故障箇所は電源周り。
HDDは無事なので、それを外付けHDDとして蘇らせることにした。
まずはヨドバシでSATA→USB変換のHDDケースを買ってくる。
箱の中はこんな感じ。
ケースの蓋を開けると、こんな感じ。
亡くなったPCのご遺体から、HDDを摘出する。
無事、成功。
カバーが邪魔だな…。
外すとこうなる。
摘出したHDDをケースに入れる。
蓋を閉めると、外付けHDDの完成!
無事に認識した。
HDDは無事なので、それを外付けHDDとして蘇らせることにした。
まずはヨドバシでSATA→USB変換のHDDケースを買ってくる。
箱の中はこんな感じ。
ケースの蓋を開けると、こんな感じ。
亡くなったPCのご遺体から、HDDを摘出する。
無事、成功。
カバーが邪魔だな…。
外すとこうなる。
摘出したHDDをケースに入れる。
蓋を閉めると、外付けHDDの完成!
無事に認識した。
2011年1月16日日曜日
【初めてのMac】Rubyを1.9にするの巻
MacBook Airにお勉強環境をつくろうと思う。
MacOS XにはデフォルトでRubyとRailsが入っているが、最新Verではないのでそれを適用することに。
RailsのVerUpはgemがあるので超簡単だったが、Rubyでちょっと手こずった。
まずはhttp://www.ruby-lang.org/ja/downloads/から「ruby-1.9.2-p136.tar.gz」をダウンロード。続いてターミナルでコマンドを実行する。
$sudo tar xvzf ruby-1.9.2-p136.tar.gz
解凍されたディレクトリに移動し、さらにコマンド実行!
$sudo ./configure
するとエラーになった!?
no acceptable C compiler found in $PATH
あー。gcc入ってないのかー。
RedHat系のLinuxは割と良く触ってたので、その感覚でデフォルトで入ってるのかと思ってた。
いろいろ方法はあるが、せっかくなのでxcodeを入れることにする。
Mac Dev Centerからダウンロードし、インストール。実はこのインストールも1時間経ってもダイアログが一行に進まないということがあり、プロセス強制終了 & OS再起動という荒業で切り抜けた。Macにもう少し慣れてきたら、この辺の原因も探りたいのだけど。
無事にxcodeのインストールが完了し、コマンド実行!
$sudo ./configure
$sudo make
$sudo make install
と順調に進み、めでたくRubyは1.9系になったとさ。
MacOS XにはデフォルトでRubyとRailsが入っているが、最新Verではないのでそれを適用することに。
RailsのVerUpはgemがあるので超簡単だったが、Rubyでちょっと手こずった。
まずはhttp://www.ruby-lang.org/ja/downloads/から「ruby-1.9.2-p136.tar.gz」をダウンロード。続いてターミナルでコマンドを実行する。
$sudo tar xvzf ruby-1.9.2-p136.tar.gz
解凍されたディレクトリに移動し、さらにコマンド実行!
$sudo ./configure
するとエラーになった!?
no acceptable C compiler found in $PATH
あー。gcc入ってないのかー。
RedHat系のLinuxは割と良く触ってたので、その感覚でデフォルトで入ってるのかと思ってた。
いろいろ方法はあるが、せっかくなのでxcodeを入れることにする。
Mac Dev Centerからダウンロードし、インストール。実はこのインストールも1時間経ってもダイアログが一行に進まないということがあり、プロセス強制終了 & OS再起動という荒業で切り抜けた。Macにもう少し慣れてきたら、この辺の原因も探りたいのだけど。
無事にxcodeのインストールが完了し、コマンド実行!
$sudo ./configure
$sudo make
$sudo make install
と順調に進み、めでたくRubyは1.9系になったとさ。
2011年1月15日土曜日
MacBook Airで書いた初ブログ
もうかれこれ5年ほど使っていたGatewayのノートPCが、ACアダプタを認識しなくなってしまった。
つまり、バッテリーを使い果たしてしまったら二度と立ち上がらないということ。事実上お亡くなりになったということだ。ショップで見てもらうと、基盤交換になるので5万円ほどかかりますとのこと。去年一度HDDが壊れて交換しているし、5万円もかけて修理したところでいつまでもつかも分からない。なので新しく買い換えることにした。
で、何を買うかと考えたときに、写真やドキュメントなど、結構主だったデータはEvernoteだったり、Googleだったり、オンライン上にアップデートされているので、OSとか実質あまりこだわらなくてもいいのかな、という気がしてきた。事実、いろいろなデータをインターネットを介してPC、iPad、スマートフォンとで共有していたりするわけだ。
そこで思い切ってMacを買うことにした。
MacBook Airである。
ただ、やはり仕事でWindowsを使うわけだし、Visual Studioなどのお勉強環境は確保したいので、BootCampでWindows7を導入。Macで動くWindowsというのはなかなかにシュールなものである。
故障した先代のPCがバッテリーを完全に使い果たし、そこから新しいMacが届くまでに2週間ほどかかったのだが、その期間をPC無しで過ごしてみて気づいたことがある。
iPadを手に入れてから、PCを起動する機会が減った。携帯をスマートフォンにしてからはその傾向がさらに進んでいる。自宅でのPC用途のほとんどは、メールのチェックであったり、ウェブブラウズだったりするので、iPadがあればそれだけで事足りてしまうのである。
プログラムや開発環境の勉強などを除くと、PCが無くても別に困らないんじゃないかな、と考えたこともある。
しかし、いざPCのない生活をしてみると、やはりとてつもなく不便なことに気づいた。
iPadやスマートフォンは、アウトプットに向いていない。TwitterやFacebookにPOSTする程度なら気にならないのだが、ブログなど少し長い文章を書こうとするととてつもないストレスがかかってしまう。
確かにiPadのソフトウェアキーボードは携帯などと比べると圧倒的に入力しやすいのであるが、長文を打つのはやはりしんどい。打鍵感覚がないので、タッチタイピングができないのだ。
今、こうしてPCを使って快適なタイピングを満喫しながら。あらためてそう思った。
つまり、バッテリーを使い果たしてしまったら二度と立ち上がらないということ。事実上お亡くなりになったということだ。ショップで見てもらうと、基盤交換になるので5万円ほどかかりますとのこと。去年一度HDDが壊れて交換しているし、5万円もかけて修理したところでいつまでもつかも分からない。なので新しく買い換えることにした。
で、何を買うかと考えたときに、写真やドキュメントなど、結構主だったデータはEvernoteだったり、Googleだったり、オンライン上にアップデートされているので、OSとか実質あまりこだわらなくてもいいのかな、という気がしてきた。事実、いろいろなデータをインターネットを介してPC、iPad、スマートフォンとで共有していたりするわけだ。
そこで思い切ってMacを買うことにした。
MacBook Airである。
ただ、やはり仕事でWindowsを使うわけだし、Visual Studioなどのお勉強環境は確保したいので、BootCampでWindows7を導入。Macで動くWindowsというのはなかなかにシュールなものである。
故障した先代のPCがバッテリーを完全に使い果たし、そこから新しいMacが届くまでに2週間ほどかかったのだが、その期間をPC無しで過ごしてみて気づいたことがある。
iPadを手に入れてから、PCを起動する機会が減った。携帯をスマートフォンにしてからはその傾向がさらに進んでいる。自宅でのPC用途のほとんどは、メールのチェックであったり、ウェブブラウズだったりするので、iPadがあればそれだけで事足りてしまうのである。
プログラムや開発環境の勉強などを除くと、PCが無くても別に困らないんじゃないかな、と考えたこともある。
しかし、いざPCのない生活をしてみると、やはりとてつもなく不便なことに気づいた。
iPadやスマートフォンは、アウトプットに向いていない。TwitterやFacebookにPOSTする程度なら気にならないのだが、ブログなど少し長い文章を書こうとするととてつもないストレスがかかってしまう。
確かにiPadのソフトウェアキーボードは携帯などと比べると圧倒的に入力しやすいのであるが、長文を打つのはやはりしんどい。打鍵感覚がないので、タッチタイピングができないのだ。
今、こうしてPCを使って快適なタイピングを満喫しながら。あらためてそう思った。
2011年1月1日土曜日
プログラム言語で書初めしてみた。
皆さん。明けましておめでとうございます。
今日はお正月らしく、書初めをしようと思います。しかし、書初めと言っても半紙とか硯とか筆とか持っていないので、プログラマらしく「無いなら実装すれば良い」とのスタンスで、プログラムで書初めをします。
使用する言語はC#。それでは書初めスタート!!
※遊びでやってるので、ところどころ変な実装や設計があっても大目に見てください。
■美しい実装は美しい設計から
いくらビールを飲みながらとはいえ、いきなりコーディングを開始するほどわたしも愚かではありません。まずは設計です。クラス図をきちんと書いてから、実装を始めましょう。
書初めは日本の伝統的な行事であります。したがって、クラス図も日本のソフトウェア業界における伝統的なツールである、「Excel方眼紙」に書くとしましょう。
クラス図ができあがったところで早速実装です。
■いよいよ実装!!
まずは筆クラスから始めましょう。
こんな感じになりました。
最初の列挙型「FudeStatus」は筆に墨がついているかどうかの状態を表現するために作りました。そして「_status」が筆の状態です。
「InkApplied()」が筆にすみをつけるという振る舞い。「IsInk()」は筆に墨がついているかを検査するメソッドです。
さてさて、続いては半紙クラス。
「_wittenString」は半紙に書かれている文字を表現する属性。「WriteString()」で筆を使って文字を書きます。筆に墨がついていないと文字が書けないので、筆クラスのIsInk()がFalseを返した場合はエラーとしましょう。Exceptionの派生クラスであるNoInkExceptionを実装し、それをThrowすることにします。
「GetWrittenString()」で何が書かれているかのお披露目です。
そして最後にわたしこと粕谷クラスの実装です。
わたしは今年一年も永続的に元気でいたいので、そういう思いを込めてstaticで実装しました(笑)。
「Kakizome()」で書初めをして半紙クラスを返します。筆と半紙を用意(インスタンス生成)し、筆に墨をつけて書初めをします。
あとはわたしの振る舞いをMain()に書いて実行しましょう!
みごと、書初め完了です!!
今日はお正月らしく、書初めをしようと思います。しかし、書初めと言っても半紙とか硯とか筆とか持っていないので、プログラマらしく「無いなら実装すれば良い」とのスタンスで、プログラムで書初めをします。
使用する言語はC#。それでは書初めスタート!!
※遊びでやってるので、ところどころ変な実装や設計があっても大目に見てください。
■美しい実装は美しい設計から
いくらビールを飲みながらとはいえ、いきなりコーディングを開始するほどわたしも愚かではありません。まずは設計です。クラス図をきちんと書いてから、実装を始めましょう。
書初めは日本の伝統的な行事であります。したがって、クラス図も日本のソフトウェア業界における伝統的なツールである、「Excel方眼紙」に書くとしましょう。
Excel方眼紙の枠線が邪魔なので、これも消しちゃいましょう。
オプションの「枠線」のチェックボックスを外すと、枠線が消えます。もうお馴染みですよね。
そうして出来上がったクラス図が下記の通りです。
硯も実装しようと思ったのですが、「墨をする」という振る舞いをどう実装するか悩んだ結果、面倒なのでやめました。まあ、お正月のお遊びですから、簡単で良いでしょう。
クラス図ができあがったところで早速実装です。
■いよいよ実装!!
まずは筆クラスから始めましょう。
こんな感じになりました。
namespace ConsoleApplication1 { public class Fude { private enum FudeStatus {ExistInk, NoneInk} private FudeStatus _status = FudeStatus.NoneInk; public void InkApplied() { _status = FudeStatus.ExistInk; } public bool IsInk() { return _status == FudeStatus.ExistInk; } } }
最初の列挙型「FudeStatus」は筆に墨がついているかどうかの状態を表現するために作りました。そして「_status」が筆の状態です。
「InkApplied()」が筆にすみをつけるという振る舞い。「IsInk()」は筆に墨がついているかを検査するメソッドです。
さてさて、続いては半紙クラス。
namespace ConsoleApplication1 { public class Hanshi { private string _writtenString = string.Empty; public void WriteString(Fude f, string s) { if (!f.IsInk()) { throw new NoInkException(); } _writtenString = s; } public string GetWrittenString() { return _writtenString; } } }
「_wittenString」は半紙に書かれている文字を表現する属性。「WriteString()」で筆を使って文字を書きます。筆に墨がついていないと文字が書けないので、筆クラスのIsInk()がFalseを返した場合はエラーとしましょう。Exceptionの派生クラスであるNoInkExceptionを実装し、それをThrowすることにします。
「GetWrittenString()」で何が書かれているかのお披露目です。
そして最後にわたしこと粕谷クラスの実装です。
namespace ConsoleApplication1 { public static class Kasuya { public static Hanshi Kakizome() { Fude f = new Fude(); Hanshi h = new Hanshi(); f.InkApplied(); h.WriteString(f, "一富士二鷹三茄子"); return h; } } }
わたしは今年一年も永続的に元気でいたいので、そういう思いを込めてstaticで実装しました(笑)。
「Kakizome()」で書初めをして半紙クラスを返します。筆と半紙を用意(インスタンス生成)し、筆に墨をつけて書初めをします。
あとはわたしの振る舞いをMain()に書いて実行しましょう!
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Hanshi h = Kasuya.Kakizome(); Console.WriteLine(h.GetWrittenString()); } } }
みごと、書初め完了です!!
皆さん、今年もよろしくお願いします。
登録:
投稿 (Atom)