ぷろじぇくと、みすじら。

LINQ to Exchange WebDAV

Created at: | Tag: LINQ Exchange

Exchange 2000, 2003, 2007にはWebDAVでアクセスするためのインターフェースがありまして、SQLを含んだXMLを投げつけるとExchangeの中のデータを取り出せたりします。Searching Folders (WebDAV) のような感じですね。まあ2010では廃止されちゃったのですが。

さてExchange 2003のデータを.NET Frameworkのプログラムから取り出したいということがあるわけですが、今までぷちぷちSQL文字列を組み立ててXDocumentでちくちく処理していました。が、なんかめんどくさいしやっぱりLINQ使いたいですよね!!ということでLINQ プロバイダを作ってみました。死にゆくExchange 2003のための誰得LINQプロバイダです。

ダウンロード: Misuzilla.Data.ExchangeWebDav-20100703.zip (Visual Studio 2010, .NET 4)

IQueryable/IQueryProviderまわりを勉強しながらだったので何となく動くところまでしかやってないので細かいとこはアレなのと、Exchange 2003でしか動作確認していないので多分2000とか2007だとそのままでは動かないかもしれません。

使い方はExchangeDavQuerySampleを見てもらえればわかるのですが、次のようなコードでメールの一覧を取ってこれたりします。

var credential = new NetworkCredential("yui@k-on.local", "P@ssw0rd");
var baseUrl = "http://exch2k3.k-on.local/exchange/yui/受信トレイ/";

// WebDAVアクセスのためのクライアントを作成する
ExchangeWebDavClient davClient = new ExchangeWebDavClient(credential);
// LINQプロバイダを作成する
ExchangeDavQueryProvider provider = new ExchangeDavQueryProvider(davClient, baseUrl, baseUrl, TraversalType.Shallow);
provider.Log = Console.Out;

// クエリを作成する
var q = new ExchangeDavQuery<DavMessageHeaderEntry>(provider)
    .Where(x => !x.IsFolder && !x.IsHidden)
    .OrderByDescending(x => x.CreationDate)
    .Select(x => new { Subject = x.Subject, From = x.From, To = x.To });

// 実行する
foreach (var entry in q)
{
    Console.WriteLine("--------------------------------------------------");
    Console.WriteLine("Subject: {0}", entry.Subject);
    Console.WriteLine("From: {0}", entry.From);
    Console.WriteLine("To: {0}", entry.To);
}

これを実行すると以下のような結果が出てきます。

---- Query: 2010/07/03 15:57:34 ----
BaseUrl: http://192.168.0.36/exchange/yui/受信トレイ/
Start: 0, End: 49
SQL:
SELECT
    "urn:schemas:httpmail:subject", "urn:schemas:mailheader:from", "urn:schemas:mailheader:to"
FROM
    SCOPE ('SHALLOW TRAVERSAL OF "http://192.168.0.36/exchange/yui/受信トレイ/"')
WHERE
    (NOT(("DAV:isfolder" = true)) AND NOT(("DAV:ishidden" = true)))
ORDER BY
    "DAV:creationdate" DESC

---- Query End: 135.0077ms ----
--------------------------------------------------
Subject: 2010年夏合宿
From: "Tsumugi Kotobuki" <mugi@k-on.local>
To: "Yui Hirasawa" <yui@k-on.local>, "Azusa Nakano" <azunyan@k-on.local>, "Ritsu
 Tainaka" <ritsu@k-on.local>, "Mio Akiyama" <mio@k-on.local>
--------------------------------------------------
Subject: とんちゃんの写真の件
From: "Yui Hirasawa" <yui@k-on.local>
To: "Azusa Nakano" <azunyan@k-on.local>, "Tsumugi Kotobuki" <mugi@k-on.local>
--------------------------------------------------
Subject: test
From: "Yui Hirasawa" <yui@k-on.local>
To: "K-ON Club -Internal" <K-ONClub-Internal@k-on.local>

更新などには別途何か必要なのですがそうでなくても、データ取得が簡単にできるようになるので便利だと思います。どうぞご利用ください。

WinDbg/CDBで.loadby sos mscorwksしてSOSデバッガ拡張コマンドを使うとmscorwks.dll/mscordacwks.dllのバージョンが違うと怒られる

Created at: | Tag: Windows Debug NETFx

Windows Server 2003 環境の.NET FrameworkとWindows Vista SP2の.NET Frameworkは微妙にバージョンが違ったりします(W2k3は最新で2.0.50727.4016、Vistaは2.0.50727.3053)。

そんな感じで手元とは異なった環境で取ったメモリダンプファイルを開いて、SOSデバッガ拡張でのぞき見ようとすると次のようにエラーになったりします。

0:023> .loadby sos mscorwks
0:023> !DumpHeap
*********************************************************************
* Symbols can not be loaded because symbol path is not initialized. *
*                                                                   *
* The Symbol Path can be set by:                                    *
*   using the _NT_SYMBOL_PATH environment variable.                 *
*   using the -y  argument when starting the debugger. *
*   using .sympath and .sympath+                                    *
*********************************************************************
PDB symbol for mscorwks.dll not loaded
Failed to load data access DLL, 0x80004005
Verify that 1) you have a recent build of the debugger (6.2.14 or newer)
            2) the file mscordacwks.dll that matches your version of mscorwks.dll is 
                in the version directory
            3) or, if you are debugging a dump file, verify that the file 
                mscordacwks___.dll is on your symbol path.
            4) you are debugging on the same architecture as the dump file.
                For example, an IA64 dump file must be debugged on an IA64
                machine.

You can also run the debugger command .cordll to control the debugger's
load of mscordacwks.dll.  .cordll -ve -u -l will do a verbose reload.
If that succeeds, the SOS command should work on retry.

If you are debugging a minidump, you need to make sure that your executable
path is pointing to mscorwks.dll as well.
0:023> .cordll
CLR DLL status: ERROR: Unable to load DLL mscordacwks_x86_x86_2.0.50727.3053.dll, Win32 error 0n2
0:023> .load C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
0:023> .cordll -ve -u -l
CLR DLL status: No load attempts
0:023> !DumpHeap
CLRDLL: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscordacwks.dll:2.0.50727.4016 f:0
doesn't match desired version 2.0.50727.3053 f:0
CLRDLL: Unable to find mscordacwks_x86_x86_2.0.50727.3053.dll by mscorwks search
CLRDLL: Unable to find 'mscordacwks_x86_x86_2.0.50727.3053.dll' on the path
CLRDLL: Unable to find mscorwks.dll by search
CLRDLL: ERROR: Unable to load DLL mscordacwks_x86_x86_2.0.50727.3053.dll, Win32 error 0n2
Failed to load data access DLL, 0x80004005
Verify that 1) you have a recent build of the debugger (6.2.14 or newer)
            2) the file mscordacwks.dll that matches your version of mscorwks.dll is 
                in the version directory
            3) or, if you are debugging a dump file, verify that the file 
                mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path.
            4) you are debugging on the same architecture as the dump file.
                For example, an IA64 dump file must be debugged on an IA64
                machine.

You can also run the debugger command .cordll to control the debugger's
load of mscordacwks.dll.  .cordll -ve -u -l will do a verbose reload.
If that succeeds, the SOS command should work on retry.

If you are debugging a minidump, you need to make sure that your executable
path is pointing to mscorwks.dll as well.

そんなときは対応するDLLを取得できるようにシンボルパスを設定してあげます。

WinDbg の File → Symbol File Path ... で Symbol path: に

symsrv*symsrv.dll*c:\localcache*http://msdl.microsoft.com/download/symbols

Reload チェックボックスをオンでOKで閉じます。

もしすでに .loadby sos mscorwks を実行して怒られたあとなら、一度次のコマンドで再読み込みできるようにします。

.cordll -ve -u -l

あとは普通にデバッガ拡張コマンドが使えるようになってるはずです。

Windows Vista の Flip3D を無効化する

Created at: | Tag:

普段 Windows Vista を利用していて大体不満を感じないのですが、一つどうしても気になっていたことがあります。それは Vista のウリである Flip3D を Alt+Tab を押すつもりで Win+Tab で間違えて発動してしまいガッカリすることです。いくら Vista スキーとはいえアレはいらないのです。

ということで無効化する方法を調べたところ、HKLM\Software\Policies\Microsoft\Windows\DWM (HKCU でもよい)に DisallowFlip3d というキーを作って 1 を設定すればよいようでした。

コマンドプロンプト(管理者権限で起動してください)で以下のようなコマンドを実行すれば無効化されます(この例ではユーザーローカルなHKCUに書き込んでいます)。

reg add HKCU\Software\Policies\Microsoft\Windows\DWM /v DisallowFlip3d /t REG_DWORD /d 0x1
sc stop uxsms & timeout 5 & sc start uxsms

逆に有効にしたい時は以下のように実行すれば戻ります。

reg delete HKCU\Software\Policies\Microsoft\Windows\DWM /v DisallowFlip3d
sc stop uxsms & timeout 5 & sc start uxsms

Apple Wireless Keyboard Helper for Windows Updated 20071102

Created at: | Tag:

20071102版をリリースしました。JIS配列のキーボードでカナキーと英数キーに対してアクションを割り当てることができるようになりました。

JIS配列のサポートについてはりちゃさんにご協力いただきました。ありがとうございました。

Apple Wireless Keyboard Helper for Windows Updated 20071023

Created at: | Tag:

20071023にアップデート。一緒に含めていたMasterVolumeControlLibraryをアップデート(XPで起動時にエラーが出ていたのが直るはずです)。

ちなみに初期のリリースからの間にはJP対応とスクリプト再読込でビルトインモジュール(Trueとかすらなくなる)が吹っ飛ぶ問題も直してあります。

しかしソースをみて悩んだですよ……何しろリポジトリにつっこむ前になおしたつもりの現象がなぜか起こるので。なんかファイルが古いので逆コンパイルしたら直す以前だったという。