Hatena::Diary

ryutorionの日記

2010-01-23 C++ テンプレート 完全ガイド

2月10日,翔泳社よりC++ テンプレート 完全ガイド (David Vandevoorde and Nicolai M. Josuttis 著)が発売される.言語の機能としてのテンプレートの特徴を深く解説しているだけでなく,テンプレートを用いたテクニックに関する多数の解説も含まれており,標準ライブラリの解説ではなくテンプレートそのものに関して知りたいという人には最適の本だと思う.原著を持っているが,人に勧める場合に英語の本をいきなり渡してもアレなので,訳書を買っておいても良いなぁ,と思っている時点で確実に発売日に本屋に向かう自分の姿が想像出来る.

επιστημηさん,高橋 晶さんのC++テンプレートテクニック(ソフトバンククリエイティブ)と合わせて,C++プログラミングする場合は持っておきたい本だと思う.

2010-01-13 最近出逢ったバグ

バグとの出会いは一期一会.その出会いを大切に・・・したくないなぁ.

何となく原因は分かるけれど,確信が持てないバグをメモ.言語はC++

vector<vector<int> > buf;
buf.push_back(vector<int>());
vector<int> & tmp = buf.back();

for(int i = 0; i < 適当な数; ++i){
    buf.push_back(vector<int>());
    buf.back().push_back(1);
}
tmp.push_back(2); // セグメンテーションフォールト

とりあえず,適当に簡略化しているので,実際に起こる保証はないけれど,gcc 4で問題が発生.何となくの予想としては,vectorにデータを追加している間にメモリが足りなくなって拡張する際にアドレスが移動して,リファレンスがそれをちゃんと追ってないために起こっているんじゃないか,と.まぁ,仕方ないので,解決策としてはインデックスを取得して,tmpへのアクセスインデックスを利用することに.今度リファレンスアセンブリにどう落とされているのか確認しておくか.多分アドレスだろうけど.

2009-11-29 探しているときには見つからず,ふとしたときに見つける

気づけば半年以上放置していた.ずぼらな性格だと長続きしない.

まぁ,それはいいとして,探しているときには見つからなくて,ふとしたときに見つけることってよくあることだな,と思うことが.

C言語でsprintf()とかを使うときに,バッファオーバーフローが気になるわけで,なんとか解決してくれるライブラリとか無いかな,と探していたけれど,見つからないので結局自分で stdarg.h を使って可変長引数を処理して,とやったわけだけれど,別件で調べものをしていたら,GNU C library に asprintf() なる関数を発見した.

この関数,必要なサイズのメモリを確保した上で sprintf() ができるという素晴らしい機能があるらしい.更に周りを調べると,どうもGNU C libraryのprintf()やscanf()には色々と便利そうな拡張が.更には,%s のような変換指定子を追加登録する機能まであるようで.しかし,可搬性の方はどうなんだろう.MacやWindowsでも移植されていて利用できるのかなぁ.その辺また調べておこう.

2009-05-16 C/C++は適切か?

気づけばかなりの期間放置していたことに.

./JにCとC++は似たようなモノか?という,ちょっと面白い記事があったので,思ったことを書いておこうと思った.

自分がプログラミング言語を分類するとすれば,まず手続き型か関数型か,で分ける.その中で更に分けるとすれば,オブジェクト指向をサポートするかどうかで分ける.これに基づいて自分の知っている言語を分類すると次のようになる.

  • 手続き型
    • オブジェクト指向をサポートしない
      • C
    • オブジェクト指向をサポートする
      • Perl, Ruby, Python, Java, C#
    • 別枠
  • 関数型
    • lisp, haskell, caml

これは,ソフトウェアを設計する際の思考が違ってくるだろうな,と思った部分で言語を分けているつもり.

まず,手続き型と関数型を分けるっていうのは,特に異論が出ないところだろうな,と思ってみる.確実に発想が違ってくると思うので.で,次にたまにプログラミング言語を手続き型/関数型/オブジェクト指向型と3つに分けている場合があるけど,手続き型の言語にも関数型の言語にもオブジェクト指向のサポートというのはあって,言語の一番大きな分類に入れるってのはおかしいと思っている.そもそもオブジェクト指向ってのはソフトウェアの設計のための考え方だと考えていて,オブジェクト指向言語と言われるのは,オブジェクト指向の設計を実装しやすい言語,が正しいと思っているので.例えば,Cで継承は無理だと思うけど,多態性とかカプセル化とかはまぁやってできないことは無いと思う.ただ,それって無駄に労力が増えるし,保守もしづらくなるだろうから,CはCにあった設計をすべきだと思う.一方,オブジェクト指向をサポートする言語なら,そういった多態性を上手く利用することで,再利用がしやすく,かつ保守性も高いものが作れると思うので,オブジェクト指向的に設計をすべきだと思う.で,オブジェクト指向的に設計ができれば,後はそれをどう言語にマッピングするかで,言語の得意分野,不得意分野でマッピングが楽な部分,大変な部分ってあったりすると思うけど,設計自体は大きく変わらないんじゃないかなぁ,と思う.で,C++に関しては,テンプレートを利用して手続き型なんだけど,それっぽくない書き方までサポートしてたり,と色々と発展しているので,別枠に括ったほうがいいと思った.

何かまとまりがついてない気がするけど,まぁいいか.

2009-03-29 VMWare Server 2 on Windows

ちょっとした理由からVMWare PlayerからVMWare Serverに移行してみようと思い,インストール,いきなり躓いた.

インストールするとデスクトップに作られるショートカットをクリック.ページが表示されません.何だよ,これ,

と思って調べていると,同様に挫折し,かつ解決策を見つけている人がいました.

最近は,こうやって似たような問題にぶつかった人がブログにメモをしておいてくれるおかげで,

調べ物も大変楽になってありがたいですね.その分他の問題に取り組めます.感謝感謝.

とりあえず,必要なサービスが起動していないようなので,services.mscを起動してサービスを

チェックしたところ,同じくVMWare Host Agentが動作していなかったので起動.するとアクセス

できるようになったけれど,今度は証明書を受け付けてくれない.

これについては,ここを参照.

次は,Firefoxのオプションから証明書の例外を追加する.詳細の暗号化から証明書のサーバ証明書を

選んで,例外を追加しておく.証明書は

C:\Documents and Settings\All Users\Application Data\VMware\VMware Server\SSL

という場所にあった.どうも自分で自分のことを証明している形になっているところに

問題がある様子.

とりあえず,これで起動できるところまでは来たけれど,OSインストールするところまでは,

何だか眠くなってきたので後日に回そう.