chakokuのブログ(rev4)

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

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

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

  • 何か作った話(自分は何かを作るために生きている..できたらクスっと笑えるものや、アートと絡みたい)
  • 音楽(AerophoneやDTM(FL-Studio))
  • 趣味のロードバイク(坂道をひーこら走ると結構大変な人生(笑)と重なる。。仕事のストレスが軽いと走らなくなる。。いかん)

記事が渾然一体となってカオス状態ですが、マイコンのプログラムも、ちゃりで走るのも、料理するのも、自分の中ではそれぞれが繋がっているので、カオスな日常をそのまま反映させています。リンクや引用はご自由にどうぞ。質問等ありましたらコメントに書いてください。微力ながら自分の分かる範囲で回答します。
とにかく、、人に「あほやなぁ」と言われる事に精進するのが我が人生。

2021/9/4 追記
いろんな趣味をかじってきたけど、最後まで残っているのはプログラミングという。。休日もプログラミングばっかりやっている。そんなに高度なものではなく、ドローン用のへなちょこ制御プログラムをフルスクラッチで作ろうとしています。姿勢制御とか、フィードバック制御とかが難しい。Try&ErrorはMicroPythonを使ってますが、仕上げはRustで書きたい。

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

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


まとめ:https://sites.google.com/site/chakokumatome/

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

Swift UIをもう一度勉強したい。だが、Xcodeはどうも好きになれない→Windowsからのリモート操作で逃げる

プログラムを書くのにIDEを使わずに素のエディタ(Emacs互換のMeadowとか)を使っている。IDEは使い慣れない。キーバインドのせいか?分からない。新しい言語を勉強する時、サンプルコードであれこれ試す際にIDEを使うと、知識の蓄積とIDEの使用感の間で、個人的には相性が悪いと思っています。IDEだと溜まっていく感じがしない・・ できたらXcodeを使わずに、エディタであれこれソースを書いて、CUIでビルドして試したい。

少し調べるとCUIでビルドしたい人がいるようで、、例えば以下

コマンドラインだけでiOS開発したい人生だった - Qiita

GUIの開発だとSimulatorによるテストが必須なので、やっぱりCUIでのビルドは効率が悪いのだろうか。。

Xcode Command Line Tools というのがあるようで、、基本的にはXcodeでプロジェクトを設定して、使い慣れたエディタでソースを変えながらビルドする感じか。。だったら、、 Xcode + Emacsの組み合わせでいいのではないか。。

MacBook上でXcodeを走らせて、プロジェクトの設定とビルドを行う。
ソース修正は、WindowsPCからsshMacBookにログインして、MacBook上のEmacsで編集する。。 
何がしたいのか段々と分からなくなってきたけど・・・


Technical Note TN2339: Building from the Command Line with Xcode FAQ
iOS development on the command line | Eqela Developer Network
Build iOS apps from the command line using xcodebuild | Tarik Dahic

さらに深く考えて、、慣れない要因は、(1)Xcodeがもっさり遅い、ビルドに時間がかかる、(2)Xcode内のエディタがなじまない、(3)MACのUI全体がなじまない、だと改めて思った。普段使ってるWindows PCからMACが触れたら改善するかもしれない。

ApowerMirror
AirServer

自分の慣れない感覚が、MACのUIとXcodeのエディタに起因しているのなら、VNCを使ってMACの画面をWindows PCに出してGUI操作をして、ソースコード変更は、sshMACにログインしてCUIでやったらいいのでは?と思った。こうすると、最低限のMACXcode使用でSwiftのソースが書ける。
WindowsからMacのデスクトップをリモート操作。仮想デスクトップで瞬時に切り替え、超便利! | Cloud-Work
スキルが上がってきたら、Xcodeで書くのも苦にならないかも。。そこまで続くかどうかわかりませんが。

SwiftUI最初の一歩|快技庵 高橋政明|note

■追記
コマンドラインでビルドするのはかなり敷居が高いので、、以下の方法で代用

  1. 編集はWindowsPCからMacBooksshで接続してEmacsを走らせる。普段使い慣れたEmacsソースコードが書ける
  2. ビルドはXcodeを使うのだが、VNCを使ってMACの画面をWindowsPCに表示してWindowsからリモート操作。これで使い慣れないMACのUIのストレスから解消される。

この構成で使ってみたのが以下の画面。WindowsからMAC上での開発が可能です。そこまでしてなぜMACか?? 自分のスマフォがiOSで、iOS用のアプリを開発したいから。これで慣れないMACのUIによるストレスが解消されると思われるので、SwiftUIのサンプルコードを量産して、理解も深まると期待されるのだが。。

プログラミング講習会も終了

仕事の一環でプログラミング講習会をやっていた*1。いろんな所から参加いただいてまったくもって有難かった。情報系でない電気系の技術の方とか、普段プログラミングなんてしたことないという方々に参加していただいた。来ていただいた皆さんに、「内容が分かった良かった」と思っていただいているか気になるところではある。
反省点として、説明用テキストやラズパイのセットアップetcがギリギリになってしまい、リハーサルをほとんどやっておらず、時間配分とか分からなかった(全部説明しおえるまでの時間が不明。当初見積もりではかなり時間がかかると読んでいたけど、説明ではサクサク進んでしまって、予定時間を1H以上短くなってしまった*2。これには講習会の主催責任者からも、「そんなに早く終わってもらったら困る」と言われてしまい。。皆様にご迷惑をおかけして申し訳ない)
それに、、演習の時間に参加者から、「どうも説明通りにやっても正しく動かない」と質問を受けて、調べてみると、古いバージョンのScratch改をリリースしてしまっていたり、自分のミスも何点かあった。
こういう機会でないと会えない皆さんと二日間時間をともに過ごすことができていい経験になった。次回の講習会では時間をエレガントに調整できるよう、オプション課題を増やして、楽々時間調整できるようにしたい。

*1:プログラミング言語は改造版ScratchとNode-RED

*2:数十年前、某マイコンを開発していた時にもマイコン活用講習会開いて、その時も、えらく早く終わってしまった。相方(相方はハードアーキテクチャの解説担当)から結構怒られた

とある理由により、webiopiを調査

WebIOPiを調べる必要があり試しにインストールする

wget https://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz
cd WebIoPi-0.7.1
wget https://raw.githubusercontent.com/doublebind/raspi/master/webiopi-pi2bplus.patch       
patch -p1 -i webiopi-pi2bplus.patch 
sudo  ./setup.sh     
sudo  /etc/init.d/webiopi start

起動できたら以下でアクセス

http://192.168.10.<nnn>:8000/

printデバッグする場合は、デバッグしたい行にprint("hogehoge")等と書いて以下で実行する(普通に走らせてもデバッグログが出ないようだ)

sudo webiopi -d -c /etc/webiopi/config

pdbpythonスクリプトを止めることもできるが、コンソールにログが出まくってスクロールしてしまうので、print文デバッグぐらいしかできなさそうである。

■ご参考URL
チュートリアルも見てみる
Tutorial : Framework basis
参考にしているサイト
WebIOPiでIoT!(3)プログラミング基礎編~値の入出力 | Device Plus - デバプラ

Scratch3の拡張機能の開発にChromeのDevToolを使ってデバッグ

Scratch3の拡張機能を使って新しいブロックを作る時なかなかバグが取れない。実行環境がブラウザなので、ブラウザで表示されない場合に原因が特定しづらい。デバッグ*1する際、少し調べると、Chrome等のDevToolでデバッグするのが可能と分かった。ビルドは通ったけどブラウザ側で正しく動かないという場合、DevToolでコンソールを出しておくとどこでエラーになっているのかログが出されるので原因の特定が可能になる。さらに、JavaScriptのソース行にブレーク設定しておけばステップ実行することもできる。
以下は「拡張機能を作ってみよう」のサンプル(newblocks)のindex.jsにブレークを設定して、引数を確認しているところ

Scratchの拡張機能のソースがChormeのDevToolで参照する場合どのフォルダ配下なのか??パスが分からなかったが、Scratch3のサンプルに従った場合、以下のパスで参照できるようだ。

[v]top
   [v]GUI
      ./node_modules/scratch-vm/src/extensions/scratch3_newblocks/index.js

■追記
年賀状の逃避でScratchを触っていると、拡張機能の開発がどんどん進むという・・・

*1:正しいNode.js開発手法があるのだろうけど、それは調べるのが大変なのでおいといて

AWSでNode.js + Scratch 3.0を動かす->動くには動いたがWebAPI連携で問題があり却下

IoT勉強会で拡張機能付きScratch3.0を使ってもらう予定。各自のラスパイでScratchをうごかしてもらってもいいのだが、ビルドに時間がかかるので、あらかじめAWS上でScratchを走らせておいてAWSから持って行ってもらう方がいいのでは?と思い試作中

curl -sL https://rpm.nodesource.com/setup_8.x | sudo bash -
sudo yum install -y nodejs
sudo yum install -y npm
sudo npm install -g yarn

なにかと問題になるchromedriverでエラーが発生、

45340 verbose stack     at EventEmitter.<anonymous> (/usr/lib/node_modules/npm/node_modules/npm-lifecycle/index.
js:332:16)
45340 verbose stack     at emitTwo (events.js:126:13)
45340 verbose stack     at EventEmitter.emit (events.js:214:7)
45340 verbose stack     at ChildProcess.<anonymous> (/usr/lib/node_modules/npm/node_modules/npm-lifecycle/lib/sp
awn.js:55:14)
45340 verbose stack     at emitTwo (events.js:126:13)
45340 verbose stack     at ChildProcess.emit (events.js:214:7)
45340 verbose stack     at maybeClose (internal/child_process.js:915:16)
45340 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:209:5)
45341 verbose pkgid chromedriver@90.0.1
45342 verbose cwd /home/ec2-user/lang/js/Scratch/scratch-gui
45343 verbose Linux 5.10.75-79.358.amzn2.x86_64
45344 verbose argv "/usr/bin/node" "/usr/bin/npm" "i"
45345 verbose node v8.17.0
45346 verbose npm  v6.13.4
45347 error code ELIFECYCLE
45348 error errno 1
45349 error chromedriver@90.0.1 install: `node install.js`
45349 error Exit status 1
45350 error Failed at the chromedriver@90.0.1 install script.
45350 error This is probably not a problem with npm. There is likely additional logging output above.
45351 verbose exit [ 1, true ]

手当が面倒なので、依存リストから外す

$ diff package.json_org  package.json
107d106
<     "chromedriver": "90.0.1",

ec2-user権限だと、npm linkで権限エラーになるのでこの行だけsudoで権限付与

mkdir Scratch ; cd Scratch
git clone --depth 1 https://github.com/llk/scratch-vm.git
git clone --depth 1 https://github.com/llk/scratch-gui.git
cd scratch-vm
npm i
sudo npm link  #npm link  
cd ../scratch-gui
npm i
npm link scratch-vm
npm start

起動したが途中でプロセスがkillされるなぜなんだろうか??

$ npm start > /tmp/exec_log 2>&1
Killed

oom-killされていた。メモリを使い果たしていた。。

[ 3628.291624] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/,task=node,pid=2089,uid=0
[ 3628.302154] Out of memory: Killed process 2089 (node) total-vm:2017820kB, anon-rss:805048kB, file-rss:88kB, shmem-rss:0kB, UID:0 pgtables:10204kB oom_score_adj:0
[ 3628.353757] oom_reaper: reaped process 2089 (node), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB

うーむ。一番安いt2.microにしたせいか。

# free -h
              total        used        free      shared  buff/cache   available
Mem:           965M         82M        829M        488K         53M        786M
Swap:            0B          0B          0B

メモリが足りないからインスタンスタイプを上げよう。。なんてそのまま仕事やないかと思いながら、、、一つ上に上げてみる。無事起動できた。ちなみに、t2.smallの場合、実装が2Gで、約800MB使っていて、空きが800MB

# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        790M        803M        400K        378M        1.0G
Swap:            0B          0B          0B

無事Scratchサービスが立ち上がって、8601番ポートでListenしている。ただ、EC2のENI(Network Interface)にはセキュリティのためのアクセス制限がかかっている。SecurityGroupで最初は22番しかあいていないので、Scratch用のポート、8601を開ける。理想的には接続許可IPを自宅のGlobalIPのみ接続にしておければ他から接続されることはない(のだが、、自宅は固定IPではないので、、)。

AWSに接続してScratch3.0を動かしている画面、(お金がかかるので確認を終えたら止めました)

ちなみに、t2.smallのオンデマンド料金は、0.023 USD/Hour
1時間動かしたら2.6円、一日だと63円、一月なら1933円、

LambdaでもNode.jsが動くらしいが、、やったことなくていろいろハマりそうなので、障壁の低いEC2で動かすことにした。

■メモ
UTC->JSTへの変更

sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime
vi /etc/sysconfig/clock
-------------------------
ZONE="Asia/Tokyo"
UTC=False
-------------------------

当初、yarnでパッケージを入れていたがインストール途中でエラーが発生したため、npmによるインストールにした

■顛末
ローカルのRPiで動かすと起動が遅いと考えてAWS上でScratch3.0を動かすように取り組んだ。普通の動作なら問題ないのだが、拡張機能でWebAPIの連携を実装しており、ローカル環境で動作するWebAPIを呼び出そうとすると通信エラーが発生した。WebAPIの呼び出しはScratch3.0が動作しているブラウザ上のJavaScriptから行われていると思っていたが、Node.js側から接続に行っているのだろうか??ブラウザ側の処理とサーバ側の処理がどのように分担されているのか?よくわからず。
結局当初予定だった、RPi上でScratch3.0を起動してもらう方針に戻した。

Scratch 3.0をビルドしてError -> yarn で通った

npmを使ってScratchをビルドしようとしてエラーになった。根本原因は分からないが、代替え手段としてyarnを使うとビルドが通った。

$ npm --version
5.8.0
$ node --version
v10.24.0
2298 verbose stack Error: chromedriver@90.0.1 install: `node install.js`
2298 verbose stack Exit status 1
2298 verbose stack     at EventEmitter.<anonymous> (/usr/share/npm/node_modules/npm-lifecycle/index.js:283:16)
2298 verbose stack     at EventEmitter.emit (events.js:198:13)
2298 verbose stack     at ChildProcess.<anonymous> (/usr/share/npm/node_modules/npm-lifecycle/lib/spawn.js:55:14)
2298 verbose stack     at ChildProcess.emit (events.js:198:13)
2298 verbose stack     at maybeClose (internal/child_process.js:982:16)
2298 verbose stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:259:5)
2299 verbose pkgid chromedriver@90.0.1
2300 verbose cwd /usr/local/scratch/scratch-gui
2301 verbose Linux 5.10.63-v7l+
2302 verbose argv "/usr/bin/node" "/usr/bin/npm" "i"
2303 verbose node v10.24.0
2304 verbose npm  v5.8.0
2305 error code ELIFECYCLE
2306 error errno 1
2307 error chromedriver@90.0.1 install: `node install.js`
2307 error Exit status 1
2308 error Failed at the chromedriver@90.0.1 install script.
2308 error This is probably not a problem with npm. There is likely additional logging output above.
2309 verbose exit [ 1, true ]

他の人のビルド例をみているとyarnを使っているようなので、yarnをrpmで入れてビルドしようとした。が、、

yarn install

と打ち込んだらエラーが出た。これも回避策があるようで、以下で入れ直し

sudo apt remove cmdtest
sudo apt remove yarn
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update && sudo apt-get install yarn

yarnでscratchをビルドするとエラーなくビルドが終わり立ち上がった

cd scratch-vm
yarn install
yarn link

cd ../scratch-gui
yarn install
yarn link scratch-vm

ちなみに、、/usr/bin配下に npmとnodeがないはずだったのだが、上記操作で/usr/bin配下にnpmとnodeが入ったようだ。なぜだろうか。

$ /usr/bin/npm --version
7.7.6
$ /usr/bin/node --version
v15.14.0


RPiの別の環境でやったらやはりエラーが出た。多分、node.jsのバージョンが古いからではないかと推測*1

[2/4] Fetching packages...
[3/4] Linking dependencies...
warning " > scratch-paint@0.2.0-prerelease.20211027080909" has unmet peer dependency "react-intl-redux@^0.7".
warning " > scratch-paint@0.2.0-prerelease.20211027080909" has incorrect peer dependency "react-responsive@^4".
warning "enzyme-adapter-react-16 > react-test-renderer@16.14.0" has incorrect peer dependency "react@^16.14.0".
[4/4] Building fresh packages...
[1/3] ⡀ core-js
[2/3] ⡀ chromedriver
error /usr/local/scratch/scratch-gui/node_modules/chromedriver: Command failed.
Exit code: 1
Command: node install.js
Arguments:
Directory: /usr/local/scratch/scratch-gui/node_modules/chromedriver
Output:
Only Linux 64 bits supported.

/usr/local/bin配下にnodejsをtarで配置、リトライする

$ node -v
v16.13.1

メッセージとして、chromedriverは64bitしかサポートしませんってのが原因ではないか。自分が使ってるラスパイは32bitOSなのだが。

$ uname -a
Linux raspberrypi 5.10.63-v7l+ #1496 SMP Wed Dec 1 15:58:56 GMT 2021 armv7l GNU/Linux

エラー無く入ったRPi

$ uname -a
Linux raspberrypi 5.10.63-v7l+ #1496 SMP Wed Dec 1 15:58:56 GMT 2021 armv7l GNU/Linux
$ npm -v
8.1.2
$ node -v
v16.13.1
$ yarn -v
1.22.17
$ which npm
/usr/local/bin/npm
$ which node
/usr/local/bin/node
$ which yarn
/usr/bin/yarn

■メモ
指定されているバージョンのchromedriverはリリースされておらずパッケージ不明でビルドがエラーになるので、該当のパッケージはインストールせずにすむよう、ソースを手パッチで変更した。chromedriverをどこで使っているのか分からないのだが、、勉強会で使う範囲であれば問題なく動いているので場当たり的対策だけど、これで「良し」とした。

*1:後記:node.jsのせいではなく、32bit版のChromedriver(chromedriver@90.0.1)がリリースされていないのが原因、古いバージョンを取ってくるようにバージョン表記を変えるか、必須パッケージリストからchromedriverを削除する対応をしないとビルドが通らない