tekitoumemo’s diary

C#、ASP.NET MVC、その他の言語やらツールのブログを書いています。たまに車や雑談するときがあります。

【C#】テキトーなAutoMapperを作った


AutoMapperがあまり使い勝手良くなかったから自分で作りました。クラスの型が違っててもだいたいマップするよってライブラリ。


メソッド

これだけ(笑)

void Map<T1, T2>(T1 src, T2 dest)
  • T1:コピー元のクラス型
  • T2:コピー先のクラス型
  • src:コピー元のモデル
  • dest:コピー先のモデル

結果はdestにsrcの内容がコピられるってだけです。

使い方

var suitableMapper = new SuitableMapper();
suitableMapper.Map<Test1, Test2>(model1, model2);

どうなるかは以下で説明します。

// Test1クラスのプロパティと値
hoge1 = "TEST1"; // string型
hoge2 = 1; // int型
hoge3 = true; // bool型
hoge4 = new Hoge(){ hoge1 = "OK!"}; / / Hogeクラス型

// Test2クラスのプロパティと値
hoge1 = "TEST2"; // string型
hoge2 = 5; // int型
hoge3 = 10; // int型
hoge4 = null / / Hogeクラス型

// 実行
suitableMapper.Map<Test1, Test2>(model1, model2);

// Test2クラスにコピーされます。
hoge1 = "TEST1"
hoge2 = 1
hoge3 = 10
hoge4 = new Hoge(){ hoge1 = "OK!"}

Test2クラスのhoge3だけは型が違うのでコピーされず、他の3つはTest1クラスのデータがコピーされます。

なぜ作ったか?

AutoMapperは完全に同じクラスじゃないとマッピングしないので、結局手動でマップしたりAutoMapperに型を合わせたりなどいろいろめんどくさいことがあります。画面とデータは対じゃないのでそこの間を吸収出来ないかと思ったことがきっかけです。とりあえず名前と型が一致してたらコピーしちゃえという適当AutoMapperと思ってくれれば良いです。

使えないところ

名前と型が完全に一致してなければダメです。例えばIDとHatenaIDは同じでマップしたくても名前が違うのでダメです。あとクラスは参照型なのでコピーされたらコピー前のデータが残りません。あっあと.NetCoreで作ったので.NetFrameworkでは使えませんが、ソースをコピれば使えます。

注意

テストとかしてないので、使えそうなところを参考程度に見てもらえるとありがたいです。いつかgithubのReadmeもちゃんと書きます。

ドメイン変更でやったことまとめ

みんなの洋楽ランキング
みんなの洋楽ランキング
先月公開した「みんなの洋楽ランキング」のドメイン変更を行いました。公開して2週間なので、大した影響はないのですが一応ちゃんとやりましたので記事に残しておきます。

ちなみに、以下にように変更しました。
https://mygkrnk.azurewebsites.net ⇛ https://mygkrnk.com/

Azureドメインから変更する感じですね。よく「WEBサービスを作った」的な記事を見てるんですが、herokuドメインのままだったりとドメイン変更やSSL導入に抵抗があるように感じます。ドメイン変更は早い段階でやらないと厄介なので早めにやっちゃいましょう!

まずは費用

1000円程度です。お名前.comで取得したドメイン代ぐらいです。

ドメインを取ります

www.onamae.com
僕はお名前ドットコムで取りましたがどこでもよいです、別に事業所によって変わったりしないので。「.com」なら一年で900円ぐらい。ちゃちゃっと購入しましょう。

SSL導入

以前に記事を書いたので、参考になれば。
tekitoumemo.hatenablog.com
今年の3月からLet’s EncryptでワイルドカードSSLが無料で取得出来るようになりました。この団体は素敵なスローガンを掲げてます。

Let's Encrypt を運営している Internet Security Research Group (略称:ISRG) は、アメリカ合衆国カリフォルニア州にある公益法人で、アメリカ合衆国内国歳入法 Section 501(c)(3) による非課税法人として、アメリカ合衆国内国歳入庁 (IRS) による承認を受けています。

インターネットを介した安全な通信を行う際の、経済面・技術面・教育面での障壁を減らすことが、ISRG の使命です。

ISRG は、誰もがより安全なインターネットがに興味を持つことで、公共の利益のためのデジタル基盤を提供する取り組みを一緒に行うことを可能にするという模範を示すことができると信じています。

素晴らしい!!
さらにGooogleのSSL優遇は必須になってきました。
webmaster-ja.googleblog.com

レンタルサーバーやPaasにDNSレコードを設定する

f:id:tekitoumemo:20180417212055p:plain
ココらへんは事業所にしたがってやって下さい。Azureは以前に記事を書いたので参考になれば。
tekitoumemo.hatenablog.com

【超重要】リダイレクト設定

超需要です。リダイレクト設定は必ず行いましょう。Linuxなら.htaccessWindowsならWeb.config、appsettings.json に記載すればよいです。またこれをやらないと後で説明するSearch Consoleのアドレス変更が出来ませんので必須です。Windows Severのリライトの方法は以下(コピペなので参考程度に)

    <rewrite>
      <rules>
          <rule name="mygkrnk.azurewebsites.net" stopProcessing="true">
              <match url="(.*)" />
              <conditions>
                  <add input="{HTTP_HOST}" pattern="^mygkrnk\.azurewebsites\.net$" />
              </conditions>
              <action type="Redirect" url="https://mygkrnk.com/{R:1}" redirectType="Permanent" />
          </rule>
      </rules>
    </rewrite>

【重要】カノニカルタグを設定

同じサイトでドメインが複数あると重複コンテンツとして評価されてSEOが下がってしまいます。なので、どのサイトが本当のドメインか教えたあげる必要があります。記述方法はヘッダータグに本当のURLを入れます。

<head>
<link rel="canonical" href="http://example.com/">
</head>

【超重要】Search Consoleでアドレス変更の申請

Googleの評価を下げたくなければ絶対にやる必要があります。やり方は設定ボタンの「アドレス変更」をクリックします。
f:id:tekitoumemo:20180417214002p:plain
そしたらそれぞれの項目をチェックします。

  • リストから新しいサイトを選択する

取得したドメインを選択して下さい。取得したドメインはSearch Consoleに追加して下さい。

  • 301 リダイレクトが正常に動作していることを確認する

「【超重要】リダイレクト設定」を参考にしてください。

  • 確認方法がまだ残っていることを確認する

変更前と変更後のドメインが確認できれば良いと思います。

  • アドレス変更のリクエストを送信する

上記がすべてOKの場合、送信を押します。
f:id:tekitoumemo:20180417214054p:plain

【やったほうが良い】サイトマップを作成する

「みんなの洋楽ランキング」では、サイトマップを自動生成しています。いつでも自動で作成出来ることによって、ページを更新する度にクローラーが来てくれるので、ここは早めにやっちゃいましょう!Fetch as Googleは1ページのみのインデックスリクエストで、サイトマップはサイト全体のリクエストになります。そのため、コンテンツサイトなど全体のページを見てくれるのでてっとり早いです。
f:id:tekitoumemo:20180417214821p:plain

【やったほうが良い】周囲に告知

仕事なら職場の人や利用してくれる人への告知。個人ならTwitterなどの告知など手段はあるので、状況に合わせて実施します。私はTwitterで告知しました。

これでGoogleインデックスの引き継ぎやその他もろもろが完了です。

安全に出来てよかった。

ubuntuでログインループ

詰んだ。対処したのでメモ。

こんな症状が起きた。
youtu.be
なんで?Nvidiaのドライバを入れたら起きるとのことですが、Nvidiaのドライバなんぞ入れてません。

僕の場合はデスクトップ環境が何らかの原因で壊れたことによってログイン出来なかったみたいです。
対処法にlightdmが書いてあったので指示にしたがって対応。
デスクトップからコンソールモードに変更するためctrl + alt + f1を入力。

パッケージ取得

$ sudo dpkg-reconfigure lightdm

削除&インストール

$ sudo apt-get purge lightdm && sudo apt-get install lightdm

再起動して、ログイン。

完了。

参考
www.computersnyou.com

ubuntuで.net coreを動かしたらnuget動かんかったのでその対処とAngular追加

タイトルどおりです。なんにも動かんくなったので、対処法を書く。

まず以下のエラーが発生

Unhandled Exception: System.IO.FileLoadException: Could not load file or assembly 'System.Runtime.Extensions, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

おなじみのアセンブリエラーですが、.net coreは.net Frameworkと違ってbin配下にnugetライブラリが入りません。以下のコマンド打つとパスが表示されます。

saito@saito-Aspire-one-1-131:~$ dotnet --info
.NET コマンド ライン ツール (2.0.0)

Product Information:
 Version:            2.0.0
 Commit SHA-1 hash:  cdcd1928c9

Runtime Environment:
 OS Name:     ubuntu
 OS Version:  16.04
 OS Platform: Linux
 RID:         ubuntu.16.04-x64
 Base Path:   /usr/share/dotnet/sdk/2.0.0/

Microsoft .NET Core Shared Framework Host

  Version  : 2.0.0
  Build    : e8b8861ac7faf042c87a5c2f9f2d04c98b69f28d

パスが「/usr/share/dotnet/sdk/」なのでlsすると.Net Core1.0からいっぱい入ってました。ログ取るの忘れていたので「2.0」となってますが、本当はPreviewがはいってました

これが原因で、Nuget参照するときにどのバージョンでNugetを参照するかわかんなかったみたいです(これ予想なのであてにしないで下さい)

全部いらないんで、過去のバージョンをすべて削除

sudo apt remove dotnet*

全部なくなりました。次に.Net Core2.0をインストールします。以下の記事を参考に
kledgeb.blogspot.jp

これでdotnet new mvcdotnet restore、dotnet build、dotnet runをやってみて確認で完了。

次にAngularテンプレートを入れます。Windowsとちょっと違いました。

SPAテンプレートを取得

dotnet new --install Microsoft.DotNet.Web.Spa.ProjectTemplates::2.0.0-rc1-final

いろんな記事に「dotnet new --install Microsoft.AspNetCore.SpaTemplates::*」と書いてあるけど、ubuntuだと出来ませんでした。Windowsだと出来た気がするけど。
ログは出力されてReact、Vueなど様々なスキャフォールディングが使えます、超便利。

  Restoring packages for /home/saito/.templateengine/dotnetcli/v2.0.0/scratch/restore.csproj...
  Installing Microsoft.DotNet.Web.Spa.ProjectTemplates 2.0.0-rc1-final.
  Generating MSBuild file /home/saito/.templateengine/dotnetcli/v2.0.0/scratch/obj/restore.csproj.nuget.g.props.
  Generating MSBuild file /home/saito/.templateengine/dotnetcli/v2.0.0/scratch/obj/restore.csproj.nuget.g.targets.
  Restore completed in 3.7 sec for /home/saito/.templateengine/dotnetcli/v2.0.0/scratch/restore.csproj.


テンプレート                                            短い名前             言語                タグ                 
--------------------------------------------------------------------------------------------------------
Console Application                               console          [C#], F#, VB      Common/Console     
Class library                                     classlib         [C#], F#, VB      Common/Library     
Unit Test Project                                 mstest           [C#], F#, VB      Test/MSTest        
xUnit Test Project                                xunit            [C#], F#, VB      Test/xUnit         
ASP.NET Core Empty                                web              [C#], F#          Web/Empty          
ASP.NET Core Web App (Model-View-Controller)      mvc              [C#], F#          Web/MVC            
ASP.NET Core Web App                              razor            [C#]              Web/MVC/Razor Pages
ASP.NET Core with Angular                         angular          [C#]              Web/MVC/SPA        
ASP.NET Core with React.js                        react            [C#]              Web/MVC/SPA        
ASP.NET Core with React.js and Redux              reactredux       [C#]              Web/MVC/SPA        
ASP.NET Core Web API                              webapi           [C#], F#          Web/WebAPI         
global.json file                                  globaljson                         Config             
Nuget Config                                      nugetconfig                        Config             
Web Config                                        webconfig                          Config             
Solution File                                     sln                                Solution           
Razor Page                                        page                               Web/ASP.NET        
MVC ViewImports                                   viewimports                        Web/ASP.NET        
MVC ViewStart                                     viewstart                          Web/ASP.NET        


Examples:
    dotnet new mvc --auth Individual
    dotnet new mstest 
    dotnet new --help

これで以下のコマンド打てばAngularプロジェクトが完成。

mkdir test
cd test
dotnet new angular
npm i
dotnet restore
dotnet buld 
dotnet run

f:id:tekitoumemo:20180415223505p:plain

AzureにカスタムドメインとSSLを設定する

SSLやらなんやらやってきましたが、最終章です。
tekitoumemo.hatenablog.com
tekitoumemo.hatenablog.com
tekitoumemo.hatenablog.com

SSLやらドメインの取得をしたらAzure Portalへ移動します。

まずはSSLの登録をしましょう。

[SSL証明書]→[証明書のアップロード]を押下します。そしたら以下のような画面が表示されると思います。
f:id:tekitoumemo:20180412194330p:plain
前回、エクスポートした際に設定したパスワードを入力し、アップロードします。それでSSL証明書の設定は完了です。
次に、[カスタムドメイン]→[ホスト名の追加]をクリックします。SSL設定後の写真で申し訳ないですが、SSLが登録されていなかったら追加的な文字が出ます。
f:id:tekitoumemo:20180412195146p:plain
右側に表示されたテキストにお名前.comやらから取得したドメインを登録します。
f:id:tekitoumemo:20180412195655p:plain
f:id:tekitoumemo:20180412195708p:plain
ドメイン所有権のところでエラーになると思います。これが出たらドメインを取得したサイトの管理画面からDNSレコードを設定してあげます。
f:id:tekitoumemo:20180412195927p:plain
f:id:tekitoumemo:20180412195930p:plain
お名前.comだとこんな感じです。所有権の確認が出来るまで結構時間がかかります(5分〜1時間程度)
確認が完了すると[ホスト名の追加]が押下出来ると思います。
ホスト名の追加作業は終了です。

次にSSLの設定を行います。ドメインとアップロードしたSSL証明書を関連付けるだけです。
f:id:tekitoumemo:20180412193122p:plain

すべて完了したのでサイトを見に行きましょう!ワイルドカード証明書なので、どのURLでもオッケイです。
f:id:tekitoumemo:20180412200722p:plain
f:id:tekitoumemo:20180412200907p:plain

ちなみにLet's Encryptは90日間すると期限が切れちゃうので定期的に更新しなければいけません。

SSL証明書のpemをpfxに変換する

前回の記事に続き、変換作業を行いました。AzureやWindowsServerを使ってるとpemで登録出来ないのでちょっとめんどい。

Let's Encrypt でワイルドカードSSLを取得する方法は以下を見て下さい。
tekitoumemo.hatenablog.com
tekitoumemo.hatenablog.com
失敗編、成功編と書いてますが、続編になってますのでどちらも見てもらえると良いかと思います。わかりにくいんで他の人の記事でもいいかも。

取得した証明書を確認します。取得したあとのログで「/etc/letsencrypt/live/ドメイン/」に置きまっせ!との表示がされると思います。

saito@saito-Aspire-one-1-131:~$ cd /etc/letsencrypt/live/mygkrnk.com/
bash: cd: /etc/letsencrypt/live/mygkrnk.com/: 許可がありません

はい。権限がありません。なのでliveディレクトリに権限を付与します。ちなみにcdはsudo出来ません。

sudo chmod 755 live

lsするとこんな感じになってます。

saito@saito-Aspire-one-1-131:/etc/letsencrypt/live/mygkrnk.com$ ls
README  cert.pem  chain.pem  fullchain.pem  privkey.pem

4つ証明書が入っていて、以下のような内訳です。

  • 証明書

/etc/letsencrypt/live/<ドメイン名>/cert.pem

  • 証明書+中間CA証明書

/etc/letsencrypt/live/<ドメイン名>/fullchain.pem

/etc/letsencrypt/live/<ドメイン名>/privkey.pem

  • 中間CA証明書

/etc/letsencrypt/live/<ドメイン名>/chain.pem

次にpfxに変換します。変換にはopensslを使います。ubuntuはデフォで入ってるので便利っすわ。

openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out mygkrnk.pfx
  • inには変換対象のpemを指定します。全部入っているfullchain.pemが良いと思います。
  • inkeyは秘密鍵を指定します。今回はprivkey.pemですね。
  • outはエクスポートするファイルの名前を指定します。取得したドメイン名とかで良いんじゃないでしょうか。

次に以下のような表示がされます。

[sudo] saito のパスワード: 
Enter Export Password:
Verifying - Enter Export Password:

一行目の「[sudo] saito のパスワード: 」はいつものやつです。
二行目の「Enter Export Password:」エクスポート用のパスワードです。忘れないようにしましょう。
三行目の「Verifying - Enter Export Password:」は二行目の確認です。

しれっと変換が完了しているのでlsで確認します。

saito@saito-Aspire-one-1-131:/etc/letsencrypt/live/mygkrnk.com$ ls
README  cert.pem  chain.pem  fullchain.pem  mygkrnk.pfx  privkey.pem

「mygkrnk.pfx」出来ましたね!

以外に簡単でした。

Let’s EncryptでワイルドカードSSL化に挑戦(成功編)

よっしゃ!ワイルドカードSSLが取れた!

これでドメインが使えるので、やり方を紹介します。
作れないと困っている人がいたら以下のURLを確認してみて下さい。
tekitoumemo.hatenablog.com

やり方は前回書いたので、今回実施したことを記載します。

TXTタイプでDNSレコードを登録したら以下のコマンドを実行します。

dig -t txt _acme-challenge.xxxx.com

digコマンドはネームサーバーから情報を引き出すツールです。そうすると以下のような表示がされます。

saito@saito-Aspire-one-1-131:~$ dig -t txt _acme-challenge.xxxx.com

; <<>> DiG 9.10.3-P4-Ubuntu <<>> -t txt _acme-challenge.xxxx.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 11446
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;_acme-challenge.xxxx.com.	IN	TXT

;; AUTHORITY SECTION:
.xxxx.com.		300	IN	SOA	dns.jp. xxxx.dns.jp. 0000..

;; Query time: 9 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Wed Apr 11 20:02:07 JST 2018
;; MSG SIZE  rcvd: 113

これはまだ登録されていないので以下の質問に答えちゃだめ(Enter押しちゃだめ)です。

-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.xxxxxx.com with the following value:

xxxxxxxxxxxxxxxxxxxxxxxxxxxx

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue 

しばらく経ってからdigコマンドを打つと以下のように表示されます。

saito@saito-Aspire-one-1-131:~$ dig -t txt _acme-challenge.xxxx.com

; <<>> DiG 9.10.3-P4-Ubuntu <<>> -t txt _acme-challenge.xxxx.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47846
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1280
;; QUESTION SECTION:
;_acme-challenge.xxxx.com.	IN	TXT

;; ANSWER SECTION:
_acme-challenge.xxxx.com. 3600 IN	TXT	"xxxxxxxxxxxxxxxxxxxxxxxxxxxx"

;; AUTHORITY SECTION:
以下略...

以下の表記がされていればDNSレコードが登録されています。

;; ANSWER SECTION:
_acme-challenge.xxxx.com. 3600 IN	TXT	"xxxxxxxxxxxxxxxxxxxxxxxxxxxx"

こちらが確認出来たら「Press Enter to Continue 」の指示通りEnterを押してやります。

Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/xxxxxx.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/xxxxxx.com/privkey.pem
   Your cert will expire on 2018-07-10. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Congratulations!

証明書は「/etc/letsencrypt/live/xxxxxx.com/fullchain.pem」に置いてやったぜ!って書いてあるのでそこを参照して下さい。

追記:1日20回失敗するとアクセスできなくなります(笑)以下の記事に書いてありました。
Rate Limits - Let's Encrypt - Free SSL/TLS Certificates