「RaspberryPiで同時多発テロ警報装置」の版間の差分

提供: ディーズガレージ wiki
移動先: 案内検索
(RNG)
(RNG)
130行目: 130行目:
 
                 if num > 1:
 
                 if num > 1:
 
                     count += 1
 
                     count += 1
             binary = (count / length) * 2 - 1 + 0.007
+
             binary = (count / length) * 2 - 1 + 0.0075
  
 
             dict = [{
 
             dict = [{

2019年6月28日 (金) 06:25時点における版

同時多発テロ警報装置 別窓

量子もつれで遊びたいが手頃なものが売ってなく簡単なところから始めてみます。
量子乱数生成器を使うべきですが標準搭載のハードウェア乱数生成器から使ってみます。

メトリクスから見える可能性(疑似科学許容)

  • 人類の意識が量子乱数生成器に影響を与え偏りが見えるようなので同時多発テロ警報装置 << 今ココ
  • 量子もつれと五次元世界は関係があるようなので五次元生命体ファーストコンタクト
  • 2050年には地球は住めなくなるようなので重力操作のリアルインターステラー
  • 地球外知的生命体と居酒屋行きたい

ハードウェア乱数生成器エントロピー偏り具合を時系列データベースで可視化と警報通知してみます

環境

ボード Raspberry Pi 2 Model B
OS Raspbian Stretch with desktop 2019-04-08
ストレージ SanDisk Ultra microSDHC 16GB
LAN 標準搭載の有線LAN
時系列DB Ubuntu 14.04 LTS

乱数生成器の区別

量子乱数生成器 -
ハードウェア乱数生成器 /dev/hwrng
カーネル内蔵の乱数生成器 /dev/random /dev/urandom

具合

  • グラフ2値は何か間違えてる 中央に描かれない
  • 理想の偏りは常に0の線なんだろうけど比較用に若干ノイズ入り欲しいかも

準備

/dev/hwrngはデフォルトで有効になってる
/dev/hwrngは/dev/randomに接続していない

hwrng

/dev/randomと同じパーミッションに変更
確認

$ ls -l /dev/hwrng
crw------- 1 root root
$ ls -l /dev/random
crw-rw-rw- 1 root root

変更

$ sudo chmod 666 /dev/hwrng
$ ls -l /dev/hwrng
crw-rw-rw- 1 root root

再起動でパーミッションが戻ってしまう
追加設定

$ sudo nano /etc/rc.local

末尾のexit 0手前に追記

chmod 666 /dev/hwrng

保存: Ctrl + o > リターン
終了: Ctrl + x

再起動

# sudo reboot

確認

$ ls -l /dev/hwrng
crw-rw-rw- 1 root root

スクリプト

方向性

  • hwrngのバイナリモードで取得できる乱数はバイト列
  • バイト列はバイト型を格納する配列
  • バイト型は0x00~0xFFの値を取る 2桁の16進数=10進数で0~255の整数
  • バイト列を10進数に変換し集計 平均値が中央値(127.5)の上下どちらに偏るのか見る >> Decimal
  • 255種の場合、特に数の少ない範囲で変化が出にくい
  • 10進数バイト列すべてを127.5減算し-+で01の2種に振り分けし集計 平均値が中央値(0)の上下どちらに偏るのか見る >> Binary

※間違えてるかも

RNG

random_metrics.py

$ cd ~
$ sudo apt-get install python3-pip
$ pip3 install influxdb
$ sudo nano random_metrics.py

ソース

# -*- coding: utf-8 -*-

import signal
from influxdb import InfluxDBClient
import struct
from time import sleep

signal.signal(signal.SIGINT, signal.SIG_DFL)

CLIENT = InfluxDBClient("192.168.1.180", 8086, "root", "root", "randomdb")

while True:
    try:
        with open("/dev/hwrng", "rb") as f:
            bytes = f.read(100000)
            taple = struct.unpack("B" * len(bytes), bytes)
            length = len(taple)

            # Decimal
            total = sum(taple)
            decimal = (total / length - 127.5) / 100

            # Binary
            count = 0
            for i in taple:
                num = i - 127.5
                if num > 1:
                    count += 1
            binary = (count / length) * 2 - 1 + 0.0075

            dict = [{
                "fields": {
                    "d_metric": decimal,
                    "b_metric": binary
                },
                "tags": {
                    "machine": "iot"
                },
                "measurement": "metrics",
            }]
            CLIENT.write_points(dict)
        sleep(10)
    except:
        pass

保存: Ctrl + o リターン
終了: Ctrl + x

起動

$ python3 random_metrics.py

時系列DB

Ubuntu

IP固定

$ ifconfig

enp0s3

$ sudo gedit /etc/network/interfaces

末尾に追記

auto enp0s3
iface enp0s3 inet static
address 192.168.1.180
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 192.168.1.1

再起動

$ sudo reboot

InfluxDB

参考: InfluxData | Documentation | Installation

インストール

$ wget https://dl.influxdata.com/influxdb/releases/influxdb_1.4.2_amd64.deb
$ sudo dpkg -i influxdb_1.4.2_amd64.deb

再起動

$ sudo reboot

設定

$ influx
# データベース作成
> CREATE DATABASE randomdb
# 作成済みのデータベース確認
> SHOW DATABASES
# ポリシーtrafficを設定(30日保存し古いものは自動的に削除)
> CREATE RETENTION POLICY traffic ON randomdb DURATION 30d REPLICATION 1 DEFAULT
# ポリシーの確認
> SHOW RETENTION POLICIES ON "randomdb"
(# ポリシー変更)
> ALTER RETENTION POLICY traffic ON randomdb DURATION 365d
# 終了
> exit

Grafana

参考: Installing on Debian / Ubuntu

インストール

$ wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana_4.6.3_amd64.deb
$ sudo apt-get install -y adduser libfontconfig
$ sudo dpkg -i grafana_4.6.3_amd64.deb
$ sudo update-rc.d grafana-server defaults 95 10
$ sudo service grafana-server start

再起動

$ sudo reboot

設定

http://127.0.0.1:3000
またはローカルネット内の他のPCから http://192.168.1.180:3000
User: admin
Password: admin

Grafana左上アイコン→Data Sources→+Add data source

Name randomdb
Type InfluxDB
HTTP settings
URL http://localhost:8086
Access proxy
InfluxDB Details
Database randomdb
User admin
Password admin

確認

過去24時間 10秒更新
http://dz.plala.jp:3000/dashboard/db/tong-shi-duo-fa-terojing-bao-zhuang-zhi?orgId=2&from=now-24h&to=now&refresh=10s
過去7日間 1分更新
http://dz.plala.jp:3000/dashboard/db/tong-shi-duo-fa-terojing-bao-zhuang-zhi?orgId=2&from=now-7d&to=now&refresh=1m

更新履歴

  • 2019.06.16 書き直し