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

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/

とりあえずsubversionとTracを入れてみた

以下自分用めも

【参考サイト】

http://www.cafechantant.com/blog/2007/08/27/centos5-%E3%81%A7-subversiontrac/
(↑メインはこちらを参考にさせていただいた)

http://oku.edu.mie-u.ac.jp/~okumura/linux/?Subversion

http://blog.clouder.jp/archives/000734.html

http://www.i-act.co.jp/project/products/products.html
(↑Tracの日本語化版の配布元。ありがたい。)

http://espion.just-size.jp/archives/05/297225719.html

 

なんとか動いているものの、最初compatでこけた。

httpd再起動したらなおったけどw

あとは、pythonの問題かな~。egg-cashとか言う奴のパスがいまんとこ、ちょっと嫌なところにある。
/etc/sysconfig/httpdで修正できるらしい。が、これはとりあえず後回し。