くうと徒然なるままに

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

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

SQL Database で 基本的な参照・追加・削除 する SQL を書いてみた

最近, SQL SQL Database を弄る機会があったのでまとめてみます。

書いた理由の1つ

環境

SQL Database を SQL でいじる

SQL Database へ クエリを投げるには、SQL Server Management Studio を使いました。

小ネタ

SSMS で検索するとサジェストされるのが面白かったです。

https://lh3.googleusercontent.com/-lxr3PZSmR-Y/WWNgBjFxWwI/AAAAAAAAK0I/XnTDNANi8v02YWaFJzE_1I_HkLUSbZYPQCHMYCw/s0/Ssms_2017-07-10_20-07-46.png

使った DB, Table

DB

https://lh3.googleusercontent.com/-OFzsiTf-gVE/WWNeg_pwGAI/AAAAAAAAKz4/Socc2Asnvd0xQQrLu4VpatyJyyPdm8PogCHMYCw/s0/chrome_2017-07-10_20-01-21.png

Tables

https://lh3.googleusercontent.com/-4DxeGxTIn0U/WWNfy9wHYGI/AAAAAAAAK0E/J_SNa3FqM_Y2m-UW3PS6aNYrRbY02tMggCHMYCw/s0/Ssms_2017-07-10_20-06-48.png

参照

特定のテーブルのすべてのカラム・データを表示する

SELECT * FROM {TableName}

SELECT * FROM [SalesLT].[Address]

実行結果

SalesLT.Address テーブルの中身が全部表示されてますね。

https://lh3.googleusercontent.com/-iZBihxFhaOk/WWNgu3d1BCI/AAAAAAAAK0Q/KhFEiWmObJo5fOvCNSOHPyueHznD_ro1QCHMYCw/s0/Ssms_2017-07-10_20-10-49.png

特定のテーブルの特定のカラムを表示する

SELECT [{カラム名}],[{カラム名}],[{カラム名}] FROM {TableName}

SELECT [AddressID],[City],[StateProvince] FROM [SalesLT].[Address]

実行結果

SalesLT.Address テーブルの AddressID, City,SatateProvince のカラムを表示しています。

https://lh3.googleusercontent.com/-WZx1fY8lLmY/WWNhP0AiQ7I/AAAAAAAAK0Y/iDMkYqOsITcWgoAbV0gmFaR67NJXFPY-ACHMYCw/s0/Ssms_2017-07-10_20-13-02.png

特定のテーブルの特定のカラムを特定件数表示する(今回は上部10件)

SELECT TOP 10 [{カラム名}],[{カラム名}],[{カラム名}] 
FROM {TableName}

SELECT TOP 10 [AddressID],[City],[StateProvince] 
FROM [SalesLT].[Address] 

実行結果

https://lh3.googleusercontent.com/-WIwW0MHcxVA/WWNi5A3e8MI/AAAAAAAAK0k/MnJ_0Njcu7MGmzxu_NU39NyLUwp8K7DFgCHMYCw/s0/Ssms_2017-07-10_20-20-03.png

追加

データを追加する先のテーブルとして、 KEYAKI_Member_Infomatin を追加しました。

https://lh3.googleusercontent.com/-sP-gccDgea8/WWNplFgBvJI/AAAAAAAAK04/wX29gFNirfgelE_RIdrB8IuSN6CXs9bvACHMYCw/s0/Ssms_2017-07-10_20-48-36.png

データを追加する

INSERT INTO {TableNAME}
VALUES({1行目の値},{2行目の値},{3行目の値})

ポイントしては、マルチバイト文字をデータとして代入するために、 データ型を NVARCHAR({N}) 、 実際に入れるデータをしていするときに **N**'' としているところです。

INSERT INTO KEYAKI_Member_Infomation
VALUES (N'長濱ねる', N'ひらがなけやき', N'長濱 ねる(ながはま ねる、1998年9月4日 - )は、けやき坂46および欅坂46のメンバー。長崎県出身。')

実行結果

https://lh3.googleusercontent.com/-kMoSJ27ozyc/WWNqpWFvHyI/AAAAAAAAK08/slcTGRkleeYTdRG7v6rUUYnINsIj6bX_wCHMYCw/s0/Ssms_2017-07-10_20-53-08.png

カラムを指定してデータを入れる

INSERT INTO {TableName}({カラム名},{カラム名},{カラム名})
VALUES (N'{入れる値}',N'{入れる値}',N'{入れる値}')

INSERT INTO KEYAKI_Member_Infomation(MemberName, Team,Comment)
VALUES (N'長濱ねる', N'ひらがなけやき', N'長濱 ねる(ながはま ねる、1998年9月4日 - )は、けやき坂46および欅坂46のメンバー。長崎県出身。')

実行結果

https://lh3.googleusercontent.com/-Qj7CSHpO7cc/WWNxXlViB8I/AAAAAAAAK1M/z7WdgdVioWgRRzceIB9Fu2Op_sN8d5sqgCHMYCw/s0/Ssms_2017-07-10_21-21-49.png

削除

先ほど使用したテーブルにいくつか加えたものに操作を加えていきます。

https://lh3.googleusercontent.com/-AfVqplQlvLg/WWNye0GMj9I/AAAAAAAAK1Y/4Hm8E1-J64Ak2pM_DtvPFNGNIbocCBqbACHMYCw/s0/Ssms_2017-07-10_21-26-34.png

INSERT INTO KEYAKI_Member_Infomation(MemberName, Team,Comment)
VALUES 
(N'長濱ねる', N'ひらがなけやき', N'長濱 ねる(ながはま ねる、1998年9月4日 - )は、けやき坂46および欅坂46のメンバー。長崎県出身。')
,(N'菅井 ゆうか', N'漢字欅', N'菅井 友香(すがい ゆうか、1995年11月29日 - )は、欅坂46のキャプテン。東京都出身。')
,(N'鈴本 美愉', N'漢字欅', N'鈴本 美愉(すずもと みゆ、1997年12月5日 - )は、欅坂46のメンバー。愛知県出身。')
,(N'齊藤 京子', N'ひらがなけやき', N'齊藤 京子(さいとう きょうこ、1997年9月5日 - )は、けやき坂46のメンバー。東京都出身。')
,(N'井口 眞緒', N'ひらがなけやき', N'井口 眞緒(いぐち まお、1995年11月10日 - )は、けやき坂46のメンバー。新潟県出身。')

テーブルのすべての値を削除

DELETE FROM {Table Name}

DELETE FROM KEYAKI_Member_Infomation

テーブルの特定の値を指定して削除

DELETE FROM {Table Name} WHERE {カラム名} = '{指定したい値}'

Team が ひらがなけやき なメンバーの情報を削除しています。

DELETE FROM KEYAKI_Member_Infomation WHERE Team = N'ひらがなけやき'

実行結果

Before

https://lh3.googleusercontent.com/-iVMJW_2luSQ/WWN1HOPCtpI/AAAAAAAAK1s/mZuKM6eq1QQ6I3Gn4vKFGg-YjHAIqm2FgCHMYCw/s0/Ssms_2017-07-10_21-37-47.png

After

https://lh3.googleusercontent.com/-VJcqqjN8qXI/WWN1OwT64EI/AAAAAAAAK1w/zzG_A0KF3lknVhbNsZ5MIjJsDZUzgOiXACHMYCw/s0/Ssms_2017-07-10_21-38-18.png

まとめ

SQL はまだまだ奥が深いそうなので、機会があったら触れていきたいです。

Amazon の欲しいものリスト

www.amazon.co.jp

いろいろ勉強していきたいので、ご支援お願いします。

飲食系アルバイトを退職し、クラスチェンジしました。

タイトルの通り

退職エントリーを書いてみたかったので書いた。(アルバイトを退職というのかは微妙)

一応、Twitterでアンケートをとってみた

これまでやってきたこと

なぜアルバイトを始めたのか

社会経験と遊ぶお金欲しさです。
よくある理由ですね(笑)
飲食系にしたのは、S氏に「飲食系を経験しておくといいよ」とお勧めされたからです。

あと、まかないを食べたかった(笑)

現在のお店を選んだ理由

家から近いため選びました。
徒歩2分だから移動が楽(笑) 移動時間で無駄に時間を浪費するのは嫌だ。
あと、過去にその店を利用したことがなかったので、やめた後に行くことにならないだろうと思って。

やってみてどうだったのか

よかったこと

アルバイト初経験の人でもやってくれた 系列の店にヘルプに行きたいと言ったら入れてくれた。ビュッフェ形式のお店や和風なお店を体験できた。
パフェやソフトクリームなどのデザート系をアルバイトに作らせてたので作れたこと
飲食店を利用はするが、提供者側を体験できた。クレーマーの人とかいるのかな?とか思ってましたが、一回も来ませんでした。テレビみたいなの見たかった感(こわいものみたさ)

ダメだったこと

将来飲食店で働きたいわけではなかったので、ここに時間を費やすことは果たして自分にとって正しいのか思ってしまうこと。
バイトの労働時間の管理がルーズなところが嫌でした。分は切り捨てられました。
最初入った時と比べてアルバイトの人数が急減していったこと(残った人への負荷が強まる)
アルバイトの入れ替わりが激しい

何故退職(転職)することになったのか

だらだら続けたくなかった

実はやめたアルバイトとは別ですでに新しいバイトを始めてました。
用事や新しいところバイトの時間を増やしたりで古いところは最近あまり入れれてなかったです。
最近はほとんど行ってなかったのにだらだら続けてました。

やりたいことが見つかった

自分のやりたいことが見定まってきたのでそれに対し時間を費やしたいと考えていました。

十分経験はできた

合計で6か月程度続けてました。新参から古参?まで経験できたのであとは同じことの繰り返しだな感
まぁ、6か月続ければすぐやめる人と就活等で判断されることもないかなと(笑)

今後やりたいこと(やっていく予定のこと)

プログラミング

好きなだけできる!というわけではありませんが、今まで時間が足りなさそうであきらめていたサムシングに挑戦できる!

現在は、以下のことに取り組みたいなと考えています

  • ツイキャス .NET ライブラリ
  • Lisp の処理系を .NET 環境で作る
  • Xamarin + Cognitive Services のハンズオンを公開できるところまで校正する。

まぁ、これ以外にもやりたいことはたくさんあるわけですが、、、

新しいバイト先

新しいバイト先での労働時間を増やしていきたいです。
自分のやりたいこと・やりたい勤務形態。

まとめ

飲食系での経験を将来に役立てつつ、自分の進みたい道へ突き進みたいです。

TwicasDotNet 0.2 をリリースしました。認証タイプにより発行するURLを変更する機能とAPIを呼び出す基本URLを取得する機能の追加

こんにちは、くぅです。

TwicasDotNet の Version 0.2 をリリースしました。

What’s new

認証タイプにより発行するURLを変更する

ツイキャスAPIを使うときは、 認証タイプにより 認証に使うURLが違います。今回は、それに対応しました。

違いは以下のような感じです。

いかのような挙動をするようにしました。

[Fact]
public static void サーバータイプのAuthURLを取得するテスト()
{
    var client = new AuthClient();
    Assert.Equal(client.GetAuthURL("Hello", DeviceType.Server), $"https://apiv2.twitcasting.tv/oauth2/authorize?client_id=Hello&response_type=code");
}

[Fact]
public static void サーバーレスタイプのAuthURLを取得するテスト()
{
    var client = new AuthClient();
    Assert.Equal(client.GetAuthURL("Hello", DeviceType.ServerLess), $"https://apiv2.twitcasting.tv/oauth2/authorize?client_id=Hello&response_type=token");
}

APIを呼び出す基本URLを取得する機能

API を呼び出すための基底となるURLを取得するために実装しました。

以下のような挙動をします。

[Fact]
public void APIを呼ぶためのURLが取得できるか()
{
    Assert.Equal("https://apiv2.twitcasting.tv", URLHolder.APICallBaseURL);
}