rksoftware

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

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

■ C# もくもく会

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

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

■ 今週の成果発表

今週は成果を出された方の多い会でした。

  • ドローンをポチりました
  • ドローンをポチらせました
  • サンプルコードをダウンロードしました
  • ブログを更新しました
  • Rider インストールして Console 出力しました

ちなみに本会ですが、実は公序良俗に反しなければどのような技術を扱っても大丈夫です。そもそも C# エンジニアが C# だけしか使わないというわけではありませんし。

■初心者歓迎

このもくもく会には、入門者の方も多くご参加いただいています。 突然 C# やらなければならなくなって途方に暮れている方、何となく C# をやってきたけど改めて見直してみたい方なども大歓迎です。
入門セミナー代わりでのご参加も歓迎です。プログラミング入門者の方も是非遊びに来てください。

特に C# で課題をお持ちでなくても是非遊びに来てください。

■ 目指す勉強会スタイル

世界一敷居の低い勉強会を目指しています。

何か聞きたいことがある場合は、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる

何か共有したい情報を見つけた場合も、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる

そんなスタイルでやっています。

■ 次回予定

次回は 2018/10/25 に開催予定です。

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

Visual Studio でソリューションを開くと「ソース管理にバインドされています」が表示される

人から貰ったソリューションを Visual Studio で開くと次の様なメッセージが表示されることがあります。

ーーーーーーーーーーー
Microsoft Visual Studio
ーーーーーーーーーーー
Team Foundation Server Version Control

開こうとしているソリューションは、次の Team Foundation Server 上のソース管理にバインドされています: https://XXXXXXXXXX.visualstudio.com/。このサーバーに接続し、ソース管理の統合を有効にしますか?
ーーーーーーーーーーー
はい(Y) いいえ(N) ヘルプ
ーーーーーーーーーーー

これは TFS や VSTS(Azure DevOps) でソース管理しているソースを貰った時に起こります。sln ファイルの中に書かれているので、消さずに渡してしまうことも多いですよね。

■ sln ファイルを編集する

設定は sln の中の

GlobalSection(TeamFoundationVersionControl) = preSolution
    XXXX
    XXXX
EndGlobalSection

にあるようです。このセクションを消してしまえば前述のメッセージは表示されなくなります。快適。

城東.NET #25 勉強会を開催しました。

■ 城東.NET

城東.NET #25 を開催しました。

城東.NET は東京の最近は秋葉原で毎月第3水曜日に開催している .NET 系の勉強会です。
発表を中心として、発表でなくとも最近やった事や新しい情報などを参加者で共有している会です。

今月は、5名の方にご参加いただきました。

■ 今月の話題

  • AzureDevOps(VSTS)でオンプレのソースコードをビルドしてみた
  • AzureDevOps と VSTS の UI 等を切り替える話
  • UWP XAML Islands、.NET Core 3 でのデスクトップアプリ

私は UWP XAML Islands、.NET Core 3 でのデスクトップアプリについて デスクトップアプリ祭神事情 というタイトルで話をしました。


※スライドは、.NET Conf の時のものです。 近年 WPF はクラシック、UWP こそがアプリという風潮ですが、まだまだ WPF は現役です。デスクトップも頑張っていきましょう!

■ 次回予定

来月は 11月21日(水)に開催の予定です。

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

.NET アプリからプリザンターの API を呼んでみる

.NET からプリザンターの API を呼んでみるコードを C# で書いてみました。

.NET Standard のクラスライブラリになっているので、ビルドして参照してください。今のところ Item の取得だけできます。次のように使えます。

var apiClient = new PApiHelper.PApiClient
{
    ApiKey = あなたのApiKey,
    BaseUrl = "http://localhost:80/"
};

var requestData = new PApiHelper.PGetApiRequest();
requestData.View.ColumnFilterHash.Add(検索条件カラム, 検索条件値);

var responseData = await apiClient.PostAsync<PApiHelper.PApiItem>(テーブルのID, requestData);

■ コードの転記

まだ雑にとりあえず作っただけでコード量も少ないので転記しておきます。GitHub へのアクセスが制限されていてる現場もあるという噂も最近聞きましたし。

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

namespace PApiHelper
{
    public class PApiClient
    {
        static string _ContentType { get; } = "application/x-www-form-urlencoded";
        static Encoding _Encoding { get; } = Encoding.UTF8;
        public HttpClient HttpClient { get; set; }
        public string ApiKey { get; set; }
        public string BaseUrl { get; set; }
        public string ApiName { get; set; } = "Api_Items";
        public string ApiMethod { get; set; } = "get";

        public async Task<PApiResponse<T>> PostAsync<T>(string apiKey, string baseUrl, string apiName, long id, string apiMethod, PGetApiRequest requestData)
        {
            if (string.IsNullOrEmpty(requestData.ApiKey)) requestData.ApiKey = apiKey;
            var json = JsonConvert.SerializeObject(requestData);
            var content = new StringContent(json, _Encoding, _ContentType);

            var http = HttpClient;
            if (http == null)
            {
                http = new HttpClient();
                HttpClient = http;
            }
            var response = await http.PostAsync($"{baseUrl}/{apiName}/{id}/{apiMethod}", content);
            var responseContentString = await response?.Content?.ReadAsStringAsync();
            var responseContent = JsonConvert.DeserializeObject<PApiResponse<T>>(responseContentString);
            return responseContent;
        }

        public async Task<PApiResponse<T>> PostAsync<T>(string apiName, long id, string apiMethod, PGetApiRequest requestData)
            => await PostAsync<T>(ApiKey, BaseUrl, apiName, id, apiMethod, requestData);

        public async Task<PApiResponse<T>> PostAsync<T>(long id, PGetApiRequest requestData)
            => await PostAsync<T>(ApiName, id, ApiMethod, requestData);
    }

    public class PGetApiRequest
    {
        public string ApiKey { get; set; }
        public long Offset { get; set; }
        public PGetApiRequestData View { get; } = new PGetApiRequestData();
    }

    public class PGetApiRequestData
    {
        public Dictionary<string, string> ColumnFilterHash { get; } = new Dictionary<string, string>();
    }

    public class PApiResponse<T>
    {
        public decimal? Id { get; set; }
        public decimal? StatusCode { get; set; }
        public string Message { get; set; }
        public PApiResponseData<T> Response { get; set; }
    }

    public class PApiResponseData<T>
    {
        public decimal? Offset { get; set; }
        public decimal? PageSize { get; set; }
        public decimal? TotalCount { get; set; }
        public T[] Data { get; set; }
    }

    public class PApiItem
    {
        public long? SiteId { get; set; }
        public DateTime? UpdatedTime { get; set; }
        public long? ResultId { get; set; }
        public long? IssueId { get; set; }
        public long? Ver { get; set; }
        public string Title { get; set; }
        public string Body { get; set; }
        public long? Status { get; set; }
        public long? Manager { get; set; }
        public long? Owner { get; set; }
        public string ClassA { get; set; }
        public string ClassB { get; set; }
        public string ClassC { get; set; }
        public string ClassD { get; set; }
        public string ClassE { get; set; }
        public string ClassF { get; set; }
        public string ClassG { get; set; }
        public string ClassH { get; set; }
        public string ClassI { get; set; }
        public string ClassJ { get; set; }
        public string ClassK { get; set; }
        public string ClassL { get; set; }
        public string ClassM { get; set; }
        public string ClassN { get; set; }
        public string ClassO { get; set; }
        public string ClassP { get; set; }
        public string ClassQ { get; set; }
        public string ClassR { get; set; }
        public string ClassS { get; set; }
        public string ClassT { get; set; }
        public string ClassU { get; set; }
        public string ClassV { get; set; }
        public string ClassW { get; set; }
        public string ClassX { get; set; }
        public string ClassY { get; set; }
        public string ClassZ { get; set; }
        public decimal? NumA { get; set; }
        public decimal? NumB { get; set; }
        public decimal? NumC { get; set; }
        public decimal? NumD { get; set; }
        public decimal? NumE { get; set; }
        public decimal? NumF { get; set; }
        public decimal? NumG { get; set; }
        public decimal? NumH { get; set; }
        public decimal? NumI { get; set; }
        public decimal? NumJ { get; set; }
        public decimal? NumK { get; set; }
        public decimal? NumL { get; set; }
        public decimal? NumM { get; set; }
        public decimal? NumN { get; set; }
        public decimal? NumO { get; set; }
        public decimal? NumP { get; set; }
        public decimal? NumQ { get; set; }
        public decimal? NumR { get; set; }
        public decimal? NumS { get; set; }
        public decimal? NumT { get; set; }
        public decimal? NumU { get; set; }
        public decimal? NumV { get; set; }
        public decimal? NumW { get; set; }
        public decimal? NumX { get; set; }
        public decimal? NumY { get; set; }
        public decimal? NumZ { get; set; }
        public DateTimeOffset? DateA { get; set; }
        public DateTimeOffset? DateB { get; set; }
        public DateTimeOffset? DateC { get; set; }
        public DateTimeOffset? DateD { get; set; }
        public DateTimeOffset? DateE { get; set; }
        public DateTimeOffset? DateF { get; set; }
        public DateTimeOffset? DateG { get; set; }
        public DateTimeOffset? DateH { get; set; }
        public DateTimeOffset? DateI { get; set; }
        public DateTimeOffset? DateJ { get; set; }
        public DateTimeOffset? DateK { get; set; }
        public DateTimeOffset? DateL { get; set; }
        public DateTimeOffset? DateM { get; set; }
        public DateTimeOffset? DateN { get; set; }
        public DateTimeOffset? DateO { get; set; }
        public DateTimeOffset? DateP { get; set; }
        public DateTimeOffset? DateQ { get; set; }
        public DateTimeOffset? DateR { get; set; }
        public DateTimeOffset? DateS { get; set; }
        public DateTimeOffset? DateT { get; set; }
        public DateTimeOffset? DateU { get; set; }
        public DateTimeOffset? DateV { get; set; }
        public DateTimeOffset? DateW { get; set; }
        public DateTimeOffset? DateX { get; set; }
        public DateTimeOffset? DateY { get; set; }
        public DateTimeOffset? DateZ { get; set; }
        public string DescriptionA { get; set; }
        public string DescriptionB { get; set; }
        public string DescriptionC { get; set; }
        public string DescriptionD { get; set; }
        public string DescriptionE { get; set; }
        public string DescriptionF { get; set; }
        public string DescriptionG { get; set; }
        public string DescriptionH { get; set; }
        public string DescriptionI { get; set; }
        public string DescriptionJ { get; set; }
        public string DescriptionK { get; set; }
        public string DescriptionL { get; set; }
        public string DescriptionM { get; set; }
        public string DescriptionN { get; set; }
        public string DescriptionO { get; set; }
        public string DescriptionP { get; set; }
        public string DescriptionQ { get; set; }
        public string DescriptionR { get; set; }
        public string DescriptionS { get; set; }
        public string DescriptionT { get; set; }
        public string DescriptionU { get; set; }
        public string DescriptionV { get; set; }
        public string DescriptionW { get; set; }
        public string DescriptionX { get; set; }
        public string DescriptionY { get; set; }
        public string DescriptionZ { get; set; }
        public bool? CheckA { get; set; }
        public bool? CheckB { get; set; }
        public bool? CheckC { get; set; }
        public bool? CheckD { get; set; }
        public bool? CheckE { get; set; }
        public bool? CheckF { get; set; }
        public bool? CheckG { get; set; }
        public bool? CheckH { get; set; }
        public bool? CheckI { get; set; }
        public bool? CheckJ { get; set; }
        public bool? CheckK { get; set; }
        public bool? CheckL { get; set; }
        public bool? CheckM { get; set; }
        public bool? CheckN { get; set; }
        public bool? CheckO { get; set; }
        public bool? CheckP { get; set; }
        public bool? CheckQ { get; set; }
        public bool? CheckR { get; set; }
        public bool? CheckS { get; set; }
        public bool? CheckT { get; set; }
        public bool? CheckU { get; set; }
        public bool? CheckV { get; set; }
        public bool? CheckW { get; set; }
        public bool? CheckX { get; set; }
        public bool? CheckY { get; set; }
        public bool? CheckZ { get; set; }
        public string AttachmentsA { get; set; }
        public string AttachmentsB { get; set; }
        public string AttachmentsC { get; set; }
        public string AttachmentsD { get; set; }
        public string AttachmentsE { get; set; }
        public string AttachmentsF { get; set; }
        public string AttachmentsG { get; set; }
        public string AttachmentsH { get; set; }
        public string AttachmentsI { get; set; }
        public string AttachmentsJ { get; set; }
        public string AttachmentsK { get; set; }
        public string AttachmentsL { get; set; }
        public string AttachmentsM { get; set; }
        public string AttachmentsN { get; set; }
        public string AttachmentsO { get; set; }
        public string AttachmentsP { get; set; }
        public string AttachmentsQ { get; set; }
        public string AttachmentsR { get; set; }
        public string AttachmentsS { get; set; }
        public string AttachmentsT { get; set; }
        public string AttachmentsU { get; set; }
        public string AttachmentsV { get; set; }
        public string AttachmentsW { get; set; }
        public string AttachmentsX { get; set; }
        public string AttachmentsY { get; set; }
        public string AttachmentsZ { get; set; }
        public string Comments { get; set; }
        public decimal? Creator { get; set; }
        public decimal? Updator { get; set; }
        public DateTime? CreatedTime { get; set; }
        public string ItemTitle { get; set; }
    }
}

.NET Conf 2018 Tokyo, Japan で話をさせていただいてきました。

先日開催の .NET Conf 2018 Tokyo, Japan の Unconference で話をさせていただいてきました。

Unconference は当日適当にしゃべるところらしいですが、視覚情報なしで話せるスキルがないのでスライドに頼ってしまいました。

  • XAML Islands / UWPXamlHost
  • .NET Coew 3.0
  • Xamarin.Forms.WPF

についての話です。
発表の動機について、.NET Core 3.0 での WinForms が動かなかったので誰か教えて! というものがあったのですが、返ってきた反応は WinForms には関心がないという反応でした。WinForms への関心の低まりを感じます。
良いことだと思います。

■ 教えていただいたこと

XAML Islands / UWPXamlHost が Insider Preview の Windows でしか動作しない件について、先日配信され停止された Windows Update が適用されていれば動いたのではないかという予想をお話したところ、Windows Update を当てることができていた方から情報をいただきました。Update できていれば動くそうです。話をさせてもらってよかった。

.NET 系のこういった会は少ないので今後もいろいろ教えていただくために積極的に参加させていただこうと思います。

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

■ C# もくもく会

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

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

■ 今週の成果発表

今週は、Unity によるゲーム制作、Alexa skill、Visual Studio のアップデートの確認、開発環境構築などの話がありました。

ちなみに本会ですが、実は公序良俗に反しなければどのような技術を扱っても大丈夫です。そもそも C# エンジニアが C# だけしか使わないというわけではありませんし。

■初心者歓迎

このもくもく会には、入門者の方も多くご参加いただいています。 突然 C# やらなければならなくなって途方に暮れている方、何となく C# をやってきたけど改めて見直してみたい方なども大歓迎です。
入門セミナー代わりでのご参加も歓迎です。プログラミング入門者の方も是非遊びに来てください。

特に C# で課題をお持ちでなくても是非遊びに来てください。

■ 目指す勉強会スタイル

世界一敷居の低い勉強会を目指しています。

何か聞きたいことがある場合は、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる

何か共有したい情報を見つけた場合も、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる

そんなスタイルでやっています。

■ 次回予定

次回は 2018/10/18 に開催予定です。

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

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

Visual Studio のアップデート 15.8.7 がリリースされました。
今回はすでに日本語が公開されています。非常にシンプルな文なので、分かりやすいですね。

更新内容

更新内容の引用です。

Azure DevOps
Visual Studio Team Services は Azure DevOps になりました! この新しいブランドは、チーム エクスプローラーと Visual Studio での参照として表示されます。

非常にシンプルな更新でコメントすることがないですね。これからは Azure DevOps の時代です。使っていきましょう!

■ 更新方法

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