やる気駆動型エンジニアの備忘録

WPF(XAML+C#)の話題を中心に.NET/Android/CI やたまに趣味に関するブログです

(映画・感想)ブラック・ミラー:バンダースナッチ

NETFLIX オリジナル映画『ブラック・ミラー:バンダースナッチ 』の感想&レビューです。

あらすじ

1984年、天才プログラマーに出会い、ビデオゲーム「バンダースナッチ」の開発チャンスを得た若きプログラマーが主人公。ファンタジー小説に基づくゲーム開発に取り組むなかで、徐々に現実とパラレルリアリティが混同し始める…。

予告編

www.youtube.com

NETFLIX で話題沸騰らしい、映画の形として全く新しい「ストーリーを視聴者が選択できる」という映画です。 NETFLIX ではこの形式を"インタラクティブ映画"と称しています。"インタラクティブ"とは、直訳すると"相互に作用する"という意味ですが、コンピュータの世界では"双方向的なコミュニケーションが可能であること"、"ユーザーの操作に対して画面上の情報や内容が変化すること"を指し示します。

ちなみにブラック・ミラーというのはシリーズ物になっていて「社会風刺をブラックテイストに表現したオムニバス形式の物語」らしいです。オムニバス形式なので、1話ごとにストーリーや設定などは全く異なります。

以下、ネタバレ含みます!

続きを読む

(映画・感想)FEAR.INC -フィアー・インク-

2016年に公開された海外ホラー映画『FEAR.INC -フィアー・インク-』の感想&レビューです。

  • タイトル : FEAR.INC
  • 監督 : ヴィンセント・マシャーレ
  • 公開 : 2016年
  • ジャンル : ホラー
  • 出演
    • ルーカス・ネフ(ジョー・フォスター)
    • ケイトリン・ステイシー(リンジー
    • クリス・マークエット(ベン)
    • ステファニー・ドレイク(アシュリー)

あらすじ

本当に怖い体験がしたいならある会社へ連絡を。名刺にあった番号に早速電話したホラー映画好きの男。すると、彼と友人達に次々と恐怖の出来事が襲い掛かり...。

予告編


最高の恐怖を味わいたかったら電話しよう!映画『フィアー・インク』予告編

タイトルの"FEAR"は日本語で"恐れ"、".INC"は"法人企業"や"株式会社"を表す単語なので本国だと"株式会社恐れ"みたいなタイトルになるんでしょうか。めっちゃダサいです。

以下、ネタバレ含みます!

続きを読む

(映画・感想)BIRD BOX -バード・ボックス-

NETFLIX オリジナル映画『BIRD BOX -バード・ボックス-』の感想&レビューです。

あらすじ

謎の闇に突き動かされた者たちが相次々と命を絶ち、人口が激減して5年。ここまで生き延びてきた母親が2人の子供を連れて、安住の地を目指す危険な旅に出る。

予告編


視界を奪われた世界を生き抜く、サバイバル・スリラー『BIRD BOX/バード・ボックス』予告編

この監督の作品は始めてみましたが、Wikipedia で見る限り家族愛を描いた作品が多いんですかね?
あと、脚本の方が「エリック・ハイセラー」という方なのですが、過去に『遊星からの物体X ファーストコンタクト』の脚本もされていたそうで。あれも面白かった。
また、2017年に大ヒットした『君の名は。』のハリウッド実写版の脚本家にも抜擢されているそうです。これは知らなかった。

以下、ネタバレ含みます!

続きを読む

(WPF)Windows Community Toolkit の MapControl を使ってみた

随分と昔(といっても今年だった気がする)にXAML Islands というキーワードを目にしたのですが、そのパッケージが OSS 化されて WPF でも使用できるとのことなので試しに使ってみました。

XAML Islands って?

Windows のデスクトップ アプリケーション開発では UWP, WPF, Windows Forms があります。 しかし、現状 WPF, Windows Forms は新たな機能は追加されておらず、Windows API の恩恵を 100% 享受できているわけではありません。
そこで、UWP と同じコントロールをホストする機能として XAML Islands が登場しました。
(と、記憶しています。。。)
以下は参考ページです。

docs.microsoft.com

docs.microsoft.com

2018年12月現在、XAML Islands を使用するための NuGet パッケージが公開されています。
(GitHub) Microsoft.Toolkit.Win32

github.com

今回はこのパッケージを使用して XAML Islands の以下の機能を試してみます。

  • MapControl

なお、この記事で記載している内容は2018年11月27日にリリースされたVer.5.0.1時点のものです。

動作環境

github.com

github.com

MapControlの使い方

MapControl はその名の通り地図を表示・操作するためのコントロールです。
UWP の MapControl と全く同じように扱えるわけでは無いですが、似たようなよく使われる機能は揃っているようです。

docs.microsoft.com

docs.microsoft.com

ただし、Microsoft.Toolkit.Wpf.UI.Controls.MapControlに定義されているプロパティは実際には使用されていない(?)ようで、地図の位置や拡大率を変えてもプロパティの値が変更されませんでした。
タッチパネルなどで操作する場合は問題ないのですが、ボタン操作などで拡大率を変更したり、回転したい場合は以下の方法で実現します。(ただし、上記に書いたとおり MapControl プロパティの値は変化しないため、スライダーなどとデータバインドするといった使い方ができません)

MapControl に関するコード

拡大・縮小は 48行目、回転は 58行目、傾き(3Dビュー)は 68行目が該当箇所となっています。
それぞれのメソッドは非同期になっています。

また、表示座標・拡大率などを一度に設定する場合は 30行目にあるMapControl.TrySetViewAsyncメソッドを使用します。
MapControl は何らかの操作を行う際にアニメーションします。これは初期表示座標の移動時には少し不便だったため、アニメーションを非表示に設定しています。
さらに、一度MapControl.TrySetViewAsyncメソッドを呼び出してもタイミングによっては失敗することがありました。(原因はわかっていません)
この現象を回避するために座標設定が成功するまでリトライしています。(26行目~41行目)
この回避策が正しいかどうかはわかりませんが、これでひとまず初期座標の表示は可能です。

これを実行すると以下のような画面が表示されます。 f:id:iyemon018:20181228142317p:plain

オフライン環境でも使える

少し試しただけなのですが、どうやら MapControl はオフライン環境でも地図の表示が可能です。
[設定] - [アプリ] - [オフライン マップ] から地図データをダウンロードすればいいようですがこのあたりの仕組みはよくわかっていません。
また、重要なことですが日本地図はオフラインデータとして提供されていません。
試しにオフライン環境で実行してみましたが真っ白な地名も記載されていない背景だけが表示されます。
このあたりは Microsoft から提供されるまで待ちですね。

このように UWP と全く同じ機能を使用することはできませんが、WPF でも MapControl を使用することはできます。今後より良くなるには(OSS化されたとはいえ)Microsoft 次第なんでしょう。
近い内に他の機能(InkCanvas とか)も触ってみようと思います。

今回使用したサンプルはこちら↓↓↓↓↓

github.com

Jenkinsでインストーラーを作成する方法(Visual Studio 2017)

Jenkins でVisual Studio 2017 のInstaller Project を使用したインストーラーの自動ビルド方法について、これまでと若干異なる手順を踏む必要があったのでメモ

ちなみにVisual Studio 215 までは以下の方法でインストーラーの作成が可能です↓↓↓↓↓

iyemon018.hatenablog.com

これまでと異なる箇所

VS 2015 までは、以下のようなレジストリの値が最初から存在しました。

HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0_Config\MSBuild\EnableOutOfProcBuild

VS 2017 ではこのようなレジストリの値がなくなっています。
そのため、何もせずにインストーラーを実行しようとすると以下のメッセージが表示されます。

ERROR: An error occurred while validating.  HRESULT = '8000000A'

対策

無いものは作ればいい。ということでレジストリの値を作ってしまいましょう。
レジストリエディタを起動して以下のキーを追加します。

HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\15.0_XXXX_Config\MSBuild\EnableOutOfProcBuild

設定する値は"DWORD:0" です。

15.0_XXXX_Config となっている箇所は、"XXXX" 部分に何らかのコードが入ります。
バージョン番号でしょうか?私の環境では以下のようになっていました。
f:id:iyemon018:20181113173021p:plain

このコード部分は一致させないとビルドは失敗します。
このコードが環境によって異なるのか、バージョンによって異なるのかわかっていません。

もしかするとこのコードは可変値の場合があるため、状況によっては手動でレジストリキーを変える必要があるかもしれませんのでご注意ください。

(WPF)タッチキーボードを表示する -その2-

先日、WPF でタッチキーボードを表示する方法について書いたのですが、実際にアプリに組み込む場合はこの方法だけでは不足していたので、もうちょい実用的なコードとしてまとめてみます。

iyemon018.hatenablog.com

動作環境

前回と同じ

問題点

  1. タッチキーボードを表示してフォーカスが離れてもタッチキーボードが表示されたままになる。
  2. TextBox がフォーカスを取得した際に何らかの原因でタッチキーボードが即非表示になる。
    →これについては明確な原因はわかっていません。2 in 1 タブレット環境のみ発生する(?)ようです。

対策

問題点1. については、TextBox のLostFocus 時にTabTip.exe プロセスへSendMessage すればOK です。
問題点2. は、原因がわかっていないのでベストプラクティスではない可能性がありますが、フォーカス取得時に起動中のTabTip.exe プロセスをKill することで回避可能です。

具体的なコード

今回は既存のプログラムにも追加が簡単にできるようにBehavior で作ってみました。
なお、Behavior は、System.Windows.Interactivity.dll の参照を追加する必要があります。

続きを読む

(WPF)タッチキーボードを表示する

Windows10 + WPF でTextBox を選択したときにタッチキーボードが表示されない現象についてハマったのでメモ

動作環境

タッチキーボードが表示されない

通常、Windows10 環境であれば入力領域を選択するとタッチキーボードが表示されます。
しかし、動作環境のタブレットでTextBox を選択してもタッチキーボードが表示されないケースがありました。
この現象が発生したのがASUS R105H という2 in 1 タブレットです。
また、このタブレットで"タブレットモードOFF" にするとタッチキーボードが表示されなくなります。
"タブレットモードON" だとタッチキーボードは表示されます。
対象のコントロールはTextBox とPasswordBox です。

原因

いろいろ調査した結果、以下の設定が原因のようでした。
[Windows の設定] - [デバイス] - [入力] から以下の設定が OFF だと、この現象が発生します。(Windows10 1709 ではこのメニューでした)
f:id:iyemon018:20181019184434p:plain

複数の端末を確認したところ、

  • デスクトップはデフォルトOFF
  • キーボード付きタブレットはデフォルトOFF
  • キーボードなしタブレットはデフォルトON

のようです。
ただし、OS バージョンや環境によっては設定が変わっている場合もあります。

対策

単純に「タブレットモードON にする」「上記の設定をON にする」であれば回避可能です。
ただし、不特定多数の端末にアプリをインストールする必要がある場合はアプリ側で回避する必要があります。
実際には以下の手順を実行します。

  1. レジストリエディタからタッチキーボードをON にする。
    HKEY_CURRENT_USER\Software\Microsoft\TabletTip\1.7\EnableDesktopModeAutoInvoke を 1 にする。
  2. タッチキーボードのプロセスを実行する。
    タッチキーボードのプロセスは"C:\Program Files\Common Files\microsoft shared\ink\TabTip.exe"

具体的なコード

namespace KeyboardTest
{
    using System.Diagnostics;
    using System.Windows;
    using Microsoft.Win32;

    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void UIElement_OnGotFocus(object sender, RoutedEventArgs e)
        {
            // レジストリの値が 1 であればタッチキーボードは ON になっている。
            int value = (int)(Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\TabletTip\1.7", "EnableDesktopModeAutoInvoke", -1) ?? -1);
            if (value != 1)
            {
                Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\TabletTip\1.7", "EnableDesktopModeAutoInvoke", 1);
            }

            Process.Start(@"C:\Program Files\Common Files\microsoft shared\ink\TabTip.exe");
        }
    }
}

ただし、デスクトップなどでUSB により物理キーボードを接続している場合はタッチキーボードが表示されますが、2 in 1 タブレットなど予めキーボードが付属しているものはタッチキーボードが表示されません。

これらのレジストリやプロセスは今後のWindows Update によって変更になる or 使用できなくなる可能性が充分あるため、もう少しスマートな回避策がほしいところですが、私の調べた限りではこれ以上の情報がありませんでした…。

ちなみに、以下のページで.NET Framework 4.6.2 にアップデートするとタッチキーボードが自動で表示できるようになるよ という情報を見ましたが、実際にはそのように動作しませんでした。
環境によるのでしょうか?

blog.mzikmund.com

このあたりの情報をお持ちの方がいらっしゃいましたら教えてくださいm( )m