2013年5月19日日曜日

VMWARE FUSION 5

MBA上の Windows7は VMWARE FUSION 4で動いてるんだけど、RHELの6が動かんのでそのうち買おうと思ってた5が、act2で買うと4900円だけど amazonで3800円くらいだったからポチっと。


大体2日くらいで届く。早いねー。


インストーラはCDだけど、USBも付いててそれでインストール出来る。
ドライブがないMBAには実にありがたい。

製品登録してて気づいたけど、Act2にユーザ登録してたらもしかしたら無償でアップグレード出来たかも。まあいいか。いい製品への投資と考えて。

2013年5月11日土曜日

[Silverlight]CSV出力

Silverlight で CSV データを保存しよう。
たぶん、やり方は2つ。



Silverlight アプリケーションでデータを生成し、ローカル保存するのが1つ目。


    string csvData = "";

    // カンマ区切りの文字列を csvData に設定


    SaveFileDialog dialog = new SaveFileDialog();
    dialog.DefaultExt = ".csv";
    dialog.Filter = "データ | *.csv";
    dialog.DefaultFileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".csv";
    if (dialog.ShowDialog() == true)
    {
        using (var stream = dialog.OpenFile())
        {
            using (var writer = new StreamWriter(stream, Encoding.UTF8))
            {
                writer.Write(csvData);
                writer.Flush();
            }
        }
    }



CSVファイルの文字コードは shift-jis じゃないと Excel で開いたときに文字化けしてしまう。普通にファイル出力してしまうと、UTF-8 で出力される。とはいえ、Silverlight には標準で shift-jis にサクッと変換するすべは無い。だが、Excel も UTF-8 をサポートしているはずなので、調べてみたところ BOM(Byte Order Mark) が付与されているものであれば、UTF-8 でも開けるとのこと。

BOM を付与するには、StreamWriter の第二パラメータにちゃんと UTF8 ですよってつけてあげればおk。

DefaultFileName を未設定だと、保存ダイアログのファイル名のところが空になってしまい、設定しちゃうと、保存ダイアログ表示前に勝手に確認ダイアログが出るのが気に入らない。
UTF-8 じゃなくて shift-jis で出したい場合は、ちょっと手間だけど次の方法。



サーバーサイドで作ってダウンロードさせる。これが2つ目。

aspx 作って POST で返すのもいいけど、今回はジェネリックハンドラを使う。
まずはサーバーサイド。



    /// <summary>
    /// CsvDownload の概要の説明
    /// </summary>
    public class CsvDownload : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            string csvData = "";

            // カンマ区切りの文字列を csvData に設定

            context.Response.ContentType = "text/csv";
            context.Response.AddHeader("Content-Disposition", "attachment;filename=" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".csv");
            context.Response.ContentEncoding = System.Text.Encoding.GetEncoding("shift-jis");
            context.Response.Write(csvData);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }



これで、CsvDownload.ashx をクライアント側から呼び出すだけでおk。

呼び出し方はいくつかあって、Silverlight アプリケーションから直接呼び出す場合は、WebClient クラスを使ってバイトデータを読み出したあとに、1つ目と同じ方法で保存する。

javascript 側からリクエストする方法もいくつかある。
流れはjsにリクエストさせる為のメソッドを用意して、Silverlight側からCALLする。


☆js側

    <script type="text/javascript">
        function getCsv() {
        }
    </script>


☆SL側

            HtmlPage.Window.Invoke("getCsv");






getCsv の中でHTTPリクエストをやるんだけど、まずは一番かっちょわるいやりかた。
新規Window作ってそこからリクエストする。


            var w = window.open("CsvDownload.ashx", "csv", "width=1,height=1", null);
            w.onload = function () {
                w.close();
            };
            self.focus();

Windowが見えるのはやだよね。
これを回避する為には隠しiframeを使う。

            var iframe = document.createElement("iframe");
            if (iframe != null) {
                iframe.style.display = "none";
                iframe.onload = function () {
                    document.body.removeChild(iframe);
                }
                document.body.appendChild(iframe);
                iframe.src = "CsvDownload.ashx";
            }


ほかにも jQuery の ajax 使うのとか色々ありそうだけど、キリが無いので今日はここまで。