惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
A
About on SuperTechFans
The Last Watchdog
The Last Watchdog
A
Arctic Wolf
S
Schneier on Security
Cisco Talos Blog
Cisco Talos Blog
K
Kaspersky official blog
Spread Privacy
Spread Privacy
The Hacker News
The Hacker News
P
Proofpoint News Feed
Attack and Defense Labs
Attack and Defense Labs
NISL@THU
NISL@THU
AWS News Blog
AWS News Blog
Schneier on Security
Schneier on Security
TaoSecurity Blog
TaoSecurity Blog
H
Hacker News: Front Page
L
LangChain Blog
Y
Y Combinator Blog
T
Tenable Blog
Microsoft Security Blog
Microsoft Security Blog
L
Lohrmann on Cybersecurity
量子位
N
News and Events Feed by Topic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
The GitHub Blog
The GitHub Blog
云风的 BLOG
云风的 BLOG
W
WeLiveSecurity
Martin Fowler
Martin Fowler
Cloudbric
Cloudbric
S
SegmentFault 最新的问题
Project Zero
Project Zero
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园 - 叶小钗
V
Vulnerabilities – Threatpost
小众软件
小众软件
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
腾讯CDC
博客园 - 聂微东
F
Full Disclosure
WordPress大学
WordPress大学
PCI Perspectives
PCI Perspectives
P
Privacy International News Feed
M
MIT News - Artificial intelligence
Forbes - Security
Forbes - Security
Blog — PlanetScale
Blog — PlanetScale
T
The Blog of Author Tim Ferriss
Webroot Blog
Webroot Blog
S
Security @ Cisco Blogs
Last Week in AI
Last Week in AI

夜行人

回家路上 第一期的直播演示项目 震动检测器 正能量 在线参观CodeLab Neverland 发布 CodeLab Adapter 3.3.1 DynamicTable 之 纸糊方向盘 CodeLab DynamicTable: 一个可实施的技术方案 CodeLab Insight 发布 Alpha 版 情人节 Home Assistant 周报 && IoT 周报 (02) Joplin: 关注隐私的 Evernote 开源替代软件 浏览器的未来与 Web 传感器 Home Assistant 周报 && IoT 周报 (01) 百宝箱(01) 论自由 介绍 WebThings Home Assistant 周报 && iot 周报 (00) 百宝箱(00) 毛姆读书心得 传世之作 周末徒步 CodeLab Adapter ❤️ Jupyter/Python 航班 躲雨 夏令营途中 [译]思想--作为一种技术 The future of coding 美国之行 三门问题的程序模拟 从Python转向Pharo https://blog.just4fun.site/post/iot/iot-open-source-projects/ Python异步编程笔记 https://blog.just4fun.site/post/iot/iot-open-source-hardware-community/ 万物积木化开发者社区 CodeLab ❤️ Blender Scratch3技术分析之云变量 API(第7篇) [译]对管道(Pipes)的偏爱 [译]提出正确的问题比得到正确答案更重要 蓝牙设备与Scratch3.0 创建你的第一个Scratch3.0 Extension Scratch3技术分析之项目内部数据(第6篇) Scratch3技术分析之社区 API(第5篇) Scratch3技术分析之User API(第4篇) Scratch3技术分析之项目主页API(第3篇) Scratch3技术分析之静态资源API(第2篇) Scratch3.0、micro:bit与Windows7 https://blog.just4fun.site/post/iot/zerynth-vs-micropython/ 核聚变、方所与半宅空间 可视化编程为何是个糟糕的主意 codelab.club周末聚会 关于codelab.club '下一件大事'是一个房间 Hungry Robot - Eat everything 编程作为一种思考方式 今日简史 史蒂夫·乔布斯传 罗素自选文集 https://blog.just4fun.site/post/edx/tianjin-scratch-ai/ https://blog.just4fun.site/post/edx/richie-cms-openedx/ 徒步武功山 WebUSB与micro:bit 积木化编程与3D场景 夜宿武功山顶 scratch3-adapter接入优必选Alpha系列机器人 https://blog.just4fun.site/post/edx/video-migration-note/ scratch3-adapter重构笔记 https://blog.just4fun.site/post/edx/edx-community-members/ 两种硬件编程风格的比较 使用micro:bit自制PPT翻页笔 柏拉图对话集 scratch3.0 + micro:bit 七月电影放映计划 非营利组织的管理 Screenly--用树莓派让任何屏幕变为可编程的数字标牌 以最佳实践开始你的Django项目 micro:bit与事件驱动 为Scratch3.0设计的插件系统(上篇) OCR应用一例 近两年读过的一些好书 blockly开发之使用python驱动浏览器中的turtle(2) 牛顿新传 文学理论入门 逻辑的引擎 人生的意义 blockly开发之生成并运行js代码(1) blockly开发之hello world(0) micro:bit使用笔记 神器之Termux https://blog.just4fun.site/post/iot/micropython-notes/ Cozmo what is this Scratch的前世今生 下段旅程 我行在远方 爆裂 途中杂记 https://blog.just4fun.site/post/edx/open-edx-startup/ cozmo系列之入门 - 有性格且可编程的机器人 PaperWeekly开发笔记 创业二三事
Squeak 与 MicroBlocks 互操作
种瓜 · 2022-09-05 · via 夜行人

前言

Smalltalk 爱好者们期待已久的 Making Smalltalk 在上周五举行。Lounsen 提议在来一场 After Party。

我想在 After Party 上分享近期使用 Squeak 做的项目: Squeak 中的 dotPack 模拟器

为了让分享更加充实,我做了些增强,使这个 dotPack 模拟器可以跟 dotPack 实物互动。我喜欢在 MicroBlocks 里为硬件写固件,它是我迄今为止最喜欢的物理计算平台。

打算把分享的话题定为 《Squeak 与 MicroBlocks 的互操作》,这样一来,我不仅能够在分享时讨论 Smalltalk,还能讨论 Smalltalk 的精神后裔: MicroBlocks,它们共享了大量的系统特性和个人计算愿景,值得一提的是 MicroBlocks 的创始者 John Maloney 也是 Squeak 创始团队的成员,John Maloney 在 Squeak 的贡献包括: Smalltalk-to-C 翻译器(可移植性的关键)、第一个 Squeak VM (Mac)、Morphic 用户界面框架…

原定 2 小时的 After Party,持续了 3 个小时,虽然大家都是 Smalltalk 爱好者,依然被 Smalltalk 的灵活和强大所震惊,我们几乎是一边讨论,一边实时编程,在系统中探索碰撞出的新想法,而且几乎总是能够实现突如其来的灵感。

开始

思路

制作出色且可扩展的系统的关键在于设计模块的通信方式,而不是设计其内部属性和行为应该是什么 – Alan Kay

最初打算在 Squeak 中使用串口(serial)来跟 dotPack 硬件通信,后来发现 Squeak 中的串口插件(MacOS)年久失修。于是打算采用网络来通信(dotPack 使用 ESP32,所以能够支持网络)。

两个版本

前后设计了两个版本的通信机制:

  • 基于 HTTP 的互操作
  • 基于 UDP 的互操作

相关的源码都已经放到 Github: DotPack

只需把 DotPack.st 下载下来拖到 Squeak 桌面(确保后缀是.st, MacOS 会把后缀名改为 txt,最好在命令行里检查一下),然后选择 fileIn entire file 即可载入相应的 DotPack 包。

你在 browser 里应该能看到 DotPack。

基于 HTTP 的互操作

服务端

HTTP 是一个服务端和客户端模型,在我们的案例里,MicroBlocks 中的程序充当服务端,Squeak 充当客户端。

我们先来看下 MicroBlocks 里的程序:

.

前边说到 MicroBlocks 是 Smalltalk 的精神后裔,它具有大量 Smalltalk 的典型特征, 诸如 “活性(liveness)“的环境: 你可以实时与环境交互,每一块积木都是活的,点击它将实时得到反馈: 你将看到积木的功能, 如果你用过 Scratch,你对此应该十分熟悉,这种方式支持你以建构主义的方式自由探索系统,整个系统是一个活的文档,它通过响应你来帮助你理解它。一旦你接触过这种编程体验,就再也无法忍受大多数编程环境。硬件领域的编程环境更是令人难以忍受。

计算机应该像乐器,它应该对用户的操作作出即时且一致的响应。想象一下,在吹出一个音符和听到它之间的一秒钟的延迟是多么荒谬!

我喜欢的一个演示是以交互的方式应答 HTTP 请求。你可以先点击 HTTP 服务器请求 积木,对用户的请求做一番探索,等你玩够了,再决定 回应xx至HTTP请求, 对客户端来说一切正常,Ta 完全不知道有一个人手动处理了他的请求!这是一个真正的"人工"智能服务器!

客户端

最初使用 Squeak 内置的 HTTP 客户端(WebClient)跟 MicroBlocks http server 通信,结果遇到一个问题, 我把问题反馈给了 John, John 给出了精彩分析, 记录在此: https://bitbucket.org/john_maloney/smallvm/issues/287/http-server-can-not-work-with-squeak

这个问题通信的双方(Squeak 和 MicroBlocks)都有责任,MicroBlocks 的责任多一些,John 说近期会修复。

后来我用 curl 暂时绕开了这个问题。

为了在 Squeak 中使用 curl, 需要 Squeak 与宿主系统的互操作,让 Squeak 能够调用 shell 命令。CommandShell 是很棒的选择。这是我的意料之外的收获,当我决定用 Squeak 时,我几乎做好了放弃在 Unix/Linux 下积累的经验(我从大二开始用 Linux,差不多十年的经验)。现在这些经验突然又能够在 Squeak 里使用了, Unix/Linux 里有大量实用小工具,一口气都丢了真有些可惜。更加意料之外的是, CommandShell 支持 Unix 管道(pipe), 而且能够用 Squeak 的 inspect 增强它! 这样一来,我不仅没有丢掉 Unix/Linux 工具,还能够随时使用 Squeak 增强它们!

为了在 Squeak 里调用 shell 命令,需要现在 squeak 安装 CommandShell:

1
2
MCMcmUpdater updateFromRepository: 'http://www.squeaksource.com/OSProcess'
MCMcmUpdater updateFromRepository: 'http://www.squeaksource.com/CommandShell'

Squeak 客户端中相关代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
pack := DotPack new.
pack stopStepping.
pack clear.

pack withDevice: true deviceAddress: #[192 168 1 8]. "IP Address"
pack sendMessageWith: 'HTTP'. "default"
pack clear.

pack x: 1 y:1 color: Color red.
1 to: 16 do: [:i | pack x: i y:i color: Color red].
1 to: 16 do: [:i | pack x: i y:i color: Color blue].

以下是一个演示视频:

通过在 browser 中探索 DotPack 类,你应该能很快弄懂它的工作方式。

我把视频分享给 John,John 觉得很有意思。他建议我试试他最近设计的 UDP 积木,代码将更简单,响应速度也会更快。

基于 UDP 的互操作

这个版本是在分享开始前的半个小时前做的。我突然想在 16x16 的粗糙"屏幕"上构建出鼠标的幻觉

为了获得足够好的实时性,我决定试一试 UDP。

服务端

MicroBlocks 中的程序

客户端

Squeak 客户端中相关代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
pack := DotPack new.
pack stopStepping.
pack clear.

pack withDevice: true deviceAddress: #[192 168 1 8]. "IP Address"
pack sendMessageWith: 'UDP'.
pack clear.

pack x: 1 y:1 color: Color red.
1 to: 16 do: [:i | pack x: i y:i color: Color red].
1 to: 16 do: [:i | pack x: i y:i color: Color blue].

附录

Python client & MicroBlocks UDP server

以下是使用 Python UDP 客户端 与MicroBlocks 的 UDP 服务交互的例子, 运行以下代码将把 dotPack (8,8) 位置的 LED 点亮为红色。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# https://wiki.python.org/moin/UdpCommunication
import socket

ip = "192.168.1.8"
port = 5000
x,y = (8,8)
r,g,b = (255,0,0)
color = r<<16|g<<8|b
message = "setpixel,{},{},{}".format(x,y,color)
sock = socket.socket(socket.AF_INET, # Internet
                     socket.SOCK_DGRAM) # UDP
sock.sendto(message.encode(), (ip, port))

netcat(nc) client & MicroBlocks UDP server

echo ‘setpixel,8,8,255’ | nc -u 192.168.1.8 5000 -w0