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

推荐订阅源

F
Full Disclosure
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
The GitHub Blog
The GitHub Blog
WordPress大学
WordPress大学
博客园 - 三生石上(FineUI控件)
D
Docker
K
Kaspersky official blog
Latest news
Latest news
P
Privacy International News Feed
雷峰网
雷峰网
S
Security Affairs
博客园 - 司徒正美
博客园 - Franky
C
CERT Recently Published Vulnerability Notes
Cisco Talos Blog
Cisco Talos Blog
AWS News Blog
AWS News Blog
C
Check Point Blog
T
Tailwind CSS Blog
T
Tenable Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Threat Research - Cisco Blogs
The Last Watchdog
The Last Watchdog
Google Online Security Blog
Google Online Security Blog
L
Lohrmann on Cybersecurity
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
B
Blog
The Hacker News
The Hacker News
V
V2EX
L
LINUX DO - 最新话题
云风的 BLOG
云风的 BLOG
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
W
WeLiveSecurity
Know Your Adversary
Know Your Adversary
P
Proofpoint News Feed
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Microsoft Security Blog
Microsoft Security Blog
S
Securelist
V2EX - 技术
V2EX - 技术
博客园 - 叶小钗
The Cloudflare Blog
小众软件
小众软件
Recent Announcements
Recent Announcements
Microsoft Azure Blog
Microsoft Azure Blog
L
LangChain Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Hacker News: Ask HN
Hacker News: Ask HN
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The Register - Security
The Register - Security

夜行人

回家路上 第一期的直播演示项目 震动检测器 正能量 在线参观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开发笔记 创业二三事
blockly与结对编程
2017-06-27 · via 夜行人

文章目录

引言

前些日子google刚发布了blockly1.0,社区人气一路上升,我集中时间逛了下开发者社区(developer forum),发现好些有意思的开源项目,有不少我手边的工作都用得到,能省下许多的时间,逛开发者社区常有意外的惊喜,比刷朋友圈有趣多了

下文我们将提到的socketblockly便来自社区

结对编程

按维基百科的说法

结对编程(英语:Pair programming)是一种敏捷软件开发的方法,两个程序员在一个计算机上共同工作。一个人输入代码,而另一个人审查他输入的每一行代码。输入代码的人称作驾驶员,审查代码的人称作观察员

我个人很喜欢结对编程。甚至远程协作的时候,我也喜欢和朋友一起登陆到服务器,一起进入同个tmux session(你可能更喜欢wemux,如果你爱折腾甚至可以试试CoVim),手边打开微信语音,编程相关的内容,大家的屏幕是彼此同步的,输入也完全同步,沟通效率远胜于任何截图(甚至好过一起聚在同个屏幕面前)。对服务器的重要的操作彼此监督,不容易出错。在工作交接的时候,这种协作方式效率也极高。甚至在公司,我也喜欢以这种方式和同事协作,一群人挤在一个屏幕面前,很不自在。共享屏幕并不需要在同个物理空间

我将结对编程视为协同工作的一种,协同工作就宽泛得多了,我比较关注在线实时的协同工具(对远程办公有极大好感:) ),能够对此提供支持的工具有很多,诸如google文档石墨文档togetherjs

这些能用来进行协同工作的工具,也适合用来做远程教学(手把手),当然我们可能需要区分学生和老师的角色,这个是细节问题

在blockly中我们如何实现结对编程呢?(对blockly不熟悉的小伙伴可以参考blockly入门与介绍)

这是个很有趣的话题,乍看之下blocks是UI,似乎比协同文本更难

我们来看看socketblockly是怎么做的

思路

socketblockly的解决方案简单粗暴,简单来说,就是观察workspace中是否有变化,如果有变化,就把blocks转变为xml(序列化之后变成普通的文本同步问题)通知出去,其他用户在本地做反序列化,用新的blocks更新本地的workspace,如此就实现了编辑的同步(也就是协同)

简而言之,如果你意识到blocks与xml是可以相互转化的,那么这件事就是一个普通的(文本)协同编辑问题

源码分析

因为有实时性的要求,主要使用了socket.io来做实时通信

server端

server端非常简单,一目了然

1
2
3
  socket.on('new xml', (xml) => {
        socket.broadcast.emit('rebuild workspace', xml)
  })

监听新消息(new xml),并将其广播给其他客户端

client端

client端也干净利索

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
var workspace = Blockly.inject('blocklyDiv', workspaceOptions)

function updateWorkspace (event) {
  if (event.type == Blockly.Events.UI || event.type == Blockly.Events.CREATE) return

  let xml = Blockly.Xml.workspaceToDom(workspace)
  let xml_text = Blockly.Xml.domToText(xml)

  socket.emit('new xml', xml_text)
}

workspace.addChangeListener(updateWorkspace)

socket.on('rebuild workspace', function (xml) {
	Blockly.Events.disable()
	workspace.clear()
	var xmlData = Blockly.Xml.textToDom(xml)
	Blockly.Xml.domToWorkspace(xmlData, workspace)
	Blockly.Events.enable()
})

基本就是前头思路的代码实现,workspace中的blocks转为xml通过:let xml = Blockly.Xml.workspaceToDom(workspace)

而xml还原为界面元素(blocks)通过:var xmlData = Blockly.Xml.textToDom(xml); Blockly.Xml.domToWorkspace(xmlData, workspace)

用户的编辑事件通过:workspace.addChangeListener(updateWorkspace) 捕获,并回调updateWorkspace函数.

关于blockly的事件机制可以参考:blockly events

演示

你可以在demo里自己尝试(开2个浏览器)

todo

建议将socketblockly视为一个最小原型,可以改进的地方还有很多,诸如:

  • 加上房间的概念(类似togetherjs),以支持多对用户的协作,社区里有人尝试blockly-realtime-collab
  • 加上togetherjs,使协同工作者能以代码之外的方式沟通,而不必离开当前界面(类似我同时使用tmux和微信语音)

文章作者 种瓜

上次更新 2017-06-27