vorfee's Tech Blog

Just another tech blog

PostgreSQLのサイレントインストール

EDBから入手可能なPostgreSQLのインストーラは、引数に --help をつけることで様々なオプションを表示できる。主要なオプションは以下の通り。

  • --mode unattended: unattended(無人)モードをオンにし、ユーザーが操作せずにインストールできる。
  • --unattendedmodeui none: --mode unattendedと併用することでサイレントインストールになる。
  • --enable-components server,pgAdmin,stackbuilder,commandlinetools: インストールするコンポーネント
  • --prefix "C:\Program Files\PostgreSQL\14": インストール先
  • --datadir "C:\Program Files\PostgreSQL\14\data": データ格納先
  • --superpassword postgres: スーパーユーザー(postgres)のパスワード
  • --serverport 5432: ポート

使用例

デフォルト設定でサイレントインストールする。

postgresql-14.13-2-windows-x64.exe ^
    --mode unattended ^
    --unattendedmodeui none ^
    --superpassword postgres ^
    --serverport 5432

おまけ PostgreSQL 14 インストーラのヘルプ

PostgreSQL 14
Usage:

 --help                                      Display the list of valid options

 --version                                   Display product information

 --unattendedmodeui <unattendedmodeui>       Unattended Mode UI
                                             Default: minimal
                                             Allowed: none minimal minimalWithDialogs

 --optionfile <optionfile>                   Installation option file
                                             Default: 

 --debuglevel <debuglevel>                   Debug information level of verbosity
                                             Default: 2
                                             Allowed: 0 1 2 3 4

 --mode <mode>                               Installation mode
                                             Default: qt
                                             Allowed: qt win32 unattended

 --debugtrace <debugtrace>                   Debug filename
                                             Default: 

 --enable-components <enable-components>     Comma-separated list of components
                                             Default: server,pgAdmin,stackbuilder,commandlinetools
                                             Allowed: server pgAdmin stackbuilder commandlinetools

 --disable-components <disable-components>   Comma-separated list of components
                                             Default: 
                                             Allowed: server pgAdmin stackbuilder commandlinetools

 --installer-language <installer-language>   Language selection
                                             Default: en
                                             Allowed: en es fr

 --extract-only <extract-only>               
                                             Default: 0

 --superaccount <superaccount>               Sets the user name of the database superuser. Defaults to 'postgres'.
                                             Default: postgres

 --servicename <servicename>                 Sets the name of the database service.
                                             Default: 

 --serviceaccount <serviceaccount>           Sets the operating system user account that owns the server process. Defaults to 'postgres'.
                                             Default: 

 --servicepassword <servicepassword>         Sets the password for the operating system user account that owns server process. Defaults to superuser password.
                                             Default: 

 --install_runtimes <install_runtimes>       Specifies whether or not install the Microsoft Visual C++ runtimes before the installation proceeds.
                                             Default: 1

 --enable_acledit <enable_acledit>           Check and give the read permissions on the complete data directory path for the service account.
                                             Default: 0

 --create_shortcuts <create_shortcuts>       Specifies whether or not menu shortcuts should be created.
                                             Default: 1

 --prefix <prefix>                           Installation Directory
                                             Default: C:\Program Files\PostgreSQL\14

 --datadir <datadir>                         Data Directory
                                             Default: C:\Program Files\PostgreSQL\14\data

 --superpassword <superpassword>             Password
                                             Default: 

 --serverport <serverport>                   Port
                                             Default: 5433

 --locale <locale>                           Locale
                                             Default: 


Bitnamiインストーラを使わずにRedmine5.xをWindowsにインストールする方法

Bitnamiインストーラを使わずにRedmineをインストールする手順をまとめる。 なお、管理者権限とインターネット接続が必須である。オフラインインストールの手順については気が向いたらまとめる予定。

  • 1. Gitをセットアップする
  • 2. Rubyをセットアップする
  • 3. ImageMagickをセットアップする
  • 4. Ghostscriptをセットアップする
  • 5. PostgreSQLをセットアップする
    • 5-1. インストールと初期化
    • 5-2. ユーザーの追加
    • 5-3. データベースの追加
  • 6. Redmineをセットアップする
    • 6-1. ダウンロード
    • 6-2. 初期設定
    • 6-3. パッケージのインストール
    • 6-4. 起動テスト
続きを読む

Microsoft Expression Blend SDKのダウンロードリンク

Microsoft Visual Studio Community 2017の消滅に伴い、Microsoft Expression Blend SDK のダウンロードリンクも消滅しているため、メモする。 なお、下記URLはVisual Studio 2017のVisual Studio Installerが内部処理で使用するインストーラの直リンクとなっており、いつまでも使用できる保証はない。

Microsoft Expression Blend SDK for .NET 4.0

https://download.visualstudio.microsoft.com/download/pr/40c850aa-680c-4dff-bec4-7cbaa5d423ca/c44eedaa2a8ca721e91190364d2cc59a/blendwpfsdk_en.msi

Blend SDK 4.0のインストーラ

Microsoft Expression Blend SDK for .NET 4.5

https://download.visualstudio.microsoft.com/download/pr/e4dc8d00-5acf-463f-9d46-a5c3c3777fc7/d3b04bfdbc7a87a3854c83699fb24b3e/blendwpfsdk.msi

Blend SDK 4.5のインストーラ

補足

SDKのインストール先は C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\.NETFramework。

インストールされるDLLは以下の通り。

たいていの場合使用するのは System.Windows.Interactivity.dll だろうが、Behaviorはオープンソース化され、nugetパッケージとしてMicrosoftから公式に配布されている。 星形や吹き出しなどのShape類を使わなければ Microsoft.Xaml.Behaviors.Wpf で用が足りる。

github.com

www.nuget.org

過去のVisual Studio Communityのダウンロードリンク

Microsoft のサイトからVisual Studio Community 2017のダウンロードリンクが消滅していたため、メモを兼ねて記録する。 なお、2023/1/31時点で下記URLは利用できるが、公式にはリンクを消しているため、数年のうちにダウンロードもできなくなる可能性が高い。

通常は古いバージョンをダウンロードする必要はないが、特殊な事情がある場合にどうぞ。

Visual Studio Community 2017

https://visualstudio.microsoft.com/ja/thank-you-downloading-visual-studio/?sku=Community&rel=15

Visual Studio Community 2019

https://visualstudio.microsoft.com/ja/thank-you-downloading-visual-studio/?sku=Community&rel=16

Visual Studio Community 2022

https://visualstudio.microsoft.com/ja/thank-you-downloading-visual-studio/?sku=Community&rel=17

または

https://visualstudio.microsoft.com/ja/thank-you-downloading-visual-studio/?sku=Community&version=VS2022

Windows COM操作用のProgIDとCLSIDの一覧

よく忘れるし、まとまった情報が無いためメモする。自力で探したいときは Computer\HLEY_CLASSES_ROOT\CLSID 以下のレジストリキーを見る。

List of common Windows COM ProgID and CLSID

Name ProgID CLSID
Microsoft Word Word.Application {000209FF-0000-0000-C000-000000000046}
Microsoft Excel Excel.Application {00024500-0000-0000-C000-000000000046}
Microsoft PowerPoint PowerPoint.Application {91493441-5A91-11CF-8700-00AA0060263B}
Microsoft Access Access.Application {73A4C9C1-D68D-11D0-98BF-00A0C90DC8D9}
Microsoft Graph MSGraph.Application {00024502-0000-0000-C000-000000000046}
Microsoft Publisher Publisher.Application {0002123D-0000-0000-C000-000000000046}
Microsoft Outlook Outlook.Application {0006F03A-0000-0000-C000-000000000046}
Microsoft OneNote OneNote.Application {DC67E480-C3CB-49F8-8232-60B0C2056C8E}
Shell Automation Service Shell.Application {13709620-C279-11CE-A49E-444553540000}

ターミナルで無変換キーを押すとアットマーク(@)が挿入される問題の調査と解決方法

概要

いわゆる「Mac方式」のIMEにカスタマイズしている場合に発生する問題で、「無変換キー=IMEオフ」「変換キー=IMEオン」に割り当てているとき、無変換キーを押すとターミナルに半角@(アットマーク)が入力される問題がある。

とりあえずアルファベットを打ちたいときに無変換キーを連打することに慣れてしまった人(私)にとって地獄のような状態であるため、原因を調査した。

この記事の内容は、GitHubのIssueで語られている内容を引用している。

github.com

結論

発生原因は、旧Microsoft IME の仕様 および ターミナルの実装が不運にもミスマッチしたためと考えられる。解決方法は以下の2種類がある。

(1)IMEを変える

古い Microsoft IME の利用をやめ、新しいMicrosoft IMEを使う。新しいMicrosoft IMEの設定方法は以下の記事が参考になる。

atmarkit.itmedia.co.jp

(2)キー割り当てを変更する(一時的な対処)

下記の記事を参考に、Windows ターミナルの設定から、vk29を別の機能に割り当てる。これはWindowsターミナルでは有効だが、PowerShellを直接起動した際には無効。

qiita.com

調査

IMEにより「無変換キー」を押したときに送出されるキーコード(一覧はこちら)を調べた。

No. 条件 旧IME 新IME
1 IMEオフ & KeyDown 0x1D 0xE5
2 IMEオフ & KeyUp 0x1D 0x1D
3 IMEオン & KeyDown 0xE5 0xE5
4 IMEオン & KeyUp 0x1D 0x1D

表の横方向が同じ値になっている場合、新旧IMEが同じ動作であることを表す。

注目すべきはNo.1 「IMEオフで無変換キーを押下したとき」 であり、新旧で送出される仮想キーコードが異なる。

  • 旧IME = 0x1D = VK_NONCONVERT
  • 新IME = 0xE5 = VK_PROCESSKEY

これが旧IMEで無変換キーを連打するとアットマークが挿入される正体である。

考察

  • 無変換キー押下(KeyDown)で送出される仮想キーコードは、VK_PROCESSKEYとVK_NONCONVERTのどちらが正しいのか?
    • 調べても分からなかった。
    • 個人的感想だが、何が正しいかというよりは、何が使われてきたかという歴史的経緯であると思った。
  • VK_PROCESSKEY の意味は?
    • VK_PROCESSKEYは、IMEによって処理されたキー入力であることを表す。
    • VK_PROCESSKEYは、ImmGetVirtualKey function (imm.h)で実際に入力されたキーボードの仮想キーコードを取り出すことができる。

というわけで以下のようなコード(抜粋)を使い、TextBoxで無変換キーを押したときの VK_PROCESSKEY から仮想キーコードを取り出してみた。

public override bool PreProcessMessage(ref Message msg)
{
    if (msg.Msg == 0x0100 /*WM_KEYDOWN*/)
    {
        Console.WriteLine($"WParam: {msg.WParam}");
        if (msg.WParam.ToInt32() == 0xE5 /*VK_PROCESSKEY*/)
        {
            uint vk = ImmGetVirtualKey(msg.HWnd);
            Console.WriteLine($"VK: {vk}");
        }
    }

    return base.PreProcessMessage(ref msg);
}

無変換キーを押したときに得られた出力は以下。IMEが処理した無変換キー(0x1D = 29)であることが分かる。

WParam: 229
VK: 29

結局どうすれば良いか?

先の結論に挙げた通り、Windowsターミナルは新IMEの仕様に合わせて作られているため、新IMEを使用すればよい。ただし、新IMEは Windows 10 (2004) 以降でのみ使用可能。

追記 2022/7/6:

新しいIMEを使っていると、日本語が2重に入力される現象が発生中。これが発生すると変換ができず、「テスト」と入力すると「ttええssううttおお」となる。 仕方なく旧IMEに戻したがアットマークは再燃した...

参考

Windowsプログラムのインストーラを作成する

Visual Studio を使ったインストーラの作成について纏める。

対象の読者

この記事は下記の読者を想定している。

インストーラとは

インストーラとは、プログラムをコンピュータ上で実行できるよう、動作環境一式を自動でインストールするソフトウェアである。

インストーラは exe ファイルをコピーするだけでなく、プログラムを正常に動作させるための準備作業や、ユーザの利便性向上のためのリンク作成などが自動実行できる。

インストーラの機能

インストーラの持つ一般的な機能を纏める。

  • ショートカット作成
  • スタートメニュー登録
  • パスを通す
  • レジストリ登録
  • アップグレード
  • 依存ソフトウェアの導入
  • データベースの初期化
  • Windows サービス登録
  • Windows シェル統合

上記の機能が不要な場合には、インストーラを作る必要はない。

無料で使用できるインストーラ製品の一覧

無料で利用可能なインストーラ製品を以下に纏める。


Wix Toolset

Wix Toolset は、XML形式の設定ファイルからインストーラを生成することができるオープンソースソフトウェア。2004年から開発しており、2022年5月時点でバージョン3.11.2が最新安定版。

特徴

  • XML形式の設定ファイル
  • Visual Studio の GUI から管理可能
  • 高機能、拡張可能
  • 日本語の情報は少ない

導入方法

GitHub のリリースページ からダウンロードする。同時に Wix Toolset の Visual Studio 拡張機能 の導入も推奨。

参考リンク


Visual Studio Installer Projects

Visual Studio Installer Projects は、Microsoft Windows Installerを作成するためのツールである。

Visual Studio 2010 までは Visual Studio の一機能として提供されていたものである。できることは多くないが、作るのは簡単。

特徴

  • 独自形式の設定ファイル
  • Visual Studio の GUI から管理可能
  • ユーザインストールでも管理者権限が必要
  • 古い機能との親和性が高い(SandCastleとの統合等)
  • 日本語の情報は割とある

導入方法

Visual Studio Marketplace からダウンロードする。

参考リンク

まとめ

各種インストーラ製品の使い方は、参考リンクにわかりやすく紹介しているサイトがある。 次回の記事では Wix Toolset の機能や使い方を掘り下げてみる予定。

Prism.DryIoc でも Microsoft.Extensions.Logging や Microsoft.EntityFrameworkCore が使いたい

WPF の優れたフレームワークの1つである Prism (PrismLibrary) の悩み事の1つに、そのままでは Microsoft.Extensions.DependencyInjection (以下、MSDI) の機能が利用できないことがある。

Prism では Microsoft.Extensions.Logging (以下、MSLogging) が使用できるだろうか?答えは YES である。

結論

DryIoc.Microsoft.DependencyInjection のNuGetパッケージをインストールし、App.xaml.cs を以下のように編集する。

// 以下のusingは拡張メソッドのために必須
using DryIoc.Microsoft.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Prism.Ioc;

public partial class App : Prism.DryIoc.PrismApplication
{
    // ...中略...

    protected override Prism.Ioc.IContainerExtension CreateContainerExtension()
    {
        var serivces = new ServiceCollection();
        services.AddLogging(options =>
        {
            // Todo: ここにLoggerの設定を記述
        });
        services.AddDbContext<DbContext>(/*Todo: ここにDatabaseの設定を記述*/);

        var container = new DryIoc.Container(CreateContainerRules())
            .WithDependencyInjectionAdapter(services);
        return new Prism.DryIoc.DryIocContainerExtension(container);
    }
}

これにより、以下のようなクラス名をカテゴリとする ILogger を解決可能となる。

public class SampleClass
{
    public SampleClass(Microsoft.Extensions.Logging.ILogger<SampleClass> logger)
    {
        logger.LogInformation("SampleClass created.");
    }
}

また、Microsoft.EntityFrameworkCore の内部で使用されるログ情報も正常に取得できるようになった。

参考

stackoverflow.com

stackoverflow.com

Python Jinja2入門 その2 Jinja2スクリプトの作成

前回に引き続き、Jinja2を使ったテキストテンプレート機能の作成方法を紹介する。

前回の記事は以下。

vorfee.hatenablog.jp

スクリプトの作成

まず、template.txt という名前で以下のテンプレートテキストファイルを作成する。

こんにちは、{{name}}さん!

次に main.py という名前で以下のスクリプトを作成する。

from jinja2 import Environment, FileSystemLoader

env = Environment(loader=FileSystemLoader('./'))
template = env.get_template('template.txt')
data = { 'name': '田中' }
print(template.render(data))

Pythonでmain.pyを実行すると、{{name}}部分が「田中」に置換された結果が画面に表示される。

PS> python main.py
こんにちは、田中さん!

足早に説明したが、これからスクリプトを1行ずつ紐解いていく。

スクリプトの説明

1~2行目 - 宣言

1~2行目は、jinja2のPythonモジュールを使用する宣言である。

from jinja2 import Environment, FileSystemLoader
  • Environment はJinja2を実行する環境を定義するクラスで、様々な基本設定を行う。
  • FileSystemLoader はテンプレートの読み込み方を定義するクラスで、テンプレートをテキストファイルからを読み込むことができる。

FileSystemLoader以外にも様々な読み込み方があるが、それは後日の紹介とする。

3行目 - 実行環境定義

3行目は、Jinja2の実行環境を新規作成している。

env = Environment(loader=FileSystemLoader('./'))
  • 変数 env にJinja2実行環境インスタンスを代入する。
  • loader にはテンプレートの読み込み方を定義するインスタンスを設定する。
  • FileSystemLoader('./') は、カレントディレクトリを基準のパスとして、テンプレートファイルを探索するというインスタンスである。

4行目 - テンプレートエンジン作成

4行目は、テンプレート実行インスタンス(テンプレートエンジン)を新規作成している。

template = env.get_template('template.txt')
  • 変数 template にテンプレート実行インスタンスを代入する。
  • get_template('template.txt') では、3行目に指定した場所を基準としたテンプレートファイルの名前 を指定し、テンプレート実行インスタンスを作成する。

5行目 - データモデル作成

5行目は、テンプレートに適用するデータを定義している。

data = { 'name': '田中' }
  • 変数 data に辞書を代入する。
  • 辞書のキーに「name」、値に「田中」を指定しており、これはテンプレート内の変数「name」を「田中」に置き換えるという意味になる。

今回はデータをスクリプト上で作成しているが、実際にはCSVファイルにしたり、YAMLファイルにしたり、様々な方法で外部保存することが考えられる。

6行目 - テンプレート実行

6行目は、テンプレートを実行(render)している。

print(template.render(data))
  • template.render(data)では、template.txt に対して data を適用し、その結果を文字列として返す。

今回は説明のために画面上にprintしているが、テンプレート結果はファイルに書き込むほうが一般的だろう。

まとめ

説明は長くなってしまったが、スクリプト自体は非常に短く数分で作成できる。内容も非常に簡潔で理解しやすく、Jinja2が非常に優れたライブラリであることが分かる。

次の記事ではもう少し実用に近いサンプルを示す予定。