投稿

11月, 2021の投稿を表示しています

C# Fontクラスを使うときはこれに注意

イメージ
先日は 新しくパソコンを自作した ので、Windowsもクリーンインストールしました。 いつも使っていた「写真に文字を入れる」自作アプリがあって、新しいパソコンでも普通に使えました。 それが、何日後に出力された写真を使おうとしたら、「あれ?何かが違う!」と感じて、よく見てみたら、写真に描画された文字のフォントが違うではありませんか!? そういえばWindowsをインストールしたけど、そのフォントをまだ入れていないと思い出しました。 フォントが見つからなかったら、なんでエラーが出ないんだろうと不思議に思って、早速コードを調べてみました。 C#のFontクラスにはfallback代替フォントが存在している 指定フォントが見つからないときの挙動 Font Classの公式仕様を調べてみる 指定フォントが見つからないときにエラーを出す方法 Fontが見つからないときにエラーを出すべきかどうか C#のFontクラスにはfallback代替フォントが存在している 指定フォントが見つからないときの挙動 指定のフォントが見つからなかったときはExceptionを投げてくれると期待しました。 string fontName = "My Font" ; Font font = new Font(fontName, 12 ); } /* * fontを使うコード */ わざと存在しないFontを指定して、fontオブジェクトの中身をDebugで見てみよう: Exceptionを出さずに代替フォント Microsoft Sans Serif が自動的に使われています!  Font Classの公式仕様を調べてみる Microsoft DocサイトのFont Classページ に注意書きがありました: If you attempt to use a font that is not supported, or the font is not installed on the machine that is running the application, the Microsoft Sans Serif font will be substituted. やっぱり、サポートされないフォントあるいはインストールされて

Windows SecurityでFull ScanしたらCPU温度が100℃まで上がった件

イメージ
久しぶりにデスクトップPCを自作しました。 少しトラブルが発生しましたので、忘れないうちにメモしておきます。 目次 Core i5-11400が100℃になった経緯 問題と原因分析 2つの問題 パーツの構成 CPUの仕様とMBの初期設定が原因 CPUの使用率が100%でも100℃にならないための対策 基本的な考え方 すぐにとった対策 今後とる予定の対策 予備対策 後書き Core i5-11400が100℃になった経緯 デスクトップパソコンを組み立てて、Windows 10を入れて11にアップグレードして、以前のファイルも移行完了しました。 さてウイルススキャンでもしとこうかと、Windows Securityを起動し、 Full Scan を実行しました。 すると、1-2分経った頃かな、ケースからファンの大きな音がしてきました。 新しいPCですし、ファンの回転数はどれくらいか気になって、HWMonitorを開いて見てみることにしました。 ファンの回転数よりは先に目に入ったのが赤い文字となったCPUコアの温度でした。なんと複数のコアがずらりと 100℃ !!! (少し慌てたためスクリーンショットを撮りませんでした💦) タスクマネージャーを急いで開いたら、全部のコア/スレッドが使用率100%! これはやばいと思い、すぐにウイルススキャンを中止したら、CPUの温度も徐々に40℃台に戻りました。  問題と原因分析 2つの問題 今回の問題は2つに分解できます。 1. Windows SecurityでフルスキャンしたらCPUの使用率が全コアで100%になる これは新しい問題ではありません。 ググってみたら数年前にも報告されており、今でもWindowsのFeedback Hubで多数報告されています。 マイクロソフトはこの問題を解決する予定があるかどうかは不明です。 そもそも、冷静に考えてみますと、これが問題かどうか自体はあいまいです。 「ソフトウェアはCPUの資源を全部使ってはいけません」 というルールがないはずですし、あるとしても、ユーザーが複数のソフトを同時に使う場面では、CPUの使用率が100%になるシナリオが十分あり得ます。 また、Windows SecurityはCPU使用率に関

C#アプリからWindows File Explorerでファイル検索結果を表示する

イメージ
C#のアプリから品番で商品の写真を検索する等、時々WindowsのFile Explorerでファイルの検索結果を表示する必要があります。 アプリ自体は検索結果の表示機能を実装していない場合はWindowsのFile Explorerで検索結果を表示させるのが近道です。 今回は search-ms: プロトコルでの検索方法をメモします。 目次 C#からWindows File Explorerで検索結果を表示する 指定場所でkeywordを検索するC#サンプルコード 構文説明 search-ms プロトコル query=keyword crumb=location:E:\test 他の例 編集された日付指定で検索 編集された日付範囲指定で検索 ファイルの種類で検索 検索方法をさらに広げる C#からWindows File Explorerで検索結果を表示する 指定場所でkeywordを検索するC#サンプルコード string keyword = ".cs" ; string location = "E:\\test" ; string queryString = $@"search-ms:query= {keyword} &crumb=location: {location} " ; ProcessStartInfo processStartInfo = new ProcessStartInfo(queryString); processStartInfo.UseShellExecute= true ; Process.Start(processStartInfo); 構文説明 search-ms プロトコル search-ms: プロトコルを指定すれば、WindowsではデフォルトとしてFile Explorerで検索画面を開く。 search: でも動くようです。 query=keyword 検索するキーワードを指定します。 crumb=location:E:\test 検索する場所を指定します。 他の例 編集された日付指定で検索 string queryString = $@"search-ms:

C#正規表現で文字をReplaceする3つの方法と使い分け

目次 正規表現(Regular expression,Regex)について Regex.Replace()メソッドの3つの使い方 1. 一斉置換の結果だけがほしいときの使い方 2. 個々のMatch結果を見たり処理したいときの使い方 3. 上記2と同じでMatch.Result(replace)を使う方法 少し深堀: Match.Result() でなければならない?シナリオ まずMatchのパターンを変える そしてreplace文字列は開発者指定ではなくユーザー入力で取得する この状況で個々のMatchを追跡しながら一斉置換する まとめ: Match.Result() が必要なシナリオ 正規表現(Regular expression,Regex)について 正規表現は自分にとって不可欠な存在です。非常に頻繁に使います。 パターンの文法はいろいろあるものの、よく使ういくつかを覚えておけば、結構不便なく使えます。 先日はMatchされた文字列の置換(Replace)について、少し困った場面に出遭い勉強になりましたので、ここで整理しておきたいと思います。 Regex.Replace()メソッドの3つの使い方 まず例として以下のinput文字列とパターンがあるとします。 string input = "1月30万円、2月60万円、3月100万円" ; //"30万円","60万円","100万円"をMatchするpattern string ptnAmount = @"(\d+)万円" ; 1. 一斉置換の結果だけがほしいときの使い方 これは一番シンプルです。一斉置換の結果だけほしくて、個々のMatchに興味がない場合: //個々のMatchを追跡せずに一斉置換 string output = Regex.Replace(input, ptnAmount, "${1}0,000円" ); Console.WriteLine( "output:" ); Console.WriteLine(output); 結果出力、ただ置換するだけですので、100万円を超えた場合の表示に