组合原则: 设计时考虑拼接组合。如果程序彼此之间不能有效通信,那么软件就难免会陷入复杂度的泥沼。 – Eric S·Raymond《Unix 编程艺术》

3.4 包含以下更新。

重大更新

完整版(full)和精简版(lite)

从 3.4 开始,CodeLab Adapter 将同时发布完整版和精简版。

完整版和精简版的区别是什么?如何做选择呢?

完整版

用户视角

完整版主要针对两类人群:

  • 初学者
  • 准备再次分发 CodeLab Adapter 的开发者/企业
初学者

如果你是一个初学者,准备使用 CodeLab Adapter ,建议选择完整版。

完整版内置了一个完整的 Python 环境和 jupyterlab 。以及 CodeLab 偏好的其他第三方 Python 库,如此一来避免了像打开命令行(cmd)使用pip安装依赖 之类令新手困惑的操作, 有了 jupyterlab ,绝大多数操作不必进入命令行。

此外, CodeLab Adapter 由于携带了 physical blocks 插件,可用于构建 DynamicTable, 引起了一些展厅的兴趣。他们希望得到一个开箱可用的方案,CodeLab Adapter 完整版让这样的方案唾手可得。

准备再次分发 CodeLab Adapter 的开发者/企业

陆续有企业希望通过跟 CodeLab 建立商务合作,来获取定制和再分发 CodeLab Adapter 的能力。

出于时间、人力和目标的考虑, 我们对软件定制化服务兴趣不大。但根据使用场景的差别,定制化的需求是可理解的。

我们希望构建一个更为通用的方案,让 CodeLab Adapter 可以在没有我们干预的情况下,被开发者/企业定制和再分发。其中的关键是软件的可组合性(主要受 Unix 哲学的影响)。

这个想法一直存在,之前做了很多的隐性铺垫(没有文档化),它的第一个用例是将 Adapter 以 headless 模式集成到Longan 盒中。

3.4 版本对可组合性做了目前为止最大的提升。

开发者/企业目前可通过修改完整版中的app_settings.py Python 文件,来制定 Adapter 的行为。(更多细节参考完整版里的app_settings.py文件,它只是普通 Python 脚本!)

一个典型用例是,你希望双击 Adapter 的时候,打开你的编程平台,而不是默认的https://codelab-adapter.codelab.club:12358/

那么你只需要在app_settings.py添加一个配置项: WEB_UI_ENDPOINT

让我们将 CodeLab Adapter 的启动页面设为 CodeLab 社区创作页 WEB_UI_ENDPOINT = "https://scratch.codelab.club/projects/editor/" (我们将在暑期开展为期 1 个多月的编程活动,社区将同步投入使用)

完整版之所以能够与可嵌入的 Python 解释器协同工作,在技术层面,只是配置了一些app_settings.py参数而已!(通过以下代码指定PYTHON3所在路径)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import sys, os, pathlib, platform
if getattr(sys, 'frozen', False):
    executable_path = sys.executable

    if (platform.system() == "Darwin"):
        app_dir = pathlib.Path(executable_path).parents[0]
        PYTHON3_PATH = str(app_dir / "python_env" / "bin" / "python3.7m")
    if platform.system() == "Windows":
        app_dir = pathlib.Path(executable_path).parents[0]
        PYTHON3_PATH = str(app_dir / "python_env" / "python")
    if platform.system() == "Linux":
        app_dir = pathlib.Path(executable_path).parents[0]

实际上, 整个完整版 都只是 Adapter 可组合性的一个用例! 更多可配置项目参考:配置文件

关于 Adapter 可组合性的更多想象, 参考定制与分发

ps: MacOS下, app_settings.py 被嵌入在软件包内,而不像Windows下,处于同一级目录。 MacOS下,app_settings.py 位于: codelab-adapter-3_4_1-mac-full.app/Contents/MacOS/里。

技术视角

完整版内置了一个可嵌入的 Python 解释器(embeddable python), 是一个全功能的 Python,可以安装第三方库(pip)。

内置完整 Python 解释器的最初动机是,降低Adapter Node使用门槛。

最初设计 Adapter Node 是为了让熟悉 Python(或其他编程语言) 的用户能够灵活构建插件。

后来从邮件反馈里发现,初学者对一些内置的Adapter Node很感兴趣, 像 jupyterlabphysical blocks

这二者都涉及到复杂依赖,要求本地安装有 Python3

为了让这些用户感兴趣的插件,更早能被玩起来,我们准备为 Adapter Node 提供一个真实的 Python 环境,在发布时内置好第三方库, 如 physical blocks 插件依赖的 OpenCV 和 Jupyterlab 插件依赖的jupyterlab, 如此一来这些插件就能做到开箱可用。

此外,CodeLab Adapter 在学校里被一些师生所使用,学校网络环境复杂,临时安装依赖可能会遇到问题,这也是我们发布完整版的动机之一。

精简版(lite)

之前的 CodeLab Adapter 一直都是精简版。

如果你是 CodeLab Adapter 的老用户,可能会更偏好精简版,因为它更自由,入门门槛可能会高一些。

更自由!这是多么重要的理由!像我们这类喜欢折腾的人,最爱自由而最恨限制,在日常生活中,难以忍受的事情是很多的,软件世界不该成为现实的翻版。

精简版目前一直控制在 20MB 以内。Adapter 精简版可以被集成到其他软件内部,诸如 Electron 构建的桌面应用里。

完整版可以看作整合了精简版的外部软件: 塞入了 Python 解释器目录和app_settings.py启动文件。

自省与多环境并存

如果你有多个版本的 Adapter 并存,可以利用 Adapter 的自省能力,看看它运行时候的环境/参数细节:

易用性

易用性是每个版本都试图提升的特性。

micro:bit 固件烧录

3.4 版本内置了 micro:bit 固件烧录。

micro:bit 固件烧录目前是一项系统服务,作为 RESTful API 对外提供服务,这意味着插件作者,可以随时使用它帮助用户刷入固件。既可以在自行构建的 UI 里,也可以在 Scratch 积木里,或者在第三方 python 包里,只需调用 Adapter 的固件烧录服务即可。

当前,usb_microbit 插件使用了这项服务,更多细节参考: flash_firmware

我们会尽快将这些稳定下来的接口文档化。

简化 microbit radio 的功能板编程难度

我们通过构建 microbit_radio 插件,深度连接 micro:bit 生态

3.4 版本中,优化了串口通信,提高功能板侧编程的可理解性。

新增插件

3.4 版本新增了若干插件(6 个),主要得益于 3.0 架构的灵活性,使得扩展新功能非常轻松。

extension_Siri

该插件将 Siri 接入到 Scratch,并与 CodeLab 可编程空间里的一切互动

simple_NLU

simple NLU 是一个简单的语义处理器,基于简单的规则匹配,可以做一些有趣的事情,而且因其足够简单,很适合作为课堂入门案例讲解。

主要受到 Cozmo 社区Cozmo-Voice-Commands项目的启发(@jinlei 最近一次来访,提到希望在课堂上演示语音控制 Cozmo)。

看该插件和 Siri 插件组合使用的效果:

该插件可以和任何文本协同工作,可以来自 Siri 的输入,也可以来自任何其他地方。


也附上 @liuqing 恶搞的大合集:

Kano motion sensor

coding kit, for movers, shakers and makers.

Motion Sensor 简单易用,它可以感应到手的前后左右运动

以及感应到物体离它的距离:

以下是使用该插件,接入 Adapter 后,作为 Robomaster 控制器的简单例子

UART adapter extension

一直对 micro:bit 和 Adapter 通信的固件很不喜欢,几次重构都不满意。受 DJI Robomaster 阻塞式明文协议和 Jupyter 的通信协议(代码即数据)启发,实现了一个十分简单通用的 Scratch UART 插件,之后接入新的 uart 设备只需几分钟。

NetworkZero extension

NetworkZero 的目标是让局域网通信变得简单, 使局域网内的游戏制作和网络教学变成简单。

收信人: 地址 (地址名),并 接收 来自这个地址的消息。

寄信人: 往 目标地址 发送 信息

允许任何人公布通信地址,所以可以轻松构建网状结构。

典型应用场景:

  • 局域网联机游戏
  • 局域网聊天
  • 多人联机控制机器人
  • 与 Python 程序(诸如树莓派机器人)互动

SimplePyboard extension

支持大多数的 pyboard (烧录 micropython 的 board), 诸如 esp32、esp8266、micro:bit、 掌控板、bpi:bit…

采用的是 micropyhton 的 REPL 机制。

插件增强

physical blocks 插件

支持空间坐标信息(与 Scratch 坐标系保持一致)。

如此一来,physical blocks 目前:

  • 方向
  • 平面坐标
  • marker id

Toio 主创团队认为位置,方向和时间是构建许多好玩游戏的关键要素,Toio 给出了许多惊艳的演示。

physical blocks 目前也完整支持了这些要素。

基于 marker 角度微小变化,构建的大楼震动检测器: (CodeLab 周末活动的参与者@taotao 的意外发现)

基于平面坐标构建的交互式生日贺卡:

受 Dynamicland 的交互故事书启发。

bug 修复

  • 为 Robomaster 连接添加 timeout 机制,避免设备不在线时无限期阻塞
  • 修复初次运行 CodeLab Adapter,需要启动两次的问题(依赖关系问题)
  • 避免刷新 web ui,Adapter 即刻退出,采取策略:所有连接都关闭之后,等待 10 秒再退出
  • 将 tello 迁移到 v3 协议

开始使用

下载最新 Adapter

配合 CodeLab Scratch 使用时,建议刷新浏览器缓存。

在 jupyterlab 中查看当前所处的 Python 环境

1
2
import sys
sys.executable # /Users/Alan/Desktop/adapter/codelab-adapter-3.4.0/full_mac/codelab-adapter.app/Contents/MacOS/python_env/bin/python3.7m

在 jupyterlab 里安装第三方库

1
2
3
from codelab_adapter_client.utils import install_requirement
requirement = ["bottle"]
install_requirement(requirement)

国外用户默认使用官方源,国内用户默认使用清华源(https://pypi.tuna.tsinghua.edu.cn/simple)。

安装之后,可供 Adapter Node 插件使用!

安装的插件,将内置在当前 Adapter 完整版中,由于它只是免安装软件,所以可以直接再分发。