つばろぐ

主に C#, .NET, Azure の備忘録です。たまに日記。

2019年の抱負を書いてみる

明けましておめでとうございます(した)。2019年になって既に1週間が経過しました。今年も宜しくお願いします。

年末年始は娘が結膜炎発症というイベントもあり、ずっと福岡の自宅で過ごしました。
そのためまとまった時間ができた(というか作った)ので、普段やる時間が作りにくいプログラミング的なことをやりました。

2019年にやりたいなと思ってることを載せてみます。達成するできるかは別として。

技術書を読む

これまで休みの日でも何かしらコード書いていたので、今年は書籍からのインプットを増やしたいと思ってます。
せっかく会社にはたくさんの書籍があるのでそれを活用しないのはもったいない。

(文庫本のような活字本はホント苦手というか無理なので読まない。)

Tipsを溜める、共有する

書籍とか業務とかで得たTipsやノウハウは、脳内ではなく文字として蓄積したい。
それを拙くてもアウトプットする。(特に社内)
これまでOneNoteを使ってたけどやっぱりコードを書くには向いてないので、昨年末からBoostnoteを使ってみてます。今のところいい感じ。

boostnote.io

適度に運動する

運動不足のせいか、昨年は体調を崩すことがこれまでより多かったので、基礎体力を向上するための運動をする。

旅行をする

家族旅行でどっか行きたい。

OSSに貢献する

ドキュメントのタイポを修正してプルリクエスト出すとかでも、やらないより全然いいと思ってます。
C#とかお手伝いできるものがあったら声かけてください。

  • Fukuoka.NETの開催をもうちょっと増やす
  • PHPカンファレンス福岡2019を楽しんでやる
  • 適度に休息をとる

書くとキリがないしハードル上がっちゃうのでこれくらいで。今年も宜しくお願い致します。


弊社のボスが書いたブログが良い内容なので貼っとく。エンジニアリングなロールでも当てはまるものはあるのではないか。

koji-kchc.hatenablog.com

CDNを参照するlinkタグやscriptタグに必要な属性について調べた

ASP.NET Coreのプロジェクトを作った状態の Views/Shared/_Layout.cshtml の、CSSJavaScriptを読み込んでいる記述は以下のようになっています。(抜粋)

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css"
        asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
        asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute"
        crossorigin="anonymous"
        integrity="sha256-eSi1q2PG6J7g7ib17yAaWMcrr5GrtohYChqibrV7PBE="/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"
        asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
        asp-fallback-test="window.jQuery"
        crossorigin="anonymous"
        integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=">
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/js/bootstrap.bundle.min.js"
        asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"
        asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
        crossorigin="anonymous"
        integrity="sha256-E/V4cWE4qvAeO5MOhjtGtqDzPndRO1LBk8lJ/PR7CA4=">
</script>

CDN経由でファイルを取得するようになっていますが、タグに crossoriginintegrity という見慣れない属性があり、気になったので調べてみました。

crossorigin属性

crossorigin 属性: コンテンツへの CORS アクセスの要求 | MDNからの引用です。

developer.mozilla.org

HTML5 では、 CORS への対応が <img>, <video>, <script> など一部の HTML 要素で行われ、 crossorigin 属性 (crossOrigin プロパティ) で、要素が取得するデータに関する CORS リクエストを構成することができます。

crossorigin="anonymous"のときのリクエストヘッダー

GET /css/site.css HTTP/1.1
Host: localhost:5001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0
Accept: text/css,*/*;q=0.1
Accept-Language: ja
Accept-Encoding: gzip, deflate, br
Referer: https://localhost:5001/
DNT: 1
Connection: keep-alive
Cookie: .AspNet.Consent=yes
Pragma: no-cache
Cache-Control: no-cache

crossorigin="use-credentials"のときのリクエストヘッダー

GET /ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css HTTP/1.1
Host: cdnjs.cloudflare.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0
Accept: text/css,*/*;q=0.1
Accept-Language: ja
Accept-Encoding: gzip, deflate, br
Referer: https://localhost:5001/
Origin: https://localhost:5001
DNT: 1
Connection: keep-alive
Cookie: __cfduid=d0c0f4f210dea6cf067de9ca255f7b4041540889478
Pragma: no-cache
Cache-Control: no-cache

違いは?

crossorigin="use-credentials"とすると、Originが明示されCookieにセッション情報を含めて送るようになるようです。

integrity属性

サブリソース完全性 | MDNからの引用です。

developer.mozilla.org

サブリソース完全性 (SRI) は、 (CDN などから) 取得したリソースが意図せず改ざんされていないかをブラウザーが検証するセキュリティ機能です。 SRI を利用する際には、取得したリソースのハッシュ値と一致すべきハッシュ値を指定します。

ファイルが改ざんされていないことを検証するための属性のようです。CDN経由でファイルを使用する際はちゃんとこの属性をつけたほうが良さそうですね。

ではこのハッシュ値はどう作る?というところですが、opensslshasumといったコマンドでも作れますが、このサイトを使うと簡単です。対象のファイルURLを指定するとハッシュ値を生成してくれます。

SRI Hash Generator

f:id:tech-tsubaki:20181230214625p:plain
ハッシュ値を生成する

Azure Storage Emulator 5.8.0.0でAzure Durable Functionsが実行できない問題を解消する方法

Azure Durable Functionsのアプリケーションをローカルで開発する場合、Azure Storage Emulatorを使うことを推奨されています。

docs.microsoft.com

docs.microsoft.com

エラーが起きた

しかし、2018/11/18時点で最新のAzure Storage Emulator 5.8.0.0では、Azure Durable Functionsの実行時(デバッグ含む)に下記のようなエラーが起きます。

Azure Functions Core Tools (2.2.32 Commit hash: c5476ae629a0a438d6850e58eae1f5203c896cd6)
Function Runtime Version: 2.0.12165.0
[2018/11/17 6:32:07] Building host: startup suppressed:False, configuration suppressed: False
[2018/11/17 6:32:07] Reading host configuration file 'D:\src\yuta\func\durable-functions-anti-pattarns\durable-functions-anti-pattarns\bin\Debug\netcoreapp2.1\host.json'
[2018/11/17 6:32:07] Host configuration file read:
[2018/11/17 6:32:07] {
[2018/11/17 6:32:07]   "version": "2.0"
[2018/11/17 6:32:07] }
[2018/11/17 6:32:34] A host error has occurred
[2018/11/17 6:32:34] Microsoft.WindowsAzure.Storage: Server encountered an internal error. Please try again after some time.

本来なら関数が読み込まれ実行エンドポイントが用意されるわけですが、「Microsoft.WindowsAzure.Storage: Server encountered an internal error. Please try again after some time.」となり、止まってしまいます。

原因

この問題に関して、すでにIssueが上がっています。

github.com

I think this might possibly be a problem with extensions that use web hooks.

Issueにはこのように記載されており、Webhook、つまりHTTPトリガーの関数で起きるだろうとのこと。
実際、私の環境でもHTTPトリガーの関数の実行時にエラーが発生しました。

対策

IssueはOpen状態のため根本解決には至ってないと思いますが、暫定的な対策が提示されています。
local.settings.jsonというローカル開発時の設定ファイルに "AzureWebJobsSecretStorageType": "files" を追記するようです。

初期状態のlocal.settings.jsonに追記した状態は下記になります。

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "AzureWebJobsSecretStorageType": "files"
  }
}