今天开始用ghost,发现默认主题(casper)并没有代码高亮功能,用起来相当不爽。google并看了看ghost主题的代码,找到了解决方法。
在后台找到Code Injection
,Blog Header和Blog Footer中分别加入一些代码即可。
今天开始用ghost,发现默认主题(casper)并没有代码高亮功能,用起来相当不爽。google并看了看ghost主题的代码,找到了解决方法。
在后台找到Code Injection
,Blog Header和Blog Footer中分别加入一些代码即可。
以我的ghost博客为例进行说明,我在VPS上用docker启动了两个ghost博客,还有一个Nginx做反向代理,将两个域名分别指向两个博客。
ghost:
1 | docker run -e NODE_ENV=production --name ghost1 -v /path/to/data/ghost/ghost1/:/var/lib/ghost -d ghost |
nginx:
1 | docker run -p 80:80 --name nginx --link ghost1 --link ghost2 -v /path/to/data/nginx/nginx.conf:/etc/nginx/nginx.conf -d nginx |
先启动两个ghost,然后启动nginx。使用–link参数将容器“链接”到一起,此参数会在容器中加入环境变量并在/etc/hosts
中插入一条容器名与IP的映射
1 | root@fabfd4bacfda:/# cat /etc/hosts |
许多服务在启动/运行时需要读取配置文件、环境变量或命令行参数等信息,我们可以很方便地使用ConfigMap为pod完成这些配置信息的设置与更新。通过下面的例子来了解下ConfigMap吧。
有两个文件info1
info2
保存了配置信息
1 | ming@ming-master:~/temp/configmap$ ls |
先看简化后代码,下面只列出main函数
1 | func main() { |
这么看的话感觉两个SQL应该是相同的:
1 | [ORM] - 2017-01-19 19:28:02 - [Queries/default] - [ OK / db.Exec / 1.2ms] - [SELECT COUNT(*) FROM test WHERE create_time > ?] - `2017-01-19 00:00:00` |
我在本机测试OK,但在另一个环境SQL是这样的:
1 | [ORM] - 2017-01-19 11:30:43 - [Queries/default] - [ OK / db.Exec / 1.2ms] - [SELECT COUNT(*) FROM test WHERE create_time > ?] - `2017-01-19 00:00:00` |
相差8小时,第一时间想到时区问题,去有问题的环境一看果真如此。
我们经常会在一些程序的输出中看到程序版本、编译时间、Git的commit id等信息,比如docker
1 | ming@vultr:~$ docker version |
我们可以提供一个配置文件version.conf
,程序运行时从version.conf
取得这些信息进行显示。但是在部署程序时,除了二进制文件还需要额外的配置文件,不是很方便。
或者将这些信息写入代码中,这样不需要额外的version.conf
,但要在每次编译时修改代码文件,也够麻烦的了。
有一种更好的办法是在编译时使用参数-ldflags -X importpath.name=value,官方解释如下
-X importpath.name=value
Set the value of the string variable in importpath named name to value.
Note that before Go 1.5 this option took two separate arguments.
Now it takes one argument split on the first = sign.
1 | scp复制多个文件,并且不需要输入yes |
有如下函数,简单来说就是有错误则直接返回,没错误则执行f
函数。
1 | func (t *transaction) Do(f func()) *transaction { |
函数很简单,但如何测试呢,简单但丑陋的方法:
1 | func Test_func(t *testing.T) { |
如何保证在一个goroutine中看到在另一个goroutine修改的变量的值,这篇文章进行了详细说明。
如果程序中修改数据时有其他goroutine同时读取,那么必须将读取串行化。为了串行化访问,请使用channel或其他同步原语,例如sync和sync/atomic来保护数据。
这是一篇非常入门的文章,让你大概了解一下etcd。写这篇文章时使用etcd的版本是3.1.0。
etcd是以实现共享配置和服务发现为目的,提供一致性的键值存储的分布式数据库。kubernetes等项目使用了etcd。
去这里下载release包,解压后是一些文档和两个二进制文件etcd和etcdctl。etcd是server端,etcdctl是客户端。将etcd和etcdctl加入PATH路径方便我们执行命令。
执行命令etcd,即可启动server
1 | ming@ming:/tmp$ etcd |
说明:etcd最新的API版本是v3。与v2相比,v3更高效更清晰。设置环境变量ETCDCTL_API=3。
1 | ming@ming:/tmp$ export ETCDCTL_API=3 |
put
设置key,get
取得key
1 | ming@ming:/tmp$ etcdctl put msg "Hello TenxCloud" |
del
删除key
1 | ming@ming:/tmp$ etcdctl get msg |