2023 年最新 Mac M1 十分钟搞定 tensorflow 环境
最近 github 上找了一个 Keras 的项目想做个有意思的个人项目,但是一想到 python 版本问题和 python 虚拟环境问题,一直挺抵触开动的。
昨天突然想换换脑子,实践起来,没想到借助一个美国教授的安装流程和 chatgpt 的帮助,项目半个小时就跑起来了。
用 javascript 写一个队列
用合成大西瓜来学习 matter.js API
Vue2 与 Vue3 的区别
vue3 之 Watch WatchEffect 的使用和区别
Flutter源码解析(三)Element
通过『 Flutter 源码解析(一)- Widget 』的介绍,我们知道 Widget 本质上是 UI 的配置数据 (静态、不可变),Element 则是通过 Widget 生成的『实例』,两者间的关系就像是 json 与 object。
同一份配置 (Widget) 可以生成多个实例 (Element),这些实例可能会被安插在树上不同的位置。
UI 的层级结构在 Element 间形成一棵真实存在的树「Element Tree」,Element 有 2 个主要职责:
- 根据 UI (「Widget Tree」) 的变化来维护「Element Tree」,包括:节点的插入、更新、删除、移动等;
- Widget 与 RenderObject 间的协调者。
Flutter源码解析(二)BuildOwner
BuildOwner
在 Element 状态管理上起到重要作用:
- 在 UI 更新过程中跟踪、管理需要 rebuild 的 Element (「dirty elements」);
- 在有「dirty elements」时,及时通知引擎,以便在下一帧安排上对「dirty elements」的 rebuild,从而去刷新 UI;
- 管理处于 “inactive” 状态的 Element。
这是我们遇到的第一个 Owner,后面还有 PipeOwner。
整棵「Element Tree」共享同一个BuildOwner
实例 (全局的),在 Element 挂载过程中由 parent 传递给 child element。
1 |
|
Flutter源码解析(一)Widget
Everything’s a widget.
在开发 Flutter 应用过程中,接触最多的无疑就是Widget
,是『描述』 Flutter UI 的基本单元,通过Widget
可以做到:
- 描述 UI 的层级结构 (通过
Widget
嵌套); - 定制 UI 的具体样式 (如:
font
、color
等); - 指导 UI 的布局过程 (如:
padding
、center
等); - …
Google 在设计Widget
时,还赋予它一些鲜明的特点:
基于 timestamp 和 nonce 的防止重放攻击方案
以前总是通过 timestamp 来防止重放攻击,但是这样并不能保证每次请求都是一次性的。今天看到了一篇文章介绍的通过 nonce(Number used once)来保证一次有效,感觉两者结合一下,就能达到一个非常好的效果了。