Go - See what packages my app imports

It’s often practical to see what packages your app is importing. Unfortunately there isn’t a simple way to do that, however it is doable via the go list tool and using templates.

Go to your app and run the following.

$ go list -f '{{join .Deps "\n"}}' |  xargs go list -f '{{if not .Standard}}{{.ImportPath}}{{end}}'

Here is an example with the clirescue refactoring example:

$ cd $GOPATH/src/github.com/GoBootcamp/clirescue
$ go list -f '{{join .Deps "\n"}}' | xargs go list -f '{{if not .Standard}}{{.ImportPath}}{{end}}'
github.com/GoBootcamp/clirescue/cmdutil
github.com/GoBootcamp/clirescue/trackerapi
github.com/GoBootcamp/clirescue/user
github.com/codegangsta/cli

If you want the list to also contain standard packages, edit the template and use:

$ go list -f '{{join .Deps "\n"}}' |  xargs go list -f '{{.ImportPath}}'

Go - EBNF

Notation

The syntax is specified using Extended Backus-Naur Form (EBNF):

Production  = production_name "=" [ Expression ] "." .
Expression  = Alternative { "|" Alternative } .
Alternative = Term { Term } .
Term        = production_name | token [ "…" token ] | Group | Option | Repetition .
Group       = "(" Expression ")" .
Option      = "[" Expression "]" .
Repetition  = "{" Expression "}" .

Productions are expressions constructed from terms and the following operators, in increasing precedence:

|   alternation
()  grouping
[]  option (0 or 1 times)
{}  repetition (0 to n times)

Lower-case production names are used to identify lexical tokens. Non-terminals are in CamelCase. Lexical tokens are enclosed in double quotes "" or back quotes ``.

Makefile:简介

Make 可以简化编译过程,如果有一个近百个源文件的项目,如果有个文件更改后工程需要重新编译,那么一直用gcc -c a.c这些个命令敲来敲去会屎人的。运行make时候,他会寻找指定目录下(默认是 .)的 Makefile 文件并且分析依赖关系进行必要的编译。

Makefile文件的基本格式很简单:

目标文件: 依赖文件1 依赖文件2 依赖文件3 。。。。
[tab]编译命令

他的意思是目标文件是依赖于冒号后面几个文件的,如果这些依赖文件有更新的,那么其目标文件也需要更新。

Makefile 中可能有很多以上条目,他们共同组成了一个有向无回路图(DAG图),这样可以传递依赖。make 命令会把 Makefile 文件的第一个目标文件作为默认目标,当执行 make 命令时,make 会考察这个目标文件的依赖关系,进行编译。也可以指定,比如这个 Makefile:

main: a.o b.o
[tab]gcc -o main a.o b.o
a.o : a.c c.h
[tab]gcc -c a.c -o a.o
b.o: b.c c.h
[tab]gcc -c b.c -o b.o
// [tab]的意思是这里用tab字符代替,不能有其他的什么字符

在命令行里执行make,分析关系并生成main,如果是make a.o那么他只会编译到 a.o 。

游戏发展史:Valve

Valve 虽然从来是『有再一再二,没有再三再四』,但是不得不承认,无论是半条命还是 steam,都称得上『划时代』。

名不见经传的英雄 Unlikely Heroes

1996年,微软已经从一个小作坊成长为世界上最富有的公司之一,最早的一批员工都已经成为了百万富翁。其中两名老员工一直爱玩游戏,现在有了足够的资金做自己想做的事情,他们决定成立自己的公司。

不幸的是,他们对游戏开发毫无经验,只参与过操作系统以及功能性产品的编写,后来一个好友将他们介绍给了著名的id软件创始人——约翰·卡马克,卡马克说服他们应该拿到Quake引擎的许可并做一个游戏。他们同意了,并认为追寻梦想的时机已到。

加布·纽维尔和麦克·哈灵顿为新公司想了几个名字,包括果蝇、全息盒子以及犀牛疤痕(Rhino Scar),但最后他们选定了一个很简单的名字阀门(VALVE)。

和卡马克见面后,纽维尔和哈灵顿创建了他们的公司,并在纽维尔的婚礼遮天正式注册成立。

【G胖 加布·纽维尔 Valve创始人】:我最初建立一家游戏公司的动机带有一定社会性,我很享受与一帮聪明人一起工作,创造能影响不同群体的游戏。1996年,我在想有哪些选择,在这个问题上我又很大的自由,环游世界,度个假什么的。我最喜欢Valve的一点就是这种特定的工作环境。

不同于Bungie仅靠一人慢慢白手起家,Valve想立马就开始制作高预算游戏,两个人是远远不够的,尤其这两人还从来没做过游戏。于是Valve便开始物色人才,他们的做法不同于当时业界的标准,不仅招募专业人士,还有MOD作者。他们意识到某些mod作者可能比专业人士更有天赋。伺候Valve便开始开辟新的疆土。

公司完全依靠两位创始人的资金运作,这样一来公司便承担得起一般小工作室承受不了的风险。然而仅有两个想追梦的人还远远不够,没有人看好他们,找到一个愿意发行他们作品的发行商几乎不可能。尤其当纽维尔和哈灵顿宣称游戏采用了极其复杂的技术时,发行商们不相信他们能兑现诺言,最后他们找上了“雪乐山在线”(SIERRA Online),雪乐山刚好打算发行一款3D动作游戏,最好使用Quake引擎制作。Valve团队令他们印象深刻,有了足够的信心与其展开合作,即使失败了,仅仅一款游戏的合约也让雪乐山有退路。

游戏发展史:Bioware

一个公司能够成为欧美 RPG 玩家心目中『经典』的代言,不得不说是有两把刷子的。

启程 Setting Out

1995年,电子游戏已经不再只是孩子的玩具,即使是医生也可能成为玩家。就在这一年,三名医学院毕业生决定在投身医药行业之前做出自己的游戏。就是这样, Ray Muzyka, Greg Zeschuk和Augustine Yip在Zeschuk的地下室创建了自己的公司。谁能想到这样一个组合最后能成为RPG巨匠?他们的名字代表着精品——Bioware.

公司制作的第一款游戏叫做《超钢战神》,这是1996年的一款为MS-DOS平台执着的第一人称载具射击游戏。Bioware尝试提升游戏画面表现,将可变形地表作为一大卖点。游戏还有着复杂的背景故事,在那个年代多数射击游戏内容都只是枪枪枪,这种级别的游戏内涵着实不平常,这也成为了公司以后的立足之本。

《超钢战神》之后Muzyka和Zeschuk想要继续制作游戏,但作为创业伙伴的Augustine Yip决定投身医药行业,离开了公司。尽管如此Bioware还是继续制作了他们的下一款游戏《战场:无垠》并且开始寻找发行商。当interplay旗下的黑岛工作室看过游戏之后,他们并不想仅仅发行游戏,而是想将其打造为公司的标志品牌,并授权Bioware将《战场》做成一款官方D&D规则游戏,结果就是1998年的《博德之门》。

故事发生在AD&D第二版规则设定的“遗忘之地”,游戏保有一切RPG的特性,从移动、攻击到施法,一切结果都是通过计算获得的。Bioware明智地决定让这一过程对玩家不可见,如此一来,即便是从未看过AD&D规则书的玩家也能很快上手,投身进“遗忘之地”之中。游戏是实时进行的,这在D&D电子游戏里尚属首例,玩家可以在战斗开始前按下“暂停”,选择每个队友的进攻路线,再继续游戏观看战略实施。游戏还拥有当时的顶尖画质,充分利用了PC业界的新技术——专用独立显卡。不同于《暗黑破坏神》的杀杀杀&刷刷刷,《博德之门》将重心放在了剧情上,引人入胜的史诗般任务至少花费数十小时,一个法师学徒为其师父报仇的故事都能谋杀玩家的大量时间。支线任务大多也和主线一样有趣,D&D饭也能遇到很多设定中的著名角色并与之互动,对很多玩家来说是梦想成真。虽然画面在今天看来已经过时,但时至今日博德之门依旧是游戏史上剧情最佳的游戏之一。这还没完,游戏提供了多人模式,允许好友组队一起完成任务。这是首款能这么做的PC RPG,这使得游戏大受欢迎,因为核心玩家能在游戏中一路帮助他缺乏经验的朋友。所有这一切成就了1998年最卖座的游戏之一,成为一代RPG名作。

仅仅成立3年并推出两部作品,Bioware从医生的爱好成为了业界领导者,这一切都来得太快,没人知道他们能否将这股劲头保持下去。幸运的是,Bioware的成功之路才刚刚开始。

游戏发展史:Interplay

Interplay 对于新玩家而言已经过于陌生了,虽然早已不复往昔,但是给游戏业界留下的财富,仍旧不可估量。

新星崛起 Meteoric Rise

布莱恩·法戈的高中生涯都在 Apple II 游戏的陪伴下度过,毕业后他想到,如果自己去设计游戏,做出来的作品搞不好比手头这些都好玩。于是1992年他以Saber 软件公司的名义制作了《恶魔熔炉》,当时孤立一人的他,花费了整整一半的预算,在电脑杂志《Softtalk》上刊登了一则广告。之后为了吸引零售商进货,他又冒充普通玩家打电话给商店,询问能否买到杂志上宣传的这款酷毙了的新游戏。

计谋奏效了,零售商们也开始从 Saber 软件公司订购这款游戏,他们完全没有想到的是:所谓 Saber 实际上是一人企业,而他就是冒名电话背后的始作俑者。凭着这款游戏,法戈得到了 Boom 集团的关注,后一年他被吸收到该集团为他们工作,然而,当 Boom 的一次董事会以大打出手作结时,法戈意识到是该另立门户了。于是他召集死党,在1983年城里了自己的公司。

当时的他们对未来毫无头绪,然而他们没有料想到,公司将要经历的一系列大起大落是如此充满戏剧性,在整个游戏史上也属罕见。这家公司从小工作室起家,发展成为一流发行商,最后却不幸破产。当年也全亏他们慧眼识英雄,才扶持了暴雪、Bioware 和 Treyarch 这些如今行业的巨头。且听我以吟游诗人的曲调,将 Interplay 娱乐公司的这段兴衰史娓娓道来。

起初的 Interplay 并没有什么大作为,仅仅从事一些现有游戏的跨平台移植工作,甚至还从一家军事分包商处接活。最后他们终于同Activision达成协议,从事原创游戏开发。1984年他们的首部作品,冒险游戏《Mindshadow》问世,该作一定程度上基于罗伯特·卢德伦的小说《谍影重重》。在游戏中失忆的主角必须收集线索,找回自己不为人知的过去。游戏获得了一定的成功,Interplay 在原创游戏开发方面也借此迈出了一步。仅一年后,Interplay 出品了第一款真正意义上的大作《遗忘故事第一张:吟游诗人传奇》(冰城传奇),这款角色扮演游戏大量借鉴了《巫术》系列,而后者在病危获得官方授权的情况下,完美地运用了龙与地下城(DND)的规则体系。相比之下《吟游诗人传奇》要精致的多:多色彩,游戏音效和背景音乐的加入,使得 DND 式的冒险历程更为引人入胜。

游戏发展史:Blizzard

暴雪的大名已如雷贯耳,虽然现在也面临着一些困难,但是回顾往昔,光芒依旧耀眼。

1

就读于加州大学洛杉矶分校的迈克·默汉曾经对同学这样恶作剧:当艾伦·艾德涵暂时离开电脑时,默汉迅速把艾伦的电脑密码改成了 JOE,毫不知情的艾伦回来输入密码,竟然成功登陆了。这时轮到默汉大吃一惊,艾德涵究竟是怎么做到的?于是他招认了自己的恶作剧,然后请教艾德涵是如何破解的,然而,后者的惊讶程度丝毫不亚于默汉,他不过是输入了自己的密码而已。默汉终于明白了其中关键:由于机缘巧合,艾德涵自己的密码也刚好是 JOE。此后两人成为挚友,他们关系之好,最终又成为商业上的合作伙伴,之后20年中他们的工作室制作了数十款精品游戏,不仅成为游戏史上最伟大的传奇之一,更晋升为行业巨头,屹立于整个娱乐产业。他们的公司如此受欢迎,甚至拥有自己的年度大会。且不论两人是否还把 JOE 作为密码,在产品制作的完美程度和持续的卓越方面,世界上几乎少有同行能够同暴雪娱乐并驾齐驱,这是毋庸置疑的。

毕业之际,艾伦·艾德涵觉得这是实现理想的最佳时机,他热衷玩游戏,为何不以制作游戏为业呢?但是他不甘心在大公司当低级程序员,而是想自己当老板,自己决定工作计划。艾德涵决定创立自己的公司,于是他联系迈克·默汉,邀请他入伙,同时还联系了另外一名同学弗兰克·皮尔斯。

【弗兰克·皮尔斯】我与艾伦通过熟人认识,当时很凑巧,因为我确实很想制作游戏,觉得是一项很酷的事业,却苦于不知道如何着手,而艾伦对于自己想做的事情有着明确计划和确切的愿景,他想做的事刚好也是我感兴趣的,因为我少走了很多弯路,我们能够相遇是很幸运的。

【迈克·默汉】公司成立的第一天我才和弗兰克首次见面,当时我正在说话,一个陌生人出现了,于是我闭住了嘴,然后就这么结识了。

1991年2月8日,三人在加州科斯塔梅萨建立了他们的工作室『硅与神经键Silicon&Synapse』,艾德涵担任总裁,默汉担任副总裁,皮尔斯则是程序员。他们决心不紧要制作出伟大的游戏,更要在其过程中享受到乐趣。

聊斋:白狐

很多年前,一个昭阳四射的清晨,书生坐在树桩上苦读四书五经。书生一贫如洗三餐不饱,家里唯一值钱的就是那两担沉甸甸的书。

书生每天都坐在这片林子里,随便寻个坐处,读到天黑,日子一天天的就这样在圣贤书中流逝。

这日黄昏,书生正在读书,读到夕阳遍地时高呼:“书中自有黄金屋,书中自有颜如玉”,突地“吱吱”而鸣声随风而来,书生抬起头来,只见一团白影扑面而至,那是一只晶莹通白的小狐狸,雪白得一尘不染,两只眼珠溜溜而动,口里哀声连连。

说也来怪,小狐狸奔到书生面前时,竟兀自停住脚步,气喘吁吁。

书生一把抓住小狐狸,只见小狐狸雪白的后腿上,斜斜地插着一支箭,鲜血顺着箭头沽沽而下,染红了一片。小狐哀鸣几声,双目对着书生,写满了哀怜与乞求。

书生叹一口气:“小狐狸啊小狐狸,是谁忍心伤你这么深……”

语音未落,远处蹄声如雷阵阵踏来,小狐狸白溜的身子不停的颤抖,仿佛要从书生手里挣扎逃走,书生急忙捧紧小狐,一咬牙将箭拔出,撕下一片烂衣袍,将小狐狸的伤口包好,轻轻放入宽大的衣袖里,说也来怪,小狐狸竟忍住疼痛,一动不动的躺在书生的袖怀之中。

书生刚刚端起书,只听得马蹄声轰轰而至,数十匹高大骏马踏青飞来,为头的是一个虬髯大汉,满身华贵地叫道:“兀那书生,可曾见过一只受伤的狐狸逃过?”

书生抬起头来:“兄台说的可是一只满身雪白的狐狸?”

虬髯客身旁闪出一团绿影,娇喝道:“正是,正是我射中的那只狐狸,那小畜生呢?”

书生只闻香风扑面,迎面是一张如花笑脸,书生猛然间惊慌失措,意迷情乱,好半天才回过神来,指着身后结结巴巴的说:“刚刚从这边跑过。”

少女娇声说道:“多谢书生!我们追!”

Intro to BoltDB: Painless Performant Persistence

BoltDB is a pure Go persistence solution that saves data to a memory mapped file. I call it a persistence solution and not a database, because the word database has a lot of baggage associated with it that doesn’t apply to bolt. And that lack of baggage is what makes bolt so awesome.

Bolt is just a Go package. There’s nothing you need to install on the system, no configuration to figure out before you can start coding, nothing. You just go get github.com/boltdb/bolt and then import “github.com/boltdb/bolt”.

All you need to fully use bolt as storage is a file name. This is fantastic from both a developer’s point of view, and a user’s point of view. I don’t know about you, but I’ve spent months of work time over my career configuring and setting up databases and debugging configuration problems, users and permissions and all the other crap you get from more traditional databases like Postgres and Mongo. There’s none of that with bolt. No users, no setup, just a file name. This is also a boon for users of your application, because they don’t have to futz with all that crap either.

Bolt is not a relational database. It’s not even a document store, though you can sort of use it that way. It’s really just a key/value store… but don’t worry if you don’t really know what that means or how you’d use that for storage. It’s super simple and it’s incredibly flexible. Let’s take a look.

Storage in bolt is divided into buckets. A bucket is simply a named collection of key/value pairs, just like Go’s map. The name of the bucket, the keys, and the values are all of type []byte. Buckets can contain other buckets, also keyed by a []byte name.