redwarrior’s diary

C#, ASP.NET, WEB, G*などの雑多な情報

TFSの新しいビルド実行時にWebデプロイも行う

XAMLでない方の新しいビルドが成功したので、Webデプロイも試してみた。

どこに書いてあったか忘れたが、MSBuild引数を設定する事で、Webデプロイが出来るらしいので、やってみた。

f:id:redwarrior:20180905150001p:plain

上の画像の MSBuild引数のところに、XAMLビルドで設定していた引数を設定する。

設定した値:

/p:DeployOnBuild=True /p:PublishProfile="プロファイル名" /p:Password="パスワード"

ビルドステップとしては、「Visual Studioのビルド」でデプロイされるが*1発行できた。

以上。

*1:そのため、発行後にテストが実行される

Excel読込でNPOIをEPPlusのように使うため拡張メソッドを作成した

なぜEPPlusを直接使わないかは、過去の記事を参照。

redwarrior.hateblo.jp

NPOIを直接使うと、同じようなコーディングを繰り返し行う事が結構あったので、拡張メソッドを作成しました。
EPPlusを参考にしたメソッドや、あると便利そうなメソッドを作りました。

public static class NPOIExtension
{
    //GetCell("K21")のようにセルを指定できる
    public static ICell GetCell(this ISheet sheet, string cellRef)
    {
        var cellReference = new CellReference(cellRef);
        return sheet.GetRow(cellReference.Row).GetCell(cellReference.Col);
    }

    //GetCellRange("A3:F80")のようにセルの範囲を指定できる
    public static IList<ICell> GetCellRange(this ISheet sheet, string rangeRef)
    {
        var cells = new List<ICell>();
        var cellRangeAddress = CellRangeAddress.ValueOf(rangeRef);
        for (var i = cellRangeAddress.FirstRow; i <= cellRangeAddress.LastRow; i++)
        {
            for (var j = cellRangeAddress.FirstColumn; j <= cellRangeAddress.LastColumn; j++)
            {
                var cell = sheet.GetRow(i).GetCell(j);
                cells.Add(cell);
            }
        }

        return cells;
    }

    //Cellの値が空の場合は、0ではなくnullを返し、それ以外は int を返すメソッド
    public static int? IntOrNull(this ICell cell)
    {
        switch (cell.CellType)
        {
            case CellType.Formula:
            case CellType.Numeric:
                //NumericCellValueプロパティの取得時に関数が評価される
                //関数の評価結果は、数値として扱う
                return Convert.ToInt32(cell.NumericCellValue);
            case CellType.Blank:
                return null;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }

    //Cellの値が空の場合は、0ではなくnullを返し、それ以外は decimal を返すメソッド
    public static decimal? DecimalOrNull(this ICell cell)
    {
        switch (cell.CellType)
        {
            case CellType.Formula:
            case CellType.Numeric:
                //NumericCellValueプロパティの取得時に関数が評価される
                //関数の評価結果は、数値として扱う
                return Convert.ToDecimal(cell.NumericCellValue);
            case CellType.Blank:
                return null;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }
}

以上です。

(小ネタ)拡張メソッドを使用する場合も、Nullチェックは必要です!

IEnumerableインターフェイスのAnyメソッドを使用した時に、変数の値がnullでエラーになった。Anyメソッドは拡張メソッドなので、変数がnullでエラーになるのはおかしいのでは?と思ったが、答えは意外なところに。

C#で変数の値がnullで落ちる場合に投げられる例外は、System.NullReferenceException である。

それで、今回投げられた例外を良く見てみると、System.ArgumentNullException であった。これは、引数がnullだったら投げる例外なので、つまり拡張メソッドの中でnullと判定されて投げられた例外だったということ。

基本的な事でした。拡張メソッドを使用する場合も、nullチェックは必要という事ですね。

はてなブログをhttps化しました。

id:kazuakix さんの以下の記事を読んで、id:shiba-yan さんや id:tanaka733 さんもhttps化をおすすめしていたので、当ブログもhttps化してみました。

blog.kazuakix.jp

サイドバーのカスタマイズ等はしていなかったので、ほとんど対応は不要だと思っていましたが、混在コンテンツ(Mixed Content)のブロックが発生しました。

開発者ツールで確認すると、bootstrap の css の参照先が、http になっているとのこと。

css の指定をした覚えは無いのでテーマだろうと予想して、公式テーマで似た感じのものに変更したところ、混在コンテンツの表示がなくなりました。

これでアクセスが増えるといいなあ。

Team Foundation Server のXAMLでない方のビルド定義の作成・実行を1から解説する

前回からあっという間に2か月以上たってしまった。細く長くがんばろう。
2015以降のTFSではXAMLビルドは推奨されない*1方式になるので、新しいビルド環境の構築を試してみた。

環境:Team Foundation Server 2015 Update 4、Windows Server 2012SQL Server 2012

目次

  • プールの追加
  • 権限の設定
  • エージェントのインストール
  • エージェントの起動
  • ビルド定義の作成
  • ビルドの実行
  • 感想
  • 参考資料

プールの追加

画面上から歯車アイコンを押して、コントロール パネル画面に遷移する。

f:id:redwarrior:20180808111646p:plain

コレクション管理ページの表示をクリックして、コレクションのプロファイル画面に移動する。

f:id:redwarrior:20180808114633p:plain

エージェントキュータブをクリックする。新しいプールとキューを作成するために、新しいキューリンクをクリックする。

f:id:redwarrior:20180808115714p:plain

ダイアログで「新しいプールの作成」ラジオボタンを選択し、プール名に名前(今回は「VSPool」とする)を設定する。(上記画像は既に作成済)

f:id:redwarrior:20180808115644p:plain

プールの作成に失敗した場合は、権限が不足しているので、Team Foundation 管理者ユーザにプールを作成してもらう。

*1:TFS 2018 Update 2では復活したみたいだが

続きを読む

Windows Server 2016 で WCF Data Services

Windows Server 2008 で動いていた WCF Data ServicesアプリケーションをWindows Server 2016に載せ替えたので、メモを残しておく。

WCF Data Servicesアプリケーションを発行し、アクセスすると404エラーが発生する

WCF Data Servicesの拡張子「.svc」がIISに認識されていないという事が以下のブログでわかった。

Publishing a WCF service on IIS 8gyorgybalassy.wordpress.com


直接設定すれば動きそうだけど、画面から設定できるのではないかと思って調査を続けたところ、Windows Serve 2012での設定内容を書いたブログがあった。WCF Data ServicesはHTTPで通信するので良さそう。

blog.livedoor.jp


検索キーワード(HTTPアクティブ化)がわかったので、Windows Server 2016の設定を探したところ、以下の複数のサイトが見つかったので書かれていた設定を行うことで、404エラーを無くすことが出来た。

qiita.com

.NET Framework 4.7が入っているケース。

WCF サービスで HTTP 404.17 エラー

一つ上のサイトからリンクされているページ。設定した結果がもう少し詳しくのっている。

symfoware.blog.fc2.com

タイトルにWCFの文字はないが、画面の画像付きで丁寧に説明されている。ASP.NETMVCではない)が動作する環境ではWCF Data Servicesも動作するようだ。

「現在のセキュリティ コンテキストでは、NT AUTHORITY\IUSR はデータベース にアクセスできません。」というエラーメッセージが表示される

WCF Data Servicesのトップ画面は表示されたが、個別のエンティティセットを表示しようとすると上記エラーメッセージが表示されてしまう。IUSR について調べてみると、以下のサイトに情報があった。

IIS のアクセス許可 - クリエイティブWeb

関連個所を引用すると

Windows Vista 以降、IUSR ユーザーアカウントをビルトインアカウントとして用意し、これを匿名認証のときに用いるようになりました。

そして

IIS マネージャーを使って、「IIS」の「認証」の「匿名認証」の編集で、匿名ユーザー ID をアプリケーションプール ID に設定すれば既定のIUSR を使用せずに、アプリケーションプール ID のみでアクセス許可の設定ができるようになります。

とあるため、 IIS マネージャーを開いて匿名認証の設定を確認すると、既定のユーザー(IUSR)になっていたので、アプリケーションプール IDに設定することでデータを表示することが出来た。

以上

おまけ

アプリケーションプール IDでデータベースにアクセスする設定は、過去記事参照。

redwarrior.hateblo.jp

ASP.NET MVC でチェックボックスのカスタマイズをCSSのみで行う。

ググると以下のようなサイトがヒットするが、そのままでは、ASP.NET MVC で動作しない。

cultureacademia.jp

なぜかと言うと、Form要素を作成するときは、HTMLタグを直接入力することはあまりせず、ビューヘルパー(@Html.***For)を使用することが多く、チェックボックスのビューヘルパーはinputタグを2つ作成するからだ。

その解決方法を調べたら、以下のサイトに載っていた。

stackoverflow.com

最初のサイトで使用していた隣接セレクタを使用する代わりに、間接セレクタを使用すれば良いということだった。奥が深い。

ちなみに、labelタグで囲む場合と、labelタグのfor属性を使用する場合があるが、labelタグで囲まない(labelタグのfor属性を使用する)場合は、HTML上はinputタグ、labelタグの順番で書く必要がある。

これは隣接セレクタ、間接セレクタ共に、○○の前という指定が出来ないからである。CSS4では出来るようになるらしい。

これだとデザイン上困ったことになりそうだが、inputタグによるフォーム(チェックボックス)は非表示にされるので特に困らない。

やはりASP.NET MVCの情報を探すには、stackoverflow(英語版)は必須だな。

以上