xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

Unity で ASP.NET Core SignalR を利用する

前回 に引き続き今回も SignalR ネタです。今回は Unity で ASP.NET Core SignalR を動かしてみようと思います。「そんなことできるんだっけ?」ともしかしたら思われるかもしれませんが、実は以下の理由によりできてしまいます! Unity 2018.1 以降は .NET …

Azure Functions + Azure SignalR Service でメッセージを Push 配信する

リアルタイムな双方向通信フレームワークである SignalR にスケーラブルな接続管理を提供する Azure SignalR Service が GA されて半年ほどが経ちました。これと Azure Functions を利用し、いわゆるサーバーレスアーキテクチャの構成でクライアントにリアル…

CloudStructures v2.1.0 released!!

前回に引き続き今回も CloudStructures ネタです。.NET Standard 対応を行ってから来たフィードバックにお応えしたのと、反省点の修正 (?) を行いました。変更点は大きく 3 点あります。 RedisLock 型の追加 非同期メソッドとして提供しているコマンドに As…

CloudStructures now supports .NET Standard!!

Grani 時代から Redis 操作ライブラリとして長く愛用してきた CloudStructures ですが、残念ながらこれまで .NET Core に対応していませんでした。ただ、こればっかりはさすがの @neuecc 先生もあれもこれもメンテするのは難しいので仕方ない!.NET Core 対…

平成最後なのでソーシャル就活で転職してみた

「平成最後なので」というのは何の意味もない枕詞ですが、今風な感じ (?) を出すためだけに付けてみました。それ以上の理由はありません!タイトルの通り今回ソーシャル就活というのもをやってみたのですが、どんな感じだったかを書いてみようと思います。 …

キャリッジリターン (CR) を無視する ModelBinder を適用する

タイトルの通りです、それ以上の情報がないのですが...!下記のドキュメントを参考に、そういうものを作りました。 動機 iOS の Safari から改行を含む <textarea> のデータを POST すると勝手に CR が付与されるという問題がありました。Form の Submit イベントを Ja</textarea>…

Microsoft Connect(); 2018 Japan で登壇しました & Visual Studio 2019 新機能フォローアップ

Microsoft Connect(); 2018 の日本版 Wrap Up イベントに参加し、ちょまど (@chomado) ちゃん枠のトップバッターとして Visual Studio 2019 (Preview) の新機能について登壇/解説させていただきました。いろいろドタバタしつつもとても楽しかったですw イベ…

AcrInsight - Azure Container Registry のビューワーを公開しました

タイトルの通りですが、Azure Container Registry (= ACR) のリポジトリにあるイメージを閲覧するツールを作成/公開しました。 なんと (?) 4 日前の 2018/12/05 に Microsoft Connect(); 2018 で公開されたばかりの WPF on .NET Core 3.0 でできています!W…

Slack.Integration - Slack 連携ライブラリを公開しました

もはや 2 番煎じ、3 番煎じどころか 10 番煎じくらいのものですが、.NET アプリと Slack を繋ぐライブラリ Slack.Integration を作成し、公開しました!現時点では Incoming Webhook *1 にだけ対応していますが、そのうち Slash Command にも対応させる予定…

ASP.NET Core MVC における Required 属性と BindRequired 属性の統合

MVC

ASP.NET Core MVC に限らず ASP.NET MVC 時代からそうですが、最もよく利用するモデル検証属性として Required 属性があります。Required の名前の通り「入力必須」であることを表すのですが、実際の挙動は非 null の判定を行うものです。 ですので、以下の…

SQL Server Management Studio のテーブルデザイナの列をカスタマイズする

SQL Server Management Studio のテーブルデザイナ、デフォルトでは以下のような画面で表示されます。 DataGrid として表示される項目が非常に少なく、編集するに頻繁に使用する「既定値」や「説明」のプロパティが下部の PropertyGrid になっているのが非常…

gRPC / MagicOnion 入門 (17) - 切断検知と自動再接続

gRPC はサーバーとクライアントが常時コネクションを張っている状態です。このコネクションが切断されたタイミングを検知して後処理や再接続処理をしたい、というのはよくパターンかと思います。実は、生の gRPC で切断検知をするのは実はかなり面倒です。Ma…

gRPC / MagicOnion 入門 (16) - 複数ユーザーへのプッシュ配信

前回は Unary 通信中にサーバープッシュをする方法を解説しました。しかしそれは 1 つのクライアントに対してプッシュ配信する例だったので、今回は複数クライアントに対してプッシュする方法について見ていきます。 勘のいい方にはパッと分かるかもしれませ…

gRPC / MagicOnion 入門 (15) - Unary 通信中にプッシュ配信

gRPC におけるサーバーからの Push 通知は Server Streaming 通信を用いて行う、というのを以前解説しました。 ですが、この方法では Server Streaming 専用の API を呼び出さないと Push 通知が行われません。一般的には、何か単発の API (gRPC だと Unary)…

gRPC / MagicOnion 入門 (14) - 接続ユーザーを特定する

gRPC で通信を行う際、サーバー側でアクセスしてきているユーザーを特定したいケースは多々あります。これを実現する最も基本的で素朴な方法が、gRPC / MagicOnion 入門 (10) - ヘッダーの利用 で解説したヘッダーにユーザー固有の ID を埋め込むことです。 …

ImageMagick でお手軽 TGA → PNG 変換

業務で .tga で納品される大量のファイルを一括して .png に変換したいということがあったので、ImageMagick Converter を使ってチャチャっとやってみた系のメモです。 ImageMagick をダウンロード 下記サイトからダウンロードできます。各々の OS 環境に合…

ASP.NET Core SignalR を試す

これまで ASP.NET Core には SignalR が提供されていませんでしたが、最近ようやく利用できるようになってきたということで実際に動かして試してみました。今回は、空プロジェクトから簡易チャット機能を動作させるところまでを紹介します。 以下に公式ブロ…

4 色オセロ対決 again - 仙台 IT 文化祭 2017

少し遅くなってしまいましたが...!10/28 (土) ~ 10/29 (日) にかけて仙台 IT 文化祭というイベントに参加/登壇してきました。人生初めての仙台、人生初めての東北。新しいところに踏み入れるのは不思議な緊張感があっていいものですね! ドキドキ・ライブ…

gRPC / MagicOnion 入門 (13) - 送受信されているデータを可視化する

gRPC に限った話ではありませんが、ネットワークを介して送受信しているデータをダンプして目視確認したいことは頻繁にあります。このようなとき、たいてい以下のような方法が採られます。 用途 実装 個別 ダンプしたい箇所にデバッグコードを仕込む 全体 全…

gRPC / MagicOnion 入門 (12) - ログを出力する

アプリケーション開発においてログの出力は非常に重要です。どこで、どのようなことが起こったのかを知る手がかりになります。gRPC には標準でログを出力するための機構が備わっているので、今回はそれを使ってログ出力をしてみます。 コンソールにログを出…

gRPC / MagicOnion 入門 (11) - 通信可能なデータ量を変更する

gRPC でデータを送受信するにあたり、どこまでのサイズが許容されるのか。今回はそのあたりの制限と、その緩和について見ていきます。 既定の通信データ量の制限 gRPC のフレームワークは 1 度の通信で送受信できるデータ容量に制限を設けています。既定では…

gRPC / MagicOnion 入門 (10) - ヘッダーの利用

HTTP/2 をベースとする gRPC にもヘッダーがあり、そこに任意のデータを含めて通信することができます。今回はそんなヘッダーをどうやって利用するのか、その方法について解説します。 ヘッダーにデータを詰めて送信する ヘッダーは Key-Value 形式となって…

gRPC / MagicOnion 入門 (9) - 明示的にステータスコードを返す

HTTP/1.1 にステータスコードというレスポンスの意味を表す数値があったように、HTTP/2 をベースとする gRPC にもステータスコードがあります。これまでの解説ではレスポンスとして正常値のみを返していたので、HTTP/1.1 のステータスコードで言うところの 2…

gRPC / MagicOnion 入門 (8) - 独自型を送受信する

ここまで gRPC / MagicOnion を基本的な通信方法について見てきました。しかし、送受信に利用した型はすべて Primitive 型ばかりでした。独自に定義した型で通信したいと思うのは当然!ということで、今回は独自型でサーバー / クライアント間のやり取りをす…

gRPC / MagicOnion 入門 (7) - Duplex Streaming 通信

前回、前々回と Server Streaming 通信と Client Streaming 通信について解説してきました。今回はこれらを合わせた通信方法である Duplex Streaming 通信について見ていきます。 Step.1 - サービス定義 いつも通り、まずサーバー側で提供するサービスのイン…

gRPC / MagicOnion 入門 (6) - Client Streaming 通信

前回は Server Streaming 通信について見ていきました。今回は Client 側から連続的にデータ送信を行う Client Streaming について解説していきます。 Step.1 - サービス定義 今回もまずサーバー側で提供するサービスのインターフェースを定義します。例えば…

gRPC / MagicOnion 入門 (5) - Server Streaming 通信

前回は最も簡単な Unary 通信について解説しました。今回はサーバーからのプッシュ配信を行うための Server Streaming 通信について見ていきます。 Step.1 - サービス定義 まずサーバー側で提供するサービスのインターフェースを定義します。例えば以下のよ…

gRPC / MagicOnion 入門 (4) - Unary 通信

ここから実際に gRPC で API を作成し、クライアント/サーバー間で通信していきます。まず「gRPC / MagicOnion 入門 (2) - 4 種類の通信方式」で紹介した最も簡単な Unary 通信から見て行きます。 Step.1 - サービス定義 最初のステップでは、サーバー側にど…

gRPC / MagicOnion 入門 (3) - プロジェクト構造と実装の前準備

今回は MagicOnion を使った API 開発を行うまでの前準備にフォーカスを当てます。主に Console / WinForms / WPF アプリなど向けです。MagicOnion は Unity にも対応していますが、これはだいぶ大変でややこしいので別途解説することにします。 基本的なプ…

gRPC / MagicOnion 入門 (2) - 4 種類の通信方式

gRPC は HTTP/2 の仕様に則った形で 4 種類の通信方式を提供しています。以下のドキュメントにも解説がありますが、簡単に図解します。 Unary RPCs 最もシンプルな 1 リクエスト / 1 レスポンス型の通信方法です。通常の関数コールのように扱えるため、非常…