カリー化の LINQ への応用 (C#)

カリー化の実用について考えてみたいと思います。

まずは、C# でカリー化を表す関数を、拡張メソッドを使って以下のように実装していきます。
カリー化のほか、非カリー化および部分適用のための関数も実装しておきます。
引数の数ごとにメソッドを定義しなければなりませんが、ここではとりあえず T3 までにしておきます。


public static class FunctionHelper
{
    // カリー化
    public static Func<T1, Func<T2, TResult>> Curry<T1, T2, TResult>(this Func<T1, T2, TResult> func)
    {
        return p1 => p2 => func(p1, p2);
    }

    public static Func<T1, Func<T2, T3, TResult>> Curry<T1, T2, T3, TResult>(this Func<T1, T2, T3, TResult> func)
    {
        return p1 => (p2, p3) => func(p1, p2, p3);
    }

    // 非カリー化
    public static Func<T1, T2, TResult> Uncurry<T1, T2, TResult>(this Func<T1, Func<T2, TResult>> func)
    {
        return (p1, p2) => func(p1)(p2);
    }

    public static Func<T1, T2, T3, TResult> Uncurry<T1, T2, T3, TResult>(this Func<T1, Func<T2, T3, TResult>> func)
    {
        return (p1, p2, p3) => func(p1)(p2, p3);
    }

    // 部分適用
    public static Func<T2, TResult> Partial<T1, T2, TResult>(this Func<T1, T2, TResult> func, T1 arg1)
    {
        return func.Curry()(arg1);
    }

    public static Func<T2, T3, TResult> Partial<T1, T2, T3, TResult>(this Func<T1, T2, T3, TResult> func, T1 arg1)
    {
        return func.Curry()(arg1);
    }
}


 

さて、次のようなコレクション操作をしたいと思います。

  • 奇数の二乗を先頭から 10 個取得する
  • 処理結果は文字列として比較したときの順序で並べる
  • 処理結果は整数の配列型とする

期待結果は [1, 121, 169, 225, 25, 289, 361, 49, 81, 9] という配列ですが、LINQ to Objects で次のように書けます。


static void Main()
{
    var result = Enumerable.Range(1, int.MaxValue)
        .Where(i => i % 2 == 1)
        .Select(i => i * i)
        .Take(10)
        .OrderBy(Convert.ToString)
        .ToArray();
}


 

もしこの他に、「偶数」「3 で割り切れる」のようなロジックをどこかで実装しなければならないとしたらどうでしょう。

今回はラムダ式で書けてしまう程度の単純な例なのであまり利点が感じられないようにも見えますが、
関数自体をパラメーター化することで関心事を分離できます。
つまり、関数の本質に相当する部分 (上の例では、「余りが等しい」のみを表す部分) をグローバルに用意しておき、
パラメーターを与えることで具体的に必要な関数を作成する方法が考えられます。

部分適用関数 (Partial メソッド) を利用すれば、次のように実装できます。


/// <summary>指定された剰余を持つかどうかを判定します。</summary>
static readonly Func<int, int, int, bool> Mod = (remainder, divider, value) => value % divider == remainder;
/// <summary>累乗を求めます。</summary>
static readonly Func<int, int, int> Power = (index, value) => (int)Math.Pow(value, index);

static void Main()
{
    var result = Enumerable.Range(1, int.MaxValue)
        .Where(Mod.Partial(1).Partial(2))
        .Select(Power.Partial(2))
        .Take(10)
        .OrderBy(Convert.ToString)
        .ToArray();
}


このように、LINQ to Objects のメソッドの引数に渡す関数を作成する手段として、カリー化を応用できます。

バージョン情報
C# 3.0 以降
.NET Framework 3.5 以降

参照
カリー化 – Wikipedia
C#でカリー化
C#でカリー化と部分適用

広告

Surface Pro で外部キーボードが英語配列として認識される

Microsoft の Sculpt Mobile Keyboard は、他の Windows 7 PC や iPad mini ではとくに問題なく使えていたのですが、
Surface Pro に接続してみると英語配列として認識されてしまいました。
例えば、@ キーを押すと [ が入力されます。

この問題については KB が出ていました: Windows 8 でキーボードが英語配列キーボードとして認識される

ここに記述されている「方法 1」を試してみました。

(1) デバイス マネージャーを起動して [キーボード] を展開し、
     該当する HID キーボード デバイスのプロパティを開きます ([場所] に「Bluetooth HID デバイス」と表示されているデバイス)。

(2) [ドライバーの更新] をクリックして、
     以降は KB に記述されている通り進んで [日本語 PS/2 キーボード (106/109 キー)] を選択して、ドライバーを更新します。

すると更新に失敗してしまったため、[ドライバーを元に戻す] をクリックして再起動したところ、
なぜか解決して日本語配列として入力できるようになりました。
「Bluetooth HID デバイス」と表示されていた部分が「キーボードポートに接続されています」に変わっています。

HID キーボード デバイスのプロパティ

 

バージョン情報
Surface Pro 128GB (日本版)
Windows 8 Pro

参照
Windows 8 でキーボードが英語配列キーボードとして認識される
コンピューターに USB キーボードを接続したときに Windows で正しいキーボード レイアウトが使用されないことがある
Microsoft Surface Pro
Microsoft Sculpt Mobile Keyboard
Surface Pro で開発環境のセットアップ

マイクロソフト Sculpt Mobile Keyboard
マイクロソフト Sculpt Mobile Keyboard

Surface Pro で開発環境のセットアップ

日本版の Surface Pro に開発環境 (主に .NET) をセットアップしました。 
Windows 8 を新規インストールした場合との違いは、
Office 2013 が最初からインストール済みであることくらいでしょうか。

以下は、そのときの簡易的なメモです。

■ OS セットアップ時

コンピューター名
Wi-Fi 接続
アカウント
    Microsoft アカウントでログインします。
    個人設定の同期もここでできます。 (8.1 用に追記)

■ 基本設定

BitLocker
Windows エクスペリエンス インデックス計測
Windows Update 設定・実行
Windows Defender クイック スキャン
Windows ストア アプリ更新
ファイアウォール (HTTP, HTTPS の許可)
外部キーボード・マウス

■ 個人設定

アカウントの画像
ピクチャ パスワード
フォルダー オプション
タスク バー、タスク マネージャー
電源オプション 
    初期設定では画面がかなり明るいため、明るさを落としました。
セカンド スクリーン、ディスプレイの拡大率
デスクトップ (背景、色、サウンド、スクリーン セーバー)
IME ユーザー辞書ツール
スタート画面 (主に 8.1)

■ 基本アプリケーション

Google Chrome
Mozilla Firefox
Adobe Reader
Dropbox

■ 開発用アプリケーション

Web Platform Installer 4.5
Internet Information Services 8
    Web Platform Installer で [IIS の推奨される構成] を実施したところ途中で失敗したため、
    [Windows の機能の有効化または無効化] から再実施しました。
    .NET Framework は、この時点で有効化されます。 

Office Home and Business 2013 (x86)
    最初からインストールされています。
    Office アプリケーションのうちいずれかを起動し、同梱されていたプロダクト キーを入力します。
    ここで SkyDrive も設定されます。
    Dr.シンプラー 2013 の無償版 (Lite) はまだのようです。
Project Professional 2013 (x86)
Windows Live Essentials

SQL Server 2012 R2 Express SP1 (x64)
    データベース エンジンのみインストールします。
SQL Server 2012 R2 Developer SP1 (x64)
    クライアント ツールのみインストールします。
    SQL Server Profiler をインストールするために Developer エディションを利用しています。

Visual Studio 2012 Ultimate (x86)
Visual Studio 2012 更新プログラム (KB2781514)
Visual Studio 2012 Update 2
Visual Studio Team Foundation Server 2012 Power Tools
Windows Phone SDK 8.0
    インストール後、ネットワークに接続できなくなりました。
    ここで構成される仮想ネットワークが原因のようです。
    Hyper-V マネージャーでそれらの仮想スイッチを削除することで、ネットワーク環境を元に戻しました。
    そのため、Windows Phone 8 の仮想マシンは作成できていません。
WebMatrix 3
    Web Platform Installer でインストールします。

Windows エクスペリエンス インデックスの計測結果を載せておきます。
MacBook Air (Mid 2013) の最小構成での計測結果にかなり近いです。

Windows エクスペリエンス インデックス

 

バージョン情報
Surface Pro 128GB (日本版)
Windows 8 Pro

参照
Microsoft Surface Pro
Surface Pro で外部キーボードが英語配列として認識される

カテゴリー: ツール, OS. タグ: , . 2 Comments »

MacBook Air (Mid 2013) で Boot Camp を利用する

MacBook Air (Mid 2013) で Boot Camp を利用して、Windows 8 をインストールしました。

基本的には、Boot Camp アシスタントで表示される通り、

(1) Windows 7 またはそれ以降のバージョンのインストールディスクを作成
(2) 最新の Windows サポートソフトウェアを Apple からダウンロード
(3) Windows 7 またはそれ以降のバージョンをインストール

にチェックを付けたまま進めていけば完了します。
これら 3 つの手順は個別に実行してもかまいません。

ですがやはり、Boot Camp 設定の概要を事前に読んでおくことをお奨めします (Boot Camp – インストールと設定ガイドより丁寧?)。
それでもなお初心者にはわかりづらいかなと思った点を以下に記述しておきます。

 

準備

  • Windows 8 (64bit) のインストーラーの ISO ファイルを MacBook Air に保存しておく
        保存する場所はどこでもかまいません。
        アップグレード版は利用できません。
  • 8GB 以上の USB メモリを 1 つ
        Boot Camp アシスタントが、手順 (1) で Windows のインストーラーを、
        手順 (2) で Windows サポートソフトウェア (約 500MB) を格納します。
        フォーマットされてしまうため、新規のもの、またはデータが消去されてもよいものを用意します。

Windows サポートソフトウェアのダウンロード

私は手順 (2) のダウンロードが完了しなかったため、(1)→(3)→(2) の順番で実行することになりました。
経験上、Apple に限らず米国などのサイトにアクセスする場合、23 時以降は非常に時間がかかる気がします。

Windows サポートソフトウェアのインストール

Windows サポートソフトウェアは Windows 上で動作するソフトウェアであり、
インストールは自分で実施しなければなりません。
Windows のインストールが完了したら、USB メモリ (WININSTALL) の中の BootCamp\setup.exe を実行します。

Windows サポートソフトウェア

 

Boot Camp Support Software とは?

「Windows サポートソフトウェア」と「Boot Camp Support Software」は同一のものを指しますが、
Boot Camp Support Software 5.0.5033 を自分でダウンロードしても、インストーラーが正しく動作しないようです。
Boot Camp アシスタントの手順 (2) に任せるのがよいでしょう。

Windows 用のパーティションの作成とフォーマット

Windows のインストール時にパーティションをフォーマットする必要があります。
ちなみに私は Boot Camp アシスタント上で [均等に分割] を選択して 60GB としたところ、
Windows のインストール時のパーティションには 56.0GB と表示されました。

MacOS と Windows の切り替え

Windows のインストール後、MacOS と Windows の切り替え方法を知らないと永久に Windows のままになってしまいます。
シャットダウンして電源ボタンを押した直後から、option キーをしばらく押したままにしておきます (再起動した場合も同様)。
するとハードディスクの画像が表示され、
MacOS 用のハードディスクか Windows 用のハードディスクかを選択できるようになります。

なお、ハードウェアの種類やバージョンなどの組合せが異なると、
Boot Camp の設定手順が若干異なる場合があるようです。

 

最後に、Windows エクスペリエンス インデックスの計測結果を載せておきます。
Surface Pro での計測結果にかなり近いです。

Windows エクスペリエンス インデックス

 

バージョン情報
MacBook Air (Mid 2013) 128GB (最小構成)
Boot Camp アシスタント 5.0.4

参照
Boot Camp 設定の概要
Boot Camp サポート
Boot Camp – インストールと設定ガイド (PDF)
新MacBook AirにWin8を入れてみた 完全ガイド
[Mac] BootCamp用のWindows 7 インストールディスクをSD or USBメモリに作る

カテゴリー: OS. タグ: , . 1 Comment »