ぷろじぇくと、みすじら。

コマンドプロンプトの新しいカラースキームを設定する

Created at:

Windows 10 Fall Creators Updateからコマンドプロンプトのカラースキームが新しくなるという発表があり、すでにInsider Preview Build 16257以降ではデフォルトで新しいカラースキームになっています。

しかし先のエントリーにもあるのですが If you clean-install a new build of Windows 10 >= 16257, you’ll get the new colors as the default Console scheme. ということでクリーンインストールしたとき以外は既存のカラースキームのままですよということになっています。

幸いエントリーには新しいカラースキームのカラーコードが乗っているので、手でちくちくと設定すればCreators Update以降であれば再現可能です。とはいえやってみるとわかりますが割となかなか面倒です。エントリーをよく読むと We’ll soon be publishing a tool that will help you apply this new scheme and a selection of alternative color schemes to your Windows Console. とあり、その後設定ツールがリリースされました。

ColorTool

GitHubのMicrosoft/consoleColorToolというツールが放流されています。このツールはカラースキームをコマンド一発で設定ファイルから読み込んで設定するツールです。

とりあえず使ってみるにはReleasesにColor Tool Initial Releaseのようにコンパイル済みのもの置かれているのでこちらをダウンロードするのがお勧めです(もしかしたら最新は更新されているかもしれません)。

現在のカラースキームを確認

ダウンロードしたzipを展開するとcolortool.exeというツールが出てくるので、まずは現在の設定状態を表示してみましょう。-c オプションを付けて実行すると現在のカラースキームでプレビューが表示されます。

C:\> colortool -c

カラースキームを設定する

現在のカラースキームを確認したところでカラースキームを変更するには colortool.exe にオプションなしでスキーム名を指定します。指定できるカラースキームは schemes フォルダにある ini ファイルまたは plist ファイルの名前(拡張子なし)となっています。

C:\> colortool campbell

ここで設定したものはこのコンソールのセッションに適用されるものなので、全く新しいセッションを始めた時や別な設定を持つショートカットから起動すると元のままになります。

設定を保存する

ColorToolには設定を永続化する機能も用意されています。

とりあえずは -b オプションを付けてデフォルトの設定を変更しておくとよいかと思います。

C:\> colortool -b campbell

カラースキームいろいろ

同梱されているカラースキームの他にもiTerm向けのカラースキームを使えるようになっているので、iTerm2-Color-Schemeからダウンロードしてきて適用することもできます。というか、同梱されているOneHalfやsolarizedはiTerm形式です。

campbell

campbell-legacy

deuteranopia

OneHalfDark

OneHalfLight

solarized_dark

solarized_light

UWP API経由でBluetooth LEの通知(Notify)をデスクトップアプリで受け取れない問題

Created at:

以前、CC2650STK SensorTagをUniversal Windows Platform APIから使うというエントリを書いたのですが、最近Creators Update以降(というかInsider Preview)で実行したところ通知が動かなくなっていました。

UWPアプリからは問題なく動くのですが、UWP APIを使う通常のいわゆるクラシックデスクトップアプリからはRead/Writeは正常に行えるもののデバイス側からNotify(通知)を受け取ることができなくなっていていました。

要するにコンソールアプリなどでは GattCharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify) を呼び出したにも関わらず ValueChanged イベントが発生しないという状況です。

解決方法

問題の解決方法ですが起動時に CoInitializeSecurity を呼び出すというおまじないを書くと動くようになります。

CoInitializeSecurity(IntPtr.Zero, -1, IntPtr.Zero, IntPtr.Zero, RpcAuthnLevel.Default, RpcImpLevel.Identify, IntPtr.Zero, EoAuthnCap.None, IntPtr.Zero);
[DllImport("ole32.dll")]
static extern int CoInitializeSecurity(IntPtr pVoid, int
cAuthSvc, IntPtr asAuthSvc, IntPtr pReserved1, RpcAuthnLevel level,
RpcImpLevel impers, IntPtr pAuthList, EoAuthnCap dwCapabilities, IntPtr
pReserved3);

public enum RpcAuthnLevel
{
Default = 0,
None = 1,
Connect = 2,
Call = 3,
Pkt = 4,
PktIntegrity = 5,
PktPrivacy = 6
}

public enum RpcImpLevel
{
Default = 0,
Anonymous = 1,
Identify = 2,
Impersonate = 3,
Delegate = 4
}

public enum EoAuthnCap
{
None = 0x00,
MutualAuth = 0x01,
StaticCloaking = 0x20,
DynamicCloaking = 0x40,
AnyAuthority = 0x80,
MakeFullSIC = 0x100,
Default = 0x800,
SecureRefs = 0x02,
AccessControl = 0x04,
AppID = 0x08,
Dynamic = 0x10,
RequireFullSIC = 0x200,
AutoImpersonate = 0x400,
NoCustomMarshal = 0x2000,
DisableAAA = 0x1000
}

あまり真面目に追っていないのでおまじない感がすごいですが一応通知が来るようになりました。ちなみにLINQPadからの実行の場合にはうまくいかない可能性が高いです(多分Windows Runtimeの初期化が先に走ってしまったり、再利用されたりなど)。

Windows 10 Insider Preview Build 16273以降

と、調べて解決して、このエントリーを書いた今日、Insider Previewの新しいビルドが来たので更新したところなんと CoInitializeSecurity 呼ばなくても動くように直っていました…oh…。

とりあえず何事もなく動くようになったのでよかったよかったということで…。