My Daily Programming Life...

WordPressに

WordPressにこのwebサイト全体を移行しようかと考え中。
もう、最近HTMLとか自分で編集するの面倒になってきた。

KeyRemap4MacBookProとControl,CommandキーとMacVimと

数ヶ月前からMacBookAirを使い始めて、Commandキーでいろいろな操作ができるショートカットがいまいち
気に入らず、今まで通りControlキー(左手の小指)でショートカットを利用したいと思い、
ControlとCommandキーを入れ替えることにした。

方法は簡単でKeyRemap4MacBookProをインストールして、あとは設定で
”Change Control_L Key"の中から、Command_Lと入れ替えるものにチェックを入れれれば良い。

でも、いろいろオプションがあって、たとえば、"Emacs以外は入れ替え"とか、"TerminalとChromeとRemoteDesctop以外は入れ替え"とかがある。

僕はTerminalとかはそのままControlキーはControlキーとして使いたかったので
"except Terminal,Virtual Machine, RDC"
のものを選択した。

これでほとんどの場合には満足できたのだけれど、1つだけ満足できない所が。
MacVimでControlとCommandが入れ替わってしまう。
Terminal上で操作するVimは上記設定で問題なくControlキーはそのままになるのだけれど、
MacVimはそうなってくれない。

調べてみると自分で設定を書けるらしい。いろいろ戸惑ったものの、結果以下のようなXMLをprivate.xmlとして保存しておけば大丈夫ということがわかった。これを読み込むとMyKeyMapという項目が追加されるのでそれにチェックすればOK
(この場合、規定で入っているChange Control_L Keyは使わず自分の設定のものだけにチェックつける)


<?xml version="1.0"?>
<item>
<name>KeyRemap4MacBook Developer</name>
<list>
<item>
<name>MyKeyMap</name>
<list>
<item>
<name>Control_L to Command_L (except VI, Terminal, Virtual Machine, RDC)</name>
<identifier>remap.MycontrolL2commandL_extermvm</identifier>
<not>VI, TERMINAL, VIRTUALMACHINE, REMOTEDESKTOPCONNECTION</not>
<autogen>--KeyToKey-- KeyCode::CONTROL_L, KeyCode::COMMAND_L</autogen>
</item>
</list>
</item>
</list>
</item>


HeapSort (C++ Template関数実装)

久しぶりに、プログラミング。
今日はいままで自分で書いたことなかったヒープソート。


#ifndef __HEAPSORT_H__
#define __HEAPSORT_H__

template 
void MaxHeapify( T* target, unsigned int index , unsigned int length) {
	unsigned int l = index<<1;
	unsigned int r = (index<<1)+1;
	unsigned int max = index;
	if( l < length && target[index] < target[l]	){
		max = l;
	}
	if( r < length && target[max] < target[r] ){
		max = r;
	}
	if( index != max ){
		T tmp = target[index];
		target[index] = target[max];
		target[max] = tmp;
		MaxHeapify( target, max, length );	
	}

	return;
}

template 
void BuildMaxHeap( T* target, unsigned int length ){
	for( unsigned int i = (length-1)/2; true ; i-- ){
		MaxHeapify( target, i, length );
		if( 0 == i ){
			break;
		}
	}
}


template 
void HeapSort( T* target, unsigned int length){
	BuildMaxHeap( target , length );
	while(length != 0 ){
		T tmp = target[length-1]; 
		target[length-1] = target[0];
		target[0] = tmp;
		length--;
		MaxHeapify(target, 0, length );
	}
}

#endif



includeしてから次ように使う。


unsigned char buf[] = {5,7,10,8,11};
HeapSort( buf, 5 );
//ここでbuf内はソート済み。

実装時の設計確認

これは個人的なTIPSとして、プログラムを書くときに、詳細設計がきちんとできていて、将来に渡ってメンテナンスしやすいかどうかの判断基準として、気を付けていることのメモ。

二つあって、どちらも同じような目的のために確認している。

1つ目は、後からテストコードを書く場合は、テストコードがどのように実行できるかを想像しながら実装する。すると、テストしたい部分を自然に切り離しながら実装したくなる。自動的にテストしにくい部分がどんどん一か所にまとめられていって、結果として後からいろいろ変更したり、機能追加がしやすくなる。

2つ目は、今追加しようとしている機能をOFFにしようとしたとき、どれくらいの場所を修正しなくてはいけないかを考える。1行コメントアウトするだけでそれができるのがベスト。できなくても、1ファイルの1ブロック(画面内で確認できる範囲)を修正すれば機能をOFFにできればまあ、問題ないレベル。
1ファイルの複数個所、という場合には、まず設計を見直す。OSの仕組みなどにより、どうしてもそうせざる負えない場合には、よくコメントを書いておくなりドキュメントしておくなりしないといけない。
複数ファイルを直さなきゃいけない場合は、1度よく設計を考え直した方がいいかもしれない。もうそれしか方法がないときだけ、コメントを付けて、どことどこに対応関係があるかを書いておく。
複数ファイルの複数個所を直さないと機能をOFFにできないとか、こういう状況になったら、そもそも何かがおかしいと思った方がいい。だいたい1つのファイルに複数の機能が同時に実装されていたり、2つのファイル(モジュール)が互いに依存しあっていたり、機能の定義があいまいだったりするのが原因で、その後その上にいろいろ機能を追加していけばしていくほど、バグは多くなる。

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を設定するのにシリアル端子は必要ないってことだ。

東北太平洋沖地震

被災状況をテレビで見るのが辛い。
親を亡くした子供、目の前で自分の奥さんが流されてしまった人、自分の娘が流されてしまった人、そんな辛い状況がどこにあるだろうか。見ていられないぐらいに悲しい。

今回は、東京にいながら、その恐怖を感じたせいか、その悲しさがものすごく大きい。
今回もある意味では、僕が感じられることは人ごとレベルでしかないのだろう。
結局東京ではその悲惨さはわからないかもしれない。それでも今まで感じたものよりずっと大きな感情的な動きがある。

一人でも多くの人が助かってほしいと思う。


こういうことを目の当たりにすると、僕たちが普段考えている幸せや、生きていく上で大切なことが何なのかということを考えさせられる。
人が、その人の一生を豊かに、幸せに生きていくと言うことと、自分が今毎日の生活の中で行っていることの間に大きな忘れ去られた空間が広がっているのではないだろうかと感じた。
忘れてしまうのだと思う。

家族とともに、いろんな困難を乗り越えて毎日生きていくこと、生きていけること。それが何より重要なことであり、それがすべてなのだと思った。それ以外のことは、おまけみたいなものなんだ。

自宅で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を使えってことらしい。

なんとなく負け

for文を書くときにunsinedの値をカウンタにして、カウンタを減らしながら0まで実行したいことがある。
例えば

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のウィザードが生成するコードに

 // 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行をコメントアウトだけして、ビルドし直したら下の図みたいなウィンドウになっちゃった。
メニュー隠れてるし、右端もおかしいし・・・。
バグな気がするんだけど。

これで悩んで半日使った。でもどうしようもないみたい。

目標

久しぶりに体育館でジャグリングを練習した。
帰りの食事中に、友達に今年の目標はと聞かれ、どうしようかなぁと考えて、ソフトを一個作ることを目標にしようと思った。

最近はまったくソフトウェアを作っていないので、完全に感覚を忘れている。C++の設計の仕方とか、昔は結構でてきたのに、どういう風にすればきれいにいくかすぐに出てこない。

いろんな機能の使いどころを忘れてしまっているんだなぁ。

ということで、MFCを使ってちょっとプログラムを書き始めてみた。VS2010のMFCは僕の知っているMFCよりかなり進化している感じだ。基本は変わらなそうだけど。ユーザインターフェースのサポートがだいぶ追加されている気がする。

UI関係のプログラムは.Netの方が楽ちんだと思っていたけど、まあこれぐらいサポートがあればMFCも悪くないんじゃないかと思う。

ただ、いまさらMFCでプログラム作る理由はないと言えばない。C#とかの方が絶対早いし、バグも少なくてすみそうな気がする。

あるとすればWindows以外でも利用できるモジュールを作成して、他のOSに移植するときにやりやすいとかその程度か。でもMFCで作り始めてしまったので、このまま作り終えようと思う。
feedSubscribe to my feed