Markdown展開

2012年2月23日木曜日

Nullless型

Scalaやらの関数型言語にはOptionという「値が入ってるか入っていないかはっきりしない」というすんばらしいジェネリッククラスがあります。

C++なんかにもBoostライブラリにOptionalの実装があったりします。
(C#にも一応Nullableという型がありますが、これはstructにnullを入れるようにするだけの機能しかありません。)


近代的なプログラミングだとこれらとNullクラスパターンでnullポインタと無効値をキッチリ切り分けることが出来るわけです。





ところが実務だとそんなことお構いなしで
ガンガンnull値を返してnullチェックを強要するわ、明らかにnullを返さないパスだろうが「nullチェックを入れろ」とか言ってくるわけです。嘆かわしい限りですね。


そこで、そんなら参照型でも絶対にnullが入ってないことを保証することは出来ないもんか、という発想に至ります。


こんな感じで。
// null禁止型
class Nullless<T>
{
  public T Instance { get; private set; }

  // 引数なしコンストラクタは持たない(初期化時に必ずインスタンスがセットされる)
  public Nullless(T instance)
  {
    if (instance == null)
      // nullを入れようとするとexception
      throw new ArgumentNullException();
    Instance = instance;
  }

  // 他にcastとかも定義する
}


これをこんな感じで使います。

//生のクラスをそのまま突っ込める
Nullless<Hoge> hoge1 = new Hoge();

// nullを挿したらException
Nullless<Hoge> hoge2 = null; <-- ArgumentNullException

//挿し替えはOK
hoge2 = new Hoge();

// メソッドはInstanceプロパティを介して
hoge.Instance.method();


で、Nullableのごとく

//生のクラスをそのまま突っ込める
Hoge! hoge1 = new Hoge();

// nullを挿したらException
Hoge! hoge2 = null; <-- ArgumentNullException

//挿し替えはOK
hoge2 = new Hoge();

// そのままメソッド叩けたら素敵
hoge.method();


こんな感じで使えたら素敵かなと。


自分で使った事無いので実用性は実際のところわからないですけどね。


以上、思うことを適当に書き綴りました。

2012年2月1日水曜日

SCFH DSFのパッチ内容

先日SCFH DSFへコミットした修正の内容をまとめます。



SCFH DSFはmosamosa氏が作成した、peercastやニコニコ動画などのストリーミング配信において有用なツールです。

オリジナル版のサイトはこちら(SCFH DSFは旧コンテンツにあります)

3N




SCFH DSFは非常に使いやすくて便利なツールですが、最近の環境では幾つか問題がありました。


 一つはvista以降の環境だとハードウェアによる拡大縮小ができない点、

もう一つは特定の環境で音声が乱れる・取り込みが停止する点です。




暫くソースコードを舐め回した結果、修正どころがわかってきました。



一つ目はvista以降から画面周りの扱いが変わったことから起きたと思われるものです。
これはサーフェスのバッファの取り方を変えたら何故か動くようになりました。

二つ目はCPUの動作周波数が変わる環境で、(バグか仕様かはわかりませんが)タイマがずれてしまうことによるものです。
これはタイマをずれないものに差し替えました。


#ちなみに環境依存の問題なのでpullリクエストは出していません。



以下に該当する方は元のファイルを差し替えて使ってみてください。


OSがvista/7の方

エンコード中に音がずれる、映像と音が合わない、音が消える、映像が止まる等が起きる方




ダウンロード
(ページ右上の元のファイルをダウンロードをクリックしてください)



使い方

1. ダウンロードしたアーカイブをSCFH DSFのフォルダに解凍します

2. エンコーダとSCFH DSFを起動します。

3. SCFH DSFのウィンドウの、スレッド数を1にして、縮小方法をNearest(DirectDraw 1pass扱いになります)、またはBilinear(DirectDraw 2pass扱いになります)を選択します。


ソースはこちら
progre/SCFH DSF - github


以上。