これは個人的なTIPSとして、プログラムを書くときに、詳細設計がきちんとできていて、将来に渡ってメンテナンスしやすいかどうかの判断基準として、気を付けていることのメモ。
二つあって、どちらも同じような目的のために確認している。
1つ目は、後からテストコードを書く場合は、テストコードがどのように実行できるかを想像しながら実装する。すると、テストしたい部分を自然に切り離しながら実装したくなる。自動的にテストしにくい部分がどんどん一か所にまとめられていって、結果として後からいろいろ変更したり、機能追加がしやすくなる。
2つ目は、今追加しようとしている機能をOFFにしようとしたとき、どれくらいの場所を修正しなくてはいけないかを考える。1行コメントアウトするだけでそれができるのがベスト。できなくても、1ファイルの1ブロック(画面内で確認できる範囲)を修正すれば機能をOFFにできればまあ、問題ないレベル。
1ファイルの複数個所、という場合には、まず設計を見直す。OSの仕組みなどにより、どうしてもそうせざる負えない場合には、よくコメントを書いておくなりドキュメントしておくなりしないといけない。
複数ファイルを直さなきゃいけない場合は、1度よく設計を考え直した方がいいかもしれない。もうそれしか方法がないときだけ、コメントを付けて、どことどこに対応関係があるかを書いておく。
複数ファイルの複数個所を直さないと機能をOFFにできないとか、こういう状況になったら、そもそも何かがおかしいと思った方がいい。だいたい1つのファイルに複数の機能が同時に実装されていたり、2つのファイル(モジュール)が互いに依存しあっていたり、機能の定義があいまいだったりするのが原因で、その後その上にいろいろ機能を追加していけばしていくほど、バグは多くなる。
My Daily Programming Life...
RTX1000の設定 - シリアル接続がない場合
自宅でYAMAHAのルータ RTX1000を使っている。
このルータ、業務用だけあってユーザフレンドリでは全くない。
設定はコマンドラインで行うことになっているし、コマンドも技術的なことが分かってないと何もできないぐらい難しい。
さて、このルータ、初期状態だとIPアドレスが振られていない。つまり自宅のネットワークに繋いでも、そこにIP層レベルのアクセスはできない。
じゃあ、どうやってIPアドレスを振るのかといえば、基本的にはシリアルケーブルを繋いで、terminal経由で設定する。
ただ、いまどきシリアル端子なんて持ってるPCの方が少ない。僕の使ってるPCも例外ではなくそんなものはもってない。
以前に設定したときは、USBとシリアルの変換コネクタとケーブルを買ってきて設定した。
今回、もう一つ新しくRTX1000を買って、実家とのVPN接続をさせておこうと考え、設定しようとしたのだが、昔買ったはずのケーブルが見つからない。
で、そういう場合にRARPDを用いてIPアドレスを振る方法があるということを知り、今回やってみた。
基本的には以下のページの通り。
http://www.inohome.net/kuma/blog/archives/2006/12/post_606.html
ただし、1つはまったところがあったのでメモ。
ここで使っているRARPDというソフトウェアが「No unique Registry key for TCP/IP over LAN」というエラーを出して終了してしまう。
レジストリキーが複数あるってことなんだろうけど、よく分からない。
うれしいことに、RAPRDにはソースコードが付いてくる。というわけで見てみると、どうやらEthernetのインターフェースをレジストリから探していて、それが複数見つかった場合にはエラーを出すらしいと言うことが分かった。
確かに、僕のPCにはEthernetアダプタが2つついている。VMWareの仮想デバイスとかもあるから、その辺りも関係しているかもしれない。
ということで、メインのネットワーク以外はすべて無効にした。
こんな感じで。それで起動したらちゃんと動いて、みごとにRTX1000にIPアドレスを振ることができた。
これができればRTX1000を設定するのにシリアル端子は必要ないってことだ。
このルータ、業務用だけあってユーザフレンドリでは全くない。
設定はコマンドラインで行うことになっているし、コマンドも技術的なことが分かってないと何もできないぐらい難しい。
さて、このルータ、初期状態だとIPアドレスが振られていない。つまり自宅のネットワークに繋いでも、そこにIP層レベルのアクセスはできない。
じゃあ、どうやってIPアドレスを振るのかといえば、基本的にはシリアルケーブルを繋いで、terminal経由で設定する。
ただ、いまどきシリアル端子なんて持ってるPCの方が少ない。僕の使ってるPCも例外ではなくそんなものはもってない。
以前に設定したときは、USBとシリアルの変換コネクタとケーブルを買ってきて設定した。
今回、もう一つ新しくRTX1000を買って、実家とのVPN接続をさせておこうと考え、設定しようとしたのだが、昔買ったはずのケーブルが見つからない。
で、そういう場合にRARPDを用いてIPアドレスを振る方法があるということを知り、今回やってみた。
基本的には以下のページの通り。
http://www.inohome.net/kuma/blog/archives/2006/12/post_606.html
ただし、1つはまったところがあったのでメモ。
ここで使っているRARPDというソフトウェアが「No unique Registry key for TCP/IP over LAN」というエラーを出して終了してしまう。
レジストリキーが複数あるってことなんだろうけど、よく分からない。
うれしいことに、RAPRDにはソースコードが付いてくる。というわけで見てみると、どうやらEthernetのインターフェースをレジストリから探していて、それが複数見つかった場合にはエラーを出すらしいと言うことが分かった。
確かに、僕のPCにはEthernetアダプタが2つついている。VMWareの仮想デバイスとかもあるから、その辺りも関係しているかもしれない。
ということで、メインのネットワーク以外はすべて無効にした。
こんな感じで。それで起動したらちゃんと動いて、みごとにRTX1000にIPアドレスを振ることができた。
これができればRTX1000を設定するのにシリアル端子は必要ないってことだ。
東北太平洋沖地震
被災状況をテレビで見るのが辛い。
親を亡くした子供、目の前で自分の奥さんが流されてしまった人、自分の娘が流されてしまった人、そんな辛い状況がどこにあるだろうか。見ていられないぐらいに悲しい。
今回は、東京にいながら、その恐怖を感じたせいか、その悲しさがものすごく大きい。
今回もある意味では、僕が感じられることは人ごとレベルでしかないのだろう。
結局東京ではその悲惨さはわからないかもしれない。それでも今まで感じたものよりずっと大きな感情的な動きがある。
一人でも多くの人が助かってほしいと思う。
こういうことを目の当たりにすると、僕たちが普段考えている幸せや、生きていく上で大切なことが何なのかということを考えさせられる。
人が、その人の一生を豊かに、幸せに生きていくと言うことと、自分が今毎日の生活の中で行っていることの間に大きな忘れ去られた空間が広がっているのではないだろうかと感じた。
忘れてしまうのだと思う。
家族とともに、いろんな困難を乗り越えて毎日生きていくこと、生きていけること。それが何より重要なことであり、それがすべてなのだと思った。それ以外のことは、おまけみたいなものなんだ。
親を亡くした子供、目の前で自分の奥さんが流されてしまった人、自分の娘が流されてしまった人、そんな辛い状況がどこにあるだろうか。見ていられないぐらいに悲しい。
今回は、東京にいながら、その恐怖を感じたせいか、その悲しさがものすごく大きい。
今回もある意味では、僕が感じられることは人ごとレベルでしかないのだろう。
結局東京ではその悲惨さはわからないかもしれない。それでも今まで感じたものよりずっと大きな感情的な動きがある。
一人でも多くの人が助かってほしいと思う。
こういうことを目の当たりにすると、僕たちが普段考えている幸せや、生きていく上で大切なことが何なのかということを考えさせられる。
人が、その人の一生を豊かに、幸せに生きていくと言うことと、自分が今毎日の生活の中で行っていることの間に大きな忘れ去られた空間が広がっているのではないだろうかと感じた。
忘れてしまうのだと思う。
家族とともに、いろんな困難を乗り越えて毎日生きていくこと、生きていけること。それが何より重要なことであり、それがすべてなのだと思った。それ以外のことは、おまけみたいなものなんだ。
自宅でVPN
自宅にVPNで接続できるようにした。といっても、だいぶ前からできるのだけど、ほとんど使ってなかった。
ようやく手元に残っているMac miniをSVNサーバとして使うようになった。
VPNでどこからでもつなげるのはよいけど、逆に間違えると自分が持っている情報が外に漏れる可能性もあるわけで、もうちょっとVPNといっても制限をかけた状態で使うようにしたい。
自宅内にVPNからアクセスできるネットワークと、できないネットワークを作るようにするか・・・なんか面倒だな。なんかいい方法ないだろうか。
ようやく手元に残っているMac miniをSVNサーバとして使うようになった。
VPNでどこからでもつなげるのはよいけど、逆に間違えると自分が持っている情報が外に漏れる可能性もあるわけで、もうちょっとVPNといっても制限をかけた状態で使うようにしたい。
自宅内にVPNからアクセスできるネットワークと、できないネットワークを作るようにするか・・・なんか面倒だな。なんかいい方法ないだろうか。
Visual Studioとcfix
Visual Studio 2010でCfixを使おうと思ってチュートリアルに従ってやろうとして、いくつか引っかかったので解決法を。
チュートリアルには、プロジェクトの作成については一切ふれられていないけど、テストを書く前の段階でテスト用のプロジェクトを作る必要がある。そして、それはDLL作成用のプロジェクトにすればよい。
まず、cfixのチュートリアルに"output window"という言葉が出てきて、そこにテスト結果のログなどが表示されるとあるけれど、この"output window"は"出力ウィンドウ"のことではなくて、コンソールウィンドウのことらしい。
cfixのチュートリアルで、最後にCtrl+F5で実行すればコンソールウィンドウに結果がでてそれが確認できるとあるけれど、普通にプロジェクト作ってやるとコンソールウィンドウが終了後すぐに閉じてしまって確認できない。
Ctrl+F5はVisual Studioの「デバッガなしで開始」に相当するけど、プロジェクトの設定の「リンカ」-「システム」-「サブシステム」が"Windows"になっているとすぐに閉じてしまう。これを"Console"に変えた上で、Ctrl-F5で実行すると、実行終了後にコンソールウィンドウが閉じずにキー入力を待つようになる。
追記:
cfixのヘルプをさらに読み込むと、Visual Studioの出力ウィンドウに結果を出している。でも、できない。どうやるんだろうか。コマンドラインで出力先を変えられる見たいに書いてあるけど、そんなオプション見つからない・・・
さらに追記:
最近のバージョンでは、それらのオプションはなくなったらしい。そして・・・どちらかというとその姉妹ソフトのVisualAssertを使えってことらしい。
チュートリアルには、プロジェクトの作成については一切ふれられていないけど、テストを書く前の段階でテスト用のプロジェクトを作る必要がある。そして、それはDLL作成用のプロジェクトにすればよい。
まず、cfixのチュートリアルに"output window"という言葉が出てきて、そこにテスト結果のログなどが表示されるとあるけれど、この"output window"は"出力ウィンドウ"のことではなくて、コンソールウィンドウのことらしい。
cfixのチュートリアルで、最後にCtrl+F5で実行すればコンソールウィンドウに結果がでてそれが確認できるとあるけれど、普通にプロジェクト作ってやるとコンソールウィンドウが終了後すぐに閉じてしまって確認できない。
Ctrl+F5はVisual Studioの「デバッガなしで開始」に相当するけど、プロジェクトの設定の「リンカ」-「システム」-「サブシステム」が"Windows"になっているとすぐに閉じてしまう。これを"Console"に変えた上で、Ctrl-F5で実行すると、実行終了後にコンソールウィンドウが閉じずにキー入力を待つようになる。
追記:
cfixのヘルプをさらに読み込むと、Visual Studioの出力ウィンドウに結果を出している。でも、できない。どうやるんだろうか。コマンドラインで出力先を変えられる見たいに書いてあるけど、そんなオプション見つからない・・・
さらに追記:
最近のバージョンでは、それらのオプションはなくなったらしい。そして・・・どちらかというとその姉妹ソフトのVisualAssertを使えってことらしい。
なんとなく負け
for文を書くときにunsinedの値をカウンタにして、カウンタを減らしながら0まで実行したいことがある。
例えば
ただ、このループは永久に終わらない。iが0となったあと、i--が実行されて、unsignedであるために、INT_MAXになってしまい、i => 0の条件は常に満たされてしまう。
いろいろ方法はあると思うのですが、
http://q.hatena.ne.jp/1203477428
ここで質問があって、いろいろやり方があって、その中の6番目の回答に対する、質問者の答えがおもしろく、かなり共感できてしまった。
「なんとなく負けかな。」って。この、ちょっと何かスマートじゃないと感じるのは、みんな持っているものなんだな。
プログラム書いているとだいたい時間がかかるのはこういうどうでもよい問題だったりする。書く気になれば、そのまま書けるけど、なにか気に入らない。だから調べる。なかなか、スマートな方法が見つからない。もっと考える・・・。
プログラミングを仕事にするには、この感覚はちょっと向かないかもしれない。
例えば
for( usigned int i = 10; i >= 0 ; i-- ){
data[i+1]=data[i];
}
これは、data配列の中身を順番に1つずつずらしていく。ただ、このループは永久に終わらない。iが0となったあと、i--が実行されて、unsignedであるために、INT_MAXになってしまい、i => 0の条件は常に満たされてしまう。
いろいろ方法はあると思うのですが、
http://q.hatena.ne.jp/1203477428
ここで質問があって、いろいろやり方があって、その中の6番目の回答に対する、質問者の答えがおもしろく、かなり共感できてしまった。
「なんとなく負けかな。」って。この、ちょっと何かスマートじゃないと感じるのは、みんな持っているものなんだな。
プログラム書いているとだいたい時間がかかるのはこういうどうでもよい問題だったりする。書く気になれば、そのまま書けるけど、なにか気に入らない。だから調べる。なかなか、スマートな方法が見つからない。もっと考える・・・。
プログラミングを仕事にするには、この感覚はちょっと向かないかもしれない。
MFCがおかしい。
MFCが進化してる話を書いたけど、なんだか質が悪い気がする・・・。
MFCのウィザードが生成するコードに
メニュー隠れてるし、右端もおかしいし・・・。
バグな気がするんだけど。
これで悩んで半日使った。でもどうしようもないみたい。
MFCのウィザードが生成するコードに
// TODO: ツール バーおよびメニュー バーをドッキング可能にしない場合は、この 5 つの行を削除します
m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndMenuBar);
DockPane(&m_wndToolBar);
っていうのがあるから、この5行をコメントアウトだけして、ビルドし直したら下の図みたいなウィンドウになっちゃった。メニュー隠れてるし、右端もおかしいし・・・。
バグな気がするんだけど。
これで悩んで半日使った。でもどうしようもないみたい。