2008-03-15

Effective C++ 11項

11項 operator=の実装では、自己代入に備えよう

operator=で自己代入が行われたときに、誤ってdeleteしたオブジェクトを参照しないように注意しましょう。

また、例外が発生したときに状態が変わらないか、状態が変わったが整合性の取れた状態であるか、どちらかを維持しましょう。

という話です。

この項も私の今の仕事とは関係のない話でした。

以下広告

Effective C++ 10項

10項 代入演算子は*thisへの参照を戻すようにしよう
コピー代入演算子はつなげて使用できるので、自分のクラスに実装するときもそうしようって事です。
そもそも、私がいまやってる仕事ではコピー代入演算子を自分で実装する事はないので関係ない話。
ちなみにコピー代入演算子をつなげて書く
int x,y,z;
x=y=z=15;
のような書き方も好きではないので、とはいっても他の人は使える物として考えるのが自然なので対応すべきなんでしょうね(^^;)

以下広告

2008-03-10

Effective C++ 9項

9項 コンストラクタやデストラクタ内では決して仮想関数を呼び出さないようにしよう

基底クラス→派生クラスの順で生成され、派生クラス→基底クラスの順に破棄される。

基底クラス部分を生成中・破棄中には基底クラスとして扱われるため、この時点では仮想関数を呼び出しても基底クラスの関数が呼び出される事になります。
これは基底クラス部分の生成中・破棄中には派生クラス部分は不定であるためにこのような仕様になっているらしいのですが、直感的にわかりにくいですし、呼び出している仮想関数が基底クラスでは純粋仮想関数だと実行時エラーになります。

と言う事なのでコンストラクタやデストラクタ内では直接、間接を問わず仮想関数を呼び出さないようにした方がよいでしょう、と言うお話でした。

C++って難しいですね(ーー;)

以下広告

2008-03-08

FeedBurnerに登録してみた

前から「フィード リダイレクト URL の登録」という設定項目が気になっていた。説明を見ると
FeedBurner を使用して投稿したフィードが炎上した場合、またはフィードの処理に別のサービスを使用した場合は、ここに完全なフィード URL を入力してください。Blogger のすべての投稿フィードのトラフィックは、このアドレスにリダイレクトされます。
とある。

よくよくFeedBurnerを調べてみると、「フィードが炎上した場合」ってのは「フィードを焼いている場合」の誤訳っぽいです。
フィードは焼く物なのか?という疑問は残りますが、要するにフィード発行に別のサービスを使用している場合に設定する場所という事です。

そもそも、フィード発行が別のサービスで行える事すら知らなかったわけですが、知ってしまった以上、私もコレを使ってみたいと思います。

Bloggerだけでもフィード発行は出来ているわけですが、FeedBurnerを使うと統計が取れたり広告を入れられたりとか出来る事が増えるそうで…

相変わらずよくわかっていませんがその辺りは使ってから考えようと思います。

さて、検索しているうちにFeedBurner(米国)だけじゃなくFeedBurner(日本)もある事が判明。
暫く調べてみましたが、2006年くらいにはFeedBurner.comとFeedBurner.jpは別会社となっていて、出来る事もFeedBurner.jpの方が少なかったようです。
その後、FeedBurner.comはGoogleに買収され、FeedBurner.jpは…どうなったのか記事は見つけてませんが、利用規約には FeedBurner, Inc. と書いてあったので今は同じ会社なのでしょう。残念ながら出来る事が同じかどうかは不明なまま。
自称技術者のくせに英語が苦手な私はFeedBurner.jpを使う事にしました。

ユーザー登録したら、このブログのURLを登録して、FeedBurnerで使うURLを指定して完了。

後は色々設定してみましたが、どうなんでしょ?うまく設定できているんでしょうか?
ホントはバナー貼ったりしたいんですけどとりあえず今日は登録してみるだけでおしまいです。

Effective C++ 8項

8項 デストラクタから例外を投げないようにしよう

デストラクタが例外を投げると言う事は正しくリソースを解放できないという事になるため、プログラムを続ける事が出来ない深刻な事態と言えます。

なので
  • プログラムをabortなどで中止してしまう(どちらにしても続行不能なので)
  • 例外を伝播させず飲み込んでしまう(続行不能な例外は飲み込んではいけない)
という対応が考えられます。

デストラクタで失敗が予想されるようなリソース解放は保険として書いておくだけで、通常はクライアント側が適切な手順で解放のためのメソッドを呼び出すようにすべき…と言う事でしょうか?

ちなみにデストラクタ内で例外が発生した場合、たとえ例外が発生しても全てのリソースを解放しようとするため、同時に複数の例外がアクティブになる可能性があるそうです。その場合、振る舞いは未定義になるそうです。

今、 私の携わっているお仕事は組込で動的なメモリ管理を行わないように開発しているため、関係ないのかと思ったのですが、それは単にヒープ領域のメモリを(全 体の初期化プロセスでメモリを確保した後は)動的に確保しないと言うだけで、スタック領域ではコンストラクタ、デストラクタが呼び出されるため、ある程度 関係あり、でした。

ヒープ領域で使用するステートフルなクラスとスタック領域で使用するステートレスなクラスは命名規則などで分けておくべきなのかも知れませんね。

2008-03-05

Effective C++ 7項

7項 ポリモーフィズムのための基底クラスには仮想デストラクタを宣言しよう

言われてみれば当たり前なんですが、基底クラスのデストラクタが仮想関数でない場合、基底クラスのポインタで派生クラスをdeleteすると動作が未定義になってしまうそうです。

基底クラス部分だけ破棄されて派生クラス部分は破棄されずにリソース漏れを起こしてしまう事が多いそうな。

C++には派生を防ぐ手段がないため、仮想関数でないデストラクタを持ったクラスの派生クラスを作る事が出来ますが、これはやってはいけない事らしい。

だったらデストラクタが仮想関数じゃないクラスを派生しようとしたらコンパイルエラーにして欲しいよなぁ…

ちなみに全てのクラスのデストラクタを仮想関数にしてよいかと言うと、クラスのメモリサイズが大きくなってしまうので、継承させないつもりのクラスはデストラクタを仮想関数にしないという選択もありなんだそうな。

C++ってやっぱり難しい言語ですね〜

Effective C++ 6項

6項 コンパイラが自動生成する事を望まない関数は、使用を禁止しよう

単純な話で、自動生成される関数は明示的にprivateで宣言して定義を書くなって事です。
こうすればクラスの外部から呼び出されるとコンパイルエラーとなり、クラス内部で使用された場合はリンクエラーになる。

さらに進めて基底クラスにprivate宣言しておいてprivate継承してあげればコンパイル時にエラーが検出できてめでたしめでたしと言うわけです。

まあ、私の今の仕事では使う事がなさそうですけど…

詳しくは本を買って呼んでくださいね^^;

以下広告

Blogger 改行の変換

今頃ですけどBloggerの「設定」→「フォーマット」に「改行の変換」って項目があるのに気づいた。


これを「いいえ」にすると改行が<br />に変換されない。つまり自分で<br />を入れなければならなくなるようです。

こんなことしなくてもWYSIWYGエディタで入れた改行はHTMLでは <br /> + 改行 にしてくれればいいのにと思いました。

HTML編集する人はHTMLに入れた改行を勝手に<br />に変換されたくないよね?普通。

「いいえ」にしたいんだけど過去の投稿も全て直さなきゃ行けなくなってしまうので迷ってます。

2008-03-04

教育用レゴ マインドストームRCX チーム・チャレンジセットが届いた

ETロボコンに参加する事になりました と書きましたが、実は申し込みをしただけで参加できると確定したわけではなかった事が発覚!!
スポンサー料を払ってまで出場はしないらしいので、申し込みが多ければ抽選で落ちる可能性もあるわけです。

さて、そんな不確実な状況ではありますが、参加申し込みと同時にLEGOは注文してしまったため、2008-02-29に届きました。

早速開封


一番上に部品表が


段ボールから出すとこんな感じ。


コースのサンプル


トレイと完成した車体をしまう箱?


部品箱


部品箱の中身。部品ギッシリ確かな満足!


てなわけで、内容物が揃ってるか確認していきます。
本体とUSB赤外線通信機。迷わずわかるのはこれくらい。


とにかく部品が細かいし似た部品も多い。
だんだん、同じ図形を探す知能テストをやってる気分になってくる。
穴の有無や細かい形状の違いをいちいち確認していかなければならない。

そうこうしているうちに

部品表と現物の色が違う(一番下の長いチューブ)


これも色が違う。図では緑だが現物は黄色


しつこいようですが細かく似た形状の部品がたくさんあるので色も重要な要素です。
それが違ってるのは困るんですけど…

さらに続けていると、これは細かい部品に多いのですが、同じ型の部品が複数の袋に別れて入っている事がわかりました。
コレのおかげでさらに確認が面倒に!!

シリコンオイル?でテカテカのタイヤ


溝の形状が部品表と違う。しつこいようですが本当に困るんです。
ちなみに現物の方はバラで入っていた物を組み立てました。


部品表に見あたらない部品


白の輪ゴムは3本のはずだが6本入っていた


棒状のパーツは部品表に数値が併記してあったが、短い順に番号がついているだけで長さを表しているわけではない。紛らわしくて困る。


ギヤです。この頃にはもうかなりクタバってます。


ここまで1時間半くらい。まだまだ細かい部品が大量に残ってます。




2時間以上かけて内容物の確認を行ったのだが、最後になって現物がない部品があった。(真ん中の縁が青くて中が白いブロック)


そして余った部品はコレ




ええ、そうです。
2時間も図形あわせの知能テストやってれば頭も麻痺してきます。


この部品だけ組み立て済みの状態で部品表に載っていたんです。
(他の部品は全部バラの状態で載っていた)

正確には覚えていませんが140分くらいかかったでしょうか?やっと確認が終わりました。


フタ、完全に閉まってないですが細かい事は気にしない!!


とにかく似た形状の部品が多くて識別が大変でした。
部品表と現物の色が違っている部品は結構多かったので全てをメモしなかったけど、ピッキングのために実際の色をメモっとくべきだったと思う。

この大会で使用するLEGOはマインドストームRCXという物らしい。既に古い機種でサポートは2009年末まで。
さて、これをどう組み立てればよいのか?
内容物に設計図らしき物はないし、開発環境のCDなども入っていない。

気がつけば東海地区の事前実施説明会は終わってるし…
と思ったら、2008-02-29に事前実施説明会の資料がダウンロードできるようになってました。

それによると走行体作成用CADモデルが後日配布されるとの事。また、開発実装環境はオープンソースのOS、brickOSLeJOS を使用するとの事。

配布すると書いてあるけど、そこにはオフィシャルサイトへのリンクが張ってあるのみ。
このリンクを以て配布とすると言う事だろうか?

困った事にAPIドキュメントも英語だし、開発環境は自分で作らなきゃいけないんだろうか?
技術教育を2回実施してくれるらしいのでその時にわかるのかもしれないが、東海地区は地区大会の日程が早いのでそれを待ってたら間に合わない気が…

これからが大変そうです。

polipoをインストールする

oamaxa 様からご指摘いただきましたとおり doripo は polipo 内蔵なので doripoを使われる方はこんな事するひつようないです。(2008-04-03 追記)

今、話題になっているwebプロキシ polipo をインストールしてみます。

実はコレのために
MacPortsをインストールする を行ったのです。

インストールはもちろんMacPortsを使って行います。
ターミナルを起動して
sudu port install polipo
と入力するだけ!
後はMacPortsがダウンロードからインストールまでやってくれます。

後はGUIで起動するために dolipo をダウンロードしてApplicationにコピーするだけ。dolipo自体の設定は非常に簡単なのでここには書きません。

1日使ってみましたが、過負荷で死にそうなサーバにアクセスしてるとpolipo君も固まって他のサーバも見れないようになってしまう気がします。

まあ、概ね好調です。

VMwareで物理NICを指定したブリッジ接続を行う方法 訂正版

訂正版 とありますが、 前に書いた方法 で問題ありませんでした。お騒がせして申し訳ないです。

Windows版のGUIツールを見ていたら、vmnet0は「カスタムで割り当てられていないNICの中から自動で選択される」という動きになるように見えたのでVMware Fusionでも同じ事が起きる可能性が高いと思ったのですが、そうはなりませんでした。
なので、この記事自体、不要なのですが、一度は書いてしまった物ですから、ブリッジ先の自動選択をしない場合の記事に書き直してみます。

ちなみにWindows版では懸念していたような不都合が起きるのか?と言うと、確認していません

…技術者としてあってはならない軽率さ、ですねorz

では、気を取り直して…

VMware Fusionをインストール時にはネットワーク設定は

vmnet0 : ブリッジ接続(NIC自動選択)
vmnet1 : ホストオンリー
vmnet8 : NAT接続

のようになっていますが、これを

vmnet0 : ブリッジ接続(無線LAN接続 or 有線LAN接続)

とvmnet0を無線LAN固定接続または有線LAN固定接続に変更しようと思います。
私の場合、AirMacを汎用的に使っているのでvmnet0を無線LANにしてみます。

まず、/Library/Application Support/VMware Fusion/boot.shを編集します
root権限が必要なため、ターミナルを起動してviで編集します。
viの使い方はこの辺りを参考にどうぞ
テキストエディットで編集できれば楽なのですが、やり方を知らないので
$ sudo vi /Library/Application¥ Support/VMware¥ Fusion/boot.sh

起動したらこの部分を
# vmnet-bridge puts itself in background (daemon mode)
# Bridge to host network interface 'en0'.
#"$LIBDIR/vmnet-bridge" -d /var/run/vmnet-bridge-vmnet0.pid vmnet0 en0
# Bridge to the primary host network interface (which can change over time).
"$LIBDIR/vmnet-bridge" -d /var/run/vmnet-bridge-vmnet0.pid vmnet0 ''
;;

こうします
# vmnet-bridge puts itself in background (daemon mode)
# Bridge to host network interface 'en0'.
#"$LIBDIR/vmnet-bridge" -d /var/run/vmnet-bridge-vmnet0.pid vmnet0 en0
# Bridge to the primary host network interface (which can change over time).
"$LIBDIR/vmnet-bridge" -d /var/run/vmnet-bridge-vmnet0.pid vmnet0 en1
;;

以上!!

有線LAN固定にしたい人はen1をen0に置き換えてください。

2008-03-03

MacPortsをインストールする

2008-03-07 パスを通す作業がターミナルからコマンド入力と誤って記述されていたため、設定ファイルに書き込むように修正しました。

MacPortsとは何か?
詳しいサイトがいくつもあるのでここでは書きません。
参考にしたサイトのリンクを置いておくのでそちらを見てください。
MacPortsを使用するには。
まず、Mac OS X の追加機能 XCode Tools を入れる必要があるようです。

いつものように他力本願で他のサイトを見てみるとLeopardではXcode Toolsは標準でインストールすればよいらしいです。

Mac OS X Leopard のDVDを入れて


Optional Installs を開きます。


で、Xcode Tools を開きます。


XcodeTools.mpkg を開くとインストーラが起動するので標準インストールします。
(Tiger以前ではカスタマイズしなければならなかったようです)


インストールできたら一つ戻って


Optional Installs.mpkg を開きます。
インストーラが起動するので


X11 を選択してインストールします。
(MacPortsのためにX11をインストールする必要はないらしいが、よくわからなかったので入れちゃいました)

ここからがやっとMacPortsのインストールになります。
まず、MacPortsのサイトからdmgファイルをダウンロードして開きます。
インストーラがになっているので導入は簡単です。


特に難しい事はないのでインストールの詳細は省略します。(ずいぶん時間がかかったので固まったのかと思いましたが大丈夫でした。)

インストールしたらパスを通しておきます。
ターミナルを開いてviエディタ等で ~/.bash_profile に以下の2行を追加します。
export PATH=/opt/local/bin:/opt/local/sbin/:$PATH
export MANPATH=/opt/local/man:$MANPATH

それが終わったらMacPortsのアップデートをしておきます。
やはりターミナルから実行します。
$ sudo port -d selfupdate
$ sudo port -d sync

以上でMacPortsのインストールは完了です。

今回MacPortsを導入したのは polipoをインストールする ためでした。

Bloggerでテーブルを使う

普通にタグを使ってテーブルが書けますが…
タグの間で入れた改行が全てテーブルの前に入ってしまうので、見た目酷い事になります。
HTMLが見にくくなりますが改行は除いて書かなくてはなりません。