C#

C# で Git リポジトリを操作する

プログラムから Git リポジトリを操作したくなった。C# なら LibGit2Sharp を使えばできそう。 www.nuget.org リポジトリがなければ作成して、ファイルをコミットして、コミットとリポジトリ内のファイルを列挙するサンプルを書いてみた。 using LibGit2Shar…

.NET Framework で CoreWCF を使ってみた

.NET Framework 製 WCF サービスの .NET 8 移行を検討しているけど、推奨されている gRPC はほぼ実装し直しになるので現実的に難しい。CoreWCF ならまだ可能性あるか? CoreWCF は .NET Standard 2.0 サポートしているので、.NET Framework でも動かせるはず…

WCF サービスを Azure App Service の Web App for Containers でホストする

はじめに Azure App Service の Web App for Containers は、Windows コンテナをサポートしているみたい。.NET Framework + WCF のサービスを動かせるかも。 試してみた。 WCF サービスとクライアント サービスコントラクトとデータコントラクト using Syste…

.NET MAUI でナビゲーションバーの左側にアイテムを配置する

.NET MAUI も Xamarin Forms と同様に、標準ではナビゲーションバーの左側に ToolbarItem を配置できない。Xamarin Forms の頃は、カスタム Renderer で対応していた。 tnakamura.hatenablog.com MAUI ではどうすればいいかというと、カスタム Handler で対…

.NET MAUI の ListView でツリー表示

MAUI の CollectionView を使ってツリーを表示するために、 SelectedIndex を取得する添付ビヘイビアを作ったりして頑張ったが、ListView を使えばそんな努力不要だった。 tnakamura.hatenablog.com ListView には SelectedItemIndex プロパティがあるので、…

MAUI の CollectionView でツリー表示する方法(完成版)

以前、MAUI の CollectionView でアイテムをツリー表示してみた。 tnakamura.hatenablog.com これは期待通りに動いた。ただ、ツリーのノードを開閉するときに選択されたアイテムのインデックスが必要で、インデックスを取得する方法が O(N) なのが気がかりだ…

CollectionView の SelectedIndex を取得するビヘイビア

.NET MAUI の CollectionView には SelectedItem プロパティはあるけど SelectedIndex プロパティは無い。ItemsSource にセットしているコレクションから SelectedItem と同じインスタンスを検索すれば取得はできるけど、O(N) なので件数が増えるとツラくな…

C# で ARM テンプレート関数を使う

C# のプログラムで Azure Resource Manager のテンプレート関数が使いたかった。具体的には guid を。Azure.Deployments.Expression パッケージを使って実現できた。 www.nuget.org guid 関数を呼び出して、deterministic な GUID を生成するサンプルは次の…

C# で Azure SQL Databaseの長期バックアップ保有期間を変更する

Azure.ResourceManager.Sql を使って、SQL Database の長期バックアップも設定できる。 www.nuget.org 毎月 1 回目のフルバックアップを 2 ヶ月保有するように変更するサンプルは次の通り。 using Azure.Identity; using Azure.ResourceManager; using Azure…

C# で Azure SQL Databaseの自動バックアップ保有期間を変更する

Azure.ResourceManager.Sql を使って、SQL Database の PITR を設定できる。 www.nuget.org PITR の保有期間を 14 日間に変更するサンプルは次の通り。 using Azure.Identity; using Azure.ResourceManager; using Azure.ResourceManager.Sql; using Azure.R…

C# で Azure Entra ID に登録されているアプリにロールを割り当てる

Azure.ResourceManager.Authorization を使えばできた。 www.nuget.org リソースの共同作成者を割り当ててみたサンプル。 using Azure; using Azure.Core; using Azure.Identity; using Azure.ResourceManager; using Azure.ResourceManager.Authorization; …

C# で Microsoft Azure の DNS ゾーンに A レコードを登録する

Azure.ResourceManager.Dns パッケージを使って DNS ゾーンを操作できる。 www.nuget.org A レコードを追加するサンプルコードは次の通り。既存のパブリックIPアドレスリソースのエイリアスにしている。 using Azure; using Azure.Identity; using Azure.Res…

C# で Microsoft Azure のパブリックIPアドレスを作成する

Azure.ResourceManager.Network パッケージを使う。 www.nuget.org パブリック IP アドレスが無ければ作成するサンプル。 using Azure; using Azure.Core; using Azure.Identity; using Azure.ResourceManager; using Azure.ResourceManager.Network; using …

A10 - Resort Hotel

atcoder.jp 左からと右からの累積MAX(?)を計算しておく。 var N = int.Parse(Console.ReadLine()!); var A = Console.ReadLine()!.Split(' ').Select(x => int.Parse(x)).ToList(); var D = int.Parse(Console.ReadLine()!); var Q = new List<(int Left, i…

C# で Key Vault にシークレットを登録する

Azure.Security.KeyVault.Secrets を使えば、Microsoft Azure Key Vault にシークレットを登録できた。 www.nuget.org 以下サンプルコード。シークレットの取得もやってる。 using Azure.Identity; using Azure.Security.KeyVault.Secrets; var client = new…

C# で Microsoft Entra ID にアプリを登録する方法

Microsoft Graph SDK を使う。Azure SDK ではなかった。 www.nuget.org アプリが既に存在するか検索し、なければ登録するコードは次の通り。 using Azure.Identity; using Microsoft.Graph; using Microsoft.Graph.Applications.Item.AddPassword; using Mic…

B09 - Papers

atcoder.jp ABとCDが座標というのを理解していなくて、1まわり大きい面積を計算してしまっていた。実際に手計算して気付けたけど、結構嵌まってしまったな。 var N = int.Parse(Console.ReadLine()!); var A = new int[N]; var B = new int[N]; var C = new …

A09 - Winter in ALGO Kingdom

atcoder.jp 配列のインデックスが配列に格納されているような形なんで、ミスしてもなかなか気付かずハマった。配列の中身を出力するコードを一時的に足して、間違っていた箇所にようやく気付けた。 var HWN = Console.ReadLine()!.Split(' ').Select(x => in…

B08 - Counting Points

atcoder.jp 点の座標を二次元配列にプロットしてから、二次元累積和を計算。 x座標用のループ変数はx、y座標用のループ変数はyと名前付けしたら、混乱が緩和された気がする。 const int H = 1500 + 1; const int W = 1500 + 1; var N = int.Parse(Console.Re…

A08 - Two Dimensional Sum

atcoder.jp 回答する際の、配列のインデックス指定で混乱した。変数名にもうちょい工夫が必要だったな。 var input = Console.ReadLine()! .Split(' ') .Select(x => int.Parse(x)) .ToList(); var H = input[0]; var W = input[1]; var X = new int[H, W]; …

B07 - Convenience Store 2

atcoder.jp 前の時間帯と比べて何人増減したかを計算して、次にその累積和を計算。 var T = int.Parse(Console.ReadLine()!); var N = int.Parse(Console.ReadLine()!); // 例えば0時から10時までの営業で、 // 5時から10時まで働く従業員がいた場合、 // B[…

A07 - Event Attendance

atcoder.jp 前日比を計算してから、前日比の累積和を計算。 var D = int.Parse(Console.ReadLine()!); var N = int.Parse(Console.ReadLine()!); // 前日比を計算 var B = new int[D + 2]; // 0 日目と D + 1 日目も含める for (var i = 0; i < N; i++) { va…

B06 - Lottery

atcoder.jp アタリとハズレの累積和をそれぞれ計算しておく。0 番目の累積和として 0 を追加しておくテクニックを使ってみた。 var N = int.Parse(Console.ReadLine()!); var A = Console.ReadLine()!.Split(' ').Select(x => int.Parse(x)).ToList(); var Q…

A06 - How Many Guests?

atcoder.jp (R日目までの累積来場者数) - (L - 1 日目までの累積来場者数)を愚直に実装してみた。 var NQ = Console.ReadLine()! .Split(' ') .Select(x => int.Parse(x)) .ToList(); var N = NQ[0]; var Q = NQ[1]; var A = Console.ReadLine()! .Split(' '…

B04 - Binary Representation 2

atcoder.jp 2進数を10進数に変換。 var N = Console.ReadLine()!; var answer = 0; for (var i = 0; i < N.Length; i++) { var m = Math.Pow(2, N.Length - 1 - i); if (N[i] == '1') { answer += (int)m; } } Console.WriteLine(answer);

A05 - Three Cards

atcoder.jp 3重ループだと時間切れになるので、2重ループで。 var input = Console.ReadLine()!.Split(' '); var N = int.Parse(input[0]); var K = int.Parse(input[1]); var answer = 0; for (var r = 1; r <= N; r++) { for (var b = 1; b <= N; b++) { v…

A04 - Binary Representation 1

atcoder.jp 10桁目から計算開始し、桁を下げていく。 var N = int.Parse(Console.ReadLine()!); var answer = ""; for (int i = 9; i >= 0; i--) { var m = Math.Pow(2, i); answer += (int)(N / m); N = (int)(N % m); } Console.WriteLine(answer);

B03 - Supermarket 1

atcoder.jp ただの 3 重ループだと商品が重複するので WA になる。商品が重複しない工夫が必要。 var N = int.Parse(Console.ReadLine()!); var A = Console.ReadLine()!.Split(' ').Select(int.Parse).ToList(); var answer = false; // 組み合わせなので、…

A03 - Two Cards

atcoder.jp N 使ってないけど、AC だったのでヨシ! var input = Console.ReadLine()! .Split(' ') .Select(int.Parse) .ToList(); var N = input[0]; var K = input[1]; var P = Console.ReadLine()! .Split(' ') .Select(int.Parse) .ToList(); var Q = Co…

B02 - Divisor Check

atcoder.jp LINQ 使わずに for で書いてみた。 var input = Console.ReadLine()!.Split(' '); var A = int.Parse(input[0]); var B = int.Parse(input[1]); var exists = false; for (var n = A; n <= B; n++) { if (100 % n == 0) { exists = true; break; …