オンプレ系インフラエンジニアがAzureを勉強する

いつか誰かの何かの役に立つと嬉しいな

SSMSでVSCodeのショートカットキーを使う

はじめに

最近はVSCodeでUIやAPIを作り、SQL Server Management Studio(SSMS)でDBを触る、というスタイルなのでVSCodeとSSMSを行ったり来たりします。
それぞれショートカットキーが異なり、面倒に感じたのでSSMSのショートカットキーを編集しました。

ちょっと調べてるうちにVSCodeからDBにアクセスできる方法がわんさと出てきたので
ショートカットキーの設定云々よりそっちに移行することになりそうです~

一応、SSMSでVSCodeのショートカットキーが使えるんだなってことで書いておきます。

SSMSにVSCodeのショートカットキーを割り当てる

特に面倒に感じたのがコメントアウトのショートカットキーの違いです。
VSCodeはCtrl+/、SSMSはCtrl + K、Ctrl + C。
VSCodeのほうに慣れてしまったので、SSMSのほうを変えます。

メニューバーから[ツール]>[オプション]を選択。
f:id:mitsunooon:20210629232802j:plain

[キーボード]>[次の追加キーボードマップスキームを適用]で[Visual Studio Code]を選択。
[OK]をクリック。
f:id:mitsunooon:20210629232823j:plain

これでCtrl+/でコメントアウトができるようになります。
ただし、ひとつのショートカットキーに2つの意味は持たせられないようで、
コメントアウト解除のショートカットキーは別になります…
(Ctrl+/を連打しても頭の--が増えるだけ…

『日本語プログラミング言語「なでしこ」に関する解説』を読んでの感想

はじめに

情報処理学会誌のコラムに載っていた下記記事を読む機会がありました。
note.com

これをきっかけにプログラミング言語の作り方を調べてみたので自分用に簡単にまとめます。

日本語プログラミング言語「なでしこ」とは?

上記のコラムを読んでいただくのが一番良いですが、簡単に。

  • 日本語で書けるソースコード
  • 対象使用者:プログラミング初心者の老若男女
  • 開発のきっかけ:事務の自動化のため
  • 2021年度から中学の教科書で扱うことに。

公式サイトでは簡易エディタがあり、実際に触ってみることができます。
なでしこ:日本語プログラミング言語

他の人がなでしこを使って作ったプログラムも見ることができます。
🍯 なでしこ3貯蔵庫

私がコラム内で特に日本語プログラミング言語の意義として一番いいなと思ったのは下記です。

現在プログラミング入門として,Scratchなどビジュアルプログラミング言語が用いられています.しかしビジュアルプログラミング言語から,本格的なプログラミング言語に移行するには大きな壁があります.そこで,クッションとして日本語プログラミング言語を使っていただければと思います.

私もビジュアルプログラミング言語プログラミング言語には大きな壁があると思っています。
その壁によって、せっかく楽しいと思えたプログラミングへの興味が折られてしまったらもったいないと感じていました。
なでしこによってその差が埋められたらいいですよね。

自作プログラミング言語って?

プログラミング言語の作り方についてあまり知らなかったのでこの機会に調べてみました。
世の中には当然のように自作プログラミング言語界隈があるようで、これもまた深い沼のような雰囲気がありました…

自作する目的としては下記があるようです。

  • 既存よりいい言語を作りたい
  • 独自のアプリ用の言語が欲しい
  • とにかく作ってみたい

結局は「作ってみたい」という情熱がすべてな気がしますね。

作る流れ

大雑把に流れを書くと大体こんな感じではないかと。
f:id:mitsunooon:20210605152902p:plain

字句解析

ソースコードを意味のある単語(トークン)に分割します。
この説明はこちらのサイト様の説明がわかりやすいです。
プログラミング言語を作る/yaccとlex

ちなみに、なでしこでは助詞でトークンを区切ることで、引数を逆転させても意味が通るような工夫がされているそうです。

構文解析

字句解析したトークンとプログラミング言語の文法から構文木を作ります。
なぜ木構造なのというところの理解がふわっとしており、文字に書き起こせないのでもう少し考えてから書きたいと思います。
構文解析は研究が盛んなようで、ツールが言語によっていろいろあるそうです。
例)yacc(C言語)、JavaCC(Java)

言語処理

上記の解析たちではルールを決めた段階です。
その決めたルールを実行するソフトウェア的なものが必要になります。
インタプリタ形式やコンパイラ形式など手法があり、それによって作り方が変わります。
プログラミング言語を作ったことのある人に話を聞いたところ、この段階がとても大変だったと言っていました。

おまけ

インタプリタ形式の特徴

コンパイラ形式の特徴

おわりに

1時間でプログラミング言語を作る!みたいな記事を書いてくださっている方もいたりするので、本当はちょっと作ってみるまでやってみたかったのですがとても至らず…
作っている方々は楽しそうなので、自作プログラミング言語の勉強会などあれば、怖いもの見たさで少し覗いてみたいなという気持ちになりました。

【React+TypeScript】ミニマムなユニットテストコードを書いてみた

はじめに

React+TypeScriptでフロントエンドを触るようになりましたが、いまだにテストは全然自動化できてません…
テストの種類も色々あり、どれも気になるのですが、よくあるテストピラミッドを参考にまずはユニットテストを考えることにしました。
そもそもユニットテストのテストコードとはどんなものなのかを知りたかったので、ミニマムなテストコードを書いてみました。

使うもの

React
TypeScript
Reactのテストユーティリティ
テストユーティリティ – React

やったこと

新規Reactアプリケーションを作成する

下記コマンドで新規プロジェクトを作成します。

npx create-react-app [プロジェクト名] --typescript

テスト対象のコンポーネントを作る

テスト対象のコンポーネントを作ります。
今回はLink.tsxです。

import React, { Component } from 'react';

class Link extends Component<{ text?: string }, {}> {
    render() {
        return (
            <a
                className="App-link"
                href="https://reactjs.org"
                target="_blank"
                rel="noopener noreferrer"
            >
                {this.props.text || 'No contents'}
            </a>
        )
    }
}
export default Link

App.tsxで呼び出します。

import React from 'react';
import logo from './logo.svg';
import './App.css';
import Link from './components/Link';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.tsx</code> and save to reload.
        </p>
        <Link text='this link'/>
      </header>
    </div>
  );
}

export default App;

テストフォルダを作る

テストコードを格納するためにフォルダ名「tests」のフォルダを作ります。
f:id:mitsunooon:20210404170413j:plain

テストファイルを作る

testsフォルダにテストファイルを作ります。
今回はLink.text.tsx
テストファイルの書き方についてもまだ掘り下げ切れていないのですが、
確認項目ひとつにつき、actひとつという感じのようです。
今回は、propsが渡された場合と渡されない場合の2パターンでテストします。
propsが渡されない場合は、textが'No contents'であること
propsが渡された場合は、textが'this link'であることを確認しています。

import { render } from 'react-dom';
import { act } from 'react-dom/test-utils';
import Link from '../components/Link';

describe('Link component testing', () => {
    let container: Element | DocumentFragment | null = null;
    container = document.createElement("div");
    document.body.appendChild(container);

    it('Linkコンポーネントテスト', () => {
        // ケース別にテストします
        act(() => {
            render(<Link />, container);
        });
        // propsが渡されない場合
        expect(container!.textContent).toBe('No contents');

        act(() => {
            render(<Link text='this link'/>, container);
        });
        // propsが渡された場合
        expect(container!.textContent).toBe('this link');
    });
})

App.test.tsxの編集

create-react-appすると、デフォルトでApp.test.tsxというテストファイルが作られますが、
そのまま使用するとエラーが出るので、下記のように書き換えるorコメントアウトします。

import { render, screen } from '@testing-library/react';
import App from './App';

test('renders learn react link', () => {
  render(<App />);
  // const linkElement = screen.getByText(/learn react/i);
  // expect(linkElement).toBeInTheDocument();
  const linkElement = screen.queryByText(/learn react/i);
  expect(linkElement).toBeNull();
});

テストの実行

ターミナルで下記コマンドを実行して、テスト開始します。

npm test


問題がなければ2 passedの結果が出ます。
f:id:mitsunooon:20210404170329j:plain

意図的に失敗させたい場合は、Link.text.tsx内の'this link'を別の文字列にしたりします。
そうするとこんな感じのエラーが出ます。
f:id:mitsunooon:20210404170344j:plain

ソースコード全体

今回作ったもののソースコードGitHubにあげているの、そちらも参照ください。
github.com

感想

今回は2つしかテストがないので、結果が見やすいですがテストが増えたら見づらくなるのでは?と思ってます。
たぶんVScode拡張機能を使ったりすればもっと見やすいテスト結果の取得ができるんだろうなという気がします。

今回のやり方では必要なコンポーネントごとにテストコードを書くのは結構な労力になることがわかりました。
この考え方をベースにしてユニットテストコードを書くのは果たして正解なのか…
ユニットテストコードを書くことはどんなやり方でもこれくらい大変なのか、
またはもっと簡単なやり方があるのか、慣れなのか…ううーむ

少なくともテストコードの作成には労力が結構必要ということが身をもってわかったので、必要なところにピンポイントで用意することの大切さはわかった気がします。
(むやみやたらにテストコードを用意すればいいものではない、コスト的にも難しい…等

多少大変でも品質向上のために適材適所なテストコードは必要かと思っているので
とりあえず導入できるくらいのテストコードは模索したいと思います。

AI-900に向けた試験対策

はじめに

先日AI-900を受験してきました。
ぎりぎりの合格でしたが、試験対策でやったことを書いておきます。

AI-900とは

MCP試験(マイクロソフト認定プロフェッショナル試験)のひとつです。
入門編の位置づけで、AI-900は機械学習人工知能の概念、それに関連する Microsoft Azure サービスの基礎知識が問われます。
Exam AI-900: Microsoft Azure AI Fundamentals - Learn | Microsoft Docs

事前スペック

・Cognitive Servicesの一部サービスを触ったことがある(Custom Vision,QnA Maker,Form Recognizer,Bot Framework Composer等)
機械学習に関する知識はほぼ皆無。

試験対策にやったこと

Microsoft Learn
試験ページにあるラーニングパスを一通りやりました。
Exam AI-900: Microsoft Azure AI Fundamentals - Learn | Microsoft Docs

特に大事な部分については後述で紹介する記事を参照いただくと良いです。
私は機械学習そのものの基礎知識が欠けているので、Azure Machine Learningのモジュール内容がよくわからずMS Learnを進めることすら困難でしたが、やっておいて良かったです。

追加で下記2つのラーニングパスもやりました。
大事な部分の理解が深められた気がします。
ニーズに最適な AI サービスを選択する (AZ-900) - Learn | Microsoft Docs
責任ある AI の基本原則を特定する - Learn | Microsoft Docs


受験レポを参考にする
AI-900の受験を決めてからすぐに参考にさせていただきました。
試験で大事な部分についてわかりやすくしっかりと書かれているので、試験勉強の指標にさせていただきました。
Microsoft 資格 AI-900 / DP-100 勉強法 - Qiita

試験の直前くらいにお見掛けして、参考にさせていただきました。
Microsoft Azure AI Fundamentals (AI-900)チャレンジ_4日目~試験当日 - よしなしごとをかきつくれば


Cogbotコミュニティに参加する
機械学習については知識ゼロですが、Cognitive Servicesには興味があったので、Cogbotコミュニティに定期的に参加しています。
Cognitive Servicesに関する最新のアップデート情報が聞けるのはもちろん、それぞれのサービスの具体的な使い方なども聞けるのでそれが試験にとても役立った気がします。
勉強会の開催情報はconnpassやFacebookで発信されていますので見てみてください。

connpass
Cogbot コミュニティ - connpass

Facebook
Cogbot コミュニティ!

おわりに

いつも試験関係は過去問に頼りきりなのですが、今回はMS Learnだけで済んだので良かったです。
練習で作ったリソースは削除を忘れないようにしましょう!(結構高いので…

Microsoft認定プロファイルの氏名を変更する

はじめに

Microsoft認定資格試験(MCP)は受験時に本人確認書類を提示する必要があります。
本人確認書類の姓が変わった場合、試験申し込みをするアカウントの氏名も変更する必要があります。
変更方法としてはフォームを送るだけと簡単ですが、変更までにどれくらい時間がかかるのかなど気になったので書き留めておきます。

問い合わせフォームの送信

Microsoft Learningの設定プロファイルから住所などの変更はできますが、法律上の名前は変更できません。
下記の「登録名更新フォーム」に従いプロファイル名変更要求フォームを送る必要があります。
Microsoft 認定資格のヘルプ | Microsoft Docs

必須入力項目

マイクロソフト認定プロファイルに現在表示されている名前
・試験の予約時に提示する政府発行の身分証明書に記載されている名前

下記いずれか3つ以上を入力

今回は私が記入した項目について記載します。
マイクロソフト認定プロファイルの識別番号-MCID。(数字のみ)
MCIDはMicrosoft Learningの右上に表示されます。
f:id:mitsunooon:20210330135441p:plain


マイクロソフト認定プロファイルに関連付けられた電子メール。
Microsoft Learningの設定プロファイルで確認できます。


・ピアソンVUE試験の登録確認書に記載されているMicrosoftID(MS ID)。(数字のみ)
受験申込時にピアソンVUEから来るメールを参照しました。
f:id:mitsunooon:20210330135506p:plain


・ピアソンVUE試験登録ID。(数字のみ)
受験申込時にピアソンVUEから来るメールを参照しました。
f:id:mitsunooon:20210330135528p:plain


・受けた試験と完了日をリスト
ピアソンVUEの受講履歴を参照しました。


・達成した認定と完了日をリスト
ピアソンVUEの受講履歴を参照しました。


ピアソンVUEの受講履歴表示方法
[Microsoft Learningダッシュボード]>[試験プロバイダ]>[ピアソン VUE]>[Go]>[受験履歴]
f:id:mitsunooon:20210330135544p:plain
f:id:mitsunooon:20210330135556p:plain
f:id:mitsunooon:20210330135606p:plain


フォーム入力例
f:id:mitsunooon:20210330135623p:plain

フォームを送信すると、受理のメールが届きます。

変更完了後の確認

名前の更新が完了すると、氏名変更されたTranscriptが添付された変更完了メールが届きます。
私の場合はフォームを送ってから28時間後くらいに来ました。
Microsoft LearningやピアソンVUEのダッシュボードを見に行くと、名前が変わっていることが確認できました。

※補足

私は旧姓で試験を申し込み、受験日の3週間くらい前に新姓への変更手続きを行いました。
ピアソンからの予約案内メールには
「登録時に使用した氏名と、受験当日に提示する本人確認書類2点に記載されている氏名が同一である必要があります。」
とあったので、申し込み時点での名義(旧姓)が有効かと思っていましたが、当日はちゃんと新姓のほうで受付されました。
ややこしいことはするもんじゃないですね。

AADの非管理者がアプリケーションを登録できないようにする

はじめに

Azure Active Directoryで組織内の非管理者がアプリケーションを登録できないようにします。

手順

Azure Portalにサインインし、Azure Active Directoryを選択します。
f:id:mitsunooon:20210117174827j:plain


[ユーザー設定]を選択します。
[アプリの登録]で、[ユーザーはアプリケーションを登録できる]を[いいえ]に切り替えます。
[保存]をクリックして変更を保存します。
f:id:mitsunooon:20210117174843j:plain


保存後に非管理者のユーザーでアプリの登録をしようとすると、
[アクセス権がありません]の画面が表示され、無事登録できなくなりました。
f:id:mitsunooon:20210117174910j:plain


管理者であればちゃんと登録画面が出ます。
f:id:mitsunooon:20210117174920j:plain

Azure Active Directoryの動的グループの作成

はじめに

Azure Active Directoryのグループに動的メンバーシップの条件を設定して、
その条件に一致するユーザーは自動的にグループに追加するようにします。
動的に設定されるグループ メンバーシップのルール - Azure AD | Microsoft Docs

今回は利用場所が日本のユーザーを自動で追加するグループを新規作成します。

手順

Azure Active Directory admin centerにサインインします。
Azure Active Directory admin center

ダッシュボードにアクセスしたら、
左側のナビゲーションペインの[すべてのサービス]をクリックします。
f:id:mitsunooon:20210105133010j:plain

[グループ]をクリックします。
f:id:mitsunooon:20210105133027j:plain

[新しいグループ]をクリックします。
f:id:mitsunooon:20210105133043j:plain

各項目を入力します。
今回の作成に必要な項目としては、[メンバーシップの種類]を[動的ユーザー]にします。
f:id:mitsunooon:20210105133058j:plain

[動的クエリの追加]をクリックします。
ここでいろんな条件を設定します。
今回は利用場所が日本のユーザーが対象になりますので下記の設定を入れます。
プロパティ:usageLocation
演算子:Equals
値:JP

f:id:mitsunooon:20210105133120j:plain

[ルールの検証]で設定した条件の検証ができます。
既に対象ユーザーが存在するのであれば検証できるのはいいですね。
f:id:mitsunooon:20210105133141j:plain

[保存]をクリックします。
[作成]をクリックします。
f:id:mitsunooon:20210105133202j:plain

グループが作成され、しばらくすると自動で対象のユーザーが追加されるようになります。
f:id:mitsunooon:20210105133211j:plain