Etoys学习笔记: 与Scratch互操作

A computer is an instrument whose music is ideas -- Alan Kay

前言

读完《Mindstorms》之后, 对Etoys越发感兴趣, 《Mindstorms》给了我一种全新的看待学习系统(learning system)的视角。在这种视角下,Etoys惊人地优美,它展示出Alan Kay骇人的创造天才,Etoys让我们看到建构主义的理念如何实体化以及完美融合于系统之中;它也让我们看到,这个拥有惊人灵活度与简易性的系统如何支持探索者(孩子)去建构自己的世界。

近期准备写一篇文章: Etoys: LOGO的现代对应物,来梳理我在Etoys中的探索见闻。此外,也在尝试用《Mindstorms》提供的视角来观察Scratch。这个过程中同样看到许多此前未曾遇见的风景。

本文记录了探索过程中的一个片段: Etoys与Scratch的互操作。

浮生一日

五一假期里,花了半天时间阅读Etoys社区里的文章。很喜欢Squeak Etoys, Children & LearningLearning with Squeak Etoys。之后和Etoys渡过了愉快的另一个半天。

Etoys

我最初注意到Etoys,是在Alan Kay的演讲上,这个演讲给我极大的冲击。

维基百科所言:

Etoys是一个富媒体创作环境,具有脚本对象模型,拥有适用于在不同平台上运行的不同对象,它是免费且开源的... 它预装在OLPC XO-1电脑中。已在美国,欧洲,南美,日本,韩国,印度,尼泊尔,埃塞俄比亚和其他地方成功使用。

如Alan Kay在Squeak Etoys, Children & Learning中提到的:

Etoys was inspired by LOGO, PARC-Smalltalk, Hypercard, and starLOGO

在Etoys身上我们可以看到前人的许多天才设计。

可以从这儿下载。Etoys的社区是squeakland,又一片有趣的land :)

现今基于建构主义构建的四片大陆分别是:

  • Mathland(LOGO)
  • Dynamicland(dynamicland.org)
  • squeakland(Etoys)
  • neverland(CodeLab)

入门

Etoys是一个child-friendly的探索性环境。跟随教程和演示:

很快就能入门.

如果你记得Seymour Papert《Mindstorms》的开篇里讲到的齿轮和乌龟。那么你会发现眼前这个手绘风格的小车如此熟悉,它正是Etoys版的LOGO龟,它们的内在精神是呼应的。这种建构主义精神由《Mindstorms》做了清晰而细致的表述。

作品展览馆

入门之后,推荐逛一逛作品展览馆

如果你是新手,作品展览馆可能会启发你 Etoys能够用来做些什么好玩的东西。

如果你已经写了十年程序,作品展览馆可能会带给你极大的冲击,也许会打破你对编程的看法,让你看到传统编程是如此逼仄以及非人性化。

作品展览馆中有一些引导性的教程,也很适合作为入门材料。这些引导性的教程十分有趣,它们本身就是Etoys的一个程序。教程和普通的程序并没有本质区别!

事实上Etoys的界面本身都是可编程的Etoys程序!

吃自己的狗粮在这里被贯彻得很彻底。

不吃自己的狗粮才是值得警惕的: 工具的创造团队号称构建了好用的编程/创作工具,然而他们自己,平时既不用它编程,连演讲的PPT都宁可选择系统内置的传统工具,而不用自己构建的创作工具来创作,却偏偏说它能够帮助那些孩子们去编程和创作。

这可能是编程教育领域一个黑色幽默。

与Scratch互操作

我在Etoys游荡、探索时,发现百宝箱里有一个有趣的东西: Scratch Client:

从提示上可以看出,它是Scratch Networking Protocol Client, 乍看起来似乎可以利用这个client与Scratch互操作!

Google一番, 找到在Scratch中开启该服务的操作: Remote Sensor Connections,但Scratch2.0已经改变了这个协议。

于是我们只好在Scratch1.4中做测试。一切顺利:

原理上,scratch会在42001端口运行服务,该服务实现了Scratch Networking Protocol. 而Etoys则通过Scratch Client连接42001。

服务的Python实现

在下载Scratch1.4时,我猜测这个服务是个简单的socket服务。于是我简单跑了一个socket server。试图观察Etoys的Scratch Client与外部服务的通信细节。

# https://python3-cookbook.readthedocs.io/zh_CN/latest/c11/p02_creating_tcp_server.html#id2
from socketserver import BaseRequestHandler, TCPServer
# Etoys scratch client
class EchoHandler(BaseRequestHandler):
    def handle(self):
        print('Got connection from', self.client_address)
        while True:
            msg = self.request.recv(1024)
            print(f'msg:${msg}')
            if not msg:
                break
            self.request.send(msg)

if __name__ == '__main__':
    serv = TCPServer(('',42001), EchoHandler)
    serv.serve_forever()

果不其然,猜测是对的:

由此可以推断,Scratch Networking Protocol是一个简易的socket server。如果对这个协议有更多的兴趣,可以参考官方文档.

此外社区也有一些围绕这个协议的开源项目:

Physical Etoys

五一和@王松碰了个面,聊天、吃海鲜、结对编程、逛neverland,我在给他展示Etoys时,他也极为震惊和兴奋。他提出一个很有趣的问题: Etoys是否支持硬件编程,诸如与机器人交互,如果可以他很想试试。我说可能不行,估计得使用Pharo

今早想起codedojo的志愿者@Cyke此前在Anki开发者社区私信我一个有趣的项目。后来我随手把它贴在了FutureOfCoding社区: Physical Etoys

我重新找到这个项目。发现它在机器人教育这块已经走得很远。

Physical Etoys的思路和codelab adapter颇为相似,甚至也支持插件,当然用的是smalltalk/tile来写的。

于是我决定近期对Etoys进行深入挖掘和研究,以便从中吸收可以应用在codelab adapter中的养分。

Etoys与codelab adapter

Scratch 2.0之后就不再支持Scratch Networking Protocol,Scratch 3.0当然也不支持该协议,。于是它们都无法与Etoys交互。

我相信至今为止,Etoys依然是编程领域最为惊人的项目之一,最好的用户创作工具之一(Alan Kay的看法),也很可能是最好的教育项目之一,甚至可能没有之一。但Scratch3.0很可能是少儿编程教育的未来。为了让Etoys能够与Scratch3.0交互,CodeLab可能会构建一个Etoys插件,让Etoys能够与Scratch3.0互操作。

Etoys内置在OLPC中,在十几个第三世界国家使用。这些国家缺乏合格的教育者,基于建构主义的Etoys允许在没有教育者的情况下被使用。用户自发探索和构成社区。

考虑到Etoys影响广泛,但目前它的技术更新却相对缓慢。CodeLab近期准备构建一个codelab adapter插件,将AI、IoT、开源硬件的能力赋予Etoys。

codelab adapter在设计上,一直在认真回应一个基础问题: 互操作性《Mindstorms》和Etoys让我相信我们关注了一个正确的方向。互操作性可能是基于建构主义的学习系统最重要的特性之一。

参考




Fork me on GitHub