落とし穴に立て札を立てるが如く

ハマりどころの解決が少しでも早くなることを願って書いていきます

隠せーーーー!!!デリケートなデータを隠すSQL Databaseの動的データマスク

f:id:nam_yu_sql:20210131165214j:plain この記事は後でclouf.config tech blogにマルチポストしています。

tech-blog.cloud-config.jp

はじめに

どうも、データベース設計やチューニングタスクが降ってくるのに備えて毎日素振りを欠かさないなむゆです。
最近DP-300の試験を受けようかと考えていて、その学習途中で触って気になったSQL Databaseの機能の「動的データマスク」について一席打ちたいと思います。

動的データマスクとは

動的データマスクとは、特権のないユーザーに対してデリケートなデータをマスクして表示し、データの公開を制限する機能です。
例えば、データベースの電話番号を保存するカラムをSELECT文で取得したとき、普通は全部のデータが表示されますが、この機能によって指定した電話番号のカラムに保存された番号全体を「XXX-XXX-XXXX」と表示したり、あるいは頭3文字だけ表示させたりといったことが可能になります。

使い方の例

まずは適当にSQL Databaseのインスタンスを作ります。
f:id:nam_yu_sql:20210131165319p:plainサーバーファイアウォールの設定」から現在のIPからの接続を許可することを忘れずに!
f:id:nam_yu_sql:20210131165343p:plain テーブルと初期データを挿入していきます。
SQL Databaseのクエリエディターで以下のようなクエリを打ちます。

CREATE TABLE [dbo].[User](  
    [UserId] [uniqueidentifier] NOT NULL,  
    [UserName] [nvarchar](max) NOT NULL,  
    [MailAddress] [nvarchar](max) NOT NULL,  
    [PhoneNumber] [nvarchar](max) NOT NULL,  
 CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED   
(  
    [UserId] ASC  
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]  
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]  
INSERT [dbo].[User] ([UserId], [UserName], [MailAddress], [PhoneNumber]) VALUES (N'a65571b6-a0d2-4711-a2b2-4dc7127ad901', N'Namuyu', N'namuyu@namuyuno.com', N'012-345-6789')  
INSERT [dbo].[User] ([UserId], [UserName], [MailAddress], [PhoneNumber]) VALUES (N'9fe245ea-a570-41c1-8ebf-9bd95d17c0ed', N'FumiFumi', N'fumifumi@fumii.com', N'098-765-4321')  

上記のクエリでUserテーブルとそこに2つ分のデータが挿入されます。
中でもメールアドレス(MailAddress)と電話番号(PhoneNumber)は機微なデータになります。
これらをいい感じに隠していきます。

Azure Portalの作成したSQL Databaseのメニューから「動的データマスキング」を選びます。
f:id:nam_yu_sql:20210131165356p:plain そうするとSQL Database上にあるマスキングした方がよさそうなカラムが自動でいくつかピックアップされます。マスキングしたいカラムは「マスクを追加」をクリックしてマスキングするルールに追加します。
f:id:nam_yu_sql:20210131165416p:plain 次はマスキングするルールでどのようなマスキングを施すか設定していきます。
設定したいルールをクリックして設定を開きます。
f:id:nam_yu_sql:20210131165425p:plain 例えばMailAddressのカラムには「電子メール」を選択します。選択したら「更新」を押しておきましょう。
f:id:nam_yu_sql:20210131165442p:plain 「電話番号」のカラムではもう少しカスタムしたフィールドを設定してみましょう。
マスクフィールド形式では「カスタム文字列」を選択します。
そうすると下に「公開されたプレフィックス」「文字列のパティング」「公開されたサフィックス」を設定するテキストボックスが出てきます。
この中の、プレフィクスとサフィックスはそれぞれ頭から何文字、最後から何文字は見せる形でマスキングをかけるかを設定します。
そして文字列のパディングはそれ以外の部分をどんな文字列で置き換えてマスキングするかを設定できます。
今回は公開されたプレフィックスは3文字、パディングは公開される3文字以降を全部Xで置き換えた「-XXX-XXXX」、差フィクスは0文字で設定してみましょう。
こちらも設定できたら更新を押して戻ります。
最後にマスクルール全体を「保存」を押して保存して設定完了となります。
f:id:nam_yu_sql:20210131165450p:plain これだけだけどこれだけじゃない!
この動的データマスクはデータベースの管理者には適用されません。データベース管理者(SQL Databaseの作成時に設定するアカウントがそれ)はDB作成初期から存在して最強の権限を持っている神なので少なくともその権限ではデータ全体を確認できるようになっています。
なので、動的データマスクによるマスキングが適用される一般ユーザーを作っておきましょう。
f:id:nam_yu_sql:20210131165458p:plain 再びクエリエディタに戻り、ユーザー作成のクエリ、権限付与のクエリを順に打ちます。
画像を参考にパスワード等はそれぞれ考えて設定してください。
f:id:nam_yu_sql:20210131165506p:plain 設定できたらクエリエディタ左上の「ログイン」から今しがた作成したユーザー情報でログインします。
そして、以下のようなクエリを打ってみましょう。

SELECT * FROM [User]  

すると画像のようにメールアドレスや電話番号がマスクされた結果が出力されるはずです!
f:id:nam_yu_sql:20210131165519p:plain ついでなので元の管理者ユーザーで再度ログインして同じクエリを打ってみましょう。
f:id:nam_yu_sql:20210131165528p:plain 今度は全部のデータが見えてしまいました。見てしまいましたね?

このようにして開発者でもあまり見てほしくないデータについては動的データマスクを施したうえで開発者には動的データマスクが行われる一般ユーザーでDBの操作を行ってもらい、一方でアプリケーションは動的データマスクの影響を受けないユーザーを使わせるような設定ができます。
これにより、アプリケーションでは必要なデータをすべて使うことができ、、開発者がデータベースを覗くときにはそれらのデータは見えないようにすることがでいます。

おわりに

今回はSQL データベースの機能でユーザーがデリケートな情報を見ようとしたときに自動でマスクがかけられる動的データマスクについて紹介しました。
これを使うことで、アプリケーションの機能には影響を与えずに「たとえ開発者といえどもユーザーの個人情報を見てはならない」といった要件にも対応できるようになります。
機微な個人情報を扱う際の要件によって出番が増えそうな気がする機能ですので、「こんなのあるんだ」と心に留めていただけると幸いです。

参考

Windows10 HomeのPCにDocker Desktopを使ってkubernetesを導入する

f:id:nam_yu_sql:20210125212250j:plain この記事はcloud.config tech blogにマルチポストしています。

はじめに

Kubernetes、触ってますか?
普段は業務で触っているKubernetesですが、家でも学習用に環境を整えようとしたところかなり苦労した挙句やっとこさインストール方法を見つけることができました。
身の回りにもkubernetesやDockerのインストールで詰まる人を見かけるので今回はその時の導入手順をメモして共有しておきたいと思います。

Docker Desktopを使ってkubernetesを導入する

大雑把な方法としては、Docker Desktopには機能の一つとしてシングルノードのKubernetesを立てる機能が含まれているので、それを使ってWindows host上にkubernetesクラスターを立てます。
windows host上にkubernetesクラスターを立てる方法として他にminikubeを使う方法などもありますが、それよりシンプルに実行できるので個人的にはおすすめです。

Linux カーネル更新プログラム パッケージをダウンロード

まずはLinux カーネル更新プログラム パッケージをダウンロードします。
Docker Desktopでは仮想化に使用するWSL2を自動でインストールしてくれるのですが、そのために使用するLinix カーネルの更新プログラムを実行しておくする必要があります。
msdnのWSLのインストール方法の手順4にある「x64 マシン用 WSL2 Linux カーネル更新プログラム パッケージ」をダウンロードして実行しておきます。
これでDocker Desktopのインストールの準備は完了です。

Docker Desktopをインストール

DockerHubのサイトからDocker Desktopをダウンロードし、インストールします。
このとき、「Install required Windows components for WSL2」のチェックボックスにチェックを入れておきます。
チェックしたらOkをクリックしてインストールを行います。
f:id:nam_yu_sql:20210125212559p:plain なお、このタイミングでkubectlなどの後々必要になるツールも自動でインストールされます。便利!

kubernetesを有効化

タスクバーのDockerのアイコンを右クリックし、「Dashboard」をクリックします。
Dashboard上部の歯車のアイコンからセッティング画面に移動します。
セッティング画面のメニューからKubernetesを選びます。
f:id:nam_yu_sql:20210125212635p:plain Kubernetesのオプションの中で、「Enable Kubernetes」のチェックボックスをチェックします。
f:id:nam_yu_sql:20210125212648p:plain 「インストールには時間がかかるよ~」というような文言が出るので、「Install」をクリックします。
f:id:nam_yu_sql:20210125212655p:plain しばらく時間が経った後、インストールが完了してdashboard下にDockerのマークとその横にkubernetesのマークが出ていれば完了です。
f:id:nam_yu_sql:20210125212704p:plain このタイミングで、Docker Desktopを利用して立てたkubernetesクラスターに接続するためのkubeconfigの追記等が自動的に行われるようです。
なので、Powershellなどを開いてkubectl config get-contextのコマンドを打つと、現在docker-desktopのコンテキストが存在していてそれを利用していることが確認できます。

CURRENT   NAME             CLUSTER          AUTHINFO         NAMESPACE                                                    
*         docker-desktop   docker-desktop   docker-desktop          

もちろんこの状態からマニフェストファイルを適用するなどして作業を開始することができます。

幸せなkubernetesライフを!

おわりに

今回はWin10 Homeユーザー向けにローカル環境でのシングルノードのkubernetes環境の構築方法を共有しました。
普段使いの家のPCでkubernetesの学習環境を立ち上げたくなった時の方法はいくつもあり、結構複雑に感じる方法もあります。
その中でDocker Desktopを使う方法は個人的にシンプルでわかりやすく、手数も少なく済んだと感じています。
自宅でもkubernetesを触りってみたいという方に役立てば幸いです。

参考

【小ネタ】Kubernetesでアプリへのリクエストに503が返って七転八倒斎したお話

f:id:nam_yu_sql:20210125064953j:plain

この記事はcloud.config tech blogにマルチポストしています。

tech-blog.cloud-config.jp


# はじめに
kubernetes社内最強になりたいなむゆです。
最近Kubernetes上にアプリケーションをデプロイしていて、ルーティング周りでエラーシュートをしました。
その時起きていた問題について色々キーワードで調べても(kubernetes 503 VirtualService とか)あまり問題解決につながる情報が出てこなかったのでメモしておきます。

# 起きたこと
アプリケーションにAPIを追加したのでVirtualServiceにそのAPIへのルーティングを加え、applyしました。
それ以降、kubernetesにデプロイしているserviceの、新たにVirtualServiceに追加したルーティング以外のアプリのAPIのパスに対するリクエストに対して503が返ってくるようになりました。
ログを見ると、APIのPodログには正常にレスポンスが返っているときのログは残っているのですが、503が返ってくるときのログは残っていませんでした。
istio-ingressgatewayのPodのログを確認すると、503のエラーが返った履歴が残っていました。
そのアプリをローカルで実行すると全APIから正常にレスポンスが返りました。
これらのことから、アプリケーションのPodは正常に動作していてistio-ingressgatewayまでリクエストはやってきているもののVirtualServiceに書いてあるルーティングか何かでコケているんじゃないかと考えました。
VirtualServiceのrouteもちゃんと設定してあるしhostの設定もドキュメントにあるとおりに、`{service名}.{namespace}.svc.cluster.local`にしてあるし・・・(そもそも一部APIは正常にルーティングされたので当然といえば当然)
ということで謎にハマりました。

# 原因
別のnamespaceに更新前のVirtualServiceが生きていました。
VirtualServiceの更新時にnamespaceが他と被りそうで怖かったのでそちらも更新していたのですね。
すると、metadataの中身が変わったのでkubernetesとしては「あ、別のオブジェクトなんだな~」と勘違いして、新しいVirtualServiceのオブジェクトを作ってしまっていました。
VirtualServiceは、同じ条件のuriに対してルーティング先が複数あるとエラーを起こして503を返すようです。(一次ソース見つからず。なぜ?)
今回は古いVirtualServiceと新しいVirtualServiceが両方存在してしまっていたためにuriの条件が競合してエラーが起きていたようです。
古い方のVirtualServiceを削除したところ、問題は解決しました。

# 教訓
マニフェストファイルのmetadataを変更したらkubernetes上の元のオブジェクトは消しましょう。  

同じ部分で詰まったほかの人の役に立ちますように・・・

Google版の開発者向けサイト(Beta版)のGoogle Developer Profileっていうのがあるんだって

f:id:nam_yu_sql:20210121081936j:plain この記事はcloud.config tech blogにマルチポストしています。

tech-blog.cloud-config.jp

Google Developer Profileっていうのがあるんだって

最近Google技術のコミュニティの勉強会で教えてもらって知ったのですが、GoogleのサイトでGoogle Developer Profileというものがあるみたいです。
これはGoogle版の開発者向けサイトで、登録することで学習コンテンツの学習状況やコミュニティへの参加状況を保存できるサービスみたいです。
去年の10月ごろにオープンされたようなのですが、今もBeta版で機能は開発中みたいです。
f:id:nam_yu_sql:20210121081937p:plain

使い方

使い方は簡単で、トップページの「Create Developer Profile」から各種情報を記入します。
f:id:nam_yu_sql:20210121082036p:plain あとはGoogle Developer Profileの更新情報のメールを受ける場合はチェックボックスにチェックしてFinishを押して完了です。
f:id:nam_yu_sql:20210121082044p:plain

こんなコンテンツがあるよ

ホーム画面では実績のバッジが確認できます。
ここのバッジは学習コンテンツの学習状況やコミュニティへの参加などの実績でバッジが獲得できるそうです。
登録しただけでも登録したのとベータバージョンに登録したバッジが解放されました。
f:id:nam_yu_sql:20210121082053p:plain Pathwayからは各種学習コンテンツのページに飛ぶことができます。
動画教材や実際にGCP環境でリソースを立てて学習を行うCodelab等を通してGoogle関連の技術を学ぶことができます。
章末問題は結構難易度高めです。
単語を記入する問題なんかもあります。
f:id:nam_yu_sql:20210121082101p:plain その他、TopicsにおいてはDatabaseやFirebaseなどのGoogle技術のトピックごとに資料が集約されています。
例えばぼくらのお気に入りの簡単にWebアプリをホストできちゃうFirebaseだと・・・
f:id:nam_yu_sql:20210121082111p:plain Firebase関連のドキュメント、アップデート、教材(Pathway)、動画などといったコンテンツが1ページにまとめられています。
「Firebaseについていろんなコンテンツを見たい!」という気分の時にはもってこいって感じがします。
f:id:nam_yu_sql:20210121082121p:plain また、他にもGoogleの技術系イベントがまとめられているページなどもあります。イベント内で公開された動画なども見ることができます。
f:id:nam_yu_sql:20210121082145p:plain GDGというGoogleの技術者コミュニティに関する情報のページもあります。
f:id:nam_yu_sql:20210121082200p:plain GDGはGoogle Developers Groupの略で、Googleとは独立したGoogle関連の技術に関する開発者グループです。
こちらで詳しく紹介されています。
一つ一つのグループは「Chapter」と呼ばれ、日本国内にもいくつか存在し、大体「GDG○○」という名前で定期的に勉強会を行っています。
例えば地元の四国の周りだと、「GDGShikoku」というチャプターがあり、AndroidやFirebase、Go言語に関するハンズオンやもくもく会を開いています。
私も過去何度か参加したことがあります
最近は時節柄オンラインでも色々なイベントを開いているようですね。
Google Developer ProfileのGoogle Developer Groupsのページでは、このような技術者グループの情報を閲覧することができます。

おわりに

今回はGoogle Developer ProfileというGoogleの技術者向けサイトがあるんだよ~ってお話でした。
まだまだBeta版ということで、これからも機能が増えていったりするかもしれません。
自分もちょくちょく覗いていこうと思います。

Azureの勉強しててクラウド死したくないので!課金アラートの設定のやり方

f:id:nam_yu_sql:20210120083018j:plain この記事は後ほどcloud.configのtechblogにマルチポストします。

はじめに

最近Kubernetesの勉強をしているなむゆです。
特にAKSについて勉強するために自前のサブスクリプションにリソースを立ててみたりもするのですが、AKSって今のところ一番安くてひと月4000円からかかるんですよね。
数日間リソースを立てっぱなしにした日にはすぐに1000円以上課金されたりしてしまいます。
というか今月そんな調子です。
できれば一定金額以上使ったらそれ以上使えないようにしたいのですがそういう方法が見つけられなかったので、次善策として「今月の課金額が〇〇円を超えたよ~」というアラートを設定するようにしているので今回はその方法の共有です。

課金アラートの設定方法

まずはAzureのポータル画面の上部の検索欄で「サブスクリプション」を入力して検索し、選択します。
f:id:nam_yu_sql:20210120083028p:plain するとサブスクリプションの一覧画面に移るので、自分が今使っているサブスクリプションを選択します。
f:id:nam_yu_sql:20210120083038p:plain するとそのサブスクリプションの情報が表示されるので、左のメニューの一覧から「コストのアラート」を選択します。
ちなみに、すぐ上の「コスト分析」をクリックすると現在の課金額が確認できますよ。
f:id:nam_yu_sql:20210120083047p:plain 課金額が一定を越した際にアラートを設定するには画面上部の「追加」をクリックします。
f:id:nam_yu_sql:20210120083056p:plain すると、予算の作成の画面に移動します。
名前と予算額を設定するのですが、ここでいう予算額が「だいたい毎月使うのはこのくらい」という値で、あとでアラートを発する課金額の閾値のベースの値になります。
設定したら「次へ」をクリックします。
f:id:nam_yu_sql:20210120083110p:plain 次は、アラートを発する条件とアラートを送信するメールアドレスを設定します。
算額をベースに、予算の何%の課金がされたタイミングでアラートを送るかを設定できます。
算額に達したタイミングでメールを送りたい場合は100%でも問題ないですが、念のため200%とかでも送るようにした方がいいかもです。
予算の100%を超えたくらいだったら大抵無視するし予算の2倍も使ってますよってアラートが来たら「さすがにやべぇ」って気分になるじゃないですか。
余談はさておき、他に送信するメールの言語も設定して、「作成」をクリックします。
f:id:nam_yu_sql:20210120083117p:plain これで設定は完了です!
課金額が指定した閾値を越すとこのようなメールが届きます。やべぇ。AKS止めなきゃ。というかローカルでminikube立ててもいいな・・・
f:id:nam_yu_sql:20210120083126p:plain

おわりに

今回はAzureの課金額でアラートを発する方法を共有しました。
課金額周りで色々調べたり予算設定したりアラートを発する機能はサブスクリプション周りに集まっていて、個人で使う時以外でも組織上の目的でも色々使うことになると思います。
参考に書いているドキュメントあたりが取っ掛かりになるかと思うので、その周りから調べてみると目的に合うものが見つかるかもしれません。
今回も読んでいただきありがとうございました。
お役に立てれば幸いです。

参考

Dockerfile正しいかわからないなら、試しにローカルでbuild & runしてみようぜ(.Net Core Web API)

f:id:nam_yu_sql:20210117191606j:plain この記事はcloud.config tech blogマルチポストしています。

はじめに

みなさん、Dockerfile書いてますか?
この記事を見ている方は何らかの理由でDockerfileを書くことになった方と思います。
今回はそんな方の助けになることを目指して、ローカルでDockerfileを使ってコンテナをビルドし、動作確認する方法で一席打ちたいと思います。

前提

  • Dockerがインストールされている
    アプリを立ち上げるマシンにDockerが必要です。
    まだインストールしていなければ公式サイトからインストールしておきましょう。
    https://www.docker.com/products/docker-desktop
  • Visual Studioがインストールされていて.Net Coreアプリ開発のためのSDKがインストールされていること
    今回はビルドするアプリの例として、.Net Core3.1のWeb APIを作成します。
    そのため、開発環境としてVisual Studioをインストールしてください。
    Community Editionであれば無料で使用できるので、ダウンロードしてインストールしましょう。
    インストールするワークロードを選択する画面で以下の部分にチェックを入れてインストールされていれば大丈夫です。
    f:id:nam_yu_sql:20210117185419p:plain

実際にやってみる

1. テンプレートのアプリケーションを作る

今回は.Net Core3.1のWebAPIのアプリケーションをサンプルとしてつくりたいのでその方向でセットアップしていきます。
まずはVisual Studioを起動します。
新しいプロジェクトを作りたいので「新しいプロジェクトの作成」をクリックします。
f:id:nam_yu_sql:20210117185434p:plain 「ASPNET Core Webアプリケーション」をクリックして次へ進みます。
f:id:nam_yu_sql:20210117185504p:plain プロジェクト名を設定します。今回は「testWeatherForecast」として「作成」をクリックします。
f:id:nam_yu_sql:20210117185535p:plain しばらくするとテンプレート状態のアプリケーションが作成されます。
今回は特に弄らずこれをサンプルとしてコンテナにするので、このまま次に進みましょう。

2. Dockerfileを作る

作成したアプリケーションがあるディレクトリをエクスプローラーなどで開きます。
特に設定していなければ大抵C:\Users\{ユーザー名}\source\repos\testWeatherForecastのパスに存在するはずです。
そこにファイルを新規作成し、Dockerfileという名前で保存します。
拡張子等は設定しません。

そして、そのファイルをエディタ等で開いたら、中にこちらのサンプルのDockerfileをコピー&ペーストしてきます。
Dockerfileをコピーしてきたら、その中の必要な個所を置き換えます。
置き換えるのは以下の2点です。
- 1行目と14行目のmcr.microsoft.com/dotnet/core/sdk:3.0mcr.microsoft.com/dotnet/core/sdk:3.1に置き換えます。
- アプリケーションのプロジェクト名のaspnetappは全部testWeatherForecastに置き換えます。
Dockerfileの作成と内容の書き換えはこれで以上です。

今回は.Net Core3.1のアプリケーションの例でDockerfileを作成していますが、他のフレームワークのアプリケーションでも、テンプレートとなるようなDockerfileは大抵どこかしらで公開されているので、Dockerfileを作るときは0から作る必要はないことが多いです。
Dockerfileにあまり触れたことがない場合は、何かのアプリケーションのコンテナを作る時にそのアプリケーションを動かすフレームワークのDockerfileのテンプレートを探して、それをベースにしてコンテナの軽量化などのためにカスタマイズしていくパターンが鉄板かと思います。
余談でした。

3. コンテナをbuild & run する

以下はコマンドプロンプトPowershell等のコマンドラインツールを用いて行います。
まずは、cdコマンドを用いて今回作成したアプリケーションのslnがあるディレクトリまで移動します。
そこまで移動できれば、コンテナをbuildします。
docker build -t weather:test .
エラーがなければしばらくたつとコンテナのイメージが生成されます。
docker images
とコマンドを打つと、buildしたコンテナの情報が表示されるはずです。
それでは、そのコンテナをローカルのマシンに立ち上げてみましょう。
以下のコマンドを打つとアプリケーションのコンテナがローカルのマシン上で起動し、APIとしてリクエストを受け付ける状態になります。
docker run weather:test
うまくいくと、info: ~~~で始まるログがいくらか吐き出され、起動状態になります。

4. ちゃんと動いているか試す

ブラウザを開き、urlの欄にlocalhost:9000/weatherForecastを入力してリクエストしてみます。
そうすると、コンテナ起動時に設定したようにポート番号9000番はコンテナのポートの80番にポートフォワーディングされるので、weatherForecastのAPIにリクエストを送ることができます。
ブラウザ上に以下のようなjsonの文字列が表示されていれば成功です!
f:id:nam_yu_sql:20210117185557p:plain

5. 後片付け

このテスト用のコンテナはいつまでも起動させておくわけにもいかないので、最後は削除しておきます。

docker psのコマンドを実行して立ち上がっているコンテナの状態を確認します。
IMAGEが立ち上げたコンテナの「weather:test」であるものを探し、そのコンテナのIDをメモします。

次に、docker container rm {メモしたコンテナID} -fのコマンドを実行し、立ち上がっているコンテナを削除します。

最後に、作成したコンテナイメージを削除します。
docker image rm weather:test

これで今回作成したDockerのリソースを削除できました。

おわりに

今回はサンプルで作成したアプリケーションを元にDockerfileからローカルでコンテナを作成、実行してみました。
Dockerfileの書き方はアプリケーションによって異なりますが、大抵はアプリケーション毎に使えるテンプレートが公開されています。
何かのフレームワークを使って初めてコンテナ化を試みる場合はそういったものを頼るのは最初のとっかかりとして適しているかと思います。

また、Dockerfileを作ったとき、コンテナを実行環境に上げる前には一度動作確認を取ってみましょう。

幸せなコンテナ開発を!

思考を整理するのに使えるオンラインホワイトボードMiroの個人的な使い方あれこれ

f:id:nam_yu_sql:20210115083150p:plain この記事はcloud.config tech blogにマルチポストしております。

tech-blog.cloud-config.jp

昨今リモートワークが推奨されていますが、そんな時節のせいなのか過去に自分が書いたブログ記事の中ではオンラインホワイトボードMiroの記事はやけに読まれています。
前回Miroについて書いてから時間が空き、一般的な部分の説明はほぼほぼやりつくしてしまった感じもするのですが、今回は自分が普段どのようにMiroを使っているかを示しながら思考の整理について語ってみようと思います。

Miroとは

MiroはMiro者が開発しているWebアプリケーションで、Miro社曰くはonline collaborative whiteboard platformと呼んでいます。日本だとよく「オンラインホワイトボード」と呼ばれています。
元々はRealtime boardという名前のアプリで会社名もRealtimeboard.incだったのですが、2019年にアプリの名前が変わり、その時に社名も変更したようです。
主な機能は、ホワイトボードを使うような直感的な図の作成機能と、それをリアルタイムでほかのユーザーと共有する機能です。
例えば、左のメニューから付箋のアイコンを選んで好きな色を選んだら・・・
f:id:nam_yu_sql:20210115083211p:plain 適当な場所をクリックするだけでそこに付箋を張り付けることができます。
f:id:nam_yu_sql:20210115083221p:plain 関係性を示したいときは付箋をクリックしたときに出てくる青丸をほかの物体にドラッグしてやれば簡単に矢印を引くこともできます。
f:id:nam_yu_sql:20210115083230p:plain 矢印を引くときはさりげなく他の物体に吸い付いてくれたりしてくれるのでさりげなく使い勝手がいいです。

こんな基本機能のMiroですが、普段自分がどのようにMiroを使っているかご紹介したいと思います。

いろんな使い方

例えば、自分の場合すごくシンプルなTodoリストのボードを作っています。
タスク管理ツール自体はMiro以外にもあり、より高機能なものも色々あります。
なのでMiroをタスク管理ツールとしてチームで使うことはあまりありませんし自分もいつも使っているわけではないのですが、やることが増えてきて混乱しそうになった時に頭の中のダンプ先として個人的なTodoリストとしてMiroを使っています。仕事以外のタスクも一緒に突っ込めるのも利点かもです。
直感的に素早くタスクを付箋にして張り出せるのと、タスク間の依存関係を矢印で示したりして何が「待ち」の状態になっているか分かりやすく示せます。
f:id:nam_yu_sql:20210115083240p:plain また、読んだ本の内容をまとめて勉強会の資料にしたりしています。
色分けができるので、赤い付箋はこの章の問い、そこに向かって引いている矢印はその問いに対する答えを示すなど、役割を持たせられます。
f:id:nam_yu_sql:20210115083254p:plain 勉強会や話を聞くときのメモとして利用したこともあります。これはいつぞやGlobal AI Nightに参加したときのメモですね。講義を受けながら、後ろではこんなメモをとってました。
ぜひ記事と見比べてみてください。
f:id:nam_yu_sql:20210115083309p:plain 他に、何かの処理のロジックを整理するためにフローチャートのようなものを書いたこともあります。Miroの基本的な機能で図形を描くこともできるので、このような使い方もできます。他にもお見せできる内容ではないのですがシーケンス図なんかも書いています。
f:id:nam_yu_sql:20210115083320p:plain 他にも、ここで示すことはできないのですが仕事の中で考えていることがややこしくなってきたときにMiroはよく使います。
書いたことをほかの人に見せることはほとんどないのですが、「何かに悩んだらそれを書き出してみる」というのは問題解決のいい方法だと言われているのを個人的には信じているので、そのためのツールとして使っています。
普段このように思考を整理するのにMiroを使うことが多いのですが、指向を整理するのに何やるかといったら頭の中で考えているとりとめのないことを列挙してそこから関連するものをまとめて整理したり一つ一つの問題に対する回答を結び付け足りしていると思います。
Miroでは一番基本的な機能として付箋を貼ってそれらを矢印で結びつけることができるのですが、それがこういった思考の整理に役立っている気がします。
自分が書いたMiroの最初の記事が思考のロギングの話だったのもそこから来ています。

おわりに

今回は普段よく使っているMiroについて個人的によくやる使い方の例からMiroについて語ってみました。
私はMiroは自分の考えをまとめるために一人で使いがちですが、リモートワーク環境下で意思疎通のために複数人で使うこともできます。ぜひ一度使ってみてください。