<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>デバイスとITの架け橋</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/hirosho/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/hirosho/feed.xml</link>
    <description>Windows 10 IoT Coreや.NET Micro Framework、周辺デバイスに関する技術情報や、AzureによるIoT開発、Visual Studioによる組込み系開発など様々な話題を取り扱います</description>
    <lastBuildDate>Mon, 09 Jul 2018 07:06:18 GMT</lastBuildDate>
    <language>ja</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Stream Analytics Tips - 配列で送られてきたデータの統計処理</title>
      <link>https://docs.microsoft.com/archive/blogs/hirosho/stream-analytics-tips-%E9%85%8D%E5%88%97%E3%81%A7%E9%80%81%E3%82%89%E3%82%8C%E3%81%A6%E3%81%8D%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E7%B5%B1%E8%A8%88%E5%87%A6%E7%90%86</link>
      <pubDate>Mon, 09 Jul 2018 16:06:18 GMT</pubDate>
      <dc:creator><![CDATA[Hiroshi Ota MS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/hirosho/?p=3625</guid>
      <description><![CDATA[メモ的に。

例えば、

{"timestamp":"2018-07-09T15:15:06","items":[
{"uid":"097e3730-7f9e-45df-8473-7d029...]]></description>
      <content:encoded><![CDATA[メモ的に。

例えば、

{"timestamp":"2018-07-09T15:15:06","items":[
{"uid":"097e3730-7f9e-45df-8473-7d029da18d07","tick":636667461063351598,"x":0.27201866510883843,"y":2.9749924982781488},
{"uid":"097e3730-7f9e-45df-8473-7d029da18d07","tick":636667461063351598,"x":3.3017625395682466,"y":4.79066008925003},
{"uid":"097e3730-7f9e-45df-8473-7d029da18d07","tick":636667461063351598,"x":3.9475029771903083,"y":2.6145762776092516},
{"uid":"097e3730-7f9e-45df-8473-7d029da18d07","tick":636667461063351598,"x":0.90333345621048167,"y":1.6385073129267},
{"uid":"097e3730-7f9e-45df-8473-7d029da18d07","tick":636667461063351598,"x":3.1385963517886566,"y":3.7381303583915022},
{"uid":"097e3730-7f9e-45df-8473-7d029da18d07","tick":636667461063351598,"x":2.3104054305285242,"y":3.1593682305698136}]},
{"timestamp":"2018-07-09T15:16:29","items":[
{"uid":"0d59cbb6-7955-415d-b725-f4155ba048cd","tick":636667461895922282,"x":0.15601237311773578,"y":1.4404155297393051},
{"uid":"0d59cbb6-7955-415d-b725-f4155ba048cd","tick":636667461895922282,"x":1.2746048165832669,"y":4.9212264851300169},
{"uid":"0d59cbb6-7955-415d-b725-f4155ba048cd","tick":636667461895922282,"x":3.1073283139184715,"y":2.2427159395267795},
{"uid":"0d59cbb6-7955-415d-b725-f4155ba048cd","tick":636667461895922282,"x":3.4007428276356046,"y":4.9929921235856565}]}

こんな配列形式でIoT Hubを通じてStream Analyticsにデータが送られてくる（配列の要素は可変）場合の統計処理方法を書いておきます。ちなみに、uid、tickは同一配列内では同じ値でかつ、全般にわたってユニークとします。※実用的にはuid、tickのどちらかあれば十分でござる。

具体的には、配列毎のxの合計値、yの平均を求めます。

クエリーはこんな感じ

WITH <span style="color: #ff0000">expanded </span>AS (
SELECT
<span style="color: #993300">msg</span>.IoTHub.ConnectionDeviceId as deviceId,
<span style="color: #993300">msg</span>.timestamp,
<span style="color: #008080">arrayElement</span>.ArrayIndex,
<span style="color: #008080">arrayElement</span>.ArrayValue as <span style="color: #0000ff">item</span>
FROM
[iothub] as <span style="color: #993300">msg</span>
CROSS APPLY GetArrayElements(<span style="color: #993300">msg</span>.items) AS <span style="color: #008080">arrayElement</span>
)
SELECT
<span style="float: none;background-color: transparent;color: #333333;cursor: text;font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif;font-size: 16px;font-style: normal;font-variant: normal;font-weight: 400;letter-spacing: normal;line-height: 24px;text-align: left;text-decoration: none;text-indent: 0px">    deviceId,</span>
item.tick,
SUM(<span style="color: #0000ff">item</span>.x) as sumOfX,
AVG(<span style="color: #0000ff">item</span>.y) as avgOfY,
Count(<span style="color: #0000ff">item</span>.x) as CountOfItems
INTO [blobout]
FROM <span style="color: #ff0000">expanded</span>
GROUP BY <span style="color: #0000ff">item</span>.tick,deviceId, System.Timestamp

uidを使う場合は、tickをuidに置き換えてください。

最初のWITH句で、配列をばらします。（ばらす＝一次正規化されたレコードに変換される）
GROUP BY句ではWindow関数必須と思っている人多いと思いますが、System.Timestampを指定すると、Window関数無しでも統計計算可能という機能が実はあります。

出力は、

{"tick":<span style="float: none;background-color: transparent;color: #333333;cursor: text;font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif;font-size: 16px;font-style: normal;font-variant: normal;font-weight: 400;letter-spacing: normal;line-height: 24px;text-align: left;text-decoration: none;text-indent: 0px">636667461063351598</span>,"deviceid":"devicearrayemulator","sumofx":13.873619420395055,"avgofy":3.1527057945042412,"countofitems":6},{"tick":<span style="float: none;background-color: transparent;color: #333333;cursor: text;font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif;font-size: 16px;font-style: normal;font-variant: normal;font-weight: 400;letter-spacing: normal;line-height: 24px;text-align: left;text-decoration: none;text-indent: 0px">636667461895922282</span>,"deviceid":"devicearrayemulator","sumofx":7.9386883312550784,"avgofy":3.3993375194954392,"countofitems":4}

となり、Mission Completed!]]></content:encoded>
    </item>
    <item>
      <title>Azure IoT Edge SDK Ver2対応 C/C++ Edge ModuleのBuild方法</title>
      <link>https://docs.microsoft.com/archive/blogs/hirosho/azure-iot-edge-sdk-ver2%E5%AF%BE%E5%BF%9C-cc-edge-module%E3%81%AEbuild%E6%96%B9%E6%B3%95</link>
      <pubDate>Thu, 07 Jun 2018 17:24:30 GMT</pubDate>
      <dc:creator><![CDATA[Hiroshi Ota MS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/hirosho/?p=3605</guid>
      <description><![CDATA[超久しぶりの投稿。

もっといい方法があるかもしれないのですが、C/C++で書かれたソースコードをEdge...]]></description>
      <content:encoded><![CDATA[超久しぶりの投稿。

もっといい方法があるかもしれないのですが、C/C++で書かれたソースコードをEdge Module化できたので、備忘録的に紹介。

サンプルとして、Preview的に公開されている、<a href="http://github.com/azure/azure-iot-sdk-c">http://github.com/azure/azure-iot-sdk-c</a>のmodules-previewブランチを使います。

<a href="https://github.com/Azure/azure-iot-sdk-c/tree/modules-preview">https://github.com/Azure/azure-iot-sdk-c/tree/modules-preview</a>

の、iothub_client/samplesの、iothub_client_sample_module_senderとiothub_client_sample_module_filterにサンプルとして公開されています。前者はDockerfileもありますが、使い方がわからないので、試した方法を解説。後者はそのままだと、不完全な感じです。

※ 2018/6/7現在の公開情報をもとに書いてます。もしかすると、もっと別の良い方法がどこか別の場所で公開されているかも。

実行環境はRaspberry Pi 3以上のRaspbianです。まずは、<a href="http://matsujirushi.hatenablog.jp/entry/2018/04/15/214721">http://matsujirushi.hatenablog.jp/entry/2018/04/15/214721</a> を参考に、Edge Runtimeをインストールしてください。ModuleをBuildするのも、実行するのも、Raspbian上です。2セット用意して一個は開発環境用、もう一個は実行環境用にしておくと便利。

先ずは、azure-iot-sdk-cをclone

$ git clone -b modules-preview -r https://github.com/Azure/azure-iot-sdk-c.git

cloneが終わったら、<a href="https://github.com/Azure/azure-iot-sdk-c/blob/modules-preview/doc/devbox_setup.md#linux">https://github.com/Azure/azure-iot-sdk-c/blob/modules-preview/doc/devbox_setup.md#linux</a> に従って、ビルドします。

cloneしたディレクトリには、azure-iot-sdk-cというディレクトリができているので、それに並べて、以下の内容のDockerfileを作成します。

<code>
FROM resin/rpi-raspbian:jessie as builder</code>

run sudo apt-get update
run sudo apt-get install -y cmake build-essential curl libcurl4-openssl-dev libssl-dev uuid-dev

WORKDIR /home/pi/azure-iot-sdk-c
run pwd; ls

ADD ./azure-iot-sdk-c .
run pwd; ls

WORKDIR cmake/iothub_client/samples/iothub_client_sample_module_sender
run pwd; ls

run rm -f iothub_client_sample_module_sender
run make

run ls

FROM resin/rpi-raspbian:jessie
RUN useradd -ms /bin/bash moduleuser
ENV ModuleUser=moduleuser

WORKDIR /app
run pwd; ls

COPY --from=builder /home/pi/azure-iot-sdk-c/cmake/iothub_client/samples/iothub_client_sample_module_sender/iothub_client_sample_module_sender .
COPY --from=builder /home/pi/azure-iot-sdk-c/iothub_client/samples/iothub_client_sample_module_sender/start.sh .

RUN apt-get update &amp;&amp; apt-get install -y libcurl3

run pwd; ls -la

run chmod +x start.sh
CMD sh ./start.sh

やっていることは、Docker image化したいサンプルをDockerのコンテナ内でビルドし、出来上がった実行ファイルとその実行ファイルを動かすために必要な証明書とかの設定をしているシェルスクリプトをDocker image化するというDockerfileです。そして、

$ docker build -t <em>docker-container-url</em>/sender_cpp:0.1 .

でビルドします。<em>docker-container-url</em>の部分は、各自のDockerコンテナーのアドレスに置き換えてください。Buildが終わったら、

$ docker push <em>docker-container-url</em>/sender_cpp:0.1

で、コンテナーにプッシュ。あとは、Azure IoT HubポータルのIoT EdgeのUIを使えば、ターゲットのEdgeデバイス上で実行可能です。ポイントは、実行ファイルのリンクは、コンテナ内でやること。その時にSDKをビルドして作成されているライブラリ群がコンテナ内に存在していること、この二点です。

参考までに補足しておくと、Edge Runtimeのメッセージングに対する入出力は、IoTHubClient_XXXXという一連の関数群（iothub_client/inc/iothub_client.h)で行うということ。これらは、Device SDKがリリースされた直後からIoT Hubにつなぐのに使われている関数群。Edge SDK Ver 2向けに拡張されてます。

次に、iothub_client_sample_module_filterのEdge Module化です。Edge Runtimeのメッセージングにつなぐためには、CERT系の設定をちゃんとやらないとダメ。この投稿を書いている時点のこのサンプルにはそれがないので、senderを参考に追加してやります。

先ず、ファイルの先頭の方に、
<code>
#include 
#include </code>

#ifdef ARDUINO
#include "AzureIoT.h"
#else
#include "iothub_module_client_ll.h"
#include "iothub_client_options.h"
#include "iothub_message.h"
#include "azure_c_shared_utility/threadapi.h"
#include "azure_c_shared_utility/crt_abstractions.h"
#include "azure_c_shared_utility/platform.h"
#include "azure_c_shared_utility/shared_util_options.h"

#ifdef USE_MQTT
#include "iothubtransportmqtt.h"
#else
#error "This sample currently only works when using MQTT protocol"
#endif
#endif

<span style="color: #ff0000"> #include "certs.h"</span>

/*String containing Hostname, Device Id &amp; Device Key, ModuleID, and GatewayHostName in the format: */
/* "HostName=;DeviceId=;SharedAccessKey=;ModuleId=;GatewayHostName=127.0.0.1" */
static const char* connectionString = "[device connection string]";

と、CERTに必要なファイルをinclude。そして、<span>InitializeConnectionForFilter関数の一番最後に、CERTをセットするコードを追加。
<code>
else
{
bool traceOn = true;
IoTHubModuleClient_LL_SetOption(iotHubModuleClientHandle, OPTION_LOG_TRACE, &amp;traceOn);</code></span>

<span style="color: #ff0000"> if (IoTHubModuleClient_LL_SetOption(iotHubModuleClientHandle, OPTION_TRUSTED_CERT, certificates) != IOTHUB_CLIENT_OK)</span>
<span style="color: #ff0000"> {</span>
<span style="color: #ff0000"> printf("failure to set option \"TrustedCerts\"\r\n");</span>
<span style="color: #ff0000"> }</span>
}

return iotHubModuleClientHandle;
}

そして、Edge Runtimeから供給される接続文字列を取得＆セットするコードを<span>InitializeConnectionForFilter関数に追加します。
<code>
static IOTHUB_MODULE_CLIENT_LL_HANDLE InitializeConnectionForFilter()
{
IOTHUB_MODULE_CLIENT_LL_HANDLE iotHubModuleClientHandle;</code></span>

<span style="color: #ff0000"><strong>char *connectionStringFromEnvironment = getenv("EdgeHubConnectionString");</strong></span>
<span style="color: #ff0000"><strong> if (connectionStringFromEnvironment != NULL)</strong></span>
<span style="color: #ff0000"><strong> {</strong></span>
<span style="color: #ff0000"><strong> connectionString = connectionStringFromEnvironment;</strong></span>
<span style="color: #ff0000"><strong> }</strong></span>
<span style="color: #ff0000"><strong> printf("connection-string is %s\n", connectionString);</strong></span>

if (platform_init() != 0)
{
printf("Failed to initialize the platform.\r\n");
iotHubModuleClientHandle = NULL;
}
else if ((iotHubModuleClientHandle = IoTHubModuleClient_LL_CreateFromConnectionString(connectionString, MQTT_Protocol)) == NULL)
{
printf("ERROR: IoTHubModuleClient_LL_CreateFromConnectionString(%s) failed\r\n", connectionString);
}
else
{
bool traceOn = true;
IoTHubModuleClient_LL_SetOption(iotHubModuleClientHandle, OPTION_LOG_TRACE, &amp;traceOn);

<span style="color: #ff0000"><strong>// For mbed add the certificate information</strong></span>
<span style="color: #ff0000"><strong> if (IoTHubModuleClient_LL_SetOption(iotHubModuleClientHandle, OPTION_TRUSTED_CERT, certificates) != IOTHUB_CLIENT_OK)</strong></span>
<span style="color: #ff0000"><strong> {</strong></span>
<span style="color: #ff0000"><strong> printf("failure to set option \"TrustedCerts\"\r\n");</strong></span>
<span style="color: #ff0000"><strong> }</strong></span>
}

return iotHubModuleClientHandle;
}

これで、Edge Runtimeのメッセージングに接続できるようになります。あとは、senderのサンプルを参考に、start.sh（実行ファイル名を変える）を用意し、Dockerfileを作成すればEdge ImageをBuild＆Pushできます。そして、<a href="https://docs.microsoft.com/ja-jp/azure/iot-edge/tutorial-csharp-module">https://docs.microsoft.com/ja-jp/azure/iot-edge/tutorial-csharp-module</a>を参考にEdge上にDeployすれば動きます。

このiothub_client_sample_module_filterには、Edge Runtimeのメッセージング機構からの入力と機構への出力ロジックがあるので、独自のモジュールを作りたい場合は、iothub_client/samples内に、このディレクトリ一式をコピーして

$ cd azure-iot-sdk-c/iothub_client/samples
$ mkdir <em><strong>custom_module</strong></em>
$ cp iothub_client_sample_module_filter/* <strong><em>custom_module</em></strong>

<em><strong>custom_module</strong></em>内のソースファイルとヘッダーファイルの名前の変更と必要な実装を追加して、ファイル名の変更に合わせて、<em><strong>custom_module</strong></em>のCMakeLists.txtを適宜修正、samples直下のCMakeLists.txtのadd_sample_directory(iothub_client_sample_module_filter)の次に

add_sample_directory(<em><strong>custom_module</strong></em>)

を追加して、start.sh、Dockerfileを作成し、DockerでBuild&amp;Pushしてください。

※当方、Docker初心者につき、もっとCoolなやり方あるぜって方、是非コメントをください！<code></code>]]></content:encoded>
    </item>
    <item>
      <title>MACからでもデバイス登録可能だよ。IoTHub-Explorer紹介</title>
      <link>https://docs.microsoft.com/archive/blogs/hirosho/introduce_iothub_explorer_tool</link>
      <pubDate>Tue, 29 Nov 2016 20:08:08 GMT</pubDate>
      <dc:creator><![CDATA[Hiroshi Ota MS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/hirosho/?p=3595</guid>
      <description><![CDATA[テストや実証実験目的で、Azure IoT Hubにデバイスを追加したりセンサーデータをモニタリングしたりデバイスにコマンドを送ったりするのに、Device...]]></description>
      <content:encoded><![CDATA[テストや実証実験目的で、Azure IoT Hubにデバイスを追加したりセンサーデータをモニタリングしたりデバイスにコマンドを送ったりするのに、Device Explorerというツールが用意されています。このツールは、<a href="http://github.com/Azure/azure-iot-sdks/releases">http://github.com/Azure/azure-iot-sdks/releases</a> に記載のリンク、SetupDeviceExplorer.msi をクリックしてダウンロード＆インストール可能です。このツール、超便利…なのですが、Windows PCにしかインストールできません。

私はMACなんだよね…って方。大丈夫です。コマンドラインUIなので、ちょっと使いにくいですが、Node.js上で動く、iothub-explorerというツールが別途公開されているので、それを使えば、MACだけでなく、LINUX等でも、IoT Hubへのデバイス登録や送信データのモニタリングができます。

まず、<a href="https://nodejs.org/en/download/current/">https://nodejs.org/en/download/current/</a> から、Node.jsの環境をダウンロードしてインストールしてください。インストールが終わったらNode.jsのシェルを立ち上げて、https://github.com/Azure/azure-iot-sdks/tree/master/tools/iothub-explorer に記載に従って、以下を実行します。

npm install -g iothub-explorer

このコマンドでiothub-explorerに関する必要ファイルがインストールされます。インストールが終わったら、同じシェル上で

iothub-explorer login [connection string]

を実行します。”[connection string]”の部分は、http://portal.azure.comで作成したIoT Hubの共有アクセスポリシーのiothubownerの接続文字列に置き換えます。

HostName=<em>IoTHubName</em>.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=<em>Base64EncodingString</em>

こんな感じの文字列です。管理ポータルのコピーボタン（紙が二枚重なっている感じのアイコン）でコピー可能です。

次に

iothub-explorer create [deviceId]

を実行すると、IoT Hubに指定したデバイスIDが登録され、接続に必要なセキュリティ文字列が表示されます。

複数登録されたデバイスの一覧を表示したい場合は、

iothub-explorer list

を実行すると、既に登録されたデバイスIDの一覧と、それぞれのセキュリティ文字列が表示されます。この情報を使って、デバイス側のIoT Hubへの接続・送信アプリを完成することができます。

IoT Hubの作成等、基本的な手順は、<a href="http://aka.ms/IoTKitHoLV3On">http://aka.ms/IoTKitHoLV3On</a> のStep2を参照してくださいね。]]></content:encoded>
    </item>
    <item>
      <title>Windows 10 IoT CoreをはじめとするUWPアプリでBLEデバイスを扱う</title>
      <link>https://docs.microsoft.com/archive/blogs/hirosho/tipsforbledeviceusingbywindows10uwpapps</link>
      <pubDate>Fri, 11 Nov 2016 10:45:27 GMT</pubDate>
      <dc:creator><![CDATA[Hiroshi Ota MS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/hirosho/?p=3575</guid>
      <description><![CDATA[先ずは、IoT Kitハンズオントレーニング　のデバイス側で、Windows 10 IoT CoreのUWPアプリ（Windows 10 PCでも実施可能）とTexas...]]></description>
      <content:encoded><![CDATA[先ずは、<a href="http://aka.ms/IoTKitHoL">IoT Kitハンズオントレーニング</a>　のデバイス側で、Windows 10 IoT CoreのUWPアプリ（Windows 10 PCでも実施可能）とTexas InstrumentsのSensor Tag（CC2541、CC2650）の組合せを追加したことをお知らせします。<a href="https://github.com/ms-iotkithol-jp/IoTKitHoLV3">https://github.com/ms-iotkithol-jp/IoTKitHoLV3</a>　のWinIoTCoreTIIoTHubAppフォルダーに入っているソリューション一式がそれです。TI Sensor TagをデバイスやPCとペアリングすれば、あとは、WpfEmuIoTHubAppと同じ要領で自学自習可能ですので、TI Sensor Tag持っている人は是非試してみてください。一般のPC、Raspberry Pi3やDragonBoardなどBLE対応のデバイスであれば特にBLEのドングルなどなくても実習可能です。

さて本題です。このアプリを作っている過程で、BLEデバイスにアクセスするためのWindows Runtime APIの使い方でてこずりました。ライブラリー群は、非同期メソッドなので、await 句を付けてコールすれば通常は問題なく使えるのですが、HandsOn.csファイルの中で、普通のやり方をやっても実行がブロックされて戻ってきません。では、Taskのまま受けて、Wait()で待って、結果をResultで受け取って…を試してみたら、デバッガーで一行一行ステップバイステップで動かすと、一応動くのですが、一気通貫で実行しようとすると、Wait()から帰ってこない！最悪のパターンだ…どうしよう、ってな状況になってしまいました。しかしなぁ…サンプルでは動いてるしなぁ…何が違うの？

と考えて動くものと動かないものを比較した結果、解が得られました。どうやら、UWPアプリとして作ったプロジェクトの中ではawaitやWait()がうまく動かないらしく、UWPアプリプロジェクトを作った時に出来上がるソリューションに、別途UWPクラスライブラリプロジェクトを作って追加、そのクラスライブラリ上にBLEデバイスにアクセスするFindAllAsyncやらなんやらをコールするコードを置くとうまく動くんですな。Gitに挙げているサンプルもそういう作りになっています。

ってことで、await機能しないじゃん、なにこれ？…と首をかしげてる皆さん、この方法試してみてください。

ではでは]]></content:encoded>
    </item>
    <item>
      <title>あらら、EdisonのYokuto LinuxもVisual Studio 2015で…</title>
      <link>https://docs.microsoft.com/archive/blogs/hirosho/wow-edison-yokuto-linux-also-develop-by-visual-studio-2015-easier</link>
      <pubDate>Wed, 06 Jul 2016 11:45:23 GMT</pubDate>
      <dc:creator><![CDATA[Hiroshi Ota MS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/hirosho/?p=3475</guid>
      <description><![CDATA[ふと思ったわけです。「あれ？Raspbianのアプリがあれだけ簡単にリモートビルド＆デバッグできるなら、Edison...]]></description>
      <content:encoded><![CDATA[ふと思ったわけです。「あれ？Raspbianのアプリがあれだけ簡単にリモートビルド＆デバッグできるなら、Edison Yokutoも一緒じゃね？」

やってみました。

あっけなくできました。

なんだよ~クロスプラットフォーム用のWindows上のもろもろのインストールとか設定とか必要ないじゃん

…という嘆きはどうでもいいです。それはそれで色々使い道もあるんで。

では、早速、Visual Studio 2015を起動して、「ファイル」→「新規作成」→「新しいプロジェクト」を選択して

<a href="https://msdnshared.blob.core.windows.net/media/2016/07/LinuxXPlatformPT.png"><img class="alignnone  wp-image-3477" src="https://msdnshared.blob.core.windows.net/media/2016/07/LinuxXPlatformPT-1024x759.png" alt="LinuxXPlatformPT" width="661" height="490" /></a>

Visual C++のクロスプラットフォームのLinuxを選択して、”Empty Project（Linux)”でプロジェクトを作成。

プロジェクトに、main.cppを追加して、鉄板の

#include &lt;stdio.h&gt;
int main(int ac, char** av)
{
printf("Hello World!\n");
}

と書いて、CPUをx86に変えて（Edisonなんで）

<a href="https://msdnshared.blob.core.windows.net/media/2016/07/VSLinuxHelloWorld.png"><img class="alignnone  wp-image-3485" src="https://msdnshared.blob.core.windows.net/media/2016/07/VSLinuxHelloWorld-1024x749.png" alt="VSLinuxHelloWorld" width="686" height="502" /></a>

”▶ Remote GDB Debugger”をクリック。すると、https://blogs.msdn.microsoft.com/hirosho/2016/06/01/visual-studio-2015-update2-cross-platform-development-for-example-intel-Edison/ をやっている人なら、何も設定しなくても、EdisonのYokuto Linux上にソースコード一式リモートコピーされ、リモートビルドされ、リモートデバッグが開始されます。Wow

やってない人は、

<a href="https://msdnshared.blob.core.windows.net/media/2016/07/ConnectLinuxSetting.png"><img class="alignnone  wp-image-3495" src="https://msdnshared.blob.core.windows.net/media/2016/07/ConnectLinuxSetting.png" alt="ConnectLinuxSetting" width="456" height="468" /></a>

こんなダイアログが表示されるので、Host name:に、EdisonのIPアドレスを、User name:に開発用に使っているユーザーアカウントを、Password:にそのユーザーのパスワードを入力すれば、つながります。

以上！]]></content:encoded>
    </item>
    <item>
      <title>IoT Hub Device Management Preview 2016/7/4現在</title>
      <link>https://docs.microsoft.com/archive/blogs/hirosho/iot-hub-device-management-preview-20160704howto</link>
      <pubDate>Tue, 05 Jul 2016 15:35:02 GMT</pubDate>
      <dc:creator><![CDATA[Hiroshi Ota MS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/hirosho/?p=3455</guid>
      <description><![CDATA[ちょっと時間たってしまいましたが、4月のBuildでIoT Hubの機能強化が発表されました。現在、PreviewとしてDevice...]]></description>
      <content:encoded><![CDATA[ちょっと時間たってしまいましたが、4月のBuildでIoT Hubの機能強化が発表されました。現在、PreviewとしてDevice Managementの機能がSDKも含め公開されだしています。SDKの成熟を待って、そろそろいいかなという状況になってきたみたいなので、いやぁ、まだまだ、幾つか問題あるなと、いう感じですが、2016年7月4日現在で<a href="http://azure.microsoft.com" target="_blank">http://azure.microsoft.com</a>のドキュメント→モノのインターネット→IoT Hubから公開されている内容を元に、試す際の注意点を記載しておきます。

まずは、
<ul>
	<li><a href="https://azure.microsoft.com/ja-jp/documentation/articles/iot-hub-device-management-device-twin/" target="_blank">https://azure.microsoft.com/ja-jp/documentation/articles/iot-hub-device-management-device-twin/</a></li>
	<li><a href="https://azure.microsoft.com/ja-jp/documentation/articles/iot-hub-device-management-get-started/" target="_blank">https://azure.microsoft.com/ja-jp/documentation/articles/iot-hub-device-management-get-started/</a></li>
</ul>
をじっくり読んでください。ここに書いてある通りにやると、動いた！というのが理想なのですが、幾つか嵌りポイントありました。それを以下に説明します。

まず、CMakeのインストールについて

私が試したときは、PATHの追加を選択したにもかかわらず、PATH設定されなかったので、PATHが追加されなかった場合（コマンドプロンプトでcmakeと入力したときにコマンドがないと表示される）、コントロールパネル→システム→システムの詳細設定でPATH設定を編集して追加しましょう。

コマンドプロンプト

コマンドプロンプトは、Windowsデスクトップの左下のWindowアイコン→すべてのアプリで、”Visual Studio 2015”→”開発者コマンドプロンプト for VS20...”を使います。念のため、管理者権限で起動しておきましょう。

setup.batによるビルド実行

私の場合、見事に途中でビルドが失敗しました。理由は不明ですが、失敗したら、Visual Studioで、以下の二つのSLNファイルを開いて、ビルドしてください。どうも、Nugetから必要なSDKがダウンロードされていないようです。Visual Studioでビルドすると、きちんとNugetから必要ライブラリを持ってくるようです。
<ul>
	<li>GetStartedWithIoTHubDM.sln</li>
	<li>iothub_charp_serviceclient.sln</li>
</ul>
IoTHubのiothubownerの接続文字列を引数として指定することを忘れずに

nodeのインストール

Device ManagementのUIについては、nodeの6.1以上が必要ですが、どうも、Chakraのnodeが6.0の場合それが邪魔して上手くビルドできません。私のVisual StudioのWindows SDKが古い可能性がありますが。そんな場合は、nodeをhttp://nodejs.orgでダウンロード＆インストールした後、c:\Program Files\nodejsのPATH設定を先頭に設定しなおしてください。設定後すぐには有効にはならないので、再起動等必要です。

この状態で、

npm install

npm run build

npm run start

と実行すれば、無事、

<a href="https://msdnshared.blob.core.windows.net/media/2016/07/IoTHubDMUI.png"><img class="alignnone  wp-image-3465" src="https://msdnshared.blob.core.windows.net/media/2016/07/IoTHubDMUI-1024x803.png" alt="IoTHubDMUI" width="621" height="487" /></a>

起動。Node.jsで動いているので、例えば、IoT Hands-on V3のStep 3、Mobile Appsに組み込めば、動くはず。

&nbsp;

&nbsp;]]></content:encoded>
    </item>
    <item>
      <title>IoT ハンズオンコンテンツVer3のMachine Learning</title>
      <link>https://docs.microsoft.com/archive/blogs/hirosho/iotholver3-machine-learning</link>
      <pubDate>Tue, 05 Jul 2016 01:06:29 GMT</pubDate>
      <dc:creator><![CDATA[Hiroshi Ota MS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/hirosho/?p=3345</guid>
      <description><![CDATA[未だに、Ver2を実践されている方もいらっしゃるようですが・・・

http://aka.ms/IoTKitHoL...]]></description>
      <content:encoded><![CDATA[未だに、Ver2を実践されている方もいらっしゃるようですが・・・

<a href="http://aka.ms/IoTKitHoL" target="_blank">http://aka.ms/IoTKitHoL</a> から公開しているIoTの要素を一通り学ぶ自学自習が可能なハンズオンコンテンツは、現在、<a href="http://aka.ms/IoTKitHoLV3On" target="_blank">Version 3</a>です。IoTデバイス（PinKit/NETMF、Raspberry Pi2/Win10IoTCore）、または、Wpf EmulatorでIoT Hubに送ったセンサーデータを元に、デバイス識別子、計測時間、加速度からの温度状態予測をStep 7でMLを使っています。このコンテンツでは、IoT Hubで受信したセンサーデータをStream Analyticsで決めうちで温度の状態をHot、Coldに分類してストレージに格納したデータを使っています。

ハンズオンセミナーの時間の制約があり、こうしているのですが、実際には、デバイスごとの実測値を元に、温度のHot、Coldは決める必要があります。SASSensorテーブルには温度も含め蓄積されているので、R Scriptを使って、ML Studioの中で温度の高い低いを決めることが可能です。

Step10まで一通り終わった方は、是非、以下の方法を試してみて、よりリアルなMachine Learningにチャレンジしてください。

実は私は、データアナリストのプロフェッショナルでもなく、R Scriptのプロでもなく、未だ手探りの状態で、「あぁこれなら動くね」的な感じで作っています。もっといい書き方あるよーってかた、是非、フィードバックお願いします。
<h3>テーブルからのデータ読み込み</h3>
まずは、ML StudioでExperimentsを一つ新たに作成します。そして、”Data Input and Output”の”Import Data”をドラッグ&amp;ドロップし、

<a href="https://msdnshared.blob.core.windows.net/media/2016/07/DataImport.png"><img class="alignnone wp-image-3355" src="https://msdnshared.blob.core.windows.net/media/2016/07/DataImport-1024x406.png" alt="DataImport" width="681" height="270" /></a>

プロパティで
<ul>
	<li>Data Source → Azure Table</li>
	<li>Account Name、Account Keyは、SASSensorのストレージの情報を入力</li>
	<li>Table name → SASSensor</li>
	<li>Rows to scan ... →ScanAll</li>
</ul>
<div>とします。プロパティの入力が終わったらRUNで実行します。</div>
<h3>データの分割</h3>
これがAzure MLのせいなのか、R Scriptがもともとそうなのか、ちょっとわからないのですが、時間がR Scriptを通すと、1970年1月1日からのTick数になってしまうので、分割します。

まず、Data Transformation→ManipulationのSelect Columns in Datasetを二つ追加してImport Dataに接続します。

<a href="https://msdnshared.blob.core.windows.net/media/2016/07/DividDataProp.png"><img class="alignnone wp-image-3356" src="https://msdnshared.blob.core.windows.net/media/2016/07/DividDataProp-1024x486.png" alt="DividDataProp" width="697" height="331" /></a>

左側は、timeを抽出します。後でマージする必要があるので、msgIdも一緒に抽出します。ちなみに、msgIdは計測時に、全ての計測レコードが一意に特定できるようにデバイスに付与している値です。左側のSelect Columns in Datasetのプロパティは、

<a href="https://msdnshared.blob.core.windows.net/media/2016/07/LeftSideSPDProp.png"><img class="alignnone wp-image-3365" src="https://msdnshared.blob.core.windows.net/media/2016/07/LeftSideSPDProp-1024x501.png" alt="LeftSideSPDProp" width="683" height="334" /></a>

右側は、timeだけを排除します。

<a href="https://msdnshared.blob.core.windows.net/media/2016/07/RightSideSPDProp.png"><img class="alignnone wp-image-3375" src="https://msdnshared.blob.core.windows.net/media/2016/07/RightSideSPDProp-1024x513.png" alt="RightSideSPDProp" width="681" height="341" /></a>

設定したら、またRUNします。これで、左側のSelect Columns in Datasetから、timeとmsgIdのデータセットが、右側からはtime以外のデータセットが出力されます。

R Scriptで温度のHot、Coldを決定し新しくカラムを追加する

まずは、R Language ModulesのExecute R Scriptを追加し、右側のSelect Columns in Datasetの出力とつなぎます。

<a href="https://msdnshared.blob.core.windows.net/media/2016/07/AddRScripting.png"><img class="alignnone size-large wp-image-3395" src="https://msdnshared.blob.core.windows.net/media/2016/07/AddRScripting-1024x348.png" alt="AddRScripting" width="1024" height="348" /></a>

Execute R Scriptのスクリプトには、

<script src="https://gist.github.com/embeddedgeorge/ee2470b894c6163f25f4b4f29d5cf3ff.js"></script>
と入力します。これで、各deviceId毎の温度の平均値を求めて、その平均値より温度が高ければHot、低ければColdという値を持つ、TempStatusというプロパティが追加されます。この段階で学習モデルの教師データが作成できます。

<a href="https://msdnshared.blob.core.windows.net/media/2016/07/ResultOfRScriptiong.png"><img class="alignnone wp-image-3405" src="https://msdnshared.blob.core.windows.net/media/2016/07/ResultOfRScriptiong-1024x429.png" alt="ResultOfRScriptiong" width="807" height="338" /></a>

R言語の実行の過程で、tempmeanというプロパティが追加されています。この値は、deviceId毎に計算された温度（temp）の平均値です。ハンズオン資料の中で、TempStatusのカテゴリに変換するパートがありますが、このR言語内でカテゴリに変換しても構いません。
<h3>時間をマージする</h3>
Data TransformationのManipulationのJoin Dataを追加し、二系統のデーターセットをマージします。

<a href="https://msdnshared.blob.core.windows.net/media/2016/07/AddJoinModule.png"><img class="alignnone wp-image-3415" src="https://msdnshared.blob.core.windows.net/media/2016/07/AddJoinModule-1024x492.png" alt="AddJoinModule" width="789" height="379" /></a>

プロパティで、双方のmsgIdをキーにしてデータを結合します。

<a href="https://msdnshared.blob.core.windows.net/media/2016/07/JoinProp.png"><img class="alignnone wp-image-3425" src="https://msdnshared.blob.core.windows.net/media/2016/07/JoinProp.png" alt="JoinProp" width="225" height="392" /></a>

各項目、設定したらRUNするのをお忘れなく。
<h3>結果をデータセットとして保存する</h3>
Join Dataの下の○を右クリックし、”Save as Dataset”を選択し、

<a href="https://msdnshared.blob.core.windows.net/media/2016/07/JoinedDataset.png"><img class="alignnone wp-image-3435" src="https://msdnshared.blob.core.windows.net/media/2016/07/JoinedDataset.png" alt="JoinedDataset" width="460" height="217" /></a>

変換した結果をデータセットとして保存します。名前は適当に付けて構いません。例えば、”Categorized Temp Status Data”とか。すると

<a href="https://msdnshared.blob.core.windows.net/media/2016/07/SavedDataSet.png"><img class="alignnone wp-image-3445" src="https://msdnshared.blob.core.windows.net/media/2016/07/SavedDataSet.png" alt="SavedDataSet" width="283" height="210" /></a>

保存が完了すると、”Saved Datasets”→”My Datasets”の下に現れます。
後は、ハンズオンのStep 7の冒頭のImport Dataをこの保存したデーターセットに置き換えれば、変換したデータを使った予測モデルが作成可能です。]]></content:encoded>
    </item>
    <item>
      <title>IoTでAzure Functionを使おう！</title>
      <link>https://docs.microsoft.com/archive/blogs/hirosho/lets_try_azure_function_in_iot</link>
      <pubDate>Fri, 17 Jun 2016 01:01:24 GMT</pubDate>
      <dc:creator><![CDATA[Hiroshi Ota MS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/hirosho/?p=3285</guid>
      <description><![CDATA[2016/4のBuildで、Azure...]]></description>
      <content:encoded><![CDATA[2016/4のBuildで、Azure Functionが紹介され、現在、Preview公開されています。
このサービス、とってもGoodです。PaaSでIoTをビルディングブロック的に構築していくときにとっても便利です。従来ならWebJobを使って、各サービス間をつなぐところをFunction使ってより少ない作業量で構築できて、バインディングも増えているし、尚且つ、実行したときだけ課金。さらにはスケール可能。それになんと、Visual Studio Onlineを使って、Visual StudioがPCにインストールされてなくても開発できる！（ステップ実行とかできれば最強なのにぃ。。。）
現在公開中の、<a href="http://aka.ms/IoTKitHoLV3On" target="_blank">IoT Kit ハンズオンV3</a>は、Step 9でWebJob使ってます。Step 8でのStream AnalyticsのMLの結果の出力をEvent Hubに投げていて、投げっぱなし。この二つを近いうちにFunctionを使う様に置き換えようかなと、思っている次第。イメージとしては、こんな感じ

<a href="https://msdnshared.blob.core.windows.net/media/2016/06/TriggerSignalRByFunction.png"><img class="alignnone  wp-image-3295" src="https://msdnshared.blob.core.windows.net/media/2016/06/TriggerSignalRByFunction-1024x714.png" alt="TriggerSignalRByFunction" width="330" height="230" /></a>

しかしですね。。。このFunction、一応ドキュメントが、<a href="https://azure.microsoft.com/ja-jp/documentation/articles/functions-reference-csharp/" target="_blank">https://azure.microsoft.com/ja-jp/documentation/articles/functions-reference-csharp/</a> とかから公開されているんですが、BlobやEvent Hubとか、のTriggerを受けるためのバインディングの説明がとても分かりにくいーい、と思ったのは私だけではないはず。結構現時点（2016/6/16）だと、実装されてなくて、ひと手間必要なものも結構あるし。

ということで、function.jsonでのバインディングの定義と、run.csxで定義する、Runメソッドの引数に関する、基本的な事を説明しておきますね。例えば、<a href="https://azure.microsoft.com/ja-jp/documentation/articles/functions-bindings-storage/" target="_blank">https://azure.microsoft.com/ja-jp/documentation/articles/functions-bindings-storage/</a> で、結構使いそうな場面が多い、ストレージへのアクセスをトリガーにしたバインディングが書かれてますね。一個抜き出して解説します。

<a href="https://msdnshared.blob.core.windows.net/media/2016/06/FunctionBinding.png"><img class="alignnone size-large wp-image-3305" src="https://msdnshared.blob.core.windows.net/media/2016/06/FunctionBinding-1024x364.png" alt="FunctionBinding" width="879" height="312" /></a>

対応を書き込んでます。Function.jsonの、最初の'name'がmyQueueItemというエントリがRunメソッドの一番目の引数に対応、二番目の'name'が'myQueue'というエントリが、Runメソッドの二番目の引数に対応します。Function.jsonのバインディングの定義は増やすことができます。増やしたら、Runメソッドにも同じ名前の引数を追加します。Runメソッドの引数の型は、Functionで使えてバインディング可能な型は、例えばブロブトリガーなら、”ブロブトリガーにサポートされた型”にリストアップされている型なら何でも選択可能。型をどれにするかは、Function.jsonの定義とは関係なく、Runメソッドのロジックの実装上の都合で選択してかまいません。図の例でいうと、図では、myQueueItemはstring ですが、CloudBlockBlobに変えてもよいという事です。バインディングは勝手にAzureがやってくれます。Runメソッドの最後のTraceWriter logは、ログ出力用にデフォルトで付与される変数です

ただ、現状だと、project.jsonに必要なアセンブリの名前を追加したり、run.csxの冒頭に#r や、using宣言を入れる必要はあるので、適宜追加が必要です。実際にやってみたところ、Storage Tableについては、ICollector&lt;T&gt;などは対応していないようです。現状、Storage Tableに行を追加したい場合などはCloudTable型の引数を使わないと動作しませんでした。ICollectorの場合は、function.jsonでのdirection定義がoutになるのですが、CloudTableの場合は、inにしないといけないなど細かい修正は必要ですが、まぁ、プレビュー段階なので臨機応変に対応してくださいね。

今、Functionを取り入れた新しいIoT コンテンツを準備中なので、こうご期待。皆さんもFunctionを是非お試しくださいませ。

おまけ

Azure Functionから、Visual Studio Online（プレビュー）を起動するには、以下の図に従って、クリック＆クリック

<a href="https://msdnshared.blob.core.windows.net/media/2016/06/OpenVSO.png"><img class="alignnone  wp-image-3315" src="https://msdnshared.blob.core.windows.net/media/2016/06/OpenVSO-1024x591.png" alt="OpenVSO" width="853" height="492" /></a>

そして、ブロックブロブにファイルがアップロードされた時に、そのファイルを解析してストレージに格納したいなら、

project.json
<script src="https://gist.github.com/embedded-george/0494c5eca13047b4fe67a3edce99846f.js"></script>これで、NuGetで公開されている、Azure Storage SDKを組込めます

function.json<script src="https://gist.github.com/embedded-george/cd8f880432f87df6f3488a601e966677.js"></script>
現状は、これでStorageに書き込むためのCloudTableの参照を引数で取得できます。
run.csxは、
<script src="https://gist.github.com/embedded-george/617a0a096509f7f8fa211968427d1cf6.js"></script>と書けばいい。

他に、例えば、処理結果をJsonで、ブロブに書き出したい場合は、
 project.json<script src="https://gist.github.com/embedded-george/8b9e57a30843940339b771db758eceaf.js"></script>
※クラスをシリアライズするので、Newtonsoft.Jsonをインストール

function.json
<script src="https://gist.github.com/embedded-george/6348152ad264ba6cd2cc282504c77745.js"></script>※出力されるファイルは、pathで指定されたパターンで名前付けられ、保持される。ブロブにimg20160616.jpgというファイルがアップされた場合は、img20160616.jsonという名前で保存される。

run.csx<script src="https://gist.github.com/embedded-george/322b1679596eba435faf8c1122f766a6.js"></script>
と書けばOK。myOutputBlobの型はCloudBlockBlobを使います。
ブロブへのアクセス権等は、FunctionのRuntimeが吸収してくれるのでSASToken作るとか考えなくてよいのですごく便利。

以上、おまけとして、Azure Storage テーブルと、ブロブへの出力方法書きました。出力したファイルをStream Analyticsで更に分析したい場合はブロブで、ML で学習データとして使いたい場合は（Import DataはJson対応してないので）、Tableを使うのがベター]]></content:encoded>
    </item>
    <item>
      <title>de:code 2016 IoT Touch and Try</title>
      <link>https://docs.microsoft.com/archive/blogs/hirosho/decode-2016-iot-touch-and-try</link>
      <pubDate>Mon, 06 Jun 2016 16:05:10 GMT</pubDate>
      <dc:creator><![CDATA[Hiroshi Ota MS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/hirosho/?p=3215</guid>
      <description><![CDATA[de:code 2016に来て、IoT Touch ＆ Tryを体験された皆さん、Touch &amp; Tryしてくれてありがとうございました。いかがでしたでしょうか？

Windows 10...]]></description>
      <content:encoded><![CDATA[de:code 2016に来て、IoT Touch ＆ Tryを体験された皆さん、Touch &amp; Tryしてくれてありがとうございました。いかがでしたでしょうか？

Windows 10 IoT Core for Raspberry Pi2やMicrosoft AzureのIoT関連サービスの一端に、なるべく多くの方が触れてほしいということで企画しました。当日の資料はこちらからダウンロードできるようにしてあります。<a href="https://doc.co/qqUcy3">https://doc.co/qqUcy3</a>

1ラウンド10分ということで、IoTを構成する要素のうち、センサーデータ計測、データ送信、コマンド受信、リアルタイム分析、蓄積、可視化の部分を切り出した内容です。

<a href="https://msdnshared.blob.core.windows.net/media/2016/06/Decode2016IoTTT.png"><img class="alignnone  wp-image-3217" src="https://msdnshared.blob.core.windows.net/media/2016/06/Decode2016IoTTT-1024x490.png" alt="Decode2016IoTTT" width="589" height="282" /></a>

de:codeのEXPO会場でTouch &amp; Tryをやる以上、新しい試みをやりたいなと、色々考えて、「せっかくだからコンパニオンロボットにスピーカーやらせよう、IoTだし」ということで、キーノートにも登場した富士ソフト製のPalmiに、DMM.comさん協力のもと、スピーカーを務めてもらいました。話す内容は毎回決まっているのでルーチンワークはロボットが担当、各受講者の挑戦の手助けという非定型な仕事は、人間が担当するという布陣です。

サポーターは、<a href="https://www.microsoft.com/ja-jp/communities/mvp/default.aspx" target="_blank">MVP </a>でもあり、IoT ALGYANの主要メンバーでもある、瀬尾佳隆さん（ALGYAN 破認定）、日高亜友さん（ALGYAN守認定）ががっつりと対応、他、IoT ALGYANの皆さんも都度参入。二日間お疲れ様でした。ありがとうございます。
Palmi君に”IoTを教えて”と問いかけると、コースの冒頭からPalmiが説明を開始、頭をポンポンすると次のフレーズを説明（正確にはポンですがｗ）。人間のお二人が受講者の状況を見ながら適宜フォロー、という進行で、おかげさまで、1日半で51回実施、受講者平均3~4人/1回で、de:code参加者の1割弱がTouch ＆ Tryされたことになります。

<a href="https://msdnshared.blob.core.windows.net/media/2016/06/DecodeIoTTTRoundWithSeo.png"><img class="alignnone  wp-image-3255" src="https://msdnshared.blob.core.windows.net/media/2016/06/DecodeIoTTTRoundWithSeo-1024x575.png" alt="DecodeIoTTTRoundWithSeo" width="571" height="321" /></a>

舞台裏を紹介

このTouch &amp; Try は、10分という尺に合わせ、実習環境を用意し、

<a href="https://msdnshared.blob.core.windows.net/media/2016/06/Decode2016IoTTTEnv.png"><img class="alignnone  wp-image-3225" src="https://msdnshared.blob.core.windows.net/media/2016/06/Decode2016IoTTTEnv-1024x566.png" alt="Decode2016IoTTTEnv" width="597" height="330" /></a>

PPTを作成。Palmiだったらこんな喋り方をするだろうなという想像のもと、スクリプトをノートに記載。将来的にはそのままPalmiがノートを読めるようになる（Palroは現時点でも可能）はずですが、今回は、DMM.comにお願いして、ノートの内容をテキストファイル化し既存のロボット用アプリを使ってPalmiに仕込んでいただき、当日を迎え、前日夜実習環境のセットアップ、初日の午前中、Palmiのリハ（一発合格）で本番を迎えました。ラズパイの時計が狂うとか、Surfaceからラズパイがネット越しに見えなくなるなどの問題は都度解決しながら、大きな問題もなく、Touch &amp; Tryを進行しました。

<a href="https://msdnshared.blob.core.windows.net/media/2016/06/PalmiReady.jpg"><img class="alignnone size-large wp-image-3235" src="https://msdnshared.blob.core.windows.net/media/2016/06/PalmiReady-1024x440.jpg" alt="PalmiReady" width="879" height="378" /></a>

実習資料は、現在公開中、そして、1か月に一回程度でハンズオンセミナー開催中の、<a href="http://aka.ms/IoTKitHoLV3On" target="_blank">http://aka.ms/IoTKitHoLV3On</a> （全10 StepでMLやWebアプリ連携等も盛り込んだ内容：ハンズオンセミナーはこれを一日かけて全部やってしまうという鬼セミナーw）を基に、更にそれを技術系学校の授業向けにシンプル化した、全3コースからなる<a href="https://doc.co/YRCkBS" target="_blank">実習コンテンツ</a>のコース1をde:code向けにカスタマイズしたものです。「Touchするだけでは満足できない！」という方は、是非、http://aka.ms/IoTKitHoLV3On と、<a href="https://doc.co/8VNqwE" target="_blank">https://doc.co/8VNqwE </a>を組み合わせて実習してみてください。実習で使う、FEZ HATというボードは、<a href="http://tinyclr.jp/" target="_blank">http://tinyclr.jp/</a> から購入可能です。

最後に、IoT Touch &amp; Tryにチャレンジいただいた皆さん、サポーターの瀬尾さん、日高さん、Palmiの仕込みにご協力いただいたDMM.comの皆さん、ありがとうございました‼]]></content:encoded>
    </item>
    <item>
      <title>Starter Pack for Windows 10 IoT Core on Raspberry Pi 2のセンサーとかを使うライブラリってどこよ</title>
      <link>https://docs.microsoft.com/archive/blogs/hirosho/starter-pack-for-windows-10-iot-core-on-rpi2-sensors-library</link>
      <pubDate>Wed, 01 Jun 2016 18:40:11 GMT</pubDate>
      <dc:creator><![CDATA[Hiroshi Ota MS]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/hirosho/?p=3205</guid>
      <description><![CDATA[MAKERSのみんなは、もう、持っているよね。Starter Pack for Windows 10 IoT Core on Raspberry...]]></description>
      <content:encoded><![CDATA[MAKERSのみんなは、もう、持っているよね。<a href="https://developer.microsoft.com/ja-jp/windows/iot/win10/AdafruitMakerKit">Starter Pack for Windows 10 IoT Core on Raspberry Pi2</a>‼

<img class="alignnone" src="https://az835927.vo.msecnd.net/sites/iot/Resources/images/AdafruitStarterPack/AdafruitDisplay.png" alt="" width="542" height="361" />

でも、このキットに入っている、BME280やTCS34725 、MCP3008 、昔懐かしいCDSの光センサーとか、半固定抵抗とかどないして使えばええねん‼

って思っている人たちもいるんじゃないかな⁈

ってことで、ここで紹介しておきますね。<a href="https://www.hackster.io/">https://www.hackster.io/</a> のサイトを探すと大概あります。世界中のMAKERSが投稿してくれているんです。

BME280
つなぎ方は <a href="https://www.hackster.io/windows-iot/weather-station-v-2-0-8abe16?ref=search&amp;ref_id=bme280&amp;offset=2">https://www.hackster.io/windows-iot/weather-station-v-2-0-8abe16?ref=search&amp;ref_id=bme280&amp;offset=2</a>
ライブラリは、<a href="https://github.com/ms-iot/adafruitsample/tree/master/Lesson_203V2/FullSolution">https://github.com/ms-iot/adafruitsample/tree/master/Lesson_203V2/FullSolution</a>
このセンサーは、環境情報の基本中の基本の温度、湿度、大気圧を測れるんだよね。人の快・不快とか心の浮つき加減とか、影響するらしいから、<a href="https://www.microsoft.com/cognitive-services/en-us/emotion-api">Azure Cognitive ServiceのEmotion API</a>とかと組み合わせると面白いかもよ

TCS34725
いわゆる色センサーね。センサー付近の色をRGBで教えてくれる。
つなぎ方は、<a href="https://www.hackster.io/windows-iot/what-color-is-it-578fdb?ref=search&amp;ref_id=TCS34725&amp;offset=2" target="_blank">https://www.hackster.io/windows-iot/what-color-is-it-578fdb?ref=search&amp;ref_id=TCS34725&amp;offset=2</a>
ライブラリは、<a href="https://github.com/ms-iot/adafruitsample/tree/master/Lesson_205/FullSolution" target="_blank">https://github.com/ms-iot/adafruitsample/tree/master/Lesson_205/FullSolution</a>

MCP3008
お次は、Analog Digital Converterだっ。ラズパイにはアナログをデジタルに変えるチップがついてないんだよね。そのままだと、CDSの光センサーや半固定抵抗の抵抗値とかが取り込めないよ。これらってアナログだからね。このチップを使うと、アナログの連続値をデジタルに変換して読み込めるよ。
つなぎ方は、CDSの光センサー、半固定抵抗ひっくるめて、<a href="https://www.hackster.io/windows-iot/bright-or-not-v-2-0-30dec8" target="_blank">https://www.hackster.io/windows-iot/bright-or-not-v-2-0-30dec8</a>
ライブラリはいろいろあるけど、<a href="https://github.com/porrey/mcp3008/tree/master/source/MCP3008%20Solution/Mcp3008" target="_blank">https://github.com/porrey/mcp3008/tree/master/source/MCP3008%20Solution/Mcp3008</a> が一番いいかな。
BME280とかTCS34725とかはI2Cだけど、MCP3008はSPIでラズパイと通信するんだよ。SPIのサンプルにもなるね。

ってことで、軽いノリで紹介してみました。あ、そういやこれ、紹介したライブラリは、ラズパイだけでなく、ミノーボードやドラゴンボードでも使えるはず。

それと、Hackster はもちろん日本人も投稿オッケーなんで、腕に覚えのある人は是非、投稿してね]]></content:encoded>
    </item>
  </channel>
</rss>