僕は技術ができない

技術のできないスーツ園児ニアが考えていること

Azure Functions for Node で単体テストする方法(園児向け)

今回は Azure Functions for Node で 単体テスト(Unit Test)するやり方を紹介します。
とはいえ、これってガッツリ公式ドキュメントに載っているので、MSのドキュメント自力で完璧に読めるぜ!って方はお帰りください。

docs.microsoft.com

MSのドキュメント色んな意味でムズ過ぎて読めないって人には役に立つかもです。

はじめに

  • 基本的には公式ドキュメントの通りです。
  • ただ、一部妙にわかりにくい部分があるので自分へのメモを兼ねて残しておきます。わかりにくい部分に関しては本記事の最後に書いています。
  • 公式ドキュメントとはフォルダ構成を少し変えています(gitignoreで管理しやすくするためテストに関するものはすべて外出ししている等)
  • フツーのAzure Functions (for Node)のUnit Test方法の紹介です。Durable Functions (for Node)のためのテスト方法ではありません。Jestの詳細な使い方にも触れていません。
  • ひょっとしたら、頑張ればDurable Functionsでもいけるかもしれません(いけないかもしれません)

Jest

Azure Functions for Node の Unit Test には Jest を使います。
JestというのはJavaScriptのためのテストツールです。Wikipediaでは以下のように定義されています。

Jest[1] is a JavaScript Testing Framework with a focus on simplicity. It works with projects using: Babel, TypeScript[2], Node.js, React, Angular and Vue.js. It aims to work out of the box and config free.
Jest (JavaScript framework)

公式ページはなんだか楽しそう。 f:id:contemporarycuz:20190716232313g:plain jestjs.io

本題(Functions向けのJest導入)

HttpTriggerタイプのFunction Appを用意

こんな感じ

> tree /f
C:...\UNITTEST
│  .gitignore
│  host.json
│  local.settings.json
│  proxies.json
│
├─.vscode
│      extensions.json
│      launch.json
│      settings.json
│      tasks.json
│
└─HttpTrigger
        function.json
        index.js
        sample.dat
上記UnitTestフォルダ直下で以下を実行
mkdir TestModule        // 名前はテキトー
cd TestModule
npm init -y                   // package.json作るため脳死実行
npm i jest                     // Jestインストール
package.jsonのscripts.testをjestに変更
  "scripts": {
    "test": "jest"
  },
TestModule直下で以下を実行
mkdir testing
cd testing
ni defaultContext.js        // Powershellを想定。niはtouchみたいなやつ。
ni index.test.js
defaultContext.jsに以下をコピペ
module.exports = {
    log: jest.fn()
};
index.test.jsに以下をコピペ(こいつがテストコードです)
const httpFunction = require('../../HttpTrigger/index');
const context = require('./defaultContext');

test('Http trigger should return known text', async () => {

    const request = {
        query: { name: 'Bill' }
    };

    await httpFunction(context, request);

    expect(context.log.mock.calls.length).toBe(1);
    expect(context.res.body).toEqual('Hello Bill');
});

これでテストの準備完了!!
この時点でTestModule内はこんな感じになってるはず。

│  package-lock.json
│  package.json
└─testing
        defaultContext.js
        index.test.js

テスト実行

npm test

f:id:contemporarycuz:20190716234932p:plain

無事、テスト実行することができました。

次回は一歩進んで、入出力Bindingのモック作成あたりに触れようかなと。

一部妙にわかりにくい部分について

その①:HttpTriggerとTimerTriggerのテストがごっちゃになって書かれている。

以下の手順の時点では
「HttpTriggerとTimerTriggerのFunctionに対するテストを実施します」
とも言われていないし、
そもそもFunctionすら作っていません。
今何をしようとしているのか全く見えないという状況に陥ります。 f:id:contemporarycuz:20190717000119p:plain

実はここら辺のことはC#を用いた単体テストの章に書かれていたりします。しかし、Nodeで開発している人はその部分は読まないでしょう。

f:id:contemporarycuz:20190717000435p:plain

その②:ワタシニホンゴワカリマセン的な珍訳

これはMSドキュメントあるあるですが、日本語が意味不明です。 f:id:contemporarycuz:20190717000655p:plain

関数を作成した後、index.test.js という名前の同じフォルダーに新しいファイルを追加

これだけ読むと、「index.test.jsという名前のフォルダ―」に「index.test.jsというファイルを追加する」ように読めてしまいます。
もちろん、優秀な皆さんであれば、コードを見て

const httpFunction = require('./index');

の部分から、どこにindex.test.jsを作るべきかわかるのだと思います。しかし、園児にはちょっと厳しいです。
ちなみに、英語版を読んでもちょっと混乱します(これは僕の英語力不足かも) f:id:contemporarycuz:20190717001056p:plain

[]が修飾される名詞、<>が修飾

正しい読み方
Once the function is created, add [a new file] <in the same folder> <named index.test.js>
in ~ と named ~がそれぞれ a new fileを修飾している

ダメな読み方(混乱する読み方)
Once the function is created, add [a new file] <in [the same folder] <named index.test.js>>
in から後ろが a new fileを修飾している。 named ~ が the same folder を修飾している。

よって、悩んだときはドキュメントを隅々まで読む。英語を読む(読んでも経験上無意味なことが多いけど)ことが重要ですね。

Azure DataFactory でトリガーがモニターに出てこなくて困る

はじめに

みなさんAzure DataFactoryを使っていますか?
Azure DataFactoryを使うと、ノンコーディングでデータパイプラインを作ることができます。便利!

docs.microsoft.com

Storage BlobにデータがアップロードされたらそいつをCosmosDBに書き込むパイプラインを作りたいのですが、Azure Functionsだとリトライ処理書かなきゃいけないし結構しんどいです(そして技術力のない僕にそんな制御できない)。
Azure DataFactoryを使えばそこらへんをまるっとよしなにやってくれそうなのでやりましたが、モニタリング周りで詰まってしまったのでメモとして残しておきます。
解決策があるわけではないのでご了承。

<2019/07/16追記>
一時的な不具合だったのか、モニターに表示されるようになりました! ただし、自動で画面が更新されるわけではないので、自分で「Refresh」をクリックする必要があります。
また、デバッグ実行ではモニターには反映されません。

本題

Triggerを以下のように設定しました。 ただただコンテナー「input」にBlob(csv)がアップロードされたらトリガーされるだけのシンプルなものです。

{
    "name": "blobInputTrigger",
    "properties": {
        "annotations": [],
        "runtimeState": "Started",
        "pipelines": [
            {
                "pipelineReference": {
                    "referenceName": "SimplePipelineStorageToCosmos",
                    "type": "PipelineReference"
                }
            }
        ],
        "type": "BlobEventsTrigger",
        "typeProperties": {
            "blobPathBeginsWith": "/input/blobs/",
            "blobPathEndsWith": ".csv",
            "scope": "/subscriptions/<サブスクリプションID>/resourceGroups/<リソースグループ名>/providers/Microsoft.Storage/storageAccounts/<ストレージアカウント名>",
            "events": [
                "Microsoft.Storage.BlobCreated"
            ]
        }
    }
}

いざBlobアップロード!! f:id:contemporarycuz:20190629182112p:plain

DataFactoryのトリガーモニターを見てみるが何も表示されない。。。

f:id:contemporarycuz:20190629182202p:plain
フィルターもたぶん合ってる

Cosmosにはデータ入ってました。

f:id:contemporarycuz:20190629182333p:plain

モニターできんと困るやんけ!
ということで僕自身のIssue上げでした。

後はCosmosからのデータ一括削除もなんとかしてノンコーディングでやりたい(Logic Appsとかでリトライ処理よしなにやってくれないかしら)。

その他の話題

最初はモニターにトリガーの実行履歴が出てこなかったので「動いてないのか!?」と思い、いろいろと調べたところ少しかしこくなったのでメモ。

blog.engineer-memo.com

  • Storage は V2 にしないといけない
  • トリガーの「Blob path begins with」と「Blob path ends with」はどっちかを利用し、両方利用しない(両方利用してもいいけど要検証)
  • 自分でトリガーjson書くときは、コンテナー名の後に/blobs/をつけること
"blobPathBeginsWith": "/input/blobs/",

どうやらここらへんはEventGridの仕様であるようなのですが、DataFactory作成後、特にEventGridのリソースが見えるわけではありませんでした(ポータルから確認したけど特にリソースは作られていなかった)。マネージド・サービスなので裏で勝手にやってくれていると理解。

はじめての Cosmos DB ~JavaScriptでクエリを投げるまで~ (園児向け)

今日はAzure SDK for JavaScript で CosmosDB からデータを取ってきたい。

が、、情弱にとってはMicrosoftはワンダーランドだ![#要出典]

なので、技術のできない園児向けに初めの一歩を残そうと思う。途中で力尽きるかもしれない。そんなときは是非、水着のお姉さんに励まして欲しい。そして一かけらのフィレオフィッシュを。。。

誰のための記事か

Cosmos DB を使ったことのない よいこのみんな

Azure SDK for JavaScript で Cosmos DB を触ったことのない よいこのみんな

僕も今日初めて Cosmos DB 触りました。全然わからん。

前置き

Azure SDK for JavaScript での CosmosDB のサンプルアプリがある。

github.com

公式リファレンスは以下。

docs.microsoft.com

ただ、このサンプルアプリのコード例にはクエリの投げ方が書いていない。

もちろん、このリポジトリを掘ればそれらしきものが出てくるし、公式ドキュメントも「できる人」が見れば一撃でわかるのだろう。

だが、園児にはかなりキツい。

誰でもできるように、やり方を園児向けにまとめたい。

前準備

Cosmos DBを作る

とりあえず、Core(SQL)にしとけばDynamoDBみたいな感じで使えるっぽい。

f:id:contemporarycuz:20190605012121p:plain:w400
脳死で作った。よくわかってない。

リソースに移動するとサンプルアプリを作るよう勧められるが、園児にとってこれは罠

f:id:contemporarycuz:20190605012234p:plain
初見〇し。いきなりアプリ作らせられてしまいそうになる。

データエクスプローラーから New Container をクリック

f:id:contemporarycuz:20190605001358p:plain:w500


データベース名やコンテナー名、パーティションキーなどを決める。

f:id:contemporarycuz:20190605002620p:plain
デフォルトで"id"が一意キーになるみたいなので一意キーの設定は任意だと後で気づいた。


New Itemをクリック

f:id:contemporarycuz:20190605002850p:plain


こんな感じでどんどん突っ込んでいく。

f:id:contemporarycuz:20190605003228p:plain
これはDynamoDBより楽(ポータルのUIからお試しする場合)


とりあえず4個くらい入れてみた。

id uniquekey country
001 aoifioeggfuyeg hogeLand
002 dhiuafhiuhir fugaLand
003 adofjoapwre13294 hogeLand
004 daosgdpreree fooLand


ポータルからクエリを投げてみる。

f:id:contemporarycuz:20190605004927p:plain
ちゃんとcountryでフィルタできた


コーディングの準備

VS Codeを開き、適当にフォルダを切る。

以下を実行。

npm install @azure/cosmos

jsファイル(tutorial.js)を作る。

フォルダの中はこんな感じ。

f:id:contemporarycuz:20190604235417p:plain
園児でも把握可能なフォルダ構造

コードを書く

ここからが本題。

ポータルから以下を確認しておく。

1.エンドポイント f:id:contemporarycuz:20190605011932p:plain

2.キー f:id:contemporarycuz:20190605011339p:plain

3.DB ID 4.Container ID f:id:contemporarycuz:20190605011544p:plain


コードは以下の通り。

const cosmos = require("@azure/cosmos");

// クライアントの生成
const CosmosClient = cosmos.CosmosClient;

const endpoint = '' //1.ここにエンドポイントを入力
const masterKey = '' //2.ここにキーを入力
const client = new CosmosClient(
    {
        endpoint,
        auth: {
            masterKey
        }
    }
);

const db_id = 'myDatabase'; //3.ここにDB IDを入力
const container_id = 'myContainer'; //4.ここにContainer IDを入力

// クエリするための関数
async function queryCosmos() {
    const query_spec = 'SELECT * FROM c WHERE c.country = "hogeLand"';
    const res = await client.database(db_id)
                            .container(container_id).items
                            .query(
                                query_spec,
                                {
                                    // パーティションを跨いだ検索には必須
                                    enableCrossPartitionQuery: true 
                                }).toArray();
    console.log(res);
}

queryCosmos().catch(err => {
    console.error(err);
});

実行

node tutorial.js

結果

{ result:
   [ { id: '001',
       uniquekey: 'aoifioeggfuyeg',
       country: 'hogeLand',
       (略)
     },
     { id: '003',
       uniquekey: 'adofjoapwre13294',
       country: 'hogeLand',
       (略)
     } ],
  headers: undefined }

めでたくクエリ投げて結果を持ってくることができた!

Azure Durable Functionsのチュートリアルがわからない。けどやる。(1)

今日はAzure Durable Functions for JavaScript のチュートリアルをやりたい。

が、、情弱にとってはMicrosoftはワンダーランドだ![#要出典]

なので、技術のできない人向けにチュートリアルのやり方を残そうと思う。途中で力尽きるかもしれない。そんなときは是非、水着のお姉さんに励まして欲しい。そして一かけらのフィレオフィッシュを。。。

前置き

Azure Durable Functions自体の説明は

牛尾さんのqiitaとか qiita.com

しばやんさんのブログとか blog.shibayan.jp

がとても分かりやすくてだいぶ神。

いきなり公式ドキュメント読むと詰む。

f:id:contemporarycuz:20190603230927p:plain

docs.microsoft.com

イメージとしてはAWSのStep Functionsが近いのかなーと思う(多分違う気がする)。

今日やること

docs.microsoft.com

この "クイックスタート" 以上でもこれ以下でもない。

情弱以外の方はお願いですからタブをそっ閉じしてください。

貴方の貴重な時間を奪いたくない。

あと、マカーはお断りだ。情弱はAzureに阿るためにWindowsを使うべし。

僕も普段は "鬼盛MacBook Pro" だが、このチュートリアルのために音楽・動画編集用の ハイスぺWindowsデスクトップ を使っている。

とはいえ、マカーの皆にも役立つ記事になると思う。Windowsとの差異は少ししかないので公式ドキュメントと本記事を行ったり来たりしながら読んでほしい。

準備するもの

以下五つ道具が必要(情弱だともっと必要)

  1. Azureアカウント、サブスクリプション

  2. Visual Studio Code

  3. node v8.0以上

  4. Azure Function Tool

  5. Azure Storage Emulator

Cloud9+Lambdaみたいに全部ブラウザで済むようにしてほしい。

インストールの仕方

Azureアカウント、サブスクリプション

Azure の無料アカウントを今すぐ作成しましょう | Microsoft Azure

Visual Studio Code

Visual Studio Code – コード エディター | Microsoft Azure

node v8.0以上

ダウンロード | Node.js

Windows用のLTSを選択してね!


そしてここからが運命の分かれ目だ。懸命な方なら情弱プランを選ぶと思う。

ちなみに僕は「Function Toolは情強プラン」で「Storage Emulatorは情弱プラン」でインストールしたので、一部間違いがあるかもしれない。

情弱のやり方

まず、Visual Studio (Codeではない)を入れる。

visualstudio.microsoft.com

インストールウィザードの途中で何やら「ワークロード」という難しい言葉が出てくるので、関係ありそうなものを選んでインストールする。

こんな感じ。

f:id:contemporarycuz:20190604003557p:plain

これで大体10GBくらいだ!Cドライブに足りなければDドライブに入れてもいいが、

  • VS本体と機能がどこにどうやって格納されるか

  • パスがどうなるか

は情弱にはわからなくなる。

わからない場合はググるか、あきらめて新しいパソコンを買おう。

www.microsoft.com

Visual Studioが無事インストールできたら再起動し、Visual Studioを立ち上げる。

[ファイル]>[新規作成]>[プロジェクト]を選択し、以下のように "Azure Functions" が表示されればOK。

f:id:contemporarycuz:20190604001528p:plain

ドキュメント(リンク)の通りに拡張機能を見に行くと「"Azure Functions"がないよー」ということになってしまう。

おそらく、最新バージョンでは拡張機能じゃなくて標準機能になったんだと勝手に思い込むことにする。

情強のやり方
Azure Function Tool(注!これは情強のやり方です)

VS Code上で以下を実行

npm install -g azure-functions-core-tools
Azure Storage Emulator(注!これは情強のやり方です)

下記リンクのインストーラをダウンロードしてインストール docs.microsoft.com

インストールされてるか確認(情弱・情強共通)

VS Code上で以下を実行

func

Azure Function Toolがインストールされている場合、こんなマークが出る。

f:id:contemporarycuz:20190604003658p:plain:w200

インストールされていない場合、「そんなコマンドねーよ」と怒られる。

f:id:contemporarycuz:20190604003800p:plain

情弱プランでFunction Toolを入れたのにインストールされていない場合は情強プランでやってみよう。

Azure Storage Emulatorがインストールされている場合、Cortanaが見つけてくれる。

f:id:contemporarycuz:20190604002417p:plain:w200

インストールされていない場合は何も出てこないと思う。

情強プランでStorage Emulatorを入れたのにインストールされていない場合は、何かがおかしい!(僕は情弱なので"何か"が何であるかはわからない!)

もう一度インストールしてみよう。


案の定力尽きた。。次回に持ち越し。

酔って帰ったらリファクタリング・ウェットウェアが届いていた

会社の先輩がちらっと話題に出していて気になったので買った。

 

 達人プログラマーになるため、リファクタリング・ウェットウェアを読みます。

 

とりあえず1周読んだらまとめ記事書くます。

 

AWS Solutions Architect Professional にいつまでたっても受からない話

AWS Solutions Architect Professionalという資格試験があります。
AWSの中でも最上位の資格です。

検索をかけると短期間での合格体験記がザクザク出てきます。

こんなんとか blog.mmmcorp.co.jp

こんなんとか qiita.com

○時間で合格、○日で合格、○週間で合格。。。 天才かよ。

僕は2018/11末にAssociateを取得してから、2019/05末までの半年間Professionalを取得できてません。 というか受験すらしてないし受験ガイドすら開いてない。

勉強しない → 受ける気力がわかない → サンプル問題見る → ムズイ 諦めよう → 勉強しない
の無限ループ。

ところで、Associateを取得した後に公式模試のバウチャーをもらいました。 これを使えば通常4000円する模試が無料で受けれます。 バウチャーの有効期間はAssociate取得から半年。

ということで模試受けました。

結果は70%

f:id:contemporarycuz:20190531020522p:plain:w400

合格点は750/1000点なのでこれは落ちた。。。

そしてまた負のループに嵌っていくのであった。

僕は技術ができない

はじめまして Contemporary C.U.Z.と申します。

国内SIerで、ありがちなスーツエンジニアをしております。

得意な領域は特にないです。 苦手な領域は全部です。

最近あまりにも技術ができなすぎて辛い思いをしているので、学びのログとしてブログします。

周りの「なんでも知ってて1つか2つ詳しい領域がある」といったT型人材にどうやったらなれるのでしょうか。

間違ったことをたくさん書くと思いますが、もしお時間があればコメントで指摘してください。

宜しくお願い致します。