Grow up

生活とプログラミング

Visual Studio 2022 Installer Projects と AutoUpdater.NET を使ってネットワーク経由でアップデートする方法


概要

前回は Installer Projects でアップデートを行うインストーラーを作成しました。
knkomko.hatenablog.com

今回は AutoUpdater.NET を使ったアップデート方法を確認します。
またインストーラーの保存場所として共有フォルダを使用します。

github.com
www.nuget.org

1. NuGet パッケージの追加

AutoUpdater.NET.Official をインストールします。

2. アップデート開始のコードを追加

AutoUpdater を使用したコードを追加します。
Start メソッドを呼び出すとアップデート用の画面が表示されます。

using System;
using System.Windows.Forms;

using AutoUpdaterDotNET;

namespace AutoUpdaterTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            AutoUpdater.Mandatory = true;
            AutoUpdater.UpdateMode = Mode.Forced;

            AutoUpdater.Start("\\\\172.24.110.60\\Public\\autoupdate.xml");
        }
    }
}
3. アップデートを行うインストーラーの作成

詳細は概要にも記載している前回の記事を参考にしてください。
knkomko.hatenablog.com

4. WebView2Loader.dll の追加

リビルドするとCPUアーキテクチャごとに WebView2Loader.dll が作成されます。
すべての WebView2Loader.dll を Setup プロジェクトに追加します。


5. インストーラーの配置

共有フォルダに Setup プロジェクトで作成した msi ファイルを保存します。
また autoupdate.xml, rerease_notes.htm のファイルを新規作成して保存します。

autoupdate.xml の version, url, changelog は実行環境に合わせて変更を行います。

・autoupdate.xml

<?xml version="1.0" encoding="UTF-8"?>
<item>
<title>サンプルプログラム 自動更新プログラム</title>
<version>1.0.0.1</version>
<url>//172.24.110.60/Public/Setup2.msi</url>
<changelog>//172.24.110.60/Public/rerease_notes.htm</changelog>
</item>

・rerease_note.htm

Sample 1.0.0.0 -> 1.0.0.1<br>
 ・aaaaaaaaaa<br>
 ・aaaaaaaaaa<br>
 ・aaaaaaaaaa<br>
 ・aaaaaaaaaa<br>
 ・aaaaaaaaaa<br>
 ・aaaaaaaaaa<br>
<br>
6. 確認

① Setup1 インストール後
 ・ソフトウェアのバージョン

 ・コントロールパネル

 ・保存場所


② ソフトウェアの起動後
 起動後 AutoUpdater.Start を実行するとアップデート用の画面が表示されます。

 アップデート用の画面の Update ボタンを押下すると Setup2 が起動しました。

③ ソフトウェアの Update 後
 ・ソフトウェアのバージョン

 ・コントロールパネル

 ・保存場所

  1.0.0.0 で使用していた WebView2Loader.dll が削除されずに残っていました。

7. その他

SetupプロジェクトにWebView2Loader.dllが含まれていないとAutoUpdater.Start実行時に例外が発生します。

Visual Studio 2022 Installer Projects でソフトウェアをアップデートする方法


概要

ソフトウェアのバージョンをアップデートするインストーラーを作成します。

インストーラーの作成手順は以下の記事を参考にしてください。
knkomko.hatenablog.com

1. インストーラーの作成

今回は設定内容を確認するため Setup プロジェクトを2つ作成しました。

それぞれの Setup には異なるバージョンのソフトウェアを保存しています。
Setup1 ▶ 1.0.0.0
Setup2 ▶ 1.0.0.1

異なる Setup プロジェクトでアップデートの確認を行うため Setup1 と Setup2 の UpgradeCode は同じ値に書き換えています。

2. Version の変更

Setup2 の Version を変更します。

Version を変更する際に ProductCode の変更を確認されるので変更します。

3. RemovePreviousVersions の変更

今回は 1.0.0.1 をインストールした後 1.0.0.0 はアンインストールされた状態にしたいため RemovePreviousVersions を True に変更します。

3. 確認

① Setup1 インストール後
 ・ソフトウェアのバージョン

 ・コントロールパネル

 ・保存場所


② Setup2 インストール後
 ・ソフトウェアのバージョン

 ・コントロールパネル

 ・保存場所

4. その他

RemovePreviousVersions が False の場合の動作になります。
デスクトップショートカットをダブルクリックすると 1.0.0.1 が起動しますが、コントロールパネルや保存場所を確認すると 1.0.0.0 は存在したままとなります。

 ・ソフトウェアのバージョン

 ・コントロールパネル

 ・保存場所

Windows Server のパフォーマンスログを定期的に保存する

概要

Microsoft SQL Server Support Blog のパフォーマンスログ採取手順を参考に、タスクスケジューラーを使ってデータベースを利用する時間帯だけログを保存するよう設定します。

techcommunity.microsoft.com

今回、ログの採取は以下の時間帯で行います。
・8:00 - 12:00

同じ設定で365日ログを採取する場合は約100GBの保存容量が必要です。

1. パフォーマンスモニターに採集対象のカウンタを追加

Microsoft SQL Server Support Blog よりダウンロードした PerfCollector_v1.0 の create.bat を実行します。

実行前

実行後

create.bat を実行すると、ユーザー定義に mytest という採集対象のカウンタが追加されました。

2. パフォーマンスログの採集を任意のタイミングで行う

手動で確認ができるように採集の開始と停止を行うbatファイルを作成します。

開始

# StartPerfCollect.bat
logman start mytest

停止

# StopPerfCollect.bat
logman stop mytest

確認のため StartPerfCollect.bat を実行すると、パフォーマンスモニターの mytest が実行中となります。

また実行中の状態になると、ログファイルが .blg の形式で保存されることを確認できます。
実行中はログのファイルサイズが 0 KB のままとなっています。

実行中の状態で StopPerfCollect.bat を実行すると、パフォーマンスモニターの mytest が停止します。

停止するとログの書き込みが行われたことでファイルサイズの増加が確認できました。

.blg のファイルをダブルクリックするとパフォーマンスモニターが起動してログを確認できました。

3. パフォーマンスログの採集を定期的に行う

タスクスケジューラを使用して特定の時間帯にログを採集します。
タスクの作成より、StartPerfCollect.bat と StopPerfCollect.bat を実行するタスクをぞれぞれ作成します。

開始
最上位の特権で実行するにチェックを入れます。

今回は毎日8:00に採集を開始します。

開始のため StartPerfCollect.bat を実行します。

停止
最上位の特権で実行するにチェックを入れます。

今回は毎日12:00に採集を停止します。

停止のため StopPerfCollect.bat を実行します。

タスクスケジューラに採集の開始と停止のタスクを作成したことでパフォーマンスログを定期的に保存できるようになりました。

EC2に配置したWebサイトをELBと無料のSSL証明書を使ってHTTPSで公開する


はじめに

EC2でHTTPS通信を行う手順をいつも調べてしまうため簡単にまとめます。
今回の前提条件として無料のSSL証明書ドメインは取得済みとなります。

1. VPC

VPCを作成します。

2. サブネット

後のALBを利用してHTTPS通信を行う設定でサブネットが2つ必要となるため事前に作成します。

2. インターネットゲートウェイ

インターネットゲートウェイを作成します。
作成したインターネットゲートウェイを先ほど作成したVPCにアタッチします。

3. ルートテーブル

ルートのターゲットは先ほど作成したインターネットゲートウェイを指定します。

4. サブネットの関連付け

サブネットの関連付けを行います。
先ほど作成した2つのサブネットを登録します。

5. EC2

EC2のインスタンスを作成します。

注意:インターネットゲートウェイやルートテーブルが設定できていないとSSHやRDPを使ったEC2への接続ができず、EC2にElastic IPの関連付けもできません。

6. ロードバランサ―

ACMから取得したSSL証明書とALBを利用してEC2へHTTPS通信ができるように設定します。
ターゲットの種類はインスタンスを指定します。

サブネットは先ほど作成した2つの候補が出てくるので両方とも選択します。

セキュリティグループのインバンドルールはHTTPSとHTTPを指定します。

ターゲットグループには先ほど作成したEC2インスタンスを登録します。

リスナーとルーティングにはHTTPSとHTTPを指定します。

7. EC2のセキュリティグループ

EC2のセキュリティグループのインバウンドルールを編集します。
HTTPにロードバランサ―のセキュリティグループを指定するように変更します。

8. Route 53

ホストゾーンのAレコードにロードバランサ―を指定します。
エイリアスを有効にして先ほど作成したロードバランサ―を選択します。

9. 確認

EC2に配置したWebサイトがHTTPSで公開されていることを確認します。

その他

ロードバランサ―のリスナーからHTTPのルールを変更することでHTTPSにリダイレクトすることが出来ます。

WSL2 から Hyper-V にアクセスする


はじめに

WSL2で起動しているDockerコンテナからHyper-VUbuntuSSH接続をしたのですが、タイムアウトしてしまいました。

以下の記事を参考にしてWSL2からHyper-VSSH接続することができました。
zenn.dev

変更前の確認
PS C:\Users\User> Get-NetIPInterface | `
>>     Select-Object ifIndex,InterfaceAlias,AddressFamily,ConnectionState,Forwarding | `
>>     Sort-Object -Property IfIndex | `
>>     Format-Table

ifIndex InterfaceAlias               AddressFamily ConnectionState Forwarding
------- --------------               ------------- --------------- ----------
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 省略 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     17 vEthernet (Default Switch)            IPv6       Connected   Disabled
     17 vEthernet (Default Switch)            IPv4       Connected   Disabled
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 省略 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    108 vEthernet (WSL)                       IPv6       Connected   Disabled
    108 vEthernet (WSL)                       IPv4       Connected   Disabled
設定の変更

PowerShell を管理者権限で起動して設定の変更を行う必要がありました。

PS C:\Users\User> Get-NetIPInterface | `
>> Where-Object {$_.InterfaceAlias -eq 'vEthernet (WSL)' -or $_.InterfaceAlias -eq 'vEthernet (Default Switch)'} | `
>> Set-NetIPInterface -Forwarding Enabled
変更後の確認
PS C:\Users\User> Get-NetIPInterface | `
>>     Select-Object ifIndex,InterfaceAlias,AddressFamily,ConnectionState,Forwarding | `
>>     Sort-Object -Property IfIndex | `
>>     Format-Table

ifIndex InterfaceAlias               AddressFamily ConnectionState Forwarding
------- --------------               ------------- --------------- ----------
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 省略 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     17 vEthernet (Default Switch)            IPv6       Connected    Enabled
     17 vEthernet (Default Switch)            IPv4       Connected    Enabled
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 省略 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    108 vEthernet (WSL)                       IPv6       Connected    Enabled
    108 vEthernet (WSL)                       IPv4       Connected    Enabled

Ansible を使って Ubuntu 22.04 に Docker をインストールして PostgresSQL を起動する


はじめに

今回はAnsibleを使ってDocker のインストールとイメージを作成して
コンテナの起動はサーバーにSSH接続してコマンドを実行する方法となります。

環境

Ubuntu 22.04

鍵認証によるSSH

ssh-leygenコマンドを使ってSSHに使用する秘密鍵と公開鍵を作成します。
今回キーペアの作成場所は初期値 /root/.ssh/ のままで、パスフレーズは設定していません。

root@d4988cd12c43:/# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:OHEWEvbb895QIx+oomZn7zAa8Mxn0FvjTucRxyDjXGk root@d4988cd12c43
The key's randomart image is:
+---[RSA 3072]----+
|      +..        |
|     . o .   .   |
|      . + o E    |
|       * = = +   |
|    . + S B + *  |
|     = o + = * o |
|      = B + = .  |
|      o*o* + +   |
|     ooo o+ o .  |
+----[SHA256]-----+

ssh-copy-idコマンドを使って、先ほど作成した公開鍵をSSH接続するサーバーに保存します。

root@d4988cd12c43:/# ssh-copy-id ubuntu@192.168.11.57
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
ubuntu@192.168.11.57's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'ubuntu@192.168.11.57'"
and check to make sure that only the key(s) you wanted were added.
ansible-playbook の実行

init フォルダ内にテーブルを作成するための init.sql を保存しています。

C:.
│  inventry.ini
│  playbook.yml
│
└─postgresql
    │  Dockerfile
    │
    └─init
            init.sql

今回なぜか inventry.ini にSSHの接続情報を保存しないと play-book が使えない状況でした。
inventry.ini

target ansible_host=192.168.11.57 ansible_ssh_user=ubuntu aniansible_ssh_pass=ubuntu

[target:var]
ansible_python_interpreter=/usr/bin/python3

また ansible-playbook コマンドに --ask-pass と --ask-become-pass のオプションが必要でした。

root@d4988cd12c43:/ansible# ansible-playbook -i inventry.ini playbook.yml --ask-pass --ask-become-pass
SSH password:
BECOME password[defaults to SSH password]:
PostgreSQL のコンテナを起動

Ansible からコンテナを起動できなかったため手動でコンテナを実行しました。
ansible-playbook コマンドによって2種類のイメージが作成されています。

ubuntu@ubuntu:~$ sudo docker image ls
REPOSITORY   TAG           IMAGE ID       CREATED         SIZE
postgres     14.0-alpine   87440f4e7f9e   10 months ago   195MB
psql14       v1.0          87440f4e7f9e   10 months ago   195MB

ポートやパスワードを指定してコンテナを起動します。

 sudo docker run -p 5432:5432 --name psql14 -e POSTGRES_PASSWORD=postgres psql14:v1.0
PostgreSQL への接続を確認

psql コマンドを使用して接続を確認します。

www.postgresql.jp

Server [localhost]: 192.168.11.57
Database [postgres]:
Port [5432]:
Username [postgres]:
Client Encoding [SJIS]:
Password for user postgres:
psql (12.10, server 14.0)
WARNING: psql major version 12, server major version 14.
         Some psql features might not work.
Type "help" for help.

Dockerfile で指定したバージョン PostgreSQL 14.0 に接続できていることが確認できました。

postgres=# SELECT version();
                                                   version
--------------------------------------------------------------------------------------------------------------
 PostgreSQL 14.0 on x86_64-pc-linux-musl, compiled by gcc (Alpine 10.3.1_git20210424) 10.3.1 20210424, 64-bit
(1 row)

AWS CLI を使って S3 のファイルを操作する


はじめに

AWS CLI の使い方を説明する機会があったので導入からS3のファイルを操作するまでの手順をまとめました。なお AWS CLI にて利用する Access Key ID と Secret access key についてはIAMより作成済みとします。

環境

Windows 10

AWS CLI インストール

以下の公式ページよりAWS CLIをダウンロードします。
aws.amazon.com

ダウンロードしたインストーラを実行します。

チェックボックスにチェックを入れて Next ボタンを押下します。

Next ボタンを押下します。

Install ボタンを押下します。

Finish ボタンを押下します。

AWS CLI 設定

Windows PowerShell を起動します。

以下のコマンドを実行してクイック設定を開始します。

aws configure

以下のような Access Key ID と Secret access key である場合の入力例です。


$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: ap-northeast-1
Default output format [None]: json
S3 ファイル操作

S3 バケットとオブジェクトの一覧を表示します

aws s3 ls


S3 バケット(例: 20220513-example)を作成します

aws s3 mb s3://20220513-example


S3 バケット(例: 20220513-example)にローカルのファイル(例: index.html)をアップロードします

aws s3 cp C:\file\index.html s3://20220513-example/index.html


S3 バケット内(例: 20220513-example)のファイルを表示します

aws s3 ls s3://20220513-example/


S3 バケット内(例: 20220513-example)のファイルをダウンロードします

aws s3 cp s3://20220513-example/index.html C:\file\index.html


S3 バケット内(例: 20220513-example)のファイル(例: index.html)を削除します

aws s3 rm s3://20220513-example/index.html



トラブルシューティング

AWS Access Key Id の入力を間違えていて以下のようなエラーメッセージが表示されました。

An error occurred (InvalidAccessKeyId) when calling the ListBuckets operation: The AWS Access Key Id you provided does not exist in our records.

aws configure からクイック設定を行って正しい AWS Access Key Id を入力することで解決できました。

参考資料

docs.aws.amazon.com