2018年09月29日

シングルボードコンピュータへElasticsearch&Kibanaインストール

今回はシングルボードコンピュータへ
ElasticsearchとKibanaをインストールする方法を紹介します。

対象のシングルボードコンピュータはTinkerboardといった
ARMベースのシングルボードです。
頑張ればraspberryPIでも可能です。
また、単にARMベースのシングルボード上で
ElasticsearchとKibanaをアプリケーションとして動かすのではなく、
サービスとして登録して運用する手順を紹介します。


予めJava8をインストールしておいてください。 
Elastic社のサイトから下記のパッケージをダウンロードします。
elasticsearch-6.X.X.deb
kibana-6.X.X-amd64.deb
※XXはバージョンに依る

また、Nodejsも併せてダウンロードしてください。
Linux Binaries (ARM)のARMv7を使用します。




■Elasticsearchインストール
@Elasticsearchインストール
Javaなので環境によらずそのままインストールできます。
sudo dpkg -i elasticsearch-6.X.X.deb

Aフォルダ権限変更
sudo chmod -vR 755 /etc/elasticsearch/
sudo chmod -vR 755 /var/lib/elasticsearch/
sudo chmod -vR 755 /usr/share/elasticsearch/

Belasticsearch.yml設定変更
amd64専用の機能などを無効化しないと起動に失敗します。
少しおまじないを追加します。
sudo leafpad /etc/elasticsearch/elasticsearch.yml

xpack.ml.enabled: false
bootstrap.system_call_filter: false

※必要に応じて下記も追記する。
network.host: "0.0.0.0"
http.port: 9200
transport.host: localhost
transport.tcp.port: 9300


CJava設定
必要に応じてElasticsearchのメモリ割り当てを変更します。
sudo leafpad /etc/elasticsearch/jvm.options

デフォルトは
-Xms1g
-Xmx1g
-server#追記
でメモリ1GをElasticsearchに割り当てる設定です。
Tinkerboardならメモリ2GBなのでデフォルトでも問題ありませんが、
raspberryPIの場合はメモリ1GBなので
システム領域が全く確保できなくなってしまいます。
設定したメモリ領域+200MBが実際のプロセス上で使用するため、
raspberryPIの場合は
-Xms600m
-Xmx600m
-server#追記
が妥当だと思います。

ガシガシ使うのであれば
メモリ2GBかつeMMCなTinkerboard Sしか選択肢はありません。

Dサービス起動設定変更
デフォルトでは自動再起動の設定が無効のため、
下記のファイルに追記します。
sudo /bin/systemctl enable elasticsearch.service#ファイル生成
sudo leafpad /etc/systemd/system/multi-user.target.wants/elasticsearch.service

[Service]
・・・・
Restart=always
↑1行追加する
・・・・

Eサービス登録
下記のコマンドでサービスを有効化します。
sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable elasticsearch.service
sudo service elasticsearch start

これでElasticsearchがシステム起動時に自動的に起動します。

sudo service elasticsearch statusでサービス状態を確認できます。
http://localhost:9200へアクセスして確認してもよいと思います。

statusで問題なくても9200へアクセスできない場合は
elasticsearch.ymlかjavaの設定に何か問題があることが多いです。


■Kibanaインストール
Kibanaはamd64用にパッケージされているため、
そのままではインストールできません。

@強制的にARM環境にAMD64を追加するために設定を変更する
sudo dpkg --add-architecture amd64
※逆に削除する場合は dpkg --remove-architecture amd64

AAMD64が追加されているか確認する
sudo dpkg --print-foreign-architectures

BKibanaインストール
sudo dpkg -i kibana-6.X.X-amd64.deb

CARM版Nodejs解凍
tar xfv node-v8.XX.X-linux-armv7l.tar.xz

DARM版Nodejsへ置き換え
sudo cp  node-v8.XX.X-linux-armv7l/bin/node /usr/share/kibana/node/bin
sudo cp  node-v8.XX.X-linux-armv7l/bin/npx /usr/share/kibana/node/bin
sudo cp  node-v8.XX.X-linux-armv7l/bin/npm /usr/share/kibana/node/bin

Dkibana.yml設定変更
sudo leafpad /etc/kibana/kibana.yml
下記を追記する
server.host: "0.0.0.0"

Eサービス登録
下記のコマンドでサービスを有効化します。
sudo /bin/systemctl enable kibana.service
sudo service kibana start
これでKibanaがシステム起動時に自動的に起動します。
sudo service kibana statusでサービス状態を確認できます。
http://localhost:5601へアクセスして確認してもよいと思います。

必要に応じてKibanaのNode側もメモリ制限をしてもよいと思います。
NODE_OPTIONS="--max_old_space_size=256"


以上の手順でシングルボードコンピュータへ
ElasticsearchとKibanaをインストールすることができます。

正直、高性能なシングルボードコンピュータ、
Tinkerboard Sでもメモリ1.8GB状態が続くため、
Elasticスタックを運用するのは厳しい面もあります。
ただ、クラスタリングやkibanaとelasticsearchの別運用など
Elasticスタックの特徴を生かして色々遊べそうです。


posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2018年09月15日

販売製品一覧

販売中のCrescent製品を紹介します。

■ProjectionBall IoT (Version 5)
 ProjectionBallはベクター方式の簡易レーザープロジェクタで、
 簡単な図形や英数字などを描画できます。
 Running Electronics様で販売中です。

■ProjectionBall (Version 3)
 ProjectionBallはベクター方式の簡易レーザープロジェクタで、
 簡単な図形を描画できます。
 クラウドファンディングサイト、
 ※WiFi通信、任意文字列や時計の描画機能に非対応

■磁気エンコーダモジュール
 AMS社製磁気エンコーダAS5048Aを2.54 mmピッチへ変換する基板です。

■磁気エンコーダピッチ変換基板
 AMS社製磁気エンコーダAS5048AやAS5047Dなどを
 2.54 mmピッチへ変換する基板です。
 基板のみでエンコーダIC、磁石は同梱されていません。

■STM32F303CC搭載DIP変換基板
 Nucleo等の評価ボードが発売されていない48ピンIC STM32F303CC
 LQFP48を2.54 mmピッチへ変換した基板です。

■STM32F373CC搭載DIP変換基板
 Nucleo等の評価ボードが発売されていない48ピンIC STM32F303CC
 LQFP48を2.54 mmピッチへ変換した基板です。
 スイッチサイエンスで販売中

■アナログ出力MEMSマイク変換基板
 搭載した、ピッチ変換モジュールです。ピン間隔は2.54 mm。
 可聴音から超音波まで(100 Hz〜80 kHz)の幅広い帯域を
 高感度にセンシングすることが可能です。
 超音波センサや超音波通信などに使用可能です。

■デジタル出力MEMSマイク変換基板
 搭載した、ピッチ変換モジュールです。ピン間隔は2.54 mm。
 可聴音から超音波まで(100 Hz〜80 kHz)の幅広い帯域を
 高感度にセンシングすることが可能です。
 超音波センサや超音波通信などに使用可能です。

■LattepandaArduino変換基板
 LattepandaのLeonardoポートをArduino Leonardoピッチへ
 変換する基板です。Arduinoのシールドが使えるようになります。
 表面実装部品のみ実装済みです。
 ピンヘッダ、ソケット、リセット用のタクトスイッチは別売です。

■PS/2 USB逆変換アダプタ
 USBキーボードをPS/2化する変換アダプタです。
 標準ドライバで動作可能なUSBキーボードをPS/2キーボードとして
 使用できるように変換します。
 プログラミング専用こどもパソコンIchigoJamやサーバマシンなど、
 PS/2キーボードのみをサポートしている場合に本製品を使用して、
 USBキーボードをPS/2化します。

■e-Paper I2Cモジュール
 e-Paper I2CモジュールはWAVESHARE製200x200, 1.54inch
 E-Inkディスプレイを搭載したモジュールです。WAVESHARE製200x200,
 1.54inch E-InkディスプレイはSPI接続ですが、配線の容易性を実現するために
 SPI I2CプロトコルブリッジIC SC18IS602Bを搭載してI2C化しています。

■nanopi neo/neo2 拡張ボード
 FriendlyElec製NanoPi Neo/Neo2の拡張ボードです。
 ピンヘッダ上にあるUSB2ポート、I2Cポート(Grove)のコネクタを
 搭載しています。標準USBの1ポートで足りないという場合やGrove
 で拡張したいという場合に最適です。
 また、I2Cポートには純正NASキットと同じRTC DS1307が搭載しています。


posted by Crescent at 00:00| Comment(2) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2018年09月01日

Tensorflowインストール不具合解決方法

Tensorflowをインストールした際に
下記のような不具合が発生し、
Tensorflowライブラリが使用できない問題を
解決する方法を紹介します。

今回の不具合原因は古いCPUや一部の廉価版CPU
(PentiumN3700、N4200など)に起因します。
それ以外の最近のCPUではこの不具合は発生しません。

AnacondaからTensorflowをインストールしましたが、
動作確認のコードを実行すると
「ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました。」
というエラーが出て、正常に実行されません。

原因を調査すると結論は
CPUの最近の拡張命令が古いCPUや一部の廉価版CPUでは使用できないために
発生する原因と分かりました。

ライブラリ処理でAVX2命令を使用しており、
通常のフローでTensorflowをインストールすると
AVX2対応CPUのライブラリがデフォルトでインストールされます。

古いCPUや廉価版CPUではAVX2といった拡張命令を搭載していないため、
DLLエラーが発生します。

この場合は手動でAVX2のライブラリを削除し、
SSE2のライブラリを手動でインストールします。


ライブラリを入れなおして実行すると正常に動作することが確認できました。
インストール時にCPUの種別までは自動で判断してくれないようです。

実験環境として使用している廉価版CPUに
古いCPUや廉価版CPUを搭載しているPCでTensorflowで遊んでみる
という方はご注意です。

エラー詳細
(tensorflow17) C:\Users\***>python
Python 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 11:27:44) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
Traceback (most recent call last):
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 14, in swig_import_helper
return importlib.import_module(mname)
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 658, in _load_unlocked
File "<frozen importlib._bootstrap>", line 571, in module_from_spec
File "<frozen importlib._bootstrap_external>", line 922, in create_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
ImportError: DLL load failed: ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました。
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 58, in <module>
from tensorflow.python.pywrap_tensorflow_internal import *
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 17, in <module>
_pywrap_tensorflow_internal = swig_import_helper()
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 16, in swig_import_helper
return importlib.import_module('_pywrap_tensorflow_internal')
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
ModuleNotFoundError: No module named '_pywrap_tensorflow_internal'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\__init__.py", line 24, in <module>
from tensorflow.python import * # pylint: disable=redefined-builtin
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\python\__init__.py", line 49, in <module>
from tensorflow.python import pywrap_tensorflow
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 74, in <module>
raise ImportError(msg)
ImportError: Traceback (most recent call last):
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 14, in swig_import_helper
return importlib.import_module(mname)
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 658, in _load_unlocked
File "<frozen importlib._bootstrap>", line 571, in module_from_spec
File "<frozen importlib._bootstrap_external>", line 922, in create_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
ImportError: DLL load failed: ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました。
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 58, in <module>
from tensorflow.python.pywrap_tensorflow_internal import *
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 17, in <module>
_pywrap_tensorflow_internal = swig_import_helper()
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 16, in swig_import_helper
return importlib.import_module('_pywrap_tensorflow_internal')
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
ModuleNotFoundError: No module named '_pywrap_tensorflow_internal'

Failed to load the native TensorFlow runtime.
for some common reasons and solutions. Include the entire stack trace
above this error message when asking for help.
>>>

posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2018年08月25日

Kibanaコード更新方法

OSS版のKibanaで可視化ツールとして使用する場合に
ちょっと表示の挙動を変えたい、
表示文字列を変えたい
ということがある場合に今回、紹介する方法が役立ちます。


Kibanaはhtmlやjsのコードを最適化して
最適化したファイルから起動します。
そのため、Kibanaのsrcフォルダといったコードのフォルダを
修正、更新しても反映されません。



修正を反映させるポイントは
kibanaフォルダ直下のoptimizeフォルダ内のファイルを全部消す
ことです。

次回の起動時に自動的にsrcフォルダ等からoptimizeデータが生成され、
修正を反映させることができます。


なお、OSS版のKibanaはApache2のため、
修正箇所を外部に公開する必要はありませんが、
ユーザー側に修正箇所を知らせる必要があります。

posted by Crescent at 21:28| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2018年08月18日

WIZnet ioLibrary NTPの不具合

W5500などのEthenetr IC用のCライブラリ、
WIZnet ioLibraryの中でNTPの不具合の対処方法を紹介します。

ネットワークから時刻を取得して同期する機能として
NTPがあります。クライアント側のみに対応したSNTPの関数が
WIZnet ioLibraryの中に用意されています。


ArduinoではC++サンプルコードがあり、
NTPの不具合は受けません。


不具合としては
NTPで時刻を取得できない現象です。

原因としてはリトライカウントが増えず、
リクエストの再送信が行われませんでした。
1回目の時刻取得のリクエスト以降、
再送されず、ずっと返答待ち状態になってしまいます。

特に接続直後のネットワークが確立していない状態で
NTPで時刻取得のリクエストすると
1回目のリクエストを落としてしまう可能性が非常に高く、
リクエストの再送信が重要となります。



Cライブラリで用意されているSNTP関数の中に
int8_t SNTP_run(datetime *time)があり、
リトライカウントに応じた処理をしています。

【修正前】
〜〜〜〜〜〜〜〜〜〜
if(ntp_retry_cnt<0xFFFF)
{
  if(ntp_retry_cnt==0)//first send request, no need to wait
  {
    sendto(NTP_SOCKET,ntpmessage,sizeof(ntpmessage),NTPformat.dstaddr,ntp_port);
    ntp_retry_cnt++;
  }
  else // send request again? it should wait for a while
  {
    if((ntp_retry_cnt % 0xFFF) == 0) //wait time
〜〜〜〜〜〜〜〜〜〜


【修正後】
〜〜〜〜〜〜〜〜〜〜
if(ntp_retry_cnt<0xFFFF)
{
  if(ntp_retry_cnt==0)//first send request, no need to wait
  {
    sendto(NTP_SOCKET,ntpmessage,sizeof(ntpmessage),NTPformat.dstaddr,ntp_port);
    ntp_retry_cnt++;
  }
  else // send request again? it should wait for a while
  {
     ntp_retry_cnt++;//追加
     if((ntp_retry_cnt % 0xFFF) == 0) //wait time
〜〜〜〜〜〜〜〜〜〜

上記の修正である間隔でリクエストの再送信が行われるようになります。

posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする