restofwaterimpのぎじゅつMemo

SIerに所属してます。企画から運用までやってます。現状、プロジェクトをスクラムで回したい!と試行錯誤中です

DevRelのトップランナーが語る「DevRelってなに?」【758Dev】に行ってきました

2/17(月)にNAGOYA INNOVATOR'S GARAGE で行われました、

DevRelのトップランナーが語る「DevRelってなに?」【758Dev】

を聞いてきました。

connpass.com

DevRelって言葉は聞くのですが、エヴァンジェリストやアドボケイトと何が違うの? というのが自分の中で引っかかっていたので、実際に活動をされている

Microsoft Evangelist 小田祥平 さん

IBM Developer Advocate 萩野たいじ さん

名城大学 准教授, IBM Champion for 2020 鈴木秀和 さん

のお三方の講演&ディスカッションでした。

直感で私が「そうなんだ」と感じたことは

「双方向」 「熱量」 「まず行動」

です。

DevRel Meetup in Tokyoについて – DevRel Meetup in Tokyo

DevRelとは? DevRelは外部の開発者との相互コミュニケーションを通じて、自社や自社製品と開発者との継続的かつ良好な関係性を築くためのマーケティング手法のことです。

でも、エヴァンジェリストとかアドボケイト がイコールDevRelかといわれるとそうでないようです。

前者は「職務や役割」で後者は「アクティビティ」に当たります。

つまり、だれでも「DevRel」の活動ができるってことです。

「外部の開発者との相互コミュニケーション」 「自社や自社製品と開発者との継続的かつ良好な関係性を築く」

をベースに活動となると 例えば、自分が作ったアプリや、言語、自社サービスについてブログやTwitterでつぶやく(NDAに抵触しないように) 外部のコミュニティーへ出向く、発表する 自分の事業部の外という意味では社内のLT大会の発表や活性化活動で語り合うこともDevRelととらえてもよさそうです。

セミナーの中で興味深かったこと (私の私見も入っているので、発表者の意図とは違うかも・・)

・DevRelやろうよ

 自分の会社の中だけしか知らないと、自分のレベルがよくわからななくなる。  世界の中から見て、会社または人はどういつ立ち位置なのか。会社、あなたの強みって何か言えますか?

 そのために、会社の外のコミュニティへオフサイトで出かけてみる。  オンラインで学ぶこともできるが、オフサイトでリアルに登壇している人の熱量や参加者のモチベの高さに刺激を受けるのも大事。  それによって、自分のレベルを上げること!が重要。

・DevRelに求められる要素

 技術力も必要になるが、マーケティングを知ることが必要。  自分の強みを生かす、価値を創造するという目的のため、自分をブランディングする必要がある。  となると、市場の外部分析して、自分もしくは会社の内部分析して、どこで戦うか決めて、  プロモーションして、どうやって外部の開発者と良好な関係を作るか戦略、戦術を練らなければならない。

 もう一つは「コンサル力」  といっても、フレームワークを覚えたり戦略コンサルというわけではなく、「引き出す力」が必要  双方向コミュニケーションを良好にするため、かつ自社のサービスを利用してもらうためには相手の困りごとと  自分のサービスがマッチする必要がある。困りごとを把握するため、対象から情報を「引き出す」能力が必要とのこと

・疎外要素

  • 否定

  • Fixed MindSetにならないこと(MSではGrowth MindSetを推奨)

https://neuroleadership.com/your-brain-at-work/microsoft-growth-mindset-transformation に記事ありました。

 コンフォートゾーンにいるほうが楽なので、現状を変えたくない。  変えようとすると反発する人や否定する方もいる

 それに屈しない「熱量」が変化しよとする人には求められるかと。

 で、覆すには「巻き込む」か「結果」を先に出してしまうかというのが発表者の意見でした。

 DevRelに限らず、よくある話と。組織における業務改革や構造改革もこれ当てはまりますよね。

・大学生への取り組み

 コンピュータを「使う側」から「作る側」への視点の切り替えが必要というのが妙に納得。  大学でCSを学んでも直接、事業、会社で扱える能力がつくか、というのに対する対応として  ITエンジニア育成プロジェクトを行っている。

www-ie.meijo-u.ac.jp

 名古屋エリアでこういう取り組みしている大学あること知らなかったので、人材育成としてもいい取り組みだと感じた。  CSを学ばずにSI企業へ入る人も多いので、SIも現場だけでは世の流れに追い付いけるわけないので、若い世代を  他流試合にたくさん出すことをしたほうが・・・(って、やる気とか熱意がないと始まらないけど)

と、DevRelって話を聞きに行ったのですが、総論では自身のキャリアプランを考え直そう。 その一つとして、「外部のコミュニティに足を運び、刺激を受けよう!」というのが 一番だったかと。

発表の中でも「お客さん」として参加ではなく、「自ら何かを出す」と、 発表する側、企画側、ブログ、TwitterなどのSNSで自らを発信する力ってのが求められていくのでしょうね。

企画をしていただいた、

IBM見習い隊 さん Microsoft Learnもくもく会 さん

ありがとうございました。

garage-nagoya.or.jp

最後に、会場となった名古屋イノベーションズガレージ、めちゃきれいでよかった

明示的なインターフェイス

今読んでいる本で、「明示的なインターフェイス」という表現が出てきたが、馴染みがないので少し調べてみた。

C#実践開発手法 (マイクロソフト公式解説書)
Gary McLean Hall
日経BP
売り上げランキング: 373,052

明示的なインターフェイスの実装 - C# プログラミング ガイド | Microsoft Docs を参考に実施てみた。

 //一般的なインターフェイスの設定
    class Program
    {
        static void Main(string[] args)
        {
            SampleClass sc = new SampleClass();
            IControl ctrl = sc;
            ISurface srfc = sc;

            sc.Paint();
            ctrl.Paint();
            srfc.Paint();
            Console.ReadKey();

        }
    }

    interface IControl
    {
        void Paint();
    }

    interface ISurface
    {
        void Paint();
    }

    class SampleClass : IControl, ISurface
    {
        public void Paint()
        {
            Console.WriteLine("Paint method in SampleClass");
        }
    }

結果は想定通り、3回同じ出力がされた。 Paint method in SampleClass Paint method in SampleClass Paint method in SampleClass

明示的なインターフェースが役に立つのは、インターフェイスで実装しなければならないメソッドのシグネチャがクラスですでに存在していて、シグネチャの競合を回避したい場合。

 //明示的なインタフェースの設定
    class Program
    {
        static void Main(string[] args)
        {
            SampleClass sc = new SampleClass();
            IControl ctrl = sc;
            ISurface srfc = sc;

            sc.Paint();
            ctrl.Paint();
            srfc.Paint();
            Console.ReadKey();

        }
    }

    interface IControl
    {
        void Paint();
    }

    interface ISurface
    {
        void Paint();
    }

    class SampleClass : IControl, ISurface
    {
        public void Paint()
        {
            Console.WriteLine("Paint method in SampleClass");
        }

        void IControl.Paint() //インターフェイスを指定してメソッドを定義
        {
            Console.WriteLine("IContral.Paint");
        }

        void ISurface.Paint() //インターフェイスを指定してメソッドを定義
        {
            Console.WriteLine("ISurface.Paint");
        }
    }

結果は Paint method in SampleClass IContral.Paint ISurface.Paint と、クラスに定義したPaint()は暗黙的なメソッドを。インターフェイスを指定したメソッドはそれぞれ別のメソッドを呼び出している。

また、インターフェイスを継承したクラス内に、明示的な実装だけをしているなかで、インターフェイスではなく、クラスを参照型として 利用するとコンパイルエラーが発生する

 //明示的なインタフェースの設定
    class Program
    {
        static void Main(string[] args)
        {
            SampleClass sc = new SampleClass();
            IControl ctrl = sc;
            ISurface srfc = sc;

            Test test = new Test(sc, ctrl);

            //sc.Paint();
            ctrl.Paint();
            srfc.Paint();
            Console.ReadKey();

        }
    }

    interface IControl
    {
        void Paint();
    }

    interface ISurface
    {
        void Paint();
    }

    class SampleClass : IControl, ISurface
    {
        //public void Paint()
        //{
        //    Console.WriteLine("Paint method in SampleClass");
        //}

        void IControl.Paint() //インターフェイスを指定してメソッドを定義
        {
            Console.WriteLine("IContral.Paint");
        }

        void ISurface.Paint() //インターフェイスを指定してメソッドを定義
        {
            Console.WriteLine("ISurface.Paint");
        }
    }

    class Test
    {
        public Test(SampleClass sampleclass, IControl control)
        {
            sampleclass.Paint(); // これがエラー

            control.Paint();
        }
    }

エラー CS1061 'SampleClass' に 'Paint' の定義が含まれておらず、型 'SampleClass' の最初の引数を受け付けるアクセス可能な拡張メソッド 'Paint' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないかを確認してください。 ClearInterface C:\Users\user\source\repos\ClearInterface\ClearInterface\Program.cs 60 アクティブ

インターフェイスを継承するが、同じシグネチャのメソッドで処理の中身を変更したい場合に利用できるようである。(競合の回避)

オーバーライドしているわけではなく、インターフェイスで別々に定義していて、実装するクラスで意味合いをそれぞれ変えたい場合に 使えるのだろう。

使いどころがいまいちわからないが、実装クラスからどのインターフェイスを利用しているのかを明示的に使い分けたいときに利用するのだろう。

3章のデザインパターンに読書は続く・・

【C#】C#プログラミングのイディオム(12章)シリアル化、逆シリアル化(おまけ)

仕事で使いそうになったので、自身含めて、利用したことのないメンバーの為に整理する。

シリアル化、逆シリアル化の何を取るにしても、以下のSTEPで定義をすれば良さそう。

  1. シリアライズ、逆シリアライズの為の入出力ファイルの指定(外部ファイル)
  2. シリアライズ、逆シリアライズのデータ定義の指定(オブジェクト)
  3. 処理の実行

と思われる。

例えば、オブジェクトをシリアライズする場合

using(var writer = XMLWriter.Create("hoge.xml")){   // 1.シリアライズした出力先の設定
     var serializer = new XMLSerializer(hoge.GetType());   //  2.シリアライズする元データの設定(ここではhogeクラスに定義したデータ)
     serializer.Serialize(writer, hoge);                            //  3.シリアライズの実行
}

JSONデータを逆シリアライズし、オブジェクトに設定する場合

using(var stream = new FileStream("hoge.json", FileMode.Open, FileAccess.Read)){    // 1.逆シリアライズする元データの設定
      var serializer = new DataContractJsonSerializer(typeof(hoge[]));                //  2.逆シリアライズするオブジェクトの指定
      var hoge = serializer.ReadObject(stream) as hoge;                            // 3.逆シリアライズの実行
}

で行けそうかなと。

また、テキストでは、練習問題以外、JSONデータの並びと、 オブジェクトのプロパティ設定の定義順が同じだったので、XMLと同じように 型定義の順番が左右するかと思っていた。

しかし、練習問題を実施すると、そうではなさそう。ということで、ググってみると

stackoverrun.com

JSONには並び順の保証は内容で。 文字ならば、辞書のように、a,b,c・・・で昇順になっていそうです。 並び順を固定するには、連想配列などにして、実施するのがよさげかな?

【C#】C#プログラミングのイディオム(12章)シリアル化、逆シリアル化(後半 JSON)

前回の続き 今回はJSON(JavaScript Object Notation)です。

データ転送時に利用される軽量なデータ記述言語の一つ。

JavaScript Object Notation - Wikipedia

JSONでデータを転記する場合は DataConstractJsonSerializerを利用します。

シリアル化のガイドライン

に記載がある通り、XMLへのシリアル化ではない場合はDataConstractを利用することになります。

自身が、JSONを利用したことがない(仕事で関わったことが残念ながらない・・・)ので 活用法やら、注意点やらがわからず。

これから調べるとします・・・。

ということで、つづく (次は14章の非同期へ。13章のEntity FrameWorkはとばす・・)

【C#】C#プログラミングのイディオム(12章)シリアル化、逆シリアル化(前半 XML)

前回の続き

restofwaterimp.hatenablog.com

11章でXMLファイルの操作ということで、XDocumentやXElementを利用した 操作が中心であった。

この章ではファイルの操作ではなく、ファイルのやりとりが中心の説明となっている。

シリアル化、逆シリアル化って?

f:id:restofwaterimp:20181011063653p:plain

シリアル化はオブジェクトの状態をネットワークを通じて転送できる形式やファイルに保存できる形式。 シリアル化したデータを元のオブジェクトに戻すことを逆シリアル化という。

この変換には System.Runtime.Serialization名前空間のDataContractSerializerを利用する。

docs.microsoft.com

オブジェクトを起点に、 WriteObjectがシリアル化、ReadObjectが逆シリアル化で、シリアルという特別な言葉ではなく、読み書きというメソッド名なので、 ファイルの読み書きと同じ感覚で利用できるのでは?と想定される。

書籍の例を元に記述(XMLファイル)

    class MainClass
    {
        public static void Main(string[] args)
        {
            var novel = new Novel
            {
                Author = "Jemus du Horgan",
                Title = "Continue to planet",
                Published = 1997,
            };

            var novels = new Novel[]{
                new Novel{
                    Author = "Jemus du Horgan",
                Title = "Continue to planet",
                Published = 1997,
                },
                new Novel{
                    Author = "H/G wells",
                Title = "Time machine",
                Published = 1895,
                }
            };

            var settings = new XmlWriterSettings
            {
                Encoding = new System.Text.UTF8Encoding(false),
                Indent = true,
                IndentChars = " ",
            };

            /*シリアル化*/
            using(var writer = XmlWriter.Create("novel.xml", settings)){
                var serializer = new DataContractSerializer(novels.GetType());
                serializer.WriteObject(writer, novels);
            }

            /*逆シリアル*/
            using(XmlReader reader = XmlReader.Create("novel.xml")){
                var serializer = new DataContractSerializer(typeof(Novel[]));
                var readnovels = serializer.ReadObject(reader) as Novel[];
                foreach(var readnovel in readnovels){
                    Console.WriteLine(readnovel);
                }
            }
        }


    }

    public class Novel{
        public string Title { get; set; }
        public string Author { get; set; }
        public int Published { get; set; }
        public override string ToString(){
            return string.Format("[Title={0}, Author={1}, Published=m{2}]", Title, Author, Published);
        }
    }
}

XMLWriterSettingでファイルの形式を決めないと、デフォルトのまま出力されます。 (改行なしのXMLファイルができます)

DataContractSerializerの代わりにXmlSerializerを利用することもできます。 本書ではXMLでデータを受け渡しをするにはこちらの方が良いと記述されております。

           using (var writer2 = XmlWriter.Create("novel.xml")){
                var serializer2 = new XmlSerializer(novel.GetType());
                serializer2.Serialize(writer2, book); //シリアル化するオブジェクト、書き込むための元データ
            }

/*シリアル化するもとのオブジェクト*/
    public class Novel{
        public string Title { get; set; }
        public string Author { get; set; }
        [XmlIgnore] //Ignoreをつけると、シリアル化対象外となる
        public int Published { get; set; }
        public override string ToString(){
            return string.Format("[Title={0}, Author={1}, Published=m{2}]", Title, Author, Published);
        }
    }

出力するとこんな感じに <?xml version="1.0" encoding="utf-8"?>Continue PlanetJames P Hogan

妖精名は宣言した時のプロパティ名になります。 もし、変更したい場合は [XmlElement(ElementName="xxxx")] を変更したいプロパティに記述するとできます。

XmlSerializer.Serialize Method (System.Xml.Serialization) | Microsoft Docs

DataContractSerializer
Serializes and deserializes an instance of a type into an XML stream or document using a supplied data contract. This class cannot be inherited.

XmlSerializer クラスの使用 | Microsoft Docs

それぞれのクラスの比較は下記のサイトに記載があったので、ご確認あれ。

DataContractSerializerを使って、オブジェクトのXMLシリアル化、逆シリアル化を行う - .NET Tips (VB.NET,C#...)

なんで、同じような機能があるのだろうと疑問に思い、検索してみたところ

シリアル化のガイドライン

と、MSからガイドラインがでていることを見つけた。

XMLSerializerを利用すると、Elementの詳細まで定義できるので、細かな設定が必要ならば、こちらの方が使いやすい。

とりとめないですが、つづく(JSONへ)

【C#】C#プログラミングのイディオム(11章)XMLの操作

前回のつづき

restofwaterimp.hatenablog.com

XMLJSONでデータ連係をすることもあるので、 その流れかなと。11章はXMLで12章はJSON

プレーンテキストからXMLJSONに変換し、他システムへ連係することがあるため イディオムに載っているのだろうと思われる章。

章の初めにはLINQ to XMLの話・・・と書いてありますが。 LINQ to Objectが理解できていれば、構文はほぼ同じなので、 そこまで苦労しないと思います。

XDocument のクエリと XElement のクエリ (C#) | Microsoft Docs

ファイルをloadするとき、XDocumentを利用するか、XElementを利用するかによって、 ルートを含んで全ての要素を取得するか否かが異なります。 そこには注意。

 var xdoc = XDocument.Load(@"/Users/xxxxx/Downloads/CSharpPhraseBook/Chapter11/Section02/novelists.xml");
            var xelements = xdoc.Root.Elements().OrderBy(x => (string)(x.Element("name").Attribute("kana")));
            foreach (var xnovelist in xelements)
            {
                XElement xname = xnovelist.Element("name");
                var birth = (DateTime)xnovelist.Element("birth");
                Console.WriteLine("{0} {1}", xname.Value, birth.ToShortDateString());

            }
            foreach (var xnovellist in xdoc.Root.Elements())
            {
                var name = xnovellist.Element("name");
                var works = xnovellist.Element("masterpieces")
                                      .Elements("title")
                                      .Select(x => x.Value);
                Console.WriteLine("{0} - {1}", name.Value, string.Join(",", works));


            }
            var filename = @"/Users/xxxx/Downloads/CSharpPhraseBookAnswer/Chap11/Exercise2/Sample.xml";

            var xdoc = XDocument.Load(filename);
/*xmlファイルを読み込みつつ、出力用のデータを作成。word要素に、属性kanji,yomiを設定したものをXElement属性で取得*/
            var lists = xdoc.Root.Elements().Select(x =>
                new XElement("word",
                            new XAttribute("kanji", x.Element("kanji").Value),
                            new XAttribute("yomi", x.Element("yomi").Value))
                                                   );

            var root = new XElement("difficaltkanji", lists);

            Console.WriteLine(root);
            root.Save(@"/Users/xxxx/Downloads/CSharpPhraseBookAnswer/Chap11/Exercise2/attribute.xml");

今回は内容が少ないですが、これで終了。 文字列操作なので、実際に文章を作成し、加工するトレーニングが良いのではと思い、実践します。

つづく

【C#】C#プログラミングのイディオム(10章)正規表現

前回の続き

restofwaterimp.hatenablog.com

10章は正規表現

Findメソッドでゴリゴリ書いてもいいけど、Regexを利用すれば簡単だし、わかりやすいよという章。

Macでコーディングだとエスケープシーケンスが ¥ではなく\なので、注意です。(バックスラッシュ)

指定した文字列が含まれているか

        /*静的メソッド*/
            var text = "private List<string> results = new List<string>();";
            bool isMatch = Regex.IsMatch(text, @"List<\w+>");
            if (isMatch)
            {
                Console.WriteLine("Find");
            }
                else{
                Console.WriteLine("Not Found");

                }

        /*インスタンスメソッド*/
            var regex = new Regex(@"List<\w+>");
            bool isMatch2 = regex.IsMatch(text);
            if (isMatch2)
            {
                Console.WriteLine("Find");
            }
            else
            {
                Console.WriteLine("Not Found");

            }

また、リテラルを逐語的リテラル@をつけた方がよいです。 つけないとエスケープシーケンスが¥¥¥とかになって、 「あれ?何書いていたんだっけ?」になりかねないので。

正規表現で利用できる文字自体は色々なサイトに公開されているので、そこをご参考あれ。

正規表現の構文

 どこと一致する?

前方一致 ^ 後方一致 $ 完全一致 ^ と $
を利用することで、一致条件を変更可能である。

c#自体では、Regex やReplace、Splitのメソッドなどを学ぶというのもありますが、 正規表現の読み方自体を覚えた方がいいという章でした。

つづく