お題は、C# で連結リスト LinkedList<T>。
テストを書きながら少しずつ実装していくというものになっています。
Visual Studio の Live Share と Live Unit Testing を使い、2人で快適にコーディングすることができました。
]]>Azure Machine Learning などで機械学習/ディープラーニングのモデルを作成し、それを .NET の中の ML.NET を利用して使ってみましょう。
チュートリアル形式で説明します。
機械学習/ディープラーニングのモデルを作成するところから、.NET アプリケーションで使うまでの手順を、実際に手を動かしながら学ぶことができます。
]]>これらのイベントで公開された/公開予定の技術についてご紹介いたします。
以前から発表されている通り、次の .NET では次のようになります。
"One .NET" ということで、.NET が現在の .NET Core に統合され、.NET 5 となります。
※ .NET 5 に含まれないもの
ちなみに .NET Framework は 4.8 が最終バージョンです。今後は保守フェーズに入り、機能の新規追加はされなくなります。
.NET Framework のサポート自体は Windows 10 がサポートされている間は続くと思われます。
将来性から考えると、新規に .NET で開発する場合は、.NET Core を用いるべきだと考えられます。
上記のとおり、現在ある .NET Framework、.NET Core、Xamarin は一つの .NET に統合されます。
但し、2020 年 11 月の .NET 5 リリース時点では Xamarin の統合はプレビュー扱いです。
.NET 6 で完全に統合される見込みです。
.NET 6 は LTS (Long term support: 長期サポート) 版となる予定なので、新規開発に利用するのは、.NET 6 からが無難かも知れません。
Microsoft は既に Windows への囲い込みを行っていませんので、新たな開発方法としては Windows 以外の OS もサポートするマルチ プラットフォームなものを提供していくことになります。
注目すべきは、以下の二つです。
将来的にはどちらもネイティブアプリケーションも開発できるものですが、MAUI は従来の Windows アプリケーション開発技術の延長にある技術、Blazor は Web アプリケーション開発技術の延長にあり、とりあえずは Web 開発用です。
ひとつずつ説明します。
MAUI というアプリケーション開発技術が発表されました。
MAUI の特徴は次の通りです :
XAML (Extensible Application Markup Language):
現在すでに Blazor Server という、C# だけで Web アプリケーションが開発できるサーバーサイド技術が .NET で使用できますが、この技術が拡張され、Web アプリケーションだけでなくネイティブアプリケーションも作成できるようになることが予定されています。
Blazor の特徴は次のとおりです:
今回新たにリリースされたのは、Blazor WebAssembly 3.2.0 (GA) です。
近い将来この Blazor が拡張され、ネイティブ アプリケーション (Web アプリケーションでない Windows アプリケーション/Mac アプリ /iOS アプリ/Android アプリ) も作れるようになります。
新たな Windows アプリケーション ライブラリーとして WinUI 3 が発表になりました。
以下が発表されました:
Web 版 (クラウド版) の Visual Studio Code/Visual Studio です。
Visual Studio Codespaces は、以前 Visual Studio Online と呼ばれていたものです。
ネイティブアプリケーションだった Office が Web 版になり、Microsoft 365 になったように、様々なツールがクラウド版になっていきます。
C# 9.0 が発表されました。
Serverless や AI/Data などを中心にアップデートされています。
Free Tier
AutoScale
Azure Synapse Link: データベース分析サービス
Power Apps や Power Automate、Power BI、Dynamics 365、Microsoft 365 の新たな統合機能の発表
Microsoft Teams の多数のアップデートの予定が発表
・ Windows Terminal 1.0
次のような機能があります。
Microsoft Store からインストールできます。
タブごとに Windows Subsystem for Linux、コマンドプロンプトや PowerShell など
タブの内部をペインに分割する機能
WSL は、Windows に組み込まれた virtual な Linux 環境です。
Microsoft Store からインストールできます。
WSL2 で新たに GPU がサポートされます。 CUDA 利用できたり、GPU 版 Tensorfow が動作できたりします。
winget という Windows Package Manager (Preview 版) がリリースされました。
Linux のようにコマンド ラインから簡単にアプリケーションなどがインストールできます。
参考:Windows Package Manager Preview | Windows Command LineProject Reunion というプロジェクトが発表されました。
Windows の API は現在次のように 2 つ ありますが、これを統合しようというプロジェクトです。
C#7、8 では、struct (値型) 関連の便利な機能追加が多いので、その辺りに注力してみた。
昨年までは2トラックでしたが、今回は3トラックになりました (ルームA, B, C)。
リンクなどをまとめておきます。
(*) BuriKaigi とは何かということは次に詳しく書かれています: Burikaigi という毎年冬のイベント | hikaruworld | Medium
『BuriKaigi 2020』 | |
---|---|
日時 | 2020年2月1日(土) 13:00〜19:00 (終了後懇親会) |
会場 | 富山県民会館 (懇親会会場: 割烹 扇) |
#BuriKaigi #BuriKaigiC https://t.co/rSCc4Nqcea pic.twitter.com/BvdLN5oLKa
— Fujio Kojima (@Fujiwo) February 1, 2020
#BuriKaigi #BuriKaigiC 森さんのジョシュア ツリーのお話。 https://t.co/LO2rNRe5pt pic.twitter.com/oegNAwpRAg
— Fujio Kojima (@Fujiwo) February 1, 2020
#BuriKaigi #BuriKaigiA https://t.co/srTUaBsInF pic.twitter.com/4fpqBZMK7D
— Fujio Kojima (@Fujiwo) February 1, 2020
#BuriKaigi #BuriKaigiA マイクロソフト井上章さんのキーノート。なんと Windows DNA のお話から。 https://t.co/jALoFO3lKy pic.twitter.com/56lVsuXH8m
— Fujio Kojima (@Fujiwo) February 1, 2020
#BuriKaigi #BuriKaigiA 室長さんと杉本さんの Dynamic なセッション。 https://t.co/vmNnjYs6Qz pic.twitter.com/vbn4YDXJtx
— Fujio Kojima (@Fujiwo) February 1, 2020
ブリ会議恒例!
— Kazuya Sugimoto @CData Software Japan (@sugimomoto) February 1, 2020
ドキドキライブコーディング!
満員御礼!
#burikaigi pic.twitter.com/VzUQ33vHEP
ライブコーディング合戦始まった#burikaigi #burikaigiA pic.twitter.com/kueuMIJIoq
— ちゅき[2/8 わんくま大阪ですよー] (@Chuki) February 1, 2020
#burikaigi #burikaigiA
— あると沙樹/Studioさきあると (@sakiaruto) February 1, 2020
C# ドキドキ ライブ コーディング!!
石野 光仁 氏 @ailight
鈴木 孝明 氏 @xin9le
小島 富治雄 氏 @Fujiwo
室星 亮太 氏 @ryotamurohoshi pic.twitter.com/5sMYfcgop2
ドキドキライブコーディング楽しい!#burikaigi #burikaigiA pic.twitter.com/9EgBOYB4Pj
— jun@Jun-nyan(sɹǝunɾ) (@juners) February 1, 2020
まさかの写真入れ替えに対してCPU負荷で小島さんが逆転!#burikaigi #burikaigiA pic.twitter.com/PKTkRdn6l3
— jun@Jun-nyan(sɹǝunɾ) (@juners) February 1, 2020
#burikaigi 石野さん(@AILight )たちによる「C# ドキドキ ライブ コーディング!!」。後半は4名の方々が事前に作ってきたプログラムによるスピード対決です(゚∀゚)
— オーニシ@2/15富山IT勉強会Zabbix入門 (@onishi_feuer) February 1, 2020
みんなしてチートしてておもろいwww pic.twitter.com/fBfOKF1nWX
スライド写真多めですが、勉強会編もアップします(ほぼ未選別)
— jun@Jun-nyan(sɹǝunɾ) (@juners) February 2, 2020
#burikaigi
2020/02/01 Burikaigi2020 勉強会編https://t.co/D7m394hKGR
アップロード終わったのでまずは 懇親会の写真をアルバムで上げます。 #burikaigi
— jun@Jun-nyan(sɹǝunɾ) (@juners) February 2, 2020
2020/02/01 Burikaigi2020 懇親会編https://t.co/p7TWVCnYds
#BuriKaigi 懇親会の様子。 https://t.co/bMwt6cpmw0 pic.twitter.com/wJ3ETkK0Ln
— Fujio Kojima (@Fujiwo) February 4, 2020
ブリしゃぶの準備#burikaigi pic.twitter.com/8ftFGcZIfv
— なぎせ ゆうき (@nagise) February 1, 2020
これは良い幻想的#BuriKaigi pic.twitter.com/ZqeKexvxzK
— りなたむ MVP 🇯🇵 / Ryota / #PowerAddict (@R_t_A_n_M) February 1, 2020
#BuriKaigi https://t.co/NLyWTsezf7 pic.twitter.com/CeNsOh4wjx
— Fujio Kojima (@Fujiwo) February 1, 2020
Blazor は、C#/.NET で Web アプリケーションを開発できるプラットフォームとして、.NET Core 3 で正式リリースされた。
従来の ASP.NET ではサーバーサイドを C#/.NET、クライアントサイドを JavaScript (や TypeScript) で記述していたが、Blazor ではサーバーサイドとクライアントサイドを統一した言語 (C#) で記述できるのが大きなメリットだ。これにより、単一のコードでモデルが記述できるようになる。
今回、Blazor に関して、以下のように多くの新技術が発表になった:
Boids の 3 つの規則 | ||
---|---|---|
分離 (Separation): | 近くの仲間にぶつからない方向に移動 | |
整列 (Alignment): | 近くの仲間が平均的に向かっている方に向かう | |
集結 (Cohesion): | 近くの仲間の中心方向に移動する |
TypeScript などで Boids のデモを 3 種類作成してみた。
鳥の群れではなく、魚の群れを意識した。
※ 各画像をクリックするとそれぞれのページへ飛ぶ
2D版では2次元ベクトル、3D版では3次元ベクトルで、個体の位置や速度を計算している。
2つの3D版は、Three.js というライブラリーを使って WebGL で動かしている。
参考:
3D 裸眼立体視版は、裸眼立体視 (交差法または平行法) ができる人向けだ。 立体視の方法については、次のページなどが参考になる。
参考:
なお、各版ともパラメーターを色々と変更できるので試してほしい。
これらのデモ ページの実装については、ソースコードを参照してほしい。
ソースコードは、GitHub に上げた:
以下を使って作った:
上記デモは、Visual Studio Code 上で作成した。
Visual Studio Code は、プログラミングに最適な Microsoft 製のテキスト エディターで、Windows 版、macOS 版、Linux 版がある。
HTML や CSS はもちろんのこと、JavaScript や TypeScript、C# などの多種多様なプログラミング言語にも対応している。
Git クライアント、ビルド、シンタックス ハイライト、リファクタリング、インテリセンスなどの機能を持ち、とても使いやすいのでお薦めだ。
どのような機能や言語が使えるかは、Extensions for Visual Studio family of products | Visual Studio Marketplace が参考になる。
参考:
TypeScript は、設定を変えることにより、"ES3"、"ES5"、"ES2015"、"ES2016"、"ES2017"、"ES2018"、"ES2019" にコンパイルすることができる。
デモでは、"ES5" を使っている。
TypeScript のコンパイル オプションは、"tsconfig.json"というファイルで行う。 今回は次のような内容とした。
{
"compilerOptions": {
/* Basic Options */
"target": "ES5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
"sourceMap": true, /* Generates corresponding '.map' file. */
/* Strict Type-Checking Options */
"strict": true, /* Enable all strict type-checking options. */
/* Module Resolution Options */
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
}
}
TypeScript は、Visual Studio Code から簡単に JavaScript にコンパイルできる。
ちなみに、次のような TypeScript の場合:
class Vector3D {
x: number;
y: number;
z: number;
get absoluteValue(): number {
return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
}
constructor(x: number = 0, y: number = 0, z: number = 0) {
this.x = x;
this.y = y;
this.z = z;
}
clone(): Vector3D {
return new Vector3D(this.x, this.y, this.z);
}
plus(another: Vector3D): Vector3D {
return new Vector3D(this.x + another.x, this.y + another.y, this.z + another.z);
}
plusEqual(another: Vector3D): void {
this.x += another.x;
this.y += another.y;
this.z += another.z;
}
minus(another: Vector3D): Vector3D {
return new Vector3D(this.x - another.x, this.y - another.y, this.z - another.z);
}
minusEqual(another: Vector3D): void {
this.x -= another.x;
this.y -= another.y;
this.z -= another.z;
}
multiply(value: number): Vector3D {
return new Vector3D(this.x * value, this.y * value, this.z * value);
}
innerProduct(another: Vector3D): Vector3D {
return new Vector3D(this.x * another.x, this.y * another.y, this.z * another.z);
}
divideBy(value: number): Vector3D {
return new Vector3D(this.x / value, this.y / value, this.z / value);
}
divideByEqual(value: number): void {
this.x /= value;
this.y /= value;
this.z /= value;
}
getDistance(another: Vector3D): number {
return this.minus(another).absoluteValue;
}
}
"ES5" でコンパイルしてできた JavaScript はこんな感じ:
"use strict";
var Vector3D = /** @class */ (function () {
function Vector3D(x, y, z) {
if (x === void 0) { x = 0; }
if (y === void 0) { y = 0; }
if (z === void 0) { z = 0; }
this.x = x;
this.y = y;
this.z = z;
}
Object.defineProperty(Vector3D.prototype, "absoluteValue", {
get: function () {
return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
},
enumerable: true,
configurable: true
});
Vector3D.prototype.clone = function () {
return new Vector3D(this.x, this.y, this.z);
};
Vector3D.prototype.plus = function (another) {
return new Vector3D(this.x + another.x, this.y + another.y, this.z + another.z);
};
Vector3D.prototype.plusEqual = function (another) {
this.x += another.x;
this.y += another.y;
this.z += another.z;
};
Vector3D.prototype.minus = function (another) {
return new Vector3D(this.x - another.x, this.y - another.y, this.z - another.z);
};
Vector3D.prototype.minusEqual = function (another) {
this.x -= another.x;
this.y -= another.y;
this.z -= another.z;
};
Vector3D.prototype.multiply = function (value) {
return new Vector3D(this.x * value, this.y * value, this.z * value);
};
Vector3D.prototype.innerProduct = function (another) {
return new Vector3D(this.x * another.x, this.y * another.y, this.z * another.z);
};
Vector3D.prototype.divideBy = function (value) {
return new Vector3D(this.x / value, this.y / value, this.z / value);
};
Vector3D.prototype.divideByEqual = function (value) {
this.x /= value;
this.y /= value;
this.z /= value;
};
Vector3D.prototype.getDistance = function (another) {
return this.minus(another).absoluteValue;
};
return Vector3D;
}());
class がないので、prototype と function での実装だ。
一方、"ES2019" でコンパイルしてできた JavaScript はこんな感じ:
"use strict";
class Vector3D {
constructor(x = 0, y = 0, z = 0) {
this.x = x;
this.y = y;
this.z = z;
}
get absoluteValue() {
return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
}
clone() {
return new Vector3D(this.x, this.y, this.z);
}
plus(another) {
return new Vector3D(this.x + another.x, this.y + another.y, this.z + another.z);
}
plusEqual(another) {
this.x += another.x;
this.y += another.y;
this.z += another.z;
}
minus(another) {
return new Vector3D(this.x - another.x, this.y - another.y, this.z - another.z);
}
minusEqual(another) {
this.x -= another.x;
this.y -= another.y;
this.z -= another.z;
}
multiply(value) {
return new Vector3D(this.x * value, this.y * value, this.z * value);
}
innerProduct(another) {
return new Vector3D(this.x * another.x, this.y * another.y, this.z * another.z);
}
divideBy(value) {
return new Vector3D(this.x / value, this.y / value, this.z / value);
}
divideByEqual(value) {
this.x /= value;
this.y /= value;
this.z /= value;
}
getDistance(another) {
return this.minus(another).absoluteValue;
}
}
こちらは class があるので TypeScript のコードとあまり変わらない。"ES5" とは、まるで別の言語のように見えるのが面白い。
]]>I wrote a simple library for reading and writing CSV (the Values Comma-Separated or Character-Separated Values).
The csv format file is sometimes necessary because it can be displayed / edited with Excel and is simple. There are other libraries that read and write csv already, but I tried to make it simpler.
With this library, you can read and write plain object collections (IEnumerable<Something>) in csv format.
First, prepare something IEnumerable<TElement>:
An IEnumerable<TElement> something IEnumerable<ToDo> toDoes = new ToDoList();
For example this class:
class ToDoList : IEnumerable<ToDo> // sample collection { public IEnumerator<ToDo> GetEnumerator() { yield return new ToDo { Id = 1, Title = "filing tax returns", Deadline = new DateTime(2018, 12, 1) }; yield return new ToDo { Id = 2, Title = "report of a business trip", Detail = "\"ASAP\"", DaySpan = new DaySpan(3), Priority = Priority.High }; yield return new ToDo { Id = 3, Title = "expense slips", Detail = "book expenses: \"C# 6.0 and the .NET 4.6 Framework\",\"The C# Programming\"", Priority = Priority.Low, Done = true }; yield return new ToDo { Id = 4, Title = " wish list ", Detail = " \t (1) \"milk\"\n \t (2) shampoo\n \t (3) tissue ", Priority = Priority.High }; } IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); }
You can write this as:
const string csvFileName = "todo.csv"; await toDoes.WriteCsvAsync(csvFileName);
The resulting csv file looks like this:
Id,Title,Deadline,Done,Priority,Details,DaySpan 1,filing tax returns,2018/12/01 0:00:00,False,Middle,,0 2,report of a business trip,2017/07/12 13:13:01,False,High,"""ASAP""",3 3,expense slips,2017/07/12 13:13:01,True,Low,"book expenses: ""C# 6.0 and the .NET 4.6 Framework"",""The C# Programming""",0 4, wish list ,2017/07/12 13:13:01,False,High," (1) ""milk"" (2) shampoo (3) tissue ",0
You also can read a csv file like this:
IEnumerable<ToDo> newToDoes = await CsvSerializer.ReadCsvAsync<ToDo>(csvFileName);
Public properties with both "get" and "set" of each element in the collection are read and written to csv files.
When writing, it is converted to a string with the "ToString()" method regardless of the type.
When reading, the string type is left as is, and enum (enumeration type) is read as the value of the string. For other types, it tries to change the string to a value using "TryParse" or "Parse". Types that cannot do either of these will not be read.
Properties that have both "get" and "set" and are of one of the following types are read:
For example, the above ToDo class is like this:
// Sample element type // Properties marked with ✔ will be read / written // Properties marked with ✖ won't be read / written class ToDo { public int Id { get; set; } // ✔ public string Title { get; set; } = ""; // ✔ public DateTime Deadline { get; set; } = DateTime.Now; // ✔ public bool Done { get; set; } // ✔ public Priority Priority { get; set; } = Priority.Middle; // ✔ user-defined enum [ColumnName("Details")] public string Detail { get; set; } = ""; // ✔ [ColumnName ("Details")] changes the column name in the csv file to "Details" public DaySpan DaySpan { get; set; } // ✔ User-defined type with "Parse" (without "TryParse") [CsvIgnore()] public string Option { get; set; } = ""; // ✖ Ignored because [CsvIgnore()] is attached public string Version => "1.0"; // ✖ Ignored because it is only a get property }
The user-defined types used in the above ToDo class are as follows:
// User-defined enum example enum Priority { High, Middle, Low } // Example of a user-defined type with "Parse" (without "TryParse") struct DaySpan { public int Value { get; private set; } public DaySpan(int value) => Value = value; public static DaySpan Parse(string text) => new DaySpan(int.Parse(text)); public override string ToString() => Value.ToString(); }
csv can be read and written even if it has no header part (eg the first line of the csv file above).
However, if there is a header part, it can be read by collating the header part even if the column is switched, but if there is no header part, it cannot be read if the column is switched.
Example of writing without a header:
await toDoes.WriteCsvAsync(csvFilePathName: csvFileName, hasHeader: false);
Csv file created:
1,filing tax returns,2018/12/01 0:00:00,False,Middle,,0 2,report of a business trip,2017/07/06 18:08:13,False,High,"""ASAP""",3 3,expense slips,2017/07/06 18:08:13,True,Low,"book expenses: ""C# 6.0 and the .NET 4.6 Framework"",""The C# Programming""",0 4, wish list ,2017/07/12 13:13:01,False,High," (1) ""milk"" (2) shampoo (3) tissue ",0
To read a csv file without a header:
IEnumerable<ToDo> newToDoes = await CsvSerializer.ReadCsvAsync<ToDo>(csvFilePathName: csvFileName, hasHeader: false);
The character code can be changed (default is UTF8).
CsvSerializer.Encoding = Encoding.GetEncoding(0);
The delimiter can also be changed (default is ',').
CsvSerializer.Separator = '\t';
You can also use stream instead of file name.
using (var stream = new FileStream(csvFileName, FileMode.Create)) await collection.WriteCsvAsync(stream);
You can leave the stream open after reading or writing by specifying leaveOpen.
using (var stream = new FileStream(csvFileName, FileMode.Create)) await collection.WriteCsvAsync(stream: stream, bufferSize: 1024, leaveOpen:true, hasHeader: true);
In addition to asynchronous methods, there are also synchronous methods.
toDoes.WriteCsv(csvFileName);
These libraries are open to NuGet and can be installed from Visual Studio.
Source code is available at:
The projects included are:
先日 .NET Core 3.0 が正式にリリースされ、C# 8.0 が使えるようになった。
一方で、.NET Framework の最新版は 4.8 だ (2019/09/25 現在)。
現時点での、最新版の .NET を使用する方法をまとめてみよう。
下記からインストール。
※ Developer pack と Language pack の両方
Visual Studio Installer で Visual Studio 2019 Ver.16.3 以上にバージョンアップ
最新版の Visual Studio に Blazor テンプレートのインストールが必要
次を参照
プロジェクト ファイル (*.csproj など) に <LangVersion>8.0</LangVersion> を記述
(null 許容参照型も有効にするには <Nullable>enable</Nullable> も記述)
例.
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
<PropertyGroup>
...
<LangVersion>8.0</LangVersion>
<Nullable>enable</Nullable>
...
※ .NET Core 3.0 アプリケーションのデフォルトの C# のバージョンは 8.0
昨日 (2019/09/23)、.NET Core 3.0 正式版がリリースされた。
現在これに関連して、.NET Conf 2019 というオンライン カンファレンスが開催されている。
一部は、YouTube で見ることができる。
Microsoft 製の新たな .NET である .NET Core だが、.NET Core 3.0 では、Windows デスクトップ アプリケーション (Windows Forms と WPF) がサポートされた。
.NET Core 3.0 のためのソフトウェアの開発には、現在 Visual Studio 2019 の最新版である Ver.16.3.0 が必要だ。
Visual Studio Installer からアップデートできる。
但し、現在 .NET Core の Windows Forms のデザイナーには未対応であるようだ。
(なお .NET Core は、最初の .NET である .NET Framework に比べて様々な最適化がなされているため、より高パフォーマンスとなっている)
.NET 5 は、.NET Core 3 の次期バージョンだ。
現在 3つある Microsoft の .NET (.NET Framework, .NET Core, Xamarin) が 1 つに統合される予定。
これ以降、.NET Framework は保守のみとなり、新機能は追加されなくなる。
C++/CLI は .NET Core 3.1 でサポートされる予定だ。
新たな ASP.NET (.NET での Web アプリケーション プラットフォーム) のフレームワークである Blazor だが、サーバーサイドの Blazor は、既に .NET Core 3.0 でサポートされている。
サーバーサイドの Blazor は、C# と Razor 構文でコーディングでき、クライアント サイドとの同期はフレームワークによって行われる (内部的には JavaScript を用いて SignalR で通信) という技術だ。
クライアント サイド Blazor (Blazor WebAssembly) は、WebAssembly で .NET が動作し、C# のアプリケーションがクライアント サイドの Web ブラウザ上で動作するというユニークなものだが、こちらは、現在まだ Preview 版。
2020年5月のリリースが予定されている。
C#8.0 がリリースされた。
null 許容参照型や非同期ストリームなどがサポートされる。
非同期ストリームでは、非同期型の IEnumerable
Microsoft MVP Award を再受賞しました。15年目になります。
いい歳の大人をこうして褒めてくれるマイクロソフトに感謝です。
Microsoft MVP となって、多くの素敵なITエンジニアの皆様との交流の機会が増えました。 皆様いつもありがとうございます。
]]>毎年恒例の BuriKaigi などで4人でやっている C# ライブ コーディングセッションを Microsoft の de:code 2019 でやってきました。
#decode19 のドキドキ・ライブコーディングに来ていただきありがとうございました #MW51
— むろほし (@RyotaMurohoshi) May 30, 2019
準備はドキドキというかビクビクで、本場中も内心ヒヤヒヤだったのですが、楽しんでいただけたようでとても嬉しいです!
大舞台に連れてきてくださった大先輩方、そしてチャックさんありがとうございました。 pic.twitter.com/rib8sRT9r8
いつもお世話になっているマイクロソフトの井上章 (@chack411) さんのお誘いで実現したものです。 おかげさまでとても素敵な体験になりました。 もちろん、毎回楽しい企画をしてくださる石野 (@AILight) さん、一緒に解答者として登壇した鈴木 (@xin9le) さん、室星 (@RyotaMurohoshi) さん、にも感謝です。
今回は、Blazor を使用したプログラミングがお題で、次の2つをやりました:
「七並べ」対決の私の作戦は次の通りです:
99名の皆様が聴きにきてくださり、大変に盛り上がってくださいました。 本当にありがとうございました!
当日の盛り上がりの様子の一部は、以下のリンクで読むことができます。
de:code 2019 の動画や資料などはこちらから。 (ただし、我々のセッションのものはありません)
アンケート結果の NSAT (Net Satisfaction) がとても良かったので、メモ。
NSAT | |
---|---|
講師 | 198 |
コンテンツ | 193 |
全体 | 195 |
]]>参考: NSAT の求め方
- Positive の比率 (パーセンテージ) = P
- 4段階評価、5段階評価の場合: 1番上の評価をした人の比率
- 10段階評価の場合: 1番上と上から2番目の評価の比率の合計
- Negative の比率 (パーセンテージ) = N
- 4段階評価の場合: 下2つの合計
- 5段階評価の場合: 下3つの合計
- 10段階評価の場合: 下4つの合計
- NSAT = P - N + 100 (200点満点、平均100点)
毎年恒例の BuriKaigi などで4人でやっている C# ライブ コーディングセッションを Microsoft の de:code 2019 でやります。
]]>※ [Event] 「Global AI Nights in FUKUI」 (2019年4月2日) を開催しますの続き。
世界の47会場で、Global AI Nights が開催されています。
日本では、下記3会場で開催されました。
福井会場にも AI に関心の深い参加者が集まり、おおいに盛り上がりました。
— 福坂 (@fukusaka291) April 2, 2019
— jun1s (@jun1s) April 2, 2019
Seeing AIのデモ。機械が目の代わりになる。#GlobalAINight #fukui pic.twitter.com/w0E9wdLoL2
— jun1s (@jun1s) April 2, 2019
ディープラーニングの概念おさらい! 続きを聞きたい方、まだ今からでも、産業情報センター7Fへどうぞ! #GlobalAINight #fukui pic.twitter.com/ieF6EzPnlp
— jun1s (@jun1s) April 2, 2019
#GlobalAINight #fukui 「AI流行ってるから」なんて不純な動機では成功しない! pic.twitter.com/llNWg2TTMX
— jun1s (@jun1s) April 2, 2019
#GlobalAINight #fukui Face APIを使って顧客に合わせたターゲティング販売戦略の提案。店の前を歩く人の中でどんな人が来店するのか。レイアウトの変更に対する効果測定、などなど…。こういうのどんどん利用していった方が良いんでしょうね。Microsoftのサイトから利用可能。 pic.twitter.com/bgfHv6CVO6
— jun1s (@jun1s) April 2, 2019
#GlobalAINight #fukui 画像の分析APIの紹介。Microsoftのサイトから利用できるし、もちろんプログラムコードから呼び出せる。 pic.twitter.com/GtD1NbSrr5
— jun1s (@jun1s) April 2, 2019
#GlobalAINight #fukui 画像分析APIを呼び出すコードの紹介とデモ。面白〜い! pic.twitter.com/chO7jLeG9K
— jun1s (@jun1s) April 2, 2019
#GlobalAINight #fukui Custom Vision APIを使うと、簡単に機械学習をさせたモデルを作る事ができる。作成したモデルを自分のプログラム(Microsoft MLやiOS、モバイルなど)で使う事もできる。これは面白そう。犬や猫などの画像を与えて、犬か猫かを判別させるモデルを作成するデモも面白かった! pic.twitter.com/thtYab3ZhF
— jun1s (@jun1s) April 2, 2019
#GlobalAINight #fukui 福井コンピュータの過去のすべての株価変動を機械学習させるデモ。過去二週間の株価変動から、次に上がるか下がるかをAIに予想させ、その結果を繰り返し学習させていく。その結果、「次に株価が上がるかどうか」予想的中率50%のAIが出来上がりましたw 株価予想って難しいw pic.twitter.com/8zuFs1xug0
— jun1s (@jun1s) April 2, 2019
#GlobalAINight #fukui Microsoft Azure Machine Learning Studioのデモ。株価予測をさせてみる。なんとノンプログラミングで機械学習モデルを作成できる。出来上がったモデルは、ウェブ上にAPIとして公開でき、自分のプラグラムから呼び出せるようになる。こりゃ面白い! pic.twitter.com/8iJQWVJQce
— jun1s (@jun1s) April 2, 2019
#GlobalAINight #fukui 終了! めっちゃ面白かったー! 参加して良かった…! 機械学習面白い。ちなみに、参加者にはサブウェイの無料クーポンが配られるらしいのですが、福井はサブウェイありませんと言ったらこのお菓子が配布されることになったそうです。サブウェイがない地域だってあるんです…w pic.twitter.com/80OcPSOmqm
— jun1s (@jun1s) April 2, 2019