vorfee's Tech Blog

Just another tech blog

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_PROCESSKEYVK_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を使用すればよい。ただし、新IMEWindows 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 StudioGUI から管理可能
  • 高機能、拡張可能
  • 日本語の情報は少ない

導入方法

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

参考リンク


Visual Studio Installer Projects

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

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

特徴

  • 独自形式の設定ファイル
  • Visual StudioGUI から管理可能
  • ユーザインストールでも管理者権限が必要
  • 古い機能との親和性が高い(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が非常に優れたライブラリであることが分かる。

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

Python Jinja2入門 その1 基礎知識

Pyhonに Jinja というライブラリがある。Jinjaを使用するとテキストファイルの一部を文字列置換できる。

Jinja is a fast, expressive, extensible templating engine. Special placeholders in the template allow writing code similar to Python syntax. Then the template is passed data to render the final document.

Jinjaは高速で表現に富み、拡張可能なテンプレートエンジンです。Pythonに似た文法で、特別なマークをテンプレートファイルに埋め込むことができます。マーク箇所は渡されたデータに置き換えられて出力されます。

-Jinja Documentationより引用、筆者訳 https://jinja.palletsprojects.com/

この記事では第一弾として、Jinjaでできることを簡単に紹介する。

Jinjaって何?

Jinjaはテンプレートエンジンである。テンプレートエンジンとは、Wikipediaで以下のように定義される。

テンプレートエンジンはテンプレートと呼ばれる雛形と、あるデータモデルで表現される入力データを合成し、成果ドキュメントを出力するソフトウェアまたはソフトウェアコンポーネントである。

テンプレートエンジン - Wikipedia

なお、ひな形を使わずにドキュメントを生成するソフトウェアはジェネレータなどと呼ばれる。

テンプレートエンジンはひな形の一部を置き換えるという単純な処理ゆえに適用範囲が広く、高い汎用性がある。ジェネレータは生成するドキュメントの内容(構文)を解析・把握できる機能が求められ、複雑な処理をこなすことができる反面、汎用性に乏しい。

Jinjaの用語

Jinjaで使われる用語を紹介する。難しい用語はないが、覚えておけばプログラムを書く際の助けとなる。

用語 日本語表記 説明
Template テンプレート テンプレート処理、またはテンプレート処理に用いられるテキストのこと。
Template Engine テンプレートエンジン Jinja2のこと。テンプレートを実行するシステム。
Environment (プログラム用語)テンプレートエンジンの基本設定を取り扱うPythonクラス。
Loader (プログラム用語)テンプレートの読み込み方を取り扱うPythonクラス。

Jinjaでできること

先にも述べたが、Jinjaはテンプレートエンジンである。Jinjaでできることのうち、主要なものを紹介する。

  • 変数の置換
  • for(繰り返し)
  • if(条件分岐)
  • include(ファイル分割)

変数の置換

{{変数名}} と表記した個所の変数を置換できる。

こんにちは {{user_name}} さん!

変数が数値の場合、四則演算ができる。

参考: https://jinja.palletsprojects.com/templates/#variables

for (繰り返し)

{% for item in items %} の形式で繰り返し処理ができる。

{% for person in people %}
氏名:{{person.name}} 年齢:{{person.age}} 性別:{{person.sex}}
{% endfor %}

参考: https://jinja.palletsprojects.com/en/3.0.x/templates/#for

if (条件分岐)

{% if 条件式 %} の形式で条件分岐ができる。

{% if age < 18 %}
18歳以下は閲覧できません。
{% endif %}

参考: https://jinja.palletsprojects.com/en/3.0.x/templates/#if

include(ファイル分割)

{% include "テンプレートファイル" %} でテンプレートファイルを分割、テンプレート処理時に結合できる。

{% include "template2.j2" %}

参考: https://jinja.palletsprojects.com/en/3.0.x/templates/#include

次回はスクリプトを書き、Jinjaでテキスト置換をする方法を紹介する。

vorfee.hatenablog.jp