Azure の詳細

何から何まで: ハードウェア部品をクラウド対応のデバイスへ

Bruno Terkaly
Steven Edouard

Bruno Terkaly and Ricardo Villalobos新しいゴールド ラッシュが起きています。今回は、貴金属を求めるものではなく、消費者向けの革新的なデバイスを作ってクラウドに接続することを競います。今年 3 月、マイクロソフトの新しい CEO の Satya Nadella は「クラウドを利用できなければまったく面白味がない」と述べています。

その通りです。デバイスがセンサーやカメラから情報を収集したら、どこで、どのように、収集したデータを分析することになるのでしょう。いずれにせよ、Raspberry Pi のようなローエンド デバイスの計算処理能力や記憶領域には限りがあります。そこで、クラウドを利用してセキュリティ、デバイス管理などをサポートすれば、ローエンド デバイスの欠点を補うことができ、さらに進化できるようになります。今月は、ハードウェアとソフトウェアの両方の立場で作業を行い、この新しいコンピューティング パラダイムを活用するために必要なことについて説明します。

今回ゼロから構築しようと考えているのは、「SmartDoor」というモノのインターネット (IoT) 製品です。最終形は、ドアベル、カメラ、および Raspberry Pi コンピューティング デバイスを取り付けたものです (図 1 参照)。考え方はこうです。だれかが家を訪れて玄関のドアベルを鳴らします。すると、SmartDoor が自動的に写真を撮影し、この写真をプッシュ通知メッセージとしてモバイル デバイスに送信します (図 2 参照)。この通知メッセージには、玄関の前に立つ人物を撮影した画像へのハイパーリングを設定します。この発明は、家にいなくても、だれがドアベルを鳴らしたかを知りたいというニーズから思いつきました。

ドアベル、カメラ、および Raspberry Pi デバイスを組み合わせる今回のプロジェクト
図 1 ドアベル、カメラ、および Raspberry Pi デバイスを組み合わせる今回のプロジェクト

プッシュ通知を受信する Windows Phone
図 2 プッシュ通知を受信する Windows Phone

最初に、ハードウェア部品を購入して組み立てる方法から説明します。ハードウェアが完成したら、そのハードウェアで実行するソフトウェアと Microsoft Azure で実行するソフトウェアを作成します。ただし、今回も次回以降も主に必要なソフトウェアに重点を置いて説明します。

ソフトウェアとしては、写真を撮影して Azure にアップロードするコードが必要です。次に、プッシュ通知を適切なモバイル デバイスに送信するコードも必要です。つまり、だれかがドアベルを押すことによって、その人物の写真を撮影できます。このプロジェクトは新しく大胆な試みなので、多くのブログ記事を紹介して、作業のサポートや必要な情報を提供します。

実に簡単

Raspberry Pi デバイス自体で実行するコードと、クラウド (具体的には Microsoft Azure Mobile Services) で実行するコードを作成します。Raspberry Pi には、Mono をインストールして実行するつもりです。Mono は、Xamarin が主導するオープン ソース プロジェクトで、C# コンパイラー、CLR など、Microsoft .NET Framework 互換の一連のツールを提供します。

Mono が優れている点は、Windows でコンパイルされる .NET コードを記述して、そのまま Raspberry Pi で実行できることです。今回は、写真を撮影して Azure ストレージにアップロードします。次回は、このコード ベースを拡張して、Windows Phone へのプッシュ通知の送信をサポートします。そのためには、Microsoft Azure Service Bus のプッシュ通知を活用して、Windows ストア アプリまたは Windows Phone アプリを作成する必要があります。

Canakit という 1 つの Raspberry Pi キットでほぼすべてのハードウェアを利用できるため、ハードウェアの組み立ては簡単です。詳細については canakit.com (英語) を参照してください。Canakit には、今回の IoT デバイスの組み立てに役立つ、システム ボード、AC アダプター、汎用入出力 (GPIO) ブレークアウト、実験用回路板、回路板のケーブル、さまざまな IC や LED が含まれています。また、Raspberry Pi を構成してテストできるように、外部モニター、キーボード、およびマウスが必要です。Canakit 以外に、一般的なドアベルと Raspberry Pi 互換のあるカメラが必要です。どちらも簡単に手に入ります。

図 3 に示す山のようなハードウェアを見ておじけづくかもしれませんが、実際の組み立ては簡単です。SmartDoor のようなデバイスは、ジグソー パズルを解く力があれば組み立てられます。まず、カメラ モジュールを Raspberry Pi ボードに接続します。カメラを用意して、カメラのフレックス ケーブルを Raspberry Pi ボードに取り付けます。クラウドに写真を送信する方法の詳細については、bit.ly/1rk3vzk (英語) を参照してください。

Raspberry Pi Canakit (カメラは含まない)
図 3 Raspberry Pi Canakit (カメラは含まない)

Raspberry Pi へのはんだづけが必要なドアベル自体の取り付けについては、次回以降に詳しく説明します。ここで、Raspberry Pi に接続する電気回路のテスト バージョンである実験用回路板を取り付けます。ジャンパー ケーブルと実験用回路板を使用して、ドアベルのシミュレーションを行います。

中核となるコンポーネントの 1 つが GPIO 実験用回路板です。GPIO は 26 ピン (ピン番号は左から右) のハードウェア回路で、別のデバイスと対話するようにシステムを拡張します。一般に、このピンを使用して、センサー、アクチュエータ、LED などと接続します。ただし、ピンにはさまざまな種類があります。たとえば、接続したデバイスに電源を供給するピンが 2 つあります。1 つは 3.3 v、もう 1 つは 5 v の電源を供給します。アースの役割を果たす 0v ピンもあります。これは回路を規定します。GPIO というラベルが付いたピンは、単純なオン/オフ スイッチとして機能します。シリアル通信を実行する場合は、データ送受信用に TX ピンと RX ピン (RS-232) があります。デバイスで実行するソフトウェアは、この TX ピンと RX ピンと通信する必要があります。

TX ピンと RX ピンを扱ううえで複雑なのは、物理ピンと、ソフトウェアが通信する論理ピンが一致しない点です。これは、Raspberry Pi デバイスの Broadcom チップと関係があります。つまり、信号がピン GPIO 0 に届いた場合、実際にはソフトウェアでピン GPIO 17 を読み取る必要があります。これは論理的ではないため注意が必要です。

他にも、重要なハードウェア コンポーネントがあります。抵抗器は電流の制御と電圧レベルの低下に重要な役割を果たし、抵抗器に接続されている Raspberry Pi などのデバイスが過剰電流で故障しないようにします。また、GPIO ユニットを Raspberry PI に接続する単心ケーブルも必要です。

テストに次ぐテスト

ハードウェアを組み立てたら、組み立てが正しいかどうかを検証する必要があります。Raspberry Pi をテストする最も簡単な方法は、単純に外部モニター、キーボード、マウス (オプション)、電源を接続することです。接続して電源を入れると、Linux のブート シーケンスが表示されます。既定のユーザー名は "pi" で、パスワードは "raspberry" です。Raspberry Pi のセットアップの詳細については、bit.ly/1k8xBFn (英語) を参照してください。

Raspberry Pi で C# を実行できるようにするには、Mono などの追加のソフトウェアが必要です。デバイスで処理を実行する前に、まずは Raspbian OS を更新する必要があります。さいわい、Pi にはプレインストール版の OS が搭載されています。コンソール ウィンドウでいくつかコマンドを実行して、OS を最新のバージョンに更新するだけです。次に、Xamarin の Mono ランタイムおよび信頼できるルート証明書をインストールします。これにより、デバイスから HTTPS 要求を行えるようになります。このような手順の詳細については、bit.ly/Unehrr (英語) のブログ記事を参照してください。

ソフトウェア側

コーディングする必要があるのは、クライアント層 (Raspberry Pi デバイス自体) とサービス層 (Microsoft Azure Storage と Microsoft Azure Mobile Services) の 2 つの層です。さまざまな言語やバックエンド サービスを選択できます。今回は、クライアントで C# を実行し、サーバーで Node.js/JavaScript を実行することにしました。2 つの言語を使用すると実装が複雑になると考える開発者もいるため、この選択は議論を引き起こすかもしれません。

このような選択をしたのは多様性を示すためです。Node.js のコンテキストでは、npmjs.org (英語) で見つかる多くのライブラリやパッケージを使用すると、サーバーのコーディングが簡単になる可能性があると考えています。このようなライブラリはかなり強力なので、多くの場合、Node.js はごく小さなコード ベースになります。同じ言語を使用してコード量が多くなるよりも、2 つの言語を使用してコード量が少なくなる方が優れています。図 4 は、今回想定しているワークフローで、次の 3 つの手順にまとめることができます。

  1. クライアントから、URL として提示される共有アクセス署名 (SAS: Shared Access Signature) トークンを要求する。
  2. Microsoft Azure Mobile Services 内で実行している Node.js アプリケーションから SAS URL を返す。
  3. クライアントが SAS URL を使用して、写真をブロブ (BLOB) として Microsoft Azure Storage にアップロードする。

SmartDoor プロジェクトの概要を示すアーキテクチャ図
図 4 SmartDoor プロジェクトの概要を示すアーキテクチャ図

今回は Microsoft Azure Mobile Services 内で Node.js アプリケーションをホストします。その結果、プッシュ通知、CRUD ストレージ統合、ID、カスタム API のビルド機能など、モバイル デバイス クライアント用に事前にビルドされた多くのサポートを利用できるようになります。

サービスの作成

クライアントを開発する際に対象となるサービス層がないとコーディングできないため、サービスのビルドから始めます。完全に機能するバックエンド サービスがない限り、クライアントを実際に実行したり、テストする方法はありません。Microsoft Azure Mobile Services が今回ビルドするサービス API をホストします。

このカスタム API は Node.js と Express Web フレームワークを基盤とすることになります。クライアント (Raspberry Pi) はこのサービスを使用して SAS を要求します。次にサービスが、その SAS トークンを使用して、撮影した写真を Microsoft Azure Storage にアップロードします。SaS URL を使用すると、アカウントの資格情報を Raspberry Pi に保存する必要がなくなるため、Microsoft Azure Storage アカウントを保護できます。

その他のセキュリティの問題の対処方法については、前回の記事 (msdn.microsoft.com/magazine/dn574801) を参考にしてください。また、SAS トークンが優れているもう 1 つの理由は、クライアントからストレージへのファイルの転送を中間層 (Node.js API) で仲介する必要がなくなることです。

モバイルとストレージの準備

Microsoft Azure Mobile Services を準備する手順は、Microsoft Azure ポータルで数回クリックするだけです。Microsoft Azure Storage を準備する手順も同様です。すべての準備が整ったら、クラウドベースのサービスで使用する URL と名前付け規則について考えます。また、使用するグローバル データセンターについても検討します。待機時間を最小限に抑え、データ転送のコストをなくすために、ストレージ アカウントが Microsoft Azure Mobile Services と同じデータセンターになるようにします。Microsoft Azure Mobile Services と Microsoft Azure Storage アカウントを準備する詳細手順については、bit.ly/WyQird (英語) を参照してください。

共有アクセス署名

Raspberry Pi クライアントは、Microsoft Azure Mobile Services に SAS トークンを要求することになります (図 4 参照)。これを実行するには、Microsoft Azure Mobile Services 内で今回定義する API から get 要求を発行します。SAS トークンを使用すると、クライアントからストレージへのファイル転送を中間層 (Node.js API) で仲介する必要がなくなります。

図 5 のコードは、Microsoft Azure Mobile Services 内で API サービス エンドポイントとして実行している Node.js の抜粋です。このコードの目的は、SAS を必要とする Raspberry Pi クライアントからの要求に応答することです。Raspberry Pi は、Microsoft Azure Mobile Services でホストされているエンドポイントに対して "get" 要求を発行し、アプリケーション キーを渡します。アプリケーション キーは、モバイル サービスを一意に表す ID です。

図 5 Microsoft Azure Mobile Services API 対応の Node.js コード

exports.get = function(request, response) {
  // These are part of "App Settings" in the configuration section
  // of your service. Shouldn't be hardcoded into this Node.js script.
  containerName = request.service.config.appSettings.PhotoContainerName;
    accountName = request.service.config.appSettings.AccountName;
    accountKey = request.service.config.appSettings.AccountKey;
  // Connect to the Blob service.
  blobService = azure.createBlobService(
    accountName,accountKey,accountName + '.blob.core.windows.net');
  createContainer();
  createPolicies();
  var sasResponse = GetSAS();
  return request.respond(201, sasResponse);
}

アプリケーション キーにより、Microsoft Azure の特定のモバイル サービスとセキュアな通信が可能になります。サービスはこのキーをポータルから取得します。キーは Raspberry Pi で実行するコードで使用するので、手元に保持しておきます。次に、キーをクライアント コードに貼り付けます。クライアントは、URL 内にカプセル化された SAS を受け取ります。クライアントは後の操作でこの URL を使用して写真をアップロードします。

ここからは、サーバー側の Node.js アプリケーションを表すコードについて説明します。Azure 向けに調整された強力な Node.js SDK は、bit.ly/Unnikj (英語) からダウンロードすることができます。このコード ベースでは、テーブル、キュー、トピック、通知ハブ、コア管理などの操作のような、Microsoft Azure プラットフォームの他の部分を対象とする多くのサポートが提供されています。Node.js と Azure Blob ストレージを統合するためのチュートリアルについては、https://azure.microsoft.com/ja-jp/documentation/articles/storage-nodejs-how-to-use-blob-storage/ を参照してください。

今回の目的では、Node.JS アプリケーションからクライアントに返された SAS を、先ほど準備したストレージ アカウントに結び付けます。そのため、Node.js アプリケーションでは、ストレージ アカウントのアカウント名と管理キーが必要になります。

Microsoft Azure Mobile Services により、構成設定を Node.js アプリケーションの外部に公開できるようになります。これは、アカウント キーの設定をコードに直接ハードコーディングすることになるため、一般的には不適切なプログラミング手法と見なされます。アプリの設定を使用すれば、サービス ランタイムが読み取ることができるキーと値のペアを設定することができるようになります。詳細については、bit.ly/1pwGFRN (英語) を参照してください。

最終的には Node.js コードから、写真のアップロードにクライアントで使用する SAS を含む URL が返されます。Node.js アプリは、SAS トークンと共に HTTP ステータス コード 201 を返します。これは、Node.js アプリによって要求が実行され、新しいリソース (SAS トークン) が作成されたことを意味します。

Node.js に取り組むための詳細な手順については、bit.ly/WyQird (英語) の SAS URL とアプリの設定を参照してください。

Raspberry Pi コードの詳細

ハードウェアとソフトウェア インターフェイスは、実際にはかなり分かりやすいものです。クライアント側のコードは大きなステート マシンと考えられます。つまり、絶えずループして GPIO ピンの状態をチェックします。図 6 のコードに示すように、ピンのオン (true) またはオフ (false) をチェックするだけです。

図 6 動作を制御するために Raspberry Pi GPIO とインターフェイスを取る長期間のポーリング ループ

while (true)
{
  // If pin 17 is off, we are ready.
  if (!s_Gpio.InputPin(FileGPIO.FileGPIO.enumPIN.gpio17))
  {
    showReady(true);
    // If pin 22 is true, indicate to the user that the system is busy,
    // take a photograph and then upload to the cloud.
    if (s_Gpio.InputPin(FileGPIO.FileGPIO.enumPIN.gpio22))
    {
      showReady(false);
      TakeAndSendPicture();
    }
  }
  else
  {
    // Not ready to take a photo yet.
    showReady(false);
    break;
  }
  // Pause for one-tenth of a second.
  System.Threading.Thread.Sleep(100);
}

ピンの状態をチェックする方法は 2 つあります。1 つ目はファイル システムと対話するアプローチで、今回はこのアプローチを採用してます。特定の値を含む特定のファイルをチェックすることで、ピンがオンかオフかを判断します。もう 1 つは、通常はパフォーマンスに優れたアプローチで、メモリの特定の場所で特定の値をチェックします。ファイル システムの操作は低速になりますが、安全性が高くなります。このアプローチでは、Linux が提供する組み込みのドライバーを利用します。

では、Raspberry Pi の Mono 上で実行する C# を使用したコードに取り組むことにしましょう。Raspberry Pi は 4 つの基本手順を実行します。まず、だれかがドアベルのボタンを押したことに対応します。次に、ドアベルのボタンが押されたことに応じて、写真を撮影してローカル ストレージに保存します。続いて、SAS トークンを要求して、写真をアップロードします。最後に、写真をブロブ (BLOB) として Azure Storage にアップロードします。コードは C# で記述していますが、すべて REST に基づいています。つまり、HTTP を利用できる任意の言語や環境で、この 4 つの基本手順を実行できます。

GPIO と通信することで、Raspberry Pi を制御します。入力用に GPIO 2、出力用に GPIO 1 を使用します。アプリケーションで GPIO を使用するのは 4 か所のみです。これらのピンとインターフェイスを取る C# コードをいくつか示します。図 6 に示した Raspberry Pi の C# コードのメイン ループをご覧ください。デバイスの準備状態をテストするためにピン 17 を、押されたドアベルに基づいて写真を撮影してアップロードするためにピン 22 を使用しています。

長期間ポーリングを行うこの無限ループでは、ピンの電圧を定期的にチェックしています。その結果、実行する作業 (写真の撮影など) をソフトウェアが認識します。このループはピンの状態をポーリングしながら約 10 Hz で実行されます。速度のベンチマークの詳細については、bit.ly/1trFzt9 (英語) を参照してください。

言語によって動作速度は異なります。たとえば、Python はかなり低速なので、速度が重要なシナリオでは使用できません。今回の場合、だれかがドアベルを押したときに、ドアベルのスイッチによってピン 22 に通電したかどうかをチェックするので、10 Hz で十分です。

3 つのピンはそれぞれ異なる機能を実行します。最初の入力のピン 17 はアース ピンに接続する必要があります (C# では false と解釈します)。このように構成しないと、プログラムが終了します。ピン 22 は電源に接続する必要があります (true として解釈します)。ピン 22 が true のときは、TakeAndSendPicture 関数で写真を撮影するプロセスが開始されます。showReady メソッドは、ピン 4 を出力ピンとして使用し LED を操作することで、プログラムでは写真を撮影してアップロードする準備が整ったことを示します。

ソリューションでは、通常の Windows/デスクトップ OS と Raspbian OS でそれぞれ適切なコードを実行するため、条件付きコンパイル シンボルを利用します。Raspbian OS の下では写真撮影の API 呼び出しがないので、ソリューションのコードを別にする必要があります。つまり、それぞれ独自のプロセス内で実行可能プログラムを実行することになります。これに対して Windows 8 では、CameraCaptureUI の CaptureFileAsync API を利用します。

写真を撮影するには、組み込みの raspistill 実行可能プログラムを呼び出します (図 7 参照)。この実行可能プログラムは、既にスナップ写真を撮影して JPEG として保存するように構成されています。これにより、ファイル名、写真の画質、画像サイズを指定できるようになります。raspistill は子プロセスとして開始されます。写真の撮影中に、コードから Microsoft Azure Mobile Services に SAS URL を要求します。その後、写真を Azure Blob ストレージにアップロードします。

図 7 写真の撮影とクラウドへのアップロード

static void TakeAndSendPicture()
{
#if LINUX
  // Start photo-taking process. This will kick off the raspistill process.
  // We'll wait for it to exit after we get the photo URL.
  Process raspistill = new Process();
  raspistill.StartInfo = new ProcessStartInfo("/usr/bin/raspistill",
    "-n -q " + photoQuality +
    " -o /home/pi/Desktop/me.jpg -h 200 -w 200 -t 500")
    {
      UseShellExecute = false
    };
    raspistill.Start();
#endif
  // Get Photo URL while the picture is being taken.
  WebRequest photoRequest = WebRequest.Create(
    "https://raspberrypiservice.azure-mobile.net/api/getuploadblobsas?");
  photoRequest.Method = "GET";
  photoRequest.Headers.Add("X-ZUMO-APPLICATION", 
    "AIzNtpTdQLjORKJJhTrQWWRSHSnXcN78");
  PhotoResponse photoResp = null;
  using (var sbPhotoResponseStream = 
    photoRequest.GetResponse().GetResponseStream())
  {
    StreamReader sr = new StreamReader(sbPhotoResponseStream);
    string data = sr.ReadToEnd();
    photoResp = JsonConvert.DeserializeObject<PhotoResponse>(data);
  }
  Console.WriteLine("Pushing photo to SAS Url: " + photoResp.sasUrl);
  WebRequest putPhotoRequest = WebRequest.Create(photoResp.sasUrl);
  putPhotoRequest.Method = "PUT";
  putPhotoRequest.Headers.Add("x-ms-blob-type", "BlockBlob");
#if LINUX
  // Wait until the photo is taken.
  raspistill.WaitForExit();
  FileStream fs = new FileStream(@"/home/pi/Desktop/me.jpg", 
    FileMode.Open);
#else
  FileStream fs = new FileStream(@"testPhoto.jpg", FileMode.Open);
#endif
  using (fs)
  using (var reqStream = putPhotoRequest.GetRequestStream())
  {
    Console.WriteLine("Writing photo to blob...");
    fs.CopyTo(reqStream);
  }
  using (putPhotoRequest.GetResponse())
  {
  }
}

Visual Studio ソリューションは、Raspberry Pi および通常の Windows OS で実行するようにビルドされています。ソリューションでは、通常の Windows デスクトップ OS または Raspbian OS に適したコードを実行するために、条件付きコンパイル シンボルを利用しています。Raspbian OS での写真撮影はプラットフォーム固有なので、別のコードを用意する必要があります物事を単純にするために、Windows 8 用にコンパイルされるときは写真を撮影しません。代わりに、既存の画像 (testPhoto.jpg) をクラウドにアップロードします。

さいわい、Windows と Raspbian との間で多くのコードを共有することができます。SAS の取得から写真のアップロードまですべて同じです。そのため、Windows で機能すれば、おそらく Raspbian でも同様に機能します。これにより、クライアントベースのコード開発とテストが大幅に簡易化されます。Raspberry Pi はリソースに制約のあるデバイスなので、デバイス自体での処理を最小限に抑えることが最適です。

デバイスで撮影した写真は、2 つの場所で確認できます。1 つはデバイス自体です。具体的には /home/pi/Desktop/me.jpg で、これはコマンド ラインで指定した場所です。当然、画像を Microsoft Azure Storage アカウントのコンテナーにアップロードしているため、もう 1 つの場所はそのコンテナーです。

まとめ

今回は、独自のモノのインターネット デバイスをビルドする際の出発点になります。ハードウェアの調達、組み立て、ソフトウェアのインストール、ソフトウェアの作成、機能のテストなど、すべてのことに対処しようと試みています。また、役立つ多くのブログ記事を紹介しました。しかし、このソリューションは完結していません。

次回は、ドアベルを鳴らす人物の写真をモバイル デバイスに表示できるように、プッシュ通知を携帯電話に送信する方法について説明します。Microsoft Azure Service Bus に含まれている通知サービスを紹介する予定です。また、Microsoft Azure のプッシュ通知を受信できる Windows Phone アプリケーションをビルドする方法についても説明します。最後に、MongoDB NoSQL データベースの使用や顔認証バックエンドとのインターフェイスなど、別のストレージ メカニズムに対処します。Microsoft Azure を使用したモノのインターネットを今後もご期待ください。


Bruno Terkalyは、マイクロソフトの開発者エバンジェリストです。彼の豊富な知識は、数多くのプラットフォーム、言語、フレームワーク、SDK および API を使用してコードを記述してきた、何年にも上る業界での経験に基づいています。彼は、特に Microsoft Azure プラットフォームを使用して、クラウド ベースのアプリケーション構築に関するコードの記述、ブログ投稿、およびライブ プレゼンテーションを行って時間を過ごしています。ブログは、blogs.msdn.com/b/brunoterkaly (英語) で公開されています。

Steven Edouardは、マイクロソフトの開発者エバンジェリストです。以前は、.NET Framework 4.5 および .NET Native Compilation といった製品を提供する、.NET Runtime チームのソフトウェア テスト エンジニアを務めていました。現在は、人々が技術的なデモ、オンライン コンテンツ、プレゼンテーションに取り組むことで、クラウド コンピューティング サービスの無限の可能性にワクワクしてもらうことに情熱を注いでいます。

この記事のレビューに協力してくれたマイクロソフト技術スタッフの Gil Isaacs と Brent Stineman に心より感謝いたします。
In an IT career that has lasted more than 20 years, Brent Stineman は 20 年以上に及ぶ IT キャリアの中でモバイルからメインフレームまであらゆるものに携わってきました。現在は、マイクロソフトの Developer Experience (DX) 部門の Technical Evangelism and Development (TED) のエバンジェリストとして、企業のアーキテクトを支援するために、クラウド コンピューティングと Azure プラットフォームに情熱を注いでいます。Brent は twitter.com/brentCodeMonkey でフォローできます。

Gil Isaacs は Developer Experience (DX) 部門で Microsoft Azure プラットフォームのテクニカル エバンジェリストを努めています。彼の役割は、クラウドベースのアーキテクチャの進化に応じて迅速に顧客を成功に導くことです。Gil は、さまざまな異種テクノロジが混在することによって生じる問題を解決するために、コーディングや顧客サポートを長年にわたって行ってきました。Gil は現在オープン ソース テクノロジを Azure に取り入れることに力を注いでいます。Gil は twitter.com/gilisaacs でフォローできます。