より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

WPFのKeyDownでSpaceキーの判定ができない。PreviewKeyDownを用いる

ListBoxのKeyDownイベントでSpaceキーを入力された時の判定をしようとしたのですが、出来ないようです。

なので、PreviewKeyDownイベントで行う必要があります。

Spaceキーのようなコントロールの操作に使う特別なキーについてはPreviewKeyDownで止まってしまうようです。

以下の記事の説明がわかりやすいです。

cyberboy6.blog.fc2.com

WPFのKeyDownイベントでKey.Systemとなってしまう場合は、e.SystemKeyで判定

            if ((modifiers & ModifierKeys.Alt) != ModifierKeys.None)
            {
                switch (e.Key)
                {
                    case Key.Up:
                        ShiftUpCommandToolStripMenuItem_Click(null, null);
                        break;
                    case Key.Down:
                        ShiftDownCommandToolStripMenuItem_Click(null, null);
                        break;
                }
            }

上記のようなショートカットキーを書いた場合

f:id:rimever:20210327161027p:plain

と、Key.Upになるはずが、Key.Systemに化けてしまいます。

どーすんのこれ?と思ったのですが、どうやら、e.SystemKeyで取得すればいいようです。

            if ((modifiers & ModifierKeys.Alt) != ModifierKeys.None)
            {
                if (e.SystemKey == Key.Up)
                {
                        ShiftUpCommandToolStripMenuItem_Click(null, null);
                }
                if (e.SystemKey == Key.Down)
                {
                        ShiftDownCommandToolStripMenuItem_Click(null, null);
                }
            }

参考資料

stackoverflow.com

やっぱりAdd brace。中括弧つけませんか

今の職場って、C#のコードを

if (a==b) return;

というのはまだしも

if (a==b)
   return;

とすることがあるようです。

個人的には一行でも

if (a==b) {
   return;
}

と中括弧で囲って欲しいなぁと思ってました。

というのも中括弧で囲わない場合は、一行ならいいですが、複数行になるとまずいことになります。

とはいえ、郷に入っては郷に従えというのか、まあ、そこまでめくじら立てることもないだろうと。

中括弧で囲うとソースが長くなるデメリットがあるため、トレードオフです。

しかし、こんなことが起きてしまったんですよねえ

if (a==b)
return;

結果としてはインデントがあってもなくても一緒です。

f:id:rimever:20210325214216p:plain

でも紛らわしいですよね。

この程度のコードで事故ることはほとんどないです。ソースレビューしていれば。

ただ、切羽詰まった時どうか。リリース間近で障害が見つかって修正している時。

そういう時にやっぱりうっかりミスで失敗して、無に帰すようなことを招きたくないよなあと思った次第でした。

前職では、「なるべく安全サイドに倒せ」という合言葉がありましたが、そうでしょう。

防御的コードとある本に書いてありましたが、それです。

読書感想「世界のミシュラン三ツ星レストランをほぼほぼ食べ尽くした男の過剰なグルメ紀行」

世界のミシュラン三ツ星レストランをほぼほぼ食べ尽くした男の過剰なグルメ紀行 (ワニの本)

一介のサラリーマンだが、世界のミシュランを食べ歩いている人による本です。

といっても慶應出身なので、それなりの職についているのでしょうが。

まあ、とにかく、筆者のミシュランに対する情熱が迸ります。

特に冒頭が熱く、グルメ紀行や食べたものの内容うんぬんより端端から出てくる筆者の名言の数々がすごい。

僕はずっと独身だ。女優の松下奈緒氏と米倉涼子氏の大ファンではあるのだが……(笑)。ああ、僕は欲しいものが世界の三ツ星レストランの料理で良かったのかもしれない。僕は幸せ者だ。

ミシュラン三ツ星レストランはコースで3万。ホテルで1万、あとは交通費となってくるわけですが、安くはない、高いです。

しかし、お金さえ払えば手に入るんですからね。なるほど、と。

グルメレポーターは、自分でお金を払っていないから、食事の料金について語らない

これは料理評論家には書けない言葉ですね。

日本のミシュランの星は評価基準がブレていてフランスのと比べられない、フランスにも星を減らすことのできないアンタッチャブルな三ツ星レストランが存在するといった料理評論家ではないからこそ書ける記事もあります。

ちなみに、筆者、お金と時間をかけて世界各地の三ツ星レストランを食べて回っているのですが、お酒はほとんど飲まない方です。

これまでの費用をざっと計算しても5000万ほどとのこと。お酒まで飲んだら、どうなっていたことか。

筆者はただ三ツ星レストランをありがたがっているだけの人ではなく、自分の舌でその味を確かめ、評価しています。

三ツ星以外の都内のお店も紹介していて、弁天山美家古寿司と鳥しきは気になりましたね。

WPFのユーザーコントロール側からショートカットキーを設定する

以下のようなOK/Cancelのコントロールを作成して各画面に配置していたのですが、OKといったらAlt+Oのショートカットキーでしょうと。

f:id:rimever:20210324211316p:plain

素直にXAMLでWindow.InputBindingsを指定して回るのも手間だなあということで、以下のようにしてみました。

        public OkCancelPanel()
        {
            InitializeComponent();
            Loaded += OnLoaded;
        }

        private void OnLoaded(object sender, RoutedEventArgs e)
        {
            var parentWindow = Window.GetWindow(this);
            if (parentWindow != null && OkCommand != null)
            {
                parentWindow.InputBindings.Add(new KeyBinding(OkCommand, Key.O, ModifierKeys.Alt));
            }
        }

コンストラクタの時点ではウインドウを取得するとnullとなるので、Loadedのタイミングで設定しています。

成城石井のジャムを買ってみた

パンスクのサブスクリプションを開始したのですが、パンには食パンも入ってました。

さすがに食パンをそのまま食べるのはちょっとなー、ということでそういえば成城石井にジャムがあったなと

成城石井の人気ジャム特集!果肉たっぷりで美味しいおすすめはコレ! | jouer[ジュエ]

できれば、いちごバターが欲しかったのですが、ありませんでした。

その代わりに果実60%いちごジャムが買えました。

なんとこのジャム、丸ごとのいちごがどっさり入っているジャムです。

なんとも贅沢で宝石箱のようなジャムです。

Amazon Primeでリトルフォレストという映像を見ていたのですが、田舎暮らしの女性が自家製のジャムを作るシーンがありますが、まさしくそれです。

それが買えばすぐ食べられるのです。

食べてみると、味は自分のイメージするいちごジャムですね。甘すぎることもありません。

ちなみに、パンスクの食パンは実はそのまま食べても美味しいです。

聖樹のパンという漫画では、バゲットクリームチーズやバターを塗ってジャムをどっさり載せるタルティーヌという食べ方が紹介されてますが、それも機会があればやってみたいですね。

正規表現で、 a=bをb=aに入れ替える

画面を開く時には引数で渡されたクラスの値を入力値に代入。

   hoge.a = foo.b;
   hoge.c = foo.d;

保存時には、入力値を渡されたクラスの値に返す。

   foo.b = hoge.a;
   foo.d = hoge.c;
   

この二度手間はなるべく避けたいところですが、どうしても必要です。

コードを書くとき、片方だけ書いて、もう片方は正規表現でひっくり返せないかなと。

以下のように指定すれば良さそうです。

  • 置換前 ([^\s=]+)\s+=\s+([^\s=;]+);
  • 置換後 $2 = $1;

f:id:rimever:20210321215448p:plain