chakokuのブログ(rev4)

日々のごった煮ブログです

お越しいただきありがとうございます。

このブログでは主に以下の内容を記載しています。

  • 何か作った話(自分は何かを作るために生きている)
  • 技術関係のネタ(エンジニアのような仕事をしておりまして。。サーバ運用関連で飯食ってますが、スマフォ+サーバアプリ開発のマネージメントにシフト中。。機械学習が脅威に思えてボチボチ勉強しています。。休日は道楽のプログラミング)
  • 趣味のロードバイク(坂道をひーこら走ると結構大変な人生(笑)と重なる。。仕事のストレスが軽いと走らなくなる。。いかん)
  • 食べたり飲んだり(凹んだ時は美味しい物を食べて元気をつけよう)

記事が渾然一体となってカオス状態ですが、マイコンのプログラムも、ちゃりで走るのも、回転寿司食うのも、料理するのも、自分の中ではそれぞれが繋がっているので、カオスな日常をそのまま反映させています。といいつつ、何が何か分からない状態なので、google siteを使って索引サイト(まとめサイト)を作っています。

茶国まとめサイト: https://sites.google.com/site/chakokumatome/
Kindle無料マンガまとめ: https://amazon-kindle-search.appspot.com/
(注)GAEの無料期間が終わったので、静的ページだけが稼働中。SQL等の演算はできない

リンクや引用はご自由にどうぞ。質問等ありましたらコメントに書いてください。微力ながら自分の分かる範囲で回答します。

とにかく、、人に「あほやなぁ」と言われる事に精進するのが我が人生。

2019/1/26 追記
長らくお世話になった「はてな」様ですが、はてなダイアリーがサービス終了となり、はてなブログに移しましたが、宣伝がちょっと辛いのでbloggerに引っ越す予定です。引っ越し先は以下
https://chakoku.blogspot.com/

2019/7/20
ひっこしたbloggerですが、どうにもUIが使い慣れないのと、なんか寂しい。ネット空間で寂しいとはどういうことなのか?自分でもよくわからないが、bloggreはなんか寂しい。。記事を書く気がおきない。で、Hatena Blogは無料だと広告がかなり邪魔なんだけど*1長年使い慣れたHatenaに戻ることにしました。

*1:有料が高すぎるので払えない

STM32 Nucleo Board 買ったけどよくわからず

試作の関係もあって、ずっとESP32+MicroPythonだった。トラ技でSTM32Fの特集をやっていて、たまには別のマイコンコンパイラもいいかと思って、Nucleo Boardを買った。ちょっと使おうとしたけど、開発環境もいろいろあるし、どうやってボードのIOを指定したらいいのかよくわからず。。ボード専用のライブラリとかあるんだろうか。。

しかも、、高速版のSTM32Fを買ったつもりが、省エネ版のSTM32Lが届いた(もちろん自分がオーダー間違ったのだが)。ちょっとテンションが下がっている。。

■関連URL
とりあえず、Nucleoの入り口
https://www.st.com/ja/ecosystems/stm32-open-development-environment.html


Nucleo Board STM32L476RG用のMicroPythonもあるようなので、、とりあえずMicroPythonでボードを動かしてどんなことができるのかを理解してからCに移るか。。
http://micropython.org/download#other

Interface 4月号 「マイクロIoTカメラ」

CQ出版 Interface 2020年4月号 「映像ソーシャル時代 マイクロIoTカメラ」に記事を書きました。自分は7章~9章を担当しました。ESP32+MicroPythonでCMOSカメラを制御して画像を撮影し、クラウドにアップロードします。もしよろしければ記事を見てみてください。ソース一式はGitHubで公開しています*1。不明な点がありましたらコメントに記載してください。できるだけ回答します。当初、大阪でオフ会が開催される予定でしたが、コロナの影響により延期となりました。
Interface(インターフェース) 2020年 04 月号

■ご参考URL
CQ出版社
2020年4月号目次 | Interface – CQ出版

GitHub
ESP32(MicroPython) + JPEG Camera(Grove Serial Camera)
GitHub - ESPuPy/ESP32WiFiCAM-JPEGCamera: ESP32 WiFi Camera application with Grove JPEG Serial Camera

ESP32(MicroPython) + OV7670
GitHub - ESPuPy/ESP32WiFiCAM-OV7670: ESP32 WiFi Camera application with OV7670 Image Sensor

上記WiFiカメラ用RAW->JPEG変換Webサービス(AWS Lambda)
GitHub - ESPuPy/RAWImageConverter: RAW image convert service built on AWS

*1:MITライセンスです。ご自由にお使いください

遅ればせながら・・ Cygwin内にpythonのJupyterLabとmatplotlibを入れる

f:id:chakoku:20200215085006p:plain
JupyterLab画面
普段PythonCygwin環境内でCUIで使っていたけど、データ分析*1とかでグラフ描画が必要になった。Cygwin環境にMatplotlibを入れるのはイバラの道らしいので、グラフはUbuntu上のPython+Matplotlibで作成していた。試しでグラフ描くならこれでもいいけど、あれこれ条件を変えながらグラフを見たい場合は非常に効率が悪い。jupyter notebookがあるのは知っていたけど、どうもGUIに慣れなくて使っていなかった。が、、グラフを見ながらあれこれ試行錯誤するにはGUIベースでないとだめだと思い、最新版のjupyterlabをCygwin内で構築することにした。
jupyterlabはインストール時にコンパイルが発生するので、あらかじめgccとg++が必要なようである(本当に必要かどうかは不明。インストール時、コンパイルでトラブったので、多分そうなんだろうと)
pipでjupyterlabを入れる前に、 CygwinSetupを使って gcc(mingw64-i686-gcc-core 7.4.0-1)とgcc-g++(7.4.0-1)をあらかじめインストールしておいた(バージョンも合わせておくのがいいらしい(自分もビルド時にエラーが発生した))。
で、、以下のコマンドでpipでjupyterlabを入れる

python3 -m pip install jupyterlab

この手順でビルドさせると、Running setup.py install for pyzmq  の所でpyzmqをビルドしようとしてエラーになる。pyzmqはCygwinのパッケージ管理から入れられるので、CygwinSetupでpython3-zmq(17.0.0-1)を入れることでビルドを回避させる。
ビルドが終わると以下のコマンドでjupyterlabを起動(-m でなくても起動できるかも。詳しく調べてないので)

 python3 -m jupyterlab

上記コマンドでjupyterlab用のサーバアプリが起動される。接続URLが表示されるので、ブラウザにURLを入力するとJupyterLabのコンソールに接続される。

http://localhost:8888/?token=ae3e22*********c7620a6

JupyterLabを使いこなせてデータ分析がサクサク進むことを期待したい。。しかし、、notebookは慣れないなー。。

■追記 2020/02/15
さっそくjupyterを起動して試しにmatplotlibをインポートさせるとエラーになった。なるほど。。jupyterとはpython3上の薄皮だった。jupyterを入れたからといって、ML関連のパッケージまでは入らないと。

import matplotlib
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-1-0484cd13f94d> in <module>
----> 1 import matplotlib

ModuleNotFoundError: No module named 'matplotlib'

今のCygwin環境ならコンパイルも整っているし、matplotlibをビルドしてみることに

$ python3 -m pip install matplotlib

ビルドすると、 Cythonがないと怒られる

        from Cython.Compiler.Version import version as cython_version
    ModuleNotFoundError: No module named 'Cython'

Cythonを入れる

$ python3 -m pip install cython
Collecting cython
  Downloading Cython-0.29.15-py2.py3-none-any.whl (968 kB)
Installing collected packages: cython
Successfully installed cython-0.29.15

次はPython.hがないと怒られる。これはdevelで入れるかと。

    SystemError: Cannot compile 'Python.h'. Perhaps you need to install python-dev|python-devel.

CygwinSetupで、python36-devel (3.6.9-1)を入れる。もう一度ビルドする
またエラーになる。

    /bin/sh: svnversion: コマンドが見つかりません

svnリポジトリからとってくるつもりなのか!? svnを入れてみる。どれがいいのかよくわからないが、、 git-svn (2.21.0-1)を入れる。
さらにログをよく見るとコンパイル時にExceptionが出ているようにも思えて、、svnversionコマンドの有無が原因ではないような気も。。
再度ビルド。。やっぱりエラーになるのだが、、gccで loops.oを作るところでエラーになっている??

           *略*
      File "/usr/lib/python3.6/site-packages/setuptools/command/easy_install.py", line 1146, in run_setup
        raise DistutilsError("Setup script exited with %s" % (v.args[0],))
    distutils.errors.DistutilsError: Setup script exited with error: 
    Command "gcc  *略* -o build/temp.cygwin-3.1.2-x86_64-3.6/build/src.cygwin-3.1.2-x86_64-3.6/numpy/core/src/umath/loops.o  build/temp.cygwin-3.1.2-x86_64-3.6/build/src.cygwin-3.1.2-x86_64-3.6/numpy/core/src/umath/loops.o.d -std=c99" failed with exit status 1
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

上記エラーに関係しそうな情報は得られず。場当たり的にcache無しにして再度ビルド

$ python3 -m pip --no-cache-dir install matplotlib
Collecting matplotlib
  Downloading matplotlib-3.1.3.tar.gz (40.9 MB)
   ・・・・

やはり上記とおなじところでエラーになる。なぜ failedなのか詳細わからず。 check logなので、ログを見ろと。。
ちなみに、、直接の原因ではないが、以下のライブラリも無いと警告を受けている。

        Optimized (vendor) Blas libraries are not found.
        Lapack libraries not found.

メッセージをよく見ると、numpyをビルドしようとして失敗している。matplotlibを入れる際にまずnumpyをビルドするのか。。
numpyならcygwinパッケージで入れられるので、numpyを入れてから再度試すことに。
python36-numpy(1.16.2-1)をCygwinSetupから入れるが、、numpy自体が正常に動作しない状況になった。パッケージで入れてもnumpyがおかしい。
(おかしい件は、Cygwinを一旦終わって再度起動してからpython3を走らせると解消)
ちょっと進んだ。以下と怒られる

    src/checkdep_freetype2.c:1:10: 致命的エラー: ft2build.h: No such file or directory
     #include <ft2build.h>

ft2はfreetypeらしく、CygwinSetupで、libfreetype-devel(2.9.1-1)を入れる

なんとかビルドはできた。

$ python3 -m pip --no-cache-dir install  -U matplotlib
Collecting matplotlib
  Downloading matplotlib-3.1.3.tar.gz (40.9 MB)
 Requirement already satisfied, skipping upgrade: cycler>=0.10 in /usr/lib/python3.6/site-packages (from matplotlib) (0.10.0)
Requirement already satisfied, skipping upgrade: kiwisolver>=1.0.1 in /usr/lib/python3.6/site-packages (from matplotlib) (1.1.0)
Requirement already satisfied, skipping upgrade: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/lib/python3.6/site-packages (from matplotlib) (2.4.6)
Requirement already satisfied, skipping upgrade: python-dateutil>=2.1 in /usr/lib/python3.6/site-packages (from matplotlib) (2.8.1)
Requirement already satisfied, skipping upgrade: numpy>=1.11 in /usr/lib/python3.6/site-packages (from matplotlib) (1.16.2)
Requirement already satisfied, skipping upgrade: six in /usr/lib/python3.6/site-packages (from cycler>=0.10->matplotlib) (1.14.0)
Requirement already satisfied, skipping upgrade: setuptools in /usr/lib/python3.6/site-packages (from kiwisolver>=1.0.1->matplotlib) (41.2.0)
Installing collected packages: matplotlib
    Running setup.py install for matplotlib ... done
Successfully installed matplotlib-3.1.3

ビルドできたので、python3で使ってみる。まずは試しにインポートする。
インポートはできた。

$ python3
Python 3.6.9 (default, Jul 21 2019, 14:33:59)
[GCC 7.4.0] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib

実際にグラフを描画しようとするとX11が無いとかTkがないといって怒られると思う。
やっぱり怒られる。まぁそれはそうだ

>>> import matplotlib.pyplot as plot
>>> plot.scatter([1,2],[3,4])
<matplotlib.collections.PathCollection object at 0x6ffffd077e10>
>>> plot.show()
__main__:1: UserWarning: Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure.
>>>

これをjupyterでやったらどうなるか。。
試した結果、以下のように、jupyterlabではグラフ表示された。。すばらしい。。
これは本気でjupyterlabを勉強しなくては。。と思った次第です。

f:id:chakoku:20200215113402p:plain
jupyterlab内でMatPlotlibを使ってみる
■関連記事
かつてcygwinにmatplotlibを入れた時の記録
ゼロから作るDeep Learning【DLfS】取り組み、Cygwin環境にPython3と各種パッケージを導入 - chakokuのブログ(rev4)

*1:有志の勉強会とか。。

ESP32 ブート時のGPIO12によるFLASH電圧設定機能を無効化する

要約:
GPIO12(MTDI pin)にはFLASH電圧設定機能があり、起動時GPIO12がHになっていると、FLASH電源電圧が1.8Vに設定されてしまい正常に起動できない。ESP32のフューズを変更することでGPIO12の電源電圧設定機能を無効化した。

詳細:
ESP32のGPIO12はHSPIのMISO用に割りあてられていて、自分の場合はFIFO付きArducamのFIFO制御にHSPIを使っている。ArducamのFIFOにはCSも存在しているのだが、CSをHにしておいても、Arducamからの信号はハイインピーダンスにならないようで、、Hのままである。Hのままでブートしてしまうと、GPIO12のFLASH電源電圧切り替え機能により、FLASHの電源電圧が1.8Vで設定されてしまう*1
。この結果、FLASHが読めないとなって、以下のエラーが連発してブートされない(と自分は理解)

rst:0x10 (RTCWDT_RTC_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
ets_main.c 371
ets Jun  8 2016 00:22:57

HSPI直結の回路は変更したくないので、この問題を回避する方法を少し調べた結果、ESP32に内蔵されているフューズ領域を設定変更することで、GPIO12による電源電圧切り替え機能を無効化できることが分かった。これによりGPIO12のL/H状態に関わらず、FLASHへの供給電圧を3.3Vに固定することができるようである*2
。変更はフューズ書き換えソフトがありそれを使えばできるようだ。

espefuse.py set_flash_voltage 3.3V

変更を加える前にまず現状を確認。以下のように、XPD_XXXのフューズ類は0である。

$ espefuse.py  -p /dev/ttyS3  summary
*略*
Config fuses:
XPD_SDIO_FORCE         Ignore MTDI pin (GPIO12) for VDD_SDIO on reset    = 0 R/W (0x0)
XPD_SDIO_REG           If XPD_SDIO_FORCE, enable VDD_SDIO reg on reset   = 0 R/W (0x0)
XPD_SDIO_TIEH          If XPD_SDIO_FORCE & XPD_SDIO_REG, 1=3.3V 0=1.8V   = 0 R/W (0x0)
*略*
Flash voltage (VDD_SDIO) determined by GPIO12 on reset (High for 1.8V, Low/NC for 3.3V).

以下のコマンドを実行して、GPIO12の切り替え機能を無効化して、FLASHへの供給電源の電圧を3.3Vに固定化する

$ espefuse.py  -p /dev/ttyS3  set_flash_voltage 3.3V

espefuse.py v2.8
Connecting....
Enable internal flash voltage regulator (VDD_SDIO) to 3.3V.
The following efuses are burned: XPD_SDIO_FORCE, XPD_SDIO_REG, XPD_SDIO_TIEH.
This is an irreversible operation.
Type 'BURN' (all capitals) to continue.
BURN
VDD_SDIO setting complete.

再度フューズの設定を確認。ツールによる表示では、3.3V固定化したようである。。

$ espefuse.py  -p /dev/ttyS3  summary

*略*
Config fuses:
XPD_SDIO_FORCE         Ignore MTDI pin (GPIO12) for VDD_SDIO on reset    = 1 R/W (0x1)
XPD_SDIO_REG           If XPD_SDIO_FORCE, enable VDD_SDIO reg on reset   = 1 R/W (0x1)
XPD_SDIO_TIEH          If XPD_SDIO_FORCE & XPD_SDIO_REG, 1=3.3V 0=1.8V   = 1 R/W (0x1)
*略*
Flash voltage (VDD_SDIO) set to 3.3V by efuse.

GPIO12にArducamのFIFOから出ているMISOを接続したままで、ESP32をOff/Onする→正常に起動。。というわけで、、GPIO12の電源電圧設定機能が無効化できた(ようである)。

■参考URL

忘備録:STEM教育関連

会社にパラサイトしている56の、(へなちょこ + へたれ) * エンジニアだけど、やっぱり新人エンジニアとかさらに学校教育のことは気になる。
STEM教育がどうなっていくのかとか。FBでたまたま知り合った方*1のサイトを備忘録として記録

望月陽一郎様 MOCHIZUKI.NET
mochizuki.net

なんかバリバリご活躍されている様だ。。

あと、たまたま見かけたのだが、プログラミングを教える前に、そもそも日本語からじゃないか?という本。。そう思います。仕様を議論してもいまいちかみ合わないし、仕様書は読みづらいし、まず国語力が問題だなーと痛感します。もちろん自分も含めて。
プログラミングをわが子に教えられるようになる本
プログラミングをわが子に教えられるようになる本

ソフトウエア開発はテクノロジーでもあるけど、課題の掘り起し、文書化、見える化、意見交換、合意形成 etc。。人間のすべての活動が集約されている。

*1:FBの使い方よくわからず場違いな自分がグループ参加申請してしまった

昔中古で買ったLetsNote(CF-F10)を強化する

自分はデスクトップしか持っておらず、さくっと使いたい時や外で作業したい時にノートがあればと思っていた。昔、子供用に買った中古のノート(LetsNote)を借りて使ってみると、キーボードが非常によくできていて打っていて気持ちがいい*1。動作も極端に遅いわけではないので、高度な演算等させずにWORDとかブラウザとかを使うならスペック的に十分と思えた。というわけで、、ちょっと古いけど子供から買い戻して、LetsNoteの(CF-F10)を強化することにした。
中古パソコンに手を入れるのはなかなか危険で、やりすぎると新品を買った方が安くつくことになりかねない。だから、、投資対効果をよく考えるべき。といいながら、、幸い部品も安く手に入りそうなので、、パワーアップの定番であるところの、HDD->SSD置き換えと、メモリ拡張をやってみた。
HDD->SSD置き換えは、HDDからSSDにミラーするソフトがあるので、それを使うと何も問題なくデータ置き換えができた。あとは、本体の蓋を開けてHDDを取出し、そこにSSDをはめ込むと。これもまぁLetsNoteはメンテナンス性が高いので、簡単にできる。
HDDからSDDに入れ替えた結果、OSのブートが爆速になった。計測したのでまた追記しますが、会社で使っている業務用PCよりも早い。。そんなことでいいのか。SSDが6千円ぐらいだったけど、、CF-F10はプレスリリースが、2011年1月27日になっていて、9年前のモデルだ。、、ちょっと複雑な気持ち*2


メモリも本体2G+拡張スロットに2Gの4G構成なのだが、、本体2Gを外すのは至難の業らしく、お手軽に、拡張スロットの2Gを外して、4Gのメモリをさした。これで本体は6Gになった。6Gって中途半端な感じですが。

で、OSですが今入ってるのはWindows7のProfessional(!)なので、、これをWindows10に上げてみる。Windows10にするとCPU性能の要求スペックが高いと、かなりつらいのだが。。入れてみないとわからない。昔は10へのアップグレードが無料だったのだが、、実は今でもWindows10へ無料でアップグレードできるらしい。らしいというレベルで本当かどうかはやってみないとわからない。以下の記事で紹介されている。

まだ可能!Windows 10 への無償アップグレード方法【2019年版】 – Hacker's High


インストール作業を進めると、以下が互換性問題のために削除しろと言ってくるので、、削除してみる。

VMware Player
このアプリは Windows 10 と互換性がないため、今すぐアンインストールしてください。
詳細情報 アンインストール 
 Intel(R) Dynamic Power Performance Management
このアプリは Windows 10 と互換性がないため、今すぐアンインストールしてください。 

削除したものの、 Dynamic Power Performance Management についてはOS再起動しないと削除したと見なされないようで、もう一度やりなおしだ。。

■パーツメモ
差し替えたメモリ: Let's note CF-J9/CF-F9/CF-N9/CF-R9/CF-S9用4Gメモリ
SDD:Western Digital WD Blue WDS500G2B0A-EC (内蔵SSD 2.5インチ 500GB SATA 3.0)
コピーの際に接続に使ったケーブル:Inateck SATA-USB 3.0 変換アダプタケーブル、2.5インチSSD /HDD用

*1:子供はThinkPadに乗り換えた

*2:爆速なのは余計なアプリもほとんど入っていないし、レジストリが荒れてないからなのかもしれません。半年も使ってると遅くなるとは思われます