rksoftware

Visual Studio とか C# とかが好きです

Visual Studio の 17.9.3 がリリースされました

Visual Studio のアップデート 17.9.3 がリリースされました。

今回はセキュリティ関連の内容があります。すぐにアップデートしましょう。

更新内容

■ 機能の追加

  • MAUI 8.0.7 (SR2) に対応
  • Windows 11 SDK (10.0.22621.0) に対応

■ 問題の解決

  • C++ 関連のバグ修正 1 件

の問題が対策されたようです。

■ Developer Community

  • Web.Config に勝手に要素が追加され、ローカル IIS では動作するがサーバーにデプロイすると動作しない
  • launch.vs.json の中にコメントを書くとエラーになる
  • 拡張機能マネージャーで「更新」を押しても更新されない拡張がある
  • データベース プロジェクトのビルドが失敗する
  • .NET Framework の Visual Basic の WinForms プロジェクトでプロジェクトのプロパティが表示されない

の問題が対策されました。

セキュリティに関するアップデート

今回は 3 件のセキュリティに関するアップデートがあります。

今すぐアップデート

今回はセキュリティ関連の内容があります。すぐにアップデートしましょう。

■ 更新方法

Visual Studio の更新はメニューの ツール > ツールと機能を取得 で開くインストーラーから行えます。

そろそろアーバンパークラインか野田線か決着をつけようか

そろそろ アーバンパークライン野田線 か決着をつけようかと思って X で検索して 1 週間の発言数を数えてみました。

そうしたら衝撃の事実! なんと 野田線 の方が多いという実感と全く異なる結果が。納得できませんが数字はうそをつきません 。すべてを受け入れましょう。

■ 千葉と埼玉で傾向はあるのか?

大宮春日部流山船橋 で傾向を比率で測ってみます。
実感として、千葉では 野田線 が多く、埼玉では アーバンパークライン が多いですが果たして......。

ポスト件数

大宮 春日部 流山 船橋
野田線 39 41 5 42 20
野田線 and
アーバンパークライン
12 8 0 11 2
アーバンパークライン 34 35 5 35 13

ポスト比率

野田線アーバンパークライン の両方を含む発言を除外して、野田線 だけ、アーバンパーライン だけのポストの比率を出してみます。

大宮 春日部 流山 船橋
野田線 55% 55% 50% 56% 62%
アーバンパークライン 45% 45% 50% 44% 38%

こちらは実感通り、千葉の方が 野田線 派の比率が高いという結果になりました。特に船橋は特出しています。何が船橋の方をこうも 野田線 を愛させるのか? なぞです。

■ いかがでしたか?

いかがでしたか?

東京圏どこに住むか X アンケート結果

東京圏のどこに住むべきか。X でのアンケート結果です。

■ 結果

住んでよいみるだけ を除いた表の中で 「 オススメ + あり 」の比率、住まない方がよい は 「 やめとけ 」の比率です。
左のものほど、住むべき場所です。

練馬区 墨田区 大田区 船橋 板橋区 世田谷区 江東区 川崎 足立区 川口
票数 18 9 20 19 8 14 13 13 10 12
オススメ 38.9% 22.2% 20.0% 21.1% 25.0% 21.4% 7.7% 15.4% 20.0% 8.3%
やめとけ 11.1% 22.2% 30.0% 31.6% 37.5% 50.0% 46.2% 38.5% 50.0% 58.3%
あり 33.3% 33.3% 30.0% 26.3% 25.0% 28.6% 38.5% 23.1% 10.0% 8.3%
みるだけ 16.7% 22.2% 20.0% 21.1% 12.5% 0.0% 7.7% 23.1% 20.0% 25.0%
住んでよい 0.8667% 0.7143% 0.6250% 0.6000% 0.5714% 0.5000% 0.5000% 0.5000% 0.3750% 0.2216%
住まない方がよい 0.1333% 0.2857% 0.3750% 0.4000% 0.4286% 0.5000% 0.5000% 0.5000% 0.6250% 0.7784%

■ いかがでしかた?

いかがでしたか?

付録

東京マラソンの無慈悲な交通規制......ッ! 秋葉原駅←→万世橋の無料シャトルバスに乗ってみた

東京マラソンの無慈悲な交通規制に、皆さん各自対策をとっていたことと思います。
多くの方は電車賃を払って御茶ノ水まで行って戻ってくるという選択をしていると思います。

しかし、お金をかけずに秋葉原駅から秋葉原の電気街、パーツ街に行く方法があります。それがシャトルバスです。

www.marathon.tokyo

というわけで、秋葉原駅←→万世橋の無料シャトルバスに乗ってみました。

■ 結論

JR で一駅乗るのと比べて微妙。無料というのはとても素晴らしいですが、結構時間がかかります。歩く速度の速い人なら JR でもいい気がします。

■ 運行内容

JR 秋葉原駅の電気街口のロータリーから、万世橋のところのパセラのあたりまで、御徒町駅の前を通ってはりします。
5 分間隔で乗車時間は 15-20 分ほど。

ちなみに交通規制のかかっている場所で案内のスタッフがいますが、あまり土地勘のない方が対応しているようで、バスはロータリーに来るのか、中央口でなく電気街口なのか、といった質問には一切回答がなく、ここを行ったところといった回答で不安感を覚えながらバス乗り場に向かうことになりました。

■ 写真

秋葉原駅を出てパーツ街方面へ向かおうとすると無慈悲な交通規制。

ここで、案内を受けて電気街口のロータリーからバスが出ています。乗り場はダイビルの前のところですね。


かなり大きいバスが出ていますが、このバスがいっぱいになる人気路線になっています。

練塀公園を超えて......。向こうから戻りの運行のバスが来ていますね。

蔵前橋通りを昭和通りへ。警備の方が交差点に配置されているのがお金をかけていますね。


御徒町を超えた春日通りで反対側へ出ます。なぜここをバスが通れるのか疑問でしたが、マラソンのコースがここまでなんですね。だからバスでここまで来るんですね。

曲がって、昌平橋通りをへ。


昌平橋の前で曲がって......


パセラ前で降車です。逆向きのルートはここで乗車して電気街口のロータリーへ向かいます。

バスはここで通りを自由に動けるので U ターンしていました。

反対側からも無慈悲な交通規制。


中央通だけでなく、自動車はちょっと離れたところから交通規制になっています。

世間では、秋葉原が着目されていますが、湯島駅も無慈悲な規制を受けている街で、案内の方が配置されていました。

■ そなえよう

次回も交通規制があるかわかりませんが、今回も観光客と思われる方や、遅刻しそうで急いでいる方などが見受けられました。
あまり事前に案内もされていなく、地元民でなければ備えろというのも無茶な話ですが、備えましょう。

.NET 9 Preview 1 で追加されたもう一つの LINQ メソッド Index を書いてみる

.NET 9 Preview 1 で追加された LINQ メソッドの中の .CountBy.AggregateBy は以前に書いてみました。

rksoftware.hatenablog.com

今日は .Index を書いてみます。

■ 書いてみた

こんな感じで index が取れます。いいですね。

// 0:a,1:a,2:b,3:b,4:c,5:c,6:a,7:b,8:c,9:c,10:c,11:c,12:c,13:c,
foreach (var (index, c) in "aabbccabcccccc".Index())
    System.Console.Write($"{index}:{c},");

実行結果

0:a,1:a,2:b,3:b,4:c,5:c,6:a,7:b,8:c,9:c,10:c,11:c,12:c,13:c,

でもこれだとあまりよくわからないので、もうどういうことか少しわかりやすく書いてみますね。

// 0:a,1:a,2:b,3:b,4:c,5:c,6:a,7:b,8:c,9:c,10:c,11:c,12:c,13:c
IEnumerable<(int index, char c)> e = "aabbccabcccccc".Index();
System.Console.WriteLine(string.Join(',', e.Select(m=> $"{m.index}:{m.c}")));

実行結果

0:a,1:a,2:b,3:b,4:c,5:c,6:a,7:b,8:c,9:c,10:c,11:c,12:c,13:c

■ 定義

定義は素直にこうでした。

public static IEnumerable<(int Index, TSource Item)> Index<TSource>(this IEnumerable<TSource> source);

■ いいですね。

いいですね。.NET 9 楽しむデス。そなえそう。

.NET 9 Preview 1 で追加された LINQ メソッドの一つ、AggregateBy を書いてみる

.NET 9 Preview 1 で追加された LINQ メソッドを書いてみています。
rksoftware.hatenablog.com

その中で前回、.AggregateBy でちょっと特殊な使い方をしたくて迷っていました。今回はそこを少し深く語ってみます。

■ これまで .Aggregate でよくやっていたこと

ループのそれまでの処理を踏まえる複雑な処理で list へ Add するようなコードを書きたい場合、次のようなコードが結構あると思います。

char[] t = ['a', 'b', 'a', 'a', 'b', 'c'];

{
    List<char> list = new ();
    foreach (var c in t)
    {   // ここが list の現在の状態を参照したりなど、複雑な処理だったりするとき
        list.Add(c);
    }

    // a, b, a, a, b, c
    Console.WriteLine(string.Join(", ", list));
}

そこで私は次のようなコードを書いてしまっていました。

char[] t = ['a', 'b', 'a', 'a', 'b', 'c'];

{
    // こんな風にシュッと書いてしまいたい
    List<char> list = t.Aggregate(new List<char>(), (list, c) => { /* ここが list の現在の状態を参照したりなど、複雑な処理の想定 */ list.Add(c); return list; });

    // a, b, a, a, b, c
    Console.WriteLine(string.Join(", ", list));
}

.AggregateBy の場合

基本的にはこういう値型で使うのだと思います。

char[] t = ['a', 'b', 'a', 'a', 'b', 'c'];

{// 値型を渡すのが本来だと思う
    IEnumerable<KeyValuePair<char, string>> m = t.AggregateBy(x => x, "", (s, x) => x + s);

    // a: aaa, b: bb, c: c
    Console.WriteLine(string.Join(", ", m.Select(x => $"{x.Key}: {x.Value}")));
}

ここで何も考えずに私がよく書いてしまう List<T> に足していくコードを書いた場合には、意図通りではない結果になります。でもこれが仕様通りだと思います。

char[] t = ['a', 'b', 'a', 'a', 'b', 'c'];

{// キーが違っても同じ List<char> が渡ってしまう
    IEnumerable<KeyValuePair<char, List<char>>> m = t.AggregateBy(x => x, new List<char>(), (s, x) => { s.Add(x); return s; });

    // a: abaabc, b: abaabc, c: abaabc
    Console.WriteLine(string.Join(", ", m.Select(x => $"{x.Key}: {string.Join("", x.Value)}")));
}

でも、諦めきれないので考えました。しかしこんなコードいいのか迷います。

char[] t = ['a', 'b', 'a', 'a', 'b', 'c'];

{// こうすれば意図通りだが、こういうので許されるのか......?
    IEnumerable<KeyValuePair<char, List<char>>> m = t.AggregateBy(x => x, (List<char>?)null, (s, x) => { (s = s ?? new List<char>()).Add(x); return s; })!;

    // a: aaa, b: bb, c: c
    Console.WriteLine(string.Join(", ", m.Select(x => $"{x.Key}: {string.Join("", x.Value)}")));
}

■ でもよさそう

でも、新しい LINQ メソッドいいですよね。今回書いている .AggregateBy メソッドも使いこなしていきたいです。そなえよう。

.NET 9 Preview 1 の C# コードを書く

前回、.NET 9 Preview 1 をインストールしました。
rksoftware.hatenablog.com

今回はいよいよコードを書いてみましょう。

■ Visual Studio のプレビュー版

Visual Studio のプレビュー版で .NET 9 Previre 1 のプロジェクトを作成してみます。
プロジェクト作成のウィザードで選べます。Visual Studio Installer では .NET 9 のプレビュー版のインストールはしてくれませんでしたが、インストールされれば使えるようですね。
簡単ですね。

Visual Studio 通常版

通常版では選べませんでした。

.csproj

特に変哲なく net9.0 でした。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net9.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

dotnet コマンド

.NET 9 Preview 1 環境での dotnet コマンドでも当たり前ですが同じ、net9 でプロジェクトが作られます。

donet new console

■ コードを書いてみる

いよいよコードです。.NET 9 で追加された LINQ の .CountBy を書いてみます。

char[] t = ['a', 'b', 'a', 'a', 'b', 'c'];
IEnumerable<KeyValuePair<char, int>> m = t.CountBy(x => x);

// a: 3, b: 2, c: 1
Console.WriteLine(string.Join(", ", m.Select(x=>$"{x.Key}: {x.Value}")));

実行結果

a: 3, b: 2, c: 1

すばらしい! 使えていますね。

■ net8 に変えてみる

きちんと .NET 9 のコードなのか確認するため、.csproj を net8 にしてみます。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

エラー

予定通り。.CountBy がないというエラーになりました。

重大度レベル   コード   説明
エラー   CS1061  'char[]' に 'CountBy' の定義が含まれておらず、型 'char[]' の最初の引数を受け付けるアクセス可能な拡張メソッド 'CountBy' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください

■ そなえよう

.NET 9 たのしみですね! そなえよう。