Gopher 做 PPT 的正确姿势

试想一下,你作为一枚区块链技术开发者,受邀到某个区块链峰会做演讲,你总得做个 PPT 吧,做 PPT, mac 上自带了 keynote、pages 等软件还好,windows 系统的话你还得装个 powerpoint 吧。

到了会上做演讲,要么你自带笔记本,要么会场的电脑也得装了 PPT 播放软件,你才能把 PPT 投射出来。

嗯,情况就是这样。

我总觉得还是有点不方便。

而且,我想,我肯定不是第一个有这种感觉的人。

Origin

最近,我们区块链底层开发组来了好几个实习生,我要给这拨刚毕业的同学们做个 go 语言基础培训,那肯定要做个类似于课件啊、讲义之类的 PPT 吧。

刚开始,我打开了 mac 的 keynote 捣鼓会,其实就跟 windows 上搞 ppt 差不多的操作……

但是,我烦了。

我们这类技术培训,大部分内容跟代码相关,在 PPT 上贴一大段代码毕竟画面不会太好看,“PPT+IDE”组合又得不停地在两种窗口间切换来切换去,并且还得另外准备一份演示用的代码集。

懒人开始思考。

我想起刚学 go 语言那会在 YouTube 上看了不少 Google 大牛的 go 语言布道视频,他们演讲时好像是播放一种叫 slide 的文件,直接呈现在网页里,还可以在里面直接运行代码。

这正是我想要的,我花点时间研究了下其中的内幕。

Experient

slide 是随着 Go 诞生而出现的一种 present 格式,Go 语言研发组那帮老爷们十分喜欢以这种格式分享 Go语言技术心得和想法,几乎所有技术会议的幻灯片均是以 .slide 形式提供的,给人一种“真会装逼”的感觉。

present 是一种文本标记语言,使用普通文本编辑器就能编写(还装什么 powerpoint、keynote啊),只要遵循它的语法,就可以使普通文本内容呈现出特定的格式。说白了,就跟我现在用 markdown 语法写这篇文章差不多,它让作者把精力花在内容上,而无需过多关心格式、排版等问题。

简单体验下 present 语法:

1
2
3
4
5
6
7
8
Hello Slide

Huang_Xuezhong
33.cn
hxz@disanbo.com
http://hxzqlh.com

* Hello world

就这么几行文本,就可以渲染出下面 3 张 slide。

回车键、方向键都可以控制往前或往后看~,神奇吧~

本地运行的话,有这么几步:

1.先装一个 present 渲染工具。

1
go get golang.org/x/tools/present

很不幸,如果你在天朝,无法访问 golang.org/x/tools, 不过好在你是一个 gopher,肯定知道,它已经转移到 github.com/golang/tools 有它的镜像,因此,在你的 GOPATH/src 下面手动创建个 golang.org/x 文件夹,再 git clone github.com/golang/tools,再 go install golang.org/x/tools/cmd/present, present 就安装到你的 GOPATH/bin目录中了。

2.在 slide 文件目录,将 present 跑起来:

1
2
hxzdeMac-mini:~/workspace/slide $ present
2018/03/27 20:34:36 Open your web browser and visit http://127.0.0.1:3999

3.打开浏览器访问 http://127.0.0.1:3999,会列出它渲染的 slide 文件列表,点击进去,就是见证奇迹的时刻……

Present

花点时间熟悉下 persent 语法。

present 语法格式要求用户定义好 头部正文

1
2
3
4
5
6
7
8
9
10
Title of document
Subtitle of document
15:04 2 Jan 2006
Tags: foo, bar, baz
<blank line>
Author Name
Job title, Company
joe@example.com
http://url/
@twitter_name

头部只有标题是必需的,它是第一个非空非注释行,子标题、日前、标签、作者等信息都是可选的,标题、作者头衔以及所在机构作为 slide 的第一页。

标签栏后留一个空行,可以附上作者信息:作者姓名、头衔、所在机构、邮箱、网站、Twitter名等,这部分会显示在最后那张 Thank you 的 slide 中。

body

正文部分以 *后跟当前页标题来区分每张 slide。

正文语法示例如下,支持多级标题、列表、图片、代码段、网页链接等多种格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
* Title of slide or section (must have asterisk)

Some Text

** Subsection

- bullets
- more bullets
- a bullet with

*** Sub-subsection

Some More text

Preformatted text
is indented (however you like)

Further Text, including invocations like:

.code x.go /^func main/,/^}/
.play y.go
.image image.jpg
.background image.jpg
.iframe http://foo
.link http://foo label
.html file.html
.caption _Gopher_ by [[https://www.instagram.com/reneefrench/][Renée French]]

Again, more text

最最令人兴奋的是,可以在里面直接跑代码:

真正的所见即所得啊,再也不用在代码区和演示文稿窗口间切来切去啦~这正是我等代码家梦寐以求的 PPT 打开方式啊。

关于 present 语法,这里 有详细的文档。

Watch It Everywhere

本地 present 服务可以作为调试用,slide 最终是给别人看的。

通过 https://talks.godoc.org/ 提供的 present 渲染服务可以在线浏览 slide,并且支持 github 仓库中的 slide 文件。

Go 开发者们只需要将自己写好的 slide 文件存放在自己 github 上的仓库中,就可以随时随地打开这类 present 文件给大家分享了。

比如,我的 github 有一个叫 slide 的仓库地址:github.com/hxzqlh/slide/ ,里面有一个 golang_coding_standard.slide

然后,你只需按照【仓库地址/slide文件名】格式拼接到 https://talks.godoc.org/ 后面就可以观看了:

https://talks.godoc.org/github.com/hxzqlh/slide/golang_coding_standard.slide

很实用吧。

但是……

还是因为墙的原因,https://talks.godoc.org/ 在大陆是无法直接访问的,有梯子的还可以访问,没有梯子的怎么办?

TODO, 这里先挖个坑:

等有空了,我自己搭建个 https://talks.godoc.org/ 镜像。

有个老外在 YouTube 上放了个非常酷炫的 视频 来介绍 present,我上面讲的这些内容,里面都有涉及,我把它搬砖到腾讯视频了,快来看看吧。

Last

如此一番折腾,我们得到了什么?

我们可以不装 office,不用 keynote,只需打开你随身携带的记事本,简简单单地用 present 写 slide,一键上传至 github,只要有网,人人皆可访问。