错误的API依赖

曾经把系统语言设成英文,AutoCAD、Office 等软件均能很好的适应。但发现打开某些包含天正元素的图纸时,中文显示不正常。系统语言切换回中文就正常了。准确地说是区域和语言选项里把区域格式设为中文就正常了。

看来天正开发人员使用了错误的 API,以区域格式来判断系统当前语言。真无理。

想起微软不再更新 cmd.exe,连 cmd 窗口里的版本字符串也不改动。就是因为有大量的非正常依赖,要读取这些字符串来判断当前环境。真是被动。

解决OFFICE临时文件导致的OneDrive同步状态问题

在 OneDrive 使用过程中,经常会发现某些文件夹的状态一直是“正在同步”,但一直未见完成。状态栏上的 OneDrive 图标却是显示“已同步”。

图一:还有文件夹未同步完成
图二:状态栏图标显示已经同步完成

经查,发现是文件夹内一般有无法同步的临时文件导致的。一般是由于 Word、Excel、PowerPoint 未正常关闭,在文件夹内留下了隐藏属性的临时文件(一般以 ~$ 开头)。取消隐藏属性,删除文件后,问题解决。

解决vs_installershell.exe has an invalid certificate问题

问题描述:打开Visual Studio Installer出现了错误:vs_installershell.exe has an invalid certificate,程序终止,无法启动visual studio installer.

问题分析:检查vs_installer.exe的数字签名,发现SHA1签署的签名无效。点击证书详情,发现是Microsoft Root Certificate Authority被吊销,导致数字签名验证失败,所以无法启动VS Installer。但在证书管理器里检查这个证书没有问题。

Work around:手动启动vs_installershell.exe(注意要以管理员模式启动),仍然能打开VS Installer并执行VS更新。

解决方法:

  1. 导出Microsoft Root Certificate Authority这个根证书到文件备份。
  2. 在组策略中取消证书自动更新。gpedit.msc -> 计算机配置 -> 管理模板 -> 系统 -> Internet通信管理 -> Internet通信设置 -> 关闭自动根证书更新 -> 已启用
  3. 在证书管理器中删除Microsoft Root Certificate Authority这个根证书,注意计算机账户和用户账户里的证书都要删掉。(方法是运行mmc.exe然后选择添加管理单元,选择证书后再选择本地计算机账户)
  4. 导入刚才备份的根证书到系统中。
  5. 在文件属性中查看vs_installershell.exe的数字签名,此时应该签名正常。
  6. 打开组策略中的证书自动更新。(参考第2步,最后选择已停用或未配置即可)

原因:出现问题之前自己手动删除了系统里所有的根证书。猜想是这个原因导致系统的证书验证出现异常。而Microsoft Root Certificate Authority这个证书是Windows系统需要的,如果出现问题会导致系统组件工作不正常。所以通过停用自动更新的方式,手动刷新了这个根证书的状态,系统恢复正常。


English Version:

Error description: An error occurred while opening Visual Studio Installer: “vs_installershell.exe has an invalid certificate”. The program terminates afterwards.

Problem analysis: Manually check the digital signature via Properties window, the SHA1 signature is invalid. By clicking “View certificate”, it says that the “Microsoft Root Certificate Authority” CA certificate is revoked, the signature is invalid. The VS installer cannot be started because the digital signature validation failed.

Work around: Manually start vs_installershell.exe from File Explorer. By default it’s located in C:\Program Files(x86)\Microsoft Visual Studio\Installer\. Note that you should run as administrator.

Solution:

  1. Export the CA certificate “Microsoft Root Certificate Authority” to file.
  2. Disable Automatic Root Certificate Update in Group policy. Run gpedit.msc -> Computer config -> Administrative Templates -> System -> Internet Communication Management -> Internet Communication Settings -> Turn off Automatic Root Certificates Update -> Enabled.
  3. Open local computer certificate manager. (Steps here) Delete the “Microsoft Root Certificate Authority” CA certificate from trusted root certification authorities.
  4. Import the certificate from file (just exported in step 1).
  5. Check the digital signature of vs_installershell.exe from File Properties again. Now the signature should be valid.
  6. Turn on Automatic Root Certificates Update. (Refer to the operation in step 2)

Root cause: Before the error occurs, I just deleted all the certificate from system. But “Microsoft Root Certificate Authority” is required for Windows. If deleted, the system might encounter unknown issue. Turn off and turn on the Automatic Certificate Update and re-import the certificate would reset internal system state, which solve the problem.

家用打印机的选择

最近要买一款家用打印机,搜索对比了许久,把一些发现记录如下。

喷墨还是激光?
果断选择激光打印机,喷墨打印机有几个先天缺陷是无法解决的:

  • 容易堵喷头:家庭打印的频度都不是很高,喷墨机一旦长时间不用墨水就会干掉堵塞喷头。这和平日里使用钢笔的经验是一致的。
  • 打印速度慢:现在家用喷墨机正常模式也就5-10张/分。激光机轻松超越这个指标,一般都在14-20张/分左右。这也是现行喷墨技术原理决定的,除非以后升级到按行喷墨,一次完成一行的喷印,否则是无法超越激光打印的。
  • 不防水:染料墨水沾水后会洇开,字迹失去可读性。

相比之下,激光打印机则有性能稳定、打印速度快、打印质量稳定等优点。

要不要彩色?
彩色是不可能的,这辈子也不可能的。(误)彩色固然能提供很多便利,甚至很多时候必须使用彩色。但是在家庭需求而言,彩色的使用频度并不很高,而为了彩色却要付出一倍以上(考虑到 CMYK 四色甚至可能更高)的成本。因此果断放弃彩色打印。

要不要复印、扫描、传真等功能?(即一体机)
不要。传真首先排除,家用完全用不着。扫描可以使用手机拍照然后打印,如对质量有要求,可以在 PS 里做适当的梯形修正以及拼版。复印等同于先扫描再打印。

连接方式
现在智能手机普及了,很多资料都是在手机上产生或接收的(比如家长群里老师布置的作业)。如果为此必须开机连接电脑,那就太麻烦了。因此选择一款支持无线网络的打印机是很有必要的。

耗材成本
这一点无论家用或者商用都是至关重要的指标。经过搜索研究后发现,耗材成本并不取决于厂家的良心或采用的技术先进与否。原装耗材是厂家很重要的一个利润来源,虽然有些厂家(如富士施乐,兄弟等)推出了鼓粉分离技术,但其缺少第三方兼容耗材的支持,本质上并不便宜。

真正使打印成本降下来的,是广大的第三方兼容耗材供应商。在淘宝上,可加粉的第三方兼容硒鼓的成本低至 50 元左右,而原装耗材则在 300 元以上,由此可见耗材的利润有多么高。
耗材这一点基本上把新款机型排除在外,因为新款机器往往使用新款硒鼓,导致硒鼓的流行程度不高,难以买到兼容耗材。同时新款硒鼓上往往安装了新一代的计数芯片(以计数的名义行加密之实),芯片破解难度大,破解成本高,也进一步制约了第三方耗材的生产。(一个案例是淘宝上第三方耗材厂家的硒鼓不配芯片,需要自己把原装硒鼓上的芯片取下来安装到第三方硒鼓上。)

最终选择
经过以上条条框框的制约,实际能选的非常有限。一代神机 HP LaserJet 1020 PlusCanon LaserSHOT LBP2900+,使用 12A 硒鼓,无芯片加密,成本最低,但因不支持无线技术,被排除在外。再往上就是 HP CC388A / CE285 和 Canon 328/912/925 这一代硒鼓了,有计数芯片,但破解容易加粉容易,成本也能做到50左右。(关于计数芯片,原则上可以开发出无限次计数的,但芯片厂家也要生存,因此做出来的芯片也只能限制次数,确保自己的芯片能够持续销售下去,不得不感慨利益才是永恒法则啊)
HP 呢,比较黑心,使用这一代硒鼓的打印机都停产了,淘宝上能搜到零星的商家在卖,但大多标着港版的名义(实则为拼装机、翻新机),虽然价格很便宜,只要500-600,是原价的 50-70%,但家用还要买个稳妥放心,一旦有故障维修起来也很费心,也就不考虑了。佳能还好,良心一点,使用 CRG 925 硒鼓的 Canon imageCLASS LBP6018w 还在生产,京东价格 799(Plus会员价),也就不费心的拿下了。
对应的海外型号是 Canon imageCLASS LBP6030w,可能是佳能为了防止海内外串货和走私水货的考虑把型号做得不一样。美国和香港的型号虽然都是 6030w,但是规格里的电压是不一样的。美版为 110V,港版为 220V,如果买水货或者代购,这点是要注意的。

其它一些发现

关于打印机厂家
惠普虽然占有率最高,但并不掌握核心技术。惠普在收购三星之前,打印机的核心部件(硒鼓、定影组件等硬件)都是由佳能研发并代工的。这一点有两个佐证:一是打印机的发展史,早期佳能研发了小型化激光打印技术,把技术卖给了美国厂家,惠普从而有了小型激光打印机。[1] 二是惠普的许多硒鼓与佳能是通用的,典型的有惠普 12A 与佳能 303,二者可以通用。

激光打印另一家比较有名的是施乐(Xerox)。但施乐似乎专攻大型数码复合机(由复印机演化而来),对于桌面化的小型激光打印机投入较少。同时在亚太地区,施乐的业务由富士施乐这家合资公司来开展,据说低端产品代工居多。

打印语言
最早的针式打印机脱胎于打字机(Typewriter),自带字库,电脑把需要打印的文字直接以原始编码的形式发到打印机上,打印机根据自带的字库字体来输出。对于图形的输出能力非常有限(很多时候都是利用字库里的特殊符号来完成)。

后来 Adobe 发布了 PostScript 语言,打印机里集成了 PostScript 引擎,由引擎把输入的文字和图形转化为打印机可以理解的光栅化图形然后输出。从此打印机可以输出复杂图形和各种字体。但是集成的引擎硬件大幅提高了打印机的成本,终端用户很难承担。

惠普也发布了自己的打印语言 PCL,但是取消了硬件打印引擎,由计算机上的软件形式的 PCL 引擎来把文字和图形翻译成可打印的光栅图像。至今已经发布到 PCL6,还有面向移动设备的 PCLm。

佳能也有类似的打印语言 UFR (Ultra Fast Rendering),但据说集成了 PCL 和 PS 二者的优点,能够同时把打印任务交给计算机和打印机来处理,这样更快地完成打印渲染,从而加快打印速度。

移动打印
智能手机普及以来,需要频繁地从移动设备上打印。从而产生了一些移动打印解决方案。
系统级:Android Print Service 和 Apple AirPrint
AirPrint 在 iOS 系统里集成了打印框架,打印机厂家在打印机上提供支持。AirPrint需要苹果的支持和授权。
Android Print Service 是 Android 系统里提供了打印服务接口,由打印机厂家来提供打印服务程序(相当于打印机驱动)。Android Print Service只需要厂家按规范编写打印服务程序就可以,不需要在打印机固件上提供支持。移动 APP 需要调用系统的打印 API 来输出,对于一些未提供打印功能的程序,无法使用此接口打印。典型的如 Android 中的照片 APP,如果菜单里没有“打印”功能,则无法使用此方式来打印。

应用级:各厂家也基于自己的打印机产品提供了应用层面的打印机支持。例如 HP ePrint,Canon PRINT Business/Ink/SELPHY。这种实现是一个普通的 APP,在应用层面提供打印机的支持。其它软件通过系统的“分享”功能,把文档数据分享至相应的应用来打印。兼容性比较高,但实际打印格式的支持可能有限,仅限常见格式。

[1] 历史的有趣历程:打印设备进化简史

给域名解析添加备份

5月19日,国内的免费智能域名解析服务商 DNSPod 遭到大规模的恶意攻击,意外中断服务若干小时。我的博客域名当时也托管在 DNSPod 处,被攻击的时候无法解析域名,幸好自己记得虚拟主机的 IP 地址。当时只好自己在系统中编辑 hosts 文件来手动完成解析服务。

意外发生以后,再考虑到 DNSPod 之前数次被攻击的历史,我决定把域名转移到其它的服务商,更重要的,是给域名添加备份解析服务器。

DNS 作为互联网基础设施,其稳定性是很值得关注的。传统的做法是域名解析服务商(无论是免费解析还是域名注册商提供的解析)提供至少两台服务器用作域名解析服务。比如 DNSPod 就有六台服务器用作免费解析,EveryDNS 有四台服务器。这种设计是为了提高冗余度以增加域名系统的稳定性。对于意外的服务器当机、网络出现故障等问题,这样做是比较保险的。DNSPod 偶尔就有某台服务器要停机维护的情况,但这并不会给正常解析带来什么麻烦,因为有其它的五台服务器正常工作。可是对于恶意攻击,多台服务器的冗余就没有意义了。攻击者在能力足够的情况下(直白的说就是肉机足够多),完全可以利用大流量把所有的服务器同时攻击一遍。而且大部分时候他们都会这么做,要不然只攻击一部分其实没有效果。DNSPod 就这样被大流量攻击打倒,无数的域名便受到牵连。

在台湾网友的博客上看到《如何用xname搭配zoneedit做备援DNS》这篇文章,于是照着做了一下,把自己的域名解析转移到了 ZoneEditEveryDNS。设置上都是大同小异的,简单说一下。

  1. 注册 ZoneEdit 和 EveryDNS 账号,并登录。
  2. 在 ZoneEdit 中添加自己的域名,比如我的就是 xiaoding.org ,然后添加自己的解析记录,包括 A 记录(IP地址)、CNAME 记录(别名)、MX 记录(邮件服务)等等。Nameserver 这个地方,ZoneEdit 会给出自己的两台服务器地址,稍微记一下数字较小的那个服务器的地址。
  3. 域名解析记录添加完之后,选择 ZoneEdit 的 Advanced 页面,打开最下面的“Edit Security Settings”,然后在“Restrict zone transfers to these IP’s”这个编辑框中填入“0.0.0.0/1;128.0.0.0/1;”(不含此处的引号)。注意这个填法将允许所有的区域传送请求,直白的说就是你的域名记录将对所有人公开。这么做是为了方便,因为 EveryDNS 或者 XName 对于他们的区域传送服务器的 IP 说法十分不清楚,而且时间长了也有可能变动。只好图个方便在这里允许所有的人来抓取 DNS 记录。相信一般人在这里也不会藏什么秘密。 😛
  4. 来到 EveryDNS 的设置页面。左边是添加记录的地方,basic 框中填入你的域名,比如 xiaoding.org ,选中下面的“Make domain secondary using”,然后输入刚才 ZoneEdit 的那个服务器的地址,点击“Advanced”按钮,添加就完成了。
  5. 在 ZoneEdit 的 Nameserver 选项中,把 EveryDNS 的四台服务器地址添加进去。分别是 ns1.everydns.net ns2.everydns.net ns3.everydns.net ns4.everydns.net
  6. 设置到此结束。EveryDNS 的服务器会自动地向 ZoneEdit 的 Master nameserver 同步。等几个小时以后可以查询自己的 DNS 记录以便确认是否同步成功。

使用如下命令查询 DNS 的 SOA 记录:

nslookup -q=soa xiaoding.org ns3.zoneedit.com

查询结果示例:

xiaoding.org
        primary name server = ns3.zoneedit.com
        responsible mail addr = soacontact.zoneedit.com
        serial  = 1242714018
        refresh = 14400 (4 hours)
        retry   = 7200 (2 hours)
        expire  = 950400 (11 days)
        default TTL = 3600 (1 hour)

注意把 xiaoding.org 换成自己的域名, ns3.zoneedit.com 换成自己的域名解析服务器(每个人可能不同)。针对每个服务器都查询一次,在返回的 SOA 记录中比较一下记录的序列号是否相同,如果相同即表明备份 DNS 设置成功。这样无论 ZoneEdit 或者 EveryDNS 哪一家有问题,自己受的影响都会小很多。