redwarrior’s diary

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

2018年にもっとも読まれた記事ランキング

しばやん( id:shiba-yan )さんが作った「2018 年の人気記事ランキング生成」を使わせてもらい、記事ランキングを作成してみました。

ランキング自体は、右下の注目記事と大差ないですね。ランキングにしめる2015年、2016年の記事の割合が相変わらず高いです。 ブログを始めたのが、2015年で当初は色々とネタがあったという事でしょうか。

  1. (小ネタ)WindowsフォームでShowDialogメソッド、Showメソッド、Closeメソッド、Disposeメソッドの動作を理解する。

  2. ASP.NET MVC でテキストボックスとラベルに別の書式を使用する

  3. (小ネタ)改行文字を削除する

  4. 「TortoiseGitでユーザー名・パスワードを記憶する」をやってみた。

  5. .NETでログファイルのローテーションに日付を使用する

  6. Web Deployの整理

  7. Entity Framework でSQLを実行する

  8. (小ネタ)Entity Framework でタイムアウトの設定方法まとめ

  9. C#でJavaDoc風のAPIリファレンスを作成する方法

  10. IIS上で動くASP.NET (MVC)アプリケーションの権限について

  11. (小ネタ)Visual Studio 2015 のバージョンがv14なわけ。(Visual Studio 2013 はv12です)

  12. ASP.NET MVC で備考入力欄を作成する方法のまとめ

  13. Visual Studio 2015は、Professionalでもユニットテスト機能(MSTest)が充実している

  14. (小ネタ).NET Frameworkの本体と、targeting packは別物

  15. バリデーションのメッセージを変更する

  16. WindowsサービスとしてインストールしたJenkinsのアンインストール方法

  17. 環境ごとに設定を変更する(DBへの接続文字列)

  18. ストアドプロシージャからNLogを使用してログを出力する

  19. TFS 2015でプロジェクトを.NET Framework 4.6にダウングレードしてビルドする

  20. (小ネタ)C#でデフォルト引数に今日の日付や現在時刻を指定する

来年も地道に続けていこうと思います。

Hyper-V上のWebサイト(Redmine, Jira)にホストPCのブラウザからアクセスする

Hyper-V上の仮想マシンRedmineやJiraを構築したが、仮想マシン内のブラウザでは画面が狭いとか、コピー&ペースト出来ない等の課題があったので、Hyper-V上のWebサイトにホストPCのブラウザからアクセスする方法を調べました。

目的

Hyper-V上のWebサイトにホストPCのブラウザからアクセスする

環境

ホストPC:Windows 10 Pro 1803(April 2018 Update)*1

仮想マシンCentOS 7

仮想マシンIPアドレスを調べる

仮想マシン上で端末を開いてip addr showを実行し、仮想ネットワーク上のIPアドレスを確認します。

このIPアドレスは、ホストPCの「既定のスイッチ」に割り当てられたアドレスと同じネットワークになります。

参考:
Windows 10 1709(Fall Creators Update/RS3) Hyper-V の NAPT 仮想スイッチ

ポートフォワーディングの設定を行う

Windowsのnetshコマンドを使用して、ホストPCへのアクセスを仮想マシンに転送する設定をします。

以下は、ホストPCの8080番ポートにアクセスすると、仮想マシンの80番ポートにつながる設定です。

listenaddressに「0.0.0.0」を指定しているため、ホストPCと同じLAN上にある他のPCからも「http://ホストPCのIPアドレス:8080/」でアクセスできます。

netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=80 connectaddress=仮想マシンのIPアドレス

参考:
WindowsでVMへポート転送するときのメモ | hasegawayosuke's blog

仮想マシン上のファイアウォールを停止する

80番ポートのみを通すようにファイアウォールを設定すれば良いのですが、検証用途なのでファイアウォールが起動している場合は停止して、OS起動時にも起動しないようにします。

起動しているかどうか確認する

systemctl status firewalld

ファイアウォールを停止する

systemctl stop firewalld

OS起動時に起動しないようにする

systemctl disable firewalld

これでホストPCのブラウザのURLに「http://localhost:8080/」と打つことで、仮想マシン上のWebサイトにアクセスできるようになりました。

以上

*1:1709(Fall Creators Update)ならばOK

Hyper-V上にJiraを構築する

ヘルプデスク的な使い勝手を求めて、RedmineだけでなくJiraも検証することになったのでHyper-V上にJiraを構築する方法を調べました。

ちなみに前回の記事はこちら

redwarrior.hateblo.jp

目的

Hyper-VCentOS 7を構築し、そこにJira Service Deskをインストールする

環境

前回と同じ

仮想マシンの作成

前回、ゲストOSとしてUbuntuを選択したので、今回はCentOS 7で構築してみました。

以下のサイトを参考にCentOS 7のDVD ISOイメージをダウンロード。前回と同様に「クイック作成」を使用してダウンロードしたISOファイルを選択してインストールを開始しました。

【初心者でもわかる】Linux CentOSのインストール方法まとめ

仮想マシンの再インストール

サイトに従ってインストールは完了しましたが、「ソフトウェアの選択」で「最小限のインストール」を選択したのと「ネットワークの設定」をスキップしてしまったため、GUIがインストールされず黒い画面が表示されてしまいました。

これではやはり不便だったので、再インストールをすることにしました。

仮想マシンの設定でブート順でDVDドライブを先頭にして、DVDドライブのメディアにISOファイルを設定して、仮想マシンを起動するとインストール画面が表示されました。

改めて「ソフトウェアの選択」で「GNOME Desktop」を選択し、「ネットワークの設定」を済ませた上でインストールしました。

Jira Service Deskインストール

Jira Service Deskは、公式ドキュメントに従えばインストールが出来ました。

ドキュメント内でsudoコマンドを使っていて、CentOS 7のインストール直後は一般ユーザでsudoコマンドが使えなかったので、使えるように登録しました。

Jira アプリケーションを Linux にインストールする - アトラシアン製品ドキュメント

CentOSでsudoコマンドが使えない場合の対処法

以下のコマンドで実行権限を与え、インストーラを実行しました。

chmod a+x atlassian-servicedesk-X.X.X-x64.bin

Jiraは評価版ライセンスをAtlassianのサイトで作成するため、ブラウザ(Firefox)にホストPCと同じプロキシサーバを設定しました。

評価版ライセンスの作成は特に問題なく終了し、それなりに時間はかかるが画面の操作に従ってインストールは完了しました。

Jira Service Deskへのアクセス

Firefoxから「http://localhost:8080/」を開くと、「http://localhost:8080/secure/WelcomeToJIRA.jsp」へリダイレクトされてJiraのログイン画面が表示されました。

f:id:redwarrior:20181024171556p:plain

以上。

Hyper-V上にRedmineを構築する

ヘルプデスク的な使い勝手を求めて、Redmineを検証することになったのでHyper-V上にRedmineを構築する方法を調べました。

目的

Hyper-VUbuntu 18.04 LTS 日本語 Remixを構築し、そこにRedmine 3.4.0をインストールする

環境

今回構築するのは社内LAN上のPCで、プロキシの設定や不正接続検知等の対策が取られている

仮想マシンの作成とホストOSのネットワーク遮断

以前、別の環境でHyper-V上で仮想マシンを作成した時は、第1世代と第2世代のどちらを選ぶのか?とか設定があって面倒だなと感じていました。

もうちょっと簡単な方法は無いかと調べると、「クイック作成」という機能があることがわかったので、今回はこの方法で試すことにしました。

Windows 10のHyper-VでLinuxの仮想マシンを作成する:Tech TIPS - @IT

サイトの手順に従って、Ubuntuのインストールが完了したので、さっそく起動するといつの間にかホストPCのネットワークが遮断されている!!!

どうやら、前にHyper-Vを使用した時に作成した仮想スイッチをネットワークで選択したのがまずかったらしい。Ubuntu仮想マシン)を終了した後、ネットワーク管理者にすいませんと謝ってネットワーク接続を復旧してもらい、対策を考えました。

ネットワーク遮断の調査

Hyper-Vの仮想スイッチについて良くわかっていなかったので、改めて調査しました。 以下のサイトを参考にして勉強。

Hyper-Vのネットワークを理解する -外部ネットワーク- | Windowsインフラ管理者への道

Hyper-Vのネットワークを理解する -内部ネットワーク,プライベートネットワーク- | Windowsインフラ管理者への道

コラム - Hyper-V の部屋 | 第5回 仮想環境とネットワーク|CTC教育サービス 研修/トレーニング

Hyper-Vネットワークの基本

わかったのは、仮想スイッチは、仮想NICではないということ。仮想マシンネットワークアダプタが仮想NICであり、仮想NICはホストPCのNICとは別物と扱われること。よって、仮想マシンを起動してネットワークに接続すると、LANケーブルを他のPCに差し替えて使用するのと同じ状態になってしまうのでした。

そんな訳で、「外部ネットワーク」の仮想スイッチは使用できない事がわかったけれど、このままでは仮想マシンはインターネットに接続できないため、対応方法をさらに調査しました。

ネットワーク遮断の解決方法

Windows 10 1709(Fall Creators Update)で、NATの役割をする仮想スイッチ(既定のスイッチ)が用意されたようなので、それを使用すると良さそうだとわかりました。

Windows 10 1709(Fall Creators Update/RS3) Hyper-V の NAPT 仮想スイッチ

「外部ネットワーク」のスイッチを削除して、イーサネットも「Hyper-V Extensible Virtual Switch」をやめて、設定をHyper-V導入前に戻しました。

その状態で、仮想マシンネットワークアダプタの仮想スイッチ項目で「既定のスイッチ」を選択したところ、仮想マシンを起動してもホストPCのネットワークは遮断されなくなりました。

仮想マシン(Ubuntu)からのインターネット接続

次に仮想マシン(Ubuntu)からのインターネット接続を試みたが接続できず。ネットワーク設定は問題ないはずなので、プロキシ設定がされていないと想定。FirefoxでホストPCと同じプロキシサーバを指定して試したところ、インターネットへのアクセスに成功しました。

Redmineインストール

これでようやく、Redmineのインストール作業に移れます。Redmineのインストールには、bitnami Redmineを使用しました。Ubuntu上のFirefoxを使用して、直接ダウンロードしました。

端末を開き、以下のコマンドで実行権限を与え、rootユーザーになってインストーラを実行するとGUIなインストール画面が表示されたので指示に従ってインストールを完了しました。

chmod 755 bitnami-redmine-3.4.6-3-linux-installer.run

一応以下のサイトを参考にインストール先は「/opt/redmine」に変更しました。

bitnami Redmineをインストールする際に気をつけるただ1つのこと | ITソリューション

Redmineへのアクセス

インストールが完了したので、Firefoxから「http://localhost/」を開いてみたがアクセスできない。ファイアウォールでブロックされているかと思ったが、ファイアウォールは起動していませんでした。

調べてみると、GUIで操作できるツール(manager-linux-x64.run)が、インストールディレクトリ(/opt/redmine)にあることが分かったので、rootユーザーになって実行しました。

ツールで確認すると、ApacheMySQLも停止していたので、「Start All」ボタンを押して両方とも起動したのを確認。

改めて「http://localhost/」を開くと、bitnamiのWelcomeページが表示されたので、画面の「Open Redmine」リンクをクリックするとRedmineのトップページが表示されました。

f:id:redwarrior:20181022184214p:plain

以上。

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チェックは必要という事ですね。