ArchLinux 休眠到交换文件

ArchLinux 交换文件 休眠

Linux 使用交换分区来休眠,首先冻结所有进程并申请足够的交换内存(位于磁盘),把当前内存都存进去。 然后下次启动时,initramfs 会直接加载上次休眠时的内存状态,跳过内核的 init 过程。 因此首先需要有足够大的交换分区或交换文件;再把内核指向到休眠的分区上;最后再配置 initramfs 让它加载休眠的内存文件。 官方文档请参考 Power_management/Suspend_and_hibernate#Hibernation, 本文细述如何休眠到交换文件,并对其中一些概念和细节进行了解释。

在本文讨论的范围内, 挂起(suspend)是指冻结当前的进程,保留它们的内存,并把几乎除了内存之外的设备都断电。 休眠(hibernate)是指把挂起后的内存写入磁盘并完全关机。 锁定(lock)则只是显示一个模态的全屏软件输入正确的密码才能退出。

ArchLinux 下的屏幕背光恢复

ArchLinux Mac systemd 屏幕背光

最近发现我的 ArchLinux 每次解锁之后屏幕背光都会设置为最大,今晚终于有时间把它修复了。 写这篇文章介绍在 ArchLinux 下开机(Boot)和解锁(Resume)时,如何恢复此前的屏幕背光。 先解释背光控制的机制,再给如何入配置和调试。 本文以 MacBook Pro 2013 Late 为例(intel 显卡,xf86-video-intel 驱动)。

本文只解决背光恢复的问题,如果你的 Fn 功能键无法调整背光,请参考 在 MacBookPro 上安装 ArchLinux 中的“显示器/键盘背光”一节。

龙胆虎威中的四加仑水迷题(Die Hard 3)

线性组合 最大公约数 数论 离散数学

龙胆虎威 3 中的一个场景:在泉水旁有两个瓶子,容量分别是 5 加仑和 3 加仑。 Bruce 需要在 5 分钟内精确地得到 4 加仑水来停止定时器,差一盎司都会引起爆炸。 本文对这个问题进行推广,分别讨论有解的条件解的构造两个问题,再给出判断是否有解的简单方法:能否被公约数整除。

如果目标水量 c 是 a 和 b 的线性组合就有解,否则无解。具体地:

  1. 得到的水量一定是 a 和 b 的线性组合。即如果 c 不是 a 和 b 的线性组合就无解。
  2. 重复地从 a 倒入 b,就可以得到 a 和 b 的所有线性组合。即只要是线性组合就有解。

c 是否是 a 和 b 的线性组合,取决于 c 能否被 gcd(a,b) 整除:

  1. gcd(a,b) 是 a 和 b 最小的正的线性组合。
  2. gcd(a,b) 能整除 c 等价于 c 是 a 和 b 的线性组合。

为方便讨论,本文所有线性组合都指整数线性组合,所有数字 x、y、m、n 都表示整数。

TypeScript 来做依赖注入的限制

TypeScript 依赖注入 装饰器

依赖注入 是编写可测试/复用代码的关键。 在 TypeScript 中所有对象、属性和方法都有类型,可以大幅简化人工标注的代码,这让很多人重新考虑在 JavaScript 中实现依赖注入。 比如 Angular2 以后的 DI 实现。 本文用来讨论 TypeScript 仍然无法解决哪些问题,以及相关技术可能存在的风险。

首先简单过一下基于 TypeScript 做依赖注入的步骤。 ES6 中提出了Reflect 用来访问和操作对象对象属性。 而 Reflect Metadata 提案 让 Reflect API 可以提供对类型的元数据进行操作的方法。 这样就可以在 tsc 编译时产出注册元数据的代码,在运行时就可以读到编译时的类型了,这一类型就提供了依赖注入的 Token。 运行时的注入器根据函数签名的类型拿到依赖关系,再根据类型对应的 Provider 来创建依赖树。

ArchLinux 键盘映射:交换 CapsLock 和 Ctrl

ArchLinux hwdb scancode keycode Xmodmap MacBook

笔者在几个月前 切换到 Linux 下干活,使用 Xmodmap 交换掉 CapsLock 和 Ctrl。 但 Xmodmap 只能改键无法区分是哪个键盘硬件设备(偏偏 HHKB 的 Caps 本来就在左边),而且只在 X11 下好使(Virtual Console 下不起作用)。 于是近日研究了下 scancode 到 keycode 映射,通过 udev 匹配和配置特定的输入设备。 Harttle 的环境是 Macbook 下的 ArchLinux,下面的命令以此为例,但其他环境也应该类似。

注意:本文只讨论如何重新定义个别键的 keysym 的问题。更改键盘布局请参考 kbdmap,更改快捷键请使用 xbindkeys 或 i3 bindsym 或你的桌面系统配置。

AMD 模块化最佳实践

AMD JavaScript 异步 模块化

AMD 是 RequireJS 给出的模块加载方案。 支持递归依赖解析、模块异步加载,夜兼容 CommonJS 可以在 Node.js 里用。 虽然目前已经不再流行,很多站点更倾向于编写 ES Modules 并直接 Webpack 打包, 但 AMD 是完整的,兼容性良好的,支持动态加载的模块化方案,在大型的、独立部署的、异构的项目中仍然有一席之地。 所以还是决定写一篇关于 AMD 最佳实践的文章,致敬老式的 Old School 的 Web 开发。

TL;DR

  • 源文件中,模块应该匿名编写。区分好“使用 AMD 语法”和“模块化”,充分利用 AMD 又不被套牢。
  • 一个模块对应一个文件。每个模块是一个单独的源文件,每个文件只包含一个模块定义。
  • 避免手动写依赖列表,可以通过编译工具自动生成。
  • 独立维护的工具模块,应当通过打包编译隐藏其内部结构。

Angular DI 是怎么工作的?

TypeScript 依赖注入 反射 装饰器

这又是一篇短命的(short-lived)描述当下技术框架的博客文章。 DI(依赖注入、Dependency injection)是一种设计模式,常用来提升代码的可复用性、健壮性和可测试性。 DI 在前端的流行很大程度上归功于它在 Angular1.x 中的应用。 Angular 2 以后借助 TypeScript 的类型分析,可以干脆省去了 Angular1.x 中冗余的依赖声明。 本文用来解释这个魔法是怎么工作的,以及相关的标准化 Proposal 和实现 Trick。

对于不熟悉依赖注入的同学可以参考我的另外两篇文章 什么时候应该使用依赖注入JavaScript 依赖注入实现, 或者 Wikipedia: DI。这里还有一篇 Angular 的教程:https://angular.io/guide/dependency-injection

上一页 下一页