ASP.NET MVC で LINQ to XML

環境; Windows 7 x64 Ultimate, Visual Studio 2010 Ultimate, .Net Framework 4.0, MVC 2

http://dailynews.yahoo.co.jp/fc/rss.xml

にあるRSSデータをLINQで読み込み、MVC2で表示させる。

RSSデータは、次のような感じ。

http://backend.userland.com/blogChannelModule”>
<channel>   
<title>Yahoo!ニュース・トピックス – トップ</title>
<link>
http://dailynews.yahoo.co.jp/fc/</link>
<description>Yahoo! JAPANのニュース・トピックスで取り上げている最新の見出しを提供しています。</description>
<language>ja</language>
<pubDate>Sun, 30 Jan 2011 13:43:46 +0900</pubDate>

<item>
<title>民主党綱領めぐり主導権争い</title>
<link>
http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/domestic/politics/</link>
<pubDate>Sat, 29 Jan 2011 13:37:45 +0900</pubDate>
<guid isPermaLink=”false”>yahoo/news/topics/3494716</guid>
</item>

<item>
<title>邦人500人が足止め エジプト</title>
<link>
http://rd.yahoo.co.jp/rss/l/topics/topics/*http://dailynews.yahoo.co.jp/fc/world/overseas_japanese/</link>
<pubDate>Sun, 30 Jan 2011 11:39:52 +0900</pubDate>
<guid isPermaLink=”false”>yahoo/news/topics/3501016</guid>
</item>

———————————–

1. MVC2 の新規プロジェクト作成

2. ソリューションエクスプローラーから、Contoller を右クリックし、コントローラの追加を選択

image

3. YahooRssController を追加

image

4. YahooRssController.cs に次のコードを実装

using System.Collections.Generic;
using System.Web;
using System.Web.Mvc;
using System.Xml.Linq;
using System.Linq;

namespace MvcApplication3.Controllers
{
    public class YahooRssController : Controller
    {
        //
        // GET: /YahooRss/

        public ActionResult Index()
        {
            var res = new List<YahooRss>();

            ViewData[“Message”] = “ASP.NET MVC へようこそ”;

            string yahooRssUrl = “http://dailynews.yahoo.co.jp/fc/rss.xml”;
            XDocument rss = XDocument.Load(yahooRssUrl);

            res = (from item in rss.Descendants(“item”)
                   select new YahooRss
                   {
                       title = (item.Element(“title”).Value ?? “”),
                       link = item.Element(“link”).Value,
                       pubDate = item.Element(“pubDate”).Value,
                       guid = item.Element(“guid”).Value
                   }).ToList();

            return View(res);
        }

        public class YahooRss
        {
            public string title { get; set; }
            public string link { get; set; }
            public string pubDate { get; set; }
            public string guid { get; set; }
        }
    }
}

6.  ビューを追加

コードエディタの public ActionResult Index() のスコープ内を右クリックして、ビューの追加を選択

image

すると、次のようなビューの追加ダイアログが表示されるので、そのまま Index というビューを追加する。

image

7.  ビューの実装

<ul></ul>ブロック内を実装する。

<%@ Page Language=”C#” Inherits=”System.Web.Mvc.ViewPage<dynamic>” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml” >
<head runat=”server”>
    <title>Index</title>
</head>
<body>
    <div>
             <ul>
          <% foreach (var res in Model)
             {  %>
               <li> <a href=<%=Html.Encode(res.link) %>><%=Html.Encode(res.title) %></a> </li>
          <% } %>
     </ul>
    </div>
</body>
</html>

8. 実行すると・・・

http://localhost:1852/YahooRss/Index というURLに対して、次のようになる。1852 は実行環境によって違います。

image

ポイントは、View で表示する際に、

var res = from item in rss.Descendants(“item”)
select new
{
   …
}

という形だと、View 側で、Model の型がわからず、実行時エラーになってしまう。

そこで、Contoller で、public class YahooRss というクラスで明示的に定義して、

var res = new List<YahooRss>();
res = (from item in rss.Descendants(“item”)
                   select new YahooRss
                   {
                       title = (item.Element(“title”).Value ?? “”),
                       link = item.Element(“link”).Value,
                       pubDate = item.Element(“pubDate”).Value,
                       guid = item.Element(“guid”).Value
                   }).ToList();

というように、データを渡してあげること。

このことに関しては、次のURLを参考にしました。

Using ASP.NET MVC 2 to Query Twitter’s Public API – FIFA 2010

http://www.dotnetcurry.com/ShowArticle.aspx?ID=536&AspxAutoDetectCookieSupport=1

Windows Live Mesh 2011 のインストールはここから

まちがって、USのサイトからインストールしてしまうと、英語バージョンの Writer とかがインストールされてしまうので、次の日本語のサイトからインストールする。

image

http://explore.live.com/windows-live-mesh?os=other

インストール開始時に、次のようにインストールするプログラムの選択ダイアログが表示されるが、2つ目のインストールする製品の選択より、必要なものだけをインストールするのがおすすめ。

image

それでないと、ファミリーセーフティなど、デフォルトですべてのLive プログラムがインストールされてしまう。

image

Live Mesh は、複数のPCでデスクトップ、お気に入り、マイドキュメントを同期できるので、複数のPCで作業をしている人にはおすすめ。それから、WordPress を使用するなら、Writerがおすすめですね。

vmware の Virtual Machine がファイルをロックできずに起動できない場合の対処方法

停電でPCが落ちたら、vmware の Virtual Machine が起動できなくなってしまいました。エラーメッセージは次の通り。

ディスク「****.vmdk」、またはこのディスクが依存するスナップショット ディスクを開くことができません。

理由: ファイルをロックできませんでした。

image

対処方法

上記仮想ディスクのフォルダーにある、***.vmdk.lck ファイルがあるので、このロックファイルを削除する。その前に無停電電源装置UPSをつけなさいということですね。

わかってはいますが・・・

SQL テーブルの IDENTITY をリセットする方法

テーブルのIDに IDENTITY をセットしている時に、テーブルの中身を消して、もう一度ID を0からふりなおしたい場合

image

TRUNCATE TABLE テーブル名

DBCC CHECKIDENT (テーブル名, RESEED , 0)

GO

補足

WHERE 句を伴わない DELETE FROM であれば、TRUNCATE TABLE  テーブル名 の方が高速で、使用するシステム リソースとトランザクション ログ リソースも少なく、おすすめ。

Outlook 2010 より SQL へ直接 INSERT

Outlook 2010 から EXCELや、CSV への出力は、ファイルへのエクスポートで簡単にできるが、直接SQLに入れたい場合。

[Outlook のオプション]で、[開発]タブは規定値でオフになっているので、ここにチェックを入れる。

image

すると[開発]タブが表示される。

image

[マクロ]ボタンを押し、[マクロ]ダイアログより、たとえばOutlookToSqlマクロを作成する。

image

すると、Visual Basic のエディタが開く。[ツール]→[参照設定]を選択する。

image

[参照設定]より、”Microsoft ActiveX Data Objects 6.0 Library”を選択する。バージョンは環境によって異なるので最新のもので試してみればよいと思う。

image

SQL Server では、たとえばこんなテーブルを作っておく。

image

そして、次のマクロを実行する。

Sub OutlookToSql()
    Dim myOlapp As New Outlook.Application
   
    Dim myNameSpace As Outlook.NameSpace
    Dim myFolder As Outlook.Folder
   
    Dim 送信日時 As Date
    Dim 受信日時 As Date
    Dim 件名 As String
    Dim 内容 As String
   
    Set myNameSpace = myOlapp.GetNamespace(“MAPI”)
    Set myFolder = myNameSpace.Folders.Item(“Outlook”).Folders(“受信トレイ”)
   
    Dim adoCon As New ADODB.Connection
   
    adoCon.Open “Driver={SQL Server};” & _
      “server=192.168.11.9; database=test;Trusted_Connection=yes”
       
    Dim cmd As String
   
    With myFolder
        For i = 1 To .Items.Count
            件名 = .Items(i).Subject
            件名 = Replace(件名, “‘”, “””)
           
            送信日時 = .Items(i).SentOn
            受信日時 = .Items(i).ReceivedTime
            内容 = .Items(i).Body
            内容 = Replace(内容, “‘”, “””)
           
            cmd = “insert into Mail(Subject, SentOn, Received, Body) values (” & _
                “‘” & 件名 & “‘,” & _
                “‘” & 送信日時 & “‘,” & _
                “‘” & 受信日時 & “‘,” & _
                “‘” & 内容 & “‘” & _
                “)”
            adoCon.Execute cmd
        Next i
    End With
   
    adoCon.Close
   
    MsgBox “Done”
   
End Sub

結果はこんな感じ。

image

VBA でSQLのコマンドを文字列で生成しているので、SQL Injection 対策が必要なので注意。

Outlook 2010 からメール情報をEXCEL へ出力

Outlook 2010の[ファイル]→[開く]→[インポート]

image

ここで、[ファイルにエクスポート]を選択

image

[ファイルのエクスポート]ダイアログで、[Microsoft EXCEL 97-2003]を選択

image

エクスポートするフォルダーを選択

image

出力先を設定

image

EXCEL に次の項目ごとに、メールデータを出力できる。

件名, 本文, 差出人,名前, 差出人,住所, 差出人種類, 宛先名前, 宛先住所, 宛先種類, CC名前, CC住所, CC種類, BCC名前, BCC住所, BCC種類, 経費情報, 支払い条件, 重要度, 秘密度, 分類項目

同様に、CSVへの出力もできるが、本文に TABやカンマが含まれていると、うまく扱えない。

nVidia GeForce 7600 GSでスリープ状態をサポートしていない?

Windows 7  x64で、古いGeForce 7600 GS をつんでみたが、Sleepモードがサポートされていないみたい。

標準のドライバーでのサポート状況は、次のとおり。

C:\Users\uchukamen>powercfg -a
以下のスリープ状態がこのシステムで利用可能です: 休止状態
以下のスリープ状態はこのシステムでは利用できません:
スタンバイ (S1)
        VGAPNP.SYS ディスプレイ ドライバーはスタンバイ状態をサポートしていません。ハードウェア ベンダーに連絡して、最新
のディスプレイ ドライバーを入手してください。
スタンバイ (S2)
        システム ファームウェアはこのスタンバイ状態をサポートしていません。
        VGAPNP.SYS ディスプレイ ドライバーはスタンバイ状態をサポートしていません。ハードウェア ベンダーに連絡して、最新
のディスプレイ ドライバーを入手してください。
スタンバイ (S3)
        VGAPNP.SYS ディスプレイ ドライバーはスタンバイ状態をサポートしていません。ハードウェア ベンダーに連絡して、最新
のディスプレイ ドライバーを入手してください。
ハイブリッド スリープ
C:\Users\uchukamen>

そこで、nVidia の最新ドライバー260.99 を入れてみる。

ところが、インストールしてみようとすると、PhysXとかHDオーディオとか3D Vision とか、全然関係のないドライバーまでご丁寧に入れてくれようとするので、グラフィックスドライバーのみインストールする。

image

すると、OS再起動後に、スタンバイ(S1, S3)が有効になっている。

Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\uchukamen>powercfg -a
以下のスリープ状態がこのシステムで利用可能です: スタンバイ ( S1 S3 ) 休止状態 ハイブリッド スリープ
以下のスリープ状態はこのシステムでは利用できません:
スタンバイ (S2)
        システム ファームウェアはこのスタンバイ状態をサポートしていません。

C:\Users\uchukamen>

そして、シャットダウンメニューに、スリープがイネーブルになっていた。

image

ところが、スリープに入り、復帰させると、F4でブルースクリーンになる。いろいろ調べてみると、どうも nVidia のドライバーに問題があるようだ・・・

とりあえず、スリープはせず、休止状態でしのぐことにする。

たしか Windows 7 x86 では、問題なかったと思うので、Windows 7 x64 用の nVidia のドライバー 260.99の問題ではないだろうか・・・

スリープ状態のサポートの確認方法

powercfg –a で確認できる。

たとえば、こんな感じ。

Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\uchukamen>powercfg -a
以下のスリープ状態はこのシステムでは利用できません:
スタンバイ (S1)
        インストールされているレガシ ドライバーの 1 つまたはそれ以上が原因で、スタンバイ状態に入ることができません:
                VgaSave
        内部システム コンポーネントでこのスタンバイ状態が無効になっています。
スタンバイ (S2)
        システム ファームウェアはこのスタンバイ状態をサポートしていません。
        インストールされているレガシ ドライバーの 1 つまたはそれ以上が原因で、スタンバイ状態に入ることができません:
                VgaSave
        内部システム コンポーネントでこのスタンバイ状態が無効になっています。
スタンバイ (S3)
        インストールされているレガシ ドライバーの 1 つまたはそれ以上が原因で、スタンバイ状態に入ることができません:
                VgaSave
        内部システム コンポーネントでこのスタンバイ状態が無効になっています。
休止状態
        レガシ ドライバーが 1 つまたは複数インストールされています:
                VgaSave
        内部システム コンポーネントで休止状態が無効になっています。
ハイブリッド スリープ
C:\Users\uchukamen>

image