#46 Win11 必须的 TPM 模块是个啥?
开发者 Windows11 TPM 2021-09-18看新闻说 Windows 11 必须要 TPM 模块才能正常运行,虚拟机和物理机都一样。
我也是第一次听说这个东西。
coding in a complicated world
看新闻说 Windows 11 必须要 TPM 模块才能正常运行,虚拟机和物理机都一样。
我也是第一次听说这个东西。
这篇文章讲到了绝对值计算的问题:One does not simply calculate the absolute value。
三个特殊值:
class Test {
public static double abs(double value) {
if (value < 0) {
return -value;
}
return value;
}
public static void main(String[] args) {
double x = -0.0;
if (1 / abs(x) < 0) {
System.out.println("oops");
}
}
}
if 中加上条件:value == -0.0 是行不通的,因为 +0.0 == -0.0,可以使用 JDK 中的 Double.compare:
public static double abs(double value) {
if (value < 0 || Double.compare(value, -0.0) == 0) {
return -value;
}
return value;
}
这样确实有效,不过效率上可能会受到影响,abs 的复杂性就上了一个台阶。
public static int compare(double d1, double d2) {
if (d1 < d2)
return -1; // Neither val is NaN, thisVal is smaller
if (d1 > d2)
return 1; // Neither val is NaN, thisVal is larger
// Cannot use doubleToRawLongBits because of possibility of NaNs.
long thisBits = Double.doubleToLongBits(d1);
long anotherBits = Double.doubleToLongBits(d2);
return (thisBits == anotherBits ? 0 : // Values are equal
(thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)
1)); // (0.0, -0.0) or (NaN, !NaN)
}
参考 JDK 中的实现,重写 abs:
private static final long MINUS_ZERO_LONG_BITS = Double.doubleToLongBits(-0.0);
public static double abs(double value) {
if (value < 0 || Double.doubleToLongBits(value) == MINUS_ZERO_LONG_BITS) {
return -value;
}
return value;
}
新的问题:NaN 的处理,处理方法:把 doubleToLongBits 改成 doubleToRawLongBits。
private static final long MINUS_ZERO_LONG_BITS = Double.doubleToRawLongBits(-0.0);
public static double abs(double value) {
if (value < 0 || Double.doubleToRawLongBits(value) == MINUS_ZERO_LONG_BITS) {
return -value;
}
return value;
}
JVM 的 JIT 会替换这次调用为底层的 CPU 寄存器操作,效率非常可观。
PS:如果可以省去这个分支的判断逻辑,JVM 可以给我们更好的性能优化?
We know that branches are bad. If the CPU branch predictor guesses incorrectly, they can be very expensive.
doubleToRawLongBits)会导致浮点数寄存器转换到通用集成器。Although there are rumors saying that this call may still lead to a transfer from a floating-point register to a general-purpose register. Still it's very fast.
采用 0 减负数等于正数,并且 0 - -0 = 0 的规则:
public static double abs(double value) {
if (value <= 0) {
return 0.0 - value;
}
return value;
}
这就是长期以来(直到最新的 Java 17),JDK 使用的方法(return (a <= 0.0D) ? 0.0D - a : a;)。
参考:JDK 17 中的的实现:java/lang/Math.java
有人提出了意见,认为目前官方的实现 too slow(6506405: Math.abs(float) is slow #4711)。
这就是 jdk-18+6 中引入的新方案(java/lang/Math.java#L1600~L1604):
public static double abs(double a) {
return Double.longBitsToDouble(Double.doubleToRawLongBits(a) & DoubleConsts.MAG_BIT_MASK);
}
DoubleConsts.MAG_BIT_MASK 就是 0x7fffffffffffffffL, 0 + 63 个 1。
原理就是,通过位运算,清除符号位(使之为 0)。
以 cms stars:>10000 在 GitHub 上搜索,再经过一些筛选,剩下以下项目:
以 forum stars:>2000 在 GitHub 上搜索,再经过一些筛选,剩下以下项目:
比较知名的项目:NodeBB,Flarum,phpBB,
Go Node.js PHP Symfony PHP Python Flask Python Django DRF Ruby On Rails Go PHP AGPL 3.0这是一例非常有参考价值的侵权官司,我们可以从中学习到很多。之前国内开源社区关于开源协议的讨论都是基于国外司法实践。而这次,终于有了一个国内的参考案例。
最近发生的一件事情挺有意思的,在得到 “上门自取” 的回复之后,有位美女替外国程序员依照 GPL 协议上门向国内的一家厂商索要内核代码。
深圳公司 UMIDIGI 生产安卓手机(联发科 Mediatek),面向海外用户。
波兰开发者 Patrycja (@ptrcnull) 想将移植 postmarketOS (基于 Alphine Linux) 到 UMIDIGI 的一款设备上,结果发现缺少 ft8719_dsi_fhdplus 屏幕驱动。
Patrycja 尝试联系 UMIDIGI,得到了以下回复:

就是说,如果你要的话,你可以上门来取。我们可以认为这是想让 Patrycja 知难而退。
可是 Patrycja 八月 17 号在 Twitter 上抱怨之后,深圳科技博主 Naomi Wu 机械妖姬(@RealSexyCyborg,混 Youtube)主动提供帮忙,表示愿意代替 Patrycja 上门索取源代码。
然后机械妖姬 08/20 就拿着自拍杆勇闯 UMIDIGI 公司。
UMIDIGI 行政人员表示需要之前发邮件的 BEN 已经离职(我觉得很可能就坐在旁边看美女),然后提供源代码的事情需要先向老板请示,之后在相对友好的氛围下,机械妖姬离开了。

随后:
这件事件我的评价是:
UMIDIGI 之前的邮件回复十分愚蠢,直接向法务部门咨询之后,通过合法的途径(可能涉及联发科的知识产权)将代码提供给他不就好了吗?
不过,如果不是事情闹大了,UMIDIGI 会不会提供源代码呢?这就不知道了,我们也不能以恶意揣度之。只能就事论事,在这次事件中,各方的表现都非常好。
VCF 是 Virtual Contact File 的简写,虚拟通讯录文件
PS:.vcf 后缀还有一个含义是 Variant Call Format,用在基因生物学方面。
阅读了来自公众号PM圈子的一篇文章《如何搭建一个拖垮公司的技术架构?》,反过来说的话,大概就是要注意以下方面。
《科技爱好者周刊》第 167 期中,阮一峰十分愤慨的说广告拦截器太过分了。
因为他接到读者反馈,有篇文章中间的两段上下语义似乎不能接上,是否有写内容遗漏。然后检查之后发现是被广告拦截器拦截了。
阮一峰从使用非常广泛的规则集 EasyList (AdBlock 默认开启订阅,每 4 小时更新一次) 发现了很多针对他的规则,并从中摘抄了几句特别狠的:
! 拦截脚本 checker.js
ruanyifeng.com/blog/checker.js
! 隐藏指向 t.cn 的链接
ruanyifeng.com##a[href^="http://t.cn/"]
! 隐藏含有"培训"的段落
ruanyifeng.com##p:-abp-contains(培训)
# 曾经出现过,禁用所有 JS 代码:
ruanyifeng.com^$csp=script-src 'none'
我才知道,广告拦截可以做到这么精准的匹配,真心服!
阮一峰检测到用户开启广告拦截之后,就会不显示所有内容,取而代之的是这个提示:
您使用了广告拦截器,导致本站内容无法显示。
请将 www.ruanyifeng.com 加入白名单,解除广告屏蔽后,刷新页面。谢谢。
其他:
AdBlock (下载量 296278) 和 AdBlockPlus (下载量 174432) 的渊源:最早是有一个 Adblock 项目,由于 Adblock 停止更新,一位开发者启动了 AdblockPlus 项目,再后来又有公司基于 AdblockPlus 项目创建 AdBlock。
uBlock (下载量 1658) 和 uBlock Origin (下载量 24666) 的渊源:uBlock 的创始人将项目转移给别人维护之后,好像对后来接收捐款的分配不满,自己又开了一个分支 uBlock Origin。
常见的进制:
那么,八进制用来干嘛?
刚才在维基百科上找到了答案:
Octal became widely used in computing when systems such as the UNIVAC 1050, PDP-8, ICL 1900 and IBM mainframes employed 6-bit, 12-bit, 24-bit or 36-bit words.
就是说早期大量机器采用了 6 位,12 位,24 位,36 位的实现,都是 3 的倍数,所以取八进制(3 位二进制数一组)来表示比较通用。
七月二号发了一篇《吊炸天的 GitHub Copilot》,我表示非常期待这种技术的到来。
但是我并不知道他们是怎么弄的,没有考虑到其 AI 采用的训练集可能涉及的版权问题。
可以看到最近针对 Copilot 产生了巨大的争议,当前开发者社区的这种申讨氛围可能会让 GitHub 放弃 Copilot。
首先,GitHub 承认 Copilot 采用公开仓库代码做训练,不论其授权协议是 GPL 还是啥。
这里面有巨大的版权风险,虽然 GitHub 官方声称不会直接复制粘贴代码,但这种可能看起来就是 “洗代码” 的行为,无法说服别人他们拥有新代码的支配权。
更何况有人拿出了一些证据来证明 Copilot 会直接 Ctrl C + Ctrl V。
最近我使用 vscode 的时候,可以看到有时它会给我一些提示,真的感觉很棒。我不想 Copilot 被抛弃,希望 GitHub 或者 Google、IBM、阿里,或别的公司或组织,能解决所有争议,提供类似的产品,更好的服务开发者。