くうと徒然なるままに

ゆるふわ を志向している なごやかです。

Microsoft Forms について LT してきました。

Microsoft Forms とは、アンケートを取るためのツールです。 それを、「勉強会で運用した」と話してきました。

1drv.ms

moq で 非同期メソッドの返り値を設定する

やりかた

メソッドの返り値を設定するときに Returns の代わりに ReturnsAsync を使う。

コード

[TestFixture]
public class TestClass
{
    [Test]
    public async Task TestMethod()
    {
        var hogeMoq = new Mock<Ihoge>();
        hogeMoq.Setup(obj => obj.getHtml()).ReturnsAsync("Hello World");

        var Actual = await hogeMoq.Object.getHtml();

        Assert.AreEqual("Hello World", Actual);
    }
}

public interface Ihoge
{
    Task<string> getHtml();
}

public class hoge:Ihoge
{
    public async Task<string> getHtml()
    {
        using (var client = new HttpClient())
        {
            var result =await client.GetAsync("www.yahoo.co.jp");
            return await result.Content.ReadAsStringAsync();
        }
    }
}

https://lh3.googleusercontent.com/-0MTFJFZAl0s/WXMW-9eOJ4I/AAAAAAAALJo/T7MfQkatA7gVJRYwOSdl2WRoLs7JJCPCgCHMYCw/s0/devenv_2017-07-22_18-12-25.png

Nuget で .NET Standard 1.0 に対応した ツイキャス用のライブラリの V0.2.0 を公開しました。

タイトルの通り。

以前作ってた ツイキャス用のライブラリをとりあえず、 Nuget.org で公開してみました。

www.nuget.org

ツイキャスのAPIV2を利用するときに必要になる認証を手助けする機能ぐらいしかまだ実装されていません。 (まだプレビューらしいのて正式公開されたらAPIを叩く機能を入れるかもね)

kuxumarin.hatenablog.com

ソースコードはこちら 

github.com

情報源

  • VS100 - 032 NuGet パッケージ の作成と配布 on Youtube

www.youtube.com

動画で説明してくれてわかりやすかったです。 あと、若いチャックさんを見れてうへへ( ˘ω˘ ) ただ、ここで作成しているパッケージは ウェブなパッケージを作成しています。ので、そのままでは作成できませんでした。

  • GUI でパッケージを作成できるツール. 手書きで書きかきするのと比べ、 Typo しなくなるので便利

github.com

Nuget パッケージの作り方

Nuget Package Explorer を起動

https://lh3.googleusercontent.com/-XR4sEcaL_Ww/WWgWKQeTFdI/AAAAAAAALAg/oVIH_IrpGy8r5knXPHtvsTYySZs7Amt7ACHMYCw/s0/NuGetPackageExplorer_2017-07-14_09-53-58.png

パッケージの情報を入力

https://lh3.googleusercontent.com/-xA07kiKabOI/WWgWYHZWpII/AAAAAAAALAo/nXfdbMp64Ac21IKtVFvw067RKM_d7fxFgCHMYCw/s0/NuGetPackageExplorer_2017-07-14_09-54-55.png

パッケージの依存関係を設定

https://lh3.googleusercontent.com/-na3xe3mhx5E/WWgWhW40LBI/AAAAAAAALAs/wjEQTCVVc4MIQXxKvpAHvJLcTlSaIurgQCHMYCw/s0/NuGetPackageExplorer_2017-07-14_09-55-31.png

.NET Standard 1.0 の依存を設定

https://lh3.googleusercontent.com/-emXWUXFNhAM/WWgWuFHL5qI/AAAAAAAALAw/a1LVq8EDw8I9075n5mRlukcN0aM7PXG3wCHMYCw/s0/NuGetPackageExplorer_2017-07-14_09-56-23.png

ライブラリの選択

ここで、注意なのが、プレリリースなパッケージに依存しようとすると怒られます。

https://lh3.googleusercontent.com/-B54nqrfxL-o/WWgW439i7WI/AAAAAAAALA0/fsLPelEtnDcH6vk6e0oythPzkjzuQcxYgCHMYCw/s0/NuGetPackageExplorer_2017-07-14_09-57-05.png

パッケージの中身を登録

https://lh3.googleusercontent.com/-u-qta7BTWS4/WWgXDpR0yZI/AAAAAAAALA4/aRVJ-IfHzYYtx8lPSepds0anwO0BDRy5QCHMYCw/s0/NuGetPackageExplorer_2017-07-14_09-57-48.png

アセンブリ等を登録

https://lh3.googleusercontent.com/-fsHYQAdcC74/WWgXPhWg7FI/AAAAAAAALA8/goxvkHw55QwzVUddzrkA78ch41gcDpw6wCHMYCw/s0/NuGetPackageExplorer_2017-07-14_09-58-37.png

テキストボックスには、 ファイルの名前を入力します。ここで、かなり手間取りました。たぶん、ほとんどここで時間を使われた……..

ライブラリは、 lib の配下に置きます。

[https://lh3.googleusercontent.com/-KfcN00rj7hQ/WWgX1uJyALI/AAAAAAAALBA/OC18_5-35goSLzHBhz9-aiXSv8vn2jxQCHMYCw/s0/NuGetPackageExplorer_2017-07-14_10-01-09.png:image=https://lh3.googleusercontent.com/-KfcN00rj7hQ/WWgX1uJyALI/AAAAAAAALBA/OC18_5-35goSLzHBhz9-aiXSv8vn2jxQCHMYCw/s0/NuGetPackageExplorer_2017-07-14_10-01-09.png]

nuget.org でAPIkeyを取得

nuget.org にログインし、 マイページを表示します。

https://lh3.googleusercontent.com/-oKlwjrVnPxI/WWgYJGPj54I/AAAAAAAALBE/mo31h7K8bpY6MY_DKe_EKu7oVgWGmdpewCHMYCw/s0/chrome_2017-07-14_10-02-25.png

https://lh3.googleusercontent.com/–4RdEC4D2mg/WWgYbQqKvCI/AAAAAAAALBI/GDuXVWRv7qIofc9plHfShRtKXO4fNEwKQCHMYCw/s0/chrome_2017-07-14_10-03-39.png

Nuget Package Explorer からパッケージをパブリッシュ

https://lh3.googleusercontent.com/-66uGgUauxMo/WWgYfugoRPI/AAAAAAAALBM/CoCFpxfzPbQmTcykslRWVPwEMmxejhrEACHMYCw/s0/NuGetPackageExplorer_2017-07-14_10-03-57.png

先ほど入手したAPIkeyを入力し、パブリッシュと押すと公開が完了

https://lh3.googleusercontent.com/-ZLN1b0v8EmQ/WWgYq_OOqgI/AAAAAAAALBQ/5iEAuXM6RUYsCfdQdvFmnwaTpZuultkjwCHMYCw/s0/NuGetPackageExplorer_2017-07-14_10-04-41.png

公開されたパッケージ

https://lh3.googleusercontent.com/-mnM0BQx6ETc/WWgY4YbWEKI/AAAAAAAALBU/t0amyjkR0IYBlxO6ZpKdg4bfhtNlaQB-wCHMYCw/s0/chrome_2017-07-14_10-05-35.png

https://lh3.googleusercontent.com/-Zst01P_K2gQ/WWgY6uh0reI/AAAAAAAALBY/pv2opaFW9OsDAaDjPbfmTapVgLSlE7zewCHMYCw/s0/chrome_2017-07-14_10-05-44.png

www.nuget.org

C#で{}で囲まれた文字列を 正規表現で取得する

C# 固有の何かがあるわけではないですが、タイトルに C# とつけてみました。

最近作ってウェブサイトで {} に囲まれた文字列を抜き出す処理が必要だったのでコードを書きました。しかし、 ググっても、あまり似た情報がないのでブログに書いてみました。

前提知識

C# で、 正規表現を使うためには、 Regex クラスを使います。

サンプルコード

using System;
using System.Text.RegularExpressions;

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            var Text = "The quick brown {fox} jumps over the lazy {dog}";
            var Matches = new Regex(@"\{(.+?)\}").Matches(Text);
            for (int i = 0; i < Matches.Count; i++)
            {
                var AnimalName = Matches[i].Value;
                Console.WriteLine($"{i}:{AnimalName}");
            }
        }
    }
}

実行結果

https://lh3.googleusercontent.com/-PfVJL5MKjqM/WWS49uoEegI/AAAAAAAAK3Y/5FLOHdiSTMgEbHXLCm43uEOdqoqKxSGrgCHMYCw/s0/cmd_2017-07-11_20-39-33.png

正規表現の解説

正規表現的な部分はここかな

{(.+?)}

\{ \} でエスケープ処理

正規表現では、 {} は意味を持つ字句です。 具体的には、 *m{n} などと書くことにより mがn回繰り返すなどの意味があります。 そこで、 \ をつけることでエスケープしています。

変革の軌跡-世界で戦える会社に変わるアジャイル・DevOps導入の原則 MeetUp に参加してきました。

タイトルの通り

株式会社 オンザロード できょんさん主催で開催された アジャイルスクラム系の勉強会に参加してきました。

イベントページ

nagoya-scrum.connpass.com

なごやで アジャイル開発とかをがっつり学べる勉強会はここしかないので、毎度楽しませていただいてます。

毎回、本を題材に勉強会が進んでいくのですが、今回は、「変革の軌跡【世界で戦える会社に変わる"アジャイル・DevOps"導入の原則】」でした。 HP の組み込みソフトを作ってるところの人?が書いたらしいです。 本を持ってなくても参加できるそうなので、持っていないですが、参加してきましたw

全体的な構成は、

バリューストーリーマッピング

仕事の中から無駄に時間をかけている部分を洗い出そうね。という目的で実行するものです。

今回のワークショップで実行したバリューストリームマッピングは、以下のような流れでした。

流れ

  1. 普段の開発でやっていること(概要設計、受発注、開発、単体テスト、受入テスト、リリースなど)を付箋へ書き出す
  2. ホワイトボードの、開発の最初期にすることは左へ、開発の後半期にすることは右側へ付箋をはりつけました。
  3. まとめられた各工程の中から段階にかけている時間のわりに実作業時間の少ないところへ書き出しました。

注意点

バリューストリームマッピングは、 生産現場を効率化するために生まれたものなので、一見すると効率が悪い部分もあるかもしれないが、一概に不必要な部分と言い切れないかも。

質問タイムで得られた知見

バリューストリームマッピングを自社でも実行するには?

まずは、周りの人を巻き込む、例えば直属の上司など。 で、二人でもいいからバリューストリームマッピングを実行して、成果をだして直属の上司をやる気にさせる。 そしたら、社長も巻き込んで実行していく。

アジャイルのワークショップの見つけ方

Slideshere で見つける。 ググるアジャイルという単語は無くて、 ビジネスとかの単語でもいいかも 英語でググる

当日使われた資料的なの

docs.com

感想

今回も様々な知見を得ることが出来た。 バリューストリームマッピングまで、大げさにやらなくても、普段の生活の無駄な時間・作業を洗い出すことに役立てれそうだった。

「ConnpassReportGenerator」V2.0 Beta をリリースしました。階層化したタグで 要素を指定できるようにしました。

Connpass Report Generator とは

Connpass のイベントページから報告書などを半自動生成したい!みたいなのをかなえるツールです。

新機能

階層化したタグを指定するようになった

使い方

{URL.MeetupURL}

実行結果

https://lh3.googleusercontent.com/-FJkllbKWkn8/WWXIpH6CAZI/AAAAAAAAK4Q/T7a1PZ0MZ1kIfwK5Ev3AnHMgG-e613UzACHMYCw/s0/2017-07-12_15-58-43.png

実装方法

小規模な修正で済むかと思っていたが、想定以上に工数がかかってしまった。

やったこと

用意するデータの整理などの細かな作業もしました。しかし、一番大きいのは以下の部分かなと思っています。

テンプレートエンジンの改造

今までは、データ保持しているクラスと同じ名前のタグが存在しないかなー?って検索してました。今後データの種類を増やすことを視野にいれ、それでは、不必要な部分が多そうだったので、 タグの名前(パス)からデータを保持しているクラスからプロパティ、クラスを引き当てるように仕様変更しました。

public class ArticleTemplateEngine : IArticleTemplateEngine
    {
        public string ReplaceArticleData<T>(string templateText, T data)
        {
            if (string.IsNullOrWhiteSpace(templateText) || data == null) return "";
            var Tags = TagStringCollection(templateText);

            foreach (var tag in Tags)
            {
                var PropertyValue = GetPropertyFromIdentify(tag, data);
                if (PropertyValue == null) continue;
                templateText = templateText.Replace($"{tag}", PropertyValue);
            };
            return templateText;
        }

        private string GetPropertyFromIdentify<T>(string TagName, T data)
        {
            var dataType = (object)data;

            var PathList = IdentifyList(TagName);
            var ValuePropertyName = PathList.Last();
            PathList.RemoveAt(PathList.Count - 1);

            foreach (var path in PathList)
            {
                dataType = dataType.GetType().GetProperty(path)?.GetValue(data);
            }

            return dataType.GetType().GetProperty(ValuePropertyName)?.GetValue(dataType) as string;
        }

        private List<string> TagStringCollection(string templateText)
        {
            var collection = new Regex(@"\{(.+?)\}").Matches(templateText);
            var Tags = new List<string>();
            for (int i = 0; i < collection.Count; i++)
            {
                Tags.Add(collection[i].Value);
            }
            return Tags;
        }

        private List<string> IdentifyList(string TagName) => TagName.Split('.').Select(s => s.Replace(".", "").Replace("{", "").Replace("}", "")).Where(s => !string.IsNullOrWhiteSpace(s)).ToList();
        
    }

今後導入したい機能

  • タグの入力補完
  • タグ一覧のドキュメントの自動生成

JXUGのリンク集へMS戸倉さんのXamarin,Azureハンズオンを追加しました。

日本Microsoft の戸倉さん のGithub リポジトリにある Xamarin, Azure ハンズオンがすごすぎるのでみんなに見てもらいたい!ということで、 JXUG.org のウェブサイトに追加しました。

JXUG のウェブサイトでは、 Xamarin に関するURLをまとめたサイトがあります。その中に、Xamarin のハンズオンをまとめた部分もあります。

JXUG : 関連ページ一覧

また、JXUG (Japan Xamarin User Group) のウェブサイトである JXUG,orgGithub にウェブサイトのソースコードを置いて管理しています。

ということで、 JXUG の Github リポジトリに PR を出してみました。

github.com

すると

さすが、田淵さん!!!

ということで

是非見てください!

JXUG : 関連ページ一覧

https://lh3.googleusercontent.com/-AXdplZet_Rk/WWSIOqMXIpI/AAAAAAAAK3I/jq2oT_2SoXEPlPxgYRuz7N0IKLX9qs5twCHMYCw/s0/chrome_2017-07-11_17-11-36.png