Silverlightをデプロイした際に気づいたミス

当たり前のことができていなかったミスです。


画像のファイル名に大文字が含まれているにもかかわらず、
XAMLに小文字でパスを書いていたため、画像が表示されないことがありました。


最近はIISしか使用しておらず開発環境も、実行環境もWindowsであったため、
大文字・小文字の違いを気にしていませんでしたが、
今回は、LinuxApacheの環境にデプロイしたため、現象が発覚しました。
(当たり前のことだったのですぐに気づきましたが、すごく残念な気分になりました…。)


普段、Windowsしか触っていない方はお気をつけください。

ASP.NETでUTF-8BOM付きテキストファイルをダウンロードさせる方法

ASP.NETでUTF-8BOM付きテキストファイルをダウンロードさせる方法

Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=Sample.txt");

//BOMを送信(ココが今回のポイント)
byte[] bom = System.Text.Encoding.UTF8.GetPreamble();
Response.BinaryWrite(bom);

//本文を送信
string text = "サンプルテキスト";
Response.BinaryWrite(Encoding.UTF8.GetBytes(text));

Response.End();

どんな状況で、こんなものが必要になることがあるかというと、
ASP.NETでクライアントにテキストファイルをダウンロードさせる場合、
クライアントのOSがWindowsであれば、
Shift-JISのファイルをダウンロードさせれば、OS標準のエディタで開けますが、
同じファイルをMacで開こうとすると、
OS標準のエディタでは、Shift-JISを開けるように設定しないと開けません。
じゃあ、UTF-8であれば開くのでは?と思ってエンコードだけをUTF-8(BOMなし)にしても、
設定変更しないと開けません。
そこで、UTF-8BOM付きであれば、WindowsでもMacでもOS標準のエディタで
特別な設定なしに開けます。(古いOSを除く。)
で、BOMってどうやって付けるの?ってことで今回の内容です。

Entity FrameworkでTransactionScopeを使用する際にMS-DTCへの昇格を防止する方法

Entity Frameworkを使用したプログラムで、TransactionScope内で2つ以上のクエリを実行した場合、何もしなければMS-DTCが使用されます。
しかし、単一のDBしか使用しないプログラムを作成していて、分散トランザクションが不要の場合、MS-DTCを使用するとオーバーヘッドが生じたり、デプロイするマシンの設定変更が必要になったりするため、不用意にMS-DTCへの昇格を防ぎたいことがあります。
そんな場合は以下のように、クエリを実行する前にオブジェクトコンテキストのDB接続を開くと、MS-DTCを使用せずにLCTで処理されるため、ローカルトランザクションと同様の仕組みで処理されます。

//選択して更新する場合
using (NORTHWNDEntities context = new NORTHWNDEntities())
{
    using(TransactionScope ts = new TransactionScope())
    {
        //DB接続を開く(ココが今回のポイント)
        context.Connection.Open();

        //選択(ProductIDが1のデータを取得)
        var query = from t in context.Products
                    where t.ProductID == 1
                    select t;
        var product = query.First();
        
        //更新(UnitsInStockを99に更新)
        product.UnitsInStock = 99;

        context.SaveChanges();
        ts.Complete();
    }
}

【補足】DBがSQL Server 2008の場合は、上記と同様の条件下であれば、対応を入れなくてもMS-DTCへ昇格しません。

SQL Serverのスキーマから簡易テーブル設計書を作成するSQL

SQL Serverスキーマから簡易テーブル設計書を作成するSQLです。
Management Studioで出力対象のDBに対して下記SQLを発行してください。
あとは、クエリ結果をExcelにでもコピペして加筆、整形してください。

SELECT
    C.TABLE_NAME AS TableName,    
    C.ORDINAL_POSITION AS OrdinalPosition,
    CASE WHEN T1.COLUMN_NAME IS NULL THEN 0 ELSE 1 END AS IsPK,
    C.COLUMN_NAME AS ColumnName,
    C.DATA_TYPE AS DataType,
    CASE C.CHARACTER_MAXIMUM_LENGTH WHEN -1 THEN 'MAX' WHEN NULL THEN '' ELSE ISNULL(CONVERT(VARCHAR(10), C.CHARACTER_MAXIMUM_LENGTH), '') END AS MaximumLength,
    CASE WHEN C.IS_NULLABLE = 'NO' THEN 0 ELSE 1 END AS IsNullable,
    COLUMNPROPERTY(OBJECT_ID(QUOTENAME(C.TABLE_SCHEMA) + '.' + QUOTENAME(C.TABLE_NAME)), C.COLUMN_NAME, 'IsIdentity') AS IsIdentity,
    ISNULL(C.COLUMN_DEFAULT, '') AS ColumnDefault
FROM
    INFORMATION_SCHEMA.COLUMNS AS C
    LEFT OUTER JOIN(
        SELECT 
            K.TABLE_NAME, 
            K.COLUMN_NAME 
        FROM 
            INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K 
            INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS T 
            ON K.TABLE_NAME = T.TABLE_NAME 
            AND K.CONSTRAINT_NAME = T.CONSTRAINT_NAME 
        WHERE 
            CONSTRAINT_TYPE = 'PRIMARY KEY'
    ) AS T1 
    ON C.TABLE_NAME = T1.TABLE_NAME
    AND C.COLUMN_NAME = T1.COLUMN_NAME
ORDER BY
    C.TABLE_NAME,
    C.ORDINAL_POSITION

(2010/04/29 修正)

もっと細かい情報を出力したい場合は上記SQLと同じような感じで、各種ビュー(下記URL参照)の情報をゴニョゴニョすれば抽出できます。
http://msdn.microsoft.com/ja-jp/library/ms186778.aspx

「使って覚える Visual Studio 2008」単体テスト

http://www.microsoft.com/japan/msdn/vstudio/2008/tech/howto/unittest/
Visual Studio 2008 を使用した単体テストを、キャプチャ付でとてもわかりやすくまとめられています。
とても短いのでさらっと読めます。
初心者の方も、NUnitを使用している方も読んでみることをお勧めします。

LINQ to Entitiesのサポート非対象のメソッド

LINQ to SQL のノリで LINQ to Entities を使用すると
サポート対象メソッドが異なるので、注意しましょう。
http://msdn.microsoft.com/ja-jp/library/bb738550.aspx


では、LINQ to Entities を使用していて非対象のメソッドが必要な場合、回避するにはどうするのがベストなのだろうか?

  • DB側にビューを作る?(しょうもないビューがたくさん出来そう。)
  • 非対象のメソッドを避けてクエリを作成する?(これですべて回避できるかな?できても開発効率が落ちる?)
  • 該当部分だけ LINQ to SQL を使う?(エンティティをLINQ to Entitiesと別に作る?そもそもLINQ to SQLで対応できない場合もある?)
  • SQLCommandで直接SQLを投げる?(これならどうにでもできるけど…。構文エラーとかタイプセーフとかどうする?)

 …

  • (V2でサポートされることを祈る?)

SharePoint Designer 2007 が無償ダウンロード化

Microsoft Office SharePoint Designer 2007 が無償ダウンロード可能になってました。
http://www.microsoft.com/japan/sharepoint/letter/SPD_20090401_01.mspx
知らなかった…。
どうやら、Expression Webへシフトしていくようですね。