2018年10月5日金曜日

最近の忙しいこと

な、、、なんと

倉庫管理システムを開発しているわけで、、、

サーバーはRaspberry Pi 3+

クライアントは、Android

いろいろあったけど、なんとか動き始めてきたきた

Androidでの、アプリは初めて、いきなりGoogleのmlkitも使い

Androidの作法も知らずに、大苦戦。

友人に頼んで、半日、ご紹介頂いたプロのレクチャーを受けて、

神を崇めるような、最高のレクチャーで、、、

僕も開眼できそうで、、、これからもAndroid開発続けようと

端末は、SONY Xperia XZ2 snapdragon 845

これが、また、爆速で、、、以前のAndroidモッサリ感がなくて、、、

Android 9developer previewを入れて、、、

9って、IOS的な操作になっていて、、、

でも、mlkitの重たい処理もはずも、サクサク

いよいよ、iPhoneはどんどん高くなるし、

業務系は、Androidだなぁと実感。

倉庫管理システムは、当然、自動搬送ロボットと連動するわけで、

そのロボットも10月末までにデモしなければ、、、

忙しいのか、何なのか、わからない状態で、、、

でも、一歩一歩進んでいるかなぁ、、、 

でも、昨日は、mariaDBにハマり。

今日は突破するぞ、、、

Peace!!

2018年9月18日火曜日

地方創生を妨げる、地方のプライドと意識

最近、某県でロボットを活用した地域創生の取組をしているけど、、、

やはり、地域の意識ってのが邪魔するなぁと、、、

「まぁ、これまでは何とかやってこれたから、

将来は解らないけど、ここしばらくは大丈夫」

これが、根底にある企業や人が、多いかも

企業は、昭和思考が抜けきれず、、、

特に、地方を代表する企業が、、、

言い方変えれば、その地方でしか活動できない企業

こういう企業が、「昭和の牛歩思考」で Unbelievable


良いも悪いも日本は、東京中心の政治や大企業で動いているわけで

チャンスを掴むには、それなりのやり方が必要

そして、スピード、、、


地方創生がうまくいかないのは、

「地方の鏡で、日本を写すから」

その鏡は、明日も、明後日も変わらないで居て欲しいという

見たい所しか見えないもの。

見たくない事を、見て認識しないと、チャンスは訪れない。


でも、みんなやっぱり自分の鏡で見たいわけで、、、

衰退する地方ほど、自分の鏡を離さない。

Peace!!


2018年8月30日木曜日

MEMO: Android Studio 3.2 RC2 "Application Installation Failed"

Android Studio 3.2 RC2 を使って、SONY Xperia XZ2のアプリケーション開発しているけど、、、


が突然でて、、、
おおおって事で、
Root化して消せばいいのねと思ったけど、
最新機種のためか、いくつかのroot化アプリケーション使ってもダメで
途方に暮れていたら、
世の中には、優しい人が居て、それに従って "Instant Run" という
Android Studioの
鳴り物入りの機能を使わなければ、大丈夫だと、、、

その手順のメモです。
因みに、Xperiaにインストールできた後に、
"Instant Run" enableにしたけど、
同じエラー、、、
こりゃ、バクだなぁと、、、

できればいいので、

Peace!!






2018年8月28日火曜日

追随型搬送ロボットは生産性Upしないし、危険

最近、搬送ロボットの問合せが多いのですが、

「追随できますか?」

当たり前だろう、、、もう3年前の話、

でも、僕は、最初から自律を目指していたし、

人と協調して動く時は、ロボットは前

これって、当たり前で、、、

この当たり前が、解らない人は、ロボットに手を出さない方がよい。

今日も、商社から人が来たけど、追随は意味が無い事をよく理解したみたい

搬送ロボットは

(1) 自律走行が基本

(2) 人と協調する時は、前を動く

(3) 複数の人と複数のロボットが協調して作業をする

という事、、、

当たり前の事、、、

特に、(3)は最初から考えていて、だからRDCSを開発したんだ



Peace!!

久しぶり、、、

まぁ、久しぶりにブログ

深層学習、Android、またまたいろいろ取り組み中ですが、

休みたいですね。

Raspberry Pi 2B を動かしていたSDカードを、そのまま

Raspberry Pi 3 に突っ込んだら、動かないわけで、、、

おまじない、、、どこにでも書いてあることだけど、、、

sudo apt-get update
sudo apt-get dist-upgrade
sudo rpi-update
sudo reboot

しかし、Peace じゃないなぁ、、、(-_-)

2018年6月11日月曜日

フューチャアグリ株式会社の5年 まとめてみた

僕が、ロボット開発をするために創業した会社

フューチャアグリ株式会社は、2013年4月1日に設立した会社

元々は、自分の農場で使うロボットを開発する為に作った会社

だから、こじんまりと、楽しくするはずだった。

で、、、いろいろ起こり、あああああって感じで、6年目に入ったわけです。

通常、創業の5年でつぶれる会社がほとんどと言われる中、

難とか持ちこたえて、相変わらずロボット開発をしてるわけで、、、

いろいろやってきました。

上手くいくこともあれば、問題もありーの、、、

苦しい事が多かった5年だけど、、、

なんとか、ある分野では、日本の最先端かもという、

変な位置づけもありーーーの

今の5年の取組まとめたものがこれ!、、、

人間、一歩踏み出せば、何とかなるんですね。

僕の大好きな言葉、そんな感じの5年間、そしてこれからも、、、

All it needs is courage, imagination, and a little dough.

Peace!



2018年6月9日土曜日

memo: Building an Intel Movidius on Raspberry pi

これもメモ

まず、ここを見る

https://movidius.github.io/ncsdk/install.html

swapファイルを、ページに従って1024MBに拡張する。

$ sudo nano /etc/dphys-swapfile

$ sudo /etc/init.d/dphys-swapfile restart

後は、

$ git clone -b ncsdk2 http://github.com/Movidius/ncsdk && cd ncsdk && make install

で、swapファイルを、元の100MBに戻す。
で終わり、、、(^^)

Peace!

memo: Building OpenCV 3.4.1 using cmake-gui

サクッとbuild するなら、、、

cmake-gui 使って、赤い部分がなくなるまで Configure して

Generate して、make すればいい。

という、当たり前のメモ、、、

Peace!

2018年5月26日土曜日

TensorFlow 1.8.0 update

いつもの通りこんな感じ

$ wget https://github.com/lhelontra/tensorflow-on-arm/releases/download/v1.8.0/tensorflow-1.8.0-cp35-none-linux_armv7l.whl

$ sudo pip3 install tensorflow-1.8.0-cp35-none-linux_armv7l.whl

すでにインストールされている1.7.0は、uninstallされてinsatallされる

Peace

2018年5月12日土曜日

2018年4月8日日曜日

OpenCV3.4.1 ERROR ocv_append_source_files_cxx_compiler_options

このエラーは、opencv contrib moduleのメンテナンス版で発生している。

datasetのCmakefile.txt内の構文のエラー

OpenCV3.4.1 公開当時の contribでは、発生しない。


新しいのは、、、

set(the_description "datasets framework")

set(filter_srcs "${CMAKE_CURRENT_LIST_DIR}/src/tinyxml2/tinyxml2.cpp")
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  ocv_append_source_files_cxx_compiler_options(filter_srcs "-Wno-suggest-override")  # GCC
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  ocv_append_source_files_cxx_compiler_options(filter_srcs "-Wno-inconsistent-missing-override")  # Clang
endif()

ocv_define_module(datasets opencv_core opencv_imgcodecs opencv_ml opencv_flann OPTIONAL opencv_text WRAP python)

ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4267) # flann, Win64


メンテ前は、、、

set(the_description "datasets framework")
ocv_define_module(datasets opencv_core opencv_imgcodecs opencv_ml opencv_flann OPTIONAL opencv_text WRAP python)

ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4267) # flann, Win64


という事で、古いもので、、、

Contribは、うまくいったものを保存しておく必要があるということかぁ、、、

因みに、cmakeのパラメータは、、、
QTとOpenGLは取った
あと、contribのパスは確認する事 opencv_contrib-masterになっているかも

cmake -D CMAKE_BUILD_TYPE=RELEASE \
                        -D CMAKE_INSTALL_PREFIX=/usr/local \
                        -D INSTALL_PYTHON_EXAMPLES=ON \
                        -D PLANTUML_JAR=/usr/share/java/plantuml.jar \
                        -D ENABLE_NEON=ON \
                        -D WITH_TBB=ON -D BUILD_TBB=ON \
                        -D WITH_QT=ON -D WITH_OPENGL=ON \
                        -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.1/modules \
                        -D BUILD_EXAMPLES=ON ..

あっ、、、これも、、、でも、TBBは止めた

sudo apt-get install libtbb-dev


Peace!!

2018年3月14日水曜日

OpenCVのビルド整理

ここらで、OpenCV buildの整理。いままで、ザクっとやっていたので、、、

1.必須モジュール
build-essential cmake pkg-config cmake-qt-gui mesa-utils libgl1-mesa-dri
cmake-qt-gui は、UIでパラメータの設定をしなければ不要

2.基本演算系
libatlas-base-dev gfortran libeigen3-dev

3.画像、動画モジュール
libjpeg-dev libtiff5-dev  libpng12-dev libjasper-dev
libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libv4l-dev

4.OpenCVのGUIモジュール
libgtk2.0-dev libgtk-3-dev

5.3Dモデル表示モジュール
libvtk5-dev libvtk5-qt4-dev  python-vtk tcl-vtk 
libqt4-core libqtgui4 libqt4-test libqt4-opengl-dev (Qt系が必要なら)

6.python
python3-dev     2系は使わないので、、、

7.深層学習
libprotobuf-dev protobuf-compiler

8.ドキュメント系
sphinx-common doxygen
でも、インストールしない

9.PlantUML
http://plantuml.com/download からダウンロードして、リネームかシンボリックリンク
cd /usr/share/java  にコピーする
sudo ln -s plantuml.8048.jar plantuml.jar


10. cmake 設定
contrib不要の場合
cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D PLANTUML_JAR=/usr/share/java/plantuml.jar \
    -D ENABLE_NEON:BOOL=ON \
    -D WITH_TBB=ON -D BUILD_TBB=ON \
    -D WITH_QT=ON -D WITH_OPENGL=ON \
    -D BUILD_EXAMPLES=ON ..

contribを含める場合
cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D PLANTUML_JAR=/usr/share/java/plantuml.jar \
    -D ENABLE_NEON=ON \
    -D WITH_TBB=ON -D BUILD_TBB=ON \
    -D WITH_QT=ON -D WITH_OPENGL=ON \
    -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.1/modules \
    -D BUILD_EXAMPLES=ON ..

一発shellはこれ(^^)

#! /bin/bash

date;

if [[ `lsb_release -d` =~ .*Raspbian.* ]]
then
        echo "";
        read -p " Continue installing OpenCV (y/n) ? " CONTINUE
        if [[ "$CONTINUE" == "y" || "$CONTINUE" == "Y" ]]; then
                echo "";
                echo "Installing OpenCV";
                echo "";
#                sudo apt-get update -y && sudo apt-get upgrade -y
#                sudo apt-get install -y build-essential cmake pkg-config
#                sudo apt-get install -y libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
#                sudo apt-get install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
#                sudo apt-get install -y libxvidcore-dev libx264-dev
#                sudo apt-get install -y libgtk2.0-dev libgtk-3-dev
#                sudo apt-get install -y libatlas-base-dev gfortran
#                sudo apt-get install -y python2.7-dev python3-dev

                  sudo apt-get install -y build-essential cmake pkg-config cmake-qt-gui mesa-utils libgl1-mesa-dri
                  sudo apt-get install -y libatlas-base-dev gfortran libeigen3-dev
                  sudo apt-get install -y libjpeg-dev libtiff5-dev  libpng12-dev libjasper-dev
                  sudo apt-get install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libv4l-dev
                  sudo apt-get install -y libgtk2.0-dev libgtk-3-dev
                  sudo apt-get install -y libvtk5-dev libvtk5-qt4-dev  python-vtk tcl-vtk
                  sudo apt-get install -y libqt4-core libqtgui4 libqt4-test libqt4-opengl-dev
                  sudo apt-get install -y python3-dev
                  sudo apt-get install -y libprotobuf-dev protobuf-compiler
                  sudo apt-get install -y sphinx-common doxygen

                cd ~
                wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.1.zip
                unzip opencv.zip
                wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/master.zip
                unzip opencv_contrib.zip
                                mv ~/opencv_contrib-master ~/opencv_contrib-3.4.1
                cd ~/opencv-3.4.1/
                mkdir build
                cd build

#                cmake -D CMAKE_BUILD_TYPE=RELEASE \
#                      -D CMAKE_INSTALL_PREFIX=/usr/local \
#                      -D INSTALL_PYTHON_EXAMPLES=OFF \
#                      -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.0/modules \
#                      -D BUILD_EXAMPLES=OFF ..

                 cmake -D CMAKE_BUILD_TYPE=RELEASE \
                        -D CMAKE_INSTALL_PREFIX=/usr/local \
                        -D INSTALL_PYTHON_EXAMPLES=ON \
                        -D PLANTUML_JAR=/usr/share/java/plantuml.jar \
                        -D ENABLE_NEON=ON \
                        -D WITH_TBB=ON -D BUILD_TBB=ON \
                        -D WITH_QT=ON -D WITH_OPENGL=ON \
                        -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.1/modules \
                        -D BUILD_EXAMPLES=ON ..

                make
                sudo make install
                sudo ldconfig
        else
                echo "";
                echo "Skipping OpenCV installation";
                echo "";
        fi
else
        echo "Installing opencv python for non-Raspbian";
        sudo -H pip3 install opencv-python
        sudo -H pip3 install opencv-contrib-python
fi
date;

2018年3月12日月曜日

Raspberry Pi /tmpをメモリー上に確保する

SDカードは、各込み速度が遅くて, いろいろ処理速度を高めようとすると
「データ量の見積もりが可能」であれば
/tmpをメモリー上に取る事が有効なはず
古典的な手法だけど、その手順

(1) メモリー上に/tmpを設定、最後に追記する
sudo vi /etc/fstab

tmpfs     /tmp            tmpfs    defaults,size=84m,noatime,mode=1777      0       0
tmpfs     /var/tmp        tmpfs    defaults,size=16m,noatime,mode=1777      0       0
tmpfs     /var/log        tmpfs    defaults,size=32m,noatime,mode=0755      0       0

(2) /etc/rsyslog.confの編集

sudo vi /etc/rsyslog.conf


(3) /etc/rc.local

sudo vi /etc/rc.local
cat /etc/rc.local

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi


# create folder on ram disk

mkdir -p /var/log/ConsoleKit
mkdir -p /var/log/samba
mkdir -p /var/log/fsck
mkdir -p /var/log/apt
mkdir -p /var/log/ntpstats
mkdir -p /tmp/motion
chown root.ntp /var/log/ntpstats
chown root.adm /var/log/samba
touch /var/log/lastlog
touch /var/log/wtmp
touch /var/log/btmp
chown root.utmp /var/log/lastlog
chown root.utmp /var/log/wtmp
chown root.utmp /var/log/btmp

exit 0

(4) sudo reboot

(5) 確認   ホスト名が違うのは、ご愛敬(^^)/
before


after

Peace!!

2018年3月1日木曜日

Setup PiTFT3.5 on Stretch

ロボットのUIは、タッチパネルがなんといってもダントツに良い。
紆余曲折があり、Adafruit PiTFT3.5を一点だけ除けば満足して使っている。
一番の良いのは、タッチパネルで使っているGPIO以外が使える事。
だから、I2Cなどのセンサが活用できる。これは、以外に重要なポイントなんです。

一点だけ除くと書いたのは、Easy InstallのモジュールがJessieって事。
ところが、、、
なんと、Device Treeの導入でStretchでも動くとな、、、
「感謝の記事」は、こちら、、、

https://qiita.com/hishi/items/bdd630666277e4f8162a

おかげで、こんな感じで使えるようになりました。



注意点(1)
この説明と違うの所は、僕が使っているのは3.5inchなので/boot/config.txtのこの設定。

dtoverlay=pitft35-resistive,rotate=90,speed=62000000,fps=25

画面も90度回転して電源が下になり、これも良し!
満足満足、、、
この数値の説明は、下記Adafruitページの中ほど、、、

https://learn.adafruit.com/adafruit-pitft-28-inch-resistive-touchscreen-display-raspberry-pi/help-faq

注意点(2)
sudo rmmod stmpe_ts; sudo modprobe stmpe_ts

のあとは、sudo rebootが必要

ただ、ちょっと不明な点が多くて、安定しないかも、、、

Peace!!

2018年2月24日土曜日

いつも隣に、死がある

20代で余命宣言されて、、、

いろいろあり、

まずは、40まで生きる事

そして、次は60まで生きる事

そんな人生を僕は送って来た

ただ、予感は60

だから、どう考えても、それ以降が

脳みそのなかでデッドロック状態

バカでかいコンクリートブロックが、思考を進ませない

でも、常に死を意識していたから、何気に納得しているかも、、、

世の中で、絶対は、生きている人間には、死だけ

母が言っていた

絶対の世界に、行くのは確実

残された人が困らないように、

かたずけが、この半年の仕事

2018年2月7日水曜日

memo : Repeat on the command line

個人的なメモ、、、
コマンドラインで繰り返し処理をする。


while true; do date; sleep 1s; done
i=1; while [ $i -le 10 ]; do echo $i; i=$(expr $i + 1);done
watch -n 1 date

Peace!!

2018年2月6日火曜日

An installation of opencv2.4.13.5 on raspberry Pi

raspberry piでopencv 通常にインストール(apt-get) すると
なんと、2.4.9という4年前のモノ

なんでなんだろう。。。

そんな事より、都合で2.4.X使いたいので、buildしてインストールする。
現時点は、2.4.13.5。

いろいろ面倒な事をしたくなので、通常通りにインストール
sudo apt-get -y install libopencv-dev

これにかぶせる形で、インストールする
C言語だけしか使わないので余計なものはインストールしない
とは言っても、最初の通常インストールは意味なかったりして。
wget https://github.com/opencv/opencv/archive/2.4.13.5.zip
unzip 2.4.13.5.zip

cd opencv-2.4.13.5
mkdir build
cd build

sudo apt-get install -y build-essential git cmake pkg-config cmake-qt-gui mesa-utils  libgl1-mesa-dri libjpeg-dev libtiff5-dev libpng12-dev libjasper-dev  libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libgtk2.0-dev libprotobuf-dev protobuf-compiler  libatlas-base-dev gfortran libeigen3-dev libv4l-dev python3-dev libqtgui4 libqt4-test libqt4-opengl-dev libvtk6-dev

cmake -D CMAKE_BUILD_TYPE=RELEASE      -D CMAKE_INSTALL_PREFIX=/usr/local      -D INSTALL_PYTHON_EXAMPLES=OFF       -D ENABLE_NEON=ON      -D WITH_TBB=OFF -D BUILD_TBB=OFF       -D WITH_QT=OFF -D WITH_OPENGL=OFF      -D BUILD_opencv_freetype=OFF      -D BUILD_EXAMPLES=OFF -D WITH_VTK=ON ..

make -j4
sudo ldconfig

例の如く小一時間





2.4.13.5 だす
cd samples/c
./build_all.sh
./facedetect  --cascade="../../data/haarcascades/haarcascade_frontalface_alt.xml" --scale=1.5 ./lena.jpg


Peace!!

2018年2月1日木曜日

A setting realvnc server

今まで、気が付かなったけどVNCサーバが標準でインストールされている。
使う使わないは、raspi-config  で設定
ただ、デフォルトの画面サイズだと、拒否感満載
画面サイズのは変更方法
因みに新たにインストールする時は、、、
    sudo apt-get install realvnc-vnc-server
     sudo systemctl enable vncserver-x11-serviced.service
     sudo systemctl start vncserver-x11-serviced.service

https://elinux.org/RPiconfig#Video_mode_options

ここを参考に下記リストを参照して /boot/config.txt に赤字を追加する
画面の大きさは、hdmi_modeで設定
hdmi_mode=82 1080p 60 Hz

hdmi_mode=42   1400x1050  60 Hz
160206追記はじめ
OpenGLのドライバーを有効にすると、画面サイズがデフォルト画面になってしまう。従って、RealVNCを使うときは、OpenGLドライバーとdisableする。
赤字部分。下のconfig.txtの下記部分を比較して設定する事。
画面の感じは、85番が一番よいかも。。。

hdmi_ignore_edid=0xa5000080
hdmi_group=2
# RealVNC setting
# when  use RealVNC, OpenGL driver disable as below
# dtoverlay=vc4-kms-v3d
# 16 1024x768  60Mhz
# 42 1400x1050 60Mhz
# 82 1080
# 85 720p
hdmi_mode=85

160206追記終わり

sudo vi /boot/config.txt
cat /boot/config.txt
# For more options and information see
# http://rpf.io/configtxt
# Some settings may impact device functionality. See link above for details

# uncomment if you get no picture on HDMI for a default "safe" mode
#hdmi_safe=1

# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
disable_overscan=1

# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16

# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720

# uncomment if hdmi display is not detected and composite is being output
#hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)
#hdmi_group=1
#hdmi_mode=1
hdmi_ignore_edid=0xa5000080
hdmi_group=2
hdmi_mode=85

# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
#hdmi_drive=2

# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
#config_hdmi_boost=4

# uncomment for composite PAL
#sdtv_mode=2

#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800

# Uncomment some or all of these to enable the optional hardware interfaces
#dtparam=i2c_arm=on
dtparam=i2s=on
#dtparam=spi=on

# Uncomment this to enable the lirc-rpi module
#dtoverlay=lirc-rpi

# Additional overlays and parameters are documented /boot/overlays/README

# Enable audio (loads snd_bcm2835)
#dtparam=audio=on
# dtoverlay=i2s-mmap
dtoverlay=googlevoicehat-soundcard
# dtoverlay=googlevisionbonnet-myriad
# dtoverlay=aiy-io
# dtoverlay=aiy-leds
start_x=1
gpu_mem=128
# dtoverlay=dwc2

Peace!!


2018年1月30日火曜日

Google AIY Project Voice Kit (Photo only)

2台購入したので、さっそく組立、、、20分位/台
まだ動かないけど、写真だけアップ

意外と小さい

Peace!!



2018年1月17日水曜日

Learning sed for bash cgi processing

開発時には、何回も”ちょっとテスト”必要ですが、、、
今回は、sed使ってcurlで投げた引数の処理
curlで投げた先が、bashというのはご愛敬で、、、

あまりにも、久しぶりのsedを使った処理だったので、メモとして記録

端末側からは、、、

curl -X POST -d "qq=123&aaa=222" http://www.workrobot.co.jp/api/rdcs/v2/mng/robot/net/net_setting

実行結果は、、、
POST
14

key1: qq  value1: 123
key2: aaa  value2: 222

success command

サーバ側のスクリプトは、、、
#!/bin/bash

#touch `/bin/hostname`

#cat - > qq
#cat -  > qq
read STRING

echo $REQUEST_METHOD
echo  $CONTENT_LENGTH
echo
value=`echo "${STRING}" | sed -e "s/.*=\(.*\)/\1/"`
str=`echo "${STRING}" | sed -e "s/\(.*\)=.*/\1/"`
key=`echo "${str}" | sed -e "s/.*&\(.*\)/\1/"`

#echo $str
str2=`echo "${str}" | sed -e "s/\(.*\)&.*/\1/"`
value1=`echo "${str2}" | sed -e "s/.*=\(.*\)/\1/"`
key1=`echo "${str2}" | sed -e "s/\(.*\)=.*/\1/"`
echo "key1:" ${key1} " value1:" ${value1}
echo "key2:" ${key} " value2:" ${value}
echo
echo "success command"

sedの呪文の世界(笑)

Peace!!


MultiProcess or MultiThread

メモメモ、、、、

僕は、自律制御の仕組を開発している。
もう、3年程度たつので、現在のモノをスマートにブラッシュアップしたくていろいろ検討中
内部では、様々な処理をマルチタスクで行っているが、いよいよスパゲティー状態。それと、いろいろなノウハウもたまり、、、

再実装を考えた場合、マルチタスクのシステムなので、
それをどう実現する様に、改めて考えている。
技術的には、マルチスレッドやマルチプロセスなどのテクニックの利用となる。
ネットには、一般論や解りやすい事例は書いてあるけど
自分の技術選択に必要な情報はほとんどない
で、自分で決めるわけだけど、、、
以下は、まとまっていないけど、、、

技術選択基準は、
・堅牢なシステムの実現
・開発効率、特に検証・デバッグのやりやすさ
・システムの拡張のしやすさ

・堅牢性
ロボットのコントローラなので、堅牢な作りにする必要がある。
堅牢とは、、、、
・目的の機能を誤りなく実行し続ける事。
・想定内の異常が発生した場合、所定の手続きで、必要な処置を行い決められた状態に移行する事

人それぞれによって異なる訳で、、、
実際は、システムデザイン、プログラムデザインに係わる事なんだけど、、、
一つのタスクだけで動くわけではないので、
マルチに動くタスクをどのように管理するのか?
それが、重要で、、、
となると、
マルチスレッド、マルチプロセスどちらを上の基準から選択するのか?

自分の堅牢の定義が世間一般的なのかはさておき、、、
マルチタスクの視点から言えば、徹底的なモジュール化をベースに、モジュール結果の評価を正しく行い、次の処理へとつなぐこと。
では、スレッドとプロセスどちらが適しているのだろうか、、

その前に、
マルチスレッドと、マルチプロセスの復習
・マルチプロセスは、複数の独立したプロセスで並列処理する事
・マルチスレッドは、一つのプロセス内で並列処理する事

ブラウザーや、ウェブサーバーはマルチスレッドになっている。
ブラウザーのファイルダウンローなどはスレッド、また画面に現れるダイアログボックスもスレッド。そうしないと、ファイルのダウンロード終了までブラウザーが固まってしまうから、、、時間のかかる処理を別に動かす。また、タグもそれぞれ別スレッド。そうしないとブラウザープログラムで一つのサイトしか表示できない。
Webブラウザーも、アクセスしてくる要求毎にスレッド対応。以前は、fork()だったけど、アクセスが多くなると起動時のオーバヘッドの高いfork()では、感じる遅延が発生する。
この二つの例は、同一機能を並列的に複数行う事と考えても良い。
つまり、機能のクローン化。ダイアログをスレッドかするのは、クローン化というよりは時間差により遅延解消
そうみると、
・機能のクローン化
・時間差処理の外だし
と考えてもよい。
マルチプロセスも、機能のクローン化
両方ともに、良い点や考慮しなければならない事があり、決定的な優劣はつけにくい。

ところで、僕は何の為にマルチタスクにするのか?
それを再度考えると、、、
このような機能構成のロボットコントローラーを開発するのが目的であり、
よくよく構成をみると、マルチプロセスか、マルチスレッドなのか
どちかの技術で決められない事がよく解る。
あさはかな自分、反省


これを、先ほどの求める事などを組合わせて考えると、、、
青いBoxはマルチスレッドで機能クローン化を図った方がよい所、
赤い線の部分は、プロセスとして運用した方が良い所、、、

マルチプロセスと、マルチスレッドの組合せで構成するというのが
先の技術選択基準を満たすと今は考えている。

という事は、今度は、プロセス間通信をどうするかという事だけど、、、
それは、Share Memoryをベースにして同期処理などを取る仕組みを創る事にした。

という事、細かい部分に入りながら、地道な改良を始める

とりとめもない、自分のメモ、、、

Peace!!

2018年1月14日日曜日

how to use Jansson

Janssonインストールしたけど、どう使うのか?
webにも、あんまり細かい事は出ていない
例えば、こんなデータの場合は?

[
{
    "RdcsId":"rcmp-r41",
    "Status":1,
    "NetIdLocal":"kk",
    "Agent":null,
    "Category":"4WD",
    "PlatformRbt":null,
    "NowRole":"tk001",
    "OsVersion":"4957-v7#1047",
    "Role": {
        "Execute": "tk001",
        "LoadId": [
            "tk001", "tk0201", "mv0459"
        ],
        "Status": "Safe"
    }
},
{
    "RdcsId":"rcmp-r42",
    "Status":2,
    "NetIdLocal":"kk",
    "Agent":null,
    "Category":"4WD21",
    "PlatformRbt":null,
    "NowRole":"tk022",
    "OsVersion":"4957-v7#1047",
    "Role": {
        "Execute": "tk001",
        "LoadId": [
            "tk001", "tk2222", "mv0459"
        ],
        "Status": "wait"
    }
},
{
    "RdcsId":"rcmp-r43",
    "Status":3,
    "NetIdLocal":"l0",
    "Agent":null,
    "Category":"4WD23",
    "PlatformRbt":null,
    "NowRole":"tk033",
    "OsVersion":"4957-v7#1047",
    "Role": {
        "Execute": "tk001",
        "LoadId": [
            "tk001", "tk3333", "mv0459"
        ],
        "Status": "Safe"
    }
}
]

こういうデータに対しての使用方法を理解しないと困るので、、、
プログラムを作って、検証した。
で、一応、使い方は理解できたかもという話
インターネット経由のデータ処理が多いけど、プログラムのファイル読み込み部分がcurlのツールになる。
それは、JanssonのTutorialを見ればわかるので、、、
で、結果は、こんな感じで、、、まぁ、自己満足でごめんなさい。
プログラムはこんな感じ、、、
プログラムは、試行錯誤の跡、たっぷり(笑)
あっ
追記:Raspberry Piで、curlモジュール使うとき
sudo apt-get install libcurl4-openssl-dev

Peace!!

-------------- build ------------------------------------
gcc tst4.c -o tst4 -ljansson

-------------- program --------------------------------

#include <stdio.h>
#include <jansson.h>

//#define PRS(A)  printf("----->%s\n", A)

/************************************************/
int main(int argc, char *argv[])
{
    size_t i;
    int iCnt;

    json_t *root;
    json_error_t error;
    
    FILE    *outfl;

    /********************************************
    **     check arguments
    ********************************************/
    if(argc != 8){
        fprintf(stderr, "usage: %s file dumpfile keyword obj child-obj child-obj-array key\n\n", argv[0]);
        return 2;
    }
    
    if ((outfl = fopen(argv[2], "w")) == NULL) {
        fprintf(stderr, "error: file open.(%s)\n", argv[3]);
        return 1;
    }

    /********************************************
    **     convert jansson memory data
    ********************************************/
root = json_load_file(argv[1], 0, &error );
    if(!root){
        fprintf(stderr, "error: on line %d: %s\n", error.line, error.text);
        return 1;
    }

    // check array data
    if(!json_is_array(root)){
        fprintf(stderr, "error: root is not an array\n");
        json_decref(root);
        return 1;
    }

    iCnt = json_array_size(root);
    printf("array counts = %d\n", iCnt);
    
    for(i = 0; i < iCnt; i++){
        json_t *data, *value, *obj, *objv, *obj1, *obj11, *obj111;

        /*****************************************
        **     1. get one object
        *****************************************/
        // get obj
        data = json_array_get(root, i);
        json_dumpf(data, outfl, 256);
        
        if(!json_is_object(data)){
            fprintf(stderr, "error: data %d is not an object\n", (int)(i + 1));
            json_decref(root);
            return 1;
        }

        // get value
        value = json_object_get(data, argv[3]);
        if(!json_is_string(value)){
            fprintf(stderr, "error: obj no. %d: keyword:%s is not a string\n", (int)(i + 1), argv[3]);
            return 1;
        }

        /*****************************************
        **     2. get object in object
        *****************************************/
        // get obj
        obj = json_object_get(data, argv[4]);
        if(!json_is_object(obj)){
            fprintf(stderr, "error: obj %d: is not an object\n", (int)(i + 1));
            json_decref(root);
            return 1;
        }

        // get value obj,obj
        objv = json_object_get(obj, argv[5]);
        if(!json_is_string(objv)){
            fprintf(stderr, "error: objv no. %d: keyword:%s is not a string\n", (int)(i + 1), argv[5]);
            return 1;
        }
        
        /*****************************************
        **     3. get array value in object
        *****************************************/
        // get obj
        obj1 = json_object_get(data, argv[6]);
        //json_dumpf(obj1, stderr, 256);printf("\n");
        if(!json_is_object(obj1)){
            fprintf(stderr, "error: obj1 %d: is not an object\n", (int)(i + 1));
            json_decref(root);
            return 1;
        }

        // get value obj,obj
        obj11 = json_object_get(obj1, argv[7]);
        //printf("------------------------\n");
        //json_dumpf(obj11, stderr, 256);printf("\n");
        if(!json_is_array(obj11)){
            fprintf(stderr, "error: obj11 no. %d: keyword:%s is not a object\n", (int)(i + 1), argv[6]);
            return 1;
        }
        obj111 = json_array_get(obj11, 1);
        if(!json_is_string(obj111)){
            fprintf(stderr, "error: obj111 no. %d: keyword:%s is not a string\n", (int)(i + 1), argv[7]);
            return 1;
        }
        /*****************************************
        **     4. print value
        *****************************************/
        printf("key:%s  value:%s obj:%s obj111:%s\n", 
            argv[3], json_string_value(value), json_string_value(objv),
            json_string_value(obj111));
    }
    
    /*********************************************
    **                                          **
    **     terminate                            **
    **                                          **
    *********************************************/
    json_decref(root);
    fclose(outfl);
    return 0;

}