ペイント3DをEnder-2に3Dプリント

ペイント3Dのライブラリに、なかなか良いコンテンツがあるので、、、3Dプリントしてみたいと思い、やってみました。

ペイント 3D

Windows 10に標準で追加された、ペイントの3D版。

f:id:matsujirushix:20180428161053p:plain

3Dライブラリから、好みのコンテンツを選びます。

今回は着地するワシを選びました。

f:id:matsujirushix:20180428161646p:plain

f:id:matsujirushix:20180428161725p:plain

いやぁ、それにしてもペイント3DのUI、すごいですね。

3D-CAD苦手なわたしでも、チョイチョイと操作できてしまう。

で、メニュー > 名前を付けて保存 > 3Dモデルを選んで、3Dプリンターで読み込めるファイル形式で保存する、、、のですが、GLB,FBX,3MFしか選べません。わたしの3Dプリンター(スライスするソフトはCURAの古いバージョン)がこれらに対応していないので、とりあえずFBXで保存します。

FBX -> STL

Fusion 360にアップロードして、3DプリントでSTLファイルにします。(このとき、3Dプリントユーティリティに送信のチェックは外します)

f:id:matsujirushix:20180428162609p:plain

3Dプリント

わたしの場合は、CURAの古いバージョンでSTLを開いて、GCODEをマイクロSDに書き込み、マイクロSDを3Dプリンターにセットして出力しました。

f:id:matsujirushix:20180428162837p:plain

結果

  • Fusion 360でFBX->STLにコンバートしないといけない。ちょっとめんどい。
  • ペイント3D、UIすごいね。

f:id:matsujirushix:20180428163317p:plain

IoT Edgeランタイムのネットワーク構成

IoT Edge v2はDocker技術を使って、各モジュールを分離して動かしています。
はたして、モジュール間はどういう感じでつながっているのか??疑問だったので調べることにしました。

今回は、IoT Edgeランタイム(システムモジュール)の、edgeAgentとedgeHubを調べました。

Network

各システムモジュールを調べる前に、Dockerに存在するNetworkを確認しておきましょう。

ubuntu@ubuntu:~$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
bc452e56bae2        azure-iot-edge      bridge              local
191c4158859e        bridge              bridge              local
e524d4a26c71        host                host                local
54549f043a71        none                null                local
ubuntu@ubuntu:~$

none, bridge, hostとは別に、azure-iot-edgeというブリッジが存在していました。

edgeAgent

edgeAgentのコンテナ情報を見てみましょう。

NetworkModeがazure-iot-edgeで、azure-iot-edgeネットワークにIP=172.18.0.2、GW=172.18.0.1で繋がっているようです。

ubuntu@ubuntu:~$ docker inspect edgeAgent
[
    {
...
        "Name": "/edgeAgent",
...
        "HostConfig": {
...
            "NetworkMode": "azure-iot-edge",
            "PortBindings": null,
...
        },
...
        "NetworkSettings": {
...
            "Networks": {
                "azure-iot-edge": {
...
                    "Gateway": "172.18.0.1",
                    "IPAddress": "172.18.0.2",
...
                }
            }
        }
    }
]
ubuntu@ubuntu:~$

edgeHub

一方、edgeHubは、NetworkModeがdefaultで、443/tcpと8883/tcpを外部に公開している?みたい。edgeAgentと同様に、azure-iot-edgeネットワークにIP=172.18.0.3、GW=172.18.0.1で繋がっているようです。

NetworkModeがdefaultって何だろう??Dockerよくわからん。

ubuntu@ubuntu:~$ docker inspect edgeHub
[
    {
...
        "Name": "/edgeHub",
...
        "HostConfig": {
...
            "NetworkMode": "default",
            "PortBindings": {
                "443/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "443"
                    }
                ],
                "8883/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "8883"
                    }
                ]
            },
...
        },
...
        "NetworkSettings": {
...
            "Networks": {
                "azure-iot-edge": {
...
                    "Gateway": "172.18.0.1",
                    "IPAddress": "172.18.0.3",
...
                }
            }
        }
    }
]
ubuntu@ubuntu:~$

tempSensor

気になったので、センサーデータをシミュレートする、tempSensorモジュールも見てみました。

ubuntu@ubuntu:~$ docker inspect tempSensor
[
    {
...
        "Name": "/tempSensor",
...
        "HostConfig": {
...
            "NetworkMode": "default",
            "PortBindings": null,
...
        },
...
        "NetworkSettings": {
...
            "Networks": {
                "azure-iot-edge": {
...
                    "Gateway": "172.18.0.1",
                    "IPAddress": "172.18.0.4",
...
                }
            }
        }
    }
]
ubuntu@ubuntu:~$

まとめ

コンテナ名 NetworkMode PortBindings 接続ネットワーク 接続ネットワークIP
edgeAgent azure-iot-edge azure-iot-edge 172.18.0.2
edgeHub default 443/tcp,8883/tcp azure-iot-edge 172.18.0.3
tempSensor default azure-iot-edge 172.18.0.4

なるほど。ということは、手作りモジュールはPortBindingsすれば外部からIP接続できるってことか。

うーむ、defaultって何だろう?

Azure IoT Edge v2に最適なシングルボードコンピュータ

Azure IoT Edge v2をシングルボードコンピュータ(SBC)で動かそう!と思い、Raspberry Pi 3のRaspbianで試したところ、さまざまなエラーに見舞われて上手く動きませんでした。

「SBCで安定して動かすことはできないのか?」

いくつかのSBCで、実際にAzure IoT Edge v2を動かしてみたときの、わたし個人の見解です。

Azure IoT Edgeは現時点はプレビューです。
アップデートによって状況は改善されるものと思います。

テスト方法

OSはUbuntu Linux Server 16.04を使いました。Raspberry Pi 3はRaspbian。Windows 10が動くSBCもありますが、IoT EdgeがDockerベースで作れらていることから、Linuxの方が事故りにくいと思い、Linuxにしました。

チュートリアルにある、

をセットアップして、それぞれのモジュール(edgeAgent, edgeHub, tempSensor, asa-container)に異常がないか確認しました。(例:docker logs -f tempSensor)

本当はC#モジュールで試したかったのですが、VSCode拡張でLinuxコンテナーがAmd64しか出力できなかったので止めました。

Raspberry Pi 3

様々なエラーに見舞われましたが、、、Raspbian Lite(2018-03-13-raspbian-stretch-lite.img)にこの手順でセットアップすれば動きました。

セットアップ時にメモリが足りないようで、ときどきリブートしないとエラー地獄になります。セットアップさえ終われば、ちゃんと動いています。

ただ、遅いです。tempSensorだけなら良いですが、ASAと連携するとガクガクな動きになります。

  • IoT Edgeランタイム動く
  • ASA動く
  • セットアップにコツがいる
  • 遅い
  • メモリ不足エラーが不安

UP2

AAEONが出している超パワフルなSBC。パソコンがそのままSBCになった、という感じの代物です。

  • IoT Edgeラインタイム動く
  • ASA動かない(edgeHubからのPOSTでエラー?)
  • 鬼速い

有線LANが2系統あるのが問題なのでは?edgeHubのdocker設定を変更すれば回避できるかも?と思いましたが、深追いしていないです。

LattePanda

DFRobotが出しているLattePanda秋月電子通商さんで販売されているので入手しやすいSBC。 UbuntuのインストールUSBメモリからブートが出来なくて、確認できませんでした。

  • Ubuntuがインストールできずorz
  • 基板が熱くて不安

UP

AAEONが出しているラズパイっぽいSBC。 サイズ、コネクタ配置もラズパイ風。

  • IoT Edgeランタイム動く
  • ASA動く
  • 速い

Minnowboard MAX

これもLattePanda同様に日本で入手しやすいSBCMinnowboard MAXは生産終了(EOL)なので、後継のMinnowboard Turbotを使いたかったのですが、、、手元に無いのでコレで。

  • IoT Edgeランタイム動く
  • ASA動く
  • 遅い

まとめ

速くてメモリ潤沢で不安が無い ... UP
入手しやすい ... Minnowboard MAX(ただしEOL)
自らの技術力を試したい ... Raspberry Pi 3

417 - The device's deployment configuration is not setの対処方法

事象

IoT HubでIoT Edge Deviceを作り、(IoT Edge DeviceにModule追加せずに)エッジデバイスでIoT Edgeランタイムを起動すると、IoT Edge DeviceのEdge Runtime Responseに417 - The device's deployment configuration is not setというエラーが表示されます。

f:id:matsujirushix:20180416212245p:plain

また、エッジデバイスでedgeAgentとedgeHubの2つのDockerコンテナが起動するはずなのが、edgeAgentしか起動しません。

pi@raspberrypi:~ $ docker ps
CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS               NAMES
c1a8c72c3ce1        microsoft/azureiotedge-agent:1.0-preview   "/usr/bin/dotnet Mic…"   24 hours ago        Up 23 hours                             edgeAgent
pi@raspberrypi:~ $

edgeAgentのログで、ConfigEmptyExceptionが発生していることが分かります。

2018-04-16 11:52:08.164 +00:00 [ERR] - Error refreshing edge agent configuration from twin.
Microsoft.Azure.Devices.Edge.Agent.Core.ConfigSources.ConfigEmptyException: This device has an empty configuration for the edge agent. Please set a deployment manifest.
   at Microsoft.Azure.Devices.Edge.Agent.IoTHub.EdgeAgentConnection.UpdateDeploymentConfig() in /opt/vsts/work/1/s/edge-agent/src/Microsoft.Azure.Devices.Edge.Agent.IoTHub/EdgeAgentConnection.cs:line 171
   at Microsoft.Azure.Devices.Edge.Agent.IoTHub.EdgeAgentConnection.<RefreshTwinAsync>d__20.MoveNext() in /opt/vsts/work/1/s/edge-agent/src/Microsoft.Azure.Devices.Edge.Agent.IoTHub/EdgeAgentConnection.cs:line 124
2018-04-16 11:52:10.378 +00:00 [INF] - Updated reported properties

原因

これは、IoT Edgeランタイムに必要な設定(edgeAgentに対するModuleTwin?)が無いことで発生しています。

対処方法

次の操作でIoT Edgeランタイムの設定を作成すると直ります。

  1. IoT Hubにある、IoT Edge DeviceのSet Modulesをクリック
  2. Add Modules画面が表示されるので、Nextをクリック
  3. Specify Routes画面が表示されるので、Nextをクリック
  4. Review Template画面が表示されるので、Submitをクリック

Review Template画面で表示されているJSONが、edgeAgentにModuleTwinで設定されているようです。

Azure IoT Edge Quick Install Guide for Raspberry Pi 3

Azure IoT Edge v2 ランタイムをRaspberry Pi 3にインストールする手順です。

Key point

Setup process consume memory and Raspberry Pi 3 has memory only little. You need reboot before heavy setup/install process.

Step 1

Create microSD image

  • 2018-03-13-raspbian-stretch-lite.img
  • Create empty file 'ssh' on boot volume in microSD when you need to use SSH.

Step 2

Reduce GPU memory

$ sudo vi /boot/config.txt
gpu_mem=16

Reference

Disable IPv6 stack

$ sudo vi /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6=1

Reboot

$ sudo reboot

Step 3

Install pip

$ sudo apt-get update
$ sudo apt-get install python-pip

Reference

Upgrade setuptools and others

$ sudo apt-get install python2.7-dev libffi-dev libssl-dev
$ sudo pip install -U setuptools pip
$ sudo pip install -U cryptography idna

Reboot

$ sudo reboot

Step 4

Install Docker

$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
$ sudo usermod -aG docker pi

Reference

Re-login

$ exit

Step 5

Install Azure IoT Edge Runtime

$ sudo pip install -U azure-iot-edge-runtime-ctl
$ sudo iotedgectl setup --auto-cert-gen-force-no-passwords --connection-string "{ConnectionString}"

Reboot

$ sudo reboot

Step 6

Start Azure IoT Edge Runtime

$ sudo iotedgectl start

Reboot

$ sudo reboot

iothub-explorerをAzure Cloud Shellで使えるようにする

Azure IoT Hubの状況をモニタリングするのに、AzureポータルとDevice Explorerを使うのが定番です。特に、C2DメッセージはAzureポータルでは確認できないので、Device Explorerを使うことになります。

残念なことに、このDevice ExplorerWindows専用。MacユーザーやLinuxユーザーがC2Dメッセージをモニタリングしたいときは、Device Explorerの代わりにiothub-explorerというCLIツールを使うことになりますが、Node.jsをインストールしてiothub-explorerをインストールと、ちょっと煩わしい。

気になるが良い手が無いなぁと思っていたところ、先日、ビデオ会議でソラコム松井さん、松下さんから「Azure Cloud Shell良いよ」と、素晴らしい方法を聞いたので、試してみました。(松井さん、松下さんありがとうございます!!)

Azure Cloud Shellのセットアップ

Webブラウザから操作できるシェル。Azure管理コマンドを実行するために用意されたシェル環境のようで、Azureポータルのアカウントに紐づいて環境作成できます。(複数セッションの同時接続は可能。) サーバーは無料で、ストレージは有料。Azureストレージアカウントに課金されます。

azure.microsoft.com

Azureポータルの上部にある、コンソールっぽいアイコンをクリックしてください。

f:id:matsujirushix:20180331164750p:plain

すると、画面が上下分割されて下部にAzure Cloud Shellが表示されるので、Bash (Linux)をクリックしてください。

f:id:matsujirushix:20180331165452p:plain

ストレージの作成をクリックしてください。

f:id:matsujirushix:20180331165626p:plain

このように、Linux (Bash)が起動すれば成功です。

f:id:matsujirushix:20180331165851p:plain

なお、一番右のフォルダのようなアイコンをクリックすると、Azure Cloud Shellだけのウィンドウを開くことができます。また、そのURLをブックマークしておくと、Azureポータルを立ち上げずに直接Azure Cloud Shellを開くことも可能です。

f:id:matsujirushix:20180331170152p:plain

iothub-explorerのインストール

公式の手順はnpm install -g iothub-explorerと、グローバル領域(/usr/local/lib/node_modules)にインストールしていますがAzure Cloud Shellではここにインストールすることはできません。いくつか代案がありますが、、、ここではグローバル領域を変更してインストールしましょう。

mkdir ~/.npm-global
npm config set prefix '~/.npm-global'
npm install -g iothub-explorer

iothub-explorerの起動

~/.npm-global/bin/iothub-explorer

すばらしい。

f:id:matsujirushix:20180331174048p:plain

PATHの追加

いちいち~/.npm-global/...と入力するのは面倒なので、.bashrcにPATH追加を追記しておくと少し便利です。

vi ~/.bashrc

f:id:matsujirushix:20180331172918p:plain

PATH=~/.npm-global/bin:${PATH}

. ~/.bashrc

Azure Cloud Shellの削除

一度、Azure Cloud Shellをセットアップすると、Azureストレージアカウントに課金されます。ストレージを使っているので。

もういらないよ!というときは、リソースグループのcloud-shell-storage-xxxを削除しましょう。

f:id:matsujirushix:20180331173332p:plain

Power BI 勉強会@名古屋支部 #1に参加しました

Maker Faire Tokyo 2017のデモ、ゴミ箱残量モニタリングを作るときにEvent Hub -> Stream Analytics -> Power BIで実装したのですが、Power BIがいろいろ分からずWPFアプリケーションに変更していました。(十分理解する前に時間切れで使い慣れた方法に変更するというのは、お仕事では必要ですね。)

以降、Power BIをじっくりやろうというチャンスが無かったのですが、Power BI 勉強会@名古屋支部 #1が開催されるということで参加しました。

powerbi.connpass.com

会場は日本システム開発株式会社さんのオープンイノベーションベース。(名古屋で会場を確保するのは大変なので)会場提供ありがたい。

内容はPower BIの使いどころとか使ってみるとハマるところなどを実体験に基づいて発表されていました。どれも熱意のあるセッションで素敵でした。熱意大事。詳しくはconpassのセッション情報と資料をご参照ください。(←手抜き)

togetterもどうぞ。

togetter.com

(わたしは仕組み、仕掛けあたりが興味ポイントなのですが)わたしが気になった、気づいた点をいくつかピックアップしますと、

描画ツールではなく分析ツール

Power BIの出力は見た目がきれいなので綺麗なレポートを作るツールと感じますが、その理解は間違い。データを手軽にコネコネして分析するためのツール。また、データを最新のものに更新しても、コネコネした手順をやりなおす必要が無い。

Power Query -> DAX

コネコネのキモは、Power QueryとDAX。特にPower Query。Power QueryはPower Query Formula Languageという関数型言語で記述するのですが、Excel風のクエリーエディターでGUI操作すると、記述が生成されます。

ストリーミングデータセット

データセットは基本的にバッチ分析で、リアルタイム分析?はストリーミングデータセット。履歴データの解析をオンすると、レポートで分析できるようになります。

データセットとストリーミングデータセット、Power BIが保持するデータ、レポートと(ダッシュボードに貼る)リアルタイム表示のタイル、の関係をどう理解するのかがポイント。

Power QueryDAXの攻略がキモかな?と思いました。その先はデータ分析能力ですねorz

3/24に次回イベント、Power BIもくもく会があるようです。

ちょっと日にちが先なので、、、ぼっちモクモクしようと思います。