- 博客(173)
- 收藏
- 关注
原创 Camera2API笔记
在CameraCaptureSession中,可以连续且不等待拍摄完成就发送新CaptureRequest。但要注意避免请求过多超出流水线容量,导致帧丢弃或延迟。可以通过CaptureCallback监听状态,控制请求频率。通过CameraCharacteristics的REQUEST_PIPELINE_MAX_DEPTH可以得到流水线容量。
2025-07-10 22:57:45
872
原创 使用协程简化异步资源获取操作
Kotlin为这两种场景提供了解决方案:使用挂起函数简化一次性资源获取,使用流处理持续事件通知。关于事件流处理方案详见《将listener转换为事件流》一文。本文聚焦第一种场景:如何简化异步资源获取操作。
2025-07-08 23:36:08
746
原创 Java类加载器getResource行为简单分析
ClassLoader是一个抽象类,实际使用的是URLClassLoader。URLClassPath内部使用3个加载器:Loader、FileLoader和JarLoader,分别从远程(HTTP)、本地目录和jar包中加载资源。JarFile派生自ZipFile,加载jar文件项的代码是。如果没有目录,返回null。检查一番,原来是classpath中只有jar包,没有目录。因此当classpath中只有jar包时,时,JarLoader无法加载资源。,而如果classpath包含目录,
2025-07-04 22:30:12
663
原创 ViewModel是EventFlow-State映射
ViewModel负责组装界面状态State。引发State变换的原因有很多,比如用户点击某个按钮,一次网络请求受到应答,一次本地数据库查询返回结果等等。因此ViewModel是根据各种事件生成State的对象,换句话说,是一个从多个事件流到状态的映射。用图来表示就是用户交互 ───▶ 事件流 ───┤ ││ViewModel├───▶ UI 状态 ───▶ 渲染UI数据变更 ───▶ 数据流 ───┤ │。
2025-07-01 20:23:46
689
原创 将listener转换为事件流
考虑到listener/callback实际上是一种事件通知/触发机制,我们可以利用Kotlin中处理事件的工具:流,将listener/callback转换成事件流。从listener/callback到事件流,代码完成了三种范式转换。其次是从深层嵌套回调转换为平面流式操作。定义事件之后,可以使用callbackFlow将listener转换为事件流。┌───操作1───►操作2───►操作3───►完成┐。│ │ │ 回调2 │ │ │。│ │ │ │回调3│ │ │ │。
2025-06-27 21:29:47
924
原创 结构化并发
任务树让父任务与子任务的关联更加紧密。消息和和控制可以在树中传递,父任务可以感知子任务成功或失败,也可以控制子任务取消或退出。因此可以保证父任务结束(成功、失败或取消)时,全部子任务都已结束。让并发代码不再是一坨面条。按照启动关系,任务构成一棵树。显然这棵树将产生了一个清晰的边界,将并发任务和外部代码分隔开。结构化并发就是使用任务树约束并发任务边界,将变法任务变成像函数、类一样整体结构,作为构建复杂程序的基础。但并发程序很难开发,由于缺少边界约束,很难有效管理内部子任务,同时和外部代码产生清晰边界。
2025-06-25 21:25:32
270
原创 我对续体传递风格CPS的理解
显然fcps表达的就是“先对x应用f运算,再对结果应用另一个运算”,这里的k就代表“另一个运算”。观察h(x)和h2(x)的定义可以发现,h(x)的步骤是固定的、静态的。通过调整fcps的第二个参数,可以很容易的构造出“先应用f运算,再应用另一个运算”的函数。假设有两个运算y = f(x)和m = g(n),我们构造一个复杂运算h(x):首先对参数x应用f运算,再对结果应用g运算。我们可以从更抽象的层次理解h(x):首先对参数x应用f运算,再对结果应用另一个运算。
2025-06-25 01:12:32
149
原创 值类:Kotlin中的零成本抽象
仔细观察UserName和Email两个类,都是把一个String对象和一些专属操作绑定起来,构成一个新类型。用户名不能是空白,不能是"null",也不能包含"@"。值对象(Value Object)是领域驱动设计中不可变的概念片段,值类是Kotlin零开销的类型安全包装特性。如果当值对象只需封装单个值时,值类是最佳实现方式。Kotlin的值类(Value Class)是一种强大的类型安全工具,允许开发者创建语义明确的类型,并保持运行时零成本。但在运行时,值类不会产生额外性能损耗,可以做到零成本抽象。
2025-06-17 19:54:30
730
原创 从MVC到MVVM:从过程式走向声明式
以前学习MVVM模式时写了一篇。近来重读,有了一些新想法。从MVC模式到MVVM模式的变化,体现出在技术推动下,界面构造方法从传统的过程式向声明式演进。从“在坐标(x,y)到(a,b)之间绘制一个红色矩形”到“坐标(x,y)到(a,b)之间存在一个红色矩形”。我们先简单了解一下从MVC到MVVM的演进过程。图1 从MVC到MVVM的演进过程从上图可以看出,业务发展引发界面复杂度超出过程式构造方法适用范围,为演进提供了驱动力和必要性。而数据绑定等自动化技术的突破为演进提供了路径和可行性。
2025-06-14 18:23:35
1109
原创 CSS入门
本文档面向的读者是有一点HTML基础,希望学习CSS的开发者。文档内容分为基础、布局、进阶三部分。基础部分介绍CSS中常用和通用的元素样式、选择器以及盒模型。布局部分介绍如何在HTML中排列元素。进阶部分介绍CSS的高级内容,包括动画、函数、响应式设计等。文档附录包含了一些速查表,方便读者查阅。CSS是Cascading Style Sheets的缩写,翻译为层叠样式表。CSS是一种样式表语言,用来描述HTML文档的表现方式,如字体、色彩、背景色等等。我们先从一段简单的CSS代码开始。
2025-05-24 23:00:39
985
原创 CSS手动布局
让元素浮动到上级元素盒子的左侧或右侧。浮动元素会被移出文档流,然后向左(右)平移,直到触碰盒子边界,或另一个浮动元素。其他内容环绕浮动元素排列,填充浮动元素右(左)侧和下方的空间。/* 相对(正常布局)位置。/* 视口固定位置。CSS支持单独设置某个元素的布局,最主要的属性是。也可以改变元素的位置。代码1 手动布局属性。
2025-05-07 20:45:57
388
原创 CSS分栏布局
浏览器使用这个值计算栏的数量,如果还有额外的空间,浏览器会增加栏的实际宽度。分栏布局将区域划分为若干垂直的栏,子元素放置到栏中,填满一个后再填充下一个。/* 内容优先填充靠左侧的栏。/* 内容平均分配到每个栏中。如果希望分栏容器中的某个子元素跨越所有的栏,可以将子元素的。属性,将内容优先填满靠左侧的栏,或者平均分配到每个栏中。代码3 column-rule-*
2025-05-06 23:01:16
590
原创 CSS网格布局
minmax(min-content, 100px) /* min-content是不换行、不溢出时网格项需要的最小空间。minmax(100px, max-content) /* max-content是不换行、不截断时网格项自然占据的空间。minmax(auto, ...) /* 等价于 minmax(min-content, ...) */代码4 网格项的grid-column-start/grid-column-end属性可以调整放置位置或横跨多列。/* 网格项横跨3个行轨道。
2025-05-06 22:21:35
642
原创 正常流布局
元素分为块元素和行内元素两类。块元素独占一行,行内元素则是在行中,在前面元素的右边排列。如果一行排满了,行内元素继续从第二行开始排列。布局决定了元素的排列方式。正常布局是怎么排列元素的呢?各行从上到下,行内从左到右。,是一种特殊的行内元素,它像其他行内元素一样,在行内排列,同时像块元素一样可以设置高度、宽度和边距。如果希望为行内元素设置高度、宽度或垂直内外边距要怎么做呢?可以使用行内块元素。的元素,不产生换行,高度和宽度由元素内容决定,不能设置垂直方向的内边距和外边距。的元素,独占一行,可以设置高度。
2025-04-28 18:09:55
361
原创 弹性盒子布局
新的一行(列)默认排列在原行(列)的下方(右侧),这个方向叫做交叉轴方向。如果希望元素在水平或垂直方向依次排列,并且能够根据容器尺寸自动调整元素位置和大小,可以使用弹性盒子布局。,它就成为flex容器,它的下级元素成为flex元素。主轴方向由flex容器的。“排不下”有五种处理方法:一是收缩元素适配主轴长度,二是换行,三是溢出,四是截断,五是使用滚动轴。讲完了主轴上元素的排列方式,现在介绍元素在交叉轴方向的对齐方式,它由flex容器的。如果某个flex元素希望拥有独立的对齐方式,可以使用flex元素的。
2025-04-28 18:09:19
703
原创 CSS基础
CSS是Cascading Style Sheets的缩写,翻译为层叠样式表。CSS是一种样式表语言,用来描述HTML文档的表现方式,如字体、色彩、背景色等等。我们先从一段简单的CSS代码开始。代码1 CSS示例p {color: red;这段代码的效果是将HTML文档中全部<p>元素里的文本设置成红色。大括号里面的是CSS规则,格式为属性: 属性值;每条规则占一行,以半角分号结尾。属性和值之间以半角冒号分割,属性和值的前后可以添加空格。color表示文字色彩属性,red。
2025-04-24 21:16:50
1041
原创 AIP代码生成器——标准化接口开发智能工具
AIP代码生成器遵循Google API Improvement Proposal(AIP)设计准则,为RESTful API开发提供标准化方法和批量方法模板,快速生成符合AIP的代码框架。支持多种语言和框架。
2025-04-24 10:57:25
921
原创 Vue3笔记
/script></script><template>模型实际上是双向的ref。每个v-model只包含一个简单的状态,并非整个组件整体状态的聚合。组件的整体状态由多个v-model组成。
2025-04-18 20:49:18
321
1
原创 AIP目录
AIP是总结了谷歌API设计决策的设计文档,它也为其他人提供了用文档记录API设计规则和实践的框架和系统。专注于开发灵活API的设计文档。
2025-04-18 19:13:38
306
原创 AIP-236 策略预览
策略是一种资源,它提供规则,许可或拒绝对其他资源的访问。通常,策略的结果可以计算为特定的结果集合。未经充分验证就变更策略,可能会产生意外后果,严重影响客户的整体基础设施配置。为了安全的更新资源,利用策略推出API测试这些变更,是有好处的。预览是策略资源的安全推出机制,让客户能够在变更生效之前,验证所提交的变更对生产流量的影响。针对流量的策略评估结果会记录下来,为客户提供数据,测试变更是否正确。防火墙策略是适合预览的典型场景。使用流量评估新配置,观察哪些IP会被放行或拦截。
2025-04-18 19:12:22
1044
原创 AIP-217 不可达资源
有时,用户可能会请求一系列资源,而其中某些资源暂时不可用。最典型的场景是。例如用户可能请求返回多个上级位置的资源,但其中某个位置暂时不可达。此时仍然需要向用户提供所有可用资源,同时告诉客户有部分缺失。
2025-04-11 23:46:11
935
原创 AIP-216 状态
许多API资源都带有“状态”概念:通常指资源在其生命周期中的位置。例如,虚拟机可能处于配置中、可用、关闭中,或者其他几种可能的情况之一。作业或查询可能处于准备运行、运行中、已完成等。
2025-04-07 20:20:40
601
原创 AIP-215 API特定proto
API通常使用API特定proto定义,偶尔依赖通用组件。保持API相互隔离可以避免版本问题和客户端库打包问题。
2025-04-06 22:24:55
349
原创 AIP-214 资源过期
客户经常希望设置某个资源或资源属性不再可用或生效的时间(例如轮转安全密钥)。目前,我们建议客户设定一个具体的“过期时间”,保存在域。然而,如果客户希望设定相对时间偏移量,而非具体的过期时间时,这会增加额外负担。此外,现实中存在“生存时间”(通常缩写为TTL)概念,在使用自动生成的客户端库时,这个域的典型格式(以秒为单位的整数)可能导致较差的用户体验。
2025-04-06 20:58:36
278
原创 AIP-213 通用组件
根据规定,除使用“通用组件”包之外,API必须是独立的。通用组件包是给多个API使用的。如果可以安全在多个API之间共享同一个消息,通用组件可以让客户端更容易API交互。例如关于特定概念的客户端代码只需要编写一次,一个API的应答中的消息可以直接用于另一个API的请求,无需低效的复制。当让这种优势也存在重要的限制和局限性,不应轻易尝试。请注意,即使组件所属领域是通用的,组件也可能是组织特定的。
2025-04-04 13:56:49
601
原创 AIP-211 授权检查
大多数操作,无论读或写,都需要授权:获得执行用户请求的操作的权限。此外,向未授权用户提供了多少信息也非常重要,因为信息泄露也是安全问题。
2025-04-02 22:08:37
282
原创 AIP-210 Unicode
省流在我们的API中,“字符”指的是“Unicode码点”。在API文档(例如API参考文档、博客文章、营销文档、计费说明等)中,“字符”必须定义为Unicode码点。
2025-04-01 21:22:45
1021
原创 AIP-203 域行为文档
在定义protocol buffer中的域时,按惯例要向用户解释域行为的某些方面(例如域是必需的还是可选的)。此外,让其他工具理解域行为也很有用(例如优化客户端库签名)。
2025-03-31 21:12:35
674
原创 AIP-194 自动重发配置
远程过程调用可能失败。此时,调用远程过程的客户端需要知道能否安全的重新执行操作。如果多个API使用统一的错误码,客户端可以妥善处理失败。
2025-03-30 11:37:28
270
原创 AIP-193 错误
有效的错误沟通是设计简单直观API的重要组成部分。返回标准错误应答的服务,让API客户端可以构建集中式通用错误处理逻辑。通用逻辑简化了API客户端应用程序,消除了繁琐的零散错误处理代码的需求。
2025-03-30 01:20:31
742
原创 AIP-192 文档
文档是API设计中最关键的方面之一。API用户无法深入到实现细节去更好地理解API。通常,API界面定义和相关文档是用户仅有的东西。因此文档必须尽量清晰、完整、明确。
2025-03-27 19:17:25
585
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人