読者です 読者をやめる 読者になる 読者になる

便利Tips(随時追加)

C#

・ログ解析で複数の値を検索したが、左側の検索結果行の表示のせいで

 一度にコピペできない!

正規表現: チェックオン
 検索  : 「^[^:]+: 」
 置換  : 「」

 

Outlook

 メールアカウントを新規登録時、名前を全角空白を入れると(山田 太郎みたいに)、

 そのアカウントで受信はできても送信ができなくなる。

 →一回アカウントの削除後、再度作成すること。(名前を山田太郎にして)

 

 ファイルサーバのフォルダへのアドレスをメールに記載すると、

 リンクが中途半端で切れてしまう

 →挿入タブ→ハイパーリンクで文字列欄にリンクを記載する

 

SQL SERVER

 DBにIPアドレスを指定してアクセスする方法

 SQL SERVERの構成マネージャ→ネットワークの構成→TCP/IPを無効にする

 SQL SERVERのサービスで、上二つを再起動

 

コマンドプロンプトで該当ディレクトリを開く方法

start.

 

・動的共通プロパティのサンプルをつくてみる

xsd デシリアライズ C#

 

・引数なしでメソッドを呼んでいるのにエラーが出る

→まずはメソッドの中身をコメントアウトにして呼べるか確認

 呼べたらメソッドの中身でアクセスできない何かがある可能性あり。

 呼べなかったら別スレッドの影響の可能性あり

 

・画面終了時に暗黙的な例外が発生していないか確認する方法

 デバッグ実行中にビルド→例外で、Common debug~をチェックON

 

・現在動いているスレッドを確認する方法

 デバッグ→ウィンドウ→スレッド

 

ソースコードの保守性、コード行数チェック

 コードメトリクスを計算する

 

・ログにlog4netを使用しているが、エラー行数が表示されない!

 pdbファイルがないと行数が表示されない。

 

・デリゲートの使い方

 ・イベントハンドラで任意のデータを引数として渡したい場合

  引数を決めてデリゲート宣言

    public delegate void HogeDelegate(object sender, event e);

  型として使用して宣言

    public event HogeDelegate 変数名;

  イベント登録

    変数名 += イベント時に呼ぶメソッド;

  後はメソッドとして呼ぶだけ。

 

 ・参照元により処理を臨機応変に変更したい場合

  引数を決めてデリゲート宣言

    public delegate void HogeDelegate(int x, int y);

  デリゲートのインスタンス生成(イベントごとに変更)

    HogeDelegate delegate = new delegate(CalcPlus);

    HogeDelegate delegate = new delegate(CalcMinus);

  デリゲート集約用のメソッドに引数として渡す

    shuyakuMethod(delegate, 1, 2);

  デリゲート集約用のメソッドで共通処理があれば記載する

  デリゲート集約用のメソッドでデリゲートを呼ぶ

    delegate(1,2);

 

・サブスレッドからメインメソッドに委譲したいときの書き方

this.Invoke( (MethodInvoker)delegate

{

 //やりたい処理

}

 

Excelの参照がやけに長いので短くしたい場合

using Excel = Microsoft.Office.Interop.Excel;

 

・マルチディスプレイで左側にディスプレイをおきたいのに、

 マウスポインタが繋がるのが右がわなのを直す方法

 ⇒デスクトップ右クリック⇒グラフィックプロパティ⇒マルチディスプレイ

  ⇒位置調整

 

・条件付書式 行ごとに色を変える方法

 適用先

 = $B$15:$N:$119

 ⇒予め適用先は広く取っておかないと、後で増減した場合に対応出来ない

 数式

 =OR($E15="○",$F15="○")

・全てのシートを再表示する方法
 Excel⇒Alt+F11⇒イミディエイトウインドウで以下のコードを入力し、Enter
 for each s in sheets:s, vsible=true : next

・終わったプロジェクトでチェックアウトしたままのやつが何かの拍子にチェックインされてしまった
 ⇒終わったプロジェクトは、ソースフォルダごと別途コピーした後、フォルダの割り当てを解除しておく

・マージツールでマージが出来ない場合
 読み取り専用になっている可能性あり。
 ファイル⇒右の読み取り専用をクリックして読み取り専用を外してからマージ

・TFSのユーザーを変更する方法
 事前に、TFSを切断し、Visual Studioを閉じておくこと
 コントロールパネル\すべてのコントロールパネル項目\資格情報マネージャ\Windows 資格情報の追加
 Windows資格認証に以下のように瀬亭
 アドレス:TFSのアドレス内部 例)http://example/~の場合、exampleのみ設定
 ユーザー名:新たに設定したいユーザー名
 パスワード:新たに設定したいパスワード
 ⇒Visual Studioを起動して、TFSに接続し、接続ユーザー名に期待値が出ていることを確認する

・Vsisual Studio BackGroundWorker.DoWorkでの例外をCompletedで補足できない
 ⇒Doworkで処理中に出た例外をDoWorkスレッドないでキャッチしてしまうと、例外として認識されない。

・Visual Studio 色を元に戻す方法
 オプション⇒環境⇒全般
 で配色テーマをBLUEに変更

・Visual Studio プロジェクトのすべての項目がソース管理項目になっているかチェックする方法
 TFSからソース管理エクスプローラーを開く
 ⇒既存の項目が追加されていない場合、一つ上のフォルダを選択し、右クリック⇒項目をフォルダに追加
 ⇒チームエクスプローラ⇒保留中の変更で追加したい項目が表示されていることを確認し、コミット

・Visual Studio オフラインになったソリューションをオンラインに戻す方法
 ⇒ソリューションを右クリック⇒オンラインにする

・Visual Studio 2012のソース選択時のプレビュー表示をなくす
 ⇒ソリューションエクスプローラないで何かを選択⇒ソリューションエクスプローラー右上の選択された項目のプレビューボタン(?)を解除

・HttpResponseMessageを何ドンも出力できるようにする
 HttpResponseMessage.Content.LoadIntoBufferAsync();

・OutOfMemoryなくHttpResponseMessageを送信する方法
 context.Response.Clear();
 context.Response.ContentType = "application/json";

 using(var fs = new FileStream(@"C:\test\jsonData.json", FileMode.Open, FileAccess.Read))
 {
   fs.CopyTo(context.Response.OutputStream);
 }
 context.Response.End();

・Excel 日付の間隔(日数)を取得する方法
 =DATEDIF("2014/1/1", "2014/2/1", "D")

・ファイルサーバー上のエクセル表示がやけに遅い
 オプション⇒セキュリティーセンター⇒セキュリティーセンターの設定⇒信頼できる場所
 「プライベート ネットワーク上にある信頼できる場所を許可する」をチェック

・JSON取得処理 JSONファイルはログとしてローカルに残せるよう、受け取ったデータは一度ファイルとして保存
 JSONファイルを取得
 using(var streamReader = new StreamReader(filestream))
 JSONファイルの中身を順次読み来い
 using(var reader = new JsonTextReader(streamReader))
 JSONファイルの内容を読み込み
 while(reader.Read())
 JSONファイルの階層判定
 if(reader.Depth < 1)
 JSONファイルのデータを読み込み
 accountType = JObject.ReadFrom(reader);
 JSONファイルを読み込んでデータがあったか判定
 if(accountType != null && accountType.HasValues)
 JSONファイルを変換
 JsonConvert.DeserializeObject<List<string>>(acccountType.Tostring());

・C# Excelファイルの保存形式
 swith(Path.GetExtension(filePath) //filePath ...拡張子付
 {
   Case ".xlsm":
     tempWorkSheet.SaveAs(ファイルパス,ExcelXlFileFormat.XlOpenXMLWorkbookMacroEnabled);
     break;
   Case ".xlsx":
     tempWorkSheet.SaveAs(ファイルパス,ExcelXlFileFormat.XlOpenXMLWorkbook);
     break;
   Case ".xls":
     tempWorkSheet.SaveAs(ファイルパス,ExcelXlFileFormat.XlExcel8);
     break;
   Case ".pdf":
     tempWorkSheet.ExportAsFixedFormat(Excel.XlFixedFormatType.xlTypePDF, Path.ChangeExtensio(filepath, ".pdf"));
     break;
 }

・Excelファイルの行挿入、列挿入
//次の行のセル指定用カウント
iStartCount = 1;

//現在の範囲と、最大範囲のRangeを取得する
tempWorkSheet.get_Range(nameDefSheet + rangeName);

//結合されているか判定
if(true.Equals(currentRange.MergeCells))
{
    //セル範囲が結合セルの場合
    currentRange = currentRage.MergeArea;
}

// 上記をCurrentRange,MaxRangeの両方で実施する

//MaxRangeに結合セルがある場合、セル数を修正する(例)3列分結合されたセルのセル数を1セルとしてカウントできるようにする)
foreach(ExcelRange maxCellRng in maxRange.Cells)
{
    if(maxCellRng.MergeCells && iSkipRngeCount = 0)
    {
        if(ExeCuteTye == ExecuteRowColType.Col)
        {
            //結合セル数-1(現在セル分)
            Excel.Rnge rnge = maxCellRng.MergeArea;
            iMaxRangeColumnsCount -= rnge.Columns.Count -1;
            iSkipRangeCount = rnge.Count -1;
        }
        else if(ExeCuteType == ExecuteRowColType.Row)
        {
            //結合セル数-1(現在セル分)
            Excel.Rnge rnge = maxCellRng.MergeArea;
            iMaxRangeRowsCount -= rnge.Rows.Count -1;
            iSkipRangeCount = rnge.Count -1;
        }
        continue;
    }
    if(iSkipRangeCount != 0)
    {
        iSkipRageCount-;
    }
}

//行が挿入対象の場合
if(ExeCuteType == ExecuteRowColType.Row && iMaxRangeRowsCount < iDataCount)
{
    int insrtRowsCount = iDataCount - ImaxRangeRowsCount;
    
    //(次の行のセル:次の行のセル+セル範囲)を取得(名前の定義がずれないように最初の行は仕様しない) 例)1行目と2行目が結合セルの場合、{3:4}を取得
    //(iStartCount * currentRange.Rows.Count)は、単に次の行にするために+1だけすると、結合セルの場合に次の行を指定できない為
    Excel.Range rngSrce = tempWorkSheet.get_Range(string.Format("{0}:{1}", currentRange.Row + (iStartCount * currentRange.Rows.Count), currentRange.Row + (iStartCount * currentRange.Rows.Count) + currentRange.Rows.Count - 1), Missing.Value);

    //次の行のセル:次の行のセル+挿入する件数-1 +セル範囲を取得
    Excel.Range rngDest = tempWorkSheet.get_Range(string.Format("{0}:{1}", currentRange.Row + (iStartCount * currentRange.Rows.Count), currentRange.Row + ((iStartCount + insrtRowsCount -1) * currentRange.Rows.Count) + currentRange.Rows.Count - 1), Missing.Value);

    Logger.Report.Info(string.Format("{0}件行挿入を行います。", insrtRowsCount));

    rngSrce.Copy();
    rngDest.Insrt(ExcelXlInsertShiftDirection.xlShiftDown);
}
    
//列が挿入対象の場合
    if(ExeCuteType == ExecuteRowColType.Col && iMaxRangeColumnsCount < iDataCount)
    {
        int insrtColsCount = iDataCount - ImaxRangeColumnsCount;
        
        // 次の列のセルを取得
        Excel.Range rngSrc = tempWorkSheet.Cells[currentRange.Row, currentRange.Column + (iStartCount * currentRange.Columns.Count)];

        if(true.Equals(rngSrc.MergeCells))
        {
            // セル範囲が結合セルの場合
            rngSrc = rngSrc.MergeArea;
        }

        //列全体を取得
        rngSrc = rngSrc.EntireColumn;
        string[] src = rngSrc.Address.Split(':');

        // 次の列のセル数+挿入する件数-1を取得
        //-1は現在のセル数分だけ引く為
        Excel.Range rngDest = tempWorkSheet.Cells[currentRange.Row, (currentRange.Column + currentRange.Columns.Count -1) + ((iStartCount + insrtColsCount - 1) * currentRange.Columns.Count)];
        if(true.Equals(rngDest.MergeCells))
        {
            // セル範囲が結合セルの場合
            rngDest = rngDest.MergeArea;
        }

        // 列全体を取得
        rngDest = rngDest.EntireColum;
        string[] dst = rngDest.Address.Split(':');
        //貼り付け範囲取得
        Excel.Range rngPasteDest = tempWorkSheet.get_Range(string.Format("{0}:{1}", src[0], dst[1]));

        Logger.Report.Info(string.Format("{0}件列挿入を行います。", insrtColsCount));

        rngSrc.Copy();

        // 列挿入
        rngPasteDest.Insert(Excel.XlInsertShiftDirection.xlShiftToRight);

    }

・画面ちらつき対策
    formをShowする前にthis.Opacity = 0.0;
    formのPaintイベントでthis.Opacity = 1.0;


・vbsでxmlを編集するサンプル
    Set objXML = CreateObject("Msxml2. DOMDocument. 3.0")
    objXml.SelectNodes("//configuration/applicationSettings/Application/setting[@name = 'CompanyID'/value")
    for each objNode in objList
        objNode.Text = "0B09"
    next

・vbs 2階層上のフォルダパスを取得
    'C:\test1\test2\test.txt
    '[C:\test1\test2]を取得
    strFilePath = Left(Wscript.ScriptFullName.InstrRev(Wscript.ScriptFullName, "\") -1)
    '[C:\test1\]を取得
    strFilePath = Left(strFilePath, InstrRev(strFilePath, "\"))

・datagridviewを多段表示
    普通にdatagridviewを二つ作って、一つはヘッダとしてのみ使えばいい

・ジェネリックハンドラを途中で停止させる方法
    タスクトレイアイコンにある、IIS Expressから、指定のアドレスを停止処理する

・webapiの作り方
    asp.net mvb4 webアプリケーションを指定
    次のメニューでWEBAPIを選択

    例)api/v1/IcDtlReserve.jsonで接続したい場合
    app_start/webapiconfig.csのdefaultを変更
    config.Routes.MapHttpRoute(
        name: "DefaultApi", 
        routeTemplate: "api/{controller}/{action}/{id}", 
        defaults: new { id = RouteParameter.Optional, action = RouteParameter.Optional}
        );

    Controllers/v1Controller.csを作成
    [ActionName("IcDtlReserve.json")]
    public void PutTest()
    {
        var context = Request.Properties["MS_HttpContext"] as HttpContextWrapper;
        context.Response.Clear();
        context.Response.ContetType = "application/json";
        using(var fs = new System.IO.FileStream(@"C:\test.txt", System.IO.FIleMode.Open, System.IO.FileAccess.Read))
        {
            fs.CopyTo(context.Response.OutputStream);
        }
        context.Response.End();
    }

・他コントロール遷移jに遷移元の値をチェックする方法
    Leaveイベント

・SHIFT+DELETEで削除してしまったファイルを元に戻す方法
    削除してしまったフォルダ名で新しいフォルダーを作成する
    フォルダを選択して、整理⇒プロパティ⇒以前のバージョンの検索

・和暦を表示する方法
    gggee""mm""dd""

・Entity Frameworkでの値の取得方法
    データ読み出し高速化⇒AsNoTracking()
    IEnumerable<IEnumerabl<Town>> towns = dbContext.Towns.AsNoTracking.Orderby(t => t.TownID).Batch(200000);

    outofMemory対策
    ⇒EntityDataReaderを使用して1行ずつ取得

・Entity FrameWorkで今まで接続していた接続先以外のオブジェクトを取得する方法
    ⇒既存DBをバックアップしてから削除する
     VSが自動的に検索しに行き、ダメな場合に接続先変更画面が出る

・プロジェクトでのバージョン管理方法
    元からある各プロジェクト-AssemblyInfo.csのAssemblyVersion,AssemblyFileVersionをコメントアウト
    ⇒SharedAssemblyInfo.csで、[assembly: AssemblyVersion("0.1.0")]と
     [assembly: AssemblyFileVersion("0.1.0.0")]を定義し、
     すべてのプロジェクトのProperty内にリンクを追加(既存の項目を追加で、追加するときのメニューでリンクとして追加を選択)

・AテーブルとBテーブルに同じカラム名がある場合のよくある間違い
    ⇒A.NAME = A.NAMEってやってるのと同じ
    SELECT
    (
        SELECT
            TOP 1 A.NAME
        FROM
            A
        WHERE
            A.NAME = NAME
    )
    FROM
        B

・クラスの名前をそのまま文字列として出力する
    typeof(クラス名(テーブル名のクラスとか).Name
    ⇒どのテーブルを使用しているかとかのログを取得する際に使用

・結合セルの場合でも数式を使用できるようにする方法
 (見かけ上結合セルのように見せる方法)
    例)A1とB1セルを結合したように見せたい場合
    1.セル結合したセルを結合した状態で別のところにあらかじめコピーしておく
    2.合計列のセルを解除
    3.B1に=A1と記載
    4.1でコピーしていたセルを書式のみコピー

・Excelあるあるーデータの数も件数もあってるのに合計値が違う場合
    数値が文字列として設定されていないか確認する

・設計時に気を付けること
    DB
        トランザクションが必要な個所(CRUD)の検討と、トランザクションを張る処理の範囲の検討
    処理のブレークダウン、処理の整合性、流れ
    1:N
        例)1行のデータをDBに設定する際、設定するデータに一つでもエラーだったらそこで処理を終わらせてエラーを吐くのか、
          1行のデータをすべてチェックして問題があるものをすべてエラーとして吐くのか
            ⇒前者の場合、一つエラーを取り除いても同じ行のほかの個所で又エラーになるので、
             ユーザビリティ的に問題。
・開発時に気を付けること
    DB
        トランザクションの張り方。自動トランザクションの検討。
        データベース接続エラー、プライマリーキー違反、外部キー違反
    ソースコード
        全体
            型変換への注意。null参照等が発生しないよう注意

        例外対応
            例外は、アプリケーションエラーやシステムエラーの場合に限り、利用する。 
            例外は、基本的にユーザアプリケーション内ではtry-catchをせず、ランタイムの持つ集約例外ハンドラの機能によって後処理する。

        エラー対応
            エラー時の直前操作内容(画面入力内容)のほかに、どのような処理を行ったか(画面遷移、実行内容)のログ取得