タグ

ブックマーク / ufcpp.net (61)

  • JSON とかの中身確認ツール

    今日は、「主に自分が使う用ツールを Blazor WebAssembly で作って Static Web Apps に置いたよ」系の話を一応ブログ化。 ソースコード Static Web App よくある「JSON とかのデータの中身を確認するツール」です。 しばらく、JSON と MessagePack の読み書きをするコードを書いてて、 デバッグがしんどくなって作ったのがこのツール。 いろんな形式を同時に扱うことがニッチ需要なのであんまり自分の需要にあったツールがなかったんですよね。なら、まあ、自作。 こないだの C# 配信 で、UTF-8 とか MessagePack バイナリとかを手打ちで入力してたら @xin9le, @okazuki 両氏にドン引きされたやつ。 バイナリ読み込み (Parser) UTF-8 を ReadOnlySpan<byte> のまま扱ってて、 ブレイクポ

    JSON とかの中身確認ツール
  • C# 10.0 の新機能

    ※一部、まだ記事化(めったに使わない機能や細かい修正の紹介)が完了していません: Async method builder override Enhanced #line directive 執筆予定: C# 10.0 トラッキング issue record struct C# 9.0 (レコード型の最初のバージョン)では、レコード型は常に参照型(クラスと同系統の型)になります。 これに対して C# 10.0 では値型も選べるようにしました。 そのため、以下のように、record class と record struct というキーワードで書き分けができるようになりました。 record class Reference(int X, int Y); // record だけ書いた場合こちらと同じ意味 record struct Value(int X, int Y); 詳しくは 「レコー

    C# 10.0 の新機能
  • 最初の C# プログラム(.NET 6 新テンプレート)

    .NET 6 ではプロジェクト テンプレートが更新されて、かなりシンプルになります。 例えば、コンソール アプリの場合(dotnet new console コマンドで生成)は(コメント行を除けば実質)以下の1行だけの C# ファイルが生成されます。 Console.WriteLine("Hello, World!"); 先日の .NET 6 Preview 7 から、コンソール アプリと Web アプリがこの新テンプレートになっています。 トラッキング issue を見るに、他のタイプのプロジェクトも同じ方針で書き換え中みたいです。 今日はこの新テンプレートがらみで、背景とか、内部挙動的な話とか、Preview 7 から正式リリースまでの間に掛かる予定の変更の話とか。 旧テンプレート まあ、これまでのテンプレートが以下のようなものでしたから、ずいぶんとすっきりしました。 using Sy

    最初の C# プログラム(.NET 6 新テンプレート)
  • 引数 null チェックの !!、取りやめ

    2月にブログに書きましたが、 Visual Studio 17.1 Preview 3の頃、C# 11 候補として「引数の null チェック」構文が入っていました。 m(null); // ArgumentNull 例外が出る。 void m(string x!!) { } 今現在(VS 17.2 Preview 5)でもこの構文は生きているんですが、次(たぶん、17.2正式リリースでも17.3 Preview 1でも)でいったん取りやめになるそうです。 取りやめの経緯 C# チームとしては、今、Preview リリースをしてみて反応を見てその後どうするかを決めたりしているわけですが。 LangVersion preview があるのはそのためです。 とはいえ、普通に考えて、Preview 機能まで追いかけている人がそんなに多いわけもなく、 正式リリースされるまでどんな機能が追加されてい

    引数 null チェックの !!、取りやめ
  • 祝 .NET 5.0 リリース: .NET Core 3.1 からの移行話

    祝 .NET 5.0 GA。 Announcing .NET 5.0 C# 9.0 on the record Visual Studio 2019 v16.8 and v16.9 Preview 1 Release Today Announcing ASP.NET Core in .NET 5 Visual Studio 2019 16.8 リリースノート Visual Studio 2019 18.9 Preview 1 リリースノート .NET Conf 2019 - Day 1 ライブ配信 一応注釈なんですが、 .NET は以下のような状態です。 .NET 5.0 からは単に「.NET」になります .NET Framework, Standard, Core の統合結果です TargetFramework 名、 net5.0 で、 netstandard2.1 と netcorea

    祝 .NET 5.0 リリース: .NET Core 3.1 からの移行話
  • エントリー ポイント

    概要 実行可能なプログラムを書くとき、最初に呼び出される処理をエントリー ポイント(entry point: 入場地点、入り口)と言います。 C# の場合、通常、Main という名前の静的メソッドを1個だけ書くことで、このメソッドがエントリー ポイントになります。 また、複数の Main メソッドを書いてそのうちの1つをエントリー ポイントに選ぶ方法があったり、 C# 9.0 からはトップ レベル ステートメントという書き方でエントリー ポイントを作れたりします。 項ではこの C# のエントリー ポイントに関する仕様について説明します。 C# のエントリー ポイント C# 関連のチュートリアルでのサンプル コードや、 テンプレート通りに C# プログラムを新規作成すると以下のような内容になっていることが多いと思います。 using System; namespace ConsoleApp

    エントリー ポイント
  • CPU

    概要 「組み合わせ回路」や「順序回路」では、 ディジタル液晶表示回路やカウンター回路など、簡単な機能をディジタル回路化する方法について説明しました。 しかしながら、これらの機能はかなり簡素な部類に入ります。 現実にはもっと複雑で多用な機能が必要となりますが、複雑な機能をすべてハードウェア的に実装すると、ハードウェア規模が肥大化してしまいます。 そこで、図1に示すように、 外部からある種の「命令」(instruction)を与えることでさまざまな処理を行うことができる汎用的なハードウェアを作って、 「命令」の与え方の工夫で複雑な処理を行うことを考えます。 現在、いわゆる「コンピューター」(computer: 計算機)と呼ばれるものの多くはこういう汎用的な作りになっていて、 汎用コンピューター(general computer)と呼ばれます。 汎用コンピューターを構成するハードウェアのうち、特

    CPU
  • C# で、同じソースコードから常に同じバイナリを生成する

    昔、gist にだけ置いてて、そういえばブログに書いてなかったものを思い出したので書いておくことに。 (一応、部分的には言及したことがあるんですけど、ちゃんとした話はしたことがなかったはず。) 決定論的ビルド 3年くらい前まで、C# コードをコンパイルすると、ソースコードを一切書き換えていなくても、生成結果の exe/dll や pdb のバイナリが変化していました(決定性(deteminism)がない)。 原因は以下の2つです。 バイナリ中に埋め込まれる GUID にタイムスタンプと乱数から生成される値を使っていた デバッグ用のファイル情報がフルパスで埋め込まれていた GUID の方はタイムスタンプと乱数なので当に致命的で、ローカルで再コンパイルしても毎回バイナリが変化していました。 フルパスの方は基的には pdb (デバッグ用シンボル情報)だけの問題なんですが、 exe/dll で

    C# で、同じソースコードから常に同じバイナリを生成する
  • .NET 5、Visual Studio 16.1 Preview 3

    今年の build、思ってたよりも .NET がらみが盛沢山… Windows TerminalとかVisual Studio Onlineとかの方がさらにインパクト強そう? ですけど、 .NET がらみもだいぶ。 まあ、3.0 が今年こそ見えてきましたからね。 Introducing .NET 5 .NET Core 4 は Framework 4.X と紛らわしいから欠番にして、次は「5」 徐々に .NET Core に一化して、名前も「.NET」に .NET Framework は 4.8 を最後のバージョンにすると明言 Mono の機能は徐々に取り込むとのこと 最初の目標は corefx(ライブラリ部分)をcoreclrと Mono VM で99%共有化とかからと言ってるので先は長そう これからは年に1回、毎年11月にメジャー リリースする 2019/9 に .NET Core

    .NET 5、Visual Studio 16.1 Preview 3
  • C# 8.0 小さな修正 | ++C++; // 未確認飛行 C ブログ

    Visual Studio 2019 Preview 1 が出て、 さすがに C# 8.0 に入る機能・入らない機能がある程度見えてきたので、 今日からしばらくその辺りの紹介をしていこうかと。 とりあえず今日は、「1記事使うほどでもないような小さい奴」をまとめて紹介。 文字列補完、$ と @ の順序緩和 ??= (null 合体代入)演算子 構造体の宣言時、refとpartialの順序緩和 分解の右辺に default 式 入れ子の{}内での stackalloc unmanaged 制約付きの型引数に、ジェネリックな型を渡す ちなみに、VS 2019 Preview 1 で実装されているのは上の2つだけです。 順序緩和 C# のキーワードには、並び順を自由に変えられるものがいくつかあります。 代表的なのはクラスやメソッドに対する修飾子ですが、例えば以下の3行は全く同じ意味になります。 s

    C# 8.0 小さな修正 | ++C++; // 未確認飛行 C ブログ
  • cszip、nuget.org に上げました

    こないだ .NET Global Tools を試すのに作ってみた cszip と csunzip、nuget.org に上げてみといた。 以下のコマンドでインストール可能な状態になっています。 dotnet instal tool -g cszip dotnet instal tool -g csunzip 以下のように適当にもほどがあるんで nuget.org に上げるかどうか迷っていたものの。 readme の類一切ない ほんとに内部的に CreateFromDirectory、ExtractToDirectory を呼んでるだけ 例外処理全然してない (不正な引数を渡したら .NET の例外メッセージがそのまま出る) オプション指定とかもできない (常に「圧縮率優先」「UTF8」) 専用のリポジトリ持ってなくて、UfcppSampleのDemoフォルダー以下にある 名前的にも、以下

    cszip、nuget.org に上げました
  • GetUnicodeCategory(int codePoint) を提案してみた

    今日は、.NET で、U+10000 以上のコードが割り当たってる文字の Unicode カテゴリー判定をする方法について。 提案を出したらそのままプルリクを出すことになった話。 背景 U+10000 以上の文字 Unicode について詳細は、昔書いた記事があるのでそちらを参照。 Unicodeとは? その歴史と進化、開発者向け基礎知識 Unicodeと、C#での文字列の扱い ここではさらっと。 U+10000 以上に割り当たってる文字は、要するに、以下のようなものです。 Unicode 設計当初に想定していなくて、後から「追加面」(supplementary planes)として定義した UTF-16 だと1文字で表せない なので、サロゲート ペア(surrogate pair: 代理対)っていう2文字1組のコードで表す UTF-8 だと4バイト文字になる 一部のマイナーな漢字、マイナ

    GetUnicodeCategory(int codePoint) を提案してみた
  • await って言う単語

    C# 5.0で非同期メソッドが導入されてから、 正式リリースを基準にしても5年以上、 最初の発表からだと7年以上経っています。 で、5年経っても、「なんて読むの」「asyncのaとawaitのaは違う」などなどが「定番ネタ」として定期的に出てくるわけですが。 特に、ECMAScript 2017がasync/awaitを導入したり、 Unity 2017がやっとC#のバージョンを6.0に上げれる感じになってきたり、 5年の断絶を経て去年からasync/awaitに触れる人が増えているようです。 5年も離れたら、世代断絶も起こりますよね… そりゃ、「定番ネタ」が改めて増えもしますよね… ということで、5年くらい前に同じようなことをどこかで書いてるはずなんですけど、改めて。 英単語 えいしんく まず読み方。 async: エイシンク await : アウェイト ってやつ。async の方が「ア

    await って言う単語
  • 【Roslynメタプログラミング】ValueChangedGanerator

    多少やりすぎ感があって大々的に推すかどうかは迷っているものの… ValueChangedGanerator .NET Compiler Platform (コードネーム Roslyn)を使ったメタプログラミングというか、結構なコード生成ツールを作ってしまっていたり。 今度やる勉強会で.NET Compiler Platformの話をするのと、一度作ってしまえば仕事でも活用できそうだったので。 生成ツールの概要 要するに、たびたび出てくる「INotifyPropertyChangedの実装めんどくさい問題」に対する、Roslyn使った解決方法の1つ。 INotifyPropertyChanged実装はめんどくさいものの、用途が限られてる(ほとんどの場合、クライアント開発者にしか使われない。サーバー側でもINotifyPropertyChanged自体は使われることあるけども、そっちは完全に自

    【Roslynメタプログラミング】ValueChangedGanerator
  • 抽象メソッド、抽象クラス(C# によるプログラミング入門)

    概要 抽象メソッドとは、実装を持たず、メソッドの意味(規約)だけを定義したメソッドです。 抽象メソッドの実装は基底クラスでは行わず、派生クラスで行います。 また、抽象クラスとは、 インスタンスを生成出来ないクラスのことで、 継承して使うことを前提としたクラスのことです。 ポイント 抽象メソッド: 基底クラスでは実装せず、メソッドの意味(規約)だけを定義して、派生クラスで具体的な実装を行うようなメソッド。 (C++ では純粋仮想関数と呼ばれていたものです。) 抽象メソッドを1個でも持つクラス(抽象クラス)は、インスタンスを生成することができません。 クラスやメソッドの前に abstract キーワードを付ける。 抽象化 「多態性」で、 仮想メソッドの利用例として Person クラスを挙げました。 この Person 基底クラスには、 Age というプロパティがありますが、 このプロパティ自

    抽象メソッド、抽象クラス(C# によるプログラミング入門)
  • ジェネリック

    概要 C# 2.0 で、 C++でいうところのテンプレート、一般にはジェネリック(ジェネリクス)などと呼ばれるものが実装されました。 (C++ のテンプレートとは少し仕様が異なりますが。) ジェネリック※(generics:総称性)、 あるいは、総称的プログラミング(generic programming)とも呼ばれますが、 この機能は、 さまざまな型に対応するために、型をパラメータとして与えて、その型に対応したクラスや関数を生成するもの機能です。 ポイント ジェネリック: 型だけ違って処理の内容が同じようなものを作るときに使う。 ジェネリッククラス:IComparable<T> { int CompareTo(T x, T y); } ジェネリックメソッド:T max<T>(T x, T y) { ... } ※genericsの訳語 英語だと、名詞では generics、形容詞が ge

    ジェネリック
  • [雑記] デリゲートの内部

    概要 デリゲートは、内部実装的には「インスタンスと関数ポインターをペアで管理しているクラス」になっています。 ここではデリゲートの内部挙動と、 それを踏まえたパフォーマンス上の注意点を説明します。 デリゲートは .NET ランタイム内で特殊な扱いをされていて、 デリゲート内部で起こっていることをそのまま C# で書くことはできないので、 ここでの説明は疑似コード的なものになります。 型定義 例えば、以下のようなデリゲートがあったとします。 delegate int F(int x); これは内部的には以下のような扱いになっています。 概ね、インスタンスと関数ポインターのペアです。 class F : System.Delegate { object Target; IntPtr FunctionPointer; // 実際には Delegate クラスのメンバー // あと、object

    [雑記] デリゲートの内部
  • セット

    数学などにおいては、 「集合(set)」というと、 要素を包含するかどうかだけが問題で、 挿入された順序等は意味を持ちません。 ということで、要素の順序は関係ないという状況下で、 要素の挿入・削除・検索を高速で行えるようなコレクションをセット(set)と呼びましょう。 (「集合」だとコレクションと紛らわしいので、英語のままにしておきます。 ちなみに、数学用語的には、collection は「集まり」と訳します。) 「ソート済み配列」、 「ハッシュテーブル」、 「2分探索木」等は全てこの要件を満たしています。 要するに、これらはいずれもセットと呼ぶに値する機能を持っています。 そこで、セットは、以下のような「インターフェース」として定義します。 /// <summary> /// セット。 /// 数学で「集合」と呼ぶ奴。 /// 要素の順序には意味がなくて、要素が含まれているかどうかだけが

    セット
  • コレクション概要

    「データ構造」と呼ばれるものの代表格というと、 同じ型のデータをたくさん集めたもの、すなわちコレクションと呼ばれるものでしょう。 今の世の中、Java も C# も標準で、 List やら Dictionary やらいろいろなコレクションを持っています。 C++ も、1998年に標準化された STL と呼ばれるライブラリに、 一通りのコレクション(STL の流儀ではコンテナとも呼びます)が揃っています。 昔の人は結構な頻度でこの手のデータ構造を自作していました。 また、標準でその手のコレクションを利用できる現在においても、 どのコレクションの内部構造がどういう風になっているのか概要だけでも知っていれば、 どういうケースでどのコレクションを使うのが最適なのかがすぐに分かるという利点があります。 かなりの部分が STL の説明と被るので、 「単なるC# サンプルプログラム」みたいな扱いになりそ

    コレクション概要
  • Span<T>構造体

    概要 Ver. 7.2 Span<T>構造体(System名前空間)は、span (区間、範囲)という名前通り、連続してデータが並んでいるもの(配列など)の一定範囲を読み書きするために使う型です。 この型によって、ファイルの読み書きや通信などの際の、生データの読み書きがやりやすくなります。 生データの読み書きを直接行うことは少ないでしょうが、通信ライブラリなどを利用することで間接的にSpan<T>構造体のお世話になることはこれから多くなるでしょう。 Span<T>構造体は、 .NET Core 2.1 からは標準で入ります。それ以前のバージョンや、.NET Framework では、System.Memoryパッケージを参照することで利用できます。 C# 7.2の新機能のうちいくつかは、この型を効率的に・安全に使うために入ったものです。 そこで、言語機能に先立って、このSpan<T>構造体

    Span<T>構造体