macOS 配置 golang 运行环境

存档下 macOS 下配置 golang 的过程。

第一步,通过 Homebrew 安装 golang 包

$ brew update
$ brew install go
$ go version
go version go1.12.1 darwin/amd64

第二步,配置 golang 工作环境

这里我们先要创建一个工作目录,后续所有工作都会在这个目录下展开:

$ mkdir -p /Users/kodango/Documents/Code/Go

配置 $GOPATH 等环境变量,这个操作是必须的,否则 go 命令运行的时候不知道去哪里寻找待执行的文件:

$ grep GO ~/.bash_profile
export GOPATH=$HOME/Documents/Code/Go    # 上面创建的工作目录
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN

继续阅读

浅谈 Word 文档结构

近期工作中遇到一个增加导出为 Word 格式的需求,因此花了点时间仔细了解了下 docx 格式,发现原来一篇 Word 背后有如此复杂的结构。本文主要介绍 docx 文件的结构,但是 pptx、xlsx 的原理应该是类似的。

docx 格式的奥秘

对于 docx 文件大部分人都停留在这是一种 Office 的文件格式,可以用 Word 软件打开,并没有深入去了解下它内部的组成结构是怎么样的。实际上 docx 是一个压缩文件(Zip 格式),可以用 Zip 软件进行解压。

解压之后可以看到,它是有一系列 XML 文件组成:

这就是 docx 文件的奥秘。

OOXML 规范介绍

这些 XML 的用处、每个 XML 文件的定义格式、Zip 目录结构等,都是在 OOXML 规范定义的非常清楚,下面是 OOXML 官网对此的介绍:

Office Open XML, also known as OpenXML or OOXML, is an XML-based format for office documents, including word processing documents, spreadsheets, presentations, as well as charts, diagrams, shapes, and other graphical material. The specification was developed by Microsoft and adopted by ECMA International as ECMA-376 in 2006. A second version was released in December, 2008, and a third version of the standard released in June, 2011. The specification has been adopted by ISO and IEC as ISO/IEC 29500.

由此可见,word/ppt/excel 等几种格式的组织结构都是在同一个规范下定义的,他们的原理以及解析的方法都一样。OOXML 是微软公司在 2006 年公布的规范。类似的还有 Open Document Format (ODF),它是 OpenOffice.org 开源软件所使用的规范。

继续阅读

如何删除文件中的重复行

有时候删除文件里的重复行是一个很常见的需求,这个用 shell 命令有很多处理方法。

第一种方案是用 sort 命令的 -u 参数:

$ sort -u input.txt > output.txt

第二种方案是用 awk 命令,它的关键在于用一个字典来保存记录:

$ awk '!seen[$0]++' input.txt > output.txt

这和第一种方案的区别在于,即使文件中重复行不连续,依然可以删除。

第三种方案是用 sed 命令,但是其实不大推荐,它相比第一种方案复杂多,而且很容易写错:

$ sort -n input.txt | sed '$!N;/^\(.*\)\n\1$/!P;D' > output.txt

继续阅读