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

推荐订阅源

IT之家
IT之家
The GitHub Blog
The GitHub Blog
美团技术团队
Security Latest
Security Latest
The Cloudflare Blog
D
DataBreaches.Net
Microsoft Azure Blog
Microsoft Azure Blog
V
Visual Studio Blog
宝玉的分享
宝玉的分享
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
The Exploit Database - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
P
Proofpoint News Feed
V
Vulnerabilities – Threatpost
Schneier on Security
Schneier on Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
Security Affairs
腾讯CDC
H
Hacker News: Front Page
Microsoft Security Blog
Microsoft Security Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - 三生石上(FineUI控件)
C
Check Point Blog
S
Security @ Cisco Blogs
Google DeepMind News
Google DeepMind News
Cisco Talos Blog
Cisco Talos Blog
云风的 BLOG
云风的 BLOG
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Security Archives - TechRepublic
Security Archives - TechRepublic
I
InfoQ
量子位
Apple Machine Learning Research
Apple Machine Learning Research
AWS News Blog
AWS News Blog
TaoSecurity Blog
TaoSecurity Blog
月光博客
月光博客
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
aimingoo的专栏
aimingoo的专栏
S
SegmentFault 最新的问题
A
Arctic Wolf
Hacker News: Ask HN
Hacker News: Ask HN
D
Docker
Hugging Face - Blog
Hugging Face - Blog
I
Intezer
雷峰网
雷峰网
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
SecWiki News
SecWiki News
N
News and Events Feed by Topic

夜行人

回家路上 第一期的直播演示项目 震动检测器 正能量 在线参观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.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与结对编程
Scratch3技术分析之静态资源API(第2篇)
种瓜 · 2019-01-15 · via 夜行人

文章目录

在这篇文章中,我们来重点关注Scratch静态资源相关的API, 了解这些资源是如何被存储以及如何被加载的。

关注的静态资源包括:

  • Scratch project 中的静态资源
    • 角色
    • 舞台
    • 声音
  • 项目缩略图

Scratch project 中的静态资源

角色

我们来上传一个角色,看看发生了什么。

可以看到,当我们从本地加载图片时,并没有发生忘了交互,并未上传到后台,只是从本地加载到浏览器。

当我们点击立即保存之后,发生了如下请求:

POST https://assets.scratch.mit.edu/945f73f489fda5a87ad5203f457e436a.png

细节为:

后台返回:

{"status":"ok","content-name":"945f73f489fda5a87ad5203f457e436a.png"}

项目的内部数据(我们在Scratch3技术分析之创作平台API(第1篇)定义了这个概念)可以看出,新上传的角色的一些信息。

从名称可以看出,945f73f489fda5a87ad5203f457e436a是角色图片的md5,我们在shell中验证一下:

1
2
➜  Rectangle.iconset md5 icon_512x512.png
MD5 (icon_512x512.png) = 945f73f489fda5a87ad5203f457e436a

果不其然。

角色的md5值,由if (generateId) this.assetId = md5(data);生成。

至此我们就理解了角色是如何被存储的。在用户点击立即保存的时候,角色会被上传到后台。这个行为发生在项目json数据(PUT https://projects.scratch.mit.edu/279586215)更新之前, 所以json数据中的角色只需要保存有md5值就行了(钩子/uri)。

md5

我们顺便提一下md5,使用md5来作为文件名(同时也是文件签名)的一个好处是,相同的文件在服务器只需要存储一份。考虑到scratch有大量的改编项目,这个做法将大大解决资源,既节约了网络资源(如果本地有缓存就不必加载),同时节约了服务器的存储资源。

舞台、音乐

如你所猜,舞台、音乐和角色是完全一样的做法。

项目缩略图

最后我们来关注一下项目缩略图.

上篇文章已经分析了缩略图是如何上传的: 在点击立即保存之后,会触发:

PUT https://scratch.mit.edu/internalapi/project/thumbnail/279586215/set/

细节为:

其中279586215是项目id。

获取缩略图

scratch使用CDN分发静态资源。我们知道,使用CDN常常会牵扯到缓存策略问题。注入更新了图片,用户却迟迟看不到更新。

角色、舞台、音乐使用md5存储,所以不用担心缓存问题(更新前后的md5不同)。但缩略图似乎并没有使用md5. 那么缩略图如何处理缓存问题呢?

我们进入项目主页:https://scratch.mit.edu/projects/279586215/,看看加载缩略图的细节:

GET https://api.scratch.mit.edu/projects/279586215

可以看到图片有多种规格:

1
2
3
4
5
6
7
https://cdn2.scratch.mit.edu/get_image/project/279586215_480x360.png
https://cdn2.scratch.mit.edu/get_image/project/279586215_100x80.png?v=1547520628
https://cdn2.scratch.mit.edu/get_image/project/279586215_135x102.png?v=1547520628
https://cdn2.scratch.mit.edu/get_image/project/279586215_144x108.png?v=1547520628
https://cdn2.scratch.mit.edu/get_image/project/279586215_200x200.png?v=1547520628
https://cdn2.scratch.mit.edu/get_image/project/279586215_216x163.png?v=1547520628
https://cdn2.scratch.mit.edu/get_image/project/279586215_282x218.png?v=1547520628

如果你熟悉图片存储平台的API,你可能容易猜到279586215_480x360.png中的480x360 是这些平台系统的API。七牛云就提供了类似的。

我进入创作平台对舞台做了调整,发现https://cdn2.scratch.mit.edu/get_image/project/279586215_480x360.png立即变更。从url来看,它利用了cdn,又没有用md5,能做到立即更新,很赞!这应该是CDN平台提供的功能。

我们对scratch使用的CDN平台感到好奇,决定做一番探索:

1
2
➜  githubblog ping cdn2.scratch.mit.edu
PING d.sni.global.fastly.net (151.101.110.133): 56 data bytes

他们在使用fastly

最后我们来看下请求缩略图的细节: GET https://cdn2.scratch.mit.edu/get_image/project/279586215_480x360.png

缓存策略值得我们学习,尤其关注一下etag