IoTの異常検知

IoTシステムで異常を検知する方法に関して調べました。

概要

運用しているシステムがもしダウンしたとしてもダウンタイムをなるべく短くしたい。これは開発者共通の願いです。

もし自動でIoTシステムのデバイス群の異常を検知して迅速にアップデートできるのならば、いくつかのデバイスでバグが発生したとしても全てのデバイスにそのバグが浸透する前に解決することができますよね?そのために異常検知技術が必要になります。

IOT ANOMALIES AND HOW TO DETECT THEM

f:id:paging:20180616215622p:plain IoT Anomalies And How To Detect Them

この記事は2016年9月の記事で、IoT開発業務を行なっているintersog社のブログです。

この記事は要するに、「ビッグデータツールを使って集めたセンサーデータから例外を検知しよう」ということを言っています。

もう少し詳しく言うと、ログのストリーミングデータからリアルタイムでデータのパターンを解析し、過去データと照らし合わせて異常の発生を予測するシステムを使えば異常検知できるよ!ってことです。

具体的な手法を挙げるのでなくIoTシステムにおける異常検知に関してざっくりと書かれています。

USING IOT AND MACHINE LEARNING FOR INDUSTRIAL PREDICTIVE MAINTENANCE

f:id:paging:20180616221726p:plain

www.losant.com

IoTデバイスから収集したデータを機械学習で解析して自動で予測をしたそうです。

Google Cloud machine LearningとLosant IoT Platformを主に使って、この2つの連携によりPredictive Maintenance System (予知保全)システムを構築できます。これは異常が起こる前にそれを検知するシステムのことであり、condition monitoring(状況監視)によって実装されます。

感想:
自社のサービスのプロモーション記事って感じです。機械学習 x IoTのざっくりしたアーキテクチャの話。IoTの異常検知と言ってもメインの技術は全部機械学習ですね。

異常検知周りの論文たち

以下にIoTの異常検知に関する論文を挙げておきます。

[1] Kodeswaran, P. A., Kokku, R., Sen, S., and Srivatsa, M. (2016). “Idea: a system for efficient failure management in smart IoT environments,” in Proceedings of the 14th Annual International Conference on Mobile Systems, Applications, and Services (Singapore: ACM), 43–56.

http://pages.cs.wisc.edu/~sdsen/papers/2016idea.pdf

IBM Researchの4人による論文です。

[2] P.H. Su, C.S. Shih, J.Y.J. Hsu, K.J. Lin, Y.C. Wang, “Decentralized Fault Tolerance Mechanism for Intelligent IoT/M2M Middleware,” Internet of Things (WF IoT), IEEE World Forum, pp. 45-50, 2014.

Decentralized fault tolerance mechanism for intelligent IoT/M2M middleware - IEEE Conference Publication

台湾国際大学の5人よる論文です。

まとめ

IoTの異常検知はwebやデバイス機械学習ビッグデータ解析など幅広い分野にまたがるものですので統合的な手法というのはまだ存在しません。

そもそもIoTシステム自体のフレームワークのスタンダードが現在存在しない以上、異常検知に関しても統合的な手法はまだ見込めませんね。

IoTの異常検知システムを構築するにはまず異常検知に関する知識を得るほうがいいと思います。

異常検知と変化検知 (機械学習プロフェッショナルシリーズ)

異常検知と変化検知 (機械学習プロフェッショナルシリーズ)

最高の小説6選

こんにちは、ナガリョーです。

私が今まで読んできた小説の中で面白かったおすすめのものを紹介します。

選考基準は「今の私が読む気になるか」です。

リスト

  1. テロリストのパラソル
  2. 嘘つきアーニャの真っ赤な真実
  3. 5分後の世界
  4. イン・ザ・プール
  5. 家族八景
  6. ランチのアッコちゃん

テロリストのパラソル

この作品は江戸川乱歩賞直木賞をダブル受賞した最高のミステリー小説で、もしかしたら今まで読んだ小説の中で一番面白かったかもしれない、というくらい本当に面白くて万人にお勧めできる小説です!

少しでも気になる方は読むべきです。絶対後悔しません。

嘘つきアーニャの真っ赤な真実

嘘つきアーニャの真っ赤な真実 (角川文庫)

嘘つきアーニャの真っ赤な真実 (角川文庫)

2006年にガンのため亡くなったロシア語同時通訳家の米原万里さんが書いたノンフィクション作品です。

あらすじ

1960年プラハ。マリ(著者)はソビエト学校で個性的な友達と先生に囲まれ刺激的な毎日を過ごしていた。30年後、東欧の激動で音信の途絶えた3人の親友を捜し当てたマリは、少女時代には知り得なかった真実に出会う! Amazon CAPTCHA

ノンフィクションなのですが、米原万里さんの文章力の高さと展開の面白さから、途中までフィクションの小説だと思うほどの名作です。米原万里さん本当にすごい。亡くなったのが惜しまれます。

5分後の世界

五分後の世界 (幻冬舎文庫)

五分後の世界 (幻冬舎文庫)

村上龍が書く、日本がポツダム宣言を受諾せず戦争を続けているif世界です。村上龍曰く自身最高傑作の作品で、村上龍の代表作品となっています。

グロい表現が結構あるのでちょっと注意ですが、戦争ものを読みたい時にはとてもおすすめです。

あらすじ

箱根でジョギングをしていたはずの小田桐はふと気がつくと、どこだか解らない場所を集団で行進していた。そこは5分のずれで現れた『もう一つの日本』だった。『もう一つの日本』は地下に建設され、人口はたった26万人に激減していたが、第二次世界大戦終結後も民族の誇りを失わず、駐留している連合国軍を相手にゲリラ戦を繰り広げていた……。 五分後の世界 - Wikipedia

イン・ザ・プール

イン・ザ・プール (文春文庫)

イン・ザ・プール (文春文庫)

直木賞を受賞した奥田英朗空中ブランコの前作です。ちなみに本作品も大藪春彦賞を受賞しています。

かなり変わった精神科医の伊良部と水泳中毒、ケータイ中毒、慢性勃起症状などちょっと変わった症状に悩む患者達とのコミカルな治療(???)を描いた作品です。

メディアミックスもされており、イン・ザ・プール阿部寛主役で実写映画化、空中ブランコはアニメ化されています。

空中ブランコ (文春文庫)

空中ブランコ (文春文庫)

町長選挙 (文春文庫)

町長選挙 (文春文庫)

家族八景

家族八景 (新潮文庫)

家族八景 (新潮文庫)

あらすじ

18歳の火田七瀬は人の心を読めてしまう精神感応能力者(テレパス)の女性である。高校卒業後、住み込みのお手伝いとなり様々な家庭を転々とする。家族それぞれの内面を読んでしまうことで、行く先々の家庭に亀裂や事件を起こしてしまう。女性として肉体的成熟を迎えて性的な関心を向けられるようになり、20歳を迎える最終話でお手伝いをやめることを決意する。 家族八景 - Wikipedia

人の心を読む力をもつ火田七瀬がいろんな家で家事手伝いをしながら、その家庭に潜む闇を見ていくESP小説です。

七瀬シリーズは3部作から成っていて、2作目は七瀬ふたたび、3作目はエディプスの恋人です。全部めちゃくちゃ面白いです。

七瀬ふたたび (新潮文庫)

七瀬ふたたび (新潮文庫)

エディプスの恋人 (新潮文庫)

エディプスの恋人 (新潮文庫)

ランチのアッコちゃん

ランチのアッコちゃん (双葉文庫)

ランチのアッコちゃん (双葉文庫)

あらすじ

地味な派遣社員の三智子は彼氏にフラれて落ち込み、食欲もなかった。そこへ雲の上の存在である黒川敦子部長、通称“アッコさん”から声がかかる。「一週間、ランチを取り替えっこしましょう」。気乗りがしない三智子だったが、アッコさんの不思議なランチコースを巡るうち、少しずつ変わっていく自分に気づく。

この本、働く女の人にめちゃくちゃお勧めします。アッコ女史と三智子の上司部下のような友達のような関係が心地よくて、読むと元気が出るビタミン小説です!

終わりに

どれも本当に面白い小説なので読んでみてください!

assertでテスト駆動C言語

競プロの問題を解くときにassert()でテストを書きながらRed-Green-Refactoringサイクルなテスト駆動開発をしたら捗った話。

assert()とは

プログラムの実行中にある条件が成立するかどうかチェックする機能で、その条件が満たされていないとエラーが発生してプログラムが終了します。

以下のようにして使います。

#include<stdio.h>
#include<assert.h>  // assert.hが必要

int main(void) {
  int value = 0;
  assert(value == 1); // 条件を満たさないのでここでエラーが発生する
  return 0;
}

上の例は極端な例ですが、ざっくりassert()の使い方の紹介です。

テスト駆動開発(TDD)とは

プログラムのロジックを書く前にまず、期待する動作のテストプログラムを書き、このテストが正常に失敗することを確認したらロジックを実装し再度テストを実行して期待する動作をするプログラムであることを保証する開発手法。

と書いてもTDDをやったことがない人には分かりにくいですよね。。。

そこで階乗を求めるという具体例を使って説明します。

階乗を求めるプログラム

階乗を求めるプログラムをTDDで実装してみます。

1. 関数のインターフェイス設計(引数と返り値の型を考える)

階乗は1からnまでの自然数の積で、以下のような数式で表されます。

n! = n * (n - 1) * (n - 2) * .... * 2 * 1

まずはこの式をどんな関数に落とし込むかを考えてみます。

  1. 計算したらint型の値を返して欲しい
  2. 引数にはint型の値nを入れる

この2つを盛り込むと int factorial(int n)という関数のインターフェイスが見えてきます。

2. 何もしない関数を作る

ではまず空の関数factorial()を実装してみます。

#include <stdio.h>

int factorial (int n) {
  return 0;
}

int main (void) {
  printf("%d\n", factorial(4));
  // => 0
  return 0;
}

上で考えた通りのインターフェイスの関数factorial()を実装しましたが、ロジック部分が空で常に0しか返しません。

これを実行してみると以下のようになります。

$ ./factorial
0

書いた通り0が出力されます。

3. assert()を使ってテストを書く(Red)

では次にassert()を使ってテストを書いてみます。

#include <stdio.h>
#include <assert.h>

int factorial (int n) {
  return 0;
}

void spec () {
  assert(factorial(4) == 24);
}

int main (void) {
  spec();
  printf("%d\n", factorial(4));
  // => 0
  return 0;
}

spec()関数内に書いたのがテストになります。ここでは4の階乗が24になることを期待します。

しかしこれを実行すると以下のようにエラーが出ます。

$ ./factorial
Assertion failed: (factorial(4) == 24), function spec, file a.c, line 9.
zsh: abort      ./factorial

factorial()関数は常に0を出力するので、これはつまり正常にエラーが出たということになります。

4. factorial()関数のロジックを埋める(Green)

ではfactorial()関数のロジックを埋めましょう。

#include <stdio.h>
#include <assert.h>

int factorial (int n) {
  if (n == 0) return 1;
  return n * factorial(n - 1);
}

void spec () {
  assert(factorial(4) == 24);
}

int main (void) {
  spec();
  printf("%d\n", factorial(4));
  // => 0
  return 0;
}

こうなります。(プログラムの説明は省略)

これを実行すると

$ ./factorial
24

となるように4の階乗がちゃんと24になります。

5. テストの改善

さて、次にテストケースを増やしていきます。

  1. 引数に0を入れたら正常に1が返るだろうか
  2. 引数に負の数を入れてもエラーは起きないだろうか

ざっと2つテストケースを挙げました。(他にも「intの最大値最小値を入れてみる」などありますが今回は省略)

これを実装すると以下のようになります。

#include <stdio.h>
#include <assert.h>

int factorial (int n) {
  if (n == 0) return 1;
  return n * factorial(n - 1);
}

void spec () {
  assert(factorial(4) == 24);
  assert(factorial(0) == 1);
  assert(factorial(-1) == 0);
}

int main (void) {
  spec();
  printf("%d\n", factorial(4));
  // => 0
  return 0;
}

これを実行すると、、、エラーが出てしまいます。

> ./factorial
zsh: segmentation fault  ./factorial

ああそうだ。引数が負の数の場合を実装していません。これではエラーが起きてしまいますね。

6. factorial()関数の改善(Refactoring)

factorial()関数に負の引数が入った場合に0を返すようにします。(階乗は0を返すことがないからホントはこれもあんまよくない)

#include <stdio.h>
#include <assert.h>

int factorial (int n) {
  if (n < 0) return 0;
  if (n == 0) return 1;
  return n * factorial(n - 1);
}

void spec () {
  assert(factorial(4) == 24);
  assert(factorial(0) == 1);
  assert(factorial(-1) == 0);
}

int main (void) {
  spec();
  printf("%d\n", factorial(4));
  // => 0
  return 0;
}

こうすると、

$ ./factorial
24

成功しました!

まとめ

今回はassert()を使ったテスト駆動開発C言語で行うことについて書きました。

ここでは分かりやすく階乗を例に出しましたがもっと複雑な状態になるプログラム(スタック、キューなど)だとかなり力を発揮してくれると思います!

C言語でのテスト駆動開発関連の本があります。

本を読むことについて

読書に関して考えてることのまとめ

最近どう本を読めばいいのかわからなくなってきた(好きなように読めばいいのだろうけど)のでちょっと読み方を変えたい。

小説を読んでいて読んだ時に感じたこと、思ったことから自分の考えをまとめていくことをもっとうまくする方法を知りたかったのだろうか。

そうならばいい読書感想文の書き方を調べることなんかは多少参考になると思う。だけど読書感想文とは違う。書評ブログとも違う。

インターネットと読書

パッと検索するとほとんどが「いかに効率よく知識を吸収して読んだ本について忘れないようにするか」の点に関する議論が多い気がするけど、自分が求めているのはそうではない。「すぐ良く効く」は長期的に見たら意味をなさないので10年後を考えた読書がしたい。

普通にググっても本をお勧めするページは無難なものしかない残念さ。書店員のブログとかをうまく見つけ出したい。

もしかするとamazonで本を買わない方がいいかもしれない。レビューが見えてしまってそれが判断基準になるとだんだん同じような本しか買わなくなってしまうから。

kindle

今漫画はほとんどkindleで買っている。引越しの時辛い思いをしたので。

電子書籍は紙の本より読むのに時間がかかる。確かに、kindleと紙の本で1文字あたりの視覚情報量に差がありそう。 電子書籍は紙の本より読書スピード遅い――専門家がテスト - ITmedia NEWS

読書力

英語の勉強などと違って読書はいくらしても読書力メーターみたいなものが存在しないのでどうやってもただの趣味にしかならない。物書きは読書の先にあるものであって読書の結果ではない。

仮定: 本を読んで書いた文章の量によって読書力は定義されうる

これはほとんど経験論である(だからこその仮定)。大量に本を読んで見た時期があったけど、ただ読んだ本のバリエーションが増えるに止まっていて先に進んでいない感覚があったから。読むだけでは咀嚼されないので咀嚼の機会を課す必要があるはず。

現代の小説を深く読むためには、古典をたくさん読んだ方がいいと思う。なぜなら、作者は古典に少なからず影響を受けているはずだからである。

ただ、ブックレビューを書くにしても、「この本の面白さを伝えたい」と思わないと書く気にすらならない。

読書とお金

どんな本でも良いと思ったら値段を気にせずに買うようにしたい。

値段が理由で買わない本はきっと無料でも読まないんだろうな。

TOEICリスニングを1.5倍速で200周音読した結果

TOEICのリスニングパート3と4を早いスピード(徐々にスピードを上げながら)で音読(オーバーラッピング)しました。

教材は公式問題集を使いました。この問題集にはTOEICの問題が2回分収録されています。

ここでは1回目と2回目を100周ずつ音読しようと思います。

公式TOEIC Listening & Reading 問題集2

公式TOEIC Listening & Reading 問題集2

新版があるようですね。

公式 TOEIC Listening & Reading 問題集 3

公式 TOEIC Listening & Reading 問題集 3

やる前のTOEICスコア

L: 435
R: 345
合計780点

やり方

1つの問題を5回連続で読んで次の問題に進む、というのをパート3から4までの69問繰り返すのを1セットとして、これを40セットしました。

ちなみにパート1と2は、「パート3と4やっときゃ余裕でいけるっしょw」と思って飛ばしました。これが後に悲劇を生むとも知らずに・・・

だいたい2時間半で1セット(5周)終わっていました。

1回目

まず、問題集の半分の1回目分です。はじめに1.23倍速で問題を解きました。その結果は

1.23倍速 74/100

単純にTOEICの点数にパーセントで換算すると366.3点になります。

最初30回は1.23倍速、次の20回は1.33倍速。1.33だと結構口が豆らなくなってました。equipmentとか言えません。 次の25回は1.39倍。その次は1.44倍

2回目

こちらも1回目と同様にまず問題を解きます。今度は1.33倍でやりました。

1.33倍速 83/100

前より上がっていて嬉しい限りです。同じようにTOEICの点数にパーセントで換算すると410.85点になります。

TOEIC本番

さて、1倍速のTOEIC本番に挑みました。

なんと、軽く見ていたパート1と2で結構聞き取れない問題がありました・・・ナメてた・・・

回数を減らしてでも全体を満遍なくやるべきでしたね。

そして問題のパート3と4ですがこちらは勉強のかいあってか、設問を読み始める前もしくは1つ目の設問が終わった段階で3つとも回答できたものがほとんどでした。

結果は以下のようになりました。

L: 455
R: 385
合計840

効果

やっていてリーディングにも効果があったことを感じました。

使ったツール

スピード調整とリピート再生のために使ったのはVLCというプレイヤーです。 Official download of VLC media player, the best Open Source player - VideoLAN

細かい速度調整ができなくて1.23倍とか1.33倍とか中途半端なことになってますw

ブラウザをキーボードだけで操作できるVimium

Vimiumは私の人生を変えたChromeプラグインの一つです。

このプラグインのおかげでPC作業の効率がかなり上がりました。以下のgifのようにキーボードだけでリンクを開けるようになったのがかなり役に立っています。

https://gyazo.com/57dc4c7eeb5d547b418cbd096aa64c29

これはHHKBなどの外付けキーボードと相性がいいです。なぜならHHKBを買った時にいちいちmac bookのトラックパッドに手を移動するのがかなり面倒だったのでキーボードでブラウザを操作できる方法がないかと思った時に調べて見つけたからです。

インストール方法

1 以下のページにジャンプします chrome.google.com

2 Chromeに追加 をクリック f:id:paging:20180226175123p:plain

3 Add extension をクリック f:id:paging:20180226175139p:plain

これでChromeの右上にvimiumが追加されたらインストール完了です。 f:id:paging:20180226175348p:plain

使い方

Vimiumは、プログラマー用のエディターであるvimと同じ操作方法でブラウザを操作できるようにしたものです。

以下に操作用のキーを示します。

キー 操作
k 上に少しスクロール
j 下に少しスクロール
u 上に半画面スクロール
d 下に半画面スクロール
gg 一番上にジャンプ
G (Shift+g) 一番下にジャンプ
r リロード
f 現在のタブで指定されたページを開く
F (Shift+f) 新しいタブで指定されたページを開く
J (Shift+j) 左のタブに移動
K (Sfhit+k) 右のタブに移動
H (Shift+h) 前のページに戻る
L (Shift+l) 次のページに移動する
x タブを閉じる
X (Shift+x) 最後に閉じたタブを復活させる

これだけの使い方を覚えられないって方も、fFだけでもかなり便利になるのでインストールの価値があります。

Vimiumの無効化

ブラウザゲームなどをするときにいちいちVimiumが反応していたら嫌ですよね?

ですが大丈夫です。Vimiumはページごとに無効化することができます。

f:id:paging:20180226194942p:plain

右上にあるVimiumのアイコンをクリックして出てきたボックスのPatternsに無効化したいページのURLを入力して、KeysExclude keysと入力してSave changesをクリックすれば完了です。

ちなみにVimiumはOSSGitHub上でソースコードが公開されています。

github.com

nand2tetrisを受講した

f:id:paging:20180226130723j:plain corseraでnand2tersisを受講しました。そのまとめです。

nand2tetrisとは

公式ページ: The Elements of Computing Systems / Nisan & Schocken

coursera: Build a Modern Computer from First Principles: From Nand to Tetris (Project-Centered Course) | Coursera

nand2tersisとは簡単に言えば「0から作るコンピューター入門」です。 これはMOOCの一つで、ヘブライ大学のShimon Schocken教授とNoam Nisan教授が行うこの授業をオンラインで受けることができます。

具体的には以下のようなことができます

  • HDLを使ってNANDから基本的な組み合わせ回路(加算器, ALU, MULなど)やフリップフロップなどを実装する
  • 基本的な回路を組み合わせてHDLでCPUの実装
  • アセンブリを用いてプログラミング(簡単な演算から画面出力まで)
  • アセンブラの作成
  • スタックマシンの作成

nand2tetrisができた経緯のスピーチがTEDにあります。興味がある方は一度見てみるといいかもしれません。 Shimon Schocken: The self-organizing computer course | TED Talk

また、資料等は無料で配布されており公式ページから見ることができます(英語)。

そしてこの資料は本にもなっており、日本語版は「コンピュータシステムの理論と実装」というタイトルでオライリーから発売されています。

コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方

コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方

Corsera上で講義はWeek1からWeek6まで6つの講義に分かれており、それぞれに課題があります。課題のポイントが80%を切る場合は講義修了時の証明書が発行されません。 この課題がよくできており、課題を自分の力で解くことによりコンピュータに関する知識が深く身につくように構成されています。 なお、上で紹介した本には課題がついていないので、しっかり身に付けようと思うのならばCorseraで受講することをお勧めします。

f:id:paging:20180226122911p:plain

感想

なかなか難しい論理回路とコンピュータアーキテクチャの実践を体験できてコンピューターを学ぶ上で非常にためになりました。上述の通り課題がとてもよくできており、実際に自分が組んだCPUが動いた時は感動してずっとテストを動かしていた程です。

持っててよかった論理回路入門。序盤、この本にはかなり助けられました。nand2tetrisを受講するにあたって必読と言ってもいいのではないでしょうか。

論理回路入門

論理回路入門

講義は以下のような流れで進みます

  • その週のテーマに沿って教授2人が解説
  • たまに例題が出る
  • 講義後半からは実際にシミュレーターの画面を映して実験
  • 課題を解く

私は一日二時間の時間をとって進めました。大体一講義三時間なので、一日目に講義を見て二日目残りの講義を見た後で課題を解き始めて終わったら次の講義を見て・・・という順にやっていったところ約一ヶ月半で修了することができました。

今までハードウェアに縁がなかったけど興味はある、という方には非常にオススメできる講義です。