2013 没那么简单

音频片段:需要 Adobe Flash Player(9 或以上版本)播放音频片段。 点击这里下载最新版本。您需要开启浏览器的 JavaScript 支持。

一年过去了。去年的今天,杭州飘着大雪,像我那时冰冷的心。就连呼吸都好难受。

2013-1-4-winter-snow
(拍摄于2013-1-4 杭州嘉绿苑公园)

这一年,我知道过去的事情改变不了,所以我一直在寻找快乐的含义,却在今天,再次翻开一年前看到的那个邮件,放声痛哭。我想如果我给自己去年的计划打分的话,大概3.25吧。

是的,没那么简单。

2013年,我越发的喜欢黄小琥的这首歌。

2013年,我试图调整自己的心态,却渐渐的变得暴躁不安,还好再一遍一遍地告诉自己要淡定的时候,终于渐渐平息。

2013年,包括这刚刚的2014年,我错过了多少重要的日子,但那又如何。

我想,我的一年大概要从这天算起。所以,在今天我决定改了blog的title后,像往常一样,写个总结。前面已经说了一些,那就继续吧。

年底的一天,跟大伯走在万塘路上,我说,今年最开心的就3件事。一件事是在6月14号娶了个“小老婆”,而且是我很喜欢的。第二件事给小老婆选了个很好的车牌。虽然这个车牌于我无任何含义,只是好记看起来霸气些。第三件事就是年底晋升了。

说实话,真的很感谢大伯,在我最苦闷和彷徨的一年里给了我这么多的陪伴。生命中得此一知己和好友,实在是人生大幸。

我跟大伯说,这三件事其实有很多幸运的因素在里面。买车的时候,因为这车销量太好,订的人又多,很多一起订的人都是几个月之后才拿到,但我两周不到就拿到车了。周五选车牌的时候,也正好因为系统故障,导致我才有两天时间在家里慢慢选。晋升的时候,原本以为我同组的另外一个同学希望更大,但恰恰相反。

想了想,上帝是公平的。

2013年,总是不安,只好强悍。

好在双11和双12特别忙,再加上双11之前为购物车重构也特别忙。才能让我暂时远离不安。

从春节回来就开始健身,坚持了很久,除了双12那段时间太忙中断过,临时改成了打乒乓球。不为其他,只为自己身体更好。也搬了家,公司也搬到新厂,也算不用其它方式换了一个新的环境。

9月开车带着大伯、脑残方和他妹纸、土豪夏去了趟横店。

国庆跟着大伯和伯母,土豪夏和小鱼儿、脑残方去了趟嵊泗,再一次坐船,也再一次在漆黑的夜晚,在细细的沙滩上,看着浪一波一波打上岸来,听海哭的声音。

2013年,不想拥有太多情绪。

渐渐的,对很多事情看得淡了。晋升了,厂给配了rMBP,带小师弟,当懒懒会长……也不会像小时候这么兴奋了。希望自己能够渐渐地有一个平淡的心。不以物喜,不以己悲。

我试着让生活变得清淡,对幸福或寂寞顺其自然,偶尔傻傻孤单,偶尔傻傻浪漫,不怕大喜大悲那么难负担。不想再背负太多期盼,对好奇或关心顺其自然。

只是那点不安,只是那点心酸,总会忽然扩散,让心又累又茫然。

2013年,说实话,没有太多可圈可点的地方,有的都是不愿意提起的记忆,以及不断在苦闷中的挣扎。

但即便这样,我也怀着对未来的憧憬。因为经历过2013,让我懂得,没人知道明天会发生什么,有时候早上醒来,望着从窗帘透过的阳光,便对新的一天满怀憧憬。虽然我知道有些事情比中了500万还难,但依旧不愿放弃希望,每天都会期待更美好的一天。哪怕是悲惨或抑郁的一天,也值得,因为那是注定的。

2013年底的那个周末,快到元旦那天,天气甚好,我一个人去了趟西溪湿地,走在寂静的林荫小道上,想了很多。我还踮着脚思念,我还任记忆盘旋,我还闭着眼流泪,我还装作无所谓。

2013-12-28 15.16.48
(拍摄于2013年12月28日 杭州西溪湿地)

耳机里不断循环着那首我很爱唱的《老男孩》,但愿若干年后,当我成为一个老男孩的时候,不会只剩下麻木的没有了当年热血的我。
2014年,我祝愿自己能够快乐一些,继续加强锻炼。工作上能够更上一层楼。祝我外婆身体渐渐好转。

2014年,对我来说,也非常重要,因为在工作上,写代码已经不是最主要的了,需要考虑团队,考虑怎么推动一些事情,考虑……总之,我感觉对我以后的事业会有很大的帮助。

趁年轻,好好奋斗吧。

有时候,我会觉得,今年买车真是个正确的决定。当没有什么可以留恋的时候,我就一脚油门,去我想去的地方。

最后,还是用《没那么简单》结束吧。

幸福没那么简单,才会特别让人着迷。
什么都不懂的年纪,
曾经最掏心,所以最开心。
曾经。 (497)

[DIY]不拆卸轮子用plasti dip对轮毂和卡钳进行改色

前言

老毛病又犯了。。。有新东西就想改装。。。

本来是想直接换个轮毂算了,但是发现在国内很难买到一些好的正品的轮毂,即使是仿的,也要七八百一个,四个换下来就要3k+了。如果再想换个大尺寸轮毂,轮胎也要换,那就得好几千了。再加上轮毂换下来也没地方放,纯属浪费。

恰巧在公司赛车群里面听到一哥们说有种油漆喷膜,叫plasti dip,美国产的,很好用,成本低,而且不喜欢的话可以直接撕掉,我想天下哪有那么好的事情,便问他要了链接。一看还真靠谱,就买了3瓶黑色的+1瓶红色的。都是亚光色。黑色喷轮毂,红色喷卡钳。其实本来想喷个更骚的颜色,想想反正不是啥好车,还是低调些好。

过程

准备

首先当然要到淘宝上购买。因为买的多,店主送了一个手动喷枪和口罩。

因为我不想把轮子卸下来,如果有条件的话,卸下来喷可能会方便一些,但是我考虑到卸轮子麻烦,安装麻烦,而且安装完还得到4S店做四轮定位,肯定不如原厂的好,毕竟我这也是新车,就不卸了。在youtube上找了几个plasti dip官方人员录制的视频,有教不拆卸轮子来喷漆的。其实我自个儿看的也不仔细,大概怎么喷的自己知道就好了。

唯一不好的是没有人教怎么不拆轮子喷卡钳的。看来只有自己动手了~哈哈,这正是我喜欢的。

我准备了N多张报纸+广告纸,店家送的口罩,手动喷枪,一盆水,抹布若干条,厨房用的大号垃圾袋若干,花露水一瓶(楼下花园蚊子很多),我又在他家买了油漆胶带,建议准备一副手套(我忘记准备了,结果吃亏了,不过还好)。

基础知识

喷的方式很简单:总共喷4~5层,第一层覆盖50%的透明度,第二层覆盖80~90%的透明度,第三层可以完全覆盖了,第四层要喷的很全了,第五层就修修补补~如果第四层已经喷的很好很厚了,第五层也可以不要。

每层喷完等干了再喷下一层,一般天气热的话,5~10分钟基本就干了。

具体可以看这个视频:http://www.youtube.com/watch?v=OlyB3FbYRRs

喷之前,先使劲摇晃瓶子一分钟~3分钟,否则喷出来的都是大个的油漆珠,很难看的。晃完之后,对着报纸喷一下,看看油漆是不是很细很小的颗粒,如果还有大个的油漆滴,再继续晃,如果还不行(尤其是天冷的时候),就用温水泡一会儿这个瓶子。直到喷出来的都是很细很雾的那种感觉,这样才能喷的很完美。

晃完之后,保证每次喷出来的都是雾状的,然后喷的时候,一定要离得远喷,不要离得近,否则会喷的很厚很难看。

还有个准备工作是在轮子下面垫上报纸,因为油漆很容易喷到地上,保护环境,从你我做起。

喷卡钳

天工作美,杭州连续下了一个星期的雨,正好在周末放晴,而且还挺热。

因为卡钳在里面,肯定要先喷卡钳,如果先喷轮毂的话,卡钳就没法喷了,因为很容易喷到轮毂上,而且喷好的轮毂,如果贴油漆胶带的话,一撕很容易把喷上去的漆揭下来。。。所以必然先喷卡钳。

因为轮毂总是会有一部分挡住卡钳,所以我发明的不拆轮子喷卡钳的诀窍就是靠轮子的转动换位置喷,建议两个人合作比较好,一个人也可以,就是稍微麻烦些。

首先,先用油漆胶带把轮毂的一个洞洞周围都包好。如下图所示。然后对卡钳这部分进行喷漆,记住上面的喷漆原理,第一层喷50%的透明度就好了,因为卡钳很靠里面,如果离得近喷的话,第一层会喷的很厚,所以一定要离的远喷。然后放下手刹,用手推车子,相当于转动轮子,这样,本来被轮毂遮住的部分就会出现在刚才包好的洞洞里面,继续喷,直到把整个卡钳喷完。如果是两个人合作就更好喷了,一个人慢慢推车,一定要很慢(当然这个速度需要喷的人来指挥掌握),另外一个人就可以不停一直喷了。第一个卡钳的第一层喷好之后,在等待油漆干的时候可以喷第二个卡钳,自己要记得每个卡钳已经喷了几层就好。

用胶布把一个洞洞遮住

接下来的就是重复这个工作,知道喷完5层,等待卡钳晾干。

每次等待卡钳干的间隙中,可以用抹布去擦轮毂,要擦的很干净很干净。其实擦不干净也没事,我只是个追求完美的人而已。。。

如果喷卡钳的时候,不小心喷到轮毂上,没关系,趁油漆没干就用湿抹布擦掉即可。哪怕你擦晚了,也没关系,等油漆干了,用指甲一抠就掉了。

全部喷好之后,可以轻轻把周围的胶布撕下来:

把胶布撕下来

卡钳喷好的效果(我喷的有点厚):

喷好卡钳的效果

喷轮毂

好了,卡钳喷好之后,开始喷轮毂吧。记住一定要等到卡钳很干了再喷。现在,我们准备的厨房垃圾袋就排上用场了。因为厨房垃圾袋是长条状的,很适合用来保护卡钳。按照下图所示的方法用厨房垃圾袋把卡钳套住,我用了两条正好,一定要盖得很好,当然你也可以用胶布把两个垃圾袋互相连接好,防止掉了,其实根据我自己喷的经验,喷轮毂的时候不需要转动轮子,所以这垃圾袋不会掉的。

至于轮胎部分,不需要遮挡的,待会儿告诉你为啥。车身可以用报纸遮上,如下图所示。

准备喷轮毂

好,开始喷,喷轮毂就简单多了。按照上面的方法喷5层就好。放心大胆地喷,喷到轮胎上没事的。下面这张图是我喷完3层的效果。

喷完3层的效果

喷完四层:

喷完4层

喷好之后,因为我喷的是黑色的,所以喷到轮胎上的看不出来,如果你喷的是其它颜色的,轮胎上肯定也是那个颜色,不用怕,等油漆干了之后,用指甲抠起一小块,慢慢揭下来吧!这就是这个油漆的强大之处,不喜欢了,直接揭下来,就是一层膜,不好意思,当时忘记拍照了。

这是完整喷完轮毂的效果,这个时候,等轮毂差不多干了,就可以慢慢把里面的厨房垃圾袋抽出来了:

喷完轮毂

收工

终于完工啦,我从下午1点半开始动工,一直弄到下午6点半,除了推车的时候有人帮忙,其它时候都是自己弄的。还好,今天是晴天~给大家提供几张效果图,我也是第一次喷,所以经验有限,高手轻喷:

后轮效果

整车效果

整车效果照片拍得不是很好,实际上效果还不错,回头给大家补上照片。

最后,提供一下相关工具的购买地址:

plasti dip:淘宝购买地址

如果有问题,欢迎留言。

后记

我喷完第二天也是晴天,卖家的建议是隔天宜洗车,如果您怕第二天下雨,建议用车衣遮上。从第三天开始,杭州就连续下了一个星期的雨,但是喷漆很牢固,一点问题都米有~所以大家尽管放心喷~ (809)

阿里云云服务器两周年的点滴

前言

最近接到阿里云的电话,说我已经是阿里云的老客户了,已经用了阿里云两年的服务了,让我写点东西。两年,我身边发生了很多很多事情,两年,真的好快,却也好漫长。所以,虽然我之前写过阿里云的评测,但既然是个这么重要的日子,又临近淘宝十周年,是该写点东西纪念下。不过,我保证,会用一个客观公正的角度,从我这个“老”用户的角度来给大家介绍一个真实的阿里云。而且,更多的是讲故事。

我与阿里云

相识

虽然这部分之前写过,但为了文章完整,我还是再写一下吧。

阿里云是2011年5月开始出售云服务器产品的。我很有幸作为第一批用户使用了阿里云的产品。当时正值我要离开校园走入社会,再加上我也想把自己的橘汁仙剑网搬回国内。那段时间,国内到国外线路各种不稳定(当然,即使现在也不稳定),我在阿里云之前也尝试过linode,linode是好的没话说,但是还是线路问题,没法给用户提供稳定的访问速度,试想,当你访问一个不起眼的网站的时候,经常上不去,或者打开很慢的时候,你下次还想来么?而且,当时我对比了一下阿里云和linode的配置。当时阿里云最低款的是现在的标准A套餐(1.5GB内存,150GB硬盘,2M带宽后来提升到5M),1990元/年,linode最接近这个价格的是套餐是最低的配置:512M内存,20GB硬盘,200GB流量(当然linode十周年的时候提升了不少),这性价比,再加上阿里云是阿里巴巴旗下的公司,肯定有保障,不会像小的VPS商轻易跑路,所以,我当时一咬牙,买了一年,现在想想,真是太划算了(毕竟现在涨价到3990元/年了)。当时有些站长很聪明,一下子续费了好几年。

相知

我的第一台云服务器是购于2011-5-25日,当时不如现在乐观,可选的操作系统很少,linux只有red hat可选,而且是装的很齐全的带桌面的red hat。我买了之后,先是删除各种不用的组件、桌面环境,然后配置服务器环境。因为我本身对linux还是非常熟悉的,所以配置起来也没花很久,顺利地就把自己的网站迁移过来了。当然,为了保险起见,我没有把域名解析过来,只是自己本地通过绑定host的方式来测试。

然而第二天,很杯具的事情发生了,因为我更新了系统的内核,导致重启后,云服务器肿么都启动不起来。然后后台提交工单,很快就有客服联系了我,因为当时云服务器刚开始销售,客服对这些也不是很了解,最后弄了很久,没办法,只能重置系统。。。然后再配环境。还好我没有把域名解析过来,可见一定要事先测试啊。其实配环境很快,时间主要是花在迁移数据上,毕竟国外往国内传数据,速度不是那么快。

因为之前那次没有找到原因(都没有想到是内核升级的缘故),我以为是我哪里的环境配置错了导致的。然后我继续升级了内核。。。不过这次我没有重启,测试环境没有问题之后,直接把域名解析过来了。刚解析过来之后,网站访问速度一下子提升了一个档次,会员普遍反映网站打开快好多好多。我当时心里真开心啊~

相处

然后,就用了很长很长的时间,期间也通过各种方式给阿里云提了好多的建议,也找到了当时为啥启动不起来的真正原因,现在,如果你不小心升级了内核导致启动不起来,工程师可以直接帮你修复。之前提的很多建议,阿里云也一直坚持在改进,比如增加可选系统,比如配置变更等。

但有一点到现在感觉还是个坎儿。就是磁盘IO。

虽然一开始就发现了,刚开始的时候,我开了MySQL的主从复制,从服务器是AWS的机器,也是因为跨国网络传输的原因,但之前一直运作很好,突然有一天,我收到报警,网站打不开,进去服务器一看,load奇高无比,都飙到了100+,然后io wait也奇高无比,但cpu、内存都正常,所以很明显是IO问题,后来经过我仔细排查,发现确实是MySQL写入bin-log卡住,我就暂时关闭了bin-log,因为网站本身访问量不大,所以还OK。

后来磁盘IO问题被大家广泛提及,所以阿里云也推出了RDS等服务,其实就是变相给你一台能基本保证磁盘IO的服务器专门跑数据库而已(当然这个服务器不受你完全控制),不过可喜的是,一直都见到阿里云在努力改进底层架构,毕竟这种问题不是一天两天就能解决的,虽然这个问题至今还让我很头疼,但是我也理解。

最近几天也是,因为一些原因,我又开启了MySQL的bin-log,还特意把bin-log放到了另外一个硬盘上,但是还是经常偶尔出现磁盘性能突然下降的情况,但另外一台云服务器就没有,猜测可能硬盘不是在同一个“区域”的原因。

还好我自己启用了redis,利用内存的高速缓存来缓解MySQL暂用大量磁盘IO的情况。不过如果网站访问量大了,还是一样会出问题。

这个,我想博客园最有发言权了,毕竟他们网站访问量很大,迁移到阿里云的过程中遇到了不少问题,大家可以看看他们总结的经验:http://www.cnblogs.com/cmt/tag/%E9%98%BF%E9%87%8C%E4%BA%91/。说实话,真的很欣赏博客园这种分享的精神,把自己使用云计算的痛写给大家,给后人激励,给阿里云参考。

相“爱”

说实话,这个小节的标题似乎不太恰当,但也确实能表达我作为一个老用户此时的心情。本身我自己的网站还不大,所以磁盘IO问题对我来说还是偶尔的痛点,相比较阿里云其它的优点,我还是非常喜欢阿里云的。毕竟人无完人,更何况也看到了阿里云改进的决心和进步。

至于阿里云的优点,其实我前面的博文有非常详细的介绍,这里只是简单地罗列一些主要的优点,更多的优点,等你自己去发现:)

  • 稳定:这点毋庸置疑,阿里云SLA肯定在99.9999%以上,毕竟我是从阿里云最开始售卖云服务器就开始用的,给大家截取我当前最老服务器的uptime:uptime,中间的重启,都是我自己重启的~
  • 访问速度快:这点也几乎毋庸置疑,从监控宝和腾讯分析的访问速度统计来看,是非常不错的,我想每个用阿里云的客户都会觉得阿里云的BGP线路确实很赞,毕竟阿里集团下面的网站用的线路不会差:)
  • 备案迅速:至少我自己是的,基本上每次备案一个新站,一周内基本下号。自己保证资料正确,邮递过去材料,很快的。
  • 客服给力:客服响应速度太赞了,而且半夜也有资深的工程师值班,能快速解决你的问题。
  • 配置合理:现在都能自定义配置了,多赞啊~
  • 性价比高:这个价钱,无论是相对于linode还是aws,性价比都是不错的。
  • 各种附加服务:SLB(负载均衡)、RDS、OSS、云监控,云盾,都是非常赞的服务
  • 快照:快照服务基本上是非常非常非常赞的服务,能快速备份和恢复,如果您还没用,赶紧试一试,AWS也有的。

阿里云,我想对你说

写到这儿,已经基本上把我想说的都说的差不多了。真的非常荣幸成为阿里云的第一批用户,见证了阿里云一路走来的艰辛和决心。所以,这里也借地儿给阿里云提一些建议吧。

其实我最想提的建议还是磁盘IO的问题,有时候这个真的很让人发疯,又没有合适的解决办法,总不能老是迁移集群或者是加内存加机器吧。我能给的建议有:

  • 优化底层架构:虽然这是一个漫长的过程,但是我相信阿里云工程师的实力,AWS能把这块儿做得很好,那你们也可以。
  • 提供高磁盘IO的磁盘购买:这些可以通过一些硬件等方式解决,可以提高一些价钱
  • 快照能选择恢复到哪个硬盘:比如我可以把一个配置好的系统做成快照,然后恢复到一台新机器上去。或者可以像linode的stack script、aws的自定义镜像等功能那样也可以。
  • 硬盘可以删除、扩充大小:删除应该好做,扩充大小,我不是很清楚好不好实现,不过删除功能我想应该是必要的,也不是很清楚为啥现在限制购买3块硬盘。
  • SLB希望支持自定义错误页
  • 一些细节优化:比如尽量减少出现云服务器id,磁盘的id情况,很多情况下,这些ID都是一些不规则的字串组成的,比如云磁盘id:1007-70011111,看了这个id,我根本不知道是哪块儿硬盘,尤其是账号下服务器很多,磁盘也很多的情况,只能去猜测这个磁盘是哪个,经常弄错快照等情况。这些用户体验的细节都可以优化。

总结

很庆幸,阿里云陪我的网站们走过了两年的时光。阿里云,感谢有你。前方的路还很长,请不要停下你前进的脚步。祝阿里云成为国内最优秀的云计算提供商。
(1319)

2012 我的世界末日

我喜欢坐高铁。因为我喜欢这种速度。

曾记得以前在川大读书的时候,每次回家都是2夜1昼的卧铺车。我就喜欢坐在窗户前望着窗外发呆,想着我该想的人,我该想的未来。有时候,也会翻翻书,解解闷。

后来来杭州工作,碰巧家里也通了高铁,从杭州到家只要不到4个小时,还很是庆幸选了这个城市,刚好中点。

自从来杭州一年多之后,大概也就回家两次,一次是上次过年,一次是12年国庆。每次都是高铁回家,每次也都看着窗外飞速退去的景色,发呆。

呆得够了,就掏出ipad,看书。因为,我也想像高铁那样,不停。

但这次,我却无心看书了。去年这时候,隐约记得看的是乔布斯传,而现在,却突然想写点什么。打开电脑,却又颇为犹豫,不知道该不该写。前些日子刚翻过自己以前的日志,猛然看到11年写的那个20岁的计划。却忽然意识到自己去年却少了这么份总结和计划,大概去年这时候只是写在了心里吧。那这次,再为自己写一次。

又读了一遍那篇日志,没想到不经意间,20岁给自己的愿望却已悉数实现——

东升申请到了很好的学校。知道这个消息之后,我便在各大SNS上疯狂炫耀,之前也是逢人必吹,每次亲戚朋友问起,便毫不客气地把各种排名数据再罗列一遍,然后在他们羡慕的眼光里面偷着乐。这件事,大概是2012年我最开心的一件事了。比我拿了几个iphone5的奖品都高兴。

再说我自己,在公司也还混得不错。因为从来没有给自己定义过不错的范围,大概也是相对的还好吧。11年7月正式入职,12年5月顺利晋升。看来第一年没有白努力。

在淘宝第一年,我负责的是淘宝跳蚤街的前端开发工作。在淘宝,一个人负责一个业务的情景很常见,毕竟前端资源是比较匮乏的。当时跳蚤街项目组里面,只有我一个前端,却有4个Java开发工程师,跟着他们一起把跳蚤街从无到有,从小到大,很有一种创业的感觉。也是我做业务最激情的时候了吧。

11年底,我参加了淘宝实验室的比赛。结合自己的跳蚤街业务,做了一个一键转卖的插件。用户启用后,可以很方便地在我的淘宝里面,把自己购买过的商品发到跳蚤街上,作为二手商品出售,而且不需要你填过多的内容。这个只花了一个晚上,只有不到100行代码的插件让我得了一等奖,短短一个月,订阅数已经突破70w,远远甩掉第二名。接着,各种老大的表彰邮件,各种奖励接踵而至。一等奖奖励了个ipad2,然后新业务部奖励了一个iPhone4S,我另外一个参加比赛的插件得了二等奖,又收了一个itouch4。碰巧,3个都是白色的。也是那次比赛,我从一个还在用东升淘汰下来的Nokia的屌丝,瞬间成了有苹果的屌丝。至今,我还仍旧觉得,乔帮主走之前的那些产品,大概真的是Apple的巅峰了吧。同样,至今,我还深刻地记得,当时比赛现场角逐的时候,面对评委从容淡定的我,以及在后面给我加油的东升和跳蚤街的同事们。

11年底,我也得了前端最佳精英奖,奖品也很简单,就是去参加了上海的Google Developer大会以及一块放在我工位上吸了不少灰的奖牌。

12年上半年,因为在各团队项目里表现还不错,加上11年的一些成绩,年中顺利晋升。

12年下半年,团队组织架构调整(阿里是个很喜欢拥抱变化的公司),这对我来说也是一次选择。大概感觉做跳蚤街,从技术上来讲,已经没太大突破了,加上一些其他原因,我选择了一起变化,离开跳蚤街,也因此被主管调到了淘宝的核心基础应用——购物车。购物车这种核心应用,业务复杂,逻辑复杂,责任也大。因为,你稍微一点疏忽,可能就是P1故障。

但自从调过来之后,工作更不忙了,虽然在跳蚤街的时候,也是朝九晚五,但现在,很多时候上班也很少做业务方面的工作了,大部分是团队的工作,或者是自己学习。我想,我大概是程序猿里面比较另类的人吧,因为没加过班的程序猿怎么好意思叫程序猿?

12年,也是参加了一些公司的比赛和活动,奖品还好,拿了几个阿里云云服务器的现金券,总值大概1w左右,所以我其中一台服务器已经续费到了16年。。。貌似还有一个阿里云的手机,不是很感冒,至少有一个android了。印象比较深的就是12年底参加的工程师之夜比赛,是做个移动应用。我很有幸拿了个3等奖,iPhone5,就在前两天刚颁过奖。

除了自己技术上的进步,自己在12年还学会了一个很重要的技能,做饭。虽然水平还比较差,但一直都在坚持去做,每个周末,最喜欢的事情不再是蹲在房间里面写代码,而是在去超市的路上里,翻着各种菜谱应用,看看今天有什么新花样可以试一试。

写这些却也没有炫耀的意思,只是觉得大概能证明我当年的愿望已经实现。荣耀也好,奖品也罢,现在对我来说,都已经不那么重要。因为我写这些的时候,已经没有当时得奖的时候的那种激动与兴奋。因为——

13年初,也就上个月,公司内部搞了一个秒杀活动,是一些淘宝质检的抽检商品。我有幸秒杀到了一个LV totally(后来跟另外一个秒到的同事换成了neverful),当我拿到那个LV的时候,同事一个一个围上来一个一个地摸,我却很淡定,因为,我知道,能用钱买来的东西真不是东西,有些东西,不是几个LV就能相提并论的。

是的。也许是我太过于顺利,上天还是对我做了惩罚,很重的惩罚。在2012年12月21日来临的前几天,我突然有种莫名其妙地恐惧和不安,虽然我知道世界末日只是玛雅人的传说。但没想到,我的世界末日还是降临在了我的头上。

那种电影里面的镜头,大概只有亲身经历过才能体会。

感谢臀哥,感谢大伯(),感谢啊呜(),感谢我的主管春哥,感谢我自己,你们把我拉上了方舟,让我终于能喘口气而不被灾难吞噬。啊呜是个很好的listener,大伯则是个talker,他能理性地帮我分析。总之,非常感谢你们。

曾经的未来离我这么近,这么的清晰,这么的现实,却一下子被无尽的黑暗笼罩。曾经对未来美好的憧憬,却已经化为流不尽的泪。也就是那几天,我经历了人生的大悲到大喜,然后瞬间再到大悲。那种感觉,就像我现在每天早上醒来,却发现自己被黑暗笼罩,怎么都等不到天明。

我想,我大概是个很固执的人吧。大伯把我定义为理想主义者。因为在我的字典里,没有放弃两个字。我喜欢仙剑,最爱的却是云天河的一句话:我命由我不由天。从小到大,从没轻言过放弃,因为,我始终坚信,努力了才不会让自己后悔,哪怕只有一丝的希望。哪怕最后我和云天河一样,仍旧被上天惩罚,那我也心甘情愿,至少我为之努力过,哪怕是不切实际的幻想。但我,不悔。

这次末日的到来,我彻底崩塌了。但也许正因为旧的我已经不在,我才可以重新塑造一个全新的我。虽然我还是那么固执和执着,但经过无数次地公园漫步,经过无数次的挣扎,我终于意识到自己的缺点和错到底是什么,而不是别人简单的一句总结。大概,只有经历过刻骨铭心的教训和痛才能得到人生宝贵的经验吧。

曾经,有些人劝我,曾经,我也在人人或者知乎上寻求答案。但是,我后来放弃了。I will handle it in my own way.

曾经,我在人人上看着别人分享的一篇篇文章,每次都是看到一半,就关掉了。因为,我知道,那是别人的故事,我的故事,我自己来写。

人,大概总是在伤痛中成长和奋发,过于平坦的道路,也许只会让我低迷。

我不知道什么叫做真正站起来了,但我知道我变了。比如我的作息,比如我的缺点,比如我的意志,比如我的目标,都在改变。我不再像程序猿那样喜欢熬夜,却每天能准时早睡早起。也感谢每天的梦,都能准时把我惊醒(如果每天能稍微晚一点就更好了。。。),每天,都时刻提醒自己要努力要奋进;每天,都给自己施加压力;每天,都强迫自己做一些以前本来不愿意做的事情。因为,我知道,如果还是以前那个我,那世界末日还会再次光临我的世界。

2013 might be a tough year for me. But I never lose hope.

我给自己定下了一个目标,我会让自己变得优秀,用一个单词来说:Stronger。这个词我很喜欢,我本身是个完美主义者,但我却不相信perfect,而愿意相信strong。Strong这个词,可以理解为坚强,也可以理解为强大,这都是我接下来要做的。

我并不是个优秀的人,本身我不帅,也不算非常高(还差2cm到180),家庭无任何背景,现在也没车没房。虽然前三点我已经没法改变,但我相信自己有足够强大的内心和足够坚定的信念,作为我这辆车的燃料,不断推着我前进,把我能够通过我努力做好的部分做好,剩下的,尽管我不相信天意,却也只能让天意来定。

这兴许也不能作为一年的目标,因为一年也许真的过于短暂。新的一年我也有一些目标,但是因为一些原因,恕不能在如此public的地方告诉大家,也许,明年这个时候,我还会来,反思我这一年做的事情。突然想起来如果按照身份证上的生日,我也马上要22了,实际上我已经22岁半了。如果按照天朝法律,我现在却竟然还差20天才到法定结婚年龄。不过想起这个,却越发觉得时间,其实真的不够用。

是,既然时间不多,便该收拾行囊上路了。所以,我喜欢高铁。 (1918)

好用的CSS模块化打包工具CSS-Combo

上半年在团队做自动化之类的工作,也学习了NodeJS,确实,NodeJS很适合做一些小工具神马的,今天我给大家介绍的就是我自己基于NodeJS写的CSS模块化打包工具:CSS Combo,项目地址:https://github.com/daxingplay/css-combo

说起模块化,前端一般谈JS模块化的居多,毕竟JS是编程语言,比如业内的seajs、KISSY loader等,都有很成熟的模块化规则和方案了,前端工程师可以采用模块化的方法去编写页面,打包,上线,但是CSS界却没有。

后来,CSS界出现了SASS、LESS之类的语言,这些语言的出现可以说是非常应景的,有一点很重要,拿LESS举例,less支持了模块化,你可以@import ‘xxx.less’的形式导入其他less文件(模块),方便模块化。我也正是从这点得到了灵感,想出了如何去做css模块化。

CSS模块化

其实,CSS规范里面就已经提到相关内容了,就是@import语法。这个语法是被当前主流浏览器(当然包括ie6)原生支持的。具体怎么用我想我不用在这里浪费大量篇幅给大家介绍语法,大家可以看下mozilla里面对@import语法的解释(链接),为啥大家很少用呢,大概很大一部分原因是因为steve的这篇博文。确实,如果在生产环境单独去用@import,会有较为严重的性能,而且不同的浏览器以及不同的用法下也有不同的表现,比较让人郁闷。但是,这并不妨碍@import成为CSS模块化的利器。

想必@import诞生就是为了解决css模块化的问题吧。我们先来举一个例子看看CSS模块化的优势:

传统的开发

假如你要开发某大型网站首页,那html的head里面应该是这样引用样式的:

	

为了页面上比较好的性能,减少创建http请求的消耗,我们一般会选择尽量减少link的css文件数量,假如本例中,页面上所有的样式都写在了style.css里面。可想而知对于一个大型网站来讲,这个文件会有多长多长多长长长长。。。。如果出现bug或者想改个东西,肯定找半天;而且现在界内对于CSS开发并没有很成熟的最佳实践或者约定可循,很多时候,前端为了加快进度,可能会把某一个功能的代码放在css不同的地方,如果想下线某个功能,肯定不敢乱删。

这时候,CSS模块化的优势就体现出来了!

模块化开发

页面不改,我们还是只引用那一个样式,style.css,但是文件内容改成下面的:


/**
 * xxx页面入口样式文件style.css
 */

@import './utils/base.css';

/*页面基础框架(骨架)*/
@import './mods/layout.css';

@import './mods/header.css';
@import './mods/nav.css';

/*首页焦点图*/
@import './mods/flash-pic.css';

………这里省略诸多模块………

@import './mods/footer.css';

这里,我们把style.css中混乱的样式划分成了一个一个的子文件,作为模块。可以看到,作为示例,我把页面的一些reset样式以及一些站点公用样式放在了util目录下的base.css中,把页头拆分成header.css,把首页焦点图的样式单独拆分成falsh-pic.css,把页面的基础布局都放在了layout.css这个文件中。然后相应的代码就在对应的模块中写,是不是看起来简洁、好维护很多?

不光是简洁,使用@import形式的模块化还有下列好处:

  1. 浏览器原生支持。这点是这个工具或者这种模块化形式的亮点。对于less,想要在开发环境下方便地修改,还需要额外引入一个js文件,或者采取less实时编译之类的方法。对于实时编译,像我这种用idea编辑器自动保存的人很蛋疼,每次自动保存的时候less编译报错。。。而采用这种@import xxx.css文件的方法,我们可以很方便地在开发阶段,直接调试。不需要引入额外的js文件去解析style.css文件。页面中直接引入style.css文件,通过http瀑布图可以看到,base.css、layout.css等被一个一个加载进来了。
  2. 方便下线某个功能。这个是所有语言模块化的优势,比如哪天PD说,首页焦点图那个地方我想换个样式,以往,我们很多都是直接在html里面改掉原来的class,然后在style.css里面直接加上新的样式,老的也不敢删,怕删错了,即使删了也可能会漏,因为不停的bugfix可能会导致代码乱写。而采用模块化的方案,我直接把@import ‘./mods/flash-pic.css’这一行注释掉,然后再@import新的样式,这样,即使上线了,PD说效果不好,想换回原来的,只要改一下注释,重新打包,岂不是很方便?
  3. 便于管理各种日常需求。好,页面做好了,上线了,PD今天脑袋抽风,说我要加一个功能,首页右侧加一个建议反馈入口,以往,我们要打开style.css,想想在哪儿加好,或者直接加在最后,也不管最后的地方是放什么的。采用模块化之后,我们在style.css的最后再@import ‘./mods/feedback.css’即可,然后加上注释:/* 2012-12-06 PD要求加上建议反馈 */,这样以后其他修改者也能快速知道你这个模块是干神马的。
  4. 方便合作开发。这也是所有语言模块化的优势。对于一个大型项目,往往共同开发一个文件,冲突的可能性非常大,很多情况下,我改了一个小地方,提交上去就冲突了,然后再花费比bugfix多10倍的时间去解决冲突,然后还不知道会不会产生另外10个新bug,而模块化,每个人负责哪些模块,职责非常明确,不容易出现问题。
  5. 依赖写在入口文件,而不是打包脚本的配置文件。这样开发和打包分离,新加、减少模块不需要去修改打包配置,方便多人协作
  6. 方便调试,这是非常重要的特点,我会在后面详细阐述。

好,说完CSS模块化,以及如何利用@import形式来组织自己的模块,大家是不是感觉这种形式让你眼前一亮呢?慢着,steve大牛不是说这种@import方式有性能问题么?

是的,如果这样开发完直接上线的话,页面会有一些问题,我就不拿steve的博文再说一遍了,感兴趣的同学可以自己去看看大牛的文章。我就挑一些比较明显的问题说一下:

  1. 因为@import的文件是额外请求的,所以页面加载的时候会有一小会儿的裸体(样式没加载进来),要等这些模块一个一个加载
  2. 请求数太多,页面性能不佳,对服务器压力也会相对大一些。
  3. steve大牛提到的不同的浏览器以及不同的书写形式可能会有不同的加载顺序。

所以,最好的办法就是把模块打包!这和js模块化一样的,模块化开发,然后上线之前打包,线上完美使用。

CSS Combo:CSS模块打包利器

像js打包,一般都会有配备的打包工具。比如seajs有他的spm,kissy有我写的module-compiler(NodeJS版本)等等,对于css,很多人是用ant的concat或者grunt的concat,这样做的不利的一面就是要把css模块依赖写在打包脚本的配置文件中,很不利于维护。很多时候,你新增了模块,忘记了修改打包脚本的配置,然后发上去发现我的脚本怎么没生效?查了半天才发现是没打包进去。

如果你利用我上面介绍的@import形式来组织你的css,那么你就可以用我写的配套打包工具CSS Combo了:

首先安装css combo:

npm install -g css-combo

然后进入你所在的入口文件(本例为style.css)目录,输入:

csscombo style.css style.combo.css

这样就会把style.css文件打包成style.combo.css文件。很简单吧。当然还有其他参数,请见github文档

好吧,你不喜欢用命令,或者你想整合该工具到你自己的一整套打包工具中,可以到github上看相关的api文档:https://github.com/daxingplay/css-combo

如何利用CSS模块化方便调试

模块化,非常重要的一个特点就是要方便调试。否则我把压缩之后的打包文件发上去了,发现线上出bug了怎么办?这里,你只需要选择一个代理工具将style-min.css(或者style.combo.css)文件代理成你的源码文件style.css,然后刷新一下,看看是不是都模块加载了?

或者,我也推荐你用这种方案,和开发配合起来,比如后台是php,我可以在引用style-min.css的时候这么写:

if(!empty($_GET['css-debug'])){
    echo '	';
}else{
    echo '	';
}

这样,在线上,你可以在url后面加上css-debug参数,那么页面就引用了style.css脚本,样式文件全部模块化载入,方便你调试,能够快速定位到出错的模块;而普通访客进来,没有加这个参数,全部是引用的style-min.css这个压缩之后的脚本。

当然,你也可以任意发挥,比如在淘宝内部,我们可以结合ucool方便切换源码和非源码,或者使用现成的代理工具,比如windows下的fiddler等,当然你可以在js脚本里面,把源码的link标记删除掉,在动态插入源码的link等等。

总之,利用模块化,可以很方便调试,定位出问题的代码在哪个文件。

一些最佳实践

首先,我务必要提醒大家,@import语法一定要仔细看。
基本上,以下几种用法:

@import "./mod/mod1.css";
@import "f:/website/htdocs/xxx/assets/css/mod/mod2.css";
@import url("http://assets.taobaocdn.com/tbsp/tbsp.source.css");

这里,我们不推荐使用本地绝对路径的引用方式,因为不利于团队协作,相对目录绝对够用了,当然css-combo是支持解析本地绝对路径的。

至于直接@import线上的路径,css-combo工具也是支持的,会帮你下载下来~

另外,一定要注意,CSS规范中,@import必须放在其他样式之前,比如:

@import "./mod/mod1.css";
@import "./mod/mod2.css";

body { margin:0; }

而下面这种写法:

@import "./mod/mod1.css";

body { margin:0; }

@import "./mod/mod2.css";

mod2.css是无法被浏览器@import进来的。所以我们推荐的最佳实践就是把所有的模块import都放在入口文件的最开始,方便管理。

其他

为啥不直接用less

团队里面不是每人都会less,不是每个人都喜欢less。而且less不支持gbk编码,还有上面提到的,调试需要引入一段js,很多情况下,开发套页面的时候都保留了。。。其实,最根本的原因就是less和css combo解决的不是一类问题,less更多的是把css编程化,css combo只专注css模块打包:)

好,先写到这儿吧,思路比较乱,大家有问题欢迎提出,对于css combo工具有任何需求和bug,欢迎到github上提issue。 (10299)

双11升级台式机电脑全程纪录

其实双11吧,这种电子类的产品优惠力度比较小的,毕竟成本在那里了。之所以挑这个时间升级,主要是抢到了些红包神马的,所以干脆就挑这个时间升级一下。

先说下老的电脑配置,已经是几年前的了,仔细想想,是大二的时候换的,大概3年多了。当时因为是别人掏钱,毫不犹豫地买了个第一代AMD羿龙,9650,当时的4核啊,很牛逼啊,然后配了个华硕的M4A78,当时也算是经典板子了。不过当时因为别人付钱,没好意思,就选了个很渣的显卡(以至于现在很后悔)。2GB DDR2 x2(后来给家里一根,我自己只剩2GB了)。

其实。。。本来是想年底升级的,但是过生日的时候意外地收到了咚咚送给我的华硕GTX 560显卡(目前这个显卡市面上买不到了,第一代DirectCU),当时在卓越上买的,1299貌似,对我这等屌丝来说已经是非常好的显卡了,插到我的老主板上果然不一样,cod8全高效一点都不卡,之前的8600GT(256MB显存)根本带不起来啊。为了插这个显卡,之前的200w电源根本带不起来,于是选了半天,选了一个性价比较高的安钛克 Antec VP 550,个人用着感觉不错,毕竟我不超频,够用了。

显卡,第一代DirectCU,现在的华硕DC卡都是两个风扇的了:
华硕GTX560

电源盒子和电源(话说这个盒子上的横幅把我雷到了。。。):
安钛克Antec VP 550电源盒子
全黑电源,看起来很舒服:
安钛克VP 550电源

貌似现在的N卡会自动共享内存,而且关不掉,所以我的2GB内存显得捉襟见肘了,有时候玩极品的时候都偶尔卡一下,让我很郁闷,决定升级整个平台。毕竟现在加DDR2内存不划算。

选了半天,本来还是想搞AMD平台,但是发现AMD新的八核8150也不过如此,评分和价格和i5 lvy架构差不多,i5还要更强劲一些。本来想上i5 3570k加一个高端z77主板(比如华硕的pro),但是预算不够了,囧。仔细考虑了一下,我不玩超频,加上现在cpu性能本来就过剩,就选了i5 3470(散) + ASUS P8Z77-v lx(其实本可以z77都不用的),然后是在天猫上弄了个芝奇16GB 1600 DDR3的套装。

主板 华硕P8Z77-V LX

然后双11就买了内存+主板+cpu,因为cpu是散片,又在京东上搞了个九州风神 玄冰400

最后,想了想,基本上这是把老机箱里面的都换了啊,老的换下来又能组成一个主机,干脆这次连机箱一起换了吧。因为没钱,所以就在京东上一阵乱挑。挑了好长时间,看中了那个先马的夜鹰3,或者是撒哈拉(SAHARA) 走线大师GL6,两款机箱都是中塔,带USB 3.0,都支持背线,这个价位的机箱,做工、钢材神马的根本不用看,肯定不行的,就看外观和其他吧。外观都还行,感觉撒哈拉那个蓝色的搭配很好看,看起来清爽也舒服,送两个风扇,先马的那个吧,就是风扇位超级多,机箱顶部好看一些,带一个sata热插拔位置。和大伯纠结了好久,在杭州的颐高先马专卖店也没看到夜鹰3,看到了其他几款类似,做工一般,但相对于更便宜的机箱,还是有优势的,然后就在纠结到底是夜鹰3还是撒哈拉。到淘宝上找了家卖撒哈拉的店,打算亲自过去看看。

然后从百脑汇往颐高走,想都来了,顺便在颐高再逛逛,看看显示器神马的。走到3楼,又经过之前看到的一家卖高端机箱的店(从门外看,摆的都是京东上千元左右的机箱,之前没敢进去,够屌丝吧),这次又经过了,想想反正都路过了,就顺便看看好了。又看到了鑫谷雷诺塔T1那个高塔机箱,这个全塔真是酷啊,绝对是鹤立鸡群,在众多高端机箱里面一眼就看到它了,因为它确实挺高的。作为屌丝,虽然买不起,总能摸一摸吧,然后就过去摸了一下,然后顺手掂一掂,哇靠,竟然我一只手没抬起来,太沉了啊。。。大伯一摸,顿时感叹这个钢板真厚实啊,跟200块钱的机箱比起来差距也太明显了啊。正好手机上一直开着京东,搜了一下价格,599,咦,我之前怎么记得是799?看着老板一副不搭理的样子,估计也是觉得我等屌丝买不起这类机箱吧,我就问了下老板,这个机箱多少钱啊,我以为他会报个六七百的样子,没想到他说550,纳尼,比京东还便宜呢。就让老板拿下来,仔细玩了半天,感觉真是太好了啊。顿时先马、撒哈拉神马的弱爆了,心动了。大伯说买这个机箱就像买房子,一次到位,能用个几年,不像主板那些换代太快。我想也有道理,唯一担心的就是走背线,我那个安钛克够不够,赶紧上京东上查了一下,安钛克那个cpu供电是60cm,老板拿了一个啥电源给我比划了一下,cpu供电大概也是60cm的样子,看样子应该正好够,稍微有点悬就是了。不过已经心动了,跟老板讲了10块钱的价格,就支付宝付款了(因为没带钱,刷卡还有手续费)。

哎呀,这个机箱太沉了,从颐高到家就那点路,我和大伯两个人硬是抬了一个小时终于弄回家了,中间不知道休息了多少次。

雷诺塔T1机箱盒子

好了,不说废话了,先曝一下升级之后的配置:

升级之后的配置

Type Name
MotherBoard ASUS P8Z77-v lx
CPU i5 3470(散)
RAM 芝奇16GB 1600 DDR3
DisplayCard ASUS GTX560 DirectCU 1G/DDR5/256bit
CPU Fan 九州风神 玄冰400
Power 安钛克 Antec VP 550
Computer Case 鑫谷雷诺塔T1 | 导流板

雷诺塔T1机箱,很霸气有木有!
雷诺塔T1

把升级的配件都弄到一起了,忘记把电源盒子拿出来了。
各种配件集合

T1和我的老中塔机箱的对比(这个老机箱跟了我5年了,太有感情了)
全塔机箱和中塔机箱的对比

好了,不废话了,开始和大伯一起装机。
我的主板放进去顿时显得好小啊。话说我这可是大板啊。老板说这个机箱可以放那种两个CPU的主板。
把主板装进去

一开始还担心我的安钛克Antec VP 550电源的线不够,发现即使是这么高的全高机箱,Antec也完全应付,不过CPU供电线刚刚好。
跟大伯走了4个小时的背线,终于弄的差不多了,不过拍完照片突然发现内存装成单通道了,不过懒得重拍了,大家勿喷。

这是机箱背后的情况:
T1完美走背线
正面看起来非常简洁:
走完背线正面效果1
走完背线正面效果2

机箱,不得不说做工很赞,而且很多细节考虑得非常到位,防尘网、易拆卸等都考虑到非常到位。因为当时光线不好,没拍几张照片,就拿一张看看,像下图这里,背部的线绑好之后可以塞到这个小缝里,防止捆线露出来乱戳。
机箱细节做的很到位

话说九州风神那个风扇也相当不错,做工很精细,而且细节考虑得也很好,像它固定风扇的是用两个小铁圈,直接套在散热片上,安装/拆卸也非常容易,作为屌丝,以前都是用cpu自带风扇的。机箱风扇和CPU风扇特写:
机箱风扇和CPU风扇特写1
安钛克黑化电源配黑化机箱太完美了:
机箱风扇和CPU风扇特写2

花费了大概4个小时的成果:
机箱整体装好效果

把机箱放到桌子上,顿时显得我用了5年的19寸LED太小了:
把机箱放到桌子上

因为桌子下面还要放以前的老机箱,然后考虑到放在下面太吸灰尘了,而且机箱里面的灯放在上面才好看吧,所以还是放在上面吧。
把机箱放到桌子上

机箱上部带了风扇调速器以及USB 3.0,正好我的My Passport移动硬盘能用上3.0了,可惜硬盘还是Sata机械盘,没用。
机箱上部

从侧面的透板看机箱前面板的风扇灯:
机箱前面板的灯

最后,装了Win8,用优惠买了个正版序列号,激活之,建议大家以后多多支持正版软件:
正版Win8

后记2012-11-28:
有在淘宝上买了机箱的导流板,京东坑爹的卖89,天猫上48还包邮:

建议导流板一起和机箱买了,因为主板装好,线都理好了之后不太容易装那个导流板,会被线挡住。我是硬塞进去的。。。

装上后整体的效果,内存也调整成双通道了。因为考虑到美观因素,没装那个显卡支架。
(2136)

Ucenter Authentication for DokuWiki用户组设置教程

Ucenter Authentication for DokuWiki 2.0 Beta中内置了用户组功能,因为时间关系,然后用户催的急,所以Beta版本只实现了Discuz的功能,发布那天又有别的事情,忘记写教程了,导致用户可能不知道怎么弄。于是补上。以后增加其他验证方式的时候,就不再开新文章了,直接修改这个好了。

使用Discuz方式链接用户组

基础设置

请先修改uc.conf.php,增加如下设置(如果已经有了,就直接修改)

$conf['auth']['uc']['group_type'] = 'discuz';
$conf['auth']['uc']['discuz_root'] = '../';

第一行表示使用discuz的用户组功能,第二行是设置discuz的根目录相对于dokuwiki的地址。比如:

  • 你的dokuwiki是放在discuz的根目录下的,那么就是’../';
  • 你的dokuwiki是和discuz同级的,比如dz的目录是bbs,那么就是’../bbs/’,注意,目录末尾需要带斜杠。
  • ……

配置我想应该是非常简单的。目前只支持x2.5,理论上2.0也是可以的。

如何设置用户组

既然已经和dz互通了,所以如果这个用户在dz里面有帐号的话,那么肯定是能取到他用户组的,但是因为dz的用户组需要设置的项目是很多的,所以,如果使用这种方式的话,是不能直接在dokuwiki里面改用户组的(已经想好了其他方式,待实现),所以先请您在dz里面改用户组吧。

如果这个用户在dz里面取不到,那么就是默认的user组。

如果您说,他的用户组我不想改怎么办,或者因为这个用户是会员用户组的(会员用户组只能通过积分升级来改变用户组),不是属于系统/管理用户组的,没法改,其实dz已经有一个解决办法了,就是扩展用户组,比如你可以新建一个用户组叫百科编辑员,然后设置这个用户的扩展用户组为百科编辑员,如下:
在dz中给用户设置扩展用户组
然后,到dokuwiki的访问控制列表(ACL)管理器中,给相应的用户组赋予权限:

没错,用户组可以用汉字,就是你在dz里面设置的用户组。

然后你想给他神马权限都可以的。记得保存就好了。

怎么样,我觉得还是很简单的。想设置几个用户组就设置几个。而且两边用户组互通,这样用户不容易迷惑,而且你也可以结合dz发挥更多用户组的功能,比如在dz设置一个奖励,用户升级到xx用户组,就能编辑百科了……尽情发挥吧!

至于其他dz版本,稍候会一并支持。

MySQL方式

待完成

文本存储方式

待完成

小结

如果您有其他问题,欢迎留言或到github里面提issue。 (2464)

[评测]使用阿里云云服务器一年多的感受

一年多之前,也就11年5月份的样子,阿里云云服务器产品线终于上线了。但那时候,国内完全没有能称得上云服务器的,很多小公司就是搞个VPS就叫云服务器了。以至于阿里云云服务器刚出来的时候,很多站长也是这么说的。那会儿我国外的虚拟主机也即将到期,而且国外访问速度确实要差不少。所以当时咬咬牙,狠下心来花了1999元买了一台(即现在的标准A,已经涨价了,呵呵,目前是3999元一年,当时有很多人很聪明,续费了好几年)。

用了一年多了,见证了阿里云主机的发展历程,所以,我觉得作为第一批用阿里云云服务器的用户,我还是很有发言权的。

我的结论就是,阿里云,真心很不错,值得你选择。

放心,这篇不是软文,是一个阿里云云主机用户的真实感受。

云主机和VPS的区别

我觉得了解阿里云,首先就要弄清楚这两个概念。很多站长根本不懂什么叫云主机,就拿阿里云的和Linode,甚至和西部数码之类的去比。这些完全没有可比性。我这里不是说Linode不好,只是因为不是一个概念。Linode在VPS届算是王者了。但是阿里云是云主机,不是VPS。

要了解什么是云主机,其实就是在谈架构。像我等小屁孩其实根本不配谈神马架构之说,所以我只是简单介绍下,具体想更深入地了解,请自己努力升级吧。

VPS,虚拟服务器,就是在一台物理服务器(我们称之为母鸡)上根据某种虚拟方式划分出虚拟机,说白了,和你自己在你的电脑上装个Virtualbox,开几个虚拟机没啥区别。也就是说,这个VPS是依赖于这台母鸡的,一旦母鸡挂了,那你的VPS肯定会挂。另外,这台母鸡上的所有的VPS全部依赖于母鸡的资源,平分母鸡的资源(当然这要看VPS服务商如何去划分VPS了),共享母鸡的带宽,共享母鸡的CPU、硬盘、内存等等资源。也就是说,你在VPS里面看到的硬盘,就是存放在母鸡的硬盘上的某个很大的文件,所以VPS的磁盘IO是要看母鸡的硬盘好坏的,母鸡的磁盘越好,比如SSD,那么你的VPS的磁盘IO速度越高。同理,其他的资源,如带宽、CPU、内存也类似。那么,如果你在VPS里面写入一个文件,就是写到了母鸡的硬盘上,和你自己用台式机新建一个文件到你的硬盘上,基本没有区别。

而云主机则不一样。虽然云主机也是虚拟化的产物,和VPS这三个字母中的V含义是一样的,但是区别在于,云主机是架构在“云”上的,我这么说是有点玄乎,所以很多站长其实不懂什么叫云。云简单地说,或者说我的理解,就是集群。对于阿里云的云服务器,很重要的一个区别就是,你在阿里云的云服务器里面看到的硬盘,肯定不是和你的云服务器在一台物理服务器上的。阿里云的云服务器中的硬盘完全是放在单独的网络存储集群上。根据我自己跟阿里云同事的了解,阿里云的存储集群是网络存储,每份数据会在集群上的不同位置保存3份,任何一份丢失都不影响,这样完全保证了存储的高可用性和数据完整性。也就是说,你在云服务器里面写入一个文件,那么其实是通过网络(内网)的传输到另外某n台服务器上,写到他们的硬盘上。这就是集群。

这就是云主机和VPS的主要区别。类似的,像AWS就是云主机,他们的硬盘也是云存储,也是需要单独挂载的。

那有人可能会问,SAE算云主机吗?其实我个人觉得,他不是的。SAE和GAE、BAE一样,都是App Engine,这也是他们名字里面为啥都有AE的原因,也就是说,你在云服务器里面的网站代码基本上不太能直接放到上面用的,要根据他们的环境修改你的代码才可以运行。

阿里云好在哪儿

前面的VPS和云主机的区别是基础,理解了这个就更方便地理解了阿里云云主机的优势所在:

高可用性

网站最重要的就是高可用性了,以及数据的安全,如果哪个IDC动不动数据就全部丢失了,我想没哪个站长敢用。

其实我之前和很多站长一样,都是对国内的IDC有偏见的。这也是我为啥第一个网站是选择国外的虚拟主机。其实在很多站长的眼里,国外的那些大的IDC才靠谱,数据放在他们那里才不会丢失。所以Linode这样的VPS以及像Hostmonster这样的虚拟主机商才被国内的人看好,说实话,他们做的确实不错,我这些都用过,数据真没有丢失过。

刚开始用阿里云的时候,说实话,我对阿里云也是不放心的,所以我的数据全部通过rsync同步到了国外的AWS上,每天一备份,数据库也做了主从同步。后来当我用了一年多,以及对阿里云的了解更加深入之后,我才发现,我的担心多余了。

先要从架构角度去说。好吧,又要谈到架构了,很多站长可能不知道,阿里云的云主机是架构在非常著名的飞天云计算系统上。你可能不知道,但是了解架构的技术员都会知道,这是淘宝、天猫等都在用的底层架构,你有看到过淘宝和天猫挂掉吗?(当然一两个页面偶尔不能访问和这个没关系,很多是上层应用的问题),相反,再看看京东、苏宁之流,搞个小活动动不动服务器就瘫了,你有看到双11的时候,大家在0点疯抢天猫红包的时候,天猫有挂掉吗?我想没有吧。这都得意于整个底层架构啊。你想想,你的云主机和天猫都是架构在同一种集群上,你能不放心吗?相反,你再想想那些自称自己是“云”的所谓VPS服务商,搞个VPS就叫云来骗人,你敢用吗?只要母鸡一挂,你的VPS就挂了。再者,相比很多人都知道AWS曾经出现过很大的故障,但是你看过淘宝和天猫这几年有出过这么大的故障么?

再谈数据。数据我也不用说太多了,刚才在说架构的时候已经谈过了。普通VPS的数据是写到母鸡的硬盘上的,其实大家都知道,硬盘是易耗品,本身机械硬盘还是会出故障,用个两三年,说不定就出故障了,而且母鸡的硬盘坏掉了,你的数据肯定就回不来了,一般的VPS服务商也不会花巨款去给你恢复数据的。所以很多VPS商才声称自己做了RAID几几之类的。RAID是个好技术,是能保证一定的数据完整性的,但是还是几块硬盘,还是会坏,所以Linode有单独的备份系统。

阿里云就不一样了,刚才说过了,阿里云的云主机的硬盘是放在单独的网络存储集群上,而且你的数据每份都给保存3份,你每次写入一次数据,就会通过集群的交换机写入到集群的不同位置上。集群最重要的特点就是数据高可用,这么大的集群,随便坏掉几块硬盘影响么?直接拿另外地方存储的数据同步过来就行了。那你会问,如果这3份数据所在的硬盘都坏掉了,那岂不是就没救了?好吧,其实我告诉你,这相当于你从一个沙滩上画出一平方米(当然只是假设啊,别当真),然后从这一平方米里面选3粒沙子,然后涂上颜色,然后混入到这一平方米里面,蒙上眼睛,再把这3粒沙子一起挑出来,你觉得这和你中5百万有啥区别呢。。。除非整个集群或者集群的百分之几十挂掉,才能轮到你的数据丢失吧,不过话说回来了,你在淘宝上注册的帐号有丢失过么(排除自己的违规导致删号一类的)?

而且,拿我自身体验来说,除了我自己手动重启以外,阿里云的主机还真没出现过问题,我最长大概是6个月没重启过我的云服务器了,之前有TOP命令截图,本来想贴出来的,但是不好意思,找不到了。

前几个月,阿里云推出了敢用敢赔的服务,100倍赔偿,就是说,如果你的云主机因为阿里云的故障导致当机1天,那他们会免费赠送你100天,都承诺到这种地步了,我想目前国内没几个做IDC的敢这么承诺吧?

所以,用阿里云,尽管放心。这一点,可以满分。

访问速度

除了稳定,站长最关心的就是网站访问速度了。我觉得这个无庸置疑,阿里云的云服务器访问速度在国内算是一流了,更直接秒杀所有国外主机。我自己的网站都说在阿里云的服务器上,根据用户的反馈,速度相当不错,监控宝也监控了很长时间,基本上全部绿色(当然这个监控只能说明一部分问题)。更何况,阿里云的线路对于教育网访问也不错,这个我是有证据的,我的一个网站(飞扬俱乐部:fyscu.com)的主要用户就是四川大学的用户,他们用教育网访问速度也非常棒。另外一个网站(冰糖:bingtangpt.com),前期用户很多也是在校学生,他们反馈速度也很不错。

好吧,我的都是小网站,没啥说服力,就拿业内很有名的网站异次元说一说吧,异次元也搬到阿里云上了,用户反馈速度也很棒,不信自己可以看评论:http://www.iplaysoft.com/moved-to-aliyun.html

所以这一点我觉得,也可以满分。

当然如果还有其他选择的话,SAE、BAE可能也是不错的选择,当然那些普通网站没法直接用的。

价格

很多人抱怨阿里云太贵,如果你了解了阿里云这套架构,再把它和VPS的架构的成本一比较,差距就太大了。VPS的架构很多都是采用开源的软件,母鸡也用Linux,基本上除了硬件成本,没有任何软件成本,顶多是找人维护服务器就行了。而阿里云的架构是自主开发的,所以肯定有成本在里面。

话说我刚用的时候,1999一年的标准A真心便宜啊,1.5G内存,5M带宽,150G的硬盘,双核的至强CPU,相比较最低配置的Linode,一年也要1600多吧,而这最低配置的Linode,只有512M的内存,20G的硬盘,每个月只有200GB的流量。自己掂量吧。

即使现在最低款的阿里云,只要89元一个月,配置也明显比最低配的Linode高很多吧。再加上刚提到了阿里云这么多优势,性价比非常高啊,还是那句话,自己掂量吧。

如果真的没钱,我觉得还是先用虚拟主机来的实在,等你网站牛逼了,再搬也不迟。

操作系统的选择

使用云主机/VPS,当然面临着选择操作系统。其实这一块,阿里云刚开始做的是不够好的,当时只有Win2008和Red Hat可选,而现在,阿里云已经有很多系统镜像可以选择了,比如CentOS 5/6,Ubuntu等,都是很纯净的系统,很方便自己定制。

很多新手站长或者Linux新手肯定会抱怨这个,说系统太纯净了,啥都没有,我只想说,如果不会用Linux,不会拿Linux装软件,我觉得你还是用Windows Server吧,Windows Server 2008也做得很不错的。否则,你用Linux,之后如果遇到问题,可能就不太容易解决的。

我刚用阿里云的时候,当时的Red hat里面还带桌面环境、VNC的,试想,一台服务器,还搞啥桌面环境?很可笑吧,不过后来阿里云改进了,所有的Linux发行版都是很纯净的,不会乱装软件的,这才符合一台服务器操作系统的要求。

客服

Linode的客服回复速度是有目共睹的,现在,阿里云的客服已经很专业了,基本上回复速度非常快,而且7×24小时,即使半夜提交工单,也会有工程师联系你。更何况,我感觉阿里云的客服真是太热情了,经常提交工单之后,他们就会给你打电话,仔细询问你的问题。

备案

国内最大的问题就是备案问题了。之前阿里云的备案是比较困难的,需要直接用电信的某套系统,现在不用了,外包出去了,跟万网备案是同一家外包公司的,备案系统都一样的。

不知道作为读者的您,有没有用过万网的备案,反正我是用过的,速度很快,如果是第一次备案,稍微有点麻烦,需要核验之类的。如果只是新增网站,直接系统提交,然后快递资料就行了,很是方便。我是备案到四川管局的,新增网站,算上阿里云的审核时间,备案了两次,第一次是5天下号,这一次大概是7天,还是比较快的。其他地方的管局不太清楚,具体不同的管局审核速度也不太一样的,有的管局也查得严。我觉得跟这些ZF部门打交道,最好的办法就是淡定,再淡定。

备案建议关站备案,当然,ip还是要解析到你要备案的阿里云主机上,否则ip接入不对的,如果以后查的严,还需要再做转移接入的。

云监控

阿里云的云监控不得不提,构想非常棒,不过目前的界面有点难用,需要优化一下交互。

为啥好用呢。首先,不限制你的域名是不是在用阿里云主机的。

第二,每个月免费1000条短信的配额,你看看这么多配额,用监控宝或者DNSPOD的监控得花多少钱吧。。。还是那句话,自己掂量吧。

第三,他有个云监控的Agent,这个构想太棒了,为啥呢,这个Agent是主动发请求到阿里云的云监控上的,而监控宝呢,是他们主动请求你的服务器,为了安全,你需要单独给监控宝开端口或者授权IP一类的。而云监控的Agent,是你主动发请求,不需要单独开INPUT端口。而且根据我的了解,这个Agent是淘宝线上服务器大规模采用的鹰眼监控系统的简版,所以还是很靠谱的,只是目前还没有开源。相信随着淘宝的开源事业的不断推进,这些也是不在话下的。

因为今天头有点疼了,明早要回家过十一,就先写到这儿,其他优点回来再补充。

阿里云目前的不足

说了这么多优点,难道阿里云就没有一点不好么?其实阿里云还在起步阶段,肯定有很多不足,网上也有不少抱怨。我主要说几点吧,相信随着阿里云的发展,下面这些问题会一一解决的。

磁盘IO

阿里云的磁盘IO是不太高,不过我可以很负责任地告诉你,对于一般的网站绝对够用了,那种IO密集型的应用可能需要三思了。为啥阿里云的IO不高呢?还是要谈架构了。刚说到,阿里云的磁盘是网络集群存储的架构,这样,因为每次写入数据都要通过网络(虽然是内网),然后还要写入3份数据,所以IO就会打折扣。相比VPS,VPS共用母鸡的磁盘,一般的Sata硬盘速度还是可以的,阿里云的IO相比较而言就慢一些。所以建议,如果感觉网站的IO不行了,就关闭开启一些IO密集型的应用或者特性。比如MySQL的bin-log,如果数据库操作频繁,再加上bin-log,可能IO wait的比率就会比较高了。

当然,我也给阿里云团队反馈过这个问题,他们说底层架构还需要优化,我想也是的,本身数据安全和IO还是一把天平,一边高了,另外一边自然要低一些,所以就多给阿里云一些时间吧,这个问题估计也不会是一天两天就能搞定的。

如果你想用阿里云,但是对IO要求比较高,如果是数据库密集型的,建议采用RDS,如果是文件密集型的,就用OSS吧,内网流量免费,这种搭配还是很不错的,如果你网站真的到了这种地步,相信那点钱不在话下的。

Linux系统内核

有一个问题比较关键,目前阿里云云主机,如果你是采用Linux系统,不建议你升级内核,因为云主机的驱动和内核是挂钩的,升级之后可能造成云服务器无法正常启动,如果不小心升级了,联系客服,他们会帮你修复的,几分钟就搞定。

总结

好了,基本上可以总结了。作为用了阿里云这么久的用户,我个人还是非常推荐阿里云的,靠谱,性价比高,现在还能自定义配置,所以如果想把网站搬回国内,或者正在寻找一个合适的创业起点,相信阿里云一定是个不错的选择。

目前我在用阿里云云主机的网站:

如果您使用这个链接购买,可以获得5%的折扣:点击此处

如果有神马问题,欢迎留言。 (4517)

Ucenter Authentication for DokuWiki发布啦

For English Users, please visit project page directly at: https://github.com/daxingplay/dokuwiki_ucenter

写这个验证程序的原因

Dokuwiki确实是个很棒的百科程序,它本身不依赖数据库,小巧、灵活,上手很快,而且插件什么的都很多。顺便吐槽一下,相比国内的互动百科,我觉得Dokuwiki的页面管理方式才真的是wiki的管理方式,互动百科那种,感觉更像是资讯类的,看看页面的链接就知道了。

不用说,Discuz是国内最知名的论坛建站软件了,我的橘汁仙剑网就是采用了Discuz + Dokuwiki这样一个组合。当然,Discuz本身是基于Ucenter验证用户的,而Dokuwiki是自带的一套验证机制(默认是文本方式存储在一个文件当中),这样,一个网站就有两个用户注册和登录接口了,如果两个程序的用户都很多,那必将是个很大的问题,所以Discuz的Ucenter正是这么一个解决方案,所有的PHP程序(当然其他语言应该也可以)都可以使用Ucenter来实现用户注册、登录等,这样,一个网站,无论使用了多少个PHP程序,都可以通过Ucenter来同步登录和退出,对用户而言,在这个网站上,只要有一个账户就可以了,当然用户体验会好很多。

所以,我觉得Dokuwiki有必要有个Ucenter的验证方式,在网上搜了一下,没有现成的,于是终于想自己写一个了。

具体介绍

Ucenter Authentication for Dokuwiki是将Dokuwiki和Ucenter整合的一套程序,项目目前托管在github上,地址是:https://github.com/daxingplay/dokuwiki_ucenter

特点

  1. 基于Ucenter进行用户注册、登录、退出
  2. 支持同步登录、退出
  3. 绿色,不修改任何原版程序文件

使用方法

  1. 先到https://github.com/daxingplay/dokuwiki_ucenter/downloads下载源码包。
  2. 下载好源码后,将所有文件放置在Dokuwiki的根目录下。
  3. 将conf/uc.conf.php.dist复制一份为conf/uc.conf.php(当然你也可以直接重命名)
  4. 进入Ucenter后台,点击应用管理,添加新应用,如下图1所示
  5. 选择自定义安装,应用类型选择“其它”,应用名称、应用URL根据自己需要填写,然后写一个稍微复杂点的通信密钥,是否开启同步登录,是否接受通知可以根据自己的需要进行选择,如下图2所示
  6. 点击提交之后,下面会出现“应用的Ucenter配置信息”,复制里面的所有内容,如下图3所示
  7. 编辑conf/uc.conf.php这个文件,把前面的define部分替换为刚才复制的内容
  8. 进入Dokuwiki的管理后台,进入配置设置,将authtype(认证后台管理方式)设置为uc,superuser(超级用户)设置为Discuz或者Ucenter的超级管理员的用户名,然后点提交即可,如下图4所示
  9. 至此,已经安装完毕,进入Ucenter后台看看是否通信成功




用户组使用指南

2.0Beta开始,已经慢慢开始支持用户组管理功能了。2.0Beta中只支持discuz 2.5的用户组验证,因为时间关系,其他版本的discuz还未测试,但是dz7这样的版本肯定是不行的。配置方法也很简单:

  1. 编辑uc.conf.php
  2. 配置用户组类型:$conf[‘auth’][‘uc’][‘group_type’] = ‘discuz';
  3. 配置discuz根目录所在位置:$conf[‘auth’][‘uc’][‘discuz_root’] = ‘../';这里的位置是指相对于dokuwiki根目录的位置。
  4. 根据自己的需要在Dokuwiki的ACL中设置相应用户组权限吧。

如果不想启用用户组功能,将group_type设置为空即可。这样,所有非管理员用户默认为普通用户组user

Todo List

  1. 目前只实现了用户的注册和登录验证,没有实现用户组功能,如果实现用户组,可能需要创建数据库了,暂时,你可以通过Dokuwiki自带的ACL功能进行用户的授权,比较适合那些只有少数人编辑的wiki或者完全开放的wiki
  2. 目前在Dokuwiki端的用户管理功能还有些bug,稍候会慢慢修复,既然都是用Ucenter了,那干脆到Ucenter里面管理用户吧!:)
  3. 将语言包独立出来,这样方便在多语言环境下使用

结束语

好了,介绍就到此啦,如果发现bug或者有任何问题,请提交issues (26241)

Centos Postfix bad email syntax 解决方法

在服务器上安装了postfix、dovecot、spamassassin,配置感觉没有啥问题,但是每天logwatch发来的邮件都会显示有下面的错误日志:

55D70CA509B: to=<-@ojpal.com>, orig_to=<->, relay=none, delay=1.6, delays=1.5/0.1/0/0, dsn=5.1.3, status=bounced (bad address syntax)
55D70CA509B: sender non-delivery notification: 8899ECA509C

在gg里面搜了很久的postfix bad address syntax的错误解决方案,都是说在配置里面加上allow_min_user这个选项,但是看官方文档说貌似这样并不好。于是打算自己找根本原因。

我自己给自己发一个测试邮件,发现他也会发送到这个地址上-@ojpal.com,确实很让人纳闷,为啥postfix会把邮件发到这个地址上呢?难道是因为我是用的虚拟账户的原因?

应该不是,仔细看日志:

Sep 27 00:18:12  postfix/smtpd[23006]: warning: 58.61.54.42: host
name 42.54.61.58.broad.sz.gd.dynamic.163data.com.cn verification failed: Name or
service not known
Sep 27 00:18:12 postfix/smtpd[23006]: connect from unknown[58.61
.54.42]
Sep 27 00:18:12 postfix/smtpd[23006]: 3C12ECA4E95: client=unknow
n[58.61.54.42]
Sep 27 00:18:12 postfix/cleanup[23025]: 3C12ECA4E95: message-id=
<20110926161812.3C12ECA4E95@mail.ojpal.com>
Sep 27 00:18:12 postfix/qmgr[763]: 3C12ECA4E95: from=<1341045845
2@163.com>, size=883, nrcpt=1 (queue active)

========= 分隔符 ==========
Sep 27 00:18:12 spamd[11311]: spamd: connection from localhost [
127.0.0.1] at port 59357
Sep 27 00:18:12 spamd[11311]: spamd: setuid to spamfilter succee
ded
Sep 27 00:18:12 spamd[11311]: spamd: processing message <2011092
6161812.3C12ECA4E95@mail.ojpal.com> for spamfilter:5001
Sep 27 00:18:12 postfix/smtpd[23006]: disconnect from unknown[58
.61.54.42]
Sep 27 00:18:13 spamd[11311]: spamd: identified spam (12.5/5.0)
for spamfilter:5001 in 0.7 seconds, 895 bytes.
Sep 27 00:18:13 spamd[11311]: spamd: result: Y 12 – BAYES_99,FRO
M_LOCAL_DIGITS,FROM_LOCAL_HEX,FROM_STARTS_WITH_NUMS,RCVD_IN_BL_SPAMCOP_NET,RCVD_
IN_PBL,RCVD_IN_SORBS_DUL,RDNS_NONE,TVD_SPACE_RATIO scantime=0.7,size=895,user=sp
amfilter,uid=5001,required_score=5.0,rhost=localhost,raddr=127.0.0.1,rport=59357
,mid=<20110926161812.3C12ECA4E95@mail.ojpal.com>,bayes=1.000000,autolearn=no
Sep 27 00:18:13 spamd[24866]: prefork: child states: II

====== 分隔符 ======
Sep 27 00:18:13 postfix/pickup[14476]: 49B0ECA4E9F: uid=5001 fro
m=<13410458452@163.com>
Sep 27 00:18:13 postfix/cleanup[23025]: 49B0ECA4E9F: message-id=
<20110926161812.3C12ECA4E95@mail.ojpal.com>
Sep 27 00:18:13 postfix/pipe[23026]: 3C12ECA4E95: to=<admin@ojpa
l.com>, relay=spamfilter, delay=1.1, delays=0.35/0.02/0/0.76, dsn=2.0.0, status=
sent (delivered via spamfilter service)
Sep 27 00:18:13 postfix/qmgr[763]: 3C12ECA4E95: removed
Sep 27 00:18:13 postfix/qmgr[763]: 49B0ECA4E9F: from=<1341045845
2@163.com>, size=2219, nrcpt=2 (queue active)
Sep 27 00:18:13 postfix/qmgr[763]: 49B0ECA4E9F: to=<-@mail.ojpal
.com>, orig_to=<->, relay=none, delay=0.79, delays=0.74/0.05/0/0, dsn=5.1.3, sta
tus=bounced (bad address syntax)

在第一个分隔符之前,是postfix获得新邮件,没有任何问题,然后postfix将邮件交给spamassassin处理,这是中间那一段,也没有任何错误,spamassassin检查出该邮件为spam,

在第三段,我们发现这个被判定为spam的邮件发了两次,一个投递到了admin@ojpal.com,这个是正确的投递方向,另外一次投递到了-@mail.ojpal.com上,很明显是刚才那个邮件,说明这个邮件被投递了两次,第一次成功,第二次失败(因为-@mail.ojpal.com是不存在的),报错。再仔细看第一次投递的时候是交由spamfilter这个程序投递的,也就是spamassasin的调用程序,这个是一个shell文件,内容就是使用spamc把判断之后的邮件再转给postfix进行投递(之后就交给dovecot了,这个不在这个问题的范围内),那说明spamassasin把两封相同的邮件转给了postfix投递,只不过收件人不一样罢了。那我猜测可能是spamassassin的问题,于是在postfix中的配置master.cf中禁用掉spamassassin,reload一下,发现该问题消失,确实是spamassassin的问题。

那为啥spamassassin会把邮件转发到两个邮箱呢,我最后检查了一下master.cf中的配置,发现确实是spamassassin的配置问题:

# spam filter
spamfilter unix – n n – – pipe flags=Rq user=spamfilter argv=/usr/local/bin/spamfilter -f ${sender} – ${recipient}

${recipient}前面我少加了一个横杠,正确的配置应该是:

# spam filter
spamfilter unix – n n – – pipe flags=Rq user=spamfilter argv=/usr/local/bin/spamfilter -f ${sender} -- ${recipient}

这样就给spamassassin指明了收件人是谁,对于刚才那个错误配置,spamassassin不知道投递给谁,因此就投递给了-@mail.ojpal.com,有点像广播,问问这个邮件到底是谁的,呵呵。

(1885)