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
Microsoft Expression Blend SDK for .NET 4.5
補足
SDKのインストール先は C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\.NETFramework
。
インストールされるDLLは以下の通り。
- Microsoft.Expression.Controls.dll
- Microsoft.Expression.Drawing.dll
- Microsoft.Expression.Effects.dll
- Microsoft.Expression.Interactions.dll
- Microsoft.Expression.Prototyping.Interactivity.dll
- Microsoft.Expression.Prototyping.SketchControls.dll
- System.Windows.Interactivity.dll
たいていの場合使用するのは System.Windows.Interactivity.dll
だろうが、Behaviorはオープンソース化され、nugetパッケージとしてMicrosoftから公式に配布されている。
星形や吹き出しなどのShape類を使わなければ Microsoft.Xaml.Behaviors.Wpf
で用が足りる。
過去の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
または
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で語られている内容を引用している。
結論
発生原因は、旧Microsoft IME の仕様 および ターミナルの実装が不運にもミスマッチしたためと考えられる。解決方法は以下の2種類がある。
(1)IMEを変える
古い Microsoft IME の利用をやめ、新しいMicrosoft IMEを使う。新しいMicrosoft IMEの設定方法は以下の記事が参考になる。
(2)キー割り当てを変更する(一時的な対処)
下記の記事を参考に、Windows ターミナルの設定から、vk29
を別の機能に割り当てる。これはWindowsターミナルでは有効だが、PowerShellを直接起動した際には無効。
調査
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で無変換キーを連打するとアットマークが挿入される正体である。
考察
- 無変換キー押下(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に戻したがアットマークは再燃した...
参考
- PowerShellで無変換キーを押すとアットマークが入力される問題を回避する - Qiita
- Some keys on Japanese layout keyboards are incorrectly interpreted as @ · Issue #2206 · PowerShell/PSReadLine · GitHub
- Virtual-Key Codes (Winuser.h) - Win32 apps | Microsoft Docs
- PSReadLine/Keys.cs at ad74cef2501709d2a60a58f61d7cac32d185209f · PowerShell/PSReadLine · GitHub
- Re[8]: IME入力中のキー入力を取得したい
- API 関数解説
Windowsプログラムのインストーラを作成する
Visual Studio を使ったインストーラの作成について纏める。
対象の読者
この記事は下記の読者を想定している。
- Visual Studio でプログラムを開発している(Console, Forms, WPFなど)
- インストーラで何ができるのか興味がある
- 無料で使えるインストーラ製品を探している
インストーラとは
インストーラとは、プログラムをコンピュータ上で実行できるよう、動作環境一式を自動でインストールするソフトウェアである。
インストーラは exe ファイルをコピーするだけでなく、プログラムを正常に動作させるための準備作業や、ユーザの利便性向上のためのリンク作成などが自動実行できる。
インストーラの機能
インストーラの持つ一般的な機能を纏める。
上記の機能が不要な場合には、インストーラを作る必要はない。
無料で使用できるインストーラ製品の一覧
無料で利用可能なインストーラ製品を以下に纏める。
Wix Toolset
Wix Toolset は、XML形式の設定ファイルからインストーラを生成することができるオープンソースソフトウェア。2004年から開発しており、2022年5月時点でバージョン3.11.2が最新安定版。
特徴
- XML形式の設定ファイル
- Visual Studio の GUI から管理可能
- 高機能、拡張可能
- 日本語の情報は少ない
導入方法
GitHub のリリースページ からダウンロードする。同時に Wix Toolset の Visual Studio 拡張機能 の導入も推奨。
参考リンク
- 公式ホームページ(英語)
- [WiX] ウェルカムダイアログ、進行状況ダイアログ、インストール完了ダイアログを持つインストーラーの作成 | iPentec
- GitHub - kurtanr/WiXInstallerExamples: Installer examples created using WiX toolset
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 の内部で使用されるログ情報も正常に取得できるようになった。
参考
Python Jinja2入門 その2 Jinja2スクリプトの作成
前回に引き続き、Jinja2を使ったテキストテンプレート機能の作成方法を紹介する。
前回の記事は以下。
スクリプトの作成
まず、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で以下のように定義される。
テンプレートエンジンはテンプレートと呼ばれる雛形と、あるデータモデルで表現される入力データを合成し、成果ドキュメントを出力するソフトウェアまたはソフトウェアコンポーネントである。
なお、ひな形を使わずにドキュメントを生成するソフトウェアはジェネレータなどと呼ばれる。
テンプレートエンジンはひな形の一部を置き換えるという単純な処理ゆえに適用範囲が広く、高い汎用性がある。ジェネレータは生成するドキュメントの内容(構文)を解析・把握できる機能が求められ、複雑な処理をこなすことができる反面、汎用性に乏しい。
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でテキスト置換をする方法を紹介する。