hmx-17の日記

技術ネタとかプライベート

Windows ServerのVSSで指定ファイルを除外する

Windows Server 2012 R2シリーズ以後に実装されたiSCSIイニシエーターで指定するvhdファイルと
普通のファイルが混在したドライブでシャドウコピーを取るとそのファイルの差分が大きくなるため
保存できる世代数が異常に少なくなります。
そこでレジストリに変更をします。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot
に IDをキーにして文字列型でパスを記載します。
D:\iSCSI\*.vhd
などとします。末尾に半角スペースであけて "/s"を付けるとサブディレクトリまで遡ってくれます。

Raspberry Pi の DHCP更新のタイミングでスクリプトを実行させる

やりたいこと

Raspberry Piのeth0についてるIPアドレスが変更されたら、
プログラムを実行させたい

やりかた

簡単に言うと: dhcpcd-hooksを使う
sudo nano /lib/dhcpcd/dhcpcd-hooks/01-renew
とかに

 if [ "$reason" = "BOUND" ]; then
        if [ "$interface" = "eth0" ]; then
                IP=`/sbin/ip -f inet -o addr show eth0|cut -d\  -f 7 | cut -d/ -f 1`
                echo $IP >> /home/pi/bound.txt
                /usr/bin/wget [some-ome-host] -O - > /dev/null
        fi
        exit 0
 fi

 if [ "$reason" = "RENEW" ]; then
        if [ "$interface" = "eth0" ]; then
                IP=`/sbin/ip -f inet -o addr show eth0|cut -d\  -f 7 | cut -d/ -f 1`
                /usr/bin/wget [some-ome-host] -O - > /dev/null
        fi
        exit 0
 fi

と書けばとりあえずOKです。今回はwgetで特定のサイトに通知させたかったのですが、 $IPを引数にした何かのスクリプトでもいいと思います。

ツッコミ(2)

言及リンク:
willow710kut.hatenablog.com
(この人とは知り合いなので、チラシの裏的な感じはありますが……)

プライベートクラウドの定義は割と曖昧ですが、会社にある仮想マシンサーバのことをプライベートクラウドと言ったりもします。
Azureの定義では
>プライベート クラウドは、一般向けではなく特定のユーザーのみを対象とした、インターネットまたは内部のプライベート ネットワーク経由のいずれかで提供されるコンピューティング サービスであると定義されています。
なるほど。

MACアドレスはご指摘の通り、前半24bitを1ベンダで複数使用している場合も有ります。
MACアドレス検索 - UIC などを使って調べてみましょう。
ちなみに、VMWare仮想マシンにおいては下位24bitはランダムに生成しているので、
別のVMWareインスタンスとカブったりするかも。
(vCenterとかで管理しているホストとは別に野良VMホストがいたら発生しそう)

OSI参照層は名前と通る順番だけ覚えてればOKです。
中を覚えるなら最低限必要なのはL1, L3, L7です。
Ethernetの種類(100M, 1Gbps, 10Gbpsと光/copperの違い)
IPルーティングの最低限の理解, TCPUDP, TCP 3-way handshakeなどは理解しておいて損は無いでしょう。
余裕があればIPルーティングについて知識を深めると良いとは思いますが、最初はRIPもOSPFもBGPも見なかったことにしましょう。

L3層より上をきちんと理解したければRFCなどを参照すると良いと思いますが、最初はRFCを読む必要はないでしょう。

入門向けの本は本屋でインフラカテゴリの本をチラ見してわかりやすそうな本を買うと良いでしょう。

インフラの勉強

言及リンク:
willow710kut.hatenablog.com

以下、個人的な見解。
先に持論的を言うと「コードを書く人はインフラを知って欲しい」ということはある。
インフラエンジニアとして、「そんなコードを書かれるとログわからんから保守できねえ!」
とかそういうことは往々にしてあるわけで、そういう悲しい出来事を避けるために一定の経験はしておいて欲しいと言うことです。

が、インフラを触ったことがない人に対してそれは酷だし時間が無いってのも理解します。
この方は作りたい物があるようなので、それにそって自分なりにコストと時間を決めてサービスを作るのが良いと思います。
例えばリンク内にあったDocker。Dockerをホストするサーバを構築することができないなら、とりあえず
AWS Elastic Container Serviceとかを使ってショートカットするのがよいと思います。
もちろんお金は掛かりますが、とりあえずDockerのイメージより下は見えなくて済みます。
もっと言えばStatic HTMLなんてのはAWS S3等のサービスに入れておけば外部から見えるようになりますし、
CloudFrontとLambda@Edgeを使えばBasic認証もサーバレスで作ることはできます。
……すこし横道にそれました。

要するに、「どこの分野を」「どれ位の時間と」「どれ位のお金と」「労力を掛けて」サービスを作るかというところになります。
勉強も労力にカウントしますので、サーバレスアーキテクチャに慣れてる人はお金を掛けてAWSでバッチリ作り込めば時間も節約できるでしょう。
初心者であれば、上記のパラメータを上手に調節してサービスを作るのがよいでしょう。
ただし、作るのに夢中であとの保守を考えていなかった!なんてことにならないように設計しましょう。

AWS IoT GreenglassをRaspberry Pi 3にインストールする

AWS IoTの醍醐味(?) Greenglassを使うためにRaspberry Pi 3にインストールしていきます。

Greenglassを使うとGreenglassに関連付けたAWS IoTデバイスとGreenglassの間でLambdaスクリプトを実行することができ、データを整形したりした上でAWSのDynamoDBなどのサービスに投入することができます。また、GreenglassとAWS間の通信が途絶した場合でも、途絶した情報をGreenglassが保存していて通信が回復した時点で保存しているデータをAWSに送信する機能も付いています。

で、早速インストールします。基本はAWSのドキュメントに従っていれば構築できま………せん!
この通りにセットアップしてデプロイするとこんなメッセージが出ます

[2018-01-08T23:36:54.857+09:00][ERROR]-Runtime execution error: unable to start lambda container. container_linux.go:259: starting container process caused "process_linux.go:345: container init caused \"process_linux.go:286: setting cgroup config for ready process caused \\\"no such directory for memory.limit_in_bytes\\\"\""

ふぁーーー!?もしかしたら先駆者がいるかもしれないので落ち着いてググり……いらっしゃいました

$ sudo nano /boot/cmdline.txt

として末尾に cgroup_memory=1 を追記して再起動すると解決します。

これでAWS ConsoleでGreenglass用のHello Worldをデプロイすると上手く行きます。

自動起動このページを参考にして作りました。

[Unit]
Description=greengrass daemon
After=network.target

[Service]
ExecStart=/greengrass/ggc/core/greengrassd start
Type=simple
RestartSec=2
Restart=always
User=root
PIDFile=/var/run/greengrassd.pid

[Install]
WantedBy=multi-user.target

Mongoose OSでJavaScript IoTプログラミング

Mongoose OSを使うと簡単にAWS IoT(w/Greenglass)が使えるんだって!
ってことで前回はFlash方法を書きましたが……

ざっとプログラムの書き方でも。Mongoose OSのJavaScriptではNode.JSっぽい感じに書けるようで、GPIOピンの割り込みイベントを作るには以下のように書くようです。

let button = 4;
let message = "MQTT Pub";
let topic = "hello/world"; GPIO.set_button_handler(button, GPIO.PULL_UP, GPIO.INT_EDGE_NEG, 200, function() { let ok = MQTT.pub(topic, message, 1); print('Published:', ok, topic, '->', message); }, null);

これはGPIOピン4をbutton変数として定義し、GPIOがGNDに落ちた時の立ち下がりエッジを割り込みトリガーとするイベントの定義になっています。
200と定数がありますが、ここはチャタリングが発生しないようイベントの最低発火頻度をmsecで指定するようです。

イベントを定義している匿名関数では事前に指定したMQTTのBrokerのTopicにPubしてシリアルコンソールにメッセージを投げるようになっています。

その他については今後記述していきますが、とりあえず公式ドキュメントを見るとよいでしょう。