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

推荐订阅源

N
News and Events Feed by Topic
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
大猫的无限游戏
大猫的无限游戏
T
Tailwind CSS Blog
S
SegmentFault 最新的问题
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
C
Cisco Blogs
博客园 - 叶小钗
P
Privacy International News Feed
Jina AI
Jina AI
Apple Machine Learning Research
Apple Machine Learning Research
T
Threatpost
IT之家
IT之家
博客园 - 聂微东
Know Your Adversary
Know Your Adversary
Help Net Security
Help Net Security
罗磊的独立博客
I
Intezer
S
Schneier on Security
博客园_首页
C
CERT Recently Published Vulnerability Notes
雷峰网
雷峰网
Cisco Talos Blog
Cisco Talos Blog
宝玉的分享
宝玉的分享
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Webroot Blog
Webroot Blog
TaoSecurity Blog
TaoSecurity Blog
MyScale Blog
MyScale Blog
P
Privacy & Cybersecurity Law Blog
T
The Exploit Database - CXSecurity.com
PCI Perspectives
PCI Perspectives
Security Latest
Security Latest
H
Heimdal Security Blog
S
Secure Thoughts
Hacker News: Ask HN
Hacker News: Ask HN
Y
Y Combinator Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Microsoft Security Blog
Microsoft Security Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
SecWiki News
SecWiki News
The GitHub Blog
The GitHub Blog
A
Arctic Wolf
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
T
Threat Research - Cisco Blogs
Engineering at Meta
Engineering at Meta
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

夜行人

回家路上 第一期的直播演示项目 震动检测器 正能量 在线参观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开发笔记 创业二三事
一篇用动态媒介写的文章
种瓜 · 2022-08-25 · via 夜行人

文章目录

如果嵌入和查看方法提供得足够好,作为媒介本身看待的计算机可以是所有其他媒介。 – Alan Kay

前言

近期重读 An Introduction to Morphic 的时候,发现 Morphic 中用于自动布局的类 AlignmentMorph 已经被弃用:

顺着类注释中的提示, 准备学习一下 layoutPolicy , 在 Squeak wiki 里读了几篇与此相关的词条:

也跟着做了不少例子:

Morphic 新的布局系统有点像 CSS 里的 Flexbox,但早了 20 多年。

在 Morphic 布局系统话题下,好几篇 Squeak wiki 词条都提到了 Ted kaehler 和 Andreas Raab 写的《Control Your Submorphs》一文。

由于 Ted kaehler 和 Andreas Raab 都是 Squeak 的核心开发者,所以我想好好读读这篇文章,看看能否学到一些关于布局的强大想法。

我最近在 Smalltalk 里弄懂了许多过去一知半解的概念,越来越喜欢和信任这个学习环境。在 Squeak 里,好像什么都能学会。正如 Alan Kay 承诺的那样,强大的系统能够增强学习者,帮助 Ta 更好的理解和学习复杂系统。我过去接触 HTML/CSS 时在排版布局问题上碰了很多壁,以至一直不愿再折腾它们。这次有点蠢蠢欲动,指不定 Squeak 能够帮助我,就像它曾帮助我理解了许多过去觉得困难的事情。

遇到困难

可是,始终无法在互联网上搜到《Control Your Submorphs》的电子版。

重新阅读 MorphLayoutArticle词条,发现它是一篇动态文章:

The dynamic essay MorphLayoutArticle describes how layout works in Morphic.

或许 Ted kaehler 和 Andreas Raab 完全在 Squeak 里写作,压根没有发布 PDF 和 HTML 版本!

这篇文章的格式是: MorphLayoutArticle.pr

.pr 是 Squeak/Etoys 项目文件的后缀名。 MorphLayoutArticle 提到 它在 Squeak 3.2 中加载良好。但若要将其加载到 Squeak 3.8.1 中,需要参考这些说明

Squeak 3.2 发行于 2002 年, Squeak 3.8 则发行于 2005 年, 年代如此久远,在瞬息万变的计算机世界,仿佛远古时代的文物, 它们在我的 MacOS 12.3.1(M1) 都运行不了。

救星

突然想到之前换电脑之后,无法运行 Etoys 的经历,后来的解决方案是使用 SqueakJS 虚拟机来运行 Etoys 镜像(image) (Etoys Lively)。

SqueakJS 是由 Vanessa Freudenberg 使用纯 JavaScript 编写的 Squeak 虚拟机。

我想起 SqueakJS 适用于许多与 OpenSmalltalk 兼容的 image!指不定就包括 Squeak 3.2 或 Squeak 3.8。 果真,Squeak 3.8 可用!

加载动态文章

MorphLayoutArticle.pr 是在 Squeak 3.2 里写的,为了将其加载到 Squeak 3.8 里,需要 做些修改

1
2
3
4
5
6
 SmartRefStream>>#initKnownRenames

        renamed
            at: #AlansTextPlusMorph put: #TextPlusMorph;
            at: #FlasherMorph put: #Flasher;
            yourself

通过将 SmartRefStream 类的#initKnownRenames 方法,修改为上述内容. 然后将 MorphLayoutArticle.pr 文件拖入系统, 便可成功加载。

开始阅读

这篇文章篇幅很小,读来十份轻松。

不同于 Squeak wiki 里的文字和图片描述,这篇短文里,穿插了 6 个交互式的案例,作者每次在阐述一个控制布局的关键概念(参数)后,就让读者通过操控作者精心准备的交互案例,来把握这些参数。

这是我第一次感受到布局的乐趣,它是如此清晰、浅显而直观!短短几分钟,就毫不费劲地掌握了它们,我心里十份清楚,我并不只是理解了作者通过静态媒介(文字)所表达的东西,要比这更多。通过按照自己的意志操控这些布局元素,我仿佛变成了元素本身,亲身参与到了布局之中!

这就像 Seymour Papert 在《Mindstorms》里提到的童年的齿轮。

在 Squeak 上做实验

在最新的 Squeak 上(Squeak 6.0)。 “对 submorphs 的控制” 基本都可以在 morph 的 menu > layout 菜单里完成。 我的工作习惯是:

  1. 心智模型: 布局是 owner 的职责(控制submorphs)
  2. 从 table layout 开始 (正如动态文章里建议的)
  3. 指定 layoutInset(submorphs 与 owner 的间隔) 和 cellInset (submorph 之间的间隔)。
  4. 指定 wrap 方式(溢出时,如何换行来包住)
  5. 在 menu 中复制手动完成的布局属性,方便之后复用(复用代码如下)
1
2
3
4
5
6
7
"copy from layout menu"
aLayoutProperties := (TableLayoutProperties new cellInset: (8@18); layoutInset: (34@28); wrapDirection: #leftToRight; yourself). 

m := Morph new.
m openInWorld.
m layoutProperties: aLayoutProperties.
m layoutPolicy: TableLayout new.

以下是一个演示视频

解释控制参数

  • layoutInset: 规定了 owner morph 的右下角以及左上角的间距。
  • listDirection 定义排列的 “主要” 方向。 如果没有足够的空间让排列适合单个行或列, 则wrapDirection 定义排列的 “辅助” 方向, WrapDirection 还可以具有特殊值 #none,表示这种排列将是一维的并且永远不会换行。以下是 listDirectionwrapDirection 的影响:

  • morph 具有控制其如何更改自身大小的属性(hResizing:vResizing:)

尾声

遗憾的是,计算机并没有像 Alan Kay 所期待的那样,作为一种动态媒介流行起来。今天计算机里边的内容主要是对旧媒介的模仿,它模仿书籍、电视、电影… 人们在计算机里写作,就像过去用纸笔写作。像 《Control Your Submorphs》 这样帮助读者更好地理解复杂事物的文章不仅不多见,而且连阅读它的工具都日渐式微,不易寻得。

近年情况有所好转,Jupyter 这几年在科学界很流行,尤其是物理学、生物学和数据科学/AI 领域,人们甚至直接在里头写论文 – 一篇可运行的论文,一篇读者可以与作者的论点进行交互的论文。

但相比于 Squeak,Jupyter 才刚刚起步,即使是 20 年前 的Squeak 也走得更远。

差距是愿景上的。

附录

导出文件到本地

当你在 SqueakJS 中导出文件时(诸如save morph in file),文件只是被存储在了浏览器页面的 IndexedDB 里(这篇论文里有讨论 SqueakJS 的存储机制)。你需要 到这儿下载到本地

参考