xin9le.net Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。 2024-03-05T22:08:43+09:00 xin9le Hatena::Blog hatenablog://blog/8454420450074880027 MudBlazor 標準の css / js が 404 になる場合の対処方法 hatenablog://entry/6801883189088454826 2024-03-05T22:08:43+09:00 2024-03-05T22:08:43+09:00 Blazor で綺麗な画面を作ろうと思ったら、まず UI Component ライブラリの利用を考えます。過去に利用経験があり、そこそこお気に入りなのが MudBlazor です。 久々に使ってみる機会があったので触ってみたら、導入段階でいきなり大きく躓いたので対処方法をメモ。 遭遇した事象 MudBlazor をプロジェクトに組み込もうとすると、NuGet 参照したあとに css / js を追加しておく必要があります。.NET 8 以降であれば App.razor に以下のように追加することになります。特に何も難しくなく、ほぼこれだけで下準備は終わりです。 <!DOCTYPE html> … Blazor で綺麗な画面を作ろうと思ったら、まず UI Component ライブラリの利用を考えます。過去に利用経験があり、そこそこお気に入りなのが MudBlazor です。 久々に使ってみる機会があったので触ってみたら、導入段階でいきなり大きく躓いたので対処方法をメモ。 遭遇した事象 MudBlazor をプロジェクトに組み込もうとすると、NuGet 参照したあとに css / js を追加しておく必要があります。.NET 8 以降であれば App.razor に以下のように追加することになります。特に何も難しくなく、ほぼこれだけで下準備は終わりです。 <!DOCTYPE html> … xin9le C# 12 の新機能「Primary Constructors」に対する IntelliSense の神対応 hatenablog://entry/6801883189070231624 2023-12-27T22:09:43+09:00 2023-12-27T22:09:43+09:00 2023 年 11 月に C# 12 が正式リリースされました!大変おめでたいし、Microsoft 本社の C# 開発チームの方々には (毎年のことながら) 感謝申し上げます...! で、C# 12 で導入された目玉機能のひとつに Primary Constructors というものがあります。必須コンストラクタを record 型っぽい記述で書けるようにする機能です。 class A(int x) { public int X { get; } = x; } これは C# 6 の頃から導入が検討されていた機能で、約 10 年弱の検討と改良を経て正式に採用されました。以下の記事は 2014/… 2023 年 11 月に C# 12 が正式リリースされました!大変おめでたいし、Microsoft 本社の C# 開発チームの方々には (毎年のことながら) 感謝申し上げます...! で、C# 12 で導入された目玉機能のひとつに Primary Constructors というものがあります。必須コンストラクタを record 型っぽい記述で書けるようにする機能です。 class A(int x) { public int X { get; } = x; } これは C# 6 の頃から導入が検討されていた機能で、約 10 年弱の検討と改良を経て正式に採用されました。以下の記事は 2014/… xin9le Path.GetDirectoryName() は overload によって挙動が異なる hatenablog://entry/6801883189060369210 2023-11-20T21:26:53+09:00 2023-11-20T21:26:53+09:00 久々に Path.GetDirectoryName() を使ったら、件名の通りの挙動に引っ掛かりました。文章で説明するよりもサンプルコードを見た方が早いので、以下をご覧ください。 const string fileName = "A/B/C/D.cs"; var dir1 = Path.GetDirectoryName(fileName); dir1.Dump("string"); // A\B\C var dir2 = Path.GetDirectoryName(fileName.AsSpan()); dir2.Dump("ReadOnlySpan<char>"); // A/B/C ご覧の… 久々に Path.GetDirectoryName() を使ったら、件名の通りの挙動に引っ掛かりました。文章で説明するよりもサンプルコードを見た方が早いので、以下をご覧ください。 const string fileName = "A/B/C/D.cs"; var dir1 = Path.GetDirectoryName(fileName); dir1.Dump("string"); // A\B\C var dir2 = Path.GetDirectoryName(fileName.AsSpan()); dir2.Dump("ReadOnlySpan<char>"); // A/B/C ご覧の… xin9le Swashbuckle.AspNetCore.Cli で FileLoadException が出る場合の対処 hatenablog://entry/820878482944454928 2023-06-25T23:02:03+09:00 2023-06-25T23:02:03+09:00 最近社内で「CI で swagger.json を生成したいから対応してほしい」と言われてやってみました。そして思いっきりハマりました。ということで忘れないようにメモ。 ちなみに本内容は執筆時点での最新版である「.NET 7 + Swashbuckle.AspNetCore (v6.5.0)」で再現しているもので、バージョンが異なると挙動が変わる可能性があります。その点はご了承ください。 TL;DR SwaggerHostFactory.CreateHost を利用する 古き良き Startup クラスを使って IHost を生成する 発生した問題を再現してみる 最小プロジェクトを準備 細かい… 最近社内で「CI で swagger.json を生成したいから対応してほしい」と言われてやってみました。そして思いっきりハマりました。ということで忘れないようにメモ。 ちなみに本内容は執筆時点での最新版である「.NET 7 + Swashbuckle.AspNetCore (v6.5.0)」で再現しているもので、バージョンが異なると挙動が変わる可能性があります。その点はご了承ください。 TL;DR SwaggerHostFactory.CreateHost を利用する 古き良き Startup クラスを使って IHost を生成する 発生した問題を再現してみる 最小プロジェクトを準備 細かい… xin9le Azure Functions (Isolated) における ITelemetryInitializer / ITelemetryProcessor の注意点 hatenablog://entry/820878482936048060 2023-05-27T17:29:33+09:00 2023-05-27T17:29:33+09:00 最近 Azure Functions (Isolated) から出力される Application Insights のテレメトリと格闘していました。何を今更そんなに格闘することがあるのかというと、テレメトリの一種である RequestTelemetry に対するアクセスが全くできないという問題に遭遇したからです。今回はそんな挙動について調べたことを残していきます。 tl;dr; Azure Functions (Isolated) において、一部のテレメトリ (RequestTelemetry など) にアクセスできない Azure Functions (Isolated) が Host と… 最近 Azure Functions (Isolated) から出力される Application Insights のテレメトリと格闘していました。何を今更そんなに格闘することがあるのかというと、テレメトリの一種である RequestTelemetry に対するアクセスが全くできないという問題に遭遇したからです。今回はそんな挙動について調べたことを残していきます。 tl;dr; Azure Functions (Isolated) において、一部のテレメトリ (RequestTelemetry など) にアクセスできない Azure Functions (Isolated) が Host と… xin9le 2022 年の振り返りと 2023 年の抱負 hatenablog://entry/4207112889951303754 2023-01-05T18:52:58+09:00 2023-01-05T18:52:58+09:00 あけましておめでとうございます! ということで 2023 年が始まりました。昨年に引き続き、今年も忘れないように振り返りと抱負を書き残しておこうと思います。 健康 まず、昨年は 2022 年の抱負としてこんなことを書きました。 健康には真剣に目を向けたい。最近腰痛がかなりひどく、湿布と飲み薬に頼り切りというアカンコレ状態...。健康が理由でプログラマ人生が短くならないようにしていかなければ。 結果としては完全にダメでした。過去一番の体調不良で反省してもしきれないくらい反省しています。おかげで医療費がとんでもない額になりました。 4 月と 6 月に 2 度ピポった (= 救急車で搬送された) 右… あけましておめでとうございます! ということで 2023 年が始まりました。昨年に引き続き、今年も忘れないように振り返りと抱負を書き残しておこうと思います。 健康 まず、昨年は 2022 年の抱負としてこんなことを書きました。 健康には真剣に目を向けたい。最近腰痛がかなりひどく、湿布と飲み薬に頼り切りというアカンコレ状態...。健康が理由でプログラマ人生が短くならないようにしていかなければ。 結果としては完全にダメでした。過去一番の体調不良で反省してもしきれないくらい反省しています。おかげで医療費がとんでもない額になりました。 4 月と 6 月に 2 度ピポった (= 救急車で搬送された) 右… xin9le Azure Functions (Isolated Worker) で QueueMessage 型にマップする hatenablog://entry/4207112889942383141 2022-12-07T02:04:03+09:00 2022-12-07T12:50:48+09:00 .NET で利用する Azure Functions には In-Process Model と Isolated Model のふたつがあります。Isolated Model は .NET 6 から利用できるようになった新しいタイプです。それぞれの違いについては公式ドキュメントをご覧ください。 .NET 7 以降では Isolated Model を利用することが強制されるので、.NET 6 以前から Azure Functions を利用している方は移行作業が必要になります。そのときに必要となる作業のひとつとして「QueueTrigger 開発時に QueueMessage 型に直接マップ… .NET で利用する Azure Functions には In-Process Model と Isolated Model のふたつがあります。Isolated Model は .NET 6 から利用できるようになった新しいタイプです。それぞれの違いについては公式ドキュメントをご覧ください。 .NET 7 以降では Isolated Model を利用することが強制されるので、.NET 6 以前から Azure Functions を利用している方は移行作業が必要になります。そのときに必要となる作業のひとつとして「QueueTrigger 開発時に QueueMessage 型に直接マップ… xin9le .NET 6 以前の環境下で C# 11 の required キーワードを利用する hatenablog://entry/4207112889942369775 2022-12-05T00:46:01+09:00 2022-12-05T01:14:07+09:00 C# 11 / .NET 7 で required キーワードが利用できるようになりました。詳細は公式ドキュメント等に譲りますが、簡単に説明するとプロパティやフィールドのオブジェクト初期化子で値を代入することを強制する機能です。 // こういうクラスがあるとして... public class Person { public required string Name { get; init; } public int? Age { get; init; } } // Name プロパティを初期化していないのでエラー var p = new Person(); // これは OK // Age … C# 11 / .NET 7 で required キーワードが利用できるようになりました。詳細は公式ドキュメント等に譲りますが、簡単に説明するとプロパティやフィールドのオブジェクト初期化子で値を代入することを強制する機能です。 // こういうクラスがあるとして... public class Person { public required string Name { get; init; } public int? Age { get; init; } } // Name プロパティを初期化していないのでエラー var p = new Person(); // これは OK // Age … xin9le Azure Functions (Isolated Worker) で AppInsights に出力したログが LogLevel.Warning 以上にフィルターされてしまう問題への対処 hatenablog://entry/4207112889942100267 2022-12-04T03:40:34+09:00 2022-12-04T04:13:18+09:00 タイトルがだいぶ長いんですが、執筆時点でタイトル通りの問題が発生します。最近 .NET 7 がリリースされたので、業務コードを順次 C# 11 / .NET 7 へ移行を開始しています。そんな中 Azure Functions を In-Process Model から Isolated Model に乗せ換えるにあたって Application Insights のログ周りでハマったので、今回はその回避方法を紹介します。まずは発生状況を箇条書きで整理しましょう。 Azure Functions (Isolated Worker) を利用したい .NET 7 を利用する場合はこれ一択 Appl… タイトルがだいぶ長いんですが、執筆時点でタイトル通りの問題が発生します。最近 .NET 7 がリリースされたので、業務コードを順次 C# 11 / .NET 7 へ移行を開始しています。そんな中 Azure Functions を In-Process Model から Isolated Model に乗せ換えるにあたって Application Insights のログ周りでハマったので、今回はその回避方法を紹介します。まずは発生状況を箇条書きで整理しましょう。 Azure Functions (Isolated Worker) を利用したい .NET 7 を利用する場合はこれ一択 Appl… xin9le C#/.NET で和暦の元年表記をするときの注意点 hatenablog://entry/4207112889931387486 2022-10-28T00:26:56+09:00 2022-10-28T00:31:00+09:00 ちょっとした Tips というか「あれ?」となったので備忘録としてメモします。 ひと言まとめ 元年表記したければ y と 年 をくっ付けろ 日頃から数字と文字の間に半角スペースを入れる癖があって、何気なくいつも通り半角スペースを入れたら 令和 1 年 になって気付いたという。 サンプルコード var culture = new CultureInfo("ja-jp"); culture.DateTimeFormat.Calendar = new JapaneseCalendar(); var date = new DateOnly(2019, 5, 1); date.ToString("ggy… ちょっとした Tips というか「あれ?」となったので備忘録としてメモします。 ひと言まとめ 元年表記したければ y と 年 をくっ付けろ 日頃から数字と文字の間に半角スペースを入れる癖があって、何気なくいつも通り半角スペースを入れたら 令和 1 年 になって気付いたという。 サンプルコード var culture = new CultureInfo("ja-jp"); culture.DateTimeFormat.Calendar = new JapaneseCalendar(); var date = new DateOnly(2019, 5, 1); date.ToString("ggy… xin9le SqlBulkCopy + IDataReader を利用した IEnumerable<T> の高効率なバルク挿入 hatenablog://entry/4207112889924595162 2022-10-05T01:20:41+09:00 2022-10-05T01:21:57+09:00 C# / .NET + SQL Server 環境において Bulk Insert をするのはなかなかお手間です。それもこれも SqlBulkCopy という専用クラスがなかなか曲者なためなのですが。ただただ IEnumerable<T> のようなコレクションを挿入するのにひと工夫というか、ひと手間必要なのが心理的にハードルが高い。初見殺し! 僕自身、過去にやっていたのは DataTable を利用した方法でした。以下の記事に良い例が載っているので詳細はそちらに譲りますが、DataTable のインスタンスを作るにあたって一度データのコピーが必要になる上に、要素数が多いと内部の動的配列の拡張が… C# / .NET + SQL Server 環境において Bulk Insert をするのはなかなかお手間です。それもこれも SqlBulkCopy という専用クラスがなかなか曲者なためなのですが。ただただ IEnumerable<T> のようなコレクションを挿入するのにひと工夫というか、ひと手間必要なのが心理的にハードルが高い。初見殺し! 僕自身、過去にやっていたのは DataTable を利用した方法でした。以下の記事に良い例が載っているので詳細はそちらに譲りますが、DataTable のインスタンスを作るにあたって一度データのコピーが必要になる上に、要素数が多いと内部の動的配列の拡張が… xin9le .NET 6 で Microsoft.Extensions.Configuration から DateOnly / TimeOnly 型に直接マッピングする hatenablog://entry/4207112889906389581 2022-08-07T01:06:10+09:00 2022-08-07T01:10:50+09:00 .NET 6 で DateOnly および TimeOnly 型が追加されました。日付や時間のみを扱う (若干残念な名前を除けば) 待望の子ですね。 ところで、アプリケーション構成として日付や時間 (特に時間) を扱うことはちょくちょくあるのではないかと思います。現代の .NET (Core 系) でアプリケーションの構成情報を利用すると言えば Microsoft.Extensions.Configuration の IConfiguration ですが、実はここから DateOnly や TimeOnly に直接マッピングできません、残念ながら。DateTime や DateTimeOffs… .NET 6 で DateOnly および TimeOnly 型が追加されました。日付や時間のみを扱う (若干残念な名前を除けば) 待望の子ですね。 ところで、アプリケーション構成として日付や時間 (特に時間) を扱うことはちょくちょくあるのではないかと思います。現代の .NET (Core 系) でアプリケーションの構成情報を利用すると言えば Microsoft.Extensions.Configuration の IConfiguration ですが、実はここから DateOnly や TimeOnly に直接マッピングできません、残念ながら。DateTime や DateTimeOffs… xin9le Azure App Service の Always On リクエストにのみ応答する hatenablog://entry/13574176438091515140 2022-05-12T01:30:44+09:00 2022-05-12T01:30:44+09:00 Azure App Service を使っている場合、特に本番環境では Always On を有効化することになると思います。日本語の Azure Portal だと「常時接続」と表記されるもので、一定間隔でホストしている Web アプリに対してリクエストを投げることで、アプリがアイドル状態にならないようにするものです。Cold Start になると初速が出ないので、その対策に使われるものですね。 この Always On 設定を有効化していると、Azure App Service が定期的に Root URL (= /) に対して GET メソッドでアクセスしてきます。「それが何だよ」って話… Azure App Service を使っている場合、特に本番環境では Always On を有効化することになると思います。日本語の Azure Portal だと「常時接続」と表記されるもので、一定間隔でホストしている Web アプリに対してリクエストを投げることで、アプリがアイドル状態にならないようにするものです。Cold Start になると初速が出ないので、その対策に使われるものですね。 この Always On 設定を有効化していると、Azure App Service が定期的に Root URL (= /) に対して GET メソッドでアクセスしてきます。「それが何だよ」って話… xin9le あいうえお表、10 分で作れますか? hatenablog://entry/13574176438058023257 2022-01-30T00:24:41+09:00 2022-01-30T00:24:41+09:00 Burikaigi 2022 が開催されました。運営のお仕事と「C# ドキドキ・ライブコーディング対決」の登壇をしました。もう 10 年近く毎年ライブコーディング対決をしていますが、一見「こんなの簡単だろ」と思えるような問題でも全然解けないんですよねぇ...。 今回は問題を載せておきましたので、もしご興味があれば是非トライしてみてください。本記事の最後に回答例を載せておきましたが、解法はいくつもあるのでご参考まで。回答例が表示されないよう勢いよく下までスクロールせず、脳トレとして遊んでみていただけますと幸いです。 「あいうえお表」を作れ (制限時間 : 10 分) ということで今回出されたお題… Burikaigi 2022 が開催されました。運営のお仕事と「C# ドキドキ・ライブコーディング対決」の登壇をしました。もう 10 年近く毎年ライブコーディング対決をしていますが、一見「こんなの簡単だろ」と思えるような問題でも全然解けないんですよねぇ...。 今回は問題を載せておきましたので、もしご興味があれば是非トライしてみてください。本記事の最後に回答例を載せておきましたが、解法はいくつもあるのでご参考まで。回答例が表示されないよう勢いよく下までスクロールせず、脳トレとして遊んでみていただけますと幸いです。 「あいうえお表」を作れ (制限時間 : 10 分) ということで今回出されたお題… xin9le 起動速度は?メモリ使用量は?Azure App Service における環境ごと (Windows / Linux) の ASP.NET Core 実行時のパフォーマンス差を調べてみた! hatenablog://entry/13574176438054998238 2022-01-21T15:32:26+09:00 2022-01-21T15:45:18+09:00 業務で (最近では副業でも) ずっと利用している Azure App Service!大変便利で使いやすく、大好きです。ところで最近の風潮的には ASP.NET Core も Docker とか Linux インスタンスでホストするのがポピュラーな感じがします。時代は Linux、ということなんでしょうか。 我らが (?) App Service は Windows インスタンスと Linux インスタンスのどちらも対応しているので、Windows / Linux の両インスタンスの実行時のパフォーマンスの違いをザックリ調べてみたくなりました。というのも、なんか体感的に Linux の起動が … 業務で (最近では副業でも) ずっと利用している Azure App Service!大変便利で使いやすく、大好きです。ところで最近の風潮的には ASP.NET Core も Docker とか Linux インスタンスでホストするのがポピュラーな感じがします。時代は Linux、ということなんでしょうか。 我らが (?) App Service は Windows インスタンスと Linux インスタンスのどちらも対応しているので、Windows / Linux の両インスタンスの実行時のパフォーマンスの違いをザックリ調べてみたくなりました。というのも、なんか体感的に Linux の起動が … xin9le 2021 年の振り返りと 2022 年の抱負 hatenablog://entry/13574176438048196889 2022-01-01T04:03:32+09:00 2022-01-01T04:08:55+09:00 明けましておめでとうございます!今年もいい年にしよう ZE! ということで年末年始。大事なひと区切りなので、今年も忘れないように振り返りと抱負を書き残しておこうと思います。2021 年は一瞬で過ぎ去ったというか、働き過ぎのせいでそれ以外の記憶がかなり薄い。 お仕事 個人事業主として開業 2021/8 に個人事業主になりました。会社員であることをやめたわけではなく、副業としてです。もちろん事前の計画なんて全くなく、行き当たりばったりというか、出たとこ勝負的な勢いだけでの開業でした。なぜ開業することになったかというと、仲の良い友人の @_y_minami からお仕事を依頼されたからでした。当初はだ… 明けましておめでとうございます!今年もいい年にしよう ZE! ということで年末年始。大事なひと区切りなので、今年も忘れないように振り返りと抱負を書き残しておこうと思います。2021 年は一瞬で過ぎ去ったというか、働き過ぎのせいでそれ以外の記憶がかなり薄い。 お仕事 個人事業主として開業 2021/8 に個人事業主になりました。会社員であることをやめたわけではなく、副業としてです。もちろん事前の計画なんて全くなく、行き当たりばったりというか、出たとこ勝負的な勢いだけでの開業でした。なぜ開業することになったかというと、仲の良い友人の @_y_minami からお仕事を依頼されたからでした。当初はだ… xin9le SDK Style の csproj で ASP.NET (.NET Framework) を動かす hatenablog://entry/13574176438014158556 2021-09-22T01:48:42+09:00 2021-09-22T01:48:42+09:00 世の中は .NET 6 RC1 がリリースされ、.NET 6 (LTS) の時代がもうすぐそこまで来ています。が、現実はそんなに甘くない!.NET Framework 4.8 + ASP.NET MVC 5 で頑張っている人もいるんです!ただ、一度でも .NET Core 時代の SDK Style の .csproj (新形式) という甘い蜜を吸ってしまうと .NET Framework の .csproj (旧形式) はかなり厳しく感じます。むしろその一点だけでも .NET Framework を敬遠するレベル。特にどの辺りが嫌いかと言うと、 NuGet Package の管理が煩雑で、ど… 世の中は .NET 6 RC1 がリリースされ、.NET 6 (LTS) の時代がもうすぐそこまで来ています。が、現実はそんなに甘くない!.NET Framework 4.8 + ASP.NET MVC 5 で頑張っている人もいるんです!ただ、一度でも .NET Core 時代の SDK Style の .csproj (新形式) という甘い蜜を吸ってしまうと .NET Framework の .csproj (旧形式) はかなり厳しく感じます。むしろその一点だけでも .NET Framework を敬遠するレベル。特にどの辺りが嫌いかと言うと、 NuGet Package の管理が煩雑で、ど… xin9le LINE Profile+ に対応した LINE ログイン Provider ライブラリを作りました hatenablog://entry/26006613792196680 2021-07-31T00:44:29+09:00 2021-07-31T00:57:26+09:00 業務で LINE ログインを実装することになり、合わせて LINE Profile+ から情報を取得する必要が出ました。ということで LINE Profile+ をサポートした OAuth2 ライブラリを作りました! 弊社メンバーで Microsoft MVP for Azure の吉野くんが以前 .NET Core 2.x 世代向けに LINE ログインのライブラリを作っていたので、そこに相乗りさせてもらいました。 Getting Started このライブラリは ASP.NET Core における外部プロバイダー認証の実装に準拠しています。なので、以下のような感じで始められます。 dotn… 業務で LINE ログインを実装することになり、合わせて LINE Profile+ から情報を取得する必要が出ました。ということで LINE Profile+ をサポートした OAuth2 ライブラリを作りました! 弊社メンバーで Microsoft MVP for Azure の吉野くんが以前 .NET Core 2.x 世代向けに LINE ログインのライブラリを作っていたので、そこに相乗りさせてもらいました。 Getting Started このライブラリは ASP.NET Core における外部プロバイダー認証の実装に準拠しています。なので、以下のような感じで始められます。 dotn… xin9le .NET 5 未満でもモジュール初期化子を利用する hatenablog://entry/26006613724880180 2021-05-05T21:37:59+09:00 2021-05-05T21:37:59+09:00 .NET 5 じゃなくても C# 9.0 をできる限り使いたい!そんなあなたのために「.NET 5 未満でも」シリーズ第 2 弾。第 1 弾はこちら。 今回はタイトルにある通りモジュール初期化子についてですが、それ自体の用途や詳細挙動は岩永さんのサイトに譲ります。 .NET 5 未満でモジュール初期化子を有効化 モジュール初期化子は ModuleInitializerAttribute を以下の条件を満たすメソッドに付与することで利用できます。 引数なし 戻り値なし static メソッド public / internal のどちらかのアクセシビリティ 非 Generics 逆に言うと Mo… .NET 5 じゃなくても C# 9.0 をできる限り使いたい!そんなあなたのために「.NET 5 未満でも」シリーズ第 2 弾。第 1 弾はこちら。 今回はタイトルにある通りモジュール初期化子についてですが、それ自体の用途や詳細挙動は岩永さんのサイトに譲ります。 .NET 5 未満でモジュール初期化子を有効化 モジュール初期化子は ModuleInitializerAttribute を以下の条件を満たすメソッドに付与することで利用できます。 引数なし 戻り値なし static メソッド public / internal のどちらかのアクセシビリティ 非 Generics 逆に言うと Mo… xin9le .NET 5 未満でも C# 9.0 の init アクセサを利用する hatenablog://entry/26006613724785996 2021-05-05T20:54:21+09:00 2021-05-05T21:38:09+09:00 init アクセサは大変良いです。C# 9.0 で追加された初期化のタイミングでのみプロパティに値を設定できる set アクセサです。アクセシビリティは狭ければ狭いほどコードは安全になるので、僕は set を見たらとりあえず init に置き換える勢い! .NET 5 未満で init を利用する init アクセサは内部的にはただの set アクセサです。set アクセサに対して IsExternalInit という型と共に modreq という謎の (?) 修飾を行うことでコンパイラが init な挙動と解釈してくれます。逆に言うと IsExternalInit という型があり、それを解釈… init アクセサは大変良いです。C# 9.0 で追加された初期化のタイミングでのみプロパティに値を設定できる set アクセサです。アクセシビリティは狭ければ狭いほどコードは安全になるので、僕は set を見たらとりあえず init に置き換える勢い! .NET 5 未満で init を利用する init アクセサは内部的にはただの set アクセサです。set アクセサに対して IsExternalInit という型と共に modreq という謎の (?) 修飾を行うことでコンパイラが init な挙動と解釈してくれます。逆に言うと IsExternalInit という型があり、それを解釈… xin9le _FunctionsSkipCleanOutput を利用しないで Azure Functions プロジェクトのビルド時 DLL 自動削除から DLL を保護する hatenablog://entry/26006613708452699 2021-03-26T00:39:15+09:00 2021-03-26T00:39:15+09:00 タイトルが長過ぎてなんのこっちゃワカランと思います。僕も良いタイトルが浮かびません...( 今回は下記の Issue の内容と公式回答についてザックリ解説します。僕の理解が正確かは分からないので、Issue も読んでもらえると助かりますw Issue の内容 System.Interactive.Async v4.1.1 を NuGet 参照してる Azure Functions プロジェクトがある この NuGet パッケージは C# 8.0 以降で言語サポートされた IAsyncEnumerable<T> を利用するときに高頻度で利用する Azure Functions v3 にデプロイし… タイトルが長過ぎてなんのこっちゃワカランと思います。僕も良いタイトルが浮かびません...( 今回は下記の Issue の内容と公式回答についてザックリ解説します。僕の理解が正確かは分からないので、Issue も読んでもらえると助かりますw Issue の内容 System.Interactive.Async v4.1.1 を NuGet 参照してる Azure Functions プロジェクトがある この NuGet パッケージは C# 8.0 以降で言語サポートされた IAsyncEnumerable<T> を利用するときに高頻度で利用する Azure Functions v3 にデプロイし… xin9le Basic 認証情報を含む URL を HttpClient で利用する hatenablog://entry/26006613700995624 2021-03-08T23:43:36+09:00 2021-03-08T23:43:36+09:00 Basic 認証のあるページにブラウザでアクセスしたことがある方はご存じかと思いますが、以下のような認証情報を入力するダイアログが表示されます。毎度面倒ですよね。 実は、ブラウザなど一部の Web Client は https://UserName:Password@example.com のような認証情報を URL に書く記法をサポートしています。こうすると認証ダイアログが表示されないので、大変便利です。 Uri クラスで parse する C# / .NET でも上記のような URL を使いたいなーと考えるわけですが、URL から認証情報 UserName:Password を抜き出すのが… Basic 認証のあるページにブラウザでアクセスしたことがある方はご存じかと思いますが、以下のような認証情報を入力するダイアログが表示されます。毎度面倒ですよね。 実は、ブラウザなど一部の Web Client は https://UserName:Password@example.com のような認証情報を URL に書く記法をサポートしています。こうすると認証ダイアログが表示されないので、大変便利です。 Uri クラスで parse する C# / .NET でも上記のような URL を使いたいなーと考えるわけですが、URL から認証情報 UserName:Password を抜き出すのが… xin9le C# / .NET 向けの Paidy SDK を公開しました hatenablog://entry/26006613695614722 2021-02-24T02:03:14+09:00 2021-02-24T02:03:14+09:00 あの Amazon でも利用できる (特に) 若者に人気の Paidy 決済。その API の C# / .NET 向けラッパーを作成し、公開しました!普段 EC サービスの開発 / 運用を業務で行っているのですが、とあるお客様で Paidy 導入が必要になったので作りました。 本当はすべての API を網羅する必要性なんて全くない *1 ので完全なオーバーワークですが、今後 Paidy を C# / .NET 環境で導入する方が少しでも楽できればいいなと思っています。 サポートしている機能 Paidy 自体の導入方法は公式ドキュメントをちゃんと読む必要がありますが、決済処理に必要な API … あの Amazon でも利用できる (特に) 若者に人気の Paidy 決済。その API の C# / .NET 向けラッパーを作成し、公開しました!普段 EC サービスの開発 / 運用を業務で行っているのですが、とあるお客様で Paidy 導入が必要になったので作りました。 本当はすべての API を網羅する必要性なんて全くない *1 ので完全なオーバーワークですが、今後 Paidy を C# / .NET 環境で導入する方が少しでも楽できればいいなと思っています。 サポートしている機能 Paidy 自体の導入方法は公式ドキュメントをちゃんと読む必要がありますが、決済処理に必要な API … xin9le POST を維持したままリダイレクトする hatenablog://entry/26006613685652146 2021-02-01T00:24:37+09:00 2021-02-01T00:24:37+09:00 Web サービスを使っているとレスポンスとしてリダイレクトを返すことはちょくちょくあると思います。このとき 301 / 302 のようなステータスコードを返すとたとえ POST リクエストであっても GET に強制変更されてリダイレクトされてしまいます。通常はこの挙動でほぼ問題ないのですが、ごく稀にリダイレクト時にも HTTP Method を維持したいケースもあるでしょう。 TL;DR 307 / 308 を返せば OK! ASP.NET Core MVC だと 下記のような感じで preserveMethod: true とするのがポイントです。 [HttpPost] public IAc… Web サービスを使っているとレスポンスとしてリダイレクトを返すことはちょくちょくあると思います。このとき 301 / 302 のようなステータスコードを返すとたとえ POST リクエストであっても GET に強制変更されてリダイレクトされてしまいます。通常はこの挙動でほぼ問題ないのですが、ごく稀にリダイレクト時にも HTTP Method を維持したいケースもあるでしょう。 TL;DR 307 / 308 を返せば OK! ASP.NET Core MVC だと 下記のような感じで preserveMethod: true とするのがポイントです。 [HttpPost] public IAc… xin9le 2020 年の振り返りと 2021 年の抱負 hatenablog://entry/26006613672545774 2021-01-01T02:44:19+09:00 2021-02-16T16:30:59+09:00 明けましておめでとうございます!今年もいい年にしよう ZE! ということで年末年始。大事なひと区切りなので、忘れないように 2020 年の振り返りと 2021 年の抱負を書き残しておこうと思います。2020 年は本当に密な年でしたね。COVID-19 一色。とにかく密。 お仕事 リモートワーク 世の中がコロナ禍でリモートワークでてんやわんやな中、僕は緊急事態宣言が出る 1 年前の 2019 年 4 月から地方在住型リモートワークを行っていたという十分な助走期間があったおかげで、本当に何の問題もなく過ごすことができました。ただこの 1 年唯一にして最大のデメリットだった点は、毎月欠かさず行ってい… 明けましておめでとうございます!今年もいい年にしよう ZE! ということで年末年始。大事なひと区切りなので、忘れないように 2020 年の振り返りと 2021 年の抱負を書き残しておこうと思います。2020 年は本当に密な年でしたね。COVID-19 一色。とにかく密。 お仕事 リモートワーク 世の中がコロナ禍でリモートワークでてんやわんやな中、僕は緊急事態宣言が出る 1 年前の 2019 年 4 月から地方在住型リモートワークを行っていたという十分な助走期間があったおかげで、本当に何の問題もなく過ごすことができました。ただこの 1 年唯一にして最大のデメリットだった点は、毎月欠かさず行ってい… xin9le Azure Functions SDK の更新に伴う FunctionsStartup の書き方の変更 hatenablog://entry/26006613632329779 2020-09-25T17:05:14+09:00 2020-09-25T17:06:47+09:00 2020/9/16 に Microsoft.Azure.Functions.Extensions パッケージが v1.1.0 がリリースされました。これに伴い、Azure Functions で DI を利用するときに書くことになる FunctionsStartup にアプリケーションの構成情報ソースをカスタマイズするためのオーバーライド (ConfigureAppConfiguration) が追加されました。 実装サンプル 最近は Azure App Configuration が便利過ぎるのでよく利用するのですが、そういうのを読み込み元として追加するときに利用できるでしょう。実装イメージ… 2020/9/16 に Microsoft.Azure.Functions.Extensions パッケージが v1.1.0 がリリースされました。これに伴い、Azure Functions で DI を利用するときに書くことになる FunctionsStartup にアプリケーションの構成情報ソースをカスタマイズするためのオーバーライド (ConfigureAppConfiguration) が追加されました。 実装サンプル 最近は Azure App Configuration が便利過ぎるのでよく利用するのですが、そういうのを読み込み元として追加するときに利用できるでしょう。実装イメージ… xin9le Microsoft 365 (旧 Office 365) のアプリを個別インストールする hatenablog://entry/26006613621860777 2020-08-31T01:04:37+09:00 2023-03-11T19:08:28+09:00 昔 Office のセットアップをしようとしたらアプリごとにインストールするかどうかを選択できました。しかし Microsoft 365 (= Office 365 からリブランドされた) のセットアップを叩いても、インストールしたいアプリを選択できません。 つまりどうなるかと言うと、こんなにたくさんのアプリが一気にドカッとインストールされます。問答無用。 Excel Word PowerPoint Outlook Access Groove Lync (= Skype for Business) OneDrive OneNote Publisher 正直全くいらん。使うのは Excel / … 昔 Office のセットアップをしようとしたらアプリごとにインストールするかどうかを選択できました。しかし Microsoft 365 (= Office 365 からリブランドされた) のセットアップを叩いても、インストールしたいアプリを選択できません。 つまりどうなるかと言うと、こんなにたくさんのアプリが一気にドカッとインストールされます。問答無用。 Excel Word PowerPoint Outlook Access Groove Lync (= Skype for Business) OneDrive OneNote Publisher 正直全くいらん。使うのは Excel / … xin9le Azure Functions の TimerTrigger の処理時間を可視化する hatenablog://entry/26006613549013520 2020-04-12T23:38:36+09:00 2020-04-12T23:38:36+09:00 最近、業務でバッチ処理の最適化を行っています。弊社のバッチ処理は Azure Functions の TimerTrigger で書くことが多いです。主な理由は、仮想マシンなどを利用することなくマネージドな環境でタイマーを発動できて丁度よいという点ですが、Consumption Plan (= 従量課金プラン) を利用していると非常に安価に済むというのもあります。 なのですが、Consumption Plan だと実行時間の上限が 10 分と決まっています。これが結構曲者で、タイムアウトを避けるためには処理時間を短くする努力する必要が出てきます。もしそれでも超過してしまう場合は Premium… 最近、業務でバッチ処理の最適化を行っています。弊社のバッチ処理は Azure Functions の TimerTrigger で書くことが多いです。主な理由は、仮想マシンなどを利用することなくマネージドな環境でタイマーを発動できて丁度よいという点ですが、Consumption Plan (= 従量課金プラン) を利用していると非常に安価に済むというのもあります。 なのですが、Consumption Plan だと実行時間の上限が 10 分と決まっています。これが結構曲者で、タイムアウトを避けるためには処理時間を短くする努力する必要が出てきます。もしそれでも超過してしまう場合は Premium… xin9le XSitemaps - SEO のためのサイトマップファイルを作る hatenablog://entry/26006613496363483 2020-01-12T01:56:54+09:00 2020-01-12T01:56:54+09:00 業務で (主に) EC サイトの実装 / 運営をしているのですが、EC サイトと言えば SEO!お客様が来ないことには商売にならないので、検索エンジンを上手に操って流入を確保することは非常に重要です。ということで、ページのクローリングを制御するために Google Search Console などを使うわけですが、そこで必要になるのがサイトマップファイルです。サイトマップファイルにはいくつか種類があるのですが、主に XML 形式が使われるのだと思います。ファイル仕様は sitemaps.org をご覧ください。 サイトマップファイルを生成するライブラリは C# / .NET の世界にもいくつ… 業務で (主に) EC サイトの実装 / 運営をしているのですが、EC サイトと言えば SEO!お客様が来ないことには商売にならないので、検索エンジンを上手に操って流入を確保することは非常に重要です。ということで、ページのクローリングを制御するために Google Search Console などを使うわけですが、そこで必要になるのがサイトマップファイルです。サイトマップファイルにはいくつか種類があるのですが、主に XML 形式が使われるのだと思います。ファイル仕様は sitemaps.org をご覧ください。 サイトマップファイルを生成するライブラリは C# / .NET の世界にもいくつ… xin9le 2019 年の振り返りと 2020 年の抱負 hatenablog://entry/26006613491769540 2020-01-01T23:37:27+09:00 2020-01-02T00:07:08+09:00 明けましておめでとうございます!今年もいい年にしよう ZE! ということで年末年始。大事なひと区切りなので、忘れないように 2019 年の振り返りと 2020 年の抱負を書き残しておこうと思います。 プライベート まず、2019 年の振り返りから。「2019 年を漢字 1 文字で表すと?」というのが年末恒例の質問としてあるので、それの真似をしてみると、僕のプライベートは「福」だったと思っています。 3 年半ぶりに東京での単身赴任から福井に帰省 家族との時間が増え、幸福感が爆上がり ソシャゲを辞めて (謎の) 心的負担が無くなった 2019 年 2 月にシグマコンサルティング株式会社に転職したの… 明けましておめでとうございます!今年もいい年にしよう ZE! ということで年末年始。大事なひと区切りなので、忘れないように 2019 年の振り返りと 2020 年の抱負を書き残しておこうと思います。 プライベート まず、2019 年の振り返りから。「2019 年を漢字 1 文字で表すと?」というのが年末恒例の質問としてあるので、それの真似をしてみると、僕のプライベートは「福」だったと思っています。 3 年半ぶりに東京での単身赴任から福井に帰省 家族との時間が増え、幸福感が爆上がり ソシャゲを辞めて (謎の) 心的負担が無くなった 2019 年 2 月にシグマコンサルティング株式会社に転職したの… xin9le