My Daily Programming Life...

自宅で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で作り始めてしまったので、このまま作り終えようと思う。

悩むということ

今日、ある人からちょっとした相談を受けた。マネージメント的な話だったので僕に相談してきたようだ。
彼女は本当に悩んでいるようだった。ただ、いまいちその本質までは掴み取ることができなかった。話はするのだけれど、いまいちどこに問題の核があるのかがはっきりしない感じがした。
その理由の半分は、僕に当たり前のことが彼女にあたり前ではないからとか、そういう差からくること、もう半分は、どこに答えがあるのか彼女自身もよくわからないということ、じゃないかと思った。
(完全な僕の想像なので、僕の頭が悪いだけなのかもしれない。)

やりとりの中で、何となく「どういう風になったら、よいと思う?」と聞いた。まあ、その答えや、その後の結論は置いておいて、この質問が結構いろいろなことを教えてくれる質問なんじゃないかと思った。

僕は悩んでいる。これは確かで、ずっと悩みながら生きている。でも、正直何に悩んでいるのかが分からないのが現実だ。なぜ毎日、何かが足りないと思いながら生きているのか。それが何なのかが分からない。

さて、僕は「どういう風になったらよいと思う?」のだろうか。
「すごいソフトウェアの開発」ができれば幸せか、「グーグルに就職」できれば幸せか、「ノーベル賞をとった」ら幸せか、「日本一周旅行」ができたら幸せか。
なんとなく、こんな風になったらすごいなぁ、なんてぼんやりと考えているものを並べてみても、実はぜんぜんそれで幸せにならないことに気がつく。

一方で僕が悩んでいなかったころのことを思い出すと、この問いにはっきり答えられていた。
高校生の時は「勉強していい大学に入る」ことができれば幸せだったし、大学に入ってからは「ジャグリングが上手くなる」ことができれば幸せだった。だから、その当時僕にこの質問をしていたら、僕は間違いなく、この答えを言っていた。100%これを言っていた。そういうものがあったということだ。

そういう状態の人間は強いと思う。すべてのことに解決の道が見出せるし、そこに向かっていける。

あまり気にしすぎても答えはでそうにないが、「どういう風になりたいのか」という問いから自分を考えていくのもよいと思う。

再帰処理と再帰手続き

「処理と手続きが混同される一つの理由は、ほとんどの一般的な言語(Ada, Pascal, C)の実装がすべての再帰手続きを手続き呼び出しの量だけメモリを消費するように設計されている空である。たとえ、その手続きが原理的に繰り返しであったとしても。その結果、これらの言語はdo,while,forなどの助けを借りてでしか繰り返し手続きを表現できない。」

SICPより(一部省略)。

再帰呼び出しを行う関数が、必ずしも再帰手続きではないということだ。つまり、再帰呼び出しをしても、たくさんのメモリを使わずに済む場合があり、それは繰り返し手続きとなる。

やっぱり、Cとかそういうものでプログラムを学ぶとこういったことに気づくことができない。それがすべてだと思ってしまう。文字列がNULLで終わるものだと思っているという類の、もうちょっとコンピュータの原理に近い部分の話の気がする。
つまりCなどの実装に影響を受けすぎて、それがコンピュータの動作だと思ってしまう。

こういうことを理解しておくことは重要だ。
feedSubscribe to my feed