Windows 10 の仮想デスクトップとデモ

Windows 10 では仮想デスクトップが使えます。

Winキー + TABとかで切り替えると右下にでてくる 新しいデスクトップ で追加して切り替えたりできるやつですね。
image

※ Winキー +CTRL+ALT+D のキーコンビネーションで作ることもできます。

仮想デスクトップ間の切り替えはWinキー+TABの切り替え時に選択してもいいですし、Winキー+CTRL+左右キー(← OR → )で切り替えることもできます。

普段使いにも便利ですが、プレゼンなどでデモも含めて行うときは仮想デスクトップ活用するとすごく便利です。
デスクトップ1でプレゼン表示しておいてデスクトップ2はVisual Studio、デスクトップ3はブラウザとかあらかじめ仕込んでおけばキーコンビネーションだけでスパスパ切り替えられます。ウィンドウ探したり、意図しないウィンドウだして誤爆したりな事故も防げてスムーズに進行できます!

ただし注意点がいくつかあって、「画面の外部出力の状態(複製や拡張とかのあれ)は仮想デスクトップ単位で保持されてる」というところです。
デモ時などだいたい複製で行うと思うのですけど、メインなデスクトップで「複製」にしていざ本番、デモ用デスクトップに切り替えたら複製じゃなくて「拡張」になっててデスクトップが晒される!という事態になりえます。

なのであらかじめ各デスクトップでちゃんと設定しておきましょうね。以上、過去2回ほどデスクトップというか壁紙さらして失笑された人からの報告でした。

Azure Resource ManagerでMarketplaceを使う

Azure Resource Managerのテンプレート集を使うとVMv2などの構成を簡単(?)に行うことができます。
ただ見てるとMarketplaceに公開されてるカスタムVMイメージなどを使ったテンプレートがなさげです。

※ こんな感じで普通にやるとエラーになるわけです

Marketplaceの場合も通常の場合もOSImageにはパブリッシャー、オファー、SKU、バージョンの指定が必要なのですがMarketplaceの場合は追加の課金が発生する可能性もあり、個別にPlanも指定する必要があります。

※ オファーやSKUなどは Get-AzureRmVMImageOffer などを使って取得すればいいでしょう

Get-AzureRmVMImageSku

コマンド パイプライン位置 1 のコマンドレット Get-AzureRmVMImageSku
次のパラメーターに値を指定してください:
Location: Japan West
PublisherName: miracl_linux
Offer: asianux-server-4-sp4

Skus          Offer                PublisherName Location  Id
----          -----                ------------- --------  --
axs4sp4licazu asianux-server-4-sp4 miracl_linux  japanwest /Subscriptions/5ffe5ad0-6dfc-4e3e-b44e-f4297c930546/Pro...

具体的にはVirtual Machineのリソースに以下のようにplanも追加してあげます。

    {
      "apiVersion": "2015-06-15",
      "type": "Microsoft.Compute/virtualMachines",
      "name": "[variables('vmName')]",
      "location": "[variables('location')]",
      "plan": {
        "name": "axs4sp4licazu",
        "publisher": "miracl_linux",
        "product": "asianux-server-4-sp4"
      },
      "dependsOn": [
        "[concat('Microsoft.Storage/storageAccounts/', parameters('newStorageAccountName'))]",
        "[concat('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
      ],
      "properties": {
        "hardwareProfile": {
          "vmSize": "[variables('vmSize')]"
        },
        "osProfile": {
          "computerName": "[variables('vmName')]",
          "adminUsername": "[parameters('adminUsername')]",
          "adminPassword": "[parameters('adminPassword')]"
        },
        "storageProfile": {
          "imageReference": {
            "publisher": "[variables('imagePublisher')]",
            "offer": "[variables('imageOffer')]",
            "sku": "[parameters('ubuntuOSVersion')]",
            "version": "latest"
          },
          "osDisk": {
            "name": "[variables('OSDiskName')]",
            "vhd": {
              "uri": "[concat('http://',parameters('newStorageAccountName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('OSDiskName'),'.vhd')]"
            },
            "caching": "ReadWrite",
            "createOption": "FromImage"
          }
        },
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[resourceId('Microsoft.Network/networkInterfaces',variables('nicName'))]"
            }
          ]
        }
      }
    }

publisher はそのままpublisherを、nameにはskuを、productにはofferに入れる値を入れておけばいいかと。(厳密には違うかもしれませんが)
※ 確実に知りたい場合はPreviewポータル上で該当のVirtual Machineを展開後、ARMExplorerなどで見るといいかもしれません。

これでエラーは回避して問題なくデプロイできます。

Tips

意外とハマるかもしれませんが、REST APIやAzure PowerShell/CLIでMarketplaceを利用する場合、事前に使用許諾を了承しておく必要があります。

arm

Previewポータル上でMarketplaceから対象のものを開き、一番下にあるリンク(Want to deploy programmatically?)をクリックし、対象サブスクリプションをEnableにしておきます。※当然追加の料金が発生する場合があるので注意が必要です。

またデプロイに成功した後、購入した旨のメールが届きます。(料金が発生しなかったとしても)
image

Azureサブスクリプション管理者向けに多要素認証する

以前のPostで組織アカウントのみを使ってAzure サブスクリプションを契約することができました。
あとはサインアップに使ったアカウント(全体管理者)をきちんと管理したいですよね。

Microsoftアカウントであればそちら側で多要素認証(MFA)が使えますが、Azrue ADの組織アカウントでの多要素認証ってどうなんでしょうか?

基本的に無料ではなさそう?いいえ実は上記Blogに書いてないことが1つあります。ユーザー向けではなくAzrueの全体管理者向けにはMFAが無料で提供されるのです。

管理者用の Azure Multi-Factor Authentication の無料版はありますか?

対応する Azure Active Directory がディレクトリ ユーザーに対して Azure Multi-Factor Authentication を使ってプロビジョニングされていない場合、Azure の全体管理者は Azure Multi-Factor Authentication 機能の一部を無料でご利用いただけます。

https://azure.microsoft.com/ja-jp/pricing/details/multi-factor-authentication/

image

https://azure.microsoft.com/ja-jp/documentation/articles/multi-factor-authentication/

意外と知られてそうで知られてない事実のようです。早速使ってみましょう。操作はClassicポータルで行います。

続きを読む →

組織アカウントだけでAzureにサインアップする

わかりにくかったので。組織アカウントだけでAzureにサインアップするというよりは、いかにMSアカウントなしでAzure ADを作るか?という話です。

https://account.windowsazure.com/organization にアクセスし必要事項を入力。(いろいろ面倒くさいのでInPrivateモードなどでやりましょう)
※このURLがキモですかね。

image

有効なドメインが確認できたら、管理者となる最初のユーザー名とパスワードを設定し、SMSか電話で認証してAzure ADテナントを作成します。
image

これでAzure ADが新規にできました。作成されましたメールも届いてると思います。
image※名称などいろいろ放置されてる感あるけど。

あとは通常のサインアップと同じです。(認証後、自動的に無料試用版のサインアップ画面になりますがAzure ADができればこっちのもんですね)
作成後そのままサインイン画面になると思うので、先ほど作成したユーザーIDとパスワードで認証します。

無料試用版のサインアップ画面になるので必要事項を入力していき、サインアップします。
imageimage

しばらくすればサブスクリプションができあがります。
image

ディレクトリが名.姓という感じになってますが、会社名のところを空欄にした所為かも。
imageimage

無事、MSアカウントなしでAzureサブスクリプションができました。
image

Mac OS X で Azure CLI を使う

インストール方法とログイン方法など。最近MSアカウントに対応したのでログインまでのやり方です。

インストール

最初にnode.jsとnpmをインストールしましょう。公式サイトからダウンロード・インストールすればOKです。

あとはコンソールで以下のようにazure-cliをグローバルにインストールします。まぁお好みで。

sudo npm install -g azure-cli

最近だとDockerイメージもあるのでDocker導入済みならそちらを使うこともできます。公式ドキュメントを参照。

新しいバージョンへのUpdateはnpm update –g azure-cliとかでOKかと思います。

あとは通常どおりazureコマンドで利用できます。

image

ログイン

Azure CLIで操作する前にログインする必要があります。v0.9.10より古いバージョンでは証明書を使ったログインか、Azure AD上のアカウント(組織アカウント)を利用する必要がありました。

証明書を使用したログイン

もし手元に証明書がない場合は最初にダウンロードします。

azure account download

証明書ファイルが手に入ったらaccount importでインポートします。

azure account import "file location"

file locationのところにダウンロードした証明書を指定してください。あとは対象の証明書で管理できるサブスクリプションに対して操作が可能になります。

組織アカウントを使用したログイン

loginコマンドを使います。

azure login -u <account UPN (email address>

最近GAしたRBAC(ロールベースのアクセスコントロール)は組織アカウントだけが対象なのでこちらを使う必要があります。

Microsoftアカウントを使用したログイン

loginコマンドにユーザーIDを渡さないで実行します。

azure login

すると http://aka.ms/devicelogin にアクセスを促されます。コンソールはそのままでブラウザでURLにアクセスします。
image

コードの入力を促されるので、コンソールに表示されているコードを入力します。(Enter the code —–となっているところ)
image

あとは通常のサインインプロセスが走るのでMSアカウントでサインインします。まぁ組織アカウントでもサインインできますが。

無事サインインできればブラウザを閉じてもOKです。
image

どうでもいいですけど、Safariだとなんかフォントがいまいちですね。
しばらく待つとコンソール上でサインインが完了し、サブスクリプションの一覧が表示されます。
image

あとは通常通り操作が可能です。

その他

組織アカウントを多要素認証で保護している場合などは以下のようなエラーが発生します。

$ azure login -u xxxx@xxxxxx
info:    Executing command login
Password: ***************
+ Authenticating...
error:   Interactive login is required. Use 'azure login' to interactively login.
info:    Error information has been recorded to azure.err
error:   login command failed

この場合はMicrosoftアカウントでのサインイン方法でブラウザから認証を行ってください。

Windows 10のGame DVRが動かない

Windows 10でGame DVRが使えます。が、Win+Gのショートカットで起動するウィンドウの録画などの機能が使えませんでした。(XBoxのアプリ立ち上げてもその部分だけサポートされてないとかでる)

解決策はKB3010081のHotfixを適用しましょうという感じ。

これでバッチです。(なおこのパッチ適用しないとHTTP Live Streaming (HLS)が使えないのかMSEdgeでAppleのイベントのストリーミング見れませんでした)

それから関係ないと思うけど、パッチ適用後MADOSMAがちゃんとモバイルコンパニオンで認識するようになった(

Windows Server 2016 TP3のコンソールを閉じてしまったら

画面まっくろでどうしようもないですウワァァ—–。゚(゚´Д`゚)゚。—–ン!!!!

という方はCTRL+ALT+DEL押してセキュリティメニューだしましょう。

image

Sign out選べば(RDPとかで)再接続したときにちゃんと表示されます。あとはTask Manager表示させて新しいタスクの実行とかでcmd.exeでも起動すればいいでしょう。

※ パスワードも変更できますよ。

Server Core普段使ってる人には自明かもしれません。

Raspberry Pi 2とWindows 10 IoT Coreで温度センサーを使ってみる

公式(?)にあるサンプルはちょっとわかりづらかったので簡単な解説的な?ちなみにこちらです。

※というかMCP3002使った時のコード間違ってるんだよねーあとでPRするかな、、、

Raspberry Pi 2にWindows 10 IoT Core(Build10240=Public Release)をのせてるものとします。あとセンサーとしては一般的な3ピンなアナログ温度センサー、A/DコンバーターはMCP3002を使うものとします。

MCP3002のデータシートはこちら

ちなみに回路的にはこちらのBlogの通りです。温度センサーの極性とRaspberry Pi2のGPIOのピン間違わなければまぁ問題ないでしょう。

※回路図のせようと思ったけどhttp://fritzing.org/にサインアップできないので断念。
※あと温度センサーによるのかもしれないけど誤差とかにも注意しましょう(使ったやつは個体によって最大±4℃の精度らしい。。。)。キャリブレーションできるようにアプリ作っておくといいかもですね。

さてWindows 10 IoT Coreで動作するUniversalなアプリを作ってセンサーからデータを読み取ってみましょう。
まずはSPIデバイスの初期化。

        private const string SPI_CONTROLLER_NAME = "SPI0";
        private const Int32 SPI_CHIP_SELECT_LINE = 0;
        private SpiDevice SpiDisplay;

        private async Task InitSPI()
        {
            try
            {
                var settings = new SpiConnectionSettings(SPI_CHIP_SELECT_LINE);
                settings.ClockFrequency = 500000;
                settings.Mode = SpiMode.Mode0;

                string spiAqs = SpiDevice.GetDeviceSelector(SPI_CONTROLLER_NAME);
                var deviceInfo = await DeviceInformation.FindAllAsync(spiAqs);
                SpiDisplay = await SpiDevice.FromIdAsync(deviceInfo[0].Id, settings);
            }

            /* If initialization fails, display the exception and stop running */
            catch (Exception ex)
            {
                throw new Exception("SPI Initialization Failed", ex);
            }
        }

SPI0使うように設定してSpiDeviceのインスタンス作ってる感じです。

データ読み取るには以下のようにデバイスのTransferFullDuplex()を呼び出せばいいです。

byte[] readBuffer = new byte[3];
byte[] writeBuffer = new byte[3] { 0x68, 0x00, 0x00 }; //01101000 00; /* It is SPI port serial input pin, and is used to load channel configuration data into the device*/

SpiDisplay.TransferFullDuplex(writeBuffer, readBuffer);

とりあえず後の話はセンサー側とか固有の話なので同じA/Dコンバーターなど使わなければ意味がないかも。
MCP3002の場合は欲しいチャンネルの情報を渡せば10ビットで応答が返る仕様です。WriteBufferに決まった信号をセットします。(1bitは固定で0、2bit目は必ず1(スタートビット)、SGL/DIFFも1、CH0を使うので0、MSBFで受け取るので1、あとは0という感じで0b01101000 = 0x68 であとはゼロ、という感じです。MCP3002は10ビット2chのA/Dコンバーターなんですがスタートビットからの分も含めると1回のやり取りで3バイト分の領域が必要になるのでbyte[3]な感じです。

さてreadBufferには読み取った値が入ってるわけですが必要なデータだけ3バイトの中から抽出します。

        private int ConvertToInt(byte[] data)
        {
            int result = data[0] & 0x03;
            result <<= 8;
            result += data[1];
            return result;
        }

スタートビットから数えると応答の1バイト目の3ビットが有効な値なのでその部分を取得して8ビットシフトして、2バイト目の値をそのまま足します。(なんでというのはデータシートでも見てください)

image

これでデータがとれました。で、取れた値を温度に変換する必要があります。
使った温度センサーは0℃で500mVの出力電圧で、1℃につき10mV出力電圧が変わる仕様です。なんでざっくり計算するとこんな感じ。

                var adc = ConvertToInt(readBuffer);
                var vol = adc * 3300 / 1024;
                var t = (vol - 500) / 10.0;

adcの値が得られた値で入力の3.3V(3300mv)を掛けて10ビットの1024で割ると出力電圧がでます。0℃で500mVなので500引いて単位をそろえると摂氏な温度が得られます。

あとは画面に出すなり外部に吐き出すなりお好きなようにどうぞという感じです。

※ブレッドボードで何も考えずつないでやってるあたり、学習コンテンツだなーとは思いますがまぁ面白いからいいです。1万円もかからずにC#(UWP)でアプリが組めてデバイスも触れてという環境はいいんじゃないでしょうか。

Windows 10 IoT Core(UWP)でSASトークンを生成

Windows 10 IoT CoreでというかUniversal Windows PlatformでSASトークンを手動生成するのまき。

なぜそんな面倒くさいことをするのかという前提を書くと

  • Universal Windows Platformでは現状Azure周りの(.NET用の)ライブラリがそのまま使えない(Configuration Managerに依存してるものが使えない)ので代替案が必要
  • REST API等でShared Access Signature(SAS)トークンが必要になる

という感じです。

SASトークンそのものはアクセスしたいリソースのURIと期限等をHMAC_SHA256でハッシュ値を計算したものになります。とりあえずハッシュ値生成部分。

        public string ComputeSignature(string content, string key, BinaryStringEncoding encoding = BinaryStringEncoding.Utf8)
        {
            var algorithmProvider = MacAlgorithmProvider.OpenAlgorithm(MacAlgorithmNames.HmacSha256);
            var contentBuffer = CryptographicBuffer.ConvertStringToBinary(content, encoding);
            var keyBuffer = CryptographicBuffer.ConvertStringToBinary(key, encoding);
            var signatureKey = algorithmProvider.CreateKey(keyBuffer);
            var signedBuffer = CryptographicEngine.Sign(signatureKey, contentBuffer);
            return CryptographicBuffer.EncodeToBase64String(signedBuffer);
        }

UWP用のAPI(CryptographicEngineとか)を使ってる以外はごく普通ですね。
SASトークンそのものは以下のような感じで生成できます。

        private string CreateToken(string resourceUri, string keyName, string key)
        {
            TimeSpan sinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1);
            var expiry = Convert.ToString((int)sinceEpoch.TotalSeconds + 3600); //EXPIRES in 1h 
            string stringToSign = WebUtility.UrlEncode(resourceUri) + "\n" + expiry;
            var signature = ComputeSignature(stringToSign, key);
            var sasToken = String.Format(CultureInfo.InvariantCulture,
            "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}",
                WebUtility.UrlEncode(resourceUri), WebUtility.UrlEncode(signature), expiry, keyName);

            return sasToken;
        }

出来上がったSASトークンはHTTP RequestのAuthorizationヘッダに設定すればOKです。(別途書く予定ですがAMQPでSASトークンを使用する方法がわからない…)

※元ネタ How to create Shared Access Signature for Service Bus?

Visual Studioの拡張機能のデバッグ時に配置エラー

Visual Studioの拡張機能(Extension)を開発中にたまにおかしくなってデバッグしようとしても以下のような配置エラー(ビルドエラー)になる場合があります。

Build error: "Extension '拡張機能の名称+GUID' could not be found"  Please make sure the extension has been installed.

通常、実験用インスタンス(Devenvを/rootsuffix Exp引数付きで起動する)を使うと思いますが、そこの拡張機能の一覧にごみがある可能性があるので一度きれいにしましょう。

C:\Users\<ユーザー>\AppData\Local\Microsoft\VisualStudio\14.0Exp\Extensions あたりの該当拡張機能が入ってるフォルダと.cacheファイルを消す

HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\14.0Exp\ExtensionManager\PendingDeletions あたりにあるそれっぽい文字列値を削除

HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\14.0Exp\ExtensionManager\ExtensionAutoUpdateEnrollment あたりにある該当拡張機能の文字列値を削除

だいたいこれでクリアになると思います。

※パス中の14.0ExpはVisual Studio 2015の場合。他のVerの場合は適宜12.0Expやらを参照。