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

推荐订阅源

Vercel News
Vercel News
Recorded Future
Recorded Future
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The GitHub Blog
The GitHub Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Google DeepMind News
Google DeepMind News
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Microsoft Azure Blog
Microsoft Azure Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
M
MIT News - Artificial intelligence
云风的 BLOG
云风的 BLOG
Y
Y Combinator Blog
N
News | PayPal Newsroom
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Help Net Security
Help Net Security
博客园 - Franky
SecWiki News
SecWiki News
Recent Announcements
Recent Announcements
T
Troy Hunt's Blog
The Register - Security
The Register - Security
The Last Watchdog
The Last Watchdog
Webroot Blog
Webroot Blog
S
Security Affairs
博客园 - 司徒正美
S
Schneier on Security
I
InfoQ
博客园_首页
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Threat Research - Cisco Blogs
Forbes - Security
Forbes - Security
腾讯CDC
N
Netflix TechBlog - Medium
N
News and Events Feed by Topic
Cloudbric
Cloudbric
T
The Exploit Database - CXSecurity.com
P
Proofpoint News Feed
A
About on SuperTechFans
Engineering at Meta
Engineering at Meta
Recent Commits to openclaw:main
Recent Commits to openclaw:main
B
Blog
V
Vulnerabilities – Threatpost
C
Check Point Blog
Google DeepMind News
Google DeepMind News
Google Online Security Blog
Google Online Security Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Hacker News - Newest:
Hacker News - Newest: "LLM"
C
Cisco Blogs
Schneier on Security
Schneier on Security
O
OpenAI News
K
Kaspersky official blog

夜行人

回家路上 第一期的直播演示项目 震动检测器 正能量 在线参观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开发笔记 创业二三事
Scratch CDN镜像笔记
种瓜 · 2019-12-02 · via 夜行人

文章目录

前言

2019.11.23 CodeLab在国家图书馆做了个活动,接下来会陆续开展活动,随着用户的加入,为了方便大家的交流,CodeLab的编程社区正提上日程。

我们希望构建类似scratch.mit.edu的社区。所以复用了Scratch开放的前端项目:scratch-www, 并构建了与之兼容的后端(参考Scratch3.0技术分析之后端API(第0篇))。

Scratch全球社区有海量(1亿+)优秀项目, 我们希望国内用户能方便地访问它。于是为Scratch做了CDN。

本文对CDN镜像实施时遇到的问题过个笔记。

ps: 这个思路是通用的,也是做笔记的原因。

思路

使用七牛的镜像机制来做CDN。

问题笔记

静态资源

音乐加载

Scratch将它自身的静态资源放在CDN上,诸如:

  • 角色图片
  • 背景图片
  • 音乐

角色图片 和 背景图片 会一次加载所有内容,所以打开一次,便会触发所有资源的CDN镜像机制。

音乐则不然,属于lazy load,需要逐个点击/悬停才加载,这带来了一个问题: 许多资源在第一次使用时,要等待镜像的完成,十分缓慢。

思路

有许多种解决方案,我想到3种:

  1. 修改scratch静态资源的加载机制,不使用CDN,直接从自己的服务器拉取静态资源。
  2. 与第一种方法类似,将静态资源放在自己的服务器上,但使用CDN镜像它。
  3. 镜像官方静态资源,使用自动化机制逐个镜像静态资源

为了兼容Scratch和考虑后期的升级,我决定采用第三种方案.

思路很简单: 使用正则表达式找出所有资源的标识(形如5cb46ddd903fc2c9976ff881df9273c9.wav), 写一个脚本逐个请求。

动手

思路清楚之后,很容易执行。

我们在build好的代码里,寻找音乐资源的标识(形如5cb46ddd903fc2c9976ff881df9273c9.wav)。

其实音乐资源在开发源码中更好找,我之所以在build之后的代码里找,是为了长期的兼容性,md5标识可能会改变。

简单搜索一下,可以发现数据都在lib.min.js文件里。

正则表达式

使用正则表达式找到它:

ack -ho '(?<=md5:")[a-z\d]+?.wav(?=")' lib.min.js

前边这个正则表达式,有2处可能不好理解: (?<=md5:")(?=") , 在正则中叫前瞻和后顾,实际上是把目标字符串的上下文信息加入进来,我们的目标字符串(md5:"5cb46ddd903fc2c9976ff881df9273c9.wav")以md5:"开头,以"结尾.

如果你觉得这个不好读,可以使用以下更易读的版本,当然也更啰嗦些:

ack -ho 'md5:"[a-z\d]+?.wav"' lib.min.js | ack -ho '[a-z\d]+?.wav'

一共找到792项,我们将其存到文件里

ack -ho '(?<=md5:")[a-z\d]+?.wav(?=")' lib.min.js > /tmp/music_list.txt

之后使用Python来触发对这些静态资源的镜像。

Python脚本

Python脚本的职责是,构建出音乐资源镜像地址,对其访问(HTTP OPTION/GET), 镜像地址形如:https://cdn.assets.scratch.mit.edu/internalapi/asset/5cb46ddd903fc2c9976ff881df9273c9.wav/get/

cdn.assets.scratch.mit.edu替换为镜像仓库的域名。

使用循环依次将5cb46ddd903fc2c9976ff881df9273c9.wav替换为/tmp/music_list.txt中的文件标识即可。

之后使用aiohttp client去并发请求这些资源,

当然你也可以使用任何自己喜欢的语言和http库,httpie和curl都很方便。注意设置超时时间,镜像可能需要时间,我们不必拿到请求结果,只需触发请求即可。

至此,完成上述工作。