Archive

Archive for the ‘コンピューター’ Category

Apache で音楽ストリーミングサーバー

mod_musicindex は音楽ファイルのストリーミングのための Apache モジュールです。

Read more...

Tip, サーバー

.NET の動作しているプラットフォームを取得

.NET Framework が動作するプラットフォームを取得するには System.Environment.OSVersion を取得すれば良いように思います。しかし以下のコードを Mac OS X で動かすと,期待する結果を得られません。

var platform = Environment.OSVersion.Platform;
Console.WriteLine(platform == PlatformID.MacOSX);  // false

実は Mac OS X では platform には PlatformID.Unix になります[a]

苦肉の策ではありますが, UNIX 系 OS に標準で搭載されている uname を用いて OS を調べることができます[b]

var platform = Environment.OSVersion.Platform;
if (platform != PlatformID.Unix)
{
   return platform;
}
using (var uname = new Process())
{
   uname.StartInfo.FileName = "uname";
   uname.StartInfo.Arguments = "-s";
   uname.StartInfo.RedirectStandardOutput = true;
   uname.StartInfo.UseShellExecute = false;
   uname.Start();
   var kernelName = uname.StandardOutput.ReadLine();
   uname.WaitForExit();
   return kernelName == "Darwin" ? PlatformID.MacOSX : PlatformID.Unix;
}

カーネルの名前が Darwin ならば Mac OS X,そうでなければその他の UNIX であるとしています。 PATH が変更されていたら例外が投げられるなどいろいろ問題がありますが,とりあえずうまくいくと思います。

脚注

  1. Bug 515570 - System.Environment.OSVersion.Platform returns wrong result on Mac OS X []
  2. リンク先では -a オプションと書いてありますが, -s オプション (オプションなしと同じ) で十分だとます。 []

Tip, プログラミング ,

C# のジェネリックで Enum/Delegate 制約を使う

C# のジェネリック型制約には大きな制限があります。それは制約する型に System.DelegateSystem.Enum が使えないということです。 F# や Nemerle といった,ジェネリックの制約型に制限がない別の言語を用いるという選択肢も当然考えられますが,可能な限り C# だけで解決したいということもあるかもしれません。

とは言っても C# でできないから困ってるのであって,本当に C# だけで解決するのは難しいです。そこでもう少し低レベルな MSIL を使って解決しましょう。

Read more...

Tip, プログラミング , ,

NemerleUnit で単体テスト

NemerleUnitNUnit を用いた単体テスト用のマクロです。 NemerleUnit を使うと自然言語のように単体テストを記述することが可能になります。

Read more...

プログラミング ,

Nemerle のブロック

整数リストの中に平方数が含まれるか,というお題を Nemerle で 3 通りの方法で書いてみました。

Read more...

プログラミング