摸鱼精选第 10 期

1. Linux 下跨语言调用 C++实践

不同的开发语言适合不同的领域,例如 Python 适合做数据分析,C++适合做系统的底层开发,假如它们需要用到相同功能的基础组件,组件使用多种语言分别开发的话,不仅增加了开发和维护成本,而且不能确保多种语言间在处理效果上是一致的。本文以美团搜索实际场景下的案例,讲述在 Linux 系统下跨语言调用的实践,即开发一次 C++语言的组件,其他语言通过跨语言调用技术调用 C++组件。

本文提到在 Java 调用 C 库时,除了 JNI,还有 开源的 JNA 工具,这个 会比 JNI 少很多类型转换的操作,更加简便。

2. 编程语言是如何实现并发的之操作系统篇

本篇从操作系统的视角介绍编程语言实现并发的底层概念,包括进程调度与 I/O 模型等

3. 下一代响应式 Web 设计:组件驱动式 Web 设计

响应式 Web 设计已经将 Web 带到了今天人们所能接触到的每一个连接的屏幕上。Web 设计师和创意开发者用创造性的思维、大胆的想法和某种无畏的精神探索、测试和迭代他们的想法,使在线体验更有吸引力、更容易访问和更智能,推动了设计方法的发展。就好比这里所提到的 组件驱动式 Web 设计。

组件驱动式 Web 设计的到来或者说 CSS 容器查询、作用域样式、级联层控制等特性的出现,这些先进的特性使我们有机会从页面布局、全局样式和用户样式中孤立组件样式,从而实现更具弹性的响应式设计。这意味着你现在可以使用基于页面的媒体查询设计宏观布局,包括多屏或折叠屏的细微差异;同时使用基于容器查询给组件设计微观上布局,并添加基于用户偏好的媒体查询,来实现基于用户的独特偏好和需求的定制化体验。

这就是下一代响应式 Web 设计,也就是 组件驱动式 Web 设计(或开发)。它结合了宏观布局和微观布局,最重要的是,也将用户定制化和尺寸外形都考虑到了。

4. Surprising Weak-Ref Implementations: Swift, Obj-C, C++, Rust, and Vale

本文作者探究了不同编程语言的弱引用实现方法。

5. How to build a universal design system Using React Native for Web, Tailwind CSS and Dripsy

本文探讨了如何建立一种通用设计系统,能够用于 web、app 等平台,技术栈是 React、React Native、Tailwind,有点类似 Ant Design 之类的组件库。

6. DeepL Api 设计中的欺骗战术

本文作者逆向了 DeepL 的 Windows 客户端,发现了 DeepL 认证的秘密。

  1. DeepL 通过修改 ts 时间戳参数,在毫秒部分进行简单运算,导致与真实时间有几毫秒的误差,然后服务器通过反推简单运算判断是否伪造请求。
  2. 还有一个更隐藏的方法,通过在字符串 json 的某个字段后面增加空格校验,别人用工具格式化的时候一般会忽略掉这个空格,如下:
let req = req.replace(
    "\"method\":\"",
    if (self.id + 3) % 13 == 0 || (self.id + 5) % 29 == 0 {
        "\"method\" : \""
    } else {
        "\"method\": \""
    },
);

防止接口滥用,既可以用很高深的 ssl 协商之类的算法,也可以利用人心理的弱点。

7. git worktree 用法

Git 2015 年出的新功能 worktree,可以在一个 repo 下创建多个目录,每个目录都是完整的代码。这个功能的好处是可以同时打开两个分支,比如你通过

git worktree add feature1

创建了一个feature1的 worktree,那么在根目录下就有一个名为feature1的新目录,里面就是源分支的全部文件,这个源分支可以通过-b参数指定,默认就是你当前的分支。这时你就可以用 IDE 同时打开两个目录进行开发了,互不干扰。你在feature1的目录提交的代码会自动合并到源分支的。

8. 图形化的设计模式讲解

让设计模式不再枯燥、难以理解的教程。

9. 基于 C++ 的 Android 协程设计

本文作者通过在 C++ 封装协程的实现,用 JNI 接口提供给 Java 使用。最后比较了 C++20、libco、ucontext 等协程库。

10. MVI 范式在 Jetpack Compose 上的应用

MVI 是 Google 在推出 Jetpack Compose 之后推荐的架构模式,更加强调单项数据流模式, 有点类似 MVVM + Redux。

11. 得物 App 直播复杂页面架构实践

得物 Android App 的重构经验,组件化设计,Google MVVM 模式的实践。

12. 自制渲染引擎及在客户端应用

本文简单的介绍了基于 OpenGL 自制渲染模块的方法用于某些 UIKit 和 Core Graphics 不好实现的场景,模仿 Three.js 的 api 设计,用 JSON 作为采样点的描述文件,解析 JSON 生成顶点属性数组。

13. iOS / Android 音视频工程示例

这是一个系统文章,包含 iOS / Android 音视频的操作介绍,流程包括采集、封装、编码、解码、解封装、渲染等。

14. Go 编程语言与环境:万字长文复盘导致 Go 语言成功的那些设计决策

Go 核心团队对 10 多年来 Go 演化发展的复盘,深入分析了那些对 Go 的成功最具决定性的设计哲学与决策。

15. 从业务视角来聊一聊为什么我们需要 RxJS?

本文概述了 RxJS 的一些常见用法和使用场景,并和 Redux 进行了比较。

16. 优化在 SwiftUI List 中显示大数据集的响应效率

本文提到 List 组件在使用 id 修饰符的时候会提前实例化对象,导致在大 List 的会卡顿:

List {
    ForEach(items) { item in
        ItemRow(item: item)
            // 给每行记录视图设置标识
            .id(item.objectID)
    }
}

尽量不要使用id修饰符。