Azure Functions をローカルで開発するためのツールが2種類出ました(1つは結構前からですけど)
細かい話は本家Blog等を参照ください。
またこちらのBlog、動画も参考にどうぞ。
Azure Functions をローカルで開発するためのツールが2種類出ました(1つは結構前からですけど)
細かい話は本家Blog等を参照ください。
またこちらのBlog、動画も参考にどうぞ。
PCとかのパーツでよく使われてるゴム(ラバー)が経年劣化してべとべとする(加水分解という反応を起こしてるらしい)のにいい加減嫌気がさしたので掃除することにしました。(別にPCに限ったことじゃないですが)
よくよく調べると無水エタノールで拭き取ればべとべとが取れるということで、早速買いました。
捨ててもいい雑巾みたいなの(毛羽立たないやつ)に含ませてゴム部分をごしごしするとベタベタが取れてツルツルになります。ゴムごと溶かして削り取ってるようなイメージ?なんで元通りというわけにはいきませんが、少なくともベトベトは無くなったので個人的に満足度高いです。
あ、最初に目立たないところで試してからやりましょうね。あと見た目変わったりすると嫌なものへの使用は十分検討してからにしましょう。
※雑巾は拭き取ったゴムで真っ黒(黒いゴムだったので)になりました。・⌒ヾ( ゚⊿゚)ポイッ
Windows Server 2016 が GA したということで早速アップデートしてみました。
で、それは問題なかったのですがHyper-V上の仮想マシンが起動しなくなってしまい。よくよくエラーを見ると、仮想マシンの構成エラーということでNested Hyper-Vの設定がおかしいよと。
というわけで
Set-VMProcessor -VMName VM名 -ExposeVirtualizationExtensions $false
という感じで一度Nested Hyper-Vを無効にして起動することを確認、再度有効化するかーと思いきや。
> Set-VMProcessor -VMName VM名 -ExposeVirtualizationExtensions $true
Set-VMProcessor : Failed to modify device 'Processor'.
Cannot modify processor setting.
'VM名' failed to modify device 'Processor'. (Virtual machine ID 5270C44F-BF78-4D3E-977E-8268739CA529)
Cannot modify processor setting 'ExposeVirtualizationExtensions' without first upgrading the virtual machine version. (
Current version: 5.0. Needs version: 8.0).
At line:1 char:1
+ Set-VMProcessor -VMName VM名 -ExposeVirtualizationExtensions $ ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Set-VMProcessor], VirtualizationException
+ FullyQualifiedErrorId : NotSupported,Microsoft.HyperV.PowerShell.Commands.SetVMProcessor
仮想マシンのバージョンあげろとか言われました。。というわけでUpdate-VMVersionでアップデート。
> Update-VMVersion VM名 Confirm Are you sure you want to perform this action? Performing a configuration version update of "VM名" will prevent it from being migrated to or imported on previous versions of Windows. This operation is not reversible. [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): A
最新(8.0)になったことも確認できました。
PS C:\Users\Administrator> get-vm VM名 | Format-Table Name,Version Name Version ---- ------- VM名 8.0
再度Set-VMProcesserで有効化するとやっとうまくいきました。無事起動することも確認。( ´ー`)フゥー...
今日(現地だと10月12日)はWindows Server 2016やSystem Center 2016のGA記念日。
Azure Searchがどんなものか直ぐに試すには以下のデモサイトが有名ですね。
1つ目は動画の字幕から検索したり、位置情報を検索したりするのを簡単に試せます。2つ目は実際の利用用途に近い形でニューヨークの求人情報を基にSearchの機能をお試しできます。こちらは位置情報だとかファセットなども見れますね。
さてデモサイトで出来栄えはわかりましたけど、いやいや実際にアプリを組み込むときのサンプルとしてデータだけ欲しいんだという要望もあるかと思います。そんな要望に応えるため、中の人はお手軽にサンプルデータをインポートできるようにしてくれました。
これでとりあえずIndexに悩む前にAzure Searchをアプリから試してみることができますね。
中村さんに教えてもらったのですが新しいドライバーが降ってきたようです。(※ただしこちらのレジストリの設定をしてる場合のみ=まだPreviewな感じ?適用等は自己責任で。)
というわけで2.2.1608.2000になりました。v2.2系で何ができるかというと、こちらのBlogの通りUWP内でRGBカメラとして利用できます(Windows 10 Anniversary Updateだけかも)。例えばCognitive Serviceを使ったUWPのサンプルアプリ内でカメラソースとして利用できます。Windows Helloでも利用できます。
あと通常のWebカメラとしても使えるので、Skypeなどのアプリケーションからも利用できます。
これでいくつもカメラぶら下げなくて良くなりそうです!
あとはKinect SDKがアップデートされるのと、UWP内でIRなどのカメラソースも利用できると嬉しいですねぇ。
Azure Functionsを使ってるときに今実行されている状態のIDを使いたい場合があるかと思います。後で追跡する場合に呼び出されたIDとか関連付けされていると便利ですよね。
というわけで、呼び出しログ(Invocation Log)とかで使われるIDをコード内で使う方法です。
using System;
public static void Run(string input, ExecutionContext executionContext, TraceWriter log)
{
log.Info($"InvocationId: {executionContext.InvocationId}");
}
C#の場合はExecutionContext型の引数を受け取るようにすればOKです。ExecutionContext型にはInvocationIdプロパティがあるのでそちらを参照します。ちなみに内部的にも同じ型でcontextという名前でバインディングされるので、contextという引数名にするとバインディングエラーになります。修正されるかもしれませんが。
module.exports = function (context, input) {
context.log('Node.js manually triggered function called with input:', input);
context.log(context.bindingData.InvocationId)
context.done();
};
JavaScriptの場合はcontextのbindingDataにInvocationIdが生えてるのでそちらを使います。
実行結果はこんな感じで、呼び出しIDが取得できます。
2016-08-03T19:14:03.491 Function started (Id=f58733a5-d6ce-4035-8a42-c6b95b7d79b7) 2016-08-03T19:14:03.491 InvocationId: f58733a5-d6ce-4035-8a42-c6b95b7d79b7 2016-08-03T19:14:03.491 Function completed (Success, Id=f58733a5-d6ce-4035-8a42-c6b95b7d79b7)
裏でFunction Appが実行中のときにコンパイルして(コンパイルエラーになったりして)るときに実行中のものはどうなるのか、予想では別物なんで問題ないと思いますが一応。
検証用コード
using System.Net;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
log.Info($"Start ----");
// parse query parameter
string name = req.GetQueryNameValuePairs()
.FirstOrDefault(q => string.Compare(q.Key, "name", true) == 0)
.Value;
await Task.Delay(TimeSpan.FromSeconds(20));
// Get request body
dynamic data = await req.Content.ReadAsAsync<object>();
// Set name to query string or body data
name = name ?? data?.name;
log.Info($"End ----------");
return name == null
? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body")
: req.CreateResponse(HttpStatusCode.OK, "Hello " + name);
}
HttpTriggerなC#のテンプレートにStartとEndのログと間にTask.Delayで処理止めてるだけのシンプルなやつです。
※ログにFunction Startedとか出るので無駄な気もするけど一応
手順的にはこんな感じ
1. 上記コードを実行する(適当に呼び出す)
2. Task.Delayしてる間にコードを適当に弄ってSaveしてコンパイルエラーにする
3. 結果を見る
4. そのまま再度呼び出す
実行結果はこんな感じになりました
2016-07-19T03:34:42.334 Function started (Id=14c91f2c-2490-437c-b461-258a13872d82) 2016-07-19T03:34:42.334 Start ---- 2016-07-19T03:34:45.698 Script for function 'HttpTriggerCSharp1' changed. Reloading. 2016-07-19T03:34:45.698 Compiling function script. 2016-07-19T03:34:45.776 run.csx(14,13): error CS1002: ; expected 2016-07-19T03:34:45.776 run.csx(11,48): error CS0246: The type or namespace name 'aaaa' could not be found (are you missing a using directive or an assembly reference?) 2016-07-19T03:34:45.776 run.csx(14,13): error CS0103: The name 'data' does not exist in the current context 2016-07-19T03:34:45.776 run.csx(17,20): error CS0103: The name 'data' does not exist in the current context 2016-07-19T03:34:45.776 run.csx(14,5): warning CS0168: The variable 'dynamic' is declared but never used 2016-07-19T03:34:45.776 Compilation failed. 2016-07-19T03:35:02.334 End ---------- 2016-07-19T03:35:02.334 Function completed (Success, Id=14c91f2c-2490-437c-b461-258a13872d82) 2016-07-19T03:35:27.915 Function compilation error 2016-07-19T03:35:27.915 run.csx(14,13): error CS1002: ; expected 2016-07-19T03:35:27.915 run.csx(11,48): error CS0246: The type or namespace name 'aaaa' could not be found (are you missing a using directive or an assembly reference?) 2016-07-19T03:35:27.915 run.csx(14,13): error CS0103: The name 'data' does not exist in the current context 2016-07-19T03:35:27.915 run.csx(17,20): error CS0103: The name 'data' does not exist in the current context 2016-07-19T03:35:27.915 run.csx(14,5): warning CS0168: The variable 'dynamic' is declared but never used 2016-07-19T03:35:27.915 Function completed (Failure) 2016-07-19T03:35:27.961 Exception while executing function: Functions.HttpTriggerCSharp1. Microsoft.Azure.WebJobs.Script: Script compilation failed.
StartとEndの間でコンパイル走ってエラーになってますが、Function Id=14c91f2c-2490-437c-b461-258a13872d82は継続して処理が完了してます。
その後再度呼び出してみるとコンパイルが完了してないので再度コンパイル→失敗→500エラーが返る、という感じです。
予想通りでしたね。なんかおかしい、という場合はぜひ追加の検証をお願いします。
2016年12月5日更新
ちゃんと書いてなかった気がするのと、某所で喋ったのでスライドの中身を適当にコピペします。そのうち動画・スライドが公開される気もしますが。→ されました
※2016年12月5日現在の情報です。
※だらだら長くなってしまった…
Windows 10 のInsider PreviewにBuild 14342が本日リリースされました。
細かな話はさておき、このビルドからちゃんとデバイスポータルが動作するようになりました。
デバイスポータルというのは、Windows 10 IoT Coreが最初にお披露目したと思うのですがブラウザ経由でデバイスの状態を確認したり、アプリケーションをデプロイしたりといったユーティリティが提供されたWeb管理ツールです。
見たことある人もいますよね。実はこのデバイスポータルはWindows 10であればどのデバイスファミリーでも利用可能だったりします。
例えばWindows 10 IoT CoreのほかにPhoneやXBox、HoloLensなどもそうですね。既定の設定(ポート)や設定方法についてはドキュメントを見ましょう。
Windows 10のデスクトップで有効にするにはBuild 14342にあげてから設定→更新とセキュリティ→開発者向けを表示し、「デバイスポータルを有効にする」をオンにします。
認証は適宜設定しましょう。なお接続方法のところにリンクがありますがポート指定されてないのでクリックしても接続できません。
Windows Developer Modeのパッケージがインストールされていることも確認しましょう。![]()
なお実体はWeb Managementというサービスです。レジストリなどを弄った後はこのサービスを再起動しておくといいかもです。![]()
さてDesktopの場合、接続するポートがランダムになってしまうので面倒くさいです。
一応レジストリで固定化できるのでしておきましょう。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WebManagement\Service
にDWORD(32bit)でHttpPort、HttpsPortを作ってそれぞれポート番号を指定します。
また動的なのをやめるために UseDynamicPorts を0に設定します。(設定後サービス再起動しましょう)
※このあたりを参照 → Device Portal for Desktop
接続してみると認証が有効な場合以下のような画面になります。
適当に設定してあげるともろもろアクセスできるようになりますので良しなに。![]()
まぁそういう感じでざっくり管理がどのデバイスファミリーでも利用できるのは良いかもですね。