「プログラミング」カテゴリーアーカイブ

【雑記】書きたかったこと。出来事。買ったものとか(2024年1月〜4月中旬)

ども。こんばんは。

ついに春が終わって初夏の様相ですが、、、雑記です。

■2023年末-2024年始の振り返り

もう4ヶ月近く前の事になってしまいました…
昨年はインフルエンザ(自称)で寝込んでいましたが、今年はいつものメンバーで集まってバッティングセンターに行ったり子供と凧揚げしたりなかなか楽しく過ごせました。

■M5Stack 用のセンサー(2024/01/05)

会社の観葉植物の面倒でも見ようかなと思って購入。
水やりセンサーを作りました。

M5Stack M5Stack用土壌水分センサユニット【M5STACK-EARTH-UNIT】[エムファイブスタック マイコン IoT モジュール 電子工作 自由工作 夏休み]

楽天で¥707。

接続は超簡単。

適当にプログラム。
M5StackはUI Flowで適当にベースを作ってあとはMicroPythonで修正するのが楽ちんですね。

お水が足りなくなると画面が赤くなります。
ただねぇ、なんか微妙で今はサスティーにしています。

■トラベル用ひげ剃り(2024/01/11)

ブラウン モバイル シェーバー ブラウン ミニ Braun mini M-1013 ブラック 電気, 電動, 髭剃り,小型, 携帯/旅行用

Amazonで¥4,900。

1月に沖縄に1週間ほど出張が決まったので購入。
普段はT字のカミソリなのですが、ホテルのやつだと結構肌荒れするので購入。

まぁ普通でした。やっぱりそんなにふかぞりはできないですね。
あくまで、出先でちょこっと使う用って感じでした。

■沖縄行ってきた(2024/01/14-2024/01/19)

先月に引き続き沖縄に行ってきました。

■劇場版 PSYCHO-PASS サイコパス PROVIDENCE(2024/01/13)

「劇場版 PSYCHO-PASS サイコパス PROVIDENCE」Blu-ray(特典Blu-ray付2枚組)(法人特典なし) [Blu-ray]

Amazonで¥7.655。

面白かった。 朱が最後あーなったからそーなったのか!っていうまじでPSYCHO-PASS 3の謎がスッキリします。っていうか最後の1分ぐらいがやばい。

■龍が如く8(2024/01/27)

龍が如く8【予約特典】DLC(サクッと育成ブースター&スペシャルジョブパック) 同梱 – PS4

Amazonで¥7,918。

まだ未開封どころか、外伝も終わってないorz

■料理デビューした(2024/02/10)

多分、おいらのリアルな知人の皆さんには衝撃だと思いますが、料理を始めました。
多分奇跡。

なんせ中学の家庭科の授業以来ウン十年は卵も割ってないような人間なので…

包丁はまだ使えませんが、チャーハン、焼きそば、目玉焼きくらいはなんとか食えるレベルのものが作れるようになりました。

今の家10年くらい住んでますが、初めてIHのスイッチいれました。

■Google Pixel Puds Pro(2024/02/29)

ショックすぎるんですが、WF-1000XM5の片方を駅のホームに落としていました(´;ω;`)ブワッ

それはもうコロコロと小気味良く転がって駅のホームにシュート…

一応ソニーの修理に申し込めば、有償で片方だけ購入できるみたいですが、2万以上しまして…

だったら、Pixel 8 Pro 購入時のストアクレジットも余ってるしということで購入。

Google Pixel Buds Pro(Charcoal)

Google Storeで¥21,200。

微妙にケースが縦長なんですが、Google Pixel Standで充電できます。

好みの問題も大きいでしょうが、個人的にはやっぱりWF-1000XM5のほうが装着感も音もANCもいい気がしますね。

バッテリーの持ちはPixel Buds Proのほうがいいかなぁ。

■Happy Hacking Keyboard デビューした(2024/02/29)

ふるさと納税の返礼品でもらいました。

HHKB Professional HYBRID Type-S 日本語配列/墨(無刻印キートップセット付)

購入前からわかってはいたんですが、使いにくいです。
会社で使ってますが、1ヶ月はとてもじゃないけど本番環境触るような作業には使えませんでしたね。(誤操作のリスクが大きて使うのを躊躇うレベル)

キーマップを変更しまくって、Fnが4つくらいになりましたが、なんとかまぁ使えるレベルになりました。
Bluetoothで使うと電池の減り早いし、スタンバイ?からの復帰も遅く、値段に見合うのかは疑問です。

HPとかDELLのサーバ買った時についてくるキーボードのほうがはるかに使いやすい。

自信を持って言えますが、ふるさと納税返礼品でなければ自分のお金では絶対に買わないですね。

慣れればなんとかなりますが、慣れないと使いものにならないような道具に頼るべきではないというのが個人的な考えです。
特にキーボードやマウス類はいついかなる時にでもその場にあるもので自分の持ち得る100%のパフォーマンスを出せるようにするべきで、特異なキー配列やサイズのみでしか発揮できないようなパフォーマンスは本人の本来のパフォーマンスではないと考えています。

まぁそれなりに高かったので、もうちょっとだけ使ってみようかな。

■ブルースハープを買ってみた(2024/03/02)

なんとなく買ってみました。
ブルースハープというのは一応ホーナー社のものだけらしいですね。
※それ以外では10ホールハーモニカとか。

単音きれいに出すのが難しい…

HOHNER ホーナー ブルースハープ C調 532/20MSX

Amazonで¥5,984。

■樹脂リードデビュー(2024/03/08)

一枚くらいは持っててもいいかな?と思って買ってみました。

D’Addario WoodWinds ダダリオ 合成素材製リード アルトサックス用 VENN G2 (Generation 2) VAS0125G2 [硬さ:2.5] 1枚入り 【国内正規品】

Amazonで¥4,025。

・・・。使う前に割りましたorz

それはそれで悔しいのでもう一枚購入しました。
※厳密には割れた状態で吹けなくはなかったので吹いてみたらちょっと硬かったので柔らかいのにしました。

D’Addario WoodWinds ダダリオ 合成素材製リード アルトサックス用 VENN VAS0120 [硬さ:2.0] 1枚入り 【国内正規品】

Amazonで¥3,800。

マウスピースのオープニングとの関係もあるとは思いますが、いつも使っているWoodStoneの3(or 3 1/2)と比べると音は出しにくいです。

音色は結構いい感じです。

■サックスのメンテナンス(2024/03/23)

クロサワ楽器店さんに年に一回のキー調整に出しました。
ついでにマウスピースとクリーニングペーパーを購入。

■大阪行ってきた(2024/03/31-2024/04/01)

仕事で行ってきましたー。

■パニック障害の治療(2回目)を終える(2024/04/11)

色々あって投薬と認知行動療法を続けていましたが、一旦終わりにしました。

前回の経験からも多分、本当に完治っていうのはないんだとお思います。
どこか引きずりながら、もうこういう性質の人間だとして一生付き合っていくしかないのかなぁと思います。
そういう意味では認知行動療法としては正しく治療できた気がする。

 

■ploom X Advance(2024/04/11)

実はたまーに使ってたploom Xの新型を買いました。
たまーにテレワークしたりする時に吸ってます。

デザインはほぼ好みの問題ですね。
スティックを刺したら加熱が開始される改善はかなり良いです。

■USB Type-Cドック(2024/04/19)

会社のノートPCをクラムシェル運用しようかなーと思って購入しました。

サンワダイレクト ドッキングステーション Type-C スタンド 縦置き HDMI 2ポート 4K 60Hz PD 100W LAN USB3.2 Mac/Win/iPad対応 400-VGA018

Amazonで¥16,800。

ちゃんと短いPD対応のUSB Type-Cケーブルが付属しています。

見た目はいい感じ。

ここの幅調整ができればいいのになぁ。

ちゃんと給電もできました。

Ethernetアダプタはいつものやつですね。
※いつもの=外付けアダプタによく使われているチップ。

ではでは。またの機会に。

log4jの脆弱性(CVE-2021-44228)は意外とIPSやWAFでの検知が難しいかも

ども。こんばんは。

週末にビッグな脆弱性の話題が飛び込んできました。

通称log4shellと呼ばれるこの脆弱性はApache Log4j 2.15.0より前の2系のバージョンに影響があるとされています。

サーバサイドはじめ多くのJavaで書かれたプログラムに影響するのではないでしょうか。

【参考】

この脆弱性の厄介なところは、外部からクラスファイルを読み込めてしまうことによる影響と内部のロギングに利用していることで、影響範囲が膨大なところではないでしょうか。
例えばデバッグ目的でユーザからの入力をログに出したりするようなケース…ありえすぎる…

脆弱性のあるlog4jにとある文字列が渡されることで、JNDIという機能を通じて外部のladp/ldapsサーバ、dnsサーバ、rmiサーバと通信してしまう、更にladp(だけ?)サーバの応答を細工することでクラスファイルを読んで実行してしまうようです。
※ldapじゃなくてdnsにするとdnsクエリが飛びます。脆弱性が有効か試す上ではdnsが利用される可能性もありますね。

JNDI Lookupについて調べてみると「jndi:ldap」という感じの文字列が含まれるのでこれをWAFとかで弾いちゃえばいいじゃん、という気がしますが、そんなに単純でも無いようで、もうちょっと考えないとWAF やIPSが比較的簡単にバイパスされる恐れがあります。

以下参考ツイート。

実際に以下のサイトを参考においらもdocker上で脆弱なspring-bootを使ってテストしてみました。

https://github.com/christophetd/log4shell-vulnerable-app

参考ツイートはもちろん、こんな感じでもexploitは成立しました。
※別で用意したサーバにちゃんとldap通信が飛んできました。

${lower:j}ndi:ldap〜

現在各セキュリティ製品ベンダーから続々と対応するシグネチャが出ていると思います。

上記のようなパターンにも対応できているのかは要確認だと思われます。(実際においらは検証しましたが細かくは書きません…)

log4jの対策済みバージョンへの更新はもちろんですが、上記のようなバイパスの可能性はあるとしても、IPSやWAFがある場合は、シグネチャを有効化しておくことに越したことはないとは思います。今後上記のようなパターンに対応してくる可能性もあると思いますので。

【追記】
ちなみに、影響を少しでも抑えるという意味では、ファイアウォールやiptables/firewalldなんかで不要なLDAP通信を遮断するのも有効ではないかと思われます。そもそもインターネット直抜けでLDAP通信なんてそんなに無いだろうし、あったとしても宛先が限定できると思います。

クラウドとかだとアウトバウンド方向の通信の制御は最近あまりしない気もしますが、一昔前だと割と外向きもファイアウォールで制御してた気がするんですよね。
今回エクスプロイトが成立するかのチェックにDNSが使われるケースがありますが、DNSも本来であれば設定されたDNSサーバ以外のDNSサーバへの通信は塞いでおけばという気もします。
※昔気質の「DMZ」があるイメージのとあるネットワーク屋の感想ですが。。。

 

ではでは。またの機会に。

M5Stack Core 2入門 – 2 – UIFlowでプログラミングする

ども。こんばんは。

前回の続きです。

M5Stackの開発には、大きく、
Arduino IDE
M5Cloud
UIFlow
が、あるようでそれぞれファームウェアを入れ替えることで開発環境も変わります。

Python(MicroPython)での開発だと、M5CloudかUIFlowですが、M5Cloudはあんまりメンテナンスされていないらしい?という情報もあり、最新のUIFlowを導入します。

なお、UIFlowは完全ブラウザベースのものとDesktop版がありますが、今回は折角なので完全ブラウザベースのもので挑戦します。

■ファームウェアの書き換え

いろんな記事を見ていると、以前はesptoolで書き込むのが主流だったようですが、現在はM5Burnerを使うようです。

M5Burnerは公式サイトからダウンロードできます。

https://m5stack.com/pages/download

インストーラはないのですが、重要な注意事項があります。

必ず、「アプリケーション」にappを移動してください。そうしないと、起動するものの、ファームウェアのリストが全然出てきません。地味にはまりました。。ちゃんと同梱のテキストファイルに書いてます。
【注意書き】

あと、やっぱりブロックされるのでセキュリティとプライバシーから解除する必要があります。

起動するとこんな感じです。
いろんなファームウェアやサンプルが並んでますね。
初期のエヴァ風のものは、「Core2FactoryTest」のようです。

とりあえず「UIFlow_Core2」をDownloadして、Burnします。
このとき最新は「v1.6.5.1-core2」でした。

なるほど。内部的にはesptoolが動いているんですね。

■M5Stack Core 2をWI-Fiに接続する

ファームウェアの書き込みが終わるとリセットされて、こんな感じで立ち上がります。

Setupをタップして、Config WI-Fi by WebのStartをします。

すると、こんな画面になります。

指定されたSSIDにPCやスマホを接続ます(パスワードはかかっていません)

次に「http://192.168.4.1」にアクセスします。
以下のような画面が見えるので、アクセスポイントを選択して、パスワードを入力したら「Configure」をクリックします。

URLにパスワードがダダ漏れorz

再起動してもちゃんとアクセスポイントの設定は残っています。

で、真ん中のFlowを押すとモードを聞かれるのでWI-FIを選びます。
※メニューの移動?が毎回リセットしないとだめっぽくてちょっと鬱陶しいかも。

Wi-Fiに接続中。

無事に繋がると、APIキーが表示されます。
ここまででM5Stack側の準備は完了です。

なお、m5stack社のサーバとは、mqttを使って通信しているようです。途中にFW等がある場合は、1883/tcpポート宛の通信を許可してあげてください。

■UIFlowを使う

https://flow.m5stack.com/にアクセスします。
Core 2はBetaでしか対応していないようなのでBetaを選択します。

設定画面が勝手に出てくる(でなければ右側メニューから)ので、API Keyには、M5Stack上に表示されているキーを入力し、DeviceはM5Stack Core 2っぽいのを選択します。

テストプログラムを適当に書きます。

ちゃんとPythonコードも見ることができます。

できたら、右上の▷をクリックして実行します。

いけた!

時計がめちゃくちゃずれてるっぽいので以下のようなプログラムを実行して時計をあわせておきました。

■おまけ:シリアルコンソール接続

UIFlowはMicroPythonが動くファームウェアですが、シリアル接続でかんたんなPythonコマンドを実行することもできます。

TeraTermなどでつながると思いますが、うちはmacなのでscreenコマンドを使います。
こんな感じ。

screen /dev/tty.SLAB_USBtoUART 115200

※スクリーンコマンドを抜けるには、Ctrl+A+Kのあとにy。

何回かエンターキーを押すとプロンプトになるので、適当に実行できます。

【バックナンバー】

ではでは。またの機会に。

M5Stack Core 2入門 – 1 – 開封&Arduino IDEでサンプルが動くまで

ども。こんばんは。

発売から少し経ってしまいましたが、ようやく在庫が復活していて買うことができました。

ESP32のチップが乗っていて、WiFi、Bluetoothに標準対応。タッチスクリーンや、マイク、スピーカも備えるIoTのプロトタイプ開発キットですね。
Arduinoというオープンソースなハードウェアとなっており、Arduinoのコードが利用できます。
また、MicroPythonも動きます。

ESP32が使われているものとしては、Makeblock社のCodey rockyとhalocodeを以前動かして遊びました。

【参考】
Codey rocky
halocode

M5Stack Core2 IoT開発キット

スイッチサイエンスで2020/11/02購入。¥5,225なり。

■開封

中身はとってもシンプルで本体と短いUSB Type-Cケーブル1本です。

本体裏はこんな感じ。

とりあえず電源を入れてみます。

デフォルトで、エヴァっぽいサンプルプログラム(スケッチ)がインストールされています。なかなか格好いい!

■PCとの接続準備

PCはmacbook air(macOS Catalina 10.15.7)です。

以下のページからドライバをダウンロードします・・・と言いたいところですが、どうもここにあるドライバは古くて、おいらのmacbook airではちゃんと認識できませんでした。
※「/dev/tty.SLAB_USBtoUART」が出てきません。

https://m5stack.com/pages/download

ので、とりあえず上記サイトのリンクからArduino IDEとm5Burnerをダウンロードしておきます。
※Arduino IDEはただのリンクで、外部サイトに飛びます。

ということで、silabsのページから最新ドライバをダウロードします。

https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers

適当にインストールします。

インストール後はmacOSの設定→セキュリティとプライバシーから実行許可する必要があります。

■Arduino IDEのインストールと準備

今回インストールしたのは、1.8.13です。

普通にインストールして起動します。

M5Stsack Core 2をUSBケーブルで接続し、[ツール]->[シリアルポート]を確認すると、ちゃんと認識されていますね。

続いて、ボードマネージャにESP32を追加します。

以下のURLを[Preferences…]の「追加のボードマネージャのURL」に入力します。

https://dl.espressif.com/dl/package_esp32_index.json

[ツール]->[ボードマネージャ]にESP32が出てくるので、インストールします。

サイトによっては、以下のドキュメントのコマンドを流す手順を入れているものもありましたが、よくわからなかったので今回はやっていませんが、とりあえず普通に使う分には大丈夫そう。

https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/mac.md

[スケッチ]->[ライブラリをインクルード]→[ライブラリの管理…]から、m5stack関連をインストールします。

おいらは「M5Core2」 と「M5Stack」をインストールしました。

■サンプルスケッチを動かす

[ツール]->[ボード]から[ESP32 Arduino]-[M5Stack-Core-ESP32]を選択します。

続いてサンプルスケッチを読み込みます。

[ファイル]->[スケッチ例]->[M5Stasck]->[Basic]-[HelloWorld]を選択して読み込みます。

なお、このままでは、M5Stack Core 2では動かないようです。
以下のようにスケッチを修正します。

・ヘッダファイルをCore2用に修正

#include <M5Core2.h>

// the setup routine runs once when M5Stack starts up
void setup(){

// Initialize the M5Stack object
M5.begin();

// LCD display
M5.Lcd.print(“Hello World!!!!!あああ”);
}

// the loop routine runs over and over again forever
void loop() {

}

できたら、✔(チェックマーク)の横の「→」をクリックしてM5Stackに書き込みます。ちょっと時間がかかります。

おおー!動いた!

なお、[スケッチ例]のM5Stackのものは、コードの修正が必要ですが、M5Core2のものは修正せずに動きます。いかはtouchのスケッチを動かしている様子です。

とりあえず、動作確認としてArduino IDEでサンプルスケッチを動かしました。

ただ、あんまりArduino IDEで開発するつもりはないし、Pythonで書きたいので、次回は、UIFlowを使ってプログラミングできるところをやりたいと思います。

ではでは。またの機会に。

HaloCode(ESP32)でMicroPythonを動かす(1)

ども。こんばんは。

Codey Rockyに続いて同じくMakeBlock社のHaloCode(ハロコード)も買ってしまいました・・・。

今回買ったのは、
Makeblock Halocodeスタンダードキット【国内正規品】
Amazonで¥5,890なり。

本体だけでも良かったのですが、電池ケースが欲しかったのでキットにしてみました。
本体だけなら¥3,000以下で購入できます。

HaloCodeもcodey rockyと同じESP32チップが乗っているようで、MicroPythonが動きます。もちろんWiFiにも繋がります。

マイクが付いてるので音声識別もできるらしいのと、モーションセンサーがついています。

出力機能はLEDなのでちょっとデバッグがしづらそうですが、小さくて面白そうなので購入してみました。

 

中身はこんな感じ。

本体はかなり小さいです。

とりあえずUSBケーブルに繋いで起動してみました。

mBlock 5経由でファームウェアをアップデートしました。
使えるブロックや拡張もcodey rockyとは違いますね。

モーションセンサーと音声認識は使ってみたいですね。日本語だめな気もしますが。。。

とりあえず、先日つくったリモコンでcodey rockyを動かすスクリプトを改変してHaloCodeのモーションセンサーに合わせて動くようにしようかな。

メッセージのやり取りはMQTTでつくってみようかなー。

色々楽しみですね。

ではでは。またの機会に。

codey rocky(ESP32)でMicroPythonを動かす(3) – テレビのリモコンでrockyを動かす

ども。こんばんは。

なぜだかわかりませんが思いの外ハマっています。楽しい。

ラズパイに比べてできることに制約が多いので、制約の中でできることを探しながら色々試すのが楽しいですね。

で、今回は、赤外線(Infrared)を使って、テレビのリモコンでrockyを操作するコードを作ってみました。

・Codey
Aボタン:リモコンから受け取ったコードを表示するだけ
Bボタン:全スクリプトを停止
Cボタン:リモコン操作で動くモード

・リモコン
音量大小:速度を変更(1-100)
上下左右:押している間rockyがその方向にすすむ

・おまけ
前に障害物がある場合は、止まる。

動かすとこんな感じです。
音量キーでの速度の調整がやたら早いので少しwaitを入れたいのですが、他のコード受信時と同じ処理でやっているので、waitをかけるとrockyの動きがカクカクになります。。。

 

 

■コード

import codey,rocky,event

#このグローバル変数イマイチ
rspeed = 10

def speedctl(flg):
    global rspeed
    if flg == "up":
        if rspeed < 100: rspeed = rspeed + 5 else: if rspeed > 10:
            rspeed = rspeed - 5


#リモコンモード
# TOSHIBA製リモコン
# 64 26 音量大
# 64 30 音量小
# 64 62 上
# 64 64 下
# 64 95 左
# 64 91 右
@event.button_c_pressed
def button_c_cb():
    global rspeed
    codey.display.show("RC",wait=True)
    while True:
        ope = codey.ir.receive_remote_code()[1]
        codey.display.show(rspeed,wait=True)

        if ope == 26:
            speedctl('up')
        elif ope == 30:
            speedctl('down')

        if ope == 0:
            rocky.stop()
        elif ope == 91:
            rocky.turn_right(rspeed)
        elif ope == 95:
            rocky.turn_left(rspeed)
        elif ope == 62:
            if not rocky.color_ir_sensor.is_obstacle_ahead():
                rocky.forward(rspeed)
            else:
                rocky.stop()
        elif ope == 63:
            rocky.backward(rspeed)
        else:
            rocky.stop()

#ただのリモコン読み取りモード
@event.button_a_pressed
def on_button_a_pressed():
    codey.display.show("Recv mode",wait=True)
    while True:
        ope = str(codey.ir.receive_remote_code()[0])
        ope2 = str(codey.ir.receive_remote_code()[1])
        codey.display.show(ope2,wait=True)

#### TEMPLATE ####
#基本的な構文間違いなどにきづけるように起動時にok!と表示 
@event.start
def on_start():
    codey.display.show("ok!")

#スクリプト停止
@event.button_b_pressed
def on_button_b_pressed():
    codey.display.show("Stopped",wait=True)
    codey.stop_all_scripts()

 

ちなみに、赤外線の送信はまだうまく行ってません・・・。というか、送信機能未完成っぽい?

フォーラムでテクニカルサポートからこんな回答がでてます・・・。

リモコンに信号を送るには2つ送らないと行けないけどまだエミッターができてないよ、的な・・・。

2年経ったけどいかがでしょうか・・・。

Sensing IR signals

I am afraid that currently IR control port on mblock software is not open for users yet, although the firmware supports that. Users now cannot use remote controller to control codey rocky.
We will update the information if we add this function to mblock software officially.
Thank you for the feedback, we’ll complete APIs for IR reception emitter then.
 

【バックナンバー】

ではでは。またの機会に。

codey rocky(ESP32)でMicroPythonを動かす(2) – MQTTでメッセージの送受信

ども。こんばんは。

codey rockyではメッセージキューWとしてMQTTWが実装されています。

せっかくなのでちょっと試してみます。

MQTTについては少し古いですがこの辺がわかりやすいです。

MQTTで始めるIoTデバイスの作り方 第1回:「MQTT」を知り「Mosquitto」を導入する (1/3)

まずはMQTTのブローカーとしてmosquittoをRaspberry Pi上にインストールします。
※そのうちRabbit MQも試したいなと思いますがまずは手軽そうなmosquittoで試します。

ブローカーの動作環境はRaspbian GNU/Linux 9.11 (stretch)で、2020/02/16時点最新のパッケージになっています。

・mosquittoのインストール

sudo apt install mosquitto

うちの環境ではlibev4とlibwebsockets8も合わせてインストールされました。

・続いてクライアントもインストールします。

sudo apt install mosquitto-clients

libmosquitto1が合わせてインストールされました。

・ブローカーの起動

sudo systemctl start mosquitto

sudo systemctl status mosquittoで確認して特に問題なく起動していました。
1883ポートでLISTENしているみたいですね。

・テスト

以下のコマンドでtestというトピックを購読(サブスクライブ)します。

mosquitto_sub -d -t test

実行結果はこんな感じ。
※lexはうちのラズパイのホスト名です。

Client mosqsub/6162-lex sending CONNECT
Client mosqsub/6162-lex received CONNACK
Client mosqsub/6162-lex sending SUBSCRIBE (Mid: 1, Topic: test, QoS: 0)
Client mosqsub/6162-lex received SUBACK
Subscribed (mid: 1): 0

・テストメッセージ送信

別のターミナルでSSHに接続してtestトピックに投稿(publish)します。

mosquitto_pub -d -t test -m “test 1”

すると、サブスクライバー側で以下のように表示されます。

Client mosqsub/6162-lex received PUBLISH (d0, q0, r0, m0, ‘test’, … (6 bytes))

test 1

これで最低限の動作はokですね。

続いてcodey側にこんなコードをアップしてみました。
以下のリファレンスからサンプルコードを流用していますが、リファレンス内のサンプルコードの「from mqtt import MQTTClient」は誤りで、正しくは「from cloud_message.mqtt import MQTTClient 」です。

https://makeblock-micropython-api.readthedocs.io/en/latest/public_library/Third-party-libraries/mqtt.html

■サンプルコード

#import mqtt package
#リファレンスは"from mqtt import MQTTClient"となっているが実際はcloud.message.mqttが正しい
#https://forum.makeblock.com/t/importerror-no-module-named-mqtt/15029
from cloud_message.mqtt import MQTTClient

import codey, time, event
import utime

MQTTHOST = "mosquittoのサーバのIPアドレス"
MQTTPORT = 1883

#なんでもいいらしいが重複はだめっぽい。
#https://qiita.com/egnr-in-6matroom/items/3aef4bd45857e75bb1d3
client_id = "101"

# Example Path
#ここの指定方法がまだわからない・・・。全部取得してみる。
Topic = "#"

# ID / PWはオプション。今回はmosquitto側では指定していないので省略した。
#mqttClient = MQTTClient(client_id, MQTTHOST, port=MQTTPORT, user='test', password='test', keepalive=0, ssl=False)
mqttClient = MQTTClient(client_id, MQTTHOST, port=MQTTPORT, keepalive=0, ssl=False)

# Connect to the MQTT server
def on_mqtt_connect():
    mqttClient.connect()

# publish a message
def on_publish(topic, payload, retain=False, qos = 0):
    mqttClient.publish(topic, payload, retain, qos)

# message processing function
def on_message_come(topic, msg):
    #print(topic + " " + ":" + str(msg))
    #b'test'みたいな表示になるので、文字列化して分割。なおメッセージ自体に'(シングルクォーテーション)がある場合は""で囲まれるが未対応
    temp_msg = str(msg).split("'")[1]
    codey.display.show(temp_msg,wait=True)

# subscribe message
def on_subscribe():
    mqttClient.set_callback(on_message_come)
    mqttClient.subscribe(Topic, qos = 1)

@event.button_a_pressed
def on_button_a_pressed():
    codey.display.show("Start",wait=True)
    codey.wifi.start('SSID', 'パスワード', codey.wifi.STA)
    time.sleep(1)
    if codey.wifi.is_connected():
        codey.emotion.smile()
        on_mqtt_connect()
        on_subscribe()
        codey.display.show("Ready!",wait=True)
        while True:
            #RTCがついてないので起動からの時間となる。
            #nowtime = utime.time()
            #codey.display.show(nowtime,wait=True)
            #codey.display.show(codey.battery.get_percentage(),wait=True)
            # Blocking wait for message
            mqttClient.wait_msg()
            #ブロッキングしない方
            #mqttClient.check_msg()
            time.sleep(1)

    else:
        codey.emotion.shiver()


@event.button_b_pressed
def on_button_b_pressed():
    codey.display.show("Stopped",wait=True)
    codey.stop_all_scripts()

これをcodeyにアップロードすると、パブリッシュされたメッセージを表示するようになります。

だいぶ前に作ったbrouteから消費電力を取得するスクリプトを少し改変して、取得した結果を単純にmosquitto_pub -d -t test -m 値で投稿(publish)するようにしました。
#python上からosコマンドを実行しています。こういう移植性のないことしちゃだめですね。ちゃんとmqttをpythonから操作するように変更しないと・・・

動作の様子はこんな感じです。
エアコンを入れると消費電力がちゃんと上がってますね。

 

本当はメッセージが無い間は、時計にでもしようと思ったのですが、odey rockyにはRTCが搭載されていないようで、utime.time()で取得した値は、電源投入後からの起動時間(秒)となります。

mqttClient.wait_msg()はブロックされますが、mqttClient.check_msg() はブロックされないので、まぁバッテリーの残量を出すとかそういう感じのことはできそうですね。

あと、MQTTのトピックの指定の仕方がよくわかりませんでしたので”#”としています。一応トピックは「test」で来てるみたいですが、「/test/」とかにしてもうまく拾えないんですよね。
これはもうちょっと調べないと。

次は赤外線周りをなんかやってみようかな。

【バックナンバー】

ではでは。またの機会に。

codey rocky(ESP32)でMicroPythonを動かす(1)

ども。こんばんは。

先日購入したcodey rockyが思いの外色々できそうだったので、書いてみることにしました。

codey rockyの開封記事:STEM教育用のおもちゃ「codey rocky」を買ってみた

で、前回の記事でも書きましたが、このcodey rockyにはESP32という制御基板が搭載されており、MicroPythonというPythnoの実装系で動作させることができるようです。

参考になるリファレンスなど:
codey rockyの開発元であるMakeBlock社のPython APIリファレンス
https://makeblock-micropython-api.readthedocs.io/en/latest/

MicroPythonのリファレンス
https://micropython-docs-ja.readthedocs.io/ja/latest/index.html#

さて、とりあえずPythonで色々動かす前に動作確認というか、本当にMicroPython動くんだよね?的な意味も込めてこんなコードをmBlockから流してみました。
※mBlockの使い方の簡単な紹介は前回の記事で。

なお、Codeyのファームウェアは「23.01.013」です。(mBlock上で確認)

import codey, time, event
import uos

@event.button_a_pressed
def on_button_a_pressed():    
    codey.display.show('sysname:' + uos.uname().sysname, wait=True)
    #codey.display.show('nodename:' + uos.uname().nodename, wait=True) same as sysname
    codey.display.show('version:' + uos.uname().version, wait=True)
    codey.display.show('release:' + uos.uname().release, wait=True)
    codey.display.show('machine:' + uos.uname().machine, wait=True)

これをcodeyへアップロードして実行すると、codeyのLCDに以下の文字列が表示されます。
※手書きで写したので間違ってるかも・・。

sysname:esp32
version:23_01_007_004-ht3-21-g28f29e21-dirty on 2019-12-03
release:0.0.0
machine:ESP32 module wth ESP32

なるほど。わからん。けどまぁMicroPythonは動く模様。(“u”から始まるパッケージはMicroPython用らしい)

続いて、ネットワークを使ったプログラムを動作させてみます。
WiFiへの接続部分はcodeyのライブラリを活用して、外部へHTTP GETして表示するだけの単純なプログラムです。
HTTPリクエストにはureqeustを利用します。

import codey, time, event
# import ureqeust
import urequests as requests

@event.button_a_pressed
def on_button_a_pressed():
    res = ""
    codey.wifi.start('SSID', 'PASSWORD', codey.wifi.STA)
    time.sleep(1)
    if codey.wifi.is_connected():
        codey.emotion.smile()
        res = requests.get(url = 'http://www.hits-net.com/blog/ip2.php').text
        codey.display.show("myIP:" + res, wait=False)
        
    else:
        codey.emotion.shiver()

これを実行すると、このサーバ上のIPアドレスを表示するだけのPHPの実行結果を拾ってLCDに表示します。

こいつデバッグが超しづらい。
MicroPythonだとWebREPLっていうブラウザ経由で対話型に実行する仕組みとかを使って皆さんやってるみたいなのですが、codeyにファイルを転送する仕組み、ってかそもそもできんのか・・・?がわからず、とりあえずディスプレイの表示とかcodeyの動きを頼りにデバッグするしかないですね。

ここまで動けば、あとはもうセンサーの結果を拾ってPOSTしたり、別のサーバ上からコマンドをGETで拾ったりといろいろできそうなことがわかります。

codey rocky自体にもクラウドメッセージという機能があるみたいですがまだ使い方がわかりません。。。
あと将来的にIFTTTに対応するとかしないとかの話もあるようです。

赤外線周りも使えそうなので、ちょっとしたリモコンにもできる・・・かなぁ。

【バックナンバー】

ではでは。またの機会に。

STEM教育用のおもちゃ「codey rocky」を買ってみた

ども。こんにちは。

唐突に「ロボットのおもちゃ」がほしいなぁと思い、Amazon「のコミュニケーションロボット」を眺めたら良さそうなものがあったので買ってみましたとかそんな感じの話です。

COZMOとか言うのが面白そうだったんですが、お値段が結構高いのと、製造元のAnkiという会社が開発を終了したらしいです。

COZMOは過去HIKAKINさんがYouTubeで紹介していますね。

この分野あまり興味なかったのですがこんな記事がありました。

家庭用ロボットのAnkiが経営破綻、その“失敗”が残した功績と教訓

そういやペッパーくんも最近見かけませんねえ。

で、今回購入したのは、

Makeblock プログラミングロボット codey rocky 日本語版 【日本正規代理店品】

¥13,800なり。ちょっとおもちゃにしては高いか。

対象年齢は6歳以上らしいですが、おっさんもう軽く30オーバーだよ。。。

これは上述のCOZMOのような感じではなく、教育用?のロボットみたいです。
最近では小学校でのプログラミング教育が必修化とかそんな話もあるみたいですね。
海外ではSTEM教育(“Science, Technology, Engineering and Mathematics” の頭文字)なんていう言葉もあるみたいです。

で、このcodey rockyは自分でプログラムを書いて実行させられます。
しかも、ScratchベースのプログラムだけじゃなくPythonでコードが書けるらしい。

またいろんなセンサーがついていて、センサーを組み合わせたちょっとしたIoT的なこともできそう。赤外線も送受信できるみたい。どこまでこちらがわで制御できるかはまだ調べてないですが、Wi-FiやBluetoothも使えるみたい。

制御基板にESP32というのが搭載されていて、割とIoT界隈では著名なチップのようです。

参考リンク

最近の子供は面白そうなおもちゃがあって羨ましいですね。

前置きが長くなりましたが、届いたので開封します。

異国のキッズが楽しそうに遊んでいるパッケージ。

ROBOT LIFEという会社が代理店をしているみたいです。

箱の中身。

mblockというアプリのダウンロード方法がかかられたかんたんなガイドと電圧などの規格が書かれた紙、謎のシール・・・?子ども用なのでお名前シールといったところでしょうか?

本体。これはcodeyですね。

下側にはrockyとUSBケーブル(Micro B-A)とストラップが入っていました。

codeyとrockeyを合体させてみました。

電源を入れたところ。なんかうにゃうにゃ言ってます。

初期状態である程度プログラムが入っているようで、AボタンやBボタンを押すと反応します。

もちろんそれが目的ではないので、続いてPCの準備をします。

環境はmacOS Catalina 10.15.3です。

以下のURLからmblockというIDEをダウンロードします。

https://www.mblock.cc/ja-jp/download/

インストールします。って、これ6歳でできるかな・・・?
特にmacOSだと野良アプリはブロックされるし。

とりあえず立ち上げて、サインインします。今回はGoogleアカウントでサインインしました。

【2020/02/11追記】
mBlockにGoogleアカウントでサインインしていましたが、保存がうまく行かなかったり、makeblock社のサイト上でのプロフィールが見れなかったりと不具合があったので、結局個別アカウントを作成しました。
また、IoT関連のブロックを使って天気や気温を外部から取得する場合、ここで登録したアカウント?に発行されるAPIキーを使うようなので、アカウントがちゃんと動作していないとIoT関連機能が一部使えない模様です。

こんなGUI。

続いてCodeyに接続してみます。付属のUSBケーブルとPCをつないでデバイスタブから接続をクリック。
ちなみに、Bluetoothで接続してプログラムをアップロードしたりするには、PC用の専用ドングルがいるらしいです。
¥2,500くらいするのでまぁケーブルでいいか。

とりあえずファームウェアを更新しました。

いろんな各様拡張機能があったので全部突っ込みました。

とりあえず、適当に作ってみました。
Scratchベースでブロックを組み合わせればすぐに作れます。
また、ブロックをPythonコードで表示することもできます。

ブロックベースで作ったものはPhtyonのコードで表示できますが、編集はできない模様です。また1からPythonで作ることもできます。一応補完機能とかも付いてるのですが、拡張のIRとかに関してはコードの補完ができないっぽい。

なので、ブロックで適当に組んでコードをみて、それを別のエディアとかに貼り付けながら、Pythonで書き起こすっていう使い方になりそう。

ブロック

コード

# generated by mBlock5 for codey & rocky
# codes make you happy
import codey, time, rocky, event

@event.button_a_pressed
def on_button_a_pressed():
    time.sleep(1)
    codey.emotion.look_around()
    if rocky.color_ir_sensor.is_obstacle_ahead():
        codey.emotion.sad()
        codey.stop_all_scripts()

    rocky.forward(50, 1, straight = True)

上記のプログラムをcodey rockyにアップロードするとこんな動作になります。

 

おー、これなかなか楽しいぞ。
画像認識とかもできるようなので、もうちょっと色々触ってみます。

普通に大人向けのプログラミングの実習にも使えそうな気がしますねー。

てか大人でもここまで一発でできない人多いと思う。。。

ではでは。またの機会に。
 

 

 

Subversionはまりにはまった。

ブラウザからはきちんと見える状態なのに、svn importで

svn: PROPFIND リクエスト (相手: ‘/svn/repos/hoge’) が失敗しました
svn: PROPFIND (URL: ‘/svn/repos/hoge’): 301 Moved Permanently (https://www.hits-net.com)

のようなエラーが出たり、AnkSVNでさっぱりディレクトリが表示されなかったりと。

非常にはまりつつも、いろんなサイトを参考にしつつ、結局Locationに指定したパスが実際に存在するとエラーになるということを発見。

まぁこの場で俺がうだうだ書いても仕方ないので、以下の素晴らしいサイトをご覧ください。

参考サイト:
http://kamakura.cool.ne.jp/oppama/misc/subversion2.html
http://www.hinet.mydns.jp/tdiary/20050317.html

結局抜本的な解決にはなってないが、実際のディレクトリは「repos」でLocationには「repo」としてみた。

結局「SVNParentPath」で実際のディレクトリを通しているのでいけてるっぽいのか?!

やっぱりApacheの設定ももう少し本格的に勉強しないとな~。

この件は時間がある時にきっちり調べてみます。

[サンプル]
https://www.hits-net.com/svn/repo/hoge/
(実際にファイルのあるディレクトリは/[DocumentRoot]/svn/repos/hoge)
https://www.hits-net.com/trac/hoge/