edyang

我干了什么 究竟拿了时间换了什么
技术分享时间线软件开发、设备接入、视觉与运维实践

Android 开发起步:JDK、SDK、Gradle 与 IDE 的关系

安装 Android Studio 后,工程仍可能因为 SDK 或 Gradle 版本不匹配而无法构建。

安装 Android Studio 后,工程仍可能因为 SDK 或 Gradle 版本不匹配而无法构建。各工具承担不同任务。 本文使用Android Studio 2.3、JDK 8、Gradle 3.3、Android Gradle Plugin 2.3.0,compileSdk 25。演示应用使用 Java 与传统 Activity,不使用 AndroidX、后来的 Jetpack 组...

前端深入研究:组件接口要表达状态与事件

组件把界面拆小,却可能通过共享变量重新绑在一起。

组件把界面拆小,却可能通过共享变量重新绑在一起。复用的关键是明确输入和输出。 本文使用浏览器 JavaScript、HTML 与局部演示数据。前端复杂性常来自状态与异步关系,而不是组件数量。本文把服务器业务事实、页面查询条件和用户临时编辑分别表达,避免多个界面位置互相覆盖。 1. 从现象推到机制 列表组件接收数据与加载状态,向上报告选择或翻页意图,不直接猜测全局业务。加载中、空结果与加...

前端深入研究:新布局能力要配合回退方案

新浏览器里布局漂亮,旧浏览器却堆成一列,说明技术选型需要覆盖真实使用环境。

新浏览器里布局漂亮,旧浏览器却堆成一列,说明技术选型需要覆盖真实使用环境。 本文使用浏览器 JavaScript、HTML 与局部演示数据。前端复杂性常来自状态与异步关系,而不是组件数量。本文把服务器业务事实、页面查询条件和用户临时编辑分别表达,避免多个界面位置互相覆盖。 1. 从现象推到机制 渐进增强先提供可读可用的基础结构,再在支持时增加布局能力。CSS Grid(网格布局)与 F...

前端深入研究:编辑草稿与服务器事实分开保存

用户正在修改表单时,后台刷新覆盖了输入,通常说明临时草稿与已保存记录共用了同一状态。

用户正在修改表单时,后台刷新覆盖了输入,通常说明临时草稿与已保存记录共用了同一状态。 本文使用浏览器 JavaScript、HTML 与局部演示数据。前端复杂性常来自状态与异步关系,而不是组件数量。本文把服务器业务事实、页面查询条件和用户临时编辑分别表达,避免多个界面位置互相覆盖。 1. 从现象推到机制 服务器记录是已确认事实,编辑模型是尚未提交的意图。进入编辑时复制必要字段并保存版本...

深入 PostgreSQL:窗口函数保留明细又计算排名

既想显示每条订单,又想看到该客户最近一单,普通聚合会把明细折叠掉。

既想显示每条订单,又想看到该客户最近一单,普通聚合会把明细折叠掉。窗口函数提供另一种表达。 本文使用PostgreSQL 9.6 与独立演示库。PostgreSQL(关系数据库)的类型、事务和执行计划需要按版本理解。本文使用九点六时期已经存在的能力,不把后续大版本的 SQL 语法提前放入示例。 1. 从现象推到机制 窗口函数在分区内计算,同时保留每行。row_number 与 rank...

深入 PostgreSQL:递归 CTE 查询组织树

查询一个部门及其所有下级,固定写几层 join 无法覆盖不确定深度。

查询一个部门及其所有下级,固定写几层 join 无法覆盖不确定深度。递归查询可以表达层级扩展。 本文使用PostgreSQL 9.6 与独立演示库。PostgreSQL(关系数据库)的类型、事务和执行计划需要按版本理解。本文使用九点六时期已经存在的能力,不把后续大版本的 SQL 语法提前放入示例。 1. 从现象推到机制 递归 CTE(公共表表达式)先提供起始集合,再反复从上一轮结果扩展...

深入 PostgreSQL:JSONB 与关系字段各放什么

把所有字段塞进 JSONB 很灵活,也可能让约束、统计和查询变得难以管理。

把所有字段塞进 JSONB 很灵活,也可能让约束、统计和查询变得难以管理。 本文使用PostgreSQL 9.6 与独立演示库。PostgreSQL(关系数据库)的类型、事务和执行计划需要按版本理解。本文使用九点六时期已经存在的能力,不把后续大版本的 SQL 语法提前放入示例。 1. 从现象推到机制 稳定身份、关联与关键约束适合显式列,变化较多的扩展属性可以放 JSONB。JSONB ...

深入 PostgreSQL:B-tree、GIN 与 BRIN 怎样选择

数据库支持多种索引,并不表示新类型就更适合当前查询。

数据库支持多种索引,并不表示新类型就更适合当前查询。要从操作符和数据分布开始。 本文使用PostgreSQL 9.6 与独立演示库。PostgreSQL(关系数据库)的类型、事务和执行计划需要按版本理解。本文使用九点六时期已经存在的能力,不把后续大版本的 SQL 语法提前放入示例。 1. 从现象推到机制 B-tree 常用于等值、范围与排序,GIN 适合某些多值包含检索,BRIN 利用...

深入 PostgreSQL:EXPLAIN ANALYZE 会真正执行语句

执行计划能解释访问路径,但带 ANALYZE 的检查不是纯静态查看。

执行计划能解释访问路径,但带 ANALYZE 的检查不是纯静态查看。 本文使用PostgreSQL 9.6 与独立演示库。PostgreSQL(关系数据库)的类型、事务和执行计划需要按版本理解。本文使用九点六时期已经存在的能力,不把后续大版本的 SQL 语法提前放入示例。 1. 从现象推到机制 EXPLAIN 给出规划估计,ANALYZE 执行并收集实际行数和时间。循环次数需要与每次平...

深入 PostgreSQL:更新为什么会留下旧版本

表频繁更新后体积增长,不一定是数据行数增加。

表频繁更新后体积增长,不一定是数据行数增加。MVCC 需要保留对其他事务仍可见的旧版本。 本文使用PostgreSQL 9.6 与独立演示库。PostgreSQL(关系数据库)的类型、事务和执行计划需要按版本理解。本文使用九点六时期已经存在的能力,不把后续大版本的 SQL 语法提前放入示例。 1. 从现象推到机制 MVCC(多版本并发控制)通过行版本支持并发可见性,旧版本在不再需要后才...