ほのぼの C#開発

開発の基礎から、現場で使用できるC#を掲載していきます。

C# Reshaperについて

ReShaperについて

JetBrains社がだしているコーディングの生産効率を向上させるツール紹介。

試用版もあるので試す価値あり。購入して使用していますが、使いやすい♪

※2ヶ月間無料で使用する可能です。

 

使用感

・コードのエラーや問題をオンザフライでハイライトしてくれて便利

・検索がしやすい

リファクタリングがしやすい

かゆいところに手が届く

 

海外サイト

ReSharper: Visual Studio Extension for .NET Developers by JetBrains

日本語サイト

ReSharper | 株式会社サムライズム

C# VisualStudioのダウンロード

VisualStudio 2005

Visual Studio 2005 評価版
http://www.microsoft.com/japan/msdn/vstudio/2005/trial/default.aspx
 
Visual Studio 2005 Team Suite 評価版 (日本語版)
http://download.microsoft.com/download/7/6/0/76066F72-013F-4F3C-A47F-BFC7EA897554/jpn_vs_2005_VSTS_180_Trial.img
 
Visual Studio 2005 Professional Edition 評価版 (日本語版)
http://download.microsoft.com/download/A/1/1/A11D789B-E29F-499B-BCC1-1D149B0B27BE/jpn_vs_2005_Pro_90_Trial.img
 
Visual Studio 2005 Express Edition
http://web.archive.org/web/20080410092136/http://www.microsoft.com/japan/msdn/vstudio/express/maninstall/
 
Visual Web Developer 2005 Express Edition 日本語版 586,284 KB 0xDF626AA6
http://download.microsoft.com/download/C/E/6/CE6B9F63-0E29-4560-A262-5EE8BCDB1E33/vwd.iso 
 
Visual Basic 2005 Express Edition 日本語版 578,722 KB 0x6EE067F9
http://download.microsoft.com/download/A/B/4/AB4DA3D7-CC3A-4081-9FC8-E35653E85499/vb.iso
 
Visual C# 2005 Express Edition 日本語版 575,234 KB 0xCE838830
http://download.microsoft.com/download/9/5/7/9576E49E-1EDA-486B-9543-E0B0A5ABBF16/vcs.iso
 
Visual C++ 2005 Express Edition 日本語版 611,540 KB 0xB3AD1A2F
http://download.microsoft.com/download/8/E/8/8E85D539-2255-4CFD-AA97-440AE6C6F44A/vc.iso
  

VisualStudio 2008


Visual Studio Team System 2008 Team Suite (90 日間評価版)
http://download.microsoft.com/download/a/5/d/a5d4f8a7-8a7a-4acf-b55a-58f9588517/VS2008TeamSuite90DayTrialJPNX1429236.part1.exe
http://download.microsoft.com/download/a/5/d/a5d4f8a7-8a7a-4acf-b55a-4258f9588517/VS2008TeamSuite90DayTrialJPNX1429236.part2.rar
http://download.microsoft.com/download/a/5/d/a5d4f8a7-8a7a-4acf-b55a-4258f9588517/VS2008TeamSuite90DayTrialJPNX1429236.part3.rar
http://download.microsoft.com/download/a/5/d/a5d4f8a7-8a7a-4acf-b55a-4258f9588517/VS2008TeamSuite90DayTrialJPNX1429236.part4.rar
http://download.microsoft.com/download/a/5/d/a5d4f8a7-8a7a-4acf-b55a-4258f9588517/VS2008TeamSuite90DayTrialJPNX1429236.part5.rar
http://download.microsoft.com/download/a/5/d/a5d4f8a7-8a7a-4acf-b55a-4258f9588517/VS2008TeamSuite90DayTrialJPNX1429236.part6.rar
http://download.microsoft.com/download/a/5/d/a5d4f8a7-8a7a-4acf-b55a-4258f9588517/VS2008TeamSuite90DayTrialJPNX1429236.part7.rar

 
Visual Studio 2008 Professional Edition (90 日間評価版)
http://download.microsoft.com/download/1/4/2/142ddd0b-993b-42ef-8041-edfa2bb736f5/VS2008ProEdition90dayTrialJPNX1435988.iso
 
Visual Studio 2008 Express Edition
http://download.microsoft.com/download/f/a/6/fa693f60-97d1-44eb-ac7f-6a44ac42b10e/VS2008ExpressJPNX1428694.iso
 
Visual Studio 2008 Express Edition SP1
http://download.microsoft.com/download/6/f/1/6f161d1a-e893-4bfa-a53a-af6b0d56a55d/VS2008ExpressWithSP1JPNX1504866.iso

 

VisualStudio 2010


Microsoft Visual Studio 2010 Ultimate 試用版
http://download.microsoft.com/download/9/0/3/903103D7-976D-40E7-A391-B0901330D790/VS2010UltimTrialJPN_4PartsTotal.part1.exe
http://download.microsoft.com/download/9/0/3/903103D7-976D-40E7-A391-B0901330D790/VS2010UltimTrialJPN_4PartsTotal.part2.rar
http://download.microsoft.com/download/9/0/3/903103D7-976D-40E7-A391-B0901330D790/VS2010UltimTrialJPN_4PartsTotal.part3.rar
http://download.microsoft.com/download/9/0/3/903103D7-976D-40E7-A391-B0901330D790/VS2010UltimTrialJPN_4PartsTotal.part4.rar 
 
Microsoft Visual Studio 2010 Professional 試用版
http://download.microsoft.com/download/6/6/C/66C3A4E9-59BC-4410-B453-E2008EC2D3CE/VS2010ProTrialJPN_4PartsTotal.part1.exe
http://download.microsoft.com/download/6/6/C/66C3A4E9-59BC-4410-B453-E2008EC2D3CE/VS2010ProTrialJPN_4PartsTotal.part2.rar
http://download.microsoft.com/download/6/6/C/66C3A4E9-59BC-4410-B453-E2008EC2D3CE/VS2010ProTrialJPN_4PartsTotal.part3.rar
http://download.microsoft.com/download/6/6/C/66C3A4E9-59BC-4410-B453-E2008EC2D3CE/VS2010ProTrialJPN_4PartsTotal.part4.rar
 
Visual Studio 2010 Express
http://download.microsoft.com/download/4/e/6/4e61e454-1de7-4b70-860b-13282de65d6b/VS2010ExpressJPN.iso

 

VisualStudio 2012

Visual Studio Ultimate 2012 日本語版 90日試用版
http://download.microsoft.com/download/8/A/5/8A5FC9B0-1328-47B7-A2BD-03B3C9595F91/VS2012_ULT_jpn.iso

Visual Studio Premium 2012 日本語版 90日試用版
http://download.microsoft.com/download/F/F/D/FFDA9418-4CB9-4744-9157-AC0B65EA7E64/VS2012_PREM_jpn.iso

Visual Studio Professional 2012 日本語版 90日試用版
http://download.microsoft.com/download/4/7/5/475E87C2-E0B9-4800-BB79-EDD61B09F4A9/VS2012_PRO_jpn.iso

Visual Studio Test Professional 2012 日本語版 90日試用版
http://download.microsoft.com/download/E/4/D/E4D97711-BB42-4C88-AB35-6CE2A20B203A/VS2012_TESTPRO_jpn.iso

Microsoft Visual Studio Express 2012 for Web
http://download.microsoft.com/download/7/E/E/7EE8655E-85F2-493A-BFFC-B55A4DE3B432/VS2012_WebExp_jpn.iso

Microsoft Visual Studio Express 2012 for Windows 8
http://download.microsoft.com/download/8/A/F/8AF985D6-25BE-454E-BF2C-9A4BABD4B938/VS2012_WINEXP_jpn.ISO

Microsoft Visual Studio Team Foundation Server Express 2012
http://download.microsoft.com/download/4/0/E/40E83F38-6096-4441-BF31-0031965323C1/VS2012_TFS_EXP_jpn.iso

C# シリアライズとでシリアライズ

シリアライズ デシリアライズについて

 

オブジェクトのディープコピーに用いたりする。

 

シリアライズ

/// <summary>
/// シリアライズを行います。
/// <typeparam name="T">オブジェクトのタイプ </typeparam>
/// <param name="filePath">ファイルパス</param>
/// <returns>
/// 対象ファイルから復元したデータ
/// </returns>
public static void Serializea<T>(string filePath, T source)
{
      bool isSuccess = false;

    try
    {
       XmlSerializer serializer = new XmlSerializer(source.GetTpype());

        using (StreamWriter sw = new StreamWriter(filePath))
        {
            Serializer.Serialize(sw, source);
        }

       isSuccess = true;


    }
    catch (Exception ex)
    {
        // エラー処理
    }

    return isSuccess ;
}
‌ 
‌ 

シリアライズ

 /// <summary>
/// デシリアライズを行います。
/// </summary>
/// <typeparam name="T">オブジェクトのタイプ </typeparam>
/// <param name="filePath">ファイルパス</param>
/// <returns>
/// 対象ファイルから復元したデータ
/// </returns>
public static bool  T Deserialize<T>(string filePath,ref T source)
{
    bool isSuccess = false;

    try
    {
       XmlSerializer serializer = new XmlSerializer(source.GetTpype());

        using (StreamReader sr = new StreamReader(filePath))
        {
            source = (T)Serializer.Deserialize(sr);
        }

       isSuccess = true;


    }
    catch (Exception ex)
    {
        // エラー処理
    }

    return isSuccess ;
}

 

シリアライズ対象のオブジェクト

属性を付与してシリアライズできるようにする。

 [System.Xml.Serialization.XmlRootAttribute("Company")]
    public class Company
    {
‌ 
        [System.Xml.Serialization.XmlAttributeAttribute("CompanyName")]
        public String CompanyName = String.Empty;
‌ 
        [System.Xml.Serialization.XmlElementAttribute("Customer")]
        public List<Customer> Customers = null;
‌ 
        public class Customer
        {
‌ 
            [System.Xml.Serialization.XmlElementAttribute("Name")]
            public String Name = String.Empty;
‌ 
            [System.Xml.Serialization.XmlElementAttribute("Job")]
            public String Job = String.Empty;
        }
‌ 
    }
‌ 
[XmlRootAttribute("ActionUISetup")]
public class ActionUISetup {
‌ 
    [XmlArrayAttribute("menulists")]
    [XmlArrayItemAttribute("menulist")]
    public MenuListSetup[] MenuLists;
}
‌ 
public class MenuListSetup {
‌ 
    [XmlAttribute("name")]
    public string Name;
‌ 
    [XmlArrayAttribute("items")]
    [XmlArrayItemAttribute("item")]
    public MenuItemSetup[] Items;
}
‌ 
public class MenuItemSetup {
‌ 
    [XmlElementAttribute("text")]
    public string Text;
‌ 
    [XmlElementAttribute("action")]
    public string Action;
‌ 
}

 

C# APサーバの負荷分散

負荷分散について

 複数人が同時にサーバーへアクセスしたい際に、サーバへの負荷がかかるため、ロードバランサを用意して、複数台のサーバを設置して負荷を下げる。

 

 現状  :サーバ1台

 負荷軽減:サーバ複数台、ロードバランサ

 

問題点

クライアントから要求があり、サーバで保持していた一時的なファイルへのアクセスができなくなる可能性がある。

※必ずしも指定のAPサーバにアクセスできるとは限らないため。

 

対応方法として

対応策として、

一時的なファイルへのアクセスはサーバーでリダイレクトによってアクセスする。

 ※サーバー1⇒サーバ2の一時ファイルを取得する

ファイル共有サーバーを設置して、一時ファイルは格納するようにする。

  

ファイルサーバーを設置した場合

 一番簡単な方法は、シンボリックリンクを使用することで簡単に解決することができる。

 1.管理者権限の「コマンドプロンプト」を実行する。
 2.シンボリックリンクを設定する

mklink /d C:\Web\hoge\downloads \\192.168.1.XXX\downloads

シンボリックリンク
シンボリックリンクとは特定のファイルやディレクトリを、それらを指名するファイルを作成してOSの別の場所から参照することのできる仕組みのことです。

SQLServer TempDbのラッチ状況

TempDBについて

SQLサーバーでTempDbを使用すると、サイズが足りない場合に自動的に拡張します。

その際に、ラッチ(オブジェクトの保護)が発生して、他の処理が待機状態になる可能性があります。

 

ラッチは、SQLサーバーの利用モニタで確認できます。

ラッチ状況の確認SQL 

SELECT 
        CASE 
            WHEN [wait_type] LIKE N'LATCH%'     THEN N'Non_Buffer_Latch'
            WHEN [wait_type] LIKE N'PAGELATCH%' THEN N'Buffer_Latch'
            WHEN [wait_type] LIKE N'PAGEIOLATCH%'   THEN N'Buffer_Latch'
        END AS [type]
        ,* 
    FROM sys.dm_os_wait_stats
    WHERE  [wait_type] LIKE N'LATCH%' 
      OR    [wait_type] LIKE N'PAGELATCH%' 
      OR    [wait_type] LIKE N'PAGEIOLATCH%' 

C# SQLServerでBulkCopyして高速化

大量のデータをInsertする場合、SQLサーバとの通信がSQLの実行のたびに時間がかかってしまう。

 

1万件のデータをInsert

  1. Insertを1件毎に実行:98.32秒
  2. Insertを1000件毎に実行:15.34秒
  3. Bulkを使って1000件たまったら実行:0.57秒

BulkCopyを使用すると、速度改善

 データテーブルをそのままInsertすることで20倍以上の速度改善が見込まれる。

 SqlBulkCopy Class (System.Data.SqlClient) | Microsoft Docs

 C# bulkcopy to SQL Server - Stack Overflow

 

では、1万件をUpdateしたい場合はどうするか?

2通り

 ・すべて同一の値で更新する場合は、Update分1回で実行

 ・BulkCopy

 

前者は詳細省く。

 

BulkCopyでUpdate

 Tempテーブルにデータを一時的にInsertして、ストアド一括更新(フェッチで回す)

 2回SQLが実行される。

 通信のコストが安くなり、効率化。

 

 Tempテーブルの種類

 ・ローカル一時テーブル:トランザクション内で有効なテーブル(#テーブル名)

 ・グローバル一時テーブル:すべてのユーザで使用できるテーブル(##テーブル名)

 ※一時テーブルを参照するすべてのユーザーのセッションが切断されると削除されます。

 

 今回使用するのは、ローカル一時テーブル。

CREATE TABLE #TempTable(
     COL1 varchar(10)
    ,COL2 varchar(10)
)

 

 ※Tempテーブルを使用する際は、SQLサーバのTempDbの容量の設計が必要です。

 最大サイズを超えると容量が自動的に拡張されるため、ラッチが発生します。

 https://technet.microsoft.com/ja-jp/library/ms175527(v=sql.105).aspx

 

BulkCopyのコード

 トランザクション内でTempテーブルを作成して、データを挿入する。

トランザクションを抜けるとTempテーブルは削除されます。

DataTable dt = new DataTable("Employees");
dt.Columns.Add("Name");
dt.Columns.Add("LastName");

foreach (var employee in context.Employees.AsEnumerable())
{
    dt.Rows.Add(employee.Name, employee.LastName);
}

Console.WriteLine(dt.Rows[0]["Name"]);

Console.WriteLine("Loading data into SQL");

using (SqlConnection conn = new SqlConnection("user id=<ID>;" +
                                              "password=<Password>;server=<Server>;" +
                                              "Trusted_Connection=yes;" +
                                              "database=<DB>; " +
                                              "connection timeout=30"))
{
    using (SqlCommand command = new SqlCommand("", conn))
    {
        try
        {
             conn.Open();

             // Creating temp table on database
             command.CommandText = "CREATE TABLE #TmpTable(...)";
             command.ExecuteNonQuery();

             // Bulk insert into temp table
             using (SqlBulkCopy bulkcopy = new SqlBulkCopy(conn))
             {
                 bulkcopy.BulkCopyTimeout = 660;
                 bulkcopy.DestinationTableName = "#TmpTable";
                 bulkcopy.WriteToServer(dt);
                 bulkcopy.Close();
             }
         }
         catch (Exception ex)
         {
             Console.WriteLine("Bulk load to SQL failed");// Handle exception properly
         }
         finally
         {
             conn.Close();
             Console.WriteLine("table loaded into SQL");
         }
     }
}