RPM 中的 %config 和 %config(noreplace)

打开一个 rpm spec 文件,在 %files 段有一个指令很常见:%config(noreplace),这个指定到底是干什么用的呢?

答案是,该指令决定如果一个文件被管理员修改过后,下次更新该文件所在的rpm包时,该文件的存在状态。例如,一般升级软件时,配置文件是不会变化的,而主程序则一般需要被升级(替换)。

对于 spec 文件中在 %files 段的某一个文件,我们要讨论三种情况:

  1. 没有带 %config 指令。例如:%{_sbindir}/redis-server
  2. 带了 %congfig 指令。例如:%config %{_sysconfdir}/redis/redis.conf
  3. 带了 %config(noreplace) 指令。例如:%config(noreplace) %{_sysconfdir}/redis/redis.conf

Nginx 踩坑记(一)

1. 预备知识

Nginx 有两种定义变量的方法,一种是在模块中定义,从而成为内建变量;另一种是在配置文件中通过 set 指令来定义。

配置过 Nginx 的同学可能都知道这样一个事实:一个请求在其处理过程中,即使经历多个不同的 location 配置块,它使用的还是同一套 Nginx 变量的副本。

例如,如果有如下的配置:

1
2
3
4
5
6
7
8
9
location /test1 {  
        set $hello hello;  
        rewrite /test1 /test2 last;

}
  
location /test2 {  
        echo $hello;  
}  

虽然变量是定义在 location /test1 中,但 Nginx 变量一旦创建,其变量名的可见范围就是整个 Nginx 配置,所以在 /test2 中直接使用该变量是不会报错的。另一方面,由于变量的生命周期是与请求相关的,所以如果直接访问 /test2,得到的变量 $hello 是一个空值,而访问 /test1,则会内部跳转到 /test2,将 /test1 中赋值的 hello 打印出来。

svn log 不显示当前提交

关于svn log,我之前的工作方式一般都是这样:

  1. 执行 commit 操作时,不限平台。一般提交代码,会在 Linux 工作环境下用 svn commit 命令,提交文档则是在 Windows 下用 TortoiseSVN 客户端提交。这主要是本着方便的原则,因为代码一般是在 Linux 下编辑和测试的,文档是在 Windows 下编辑的。
  2. 执行 log 操作时,在 Windows 下。使用 TortoiseSVN 查看版本日志以及各版本提交内容变化实在太方便了。

最近由于办公环境网络的变化,在 Windows 下无法用 TortoiseSVN 连接到仓库了,只能在 Linux 下进行。这样就无法在 Windows 下看版本日志了,好在也就只是一个 svn log 命令,简单明了。但使用中还是有一个要注意的地方。

在使用 TortoiseSVN 客户端查看日志时,即使当前工作目录版本是某个历史版本,也能看到最新的版本记录情况。

程序员中的标杆人物:章亦春

这标题,怎么读着这么别扭。

接触开源软件这几年,不知不觉形成了一种印象,大牛一般都是有性格有棱角的,传说中的神人如 Linus 就不用多说了,身边的同学和同事中,技术牛人性格也一般比较桀骜。桀骜的表现之一就是不会浪费时间去回答一些基本的问题,最著名的就是那篇流传已久的论坛发帖指南了吧。

自己虽然算不上牛人,但在某些方面也会有同事来求助,碰到一些比较低端的问题,其实心里会有烦躁的。烦躁的程度与当时的心情、手里有多少活正在干等因素相关。

直到有一天我接触到了章哥。

章哥是同行对章亦春的尊称,我也无缘与章哥真正面对面接触,但文如其人,阅读他的博客,他写的文档,以及在论坛中对人的回复,就可以肯定他有着一般技术人难以企及的修养。