[翻译]Go 的调度器

近期工作有些调整,所以这篇东西用了差不多两个星期才翻译完。想起 @Fenng 几年前跟我说的关于行业和工作的话,虽然出发点不太一样,但是结论还真是正确啊!

工作上的变动,就不多扯了。原文在此《The Go scheduler》。

————翻译分割线————

Go 的调度器

Daniel Morsing

概述

Go 1.1 重要特性之一就是由 Dmitry Vyukov 贡献的新调度器。无需对程序进行任何调整,新的调度器就可以为 Go 程序带来令人兴奋的性能提升。因此我觉得有必要就此写点什么。

在本博文所述的大多数内容都已经在原始的设计文档中有所介绍。那是一篇相当全面的文档,同时也相当专业。

你想要了解的关于新的调度器的一切都能在那篇文档里找到,而这篇博文描绘了整体情况,所以优略得所。

Continue reading “[翻译]Go 的调度器”

让 shell 显示当前 git 的分支名称

早上测试脚本的时候,偶然在这篇文章《Git – setting up a remote repository and doing an initial push》看到一个关于 git 的好玩东西,记录于此。

根据文章的提示在 ~/.bashrc 里添加下面的内容,可以让提示符显示当前 git 的分支名称。我按照自己的习惯修改了提示符的格式。

__mikespook_ps1() {
	local none='\[\033[00m\]'
	local g='\[\033[0;32m\]'
	local c='\[\033[0;36m\]'
	local emy='\[\033[1;33m\]'
	local br='\[\033[1;41m\]'

	local uc=$none
	local p='$'
	if [ $UID -eq "0" ] ; then
    	uc=$CBR 
		p='#'
	fi
	local u="${uc}${debian_chroot:+($debian_chroot)}\u${none}"
	local h="${c}\h${none}:${g}\w${none}"
	echo "$u@$h\$(__git_ps1 '[${emy}%s${none}]')${uc}${p}${none} "
}

export PS1=$(__mikespook_ps1)

这样,就能得到效果:

git-branch-show-in-prompt

[翻译]Go 的竞态检测器

理解竞态对于并发编程来说很重要,如果能通过某种手段来了解程序中存在的竞态,以便进一步的调整避免竞态,也是非常有效的优化手段。Go 1.1 的工具链引入了竞态检测器可以检测并展示程序中存在的竞态情况。Go 团队撰写了博文详细介绍了这一工具的原理和使用。原文在此《Introducing the Go Race Detector》。

————翻译分隔线————

Go 的竞态检测器

Dmitry Vyukov 和 Andrew Gerrand

竞态条件几乎是最为隐蔽和难以发现的程序错误。它们通常会导致诡异且无法解释的错误,尤其是在代码已经部署到生产环境很长时间之后。虽然 Go 的并发机制使得编写清晰的并发代码变得容易,但是它们无法避免竞态条件。认真、勤快的测试是必须的。而工具可以给予帮助。

我们很高兴的宣布 Go 1.1 包含了竞态检测器,一个用于发现 Go 代码中的竞态条件的新工具。它当前在 64 位 x86 处理器的 Linux、MacOS 和 64 位 x86 处理器的 Windows 系统中可用。 Continue reading “[翻译]Go 的竞态检测器”

[翻译]Go 是如何用 go 编译自己的

原文在此《How Go uses Go to build itself》,作者为 Dave Cheney。

————翻译分隔线————

Go 是如何用 go 编译自己的

这篇文章基于 2013 年四月中旬我为悉尼 Go 用户组做的一次关于 Go 构建过程的演讲而成。

在邮件列表或 IRC 的频道里经常有人寻求关于 Go 编译器、运行时和内部原理的细节文档。当前,关于 Go 的内部原理的权威文档的来源就是我鼓励每个人都去阅读的源代码。虽然这样说,但是从 Go 1.0 发布以来 Go 的构建过程就已经稳定了,因此将其记录在这里或许也会有其相应的价值。

这篇文章大致介绍了 Go 编译过程的九个步骤,从源代码开始,结束于经过充分测试的安装好的 Go 。为了简明扼要,所有路径都相对与源代码检出的根路径,$GOROOT/src。

你应当通过阅读在 golang.org 网站上的从源代码安装 Go 来了解更多背景知识。
Continue reading “[翻译]Go 是如何用 go 编译自己的”

Z-Node: a cluster for sys-ops based on doozer & zookeeper

I’m happy to announce the system operations cluster: Z-Node here.

https://github.com/mikespook/z-node

Intro

Z-Node is a cluster for helping system operations. It works with Doozer and ZooKeeper cluster.

Every Z-Node watches at least two files:

  • /z-node/node/$HOST/$PID – for one-node tasks;
  • /z-node/$REGION/wire – for cluster tasks (Every Z-Node instance can watch multi-regions).

Z-Node will register itself as file /z-node/info/$HOST/$PID with running informations. It watches the file /z-node/node/$HOST/$PID for one-node tasks. When the file was changed, Z-Node will be notified.

All of Z-Nodes watch the file /z-node/$REGION/wire for cluster tasks. When the file is changed, all of Z-Nodes will be notified.

Special Thanks

The skynet project enlightened me on the developing with Z-Node. Also, I’m a user with skynet. 🙂

So, express my thanks to the skynet’s founder – Brian Ketelsen.

Thank you for your great job!

[翻译]绝妙的 channel

在编写 golang 程序的过程中,channel 会经常使用。本文对 channel 的使用的确很特别,同时也非常实用。

原文在此:http://dave.cheney.net/2013/04/30/curious-channels

————翻译分隔线————

绝妙的 channel

Go 编程语言中,channel 是一个闪耀的特性。它提供了一种强大的、在不使用锁或临界区的情况下,从某个 goroutine 向其他 goroutine 发送数据流的方法。

今天我想讨论关于 channel 的两个重要的特性,这些特性不但使其在控制数据流方面极为有用,而且用在流程控制方面也十分有效。

Continue reading “[翻译]绝妙的 channel”

[翻译] Go 1.1 介绍

由于年后工作实在太忙,一直也没写点什么。不过这篇我觉得值得,所以……
原文:https://tip.golang.org/hg/doc/go1.1.html
原文链接我进行了替换,现在指向 tip 大多数应该正确吧。不过如果是 Go 1.1 正式发布半年后,我可不保证了。
————翻译分隔线————

Go 1.1 介绍

Go 第一版(简称 Go 1 或 Go 1.0)发布于 2012 年三月,这个版本提供了稳定的 Go 语言和库。其稳定性让全世界 Go 用户社区和相关系统茁壮成长。从那时起,就发布了若干个“关键点”——1.0.1、1.0.2 和 1.0.3。这些点的发布修复了若干已知 bug,但是对于实现本身并没有进行修改。

这个新的发布版,Go 1.1,在保持兼容性的前提下添加了若干重要的(当然,向后兼容)语言变化,而库变化的清单也很长(也向后兼容),还有在编译器、库和运行时环境实现的主要工作。焦点是性能。测试并不是十分精确,但是对于许多测试程序来说都有着重要的、有时是戏剧性的性能改善。我们相信,通过升级 Go 的安装包,并且重新编译,许多用户的程序也能让人体会到这一改进。
Continue reading “[翻译] Go 1.1 介绍”

[翻译]Go 和汇编

使用 cgo 让 Go 跟 C 一起工作已经不是啥稀奇的了。有大量的第三方包直接对 C 的库做了封装,提供给 Go 使用。从 Go 项目本身的代码中可以看到,不但有 C 代码,还有汇编代码存在。那么在自己的项目中是否能跟汇编结合呢?这篇文章完整并清晰的解说了如何让 Go 和汇编协同工作。真得性能敏感?上汇编吧!!

————翻译分隔线————

Go 和汇编

关于 Go,我最喜欢的部分之一就是它那坚定不移的实用主义线路。有时我们过于强调语言的设计,而忘记了编程所包含的其他内容。例如:
Continue reading “[翻译]Go 和汇编”

[翻译] Go(#golang) 实现的状态机

春节前,粗略研究了一下微信的公共帐号。用 Golang 实现了一个简单的 package wechat,用于接入微信公共帐号。当时就在思考,微信的文字交互过程如果要实现有一定逻辑的复杂过程,可能需要使用到状态机。然后,就看到了这篇文章:《State machines in Go (#golang)》。非常合时宜啊!翻译于此,以飨读者!

——–翻译分隔线——–

Go(#golang) 实现的状态机

我已经用 Go 代替 Python 重写了一个关键的服务组件。由于 Python 的解释器不是线程安全的,所以在解析的时候使用了全局锁。Go 与 Python 不同,它内建了并发支持,并且是静态编译的。
Continue reading “[翻译] Go(#golang) 实现的状态机”