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

接下来按照官网的建议,在工作目录下创建几个字目录:

$ mkdir -p $GOPATH $GOPATH/src $GOPATH/pkg $GOPATH/bin

第三步,测试是否工作正常

在 $GOPATH/src 目录下创建 hello.go 文件:

kodango -> ~/Documents/Code/Go/src/github.com/kodango/hello
$ ls -l
total 8
-rw-r--r--  1 kodango  staff  86  5 18 09:26 hello.go

写一个简单的 Hello world 示例代码:

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello, world\n")
}

使用 go run 命令运行代码:

kodango -> ~/Documents/Code/Go/src/github.com/kodango/hello
$ go run hello.go
Hello, world

或者先用 go install 将编译好的执行文件安装到 $GOBIN 目录。因为之前已经把 $GOBIN 添加到系统 $PATH,可以直接输入 hello 运行。

kodango -> ~/Documents/Code/Go/src/github.com/kodango/hello
$ go install hello.go
$ ls -l "$GOBIN"
total 4120
-rwxr-xr-x  1 kodango  staff  2108040  5 18 09:30 hello
$ hello
Hello, world

浅谈 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 开源软件所使用的规范。

从官网介绍可以看出 OOXML 规范主要包括两个方面,第一个显然是每个 XML 文件的语法定义,类似 markdown 语言的语法描述一样,word 文件的格式、样式、内容布局等等都是和 XML 里面的 TAG 一一对应。第二个,就是对文件的组织结构的定义,前面看到 docx 实际上是一个 Zip 文件,解压缩出来的目录结构是有规则的,这个通过 Open Packaging Conventions (OPC) 定义,具体可以查看 Anatomy of a WordProcessingML File

查看全文

如何删除文件中的重复行

有时候删除文件里的重复行是一个很常见的需求,这个用 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

这种方案里面用到了 sed 的高级命令(N、P、D),相关介绍可以参考之前写的文章 Sed and awk 笔记之 sed 篇:高级命令(一)

这里有一个小技巧,如果遇到比较复杂的 sed 命令拿捏不准的化,可以用 sedsed 这个脚本来调试执行,看每一步执行的情况。

使用方法也很简单,比如调试上面这个 sed 命令,命令执行结果会展示每一步执行后模式空间和保持空间的内容,一目了然:

$ sort -n input.txt | python sedsed.py -d '$!N;/^\(.*\)\n\1$/!P;D'

团队招聘贴研发岗

新财年开始了,团队招聘继续放开,欢迎有兴趣的同学/朋友投递简历过来,当然也欢迎纯交流。简历投递的邮箱见文章最下方。

团队介绍

我们来自于阿里云智能事业群,专注与企业级的内容管理中台的开发,通过标准化、智能化和数据化为产品团队提供专业、高效的内容管理解决方案,帮助产品更好的面对全球用户。

岗位职责

1、负责阿里云智能内容管理平台和一站式知识库系统的研发工作,包括但不限于文档生命周期管理、全方位数据化运营以及智能推荐和搜索;
2、对所负责的系统进行良好规划和设计,使系统体系化并具有前瞻性,在保证稳定性的基础上更高效支撑业务发展;
3、要深入理解业务,技术驱动产品发展,可以结合业务进行技术创新,持续优化平台的用户体验,提升内容管理效率;

招聘条件

JAVA开发专家(P7,杭州):
1、JAVA基础扎实,熟悉网络编程、多线程并发编程,熟悉分布式存储、缓存、关系型数据库;
2、三年以上Java系统开发经验,精通面向对象设计,对项目中接触过的开源框架、技术产品、算法等有针对性的进行过深入学习,了解其底层机制和原理;
3、熟练掌握Linux,具备系统调试、性能调优等技能,疑难问题有较强的分析与排查能力;
4、具备优秀的团队协作精神,能利用自身技术能力提升团队整体研发效率,提高团队影响力;
5、对技术有持续的热情,个性乐观开朗,逻辑性强,善于和各种背景的人合作;
6、对云计算或云计算产品有认知有实践经验者优先;

简历投递

本岗位持续开放,感兴趣的小伙伴们请发送简历至 dangoakachan@gmail.com,或者官网投递