redwarrior’s diary

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

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

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

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

blog.kazuakix.jp

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

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

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

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