Category Archives: Visual Studio

ピクセルシェーダー② ツール PsPad – 川西 裕幸のブログ

土曜日の静岡ITPro勉強会で川西さんがデモで使っていたピクセルシェーダーツールがCodePlexで公開されたようです。

ピクセルシェーダー② ツール PsPad – 川西 裕幸のブログ – Site Home – MSDN Blogs

ClodePlexのサイトは以下になります。

PsPad
http://pspad.codeplex.com/

静岡ITPro 第5回勉強会 まとめ #shizuoka_itpro5

昨日関西、中京、関東方面から起こしいただいた皆様ありがとうございます。

もちろん県内よりお越しの皆様ありがとうございます。できるだけ遠くに行かずとも勉強会に参加でき、続けていけるようお互いに無理せずにがんばりましょう。

そしてもちろん講師の川西さん、砂金さん楽しいセッションをありがとうございます。もうそのときにはガンダムはないかもしれませんが、また是非静岡にお越しください。大西さんもお越しいただけませんでしたが、次の機会には是非お願いいたします。

スタッフお疲れ!

と言うことで、とりあえず自分のつぶやきをまとめます。

Liveコーディングをつぶやくのは難しいです。。orz

つぶやけてませんが川西さんが作成中のビジュアル的に簡単に.PSファイルを作れるピクセルシェーダーツールはいずれCodePlexにあがるようなので、使ってみたいですね。というか、Silverlightさんがあんなに簡単にピクセルシェーダー使えるとかハンパねぇです。

また砂金さんが早くも昨日のスライドをアップしてくれています。

静岡ITProの勉強会は年内にできれば10月終わりか11月はじめぐらいに予定をしております。テーマ、講師の方が決まり次第またご連絡言いたしますので、ぜひお越しください!

C#, SQL Server : WMIを使用したSQL Serverへの生死確認

先ほどはSMOを使ったのですが、SMOは製品版のSQL Server 2008以上が入っていないとコンポーネントが無いだの、ライセンス的にどうよとか、そもそも SQL 2005 以下しかないのにとかどこかしらかご意見をいただいたようなので、それなら素のWMIだと言うことで、WMIのコードで書いてみました。 SQL Server の WMI Provider for Configuration Management を使います。

System.Managementへの参照を追加します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;

namespace TestSqlDmo
{
    public class Sample
    {
        //WMIを使って、SQL Serverの生死確認をする
        public bool WmiTest(string serviceName) {
            string query = "SELECT * FROM SqlService WHERE ServiceName = '" + serviceName + "'";
            
            ManagementObjectSearcher searcher =
                    new ManagementObjectSearcher("root\\Microsoft\\SqlServer\\ComputerManagement10", query);

            bool retval = false;
            foreach (ManagementObject queryObj in searcher.Get())
            {
                Console.WriteLine("-----------------------------------");
                Console.WriteLine("SqlService instance");
                Console.WriteLine("-----------------------------------");
                Console.WriteLine("State: {0}", queryObj["State"]);
                Console.WriteLine("ServiceName: {0}", queryObj["ServiceName"]);

                int serviceState = Convert.ToInt32(queryObj["State"]);
                SqlServerServiceState state = IntToSqlServerServiceState(serviceState);
                if (SqlServerServiceState.Running == state) {
                    retval =  true;
                }
                else {
                    retval =  false;
                }
            }
            return retval;
        }

        private SqlServerServiceState IntToSqlServerServiceState(int state) {
            switch (state) { 
                case 1 :
                    return SqlServerServiceState.Stopped;
                case 2 :
                    return SqlServerServiceState.StartPending;
                case 3 :
                    return SqlServerServiceState.StopPending;
                case 4 :
                    return SqlServerServiceState.Running;
                case 5 :
                    return SqlServerServiceState.ContinuePending;
                case 6 :
                    return SqlServerServiceState.PausePending;
                case 7 :
                    return SqlServerServiceState.Paused;
                default :
                    return SqlServerServiceState.Unknown;
            }
        }
    }

    public enum SqlServerServiceState : int
    { 
        /// 
        /// 未確定。
        /// 
        Unknown = 0,
        /// 
        /// 停止中。サービスは停止しています。
        /// 
        Stopped,
        /// 
        /// 開始保留中。サービスは開始を待機しています。
        /// 
        StartPending,
        /// 
        /// 停止保留中。サービスは停止を待機しています。
        /// 
        StopPending,
        /// 
        /// 実行中。サービスは実行中です。
        /// 
        Running,
        /// 
        /// 継続保留中。サービスは継続を待機しています。
        /// 
        ContinuePending,
        /// 
        /// 一時停止保留中。サービスは一時停止を待機しています。
        /// 
        PausePending,
        /// 
        /// 一時停止中。サービスは一時停止しています。
        /// 
        Paused
    }
}

何か素直にSMO使った方が良いですね。という感じ。

と言うか、よく見るとWMIの名前空間にSQL Serverのバージョン番号が入ってないか? orz

うーん。。。マルチバージョンにどう対応させれば。。。

ちなみにWMIの検索やどんなコード書けばいいかについては古いツールですが WMI Code Creator が便利です。

WMIを使うスクリプトを簡単に作成する

http://www.atmarkit.co.jp/fwin2k/win2ktips/756wmicreator/wmicreator.html

C#, SQL Server : SMOを使ったSQL Serverへの生死確認

単純に SQL Server が生きているかPingを打ちたいときがあります。いろいろ方法はあるかと思いますが、ここではSMOを使う方法で考えたいと思います。

と言うことで以下がサンプル的なコード。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

namespace TestSqlDmo
{
    public class SQLSMO_Sample
    {
        /// 
        /// 引数で渡されたサーバーインスタンスに接続し、バージョン情報を返します。
        /// 
        /// 対象となるSQLサーバーのインスタンス名(Exp."HostName\SQLEXPRESS")
        /// 対象のSQL Serverのメジャーバージョン
        public string ConnectionServerTest(string instanceName) {
            try {
                ServerConnection con = new ServerConnection(instanceName);
                con.ConnectTimeout = 2;
                con.LoginSecure = true;
                Server srv = new Server(con);
                //タイムアウトとか細かく設定しないなら以下のように接続しても良いです。
                //Server srv = new Server(instanceName);
                return srv.Information.Version.Major.ToString();
                //もしくは
                //return srv.PingSqlServerVersion(srv.Name).ToString();

            }
            catch (Microsoft.SqlServer.Management.Common.ConnectionFailureException e) {
                Console.WriteLine(e.Message);
                throw e;
            }
        }
        
        /// 
        /// 引数で渡されたサーバーインスタンスに接続し、それが持つデータベースの一覧を返します。
        /// 
        /// 対象となるSQLサーバーのインスタンス名
        /// データベース名のリスト
        public List GetDatabaseList(string instanceName) {

            try {
                ServerConnection con = new ServerConnection(instanceName);
                con.ConnectTimeout = 2;
                con.LoginSecure = true;
                Server srv = new Server(con);
                List DbNames = new List();
                foreach (Database d in srv.Databases) {
                    DbNames.Add(d.Name);
                }
                return DbNames;
                
            }
            catch (Microsoft.SqlServer.Management.Common.ConnectionFailureException e) {
                Console.WriteLine(e.Message);
                throw e;
            }
        }

    }
}

まぁこんなものかなと。コネクションのタイムアウトは環境に合わせて適宜見直した方がよいと思います。

基本的にExceptionが帰ってこなかったら生きている判断と言うことで。

二つ目はアプリケーションが必要とするデータベースがあるかないか確認したいというのも良くあることなので、とりあえずサンプルを加えてみました。

SMO便利だと思うのですが、使っている人も少ないらしく、これもあんまり情報がありませんね。

SQL Server 管理オブジェクト (SMO)

http://msdn.microsoft.com/ja-jp/library/ms162169.aspx

また、SMO経由でWMIを使用し、実際にサービスが実行中であるかを確認することもできます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo.Wmi; //←ここが追加

namespace TestSqlDmo
{
    public class SQLSMO_Sample
    {
        /// 
        /// 特定のサーバー上で動作するSQL Serverのサービスが実行中であるかを確認する。
        /// また、このときの認証はWindows認証を利用する。
        /// 
        /// 
        /// WMIのエラーが返ります。
        /// 
        /// サーバー名
        /// サービス名
        /// そのサービスが実行中であればtrueが返ります。
        public bool IsServiceRunnning(string serverName, string serviceName) {
            ManagedComputer comp = new ManagedComputer(serverName);
            if (ServiceState.Running == comp.Services[serviceName].ServiceState) {
                return true;
            }
            else {
                return false;
            }
        }
    }
}

(15:38追記)

Continue reading C#, SQL Server : SMOを使ったSQL Serverへの生死確認

C#, T-SQL : T-SQLのFLOAT型フィールドに.NETのDouble.NaN(非数)の値を入れることはできません。

たとえば、

double a = double.NaN;
SqlParameter p = new SqlParameter("@value", SqlDbType.Float);
Param.Value = a;
cmd.Parameters.Add(p);
cmd.ExecuteNonQuery();

このようなコードがあったときに、cmd.ExecuteNonQuery(); で型変換ができないと System.Data.SqlClient.SqlException になります。

代替案としては、挿入する実数値がNaNだった場合には(可能であれば) Null (DbNull) を挿入するか、最大値、最小値を使うなどアプリケーションやプロジェクト後に対応を決める必要があります。

同様に正負無限大値(PositiveInfinity, NegativeInfinity)の値もFLOATのフィールドに入れることができません。

プログラミングF#著者が来日されてトークイベントがあるようです

荒井さんのBlogにて、「プログラミングF#」の書評を書かれていたのですが、その中で。

プログラミング F# が発売されました – 荒井省三のBlog – Site Home – MSDN Blogs

この書籍の発売を記念して、著者であるChris Smith氏のトークイベントが行われます。先着20名限定でサインをしていただけるそうです。もし、行かれる場合は予約をされることをお勧めします。

Σ(゚Д゚;エーッ!

聞いてないよ。。。(誰がおまえにわざわざ連絡するw)

日時場所は

日時:2010年9月22日(水) 開場18:30/開演19:00~
場所:書泉ブックタワー 9階イベントフロア
入場料:無料/入場順に前からのご着席になりますのでご了承ください

だそうです。

詳細は以下のオライリーのページにてご確認ください。

http://www.oreilly.co.jp/editors/archives/2010/08/ann-programming-f-sharp-talkevent-2010-sept.html

まっ所詮デスマ中の漏れには。。。

C# : Entity Framework(.NET Fx 3.5) Linq式を使わない

こういう書き方をしていると普通にLinq式を書くのが面倒になってきます。

using (ImportEntities context = new ImportEntities(efBuilder.ConnectionString)) {
    context.Project.OrderBy(p => p.id).ToList().ForEach(p => {
        cbPorject.Items.Add(p.projectName);    
    });
    context.Ship.OrderBy(s => s.id).ToList().ForEach(s => {
        cbShip.Items.Add(s.shipName);
    });
}

C# : Entity Framework(.NET Fx 3.5) 簡単なまとめの追加 ビューから渡されたEntity Objectをそのまま使った更新

例のごとくこのようなデータ構造になっています。

image

MVPパターンを使っている場合に、ビューで更新されたエンティティオブジェクトをプレゼンターに渡し、プレゼンターではその渡されたものをそのまま使ってデータベースを更新したいときがあります。(あるんです。)

まずはビュー側でエンティティオブジェクトを作り、更新データを整えたらプレゼンターの更新用メソッドを呼び出します。

<

div class=”csharpcode”>

private void button1_Click(object sender, EventArgs e) {
    Project project = new Project();
    project.id = 31;
    project.projectName ="T:" + DateTime.Now.Date.ToString("yy/MM/dd:);
    presenter.Update(project);
}

プレゼンター側では引数で渡されたエンティティオブジェクトを使って更新します。ここでの更新方法についてはMSDNマガジン2008年7月号の階層型アーキテクチャの Entity Frameworkに書かれている方法そのままです。

public void Update(Project project) {
    using (ImportEntities context = new ImportEntities()) {
        //与えられたエンティティをコンテキストにアタッチする。
        context.AttachTo("Project", project);
        //更新されるプロパティの数が少なく特定できるなら
        //以下のようにプロパティを直接指定してもよい。
        //var stateEntity = context.ObjectStateManager.GetObjectStateEntry(project.EntityKey);
        //var propName = "projectName";
        //stateEntity.SetModifiedProperty(propName);
        //すべてのプロパティを変更済みにする
        project.SetAllModified(context);
        //変更の反映
        context.SaveChanges();
    }
}

まず4行目で引数で渡されたエンティティをコンテキストにアタッチします。

5行目から9行目ですが、ビューで更新されるプロパティが特定できる場合には、コメント内にあるようなやり方でそのプロパティだけ更新済みにするやり方もあります。

11行目はMSDNマガジンに書かれているやり方で、拡張メソッドを使ってエンティティの持つ全てのプロパティを更新済みとしてしまう方法です。ビューでグリッドコントロールにバインドされている場合などどのプロパティが更新されているかわからない場合に箱の方法が良いと思います。(バインディング使えるならこんな事しなくて良いのかアハハハハ)

拡張メソッド:

public static class EntityExtensions
{
    /// 
    /// エンティティのすべてのプロパティを変更済みに設定する。
    /// 
    /// 要素の型(IEntityWithKey)
    /// エンティティオブジェクト
    /// コンテキストオブジェクト
    public static void SetAllModified(this T entity, ObjectContext context)
        where T : IEntityWithKey {
        var stateEntry = context.ObjectStateManager.GetObjectStateEntry(entity.EntityKey);
        var propertyNameList
            = stateEntry.CurrentValues.DataRecordInfo.FieldMetadata.Select(pn => pn.FieldType.Name);
        foreach (var propName in propertyNameList) {
            stateEntry.SetModifiedProperty(propName);
        }
    }
}

全体コードは次のようになります。

Continue reading C# : Entity Framework(.NET Fx 3.5) 簡単なまとめの追加 ビューから渡されたEntity Objectをそのまま使った更新

Linq to XSDを楽しむ

TwitterでufcppさんにLinq to XSDの存在を思い出させていただいたので、現状どんなんだか触ってみた。前に触ったときにはかなりぁゃしぃ感じだった記憶があるのですが、何か今はちゃんとしてます。

まず、ダウンロード。

ダウンロードのページからバイナリをダウンロードします。私はVisual Studio 2010で確認したかったので2.0.0をダウンロード。

http://linqtoxsd.codeplex.com/releases/view/41260

ただし、このバイナリだけダウンロードしてもよっぽど何かできる人じゃないと何をしていいかもわからないので、ソースファイルも落とします。

http://linqtoxsd.codeplex.com/SourceControl/list/changesets

私はとりあえず最新のBuild 49966を落としました。普通はバイナリーのバージョンと同じソースを落とした方がいいとは思いますが・・・

展開

落としてきたバイナリのZIPとソースZIPそれぞれを回答して保存します。特にバイナリは後で環境変数にそのパスを登録する必要があるので、それを意識して回答、保存してください。私は「C:\bin\LinqToXsd2」と言うフォルダに保存しました。

設定

まず回答したソースのtrunkフォルダにあるReadme.TXTを開きます。この中の「Visual Studio integration」の内容を確認します。ちなみにReadme.txtはUTF-8エンコーディングです。

Set up the environment variable LinqToXsdBinDir (e.g. c:\LinqToXSDBin) before opening any Visual Studio instance.
Import LinqToXsd.targets template into your C# project by adding following lines into your project file (i.e. yourproject.csproj)
        <PropertyGroup>
        <LinqToXsdBinDir Condition="’$(LinqToXsdBinDir)’ == ”">$(SolutionDir)</LinqToXsdBinDir>
    </PropertyGroup>
    <Import Project="$(LinqToXsdBinDir)\LinqToXsd.targets" />

    o You can use your favorite XML editor (e.g. notepad) to edit .csproj files,
    o Make sure that your <Import Project="$(LinqToXsdBinDir)\LinqToXsd.targets" /> line is
           after any other Imports (e.g.   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />)
    o You can take a look at samples to see how it is done.

Open your project in Visual Studio
Add your XSD schemas to the project (i.e. right click on project->Add->Existing Item)
Change "Build Action" to LinqToXSDSchema on your XSD schemas
Build your project, after your first build XSD namespaces and types will be available in intellisense.
To see how you can integrate LINQ to XSD in your VB project please see LinqToXsdVB sample.

まずは、環境変数LinqToXsdBinDirに先ほどバイナリを解答したフォルダを設定します。

次に、まだVisual Studioへこれを組み込みインストーラー等が用意されていないので、.csprojファイルを直接編集して、プロジェクトに関連づける必要があります。変更内容は上の記述やReadMe.TXTの内容を確認してください。

一応これで、該当プロジェクトでLinq to XSDが使える様になりました。

使い方

.\trunk\docs\alpha.0.2にあるLinqToXsdOverview.docをご覧になって、中のチュートリアル通りに実行してみるのがいいでしょう。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using www.example.com.Orders;

namespace LinqToXsdSample
{
    class Program
    {
        static double CalculateTotal(Batch batch) {
            return (from puchaseOrder in batch.PurchaseOrder
                    from item in puchaseOrder.Item
                    select item.Price * item.Quantity).Sum();
        }
        
        static void Main(string[] args) {
            var batch = Batch.Load("../../XMLFile1.xml");
            var total = CalculateTotal(batch);
            Console.WriteLine(total);
            Console.Read();
        }
    }
}

完成形はこのようなコードになります。

image

肝はここで、プロジェクトに対象となるXMLのW3Cスキーマ(XSD)を追加し、そのプロパティのビルドアクションプロパティでこのように設定することで、ビルド時にXSDにあわせたクラスをジェネレートします。また、それらのクラスのネームスペースはXSDのネームスペースを引き継ぎます。(上のコードでのwww.example.com.Ordersが相当。)

また、LinqToXsdOverview.docの注意点ですが、当然のことながら新規プロジェクトの一覧には14ページにある様なLinq to XSDのセクションやそれ用のプロジェクトテンプレートなんてありませんから、中のチュートリアルを実行するためには、コンソールアプリケーションのプロジェクトを一度作って、先ほど書いた要領でそのプロジェクトファイルを修正した後でチュートリアルの内容を進めてください。

結論

素人にはお勧めしない。

がんばって製品化しようとしているところは見受けられますが、まだインストーラーすらないので一般プロジェクトに使うのには無理があります。ただコードとしての完成度はそれなりだと思いますので自分で.csprojファイルの書き換えが苦にならない人はツール作成等から使い始めてみるのがよいのではないでしょうか。

結構良いので、VS2010 SP1あたりには製品にれてくれるとうれしいかなと。

後、関係ないですが、今更VS10でXSDのエディタがVS2008での放置プレイから少しまともになったかなと言う気がします。とか言いながら自分はGUIツールあまり使わないんですけどね。

参照

<

p>LINQ to XSD – CodeProject

JimmyがMSを辞めてしまいました。

jimmy.thinking: “Start spreading the news”: the future of Jimmy and IronRuby

Though Frank Sinatra says it best, “I’m leaving today” isn’t exactly accurate; my last day as a Microsoft employee was July 23rd, 2010. This post is almost two weeks delayed as Felicia and I have been on the road since the 26th, driving cross-country to the east coast; we also decided to leave Seattle in favor of New York, our home state.

今までIronRubyチームを率いてきていて、IronRubyの顔でもあったJimmy Schementi氏がMSを辞めてしまったようです。

Blogの中ではMS内で動的言語チームの予算と規模が縮小されている話や、それにより諸々のリリースが遅れていること、この前のライセンス変更もそうした中でDLRやIronRuby、IronPythonを継続させていくために執った処置であることが書かれており、かなり衝撃的です。そして、その代わりに今愛が注がれているのがIE9のJavaScript Engineだとも。

Jimmy自身はMSを辞めNYで職を得たようです。また、社外には出るが、IronRubyのコミッティには残ってCoreに関わるとのことなので、今後の活躍に期待したいです。