モバイル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レコーダーとかないんですよねぇ~。う~ん・・・。

32ー138339

この番号の紙が2億円だそうですよ(^^;

宝くじは今まで一回しか買わなかったけど(それもグループ買いに参加しただけ)、うちのオヤジは、毎年、どこぞの「大当たりが連発している」らしい売り場で買い続けていますが、大喜びしているオヤジの姿は一度としてありません。

しかし、外は寒いですね~。雪が降ってもおかしくないような天気です。

2010年、しばらくは新しい写真が撮れないので、ほとんど何にもしてこなかったカメラの掃除をして・・・といっても、ブロアーでシューシューしてボディを拭いただけなんですが・・・バッテリーも半分ほど充電して保管。レンズも埃をチョチョッと拭いて・・・あんまり意味ないけど・・・箱にしまいました。

掃除もチョコチョコッと済まし、年越しは万全です(^^;;;
年越しソバを食えないのは悔いが残るが、また体調が良くなったら馬鹿食いしてやろう。