在 Python 中统计文本字符个数

字符集向来都是一个大问题,即使是 Python 3.x,也最多只是能说感谢 Unicode 字符集,字符串的存取现在没有问题了。

Unicode 字符集的常见编码UTF-8UTF-16UTF-32 等常见格式,另外,GB18030 也可以算其中一种( GB18030,与 UTF-8 类似,是一种变长编码格式,最大的优势就是兼容 GBK/GB2312

但是 Unicode 就能无痛的解决所有问题吗?答案是否定的。

Read More

Golang 内存模型(一)

开始之前

首先,这是一篇菜B写的文章,可能会有理解错误的地方,发现错误请斧正,谢谢。

为了治疗我的懒癌早期,我一次就不写得太多了,这个系列想写很久了,每次都是开了个头就没有再写。这次争取把写完,弄成一个系列。

此 nil 不等彼 nil

先声明,这个标题有标题党的嫌疑。

Go 的类型系统是比较奇葩的,nil 的含义跟其它语言有些差别,这里举个例子(可以直接进入 http://play.golang.org/p/ezFhXX0dnB 运行查看结果):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import "fmt"

type A struct {
}

func main() {
var a *A = nil
var ai interface{} = a
var ei interface{} = nil

fmt.Printf("ai == nil: %v\n", ai == nil)
fmt.Printf("ai == ei: %v\n", ai == ei)
fmt.Printf("ei == a: %v\n", a == ei)
fmt.Printf("ei == nil: %v\n", ei == nil)
}

// -> 输出
// ai == nil: false
// ai == ei: false
// ei == a: false
// ei == nil: true

这里 ai != nil,对于没有用过 Go 的人来说比较费解,对我来说,这个算得上一门语言设计有歧义的地方(Golang FAQ 有对于此问题的描述,可以参考一下:http://golang.org/doc/faq#nil_error)。

简单的说就是 nil 代表 “zero value”(空值),对于不同类型,它具体所代表的值不同。比如上面的 a 为“*A 类型的空值”,而 ai 为“interface{} 类型的空值”。造成理解失误的最大问题在于,struct pointerinterface 有隐式转换(var ai interface{] = a,这里有个隐式转换),至于为什么对于 Go 这种在其它转换方面要求严格,而对于 interface 要除外呢,for convenience 吧,呵呵……

碰到了这个坑,我就开始好奇了,Go 的类型系统到底是什么样的?

Read More

删除 Intel HD Graphics 显卡工具的全局快捷键

Intel的内置显卡工具总是注册全局的快捷键,而且还是常用的(比如 Sublime Text, PyCharm等工具的默认按键绑定),如下:

  • Ctrl + Shift + Up
  • Ctrl + Shift + Down
  • Ctrl + Shift + Left
  • Ctrl + Shift + Right

这些快捷键都是由 igfxHK.exe 注册的,虽然可以在任务栏中点击禁用快捷键,但是由于快捷键是全局注册,其它应用程序仍然不能使用这些快捷键。

虽然使用 taskkill /IM igfxHK.exe 来强行终止其进程,释放全局快捷键也可以,但是每次重启都要重新做一次,无论是否自动化,都感觉太二逼了,经过一番瞎捣,发现可以通过该注册表,把快捷键定义全部删除掉,避免 igfxHK.exe 占有这些全局快捷键。

注册表文件如下,保存为一个 .reg 文件最后双击运行并导入到注册表即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Intel\Display\igfxcui\HotKeys]
"3101"=-
"3105"=-
"3121"=-
"9530"=-
"3106"=-
"3107"=-
"3108"=-
"3109"=-
"3110"=-
"4528"=-
"10"=-
"11"=-

VirtualBox与杀毒软件冲突导致虚拟机无法启动: 错误 "supR3HardenedWinReSpawn"

今天在公司机器上装了 VirtualBox (版本 4.3.14) 和 Vagrant, 在运行 vagrant up 后总是提示虚拟机不能启动的错误。打开 VirtualBox 然后手动启动虚拟机发现如下错误框:

1
2
3
4
5
6
---------------------------
VirtualBox - Error In supR3HardenedWinReSpawn
---------------------------
Error relaunching VirtualBox VM process: 5
Command line: '81954AF5-4D2F-31EB-A142-B7AF187A1C41-suplib-2ndchild --comment Work_default_1407215688716_8404 --startvm 93cdc421-ae20-49d6-8ca4-6c5570f809cd --no-startvm-errormsgbox' (rc=-104)/>
---------------------------

原因:

  • 与 Symantec Endpoint Protection 冲突

临时解决办法:

NOTE 降级 VirtualBox 后需要重新启动计算机

另外可以参考VirtualBox 论坛的讨论