Linux系＠RIGOL DS-1054ZのLANキャプチャでトラブル→解決(python2終焉に向けて)

1)python2の動向
最近Ubuntuを20.04(Focal)にアップグレードしました。
結構躊躇していたのは利用しているアプリらの影響を気にしてなのですが、
各々なんらの対処があったり、これを機に別ソフトに乗り換える等、
些末な対応で済む物も多かったりします。

問題はRIGOLのオシロスコープをLAN経由でキャプチャ出来る便利ツールでした。
”DS1054Z_screen_capture-master”と言います。
このソフトはpython2で書かれており、結構古いソフトです。
Qiitaにも紹介記事が有り、初めての時はこちらを参照させて頂きました。

　RIGOL DS1054Z - Qiita
　https://qiita.com/nanbuwks/items/fe71d9038c914c7945f1

2)DS1054Z_screen_capture-masterのインストール
DS1054Z_screen_capture-masterをgit cloneする。

　git clone https://github.com/RoGeorge/DS1054Z_screen_capture
　cd DS1054Z_screen_capture-master

README.mdに実行方法が書いてある。(但しUbuntu 16.04.1時代の話)
また、この内容の内、解凍操作は要らない。(元のソースを落としている為)

　Installation on a clean Ubuntu 16.04.1
　1. Python is already installed in Ubuntu 16.04.1 desktop
　2. to install pillow, open a Terminal and type:
　sudo add-apt-repository universe
　sudo apt-get update
　sudo apt-get install python-pip
　pip install pillow
　3. download and unzip 'DS1054Z_screen_capture-master.zip' from https://github.com/RoGeorge/DS1054Z_screen_capture
　4. connect the oscilloscope to the LAN (in this example, the oscilloscope have fix IP=192.168.1.3)
　5. in the Terminal, change the directory (CD) to the path were 'OscScreenGrabLAN.py' was un-zipped
　cd path_where_the_OscScreenGrabLAN.py_was_unzipped

そして中身はpython2である。
Ubuntu 20.04ではpython2の殆どをインストール出来ない謎がある。
pip(2用)も以前なら

　　sudo apt install python-pip

で、インストールできた。
今はこれも出来なかった。(そんなパッケージ無い！と言われる)
技術評論社の少し前の記事を見つけた。

　2019年11月29日号　Focalにおけるpython 2削除の進捗・Ubuntu Coreの拡大：Ubuntu Weekly Topics｜gihyo.jp … 技術評論社
　https://gihyo.jp/admin/clip/01/ubuntu-topics/201911/29

どうやら、Focal(Ubuntu20.04)ではpython2すら標準では入れない方向だ。
知らなかったが、これも時代の流れ、python3への速やかな移行の為には仕方ない事だろう。
しかし、ツールが動かないのは困る…。

3)そこで「アレコレ」した自分用の記録を残す。
3-1)２→３は可能か？
python2のソースをpython3のソースにトランスレートすれば動くか？と思い、2to3を入れて-wオプションで一連の.pyを変換、しかし状況は改善しなかった。
そして失念！
動かした時のエラーメッセージを保存しなかった。
確かpip.なんちゃらが11行目が…だったような？
※後にわかるが、コード上の記述に問題があるだけで、pythonバージョン問題ではないかも知れない。
※機会を見て2to3からチャレンジしてみたい。
※今回は別の方法で対応した。

3-2)python2＆pip(2)を入れてpillow(python2用)を入れたい！
README.mdでpipをいれてpillowを入れろと書いてあるなら、そうするべきだ。
そこで調べたらこのページを発見した。

　　How to Install Python Pip on Ubuntu 20.04 | Linuxize
　　https://linuxize.com/post/how-to-install-pip-on-ubuntu-20.04/

ここの「Installing pip for Python 2」がそれで、

　　Pip for Python 2 is not included in the Ubuntu 20.04 repositories. We’ll be installing pip for Python 2 using the get-pip.py script.
　　Start by enabling the universe repository:

と書かれている。

　　sudo add-apt-repository universe

リポジトリの登録は失敗した。orz
既に登録済みだと言われた。つまりこのリポジトリがあってもpipは入れられないと言う事。
これはpython2の導入の為なのだろう。
続けよう。
以前python2をインストールしているので、この作業は既にインストール済みと言われる。
だが、一応習うように行い、既に入っているメッセージも含めて確認する。

　　Update the packages index and install Python 2:
　　sudo apt update
　　sudo apt install python2

予想通り、インストール済みと言われた。

　　Use curl to download the get-pip.py script:

　　curl https://bootstrap.pypa.io/get-pip.py --output get-pip.py
　　Once the repository is enabled, run the script as sudo user with python2 to install pip for Python 2:

　　sudo python2 get-pip.py

いよいよ本丸pipのインストールらしい。
curlでダウンロードしてpython2を使ってインストールする様だ。
ダウンロードして、実行する。すると…

何かメッセージが出る！！
アメリカ語によると「ここにあるのは古いからこっちから落として使ってね」らしき事が書いてある。
そのこっちとは下記のURLの事である。再びcurlする。

　　curl https://bootstrap.pypa.io/2.7/get-pip.py --output get-pip.py

よし、ダウンロード完了、python2で実行！！

　　　　　　　　　　・
　　　　　　　　　　・
　　　　　　　　　　・
　　　　　　　　　　・

　　「これは古い！令和最新版(心の意訳)はここにあります！」
　　　 https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py

……………………………………………ナメてんのか？　※流石に少し脱力。(汗)
めげずにDL&RUN！！やっとpipがインストールできた！
pipは改版が多いと聞いた。その為にこの様な事になるのかも知れない。
不思議な事情だが、何かの運用の為の対策なのだろう。承服する以外道なし。

3-3)pillowも入れる
pipがインストール出来たのでpillowもインストール。
こちらは一発！！やった。
pipがあれば当座python2環境も維持出るかも知れないが、新規は全てpython3で書いている。
今後はこの手の事がない事を祈るしか無い。
さて、これで動くか？環境は出来た。

3-4)やはりエラー。。。
今回はエラーメッセージをしげしげと読む。(最初からそうするべきだった)

　　def log_running_python_versions():
　　 logging.info("Python version: " + str(sys.version) + ", " + str(sys.version_info)) # () 　　required in Python.

　　 installed_packages = pip.get_installed_distributions()
　　 installed_packages_list = sorted(["%s==%s" % (i.key, i.version) for i in installed_packages])
　　 logging.info("Installed Python modules: " + str(installed_packages_list))

…これは？
「 installed_packages = pip.get_installed_distributions()」がエラーっぽい。
調べてみると下記のページがヒットした。

　　AttributeError: module 'pip' has no attribute 'get_installed_distributions' のエラー対応 - ベスパリブ
　　https://takeg.hatenadiary.jp/entry/2019/09/24/171801

どうやら「インストールディストリビューション取得関数」配置替えになったらしい。
ソース中「pip.」モジュールをここしか利用していない事を確認してソースを改変。

問題の箇所を前出記事の説明通り、import文の変更、それに合わせ当該箇所も変更。

　　変更前)import pip
　　　　　　　　↓
　　変更後)from pip._internal.utils.misc import get_installed_distributions

　　変更前)installed_packages = pip.get_installed_distributions()
　　　　　　　　↓
　　変更後)installed_packages = get_installed_distributions()



3-5)そして…
やっと動いた！！そんなお話。
撮影した画像が以下になります。
![DS1104Z_DS1ZA173218621_2021-03-14_15.38.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185494/aec69f06-9c52-2e5f-34cc-61e620ca0030.png)
これはBLDCモータを回している時のマイコン側の出力波形です。
６ステージをカーソル読みする限り、250Hz(秒間250回転=15,000RPM)で回している時の物です。
スパイクノイズが凄いですが、5V(1:10の時10倍表記はどこで直すのだろうか…)で回しています。
モータの定格だと11.2V(12Vも許容らしいが)40Aとの事ですが、そんな激しい電力は我が家になく、仕方ないのでATX電源(PC用)を使って5V側で行いました。
モータドライバがSLA5064の為、総電力40W(∞放熱)制限により、巨大放熱板で20W以内での運用にしました。
波形の細かい線は疑似正弦波の為のPWM出力が影響している様です。
ZERO-CROSSポイント周辺でノイズが出ているので、ソフト制御の間隙が災っているかも知れません。
Raspberry PI PICOで制御してみました。その時の動画をニコニコ動画にアップしました。

　Raspberry PI PICO BLDC始動せよ！ - ニコニコ動画
　https://www.nicovideo.jp/watch/sm38414502

4)まとめ
このツールはオシロスコープを使用する際、非常に有用なので兎に角動かしたかった。
今回python2用のpipが導入出来た事、pipのモジュール内での配置換え等、正しく対処できればまだ動いて感無量。
しかし実はpython2である必要はなかったのかも知れないので、次はpython3に移植する事を考えます。

ここまでお付き合い頂き、ありがとうございました。