发布 CodeLab Adapter 3.7
3.7 包含以下更新。
重大更新
统一 Python 环境
太多选择,有时候是一种心理负担
CodeLab Adapter 的扩展系统之前最大的问题是: Python 环境不统一。 一会儿是 Adapter 内置的 Python(用于打包),一会儿是用户本地的 Python(用于运行 Adapter Node),一会儿又是完整版里自带的 Python(内置 Node 的依赖)。当事情有太多的选择,时常让人不知所措,很多用户在选择困难中,花费了许多时间。
3.7 版本中(完整版), Adapte 内部只有一个 Python(>=3.7
), 这个环境内置了许多常用第三方库,在自定义插件时,可以使用到它们:
- codelab-adapter-client
- Flask
- ipython
- jupyterlab
- mcpi
- numpy
- opencv-contrib-python
- paho-mqtt
- Pillow
- prompt-toolkit
- protobuf
- PyAutoGUI
- pyserial
- pyzmq
- requests
- uflash
- websockets
- ...
更多的内置库参考: CodeLab Adapter wiki
Extension 与 Node
在新的 Python 环境中, Adapter Extension 和 Adapter Node 有什么区别呢?
它们处于同样的 Python 环境。唯一的区别是,Adapter Extension 以线程方式启动, Adapter Node 所在的脚本以进程启动: python xxx.py
,在类结构上,Adapter Extension 是 Adapter Node 的子类。Adapter Node 只是普通的 Python 脚本,可以使用本地 Python 启动它(这对于调试很有帮助)。也可以在多台机器上分布式运行(可以是局域网,也可以运行在互联网)。目前Neverland 2.0就是一个范例: 在文档里的简单 demo 中,涉及 3 台计算机直接的消息通信,整个过程简单而快速。
小图标
有若干用户来信提到这个需求: 让 CodeLab Adapter 像 Scratch Link 一样,运行的时候在桌面显示一个小图标,以便于用户管理它(手动关闭它或者打开 WebUI 界面)。
Windows 下:
MacOS 下:
右键小图标,可以做到:
- 打开 WebUI
- 关闭 CodeLab Adapter
前端更新提醒
之前 Adapter 搭配的 CodeLab Scratch 因为缓存问题,需要用户主动刷新。这造成许多困扰,用户无从直到我们何时更新了积木,每次清楚浏览器缓存又导致加载缓慢。
在当前版本之后的版本中,前端 UI 会主动提醒用户何时应该更新
ps:如果你之前打开过 CodeLab Scratch,此次需要做最后一次手动浏览器缓存刷新
内置 mDNS 服务
Adapter 3.7 中内置了 mDNS 服务,方便在局域网中以可编程方式发现设备。
Neverland 2.0 插件中使用到它:
当 Adapter 以 NEVERLAND_HUB 模式 启动时,Adapter 将作为空间中的主节点 ,并广播出自己的 mDNS 服务。我们可以在 Scratch 中发现了连接它。
只要安装codelab_adapter_client,你可以让自定义的 Adapter Node 也拥有广播和发现 mDNS 的能力,这对于提供 C 端产品很有用。
这部分相关源码参考: codelab-mdns-*
内置 OSC 服务
OSC (Open Sound Control)是一种用于将声音合成器、计算机和其他多媒体设备联网的协议,用于音乐表演或表演控制等目的。OSC 的优势包括互操作性,准确性,灵活性以及增强的组织和文档。
Adapter 同时内置 OSC server 和 OSC client!
通过兼容这个标准协议,我们可以使用几乎所有市面上主流的 OSC client。
如此一来,CodeLab Adapter 甚至可以接管整个音乐厅!
以下是利用 OSC client 做的一个例子(高速刷新):
如果你使用 iPhone 或者其他支持压力输入的屏幕,可以通过按压力度控制画笔粗细。
建恩同学将 CodeLab Adapter 的 OSC 消息桥接到了 midi 协议, 进而可以与所有主流的专业音乐软件交互:
目前正与 Rick 一起探索在音乐领域的可能性(诸如与 vvvv 协同)。
可编程的固件刷入接口
目前只支持 microbit 的自定义固件刷入,支持 micropython 和 makecode 两种固件刷入,也支持任何允许文件拖入式的固件刷入 (诸如CircuitPython),编程细节参考:flash_usb_microbit(firmware_path)
未来将支持更多固件的刷入。
新增插件
EasyOCR
EasyOCR是个有趣的 Python AI 项目, 足够简单,又足够有用, 支持 70 多种语言的开箱可用 OCR,包括中文,日文,韩文和泰文...
EasyOCR 的一层薄薄包装,将 EasyOCR 的能力引入 Adapter。
tensorflow-yolov4
基于 Tensorflow 2 的 YOLOv4 实现,小巧易用。
Neverland 2.0
Neverland 2.0 基于 mDNS 提高易用性,它是一个分布式系统,基于 Adapter 构建,在用户侧 Adapter 中,表现为一个内置插件。
拓扑图如下:
项目包含以下部分:
- adapter master: 空间主节点,以 NEVERLAND_HUB 模式运行的 Adapter,运行在树莓派上
- adapter node: 空间功能节点,运行在树莓派上。在我们的视频里,有一个节点连接了 makeymakey(makey node)
- user client: 运行在用户计算机上的 Adapter
adapter master
ADAPTER_MODE=3 ./codelab-adapter
关于 Adapter 的模式
adapter node
python3 makey_node.py
user client
正常运行 Adapter 即可
我们正在新的办公室里实施 Neverland 2.0,它看起来就像可编程的 Teamlab:
Physical Blocks 2.0
physical blocks 2.0 是最新的 DynamicTable 插件。 新的更新我们都将在这个版本是进行,physical blocks 1.0 在未来将弃用。
使用 physical blocks,可以在一张桌子上对实物进行编程。
与 1.0 版本的区别?
标记列表
默认是字符串(序列化之后),可以随意与 scrath 积木组合(诸如 xx 包含 xx 积木),避免因为操作 list 引起的崩溃(诸如将 list 保存为变量)。
在 2.0 中,直到主动使用 JSON parse 积木解析后,它才称为列表。相关操作参考:json 积木,也可参考前边的例子: physical-blocks2-spell-demo
此外 2.0 只使用一个积木更新数据,提高标签存在的稳定性(也提高速度),其中一种典型的编程模式是: 在一次更新数据之后的积木都对应更新瞬间的视野状态。而不像 1.0,每个积木都有各自瞬间的视野。 近期还将升级 pro 版本(商业合作伙伴)
插件增强 & bug 修复
Teachable Machine
Longan 团队已经将 Teachable Machine 部署到国内: Longan Teachable Machine, 并且内置支持 CodeLab Adapter, 开箱可用!
EIM
Scratch EIM 插件做了若干重要更新,诸如:
- 添加特定类型插件的消息积木
- 修复 rate limit 通知过于频繁问题
- 添加 runtime 参数
- 支持调试模式
- 将 rate limit 机制添加在基础类中
- 完善 message id 机制(uuid)
- 修复 eim 消息作为变量显示在舞台区的问题(json 序列化)
- 支持定制 message timeout 参数
EIM 的插件已经开源:
USB micro:bit
支持连接时自动检测与刷入固件。
这部分的插件已经开源:
micro:bit radio
支持连接时自动检测与刷入固件。
这部分的插件已经开源:
我的世界(minecraft)
感谢 @Lounsen 同学的 bug 反馈,目前已修复跨平台兼容问题。
不远的将来
我们正逐步将 Adapter、Scratch、Python、Smalltalk 进行融合,试图进一步提升编程环境的灵活性。 Smalltalk 是一片有着壮美景致的遗失世界。
Smalltalk & Scratch:
浏览器里的 Smalltalk & Scratch & CodeLab Adapter:
将 Python 提升到 Smalltalk-like 沉浸式编程环境:
更多的探索参考:Smalltalk 入门导览