圏外

入院日の連絡が未だ来ず・・・2月にずれ込むのはイヤだなぁ・・・。

毎年、この時期になると、テレビでは震災関連の番組が集中します。一応、神戸の端っこで生まれて神戸の端っこで生きてきたんですが、阪神大震災が起こった時は、某地方大学に通っていて神戸を離れていて、震災を経験していないから、震災に関して特に思い入れがありません。経験している、していない、で、人間はかなり温度差があると、人と震災関連の話をしていると、強く感じます。

で、そんなことはともかく。

WiMAXルータ、来ました。
買いに出かけようと思ってましたが最近の厳冬で体調が悪く、出かける体力がなくなっていたので(ーー;;、アマゾンで購入。。。早いですね、注文確定クリックして二日で到着。

ドライバやユーティリティーのインストールは、USBで接続すると仮想CDドライブが現れてその中のファイルを実行すれば終了と、付属のCD-ROMディスクは使用する必要なし。最近は便利ですね~(^^

インストールと無線LAN環境の設定を終わって、あとはWiMAXに接続して、オンラインで契約するだけ・・・なんですが・・・あいにく家は圏外なので、また近くの駅まで行って(笑)、サインアップしたいと思います・・・(ーー;;

ちなみに僕の住んでいる住所付近は、2010年3月末までにエリア拡大予定になっていますが・・・どうなんでしょうかねぇ・・・。

モバイルWiMAXルータ

出かけているときに、ノートPCをネットに繋ぎたいときはこれまでYahooの無線LANか、ドコモの500円・1日使い放題の無線LANを利用してましたが、無線LANスポットがない場合は、非常に不便で、一時期携帯をデータ通信用のプランに変更しようかと真剣に悩んでいましたが、これが結構な値段がするので躊躇してました。

で、最近になって、WiMAXの利用エリアが神戸でも段々広がってきてまして・・・料金プランも月額400円ほどから使えるので、試しに契約を・・・・と思ったはいいんだけど・・・通信機器が高い・・・。

僕が欲しいのはNECのAtermWM3300Rってやつで、無線LANが内蔵されているルータタイプのやつ。ちょっと探しに出かけましたが・・・あいにく在庫なし。やっぱ大阪まで出ないといけないかな・・・。このルータタイプのやつだと、iPod Touchも無線LAN経由で外出中も使えるようになります。非iPhoneユーザーにとって、朗報です(^^;;;

wm3300r

入院日がまだ決まってないんだけど、入院までに手に入ればいいんだけど・・・。

2010年1月1日施行

著作権法の改正で、いわゆる、違法コピーモノのダウンロード違法化が施行されています。

大昔はWarezやらワレモノと呼ばれていたソフトウェアの違法コピーもの、映像・音楽ソフトの海賊版など、昔はそれなりに、あくまで、「コソコソやってる感」がプンプンしてましたが、良くも悪くもブロードバンドネットワークが普及して、今や、モバイル環境ですら、それら違法コピーもののダウンロードがほんの数十分で完了するという、ビックリな現実です。

どこまでが、違法で、どこまでが合法なのか? そういう線引きは、いろいろなサイトで解説されていますが、結局のところ、世間一般では、どうすれば、違法を回避できるのか、ということに終始するのがオチだと思う。

美味しい味に慣れてしまった人に、今更、それをやめろ、というのがいかに無意味なものかを確認するだけじゃなかろうか・・・?

いっそのこと、ネットワークプロバイダ事業者から高率のコピー税(笑)を徴収すればちょっとはプロバイダ側もそれなりの対策するんでないかい???

メンバー関数をスレッド関数に

スレッドを起こす古いプログラムをC++化しようとして、ちょっと躓いてしまいました。備忘録のメモです。

Windowsで、スレッドを起こすAPIは CreateThread、もしくは通常はCRTライブラリの_beginthreadexを利用しますが・・・、これらのAPIに渡す、スレッド関数(スレッドの開始アドレス)の呼び出し規約は、__cdeclもしくは__stdcallです。要はグローバル関数(自由関数)なわけですが、C++化する上で、できるだけグローバル関数を減らしたいと思いました。

プログラム自体をC++化する上で、単純にクラス内に静的な(staticな)メンバを追加してこれをスレッド関数にして、新しいスレッドに渡すパラメータにオブジェクトのインスタンスポインタを渡せば、最小の変更でうまく行きます。

が、もっと簡単に、、オブジェクト・インスタンスのメンバ関数をスレッド関数にしたい場合は、ちょっと工夫がいるようです。
というわけで、上記のようなプロキシ的な静的メンバ関数を設置して、インスタンスメンバー関数をスレッドに渡すようにしたコードを書いてみました。

/*
  SimpleThreading.hpp
  簡単なスレッドクラスです。継承させて使用します。
 
  追記(2010/4/10):致命的な欠陥があるので実際には使わないように。参考程度に見てください。
       メンバー関数ポインタとパラメータを CSimpleThreadingのメンバ変数にいったん保存して
       スレッド関数(ThreadStartProxyから参照している部分がスレッドアウトになってます(笑)
	
  class CMyObject : public CSimpleThreading<CMyObject>
   {
	   ...
   };
*/
#include <windows.h>
#include <process.h>

template<typename T>
class CSimpleThreading
{
  typedef UINT_PTR (T::*MEM_FUN)(LPVOID);

  LPVOID m_pvParameter;
  MEM_FUN m_ThreadStart;

  static UINT_PTR __stdcall ThreadStartProxy(LPVOID pvSimpleThreading)
    {
      CSimpleThreading *pSimpleThreading = (CSimpleThreading*)pvSimpleThreading;

     //修正しました。(10/4/16)
      return ((T*)pSimpleThreading->*(pSimpleThreading->m_ThreadStart))(pSimpleThreading->m_pvParameter);
    }

protected:
  //引数:メンバ関数ポインタ、スレッド処理に渡すパラメータ、サスペンド
  HANDLE BeginThreadEx(MEM_FUN ThreadStart,LPVOID pvParam,BOOL bSuspended = FALSE)
    {
      if(!ThreadStart)
        return NULL;

      m_pvParameter = pvParam;
      m_ThreadStart = ThreadStart;

      return (HANDLE)_beginthreadex(NULL,
                                    0,
                                    CSimpleThreading::ThreadStartProxy,
                                    (LPVOID)this,
                                    bSuspended ? CREATE_SUSPENDED : 0,
                                    NULL);
    }
};

このコードの要旨は、静的メンバ関数を_beginthreadex()APIに渡し、その中で実際にスレッドに処理させたいメンバー関数をコールする、というごく一般的なものです。
CSimpleThread::BeginThreadExで、メンバ関数ポインタとパラメータをプロパティとして保存しています。あとは、静的メンバー関数内で、そのメンバー関数ポインタをパラメータを引数としてコールしています。
メンバー関数ポインタをコールするには、どのインスタンスのメンバー関数をコールするのか、といった情報が必要なので、必ずpObject->*や、Object.*といったものが必要です。メンバー関数内でコールする場合も、this->*は省略できないようです。

実際には、上記クラスを継承させて使用します。

/*
  ThreadTest.cpp
  使用例
*/
#include "SimpleThreading.hpp"

class CMain : public CSimpleThreading<CMain>
{
public:
  
  UINT_PTR ThreadStart(LPVOID pvParam)
    {
      //スレッド処理...
      return 0;
    }
  
	DWORD Run()
    {
      DWORD dwWait = 0;
      HANDLE hThread = BeginThreadEx(&CMain::ThreadStart,NULL);

      if(hThread == NULL)
        return 0;

      return WaitForSingleObject(hThread,INFINITE);
    }
};

実際にはプロキシ的に静的メンバ関数をかましているので、メンバー関数をスレッド関数にしているわけではありませんが、ちょこっとしたプログラムにはこれで十分です(^^

日常になった三が日

正月だからといって、特にすることもなく、普通の日常です。気晴らしになんか衝動買いしてこようかな(^^;;;

年々、年末~正月のテレビ番組がつまんなくなって、今年はとうとう大晦日はテレビを1分もつけず。新聞のテレビ欄を見ても、面白そうな番組もなく・・・ヤフーのテレビ番組表の中から明日以降、面白そうな番組を探してましたら、一つ見つけました。

NHKの「星新一ショートショート 新春スペシャル」

星新一のショートショートは高校のときちょっとだけ、はまってました(^^;読みやすいんですよね。

たまにNHKで映像化したものが放送されていますが・・・今回のショートショート・スペシャルは、新作だそうで、楽しみです。ああ、録画したいけど、我が家にビデオ・・・違った、録画できる、HDDレコーダーとかBDレコーダーとかないんですよねぇ~。う~ん・・・。