魔王のサタンぶろぐ

参照されていないアセンブリに定義されています。ワオ

はじめに

CS0012   型 'SecurityToken' は、参照されていないアセンブリに定義されています。アセンブリ 'System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' に参照を追加する必要があります。

というエラーの対処法について。

背景

Microsoft Azure Docsにあるサンプルコードを参考に、自分で新しくプロジェクト立てた時にハマッた。

<詳細>

認証回りのLogicを書く [ IIssuerSecurityTokenProvider ] がInterfaceとして明示的に追加できるのに、Runしたときに"参照できないアセンブリ"とか言い始めてキレたので残す。

対象

error "参照されてないアセンブリ" に関しての知識を蓄えたので、その辺で困ってる方どうぞ。

環境

方法

本来ならこの問題は

Install-Package System.IdentityModel

で解決すれば困らないですけど。

www.nuget.org

今回は、このパッケージが落とせなかったので、

ソリューションエクスプローラー > "参照" > 参照の追加 > "System.IdentityModel" にチェック > OK

でいける。。。はず!(僕はこれで行きました)

ローカルにあったんかい!!!!って感じでした(笑)( ´∀` )

以下の補足は、今回検索しているうちにクリティカルそうなのをまとめただけです。参考にどうぞ。

補足1. nuget 確認(僕はやりました)

これは"参照できないアセンブリ"が出てきた全般に言えるんですけど、ちゃんと入ってますかってことです。

ほっとんどないはずですけど、今たまたまfix中でInstall-Package ****が走らないとか。(←今回これ)

Install したつもりだと思いますけど、とりあえず再インストールしましょ。

nuget consoleに

Update-Install -Reinstall

で、Package.configをもとに再インストールしてくれるので、それで様子見ましょう。

だめなら次!

補足2. 仰る通りアセンブリ参照に足してみる(僕はだめでした)

プロジェクト直下の Web.config をいじります。

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-3.1.0.0" newVersion="3.1.0.0" />
      </dependentAssembly>
       ....
    </assemblyBinding>
  </runtime>

みたいなところありますよね。。

このフォーマットで仰る通り追記してみる!

今回のパターンだと。。。

<dependentAssembly>
        <assemblyIdentity name="System.IdentityModel" publicKeyToken="b77a5c561934e089" />
</dependentAssembly>

こんな感じで動くのかな。。。

ちゃんと下のBindingRedirectとか設定すると確実なんかな。。。

以上です!!!

ばいん

Visual Studio Team Services と Azure Logic Apps と、時々、Slack

はじめに

Visual Studio Team Services(以下、VSTS)のService HooksとAzure Logic Appsを使ってSlackに通知がくるようにする設定の話。

できるもの

VSTSがイベント発火するタイミングでWeb Hooksから外部ツールに連携して、jsonとかメッセージとか渡すヤツ。

背景(雑談)

対象:SlackとVSTS使ってて"1つのSlackチームで複数のプロジェクト(repository)を管理したい"人向け。

個人的な経緯:

githubのhubotの存在を知る
↓
すげええ!!ってなる。(*´▽`*)
↓
Slackに導入するため調べる( ^ω^)・・・
↓
Visual Studio Team Servicesという拡張アプリを見つける。('Д')
↓
なんだこれでいいじゃんってなる。( ;´Д`)
↓
でも、1つのチームで1つのプロジェクトしか管理できない。(´゚д゚`)
↓
チャンネルごとにプロジェクト(repository)管理したい!(1つのチームで複数のプロジェクト(repository)を管理したい!)(`・ω・´)
↓
Service Hooks使えばできるんじゃね(←今ココ)(・ω・)ノ

用意するもの

Azure Logic Appsの設定

  1. 自分のサブスクリプションに Logic Appを追加。
  2. 編集する。

2-1. 新しいステップで"HTTP要求の受信時", "JSONの解析", "Slack - 投稿メッセージ" を追加する。

f:id:satansatohgg:20171127142731p:plain
こんな感じにつないであげる
cf ) それぞれ「新しいステップ」で検索ワードは[ "HTTP", "JSON", "Slack" ]ででてきます。

2-2. 各々設定する。

"HTTP要求の受信時"

特に何もしなくていいです。

が、後ほどここのURL使いますので、コピーしておいてください。

"JSON解析"

実際にほしいデータをJSONスキーマを使って書きます。

(どんなJSONが送られてくるのかは後ほど確認の方法を記載します)

一例:

{
    "properties": {
        "createdDate": {
            "type": "string"
        },
        "detailedMessage": {
            "properties": {
                "text": {
                    "type": "string"
                }
            },
            "type": "object"
        },
        "eventType": {
            "type": "string"
        },
        "message": {
            "properties": {
                "text": {
                    "type": "string"
                }
            },
            "type": "object"
        },
        "resourceVersion": {
            "type": "string"
        }
    },
    "type": "object"
}

"slack - 投稿メッセージ"

以下の設定をします。(認証後)

  • 投稿するチャンネル名(private channelだと補完されないので直接チャンネル名を書き込みましょう。)
  • メッセージテキスト...具体的にどんなテキストをSlackに投稿するかを書きます。

f:id:satansatohgg:20171127144126p:plain
直接書いたり、JSON解析したproperty名を参照するといい感じにできます。

詳細設定で投稿するBot名など変更できるので興味があったらどうぞ。

VSTSの設定

  1. メニューバーの歯車の中の「Service Hooks」をおす。
    f:id:satansatohgg:20171127140651j:plain
    Service Hooks選択後
  2. +ボタンを押す。

  3. その中の「Web Hooks」を選択する。

    f:id:satansatohgg:20171127140657p:plain
    WebHooks選択

  4. Triggerの設定をする。

    f:id:satansatohgg:20171127140701p:plain
    Triggerの種類
    ここでVSTSへのアクションをトリガーとして設定できる。(イベント発火)

ex) build時、デプロイ時、プルリク時 等々

設定項目の[Any]を候補に出てくる適当なものを選択する。

ここでいうbuild とか Release はVSTS上でデバックをするので、そのlogicを別途用意しないと候補として出ない。 (詳細は後日記載)

5.Triggerの設定をする。 ここで叩くURLをセットする。(先ほどのコピーしたURLをここに貼る)

ここまでの手順でとりあえずTestが押せるようになるので、押してみてください。

f:id:satansatohgg:20171127145340p:plain
押すとこんなテスト画面が出る

そこのRequestタブを押す。

f:id:satansatohgg:20171127145426j:plain
Context以下が送られるJSON

ここでほしいJSONを探してスキーマ対象にします。

JSONの整形やスキーマツールはこの辺がお勧めです。

jsoneditoronline.org

jsonschema.net

スキーマに関してはLogic APP のJSON解析のタブの中に「サンプルのペイロードを使用してスキーマを生成する」があるので、こっちを使ったほうがいいかもしれないです。

スキーマを作成したらJSON解析のスキーマに書き込んでください。

上記の一例のスキーマでpullrequestが来た時、デプロイできたときの2つのイベントを受けて出てきたやつです。

f:id:satansatohgg:20171127151446j:plain
てってれー。(一例のやつのデモ)

以上でやりたいことができたと思います。

目指せGitHubと同じ開発環境!!

バイン

新人SIerの気付き

はじめに

2017年入社の僕ですが、初めてアサインされた案件が終わったので節目として残します。

スペック

以前に記入したことがあったかもしれませんが、改めて...

プログラミング経験はあります。

大学も理工学部でプログラミングしてましたし、高校時代にゲーム作ったりもしてました。

ただ、すごいエンジニアではないです。全部かじり続けてるエンジニアなのでうっすーいです。

自分の位置づけ

スーパーエンジニアではないけど、普通に大学でプログラム勉強してきましたって人よりかはかけるぐらい。

エンジニアって、エンジニア同士の会話で相手が言っていることを理解できなくなったら、相手のほうがすごい。っていうのが僕の中であります。

その後、「あ、え~っと」って教えてくれるのがいいエンジニア、「え、知らないの?」って優越感に浸り続けてるのが苦手なエンジニアタイプです。

環境

今回の案件は、早い案件だったと思います。必要な書類とか書かずにPDCAグルグルみたいな案件でした。 開発言語は、今まで触ったことがない言語でした。

ただ、無事納期に間に合いほっと胸をなでおろしてこの記事書いてます。

なにを言いたいか

ちゃんとプログラムやっててよかったということです。

新しい言語を2週間でmasterするとか、やったことないのでわからなかったのですが、できるものですね。

基礎があるとできるのです。

僕はC言語Javaをやってました。

下地があると置き換えていくだけなので何とかなるものなのです。

独特の概念を習得するのがまぁちょっと骨折れますが、そこにどっぷり時間かけれるので楽しいですね。

だからなに

多分、僕みたいなエンジニアもすくなからずいるのかなと思ってメッセージチックに書きます。

僕は就活中に、「ほんとに開発できるのか」「役に立つのか」など思ってました。

理由としては、今までの人生、すごいエンジニアの人たちしか会ってません。だから自分に自信がなくなってきてたんですね。

ただ、そのいろいろかじったということは少なくとも周りにはついて行ってるのです。それは無駄じゃありません。

そう考えると前向きになれますよ。って話です。

最後に

纏めて喋れ!って思いましたけど。

気が付いたら周りからしたらすごい人になってると思います。確実に前に進んでくださいって話です。

Angular2 "enum"をComponentの中で使いたい

はじめに

Angular2で関数に引数として数値を渡すとき、

<button (click)="method(1)"></button>

とか書いたら読みづらくないですか???

そこでenum

<button (click)="method(EnumType['button1'])"></button>

ただ単にenumの定義がちょっとわけわからなかったんでまとめておきます。

ま、コードを見ていきましょう。 と、行っても部分的コードになるので、個々で補完お願いします。

コード

<app.component.ts>

import { ~ } from '~';
...

enum EnumType {
    button1 = 1,
    button2 = 2,
    button3 = 3,
    button4 = 4,
}

@Component({
    selector: 'enumTest',
    template: `
    <button (click)="method(EnumType['button1'])"></button>
    `
})

export class appComponent{
    //変数フィールド
    EnumType: typeof EnumType = EnumType;

    constructor(){
    //コンストラクタ
    }

    public method(index: number): void{
        //実装
    }
}

っへ~~~~って感じですね。

ばいん

.NET Framework4.6 And MVC5 JSON.NET Converter

初めに

deserialize to abstract class or interface

上記のerrorが出たとき、僕の実装は、JsonでBindするクラスのメンバーの中にabstractを指定してました。

たぶん仕組み

Jsonを既存のBindで行うと、abstractやらInterfaceで実装したら、クラスとしてはちゃんと構造があるわけではないので、Jsonをどんな風にシリアライズすればいいの変わらなくてエラーが出ちゃうわけですね?

  • Newtonsoft.Json.NET を使ってます

www.newtonsoft.com

サンプルコード

URL https://blog.codeinside.eu/2015/03/30/json-dotnet-deserialize-to-abstract-class-or-interface/ このサイトを参考にしました。

以下ソースもこのサイトの引用です。

Modelクラスの実装

public abstract class BaseFoo // 抽象クラス
{
    public string FooBarBuzz { get; set; }
}

public class AFoo : BaseFoo  // 実装
{
    public string A { get; set; }
}

public class BFoo : BaseFoo // 実装
{
    public string B { get; set; }
}

Serializeテスト

AFoo a = new AFoo();
a.FooBarBuzz = "A";
a.A = "Hello World";

BFoo b = new BFoo();
b.FooBarBuzz = "B";
b.B = "Hello World";

List<BaseFoo> allFoos = new List<BaseFoo>();
allFoos.Add(a);
allFoos.Add(b);

var result = JsonConvert.SerializeObject(allFoos);

JsonConverterを実装

public class FooConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(BaseFoo));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);
        if (jo["FooBarBuzz"].Value<string>() == "A")
            return jo.ToObject<AFoo>(serializer);

        if (jo["FooBarBuzz"].Value<string>() == "B")
            return jo.ToObject<BFoo>(serializer);

        return null;
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

実際に使ってみる

JsonConverter[] converters = { new FooConverter()};
var test = JsonConvert.DeserializeObject<List<BaseFoo>>(result, new JsonSerializerSettings() { Converters = converters });

ってな感じで実装します。

簡単でしょ??

ばいん

.NET Framework4.6 And MVC5 で作るIModelBinder

CustomIModelBinderについて

まず初めに僕が今回CustomIModelBinderを作るに至った状況を参考に紹介します。

  1. JSONをPOSTするAPIを作成
  2. バインドするモデルのメンバにinterface,abstract(抽象クラス)を含めた
  3. バインドするメンバにValidate(Require等)を属性として付与

こんな状況になったわけです。

開発環境

  • .NETFramework4.6
  • MVC5
  • NewtonJson

今回はIModelBinderについて

MVC4か3でIModelBinderの形式が変わってて自分が参考にしていたものが使えなくなったということで今回はこの記事を書きました。

using System.Web.Http.ModelBinding; // 間違わないように

public class SampleBinder : IModelBinder{
 // インターフェース実装
 public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
  {
    // 内部処理
    SampleClass sample = new SampleClass();
    
    JsonConverter[] converters = { new SampleConverter() }; //ここは後日(Jsonのカスタムオプション)

    using(var reader = new StreamRender(actionContext.Request.Content.ReadAsStreamAsync().Result)) // Json読み取り
    {
      var str = render.ReadToEnd();
      string jsonStrring = str.Replace("\n","");  // お掃除
      sample = JsonConvert.DeserializeObject<SampleClass>(jsonString, new JsonSerializerSettings() { Converters = converters });
    }

    if(sample != null)
    {
    // 忘れちゃいけないの以下
    bindingContext.Model = sample // ここ重要
    return true;
    }
    else
    {
      return false;
    }
  }
}

でまぁ構造的にはCustiomIModelBinderができました。 今度はどうやって使うかですが、 バインドするModelClassの上に属性として渡してあげましょう

namespace MVC.Models.Sample{
 [ModelBinder(typeof(SampleBinder)]
 public class SampleClass{
  // メンバー定義
 }
}

これで完璧です。

結局

“バインドするClass.jsonを作り直して"で解決するんですけどね?(笑)

ばいん

Angular-cliとQuickStart for 入門者

Angular2を勉強するにあたって

この1週間でなんとかAngular2を扱えるようになったんだけど… 入門コストが高いといわれるだけあった。

最初、躓いたのは以下の点

• File構造の複雑さ・多さ
• Component,Service,Modelの何が何だかわからない感

コードを始める気にすらならないこの辺がもういやだってなる。

せめてFile構造を気にせずプログラムしたい。。。

Angular-cliに出会う

Angular-cliは、ひな形の自動生成、更新ファイルを自動ロードなど、 開発環境が整っているCLI

Angular-cliでquickstartをやる

僕「これの組み合わせでやればコードのことだけ考えられる。。。」

Angular2「error!」

僕「( ^ω^)・・・」

package.jsonの違い

これによってimportするFileが決まる。 しかし、Angular-cliとquickstartのjsonが違うことに気付く。

僕「あああああああああああ~~~~~」

というわけで"あいのこ.json"を生成

{
    "name": "[ファイル名を入れてね]",
    "version": "0.0.0",
    "license": "MIT",
    "keywords": [],
    "author": "",
    "scripts": {
        "ng": "ng",
        "start": "ng serve",
        "build": "ng build",
        "test": "ng test",
        "lint": "ng lint",
        "e2e": "ng e2e"
    },
    "private": true,
    "dependencies": {
        "@angular/animations": "^4.2.4",
        "@angular/common": "^4.2.4",
        "@angular/compiler": "^4.2.4",
        "@angular/core": "^4.2.4",
        "@angular/forms": "^4.2.4",
        "@angular/http": "^4.2.4",
        "@angular/platform-browser": "^4.2.4",
        "@angular/platform-browser-dynamic": "^4.2.4",
        "@angular/router": "^4.2.4",
        "angular-in-memory-web-api": "~0.3.0",
        "systemjs": "0.19.40",
        "core-js": "^2.4.1",
        "rxjs": "^5.4.2",
        "zone.js": "^0.8.14"
    },
    "devDependencies": {
        "@angular/cli": "1.3.2",
        "@angular/compiler-cli": "^4.2.4",
        "@angular/language-service": "^4.2.4",
        "@types/jasmine": "~2.5.53",
        "@types/jasminewd2": "~2.0.2",
        "@types/node": "~6.0.60",
        "codelyzer": "~3.1.1",
        "jasmine-core": "~2.6.2",
        "jasmine-spec-reporter": "~4.1.0",
        "karma": "~1.7.0",
        "karma-chrome-launcher": "~2.1.1",
        "karma-cli": "~1.0.1",
        "karma-coverage-istanbul-reporter": "^1.2.1",
        "karma-jasmine": "~1.1.0",
        "karma-jasmine-html-reporter": "^0.2.2",
        "protractor": "~5.1.2",
        "ts-node": "~3.2.0",
        "tslint": "~5.3.2",
        "typescript": "~2.3.3",
        "canonical-path": "0.0.2",
        "lodash": "^4.16.4",
        "rimraf": "^2.5.4"
    }
}

[ファイル名を入れてね]に自分のファイル名を入れてください(管理しやすいので)

【使い方】 “あいのこ.json"をAngular-cliで生成したフォルダ直下にあるpackage.jsonに上書き保存。

なんだかんだ言って重宝してるので記事にしました。

これからもっと頑張って勉強します。