2021-11-27: Pyjion, Evergine, paint.net 4.3.3

Published on Saturday, 27 November 2021

トピックス

Pyjion - A Python JIT Compiler

https://www.trypyjion.com/

CPython に .NET ランタイムの JIT コンパイラーを組み込み利用することで高速化するというライブラリ。

Python のコードの変更は有効化する一行程度で対応可能で、pyjion コマンドによる直接実行もサポートしている。

元々は Microsoft の Organization で開発されていたが、現在は Anthony Shaw 氏 (Microsoft の Python Advocate) の個人リポジトリーに移動して開発が続き、リリースされている。

Discover Evergine... more than ever! - Evergine

https://evergine.com/discover-evergine/

Wave Engine という名前の 3D グラフィックスエンジンが Evergine という名前でリブランディングした。

Evergine は C# と .NET をベースとしたエンジンでクロスプラットフォームに対応している。このリリースでは .NET 6 と C# 10, Visual Studio 2022 への対応が含まれるとのこと。

paint.net 4.3.3 is now available!

https://forums.getpaint.net/topic/118933-paintnet-433-is-now-available/

Paint.NET 4.3.3 がリリースされた。

このバージョンで .NET 6 への移行が行われ、レンダリングや起動のパフォーマンスの向上の他、プラグインの C# 10 での実装が可能となった。また、COM 以外の相互運用コードを TerraFX.Interop.Windows に移行し、今後 COM 相互運用コードも移行することで C++/CLI を排除でき、crossgen2/ReadyToRun の恩恵を受けられるようになるとのこと。

アーティクル、スライドなど

[CallerArgumentExpression] and throw helpers: Exploring .NET Core 6 - Part 11

https://andrewlock.net/exploring-dotnet-6-part-11-callerargumentexpression-and-throw-helpers/

.NET 6 で追加された CallerArgumentExpression 属性についてとそれを使用した例外を投げるヘルパーについての記事。

例外ヘルパーによる利点として、メソッドのコードが簡素になる、JIT でインライン化しやすくなるといった点にも触れている。

【C#】本物の関数ポインタの使い方と関数アドレスの取り方 - Qiita

https://qiita.com/Kujiro/items/9e442b0e9fb98ad904d8

C# 9 で導入された関数ポインター型 (delegate*) についてとその使用方法について。

Configuring dotnet-monitor with Prometheus and Grafana - Dotnetos

https://dotnetos.org/blog/2021-11-22-dotnet-monitor-grafana/

dotnet-monitor を Prometheus と Grafana を組み合わせて .NET のメトリクスを視覚化する方法についての記事。

記事ではサンプルアプリケーションを使用して Prometheus に dotnet-monitor のデータを格納し、Grafana で視覚化するまでをステップバイステップで説明している。

【C# 10.0】 トップ レベル ステートメントの変更点

https://ufcpp.net/blog/2021/11/top-level-csharp10/

C# 10 のトップレベルステートメントに関する記事。

C# 9 からの変更点として空ステートメントについてとトップレベルステートメントを含むクラス名について触れている。

【Unity】UnityEngine.Object の Null チェックまとめ - コガネブログ

https://baba-s.hatenablog.com/entry/2021/11/16/090000

Unity の UnityEngine.Object は比較演算子のオーバーロードを持ち、null に対する独特な比較を実装しているため、その挙動についてまとめた記事。

オブジェクトを Destory した後のタイミングごとの結果や ?? のような演算子での結果にも触れている。

.NET 6 Hot Reload and "Refused to connect to ws: because it violates the Content Security Policy directive" because Web Sockets

https://www.hanselman.com/blog/net-6-hot-reload-and-refused-to-connect-to-ws-because-it-violates-the-content-security-policy-directive-because-web-sockets

Content Security Policy (CSP) を設定していることでホットリロードのための WebSocket 通信ができなくなってしまうという記事。

QUICスタックとTLSライブラリの関係とOpenSSLの状況

https://medium.com/nttlabs/quic-tls-relation-and-openssl-circumstance-fca824169b46

QUIC のスタックとそれに関連した TLS の位置づけと依存しているライブラリーの状況についての記事。

QUIC での TLS の処理の流れや QUIC に必要な機能を OpenSSL に追加する必要がある中での現状などに触れている。

.NET 6 で Blazor WebAssembly 環境構築でエラーした話

https://zenn.dev/naminodarie/articles/0fa46bf42b18e0

.NET 6 で Blazor WebAssembly の wasm-tools をインストールする際に Preview 版がインストールされているとエラーとなることがあるという話。

WinUI3 Desktopで開発したアプリのインストール戦略 (Windows App SDK) - Qiita

https://qiita.com/hayashida-katsutoshi/items/eba4fe2e9332e87cdc8f

WinUI 3 を使用したアプリケーションのインストール形態についての記事。

【C#】.NET6のBlazor WebAssemblyのJS呼び出しは200倍早い - Qiita

https://qiita.com/Kujiro/items/0d6510525aa8d8289b01

.NET 6 では Blazor WebAssembly 環境で .NET 側のコードから JavaScript 側にバイト列を渡す際に Uint8Array となったことでパフォーマンスが向上されたという話。

【C# 10.0】 AppendLiteral(" ")

https://ufcpp.net/blog/2021/11/AppendLiteral/

C# 10 / .NET 6 で改善された文字列補完式で使用される DefaultInterpolatedStringHandlerAppendLiteral メソッドについての記事。

AppendLiteral(string) があって AppendLiteral(char) がない理由について。

Entity Framework Core 上で C# の文字列補間を使って安全に SQL 文を実行するが、SQL 文そのものを動的に組み立てたい | @jsakamoto

https://devadjust.exblog.jp/28969310/

Entity Framework Core では ExecuteSqlInterpolatedAsync メソッドを使用することで文字列補完で安全に SQL のパラメータを指定できる仕組みがあるが、そのメソッドに渡す文字列を動的に変更したい場合にはどうすればいいのかという記事。

記事では FormattableStringFactory.Create を使用して FormattableString を生成する方法が紹介されている。

Meet Rider 2021.3’s new Problems View | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2021/11/24/meet-rider-2021-3-new-problems-view/

Rider 2021.3 で導入される Problems View の紹介記事。

Problems View ではファイルの問題をはじめ、ソリューションやツールキットといったものの問題を一元的に確認できるビューになるとのこと。

【C#】配列、stringの内部実装とSpan<T>のありがたみ - Qiita

https://qiita.com/Kujiro/items/e1998b14176419b3ad1a

String の内部表現とデータを取り扱う上での Span<T> の必要性についての記事。

Manually Removing .NET SDKs from MacOS

https://dev.to/justinyoo/manually-removing-net-sdks-from-macos-4jce

macOS で .NET SDK を削除する方法についての記事。ツールではなく手動で削除する方法について。

.NET 6 と .NET 5 でXmlSerializerを用いたXML出力結果が異なる

https://zenn.dev/yukg/articles/d9c95e93d6932b

.NET 6 の XmlSerializer ではパフォーマンス向上を目的としてデフォルトのシリアライズ結果としてインデントなどが含まれなくなったことについての記事。

DateTime.MinValue や new DateTime() は危険 - Life like a clown

https://clown.cube-soft.jp/entry/2021/11/26/datetime-trap

DateTime.MinValuenew DateTime() を扱うことについての危険性についての記事。

DateTime.MinValuenew DateTime()1/1/0001 12:00:00 AM となるので、例えば JST から UTC に戻そうとして愚直に9時間を引くといったことをすると例外が発生する。記事ではこのようなケースを避けるために、最小の値としてアプリケーションで決めた固有の値を使用すること、ToUniversalTime を使用すること、nullable にすることなどがあげられている。

ライブラリ、リポジトリ、ツールなど

Elringus/DotNetJS: Use .NET in any JavaScript environment: browsers, Node.js, VS Code web extensions, etc.

https://github.com/Elringus/DotNetJS

.NET の WebAssembly 出力を Blazor ではなく、Node.js やブラウザーといった JavaScript ランタイムで動作させるためのライブラリー。.NET のコードを WebAssembly として出力し、JavaScript のコードとの相互での呼び出しが可能にする仕組みを提供する。

xoofx/SharpNng: SharpNng is a lightweight low-level managed wrapper around the Lightweight Messaging Library NNG

https://github.com/xoofx/SharpNng

軽量メッセージングライブラリーの NNG の .NET のラッパーライブラリー。

サイト、ドキュメントなど

String.ReplaceLineEndings Method (System) | Microsoft Docs

https://docs.microsoft.com/en-us/dotnet/api/system.string.replacelineendings?view=net-6.0

.NET 6 で追加された改行を一括置換するメソッド。プラットフォーム間で異なる改行を使用していることで混在してしまった場合に正規化するといったことが可能。ドキュメントではプロトコルパーサーなどでは使用しないことが推奨されている(例えば HTTP/1 は CRLF と決められている)。

改行として認識する文字は CR (U+000D), LF (U+000A), CRLF (U+000D U+000A), NEL (U+0085), LS (U+2028), FF (U+000C), PS (U+2029) となっている。

ツイート

ReSharper と Rider の 2021.3 EAP9 がリリースされたという話。

Entity Framework Core 6 で ValueConverter が null をサポートできるようになったという話。

Entity Framework Core 6 では TagWithCallSite を呼び出すことでクエリーのタグとしてファイル名と行番号を記録できるという話。

Entity Framework Core のクエリーで String.IsNullOrWhitespace を使用したときに発行される SQL に LTRIM, RTRIM が使用されていたが EF Core 6 ではそれらの呼び出しがなくなり、ただの空文字との比較となるという話。

これは SQL Server 向けの SQL トランスレーターの変更で SQL Server での文字列比較は文字列の長さが異なる場合は末尾にスペースをつけて長さを合わせての比較となる(ANSI/ISO SQL-92 に準拠した仕様)。そのため ' ' = '' が等しいということになるのでトリムが不要となった。

リアルタイムで GC の動作を確認できる dotnet-gcmon というツールがリリースされているという話。

Deep Dive

Allow runtimeconfig StartupHooks and Environment StartupHooks to both be present by tomdegoede · Pull Request #61461 · dotnet/runtime

https://github.com/dotnet/runtime/pull/61461

.NET にはスタートアップ時に実行するアセンブリを指定するスタートアップフックという仕組みがあるが、runtimeconfig と環境変数のどちらかしか設定できないという問題を修正する PR。

Reduce allocations for CreateDirectory by adamsitnik · Pull Request #61777 · dotnet/runtime

https://github.com/dotnet/runtime/pull/61777

CreateDirectory メソッドの内部でシステム API を呼ぶ際 string を P/Invoke 経由で渡すのではなく、一時的なバイト配列を通して渡すことでアロケーションを削減する PR。

Add RateLimiting APIs by BrennanConroy · Pull Request #61788 · dotnet/runtime

https://github.com/dotnet/runtime/pull/61788

RateLimiting API を追加する PR。

XXHash64/32 incorrect one-shot implementation · Issue #61878 · dotnet/runtime

https://github.com/dotnet/runtime/issues/61878

.NET 6 とともにリリースされた System.IO.Hashing の xxHash32/64 のハッシュをとる静的メソッドが不正な結果を返すことがある問題の Issue。

これは修正されてバックポート済みのため近いうちに新しいパッケージとしてリリース予定。

Support zero-byte reads on HTTP response streams by MihaZupan · Pull Request #61913 · dotnet/runtime

https://github.com/dotnet/runtime/pull/61913

SocketsHttpHandler でゼロバイト読み込みをサポートしたいという Issue。

元々は gRPC の Bidirectional streaming のような長い接続の場合、ストリームから読み取るためのバッファーが各所にあり GC ヒープの断片化を起こしてしまう。ゼロバイト読み込みが可能となれば実際にデータが必要になるまで上位ではバッファーを持つ必要がなくなるという話。

Added AsReadOnly extension methods for IDictionary<T, U> and IList<T> by Mrxx99 · Pull Request #61172 · dotnet/runtime

https://github.com/dotnet/runtime/pull/61172

IDictionary<T, U>IList<T> に対する AsReadOnly 拡張メソッドを追加する PR。

MemoryStream.Read() throws ArgumentOutOfRangexception in .NET 6 but ArgumentException in .NET 5 · Issue #61994 · dotnet/runtime

https://github.com/dotnet/runtime/issues/61994

MemoryStream.Read が .NET 5 までは ArgumentException をスローしていたが、.NET 6 では ArgumentOutOfRangexception になっていたという Issue。

ArgumentOutOfRangexceptionArgumentException を継承した型なので変更は問題ないと考えているとのこと。ただしテストコードなどで ArgumentException を明示していると問題となることがある。

Add basic implementation of new rename UI by ryzngard · Pull Request #57686 · dotnet/roslyn

https://github.com/dotnet/roslyn/pull/57686

新しいリネームの UI の基本実装の PR。見た目は確定していないが今後実装される雰囲気をみることができる。