- ある開発者の覚書 - ソフトウェア開発者が情報処理に関する雑多な話題をジャンルを問わずに書き留めています.未来の私、私と同類のgeekたちへ

2008-08-27

Smart Pointer Programming Techniques

boost::shared_ptrは日常的によく使いますが,なかなか面白いテクニックがまとめられてました.とくに
「shared_ptr を利用して、スコープを抜ける際にコードを実行する」
のくだり.デストラクタにファンクタを登録する自作のクラスで同様の機能を実現してたのですが,こんな簡易な方法もあるんですね. shared_ptr<void>という発想には行かなかったな,,

2008-08-26

ソースコード HTML化 コンバーター「唐辛子」

前回のソースコードを貼り付ける際に利用させてもらいました.Flash,,,便利ですね.ちょっとしたことで一回だけ利用したい,と言った用途の時にはWebブラウザ上で手軽に利用できることは大きなアドバンテージです.セキュリティ上の理由からローカルにアプリケーションを自由にインストールできないシンクライアント等の環境だとなおさら.iKnow!を愛用してますがこれもFlash.もう長い歴史のある技術ですが,出てきた当時はあまり注目してませんでしたがここまで流行るとは,,,

2008-08-22

weak pointer を bind (続き

昨日,調べろよ!とツッコミが(自分から)入ったので軽く調べてみました.

// test_bindWeakPtr.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <boost/function.hpp>
#include <boost/bind.hpp>

using namespace std;

class CMyClass{
public:
CMyClass(){}
~CMyClass(){
cout<<"destruct:"<<this<<endl;
}
};

void HogeFunc(boost::weak_ptr<CMyClass> weakPtr){
if(weakPtr.lock()){
cout<<"alive:"<<weakPtr.lock().get()<<endl;
}else{
cout<<"dead"<<endl;
}
}

int _tmain(int argc, _TCHAR* argv[])
{
{
boost::function0<void> func1;
{
boost::shared_ptr<CMyClass> ptr1(new CMyClass());
func1 = boost::bind(&HogeFunc, ptr1);
cout<<"end of ptr1:"<<ptr1.get()<<endl;
}
func1();
cout<<"end of func1"<<endl;
}
{
boost::function0<void> func2;
{
boost::shared_ptr<CMyClass> ptr2(new CMyClass());
boost::weak_ptr<CMyClass> wptr(ptr2);
func2 = boost::bind(&HogeFunc, wptr);
cout<<"end of ptr2:"<<ptr2.get()<<endl;
}
func2();
cout<<"end of func2"<<endl;
}


return 0;
}




これを実行するとどうなると思いますか?
こうなります.


end of ptr1:004AC038
alive:004AC038
end of func1
destruct:004AC038
end of ptr2:004AC038
destruct:004AC038
dead
end of func2


つまりfunc1が存在する限りptr1は開放されません.func1にshared_ptrとしてbindされているので.デバッガで追ってみると


func1();


の中へ中へ入っていくとweak_ptrのコンストラクタが呼ばれていて,ファンクタを呼び出す時点でweak_ptrが生成されていることがわかります.

2008-08-21

weak pointer を bind

boost::bind は仕事で日常的に使用しているのですが,引数にboost::weak_ptrをbindするときには注意が必要です.ここ2日ほどはまってました.

void HogeFunc(boost::weak_ptr weakPtr){
}

boost::shared_ptr ptr(new CMyClass());
myFunc = boost::bind(&HogeFunc, ptr);

weak_ptrでバインドしてるから使わなくなったらptrは開放されるはず♪とおもって上記のようにやっちゃだめ!これでもコンパイルは普通に通ってしまうのが落とし穴なのですが,

boost::shared_ptr ptr(new CMyClass());
boost::weak_ptr wptr(ptr);
myFunc = boost::bind(&HogeFunc, wptr);

と明示的にweak_ptrでbindしなければptrはbindされてる限り残ります.なぜ?shared_ptrとしてbindされていてファンクタが呼ばれるときにweak_ptrを生成していると思われます.(しらべろよ!

2008-08-14

コマンドラインからXSL変換結果確認方法

Visual StudioではXSLファイルを開いて「XML」→「XSLT出力を表示」で変換結果を確認することができます.しかしSolution内のファイルならともかく,あるxslファイルの変換結果をちょっと見たいだけというときは結構面倒です.ことにVistaのUACが有効な環境でVisual Studioを管理者権限で実行している場合には,ファイラからD&Dで開くこともできないからストレスです.このぐらいのことならきっとコマンドラインから標準出力に出すツールがあるはすだ!と思って探してみるとありました.しかもMSが普通に配布してたとは,,,知らなかったの私だけ?(^^ゞ

2008-08-13

ヴイエムウェアはごう慢なのか(1/3)

仮想化ソフトウェアの主要なベンダ3社のインタビュー記事です.なかなか面白いのですが私がひとつ引っかかったのはシトリックスの「ヴイエムウェアは顧客の囲い込みで利益を独占している」という批判です.
SHARPのZaurusがLinuxベースに移行してOSや開発環境をオープンにしたことによる成功に代表されるように,近年の流れとして技術をオープンにする戦略のほうが有効な場合も多々あります.Microsoftがオープンソースの世界にかかわり始めているのもその一例です.しかし利益を追求する組織である企業として囲い込みでの利益独占は至極普通の行動であり批判すべきものではないです.もっともこの戦略が長期的に見て有利かどうかは別として.
私はオープンソース支持派です.オープンソースのソフトウェアとは開発者が自分の利益よりは自分のプライドをかけて作るソフトウェアであり,従って利益追求の企業とは違った高品質なソフトウェアが生まれるということが大きなポイントの一つであると思ってます.反オープンソース派の人たちはよくオープンソースの共産主義的な雰囲気が気に入らないといいますが,この記事はそういった批判の格好の標的になりそうで残念です.そこで争わなくてもいいだろー,しとりっくすー!

ブログ アーカイブ