试用最新的 Docker for Mac Beta

如何申请 Docker for Mac Beta

请访问这个地址申请,可能需要等几天:https://beta.docker.com/

Docker for Mac Beta,最大的好处就是不再依赖 VirtualBox VM 了,而是使用了更轻量化的 xhyve 作为其虚拟化方案(也即是说,仍然不是原生的,还是需要虚拟化一个 Linux 出来在上面运行 Docker Daemon)。

另外,这个版本的 Docker for Mac 使用了 Alpine Linux 发行版,作为一个更轻量化的发行版,与一般的发行版有不少区别,比如,使用 ash 替换 bash 等,具体请访问 Alpine Linux 网站获取更多信息。

使用 Docker Hub Registry Mirror

由于众所周知的原因,在国内访问 Docker Hub 的速度相当缓慢,因此需要设置一个 Docker Registry Mirror 来加速,这里使用 USTC 的 Docker Hub Mirror

就如同之前所说,Alpine Linux 发行版与一般发行版有巨大区别,因此调整 Docker Daemon 的启动参数也不大一样😂

Quick Way

NOTE: 安装了 jq 命令行工具(可以通过 brew install jq 安装),可以直接执行一行命令行搞定,否则请参阅「Slow Way」一节:

1
pinata get daemon | jq -cM '."registry-mirrors" = ["https://docker.mirrors.ustc.edu.cn"]' | pinata set daemon -

Slow Way

1. 导出当前的设置

运行以下命令,将当前设置保存到 docker-config.json 文件中:

1
2
pinata get daemon > docker-config.json
## >> {"storage-driver":"aufs","debug":true}

2. 使用文本编辑器编辑设置

使用任何一种文本编辑器,打开 docker-config.json 并按照 JSON 格式编辑为以下内容,然后保存并退出:

1
{"storage-driver":"aufs","debug":true,"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]}

3. 加载最新设置

最后,加载 docker-config.json 中的设置就可以了:

1
pinata set daemon @docker-config.json

获取 Docker Guest 的 IP 地址

有时候,我们需要得到 Docker Guest 的 IP 地址,其实不大有比较快捷的方法,比如,先运行 pinata get network,居然返回这个??WTF?!

1
hostnet

然后只有运行 pinata list 了:

These are advanced configuration settings to customise Docker.app on MacOSX.
You can set them via pinata set <key> <value> <options>.

🐳  hostname = docker
   Hostname of the virtual machine endpoint, where container ports will be
   exposed if using nat networking. Access it via 'docker.local'.

🐳  hypervisor = native (memory=2, ncpu=2)
   The Docker.app includes embedded hypervisors that run the virtual machines
   that power the containers. This setting allows you to control which the
   default one used for Linux is.

 ▸  native: a version of the xhyve hypervisor that uses the MacOSX
              Hypervisor.framework to run container VMs. Parameters:
              memory (VM memory in gigabytes), ncpu (vCPUs)


🐳  network = hostnet (docker-ipv4=192.168.65.2, host-ipv4=192.168.65.1)
   Controls how local containers can access the external network via the
   MacOS X host. This includes outbound traffic as well as publishing ports
   for external access to the local containers.

 ▸ hostnet: a mode that helps if you are using a VPN that restricts
              connectivity. Activating this mode will proxy container network
              packets via the Docker.app process as host socket traffic.
              Parameters: docker-ipv4 (docker node), host-ipv4 (host node)
 ▸     nat: a mode that uses the MacOS X vmnet.framework to route container
              traffic to the host network via a NAT.

🐳  filesystem = osxfs
   Controls the mode by which files from the MacOS X host and the container
   filesystem are shared with each other.

 ▸   osxfs: a FUSE-based filesystem that bidirectionally forwards OSX
              filesystem events into the container.


🐳  native/port-forwarding = true
   Expose container ports on the Mac, rather than the VM

 ▸    true: Container ports will be exposed on the Mac
 ▸   false: Container ports will be exposed on the VM

🐳  daemon = run 'pinata get daemon' or 'pinata set daemon [@file|-]>
   JSON configuration of the local Docker daemon. Configure any custom
   options you need as documented in:
   https://docs.docker.com/engine/reference/commandline/daemon/. Set it
   directly, or a @file or - for stdin.

因此看起来使用 pinata list | grep 'network =' 才是合理的方式之一:

*  network = hostnet (docker-ipv4=192.168.65.2, host-ipv4=192.168.65.1)

以上

在 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 论坛的讨论