rksoftware

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

https配信を有効にしてみました。

昨日からはてなブログで独自ドメインを利用しているブログで https が可能になったことが話題です。 独自ドメインは利用していませんが、せっかくなのでこのタイミングでこのブログも https にしてみました。
ちなみに独自ドメインは pro 専用の機能(有料)です。富豪です。

設定方法は上の記事では画像が小さいですが

設定 > 詳細設定 > https配信

にありました。

今この記事を見ている皆さんには https で見えているはずです。

https にすると PV が増えるという話もありますし 明日以降の PV が楽しみです。

Json は怖くない! Json と仲良くなろう

皆さんは .json という拡張子をご存知でしょうか?
現代の IT ではデータや設定ファイル等とにかくあらゆる場面で利用される非常にメジャーなファイル形式です。
そんな json 形式のデータですが、エンタープライズ分野で活躍しているシステムエンジニアの方などは意外と触れる機会がなかったりするのではないかと思います。
そこで今回、簡単に json 形式でクライアント-サーバー間の通信を行うサンプルを書いてみました。
これを機に是非 json と仲良くなってください。 json は友達! 怖くない!

環境

Windows で ASP.NET MVC Web Api プロジェクトをサーバーに WPF プロジェクトをクライアントにします。言語は C# です。

プロジェクトの作成

ソリューションを一つ新規作成し、

  • ASP.NET MVC Web Api プロジェクト
  • WPF プロジェクト
  • 共有モデル プロジェクト

の 3 プロジェクトを作成してください。プロジェクト構成の完成イメージは次のようになります。

共有モデル

共有モデルのプロジェクトに通信するデータとなるモデルクラスを作成します。
このモデルクラスのオブジェクトをシリアライズし json 形式の string にしたデータでクライアント-サーバー間でデータをやりとりします。

namespace JsonModel
{
    public class JsonModel
    {
        public string Keyword { get; set; }
        public string Message { get; set; }
    }
}

サーバー API

ASP.NET MVC Web Api プロジェクトに Api コントローラーを一つ作成します。
これが json 形式のデータを受け取り加工して返却するサーバー API です。

using System.Web.Http;

namespace JsonServer.Controllers
{
    public class JsonController : ApiController
    {
        public object Post(JsonModel.JsonModel model)
        {
            if (model?.Keyword?.StartsWith("風が語り掛けます") == true)
                return new JsonModel.JsonModel { Keyword=model.Keyword, Message ="うまい うますぎる" };
            return new JsonModel.JsonModel { Keyword = model.Keyword, Message = "は?" };
        }
    }
}

今回は、「風が語り掛けます」というキーワードが送られてきたら「うまい うますぎる」というメッセージを返却する API にしてみました。

クライアント UI

クライアントの UI はプロジェクト新規作成時にテンプレートで生まれる画面を変更して使います。
画面にテキストボックスとボタンを一つづつ置きます。

<Window x:Class="JsonClient.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:JsonClient"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="300">
    <Grid>
        <StackPanel VerticalAlignment="Center">
            <TextBox x:Name="textBox" TextWrapping="Wrap" Text="Keyword"/>
            <Button Content="Button" Width="75" Click="Button_Click"/>
        </StackPanel>
    </Grid>
</Window>

コードビハインドでボタン押下時の処理をします。ここが今回のメインとなる部分です。

using Newtonsoft.Json;
using System.Net.Http;
using System.Text;
using System.Windows;

namespace JsonClient
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            var param = new JsonModel.JsonModel { Keyword = textBox.Text };
            var paramJson = JsonConvert.SerializeObject(param);
            var content = new StringContent(paramJson, Encoding.UTF8, "application/json");
            var client = new HttpClient();
            var response = await client.PostAsync("http://localhost:XXXXX/api/Json/", content);
            var resultJson = await response.Content.ReadAsStringAsync();
            var result = JsonConvert.DeserializeObject<JsonModel.JsonModel>(resultJson);
            MessageBox.Show(result?.Message);
        }
    }
}

※ XXXXX の部分は各自の環境に合わせてください。
※クライアントプロジェクトでは NuGet から Newtonsoft.Json パッケージをインストールしておいてください。

  1. 画面のテキストボックスに入力されたキーワードをモデルに詰めて json 形式にシリアライズしています。
  2. サーバーに 1. の json を送信しています。
  3. サーバーから json を受信しています。
  4. json をデシリアライズしモデルに復元しています。
  5. サーバーから返却されたメッセージを表示しています。

実行結果

風が語り掛けます」というキーワードの場合に「うまい うますぎる」というメッセージが表示されます。

・デバッグして変数の値をチェックすると、送信しているパラメータと受信している結果が確かに json となっています。
f:id:rksoftware:20180608020614j:plain
f:id:rksoftware:20180608020627j:plain

まとめ

json は全く怖くない非常に簡単に扱える有益な形式です。 これを機に是非 json と仲良くなってくださる方が少しでも現れていただければ幸いです。

秋葉原 C# もくもく会 #41 勉強会を開催しました

■ C# もくもく会

C# もくもく会 #41 を開催しました。

C# もくもく会 は東京の秋葉原で毎週木曜日に開催している .NET 系の勉強会です。
もくもく自習を基本とし、分からないことを教えあったり情報共有したりしている会です。 定期開催していますので、お時間のある時に遊びに来ていただければと思います。
ちょっと詰まった時、ネット上で聞くのははずかしいなぁ、という課題のできた時などにも思い出していただけると嬉しいです。

f:id:rksoftware:20180608012123j:plain

入門者の方も多くご参加いただいています。 むしろ入門者の手助けをするのが生きがいの様な主催です。
怖くない勉強会ですので、本当に C# これから、なんならプログラミングこれからという方も是非遊びに来てください。

C# をこれから始めるという方や、はじめたばかりの方、ステップアップを考えている方、C# と様々なかかわり方の方が集まっています。
特に C# で課題をお持ちでなくても是非遊びに来てください。

■ 目指す勉強会スタイル

世界一敷居の低い勉強会を目指しています。
何か聞きたいことがある場合は、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる、そんなスタイルでやっています。

■ 次回予定

次回は 2018/06/14 に開催予定です。

C# に関心のある方、是非遊びに来てください。

XAML Standard は今?

Build 2017 で発表されひっそりと(いくつかの意味で)話題となった XAML Standard。
エンタープライズ分野でのモバイル開発の敷居がほんの少しだけ低くなる可能性もないでもないと期待していないこともなかった XAML Standard。
その XAML Standard の今を見てみました。

XAML Standard とは

最近の MS 系の GUI アプリ開発では UI は XAML と呼ばれる XML 形式の設計図によって作ることが多いです。
しかしその XAML ですが、文法はそのプラットフォームでも同一なのですが WPF や UWP、Silverlight、Xamarin.Forms などプラットフォーム毎に使える要素や属性、それらの名前が異なっていました。
例えば、WPF や UWP には StackPanel という要素がありますが、Xamarin.Forms には StackLayout という要素があります。また、背景色の指定も Background だったり BackgroundColor だったりします。
たかがそれだけと言えばそれだけですが、実際そこで躓いてやめてしまう方がいたのは事実です。

そこで、良く使う基本的な要素は属性は同じ名前で使えるように統一しよう、というのが XAML Standard です。

そんな夢の XAML Standard が今どうなっているのか気になったので、確認してみました。

サイト

XAML Standard は規格は GitHub という設計図共有サイトで公開されています。
実装は です。

更新日

記事などの更新日をチェックしてみましょう。

GitHub

7 months ago

XAML Standard (プレビュー)

2017/11/15

なるほど。

以上、XAML Standard は今を確認してみた話でした。

Windows Mixed Reality アプリ開発入門を読みました

Windows Mixed Reality アプリ開発入門
を読みました。

発行日 2018年6月4日 となっており、瞬間で読んだ感じになっていますが、5日前に入手しているので、それほど早いということもないでしょう。
※それでも積読の順序を飛ばして最優先で読んだわけですが。

概要

Windows Mixed Reality デバイス向けのアプリの作り方です。
acer のテムジンなど、と言えばわかりやすいのではないでしょうか?
https://www.yodobashi.com/product/100000001003709757/

HoloLens よりも、これらの MR HMD 向けのページが多いです。
ただし、アプリの作り方の基本は同じということで、どちらか一方だけということでもないです。

これまで、あまり MR まで見ている余裕がなく横目で見ていましたが、なかなかまとまった情報に触れる機会がなく実は開発環境や何で作るのかもよく把握していませんでした。
得ていた情報が Unity で作る・UWP アプリを作る、Unity 出なくても良い、など断片的で混乱していましたが、この書籍を読んで完璧に理解しました。
大変すばらしい本です。買いましょう。

感想

ちょうどいい。とにかくこれが一番の感想です。
これまでの経験から

  • Windows のデスクトップアプリでそカスタムコントロールなどが必要になるこそこ厄介な UI の要件で鍛えられ
  • Windows Phone アプリや UWP などを多少はやってきた
  • 3D もちょっとは勘が働く
  • けれど 3D アプリは素人
  • Unity によるゲームアプリも素人
  • けれど XNA などでゲームにも多少は勘が働く
  • C# は一通り扱える

といった多少は経験を積んだプログラマにとってちょうどよい解説でとてもスムーズに理解できました。

合わない人

私にとってちょうどよいということは、丁度よくない方も大勢いると思います。

  • プログラミング初心者
  • 3D や行列などが全く分からない
  • C# 全く分からない
  • GUI 全く分からない
  • GUI で操作する IDE 全く分からない
  • ゲームに全く感が働かない

などの場合は、非常に厳しいと思います。
そういった意味で、 Windows Mixed Reality アプリ初心者向けであり、アプリ初心者向けでは全くありません。
そこは注意が必要だと思います。アプリ初心者の方は、Unity 入門の書籍を先に読まれることをお勧めします。
http://www.sbcr.jp/products/4797386790.html

また、Unity 入門書は C# 入門書ではないため、C# の段階で非常に苦労したり挫折したりする方も多いようです。
そういった場合は焦らず、C# の入門書から始めたほうが結果的に早い思います。

まとめ

他の書籍ばかり貼ってしまいましたが、要約すると

  • プログラミング入門者向けではない
  • 別の形式のアプリ開発の経験者は効率よく学習できる

本です。
しかし今、効率よくわかりすぎて読んだだけで分かった気になっています。危ない。
慢心せずちゃんとコードを動かして確認し、Windows Mixed Reality アプリ完璧にマスターしたいです。
また、プログラミング入門者の方も、ひとまずこの本を読めるようになることを目標に基礎から学ぶのもお勧めです。 まずは買いましょう。

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

15.7.2 から間もないですが、Visual Studio の 15.7.2 がリリースされました。
今回も盛りだくさんです。いい感じですね。

相変わらず日本語ページは遅いので、最新のリリースは英語版を参照するのがおすすめです。

■ 更新内容

先も書きましたが今回は更新内容は多めです。
(同件の問題が多かったため原文より項目数が大きく減っています)

  • Qt フレームワークを使用した際に壊れたデバッグビルドを生成する問題
  • C++。行列乗算のコード生成が正しない問題
  • コードレンズで Git の履歴が過去 6か月分しか参照されない問題
  • UWP で複数の NetStandar2.0 dll を参照する問題
  • /std:c++17 でビルドした場合にバイナリ互換性が疎kなわれる問題
  • XAML ファイルを開こうとすると、VSが固まるまたは非常に開くのが遅い問題
  • CMake の設定が失敗する問題
  • 二つのプロジェクトを同時にデバッグするために順にプロジェクトを実行すると、2つ目のデバッグプロセスを開始すると一つ目のプロセスが終了する問題
  • ユニットテストで vector::push_back() でアクセス違反のエラーが発生する問題
  • .NET 3.5 プロジェクトで特定の設定の場合にビルドエラーとなる問題
  • F# エディタの動作が非常に遅い問題
  • クラスメンバ変数の値が誤って zero として読み取られる事がある問題
  • Xamarin.Android プロジェクトで The target "GetBuiltProjectOutputRecursive" does not exist in the project エラーが発生することがある問題
  • /std:C++14 でビルドできるが /std:C++17 では C1001 internal error となることがある問題
  • UWP をデバッグ中に CoreApplication.Exit(); が結果を返すのが非常に遅い問題
  • Xamarin UI テストのプロジェクトテンプレートがない問題
  • Xamarin.Forms プロジェクトの新規作成後に Visual Studio がクラッシュする問題 (条件・原因は分かりません)

が解消されました。
また

  • Git の脆弱性に対するアップデート

も含まれています。最優先でのアップデートが必要ですね。

■ 更新方法

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

More Effective C# 6.0/7.0 を読みました

More Effective C# 6.0/7.0 を読みました。

今確認してみると 2018/02/20 発売ということで、大分間をあけての読破ですが。

■ 副題について・概要

API設計、非同期プログラミング、動的プログラミング、
並列処理をクールに使い倒す50の方法

です。
主に4種類のテーマに分けて、計50のプラクティスを学べます。

API設計

クラスのインターフェイス設計に関する話題でした。例えば

  • なるべくインターフェイスを作ったほうが良い
  • setter と持つ参照型をプロパティで公開すると、外部から値の変更が可能になるから注意
  • なるべくプロパティは値型にしたほうが良い

の様な、一人でいちプロジェクトでプログラミングしていると中々見落としてしまう基礎を学べます。

非同期プログラミング

ズバリ async/await ですね。
何となく書くだけで、いい感じに動いてくれる async/await をきちんと教えてくれます。

  • デッドロックの危険性・なぜ起こるのか
  • いつ非同期を使うべきか
  • 非同期中の例外の扱い方

等、知らなくても何となく動いてしまい綱渡りでコーディングしていた私にも深く刺さる内容でした。

動的プログラミング

dynamic とかそのあたりの話題です。
dynamic が活きる場所・動的が良い場所、静的がいい場所など。
私は型がないと生きていけないプログラマなので、何としても dynamic を避けて生きてきましたが、本書のおかげで可能性が広がりました。

並列処理

バックグラウンドワーカーや同期ロックについてです。
同期ロックについては業務プログラマだとあまり触れる機会がなく、きちんと把握していない方もいると思います。本書おススメです。
また、バックグラウンドのスレッド処理に知らない専用の機能が多く知ることができとても勉強になりました。

総評

本書で扱う話題は、きちんと把握できていなくても何となく実装できて動いてしまうことが多いです。
その点で学習の優先順位が下がってしまう部分だというところが正直なところあると思います。
書籍の購入は学習のきっかけとして非常に優れたソリューションだと思います。とりあえず買いましょう。
そして読みましょう。一歩進んだプログラマに慣れること間違いなしです。