Trade Off

supercalifragilisticexpialidocious

Active Cron Log in Ubuntu

bnly.org使用crontab来不断fetch和send,这看起来很傻,不过挺容易搭建。目前send过程每分钟一次,fetch过程10分钟一次。

在ubuntu下默认没有cron的日志,需要这样开启:

1
2
3
4
vi /etc/rsyslog.d/50-default.conf
解除cron的注释
service rsyslog restart
service cron restart

这样就可以在/var/log/下找到cron.log查看了。

Shell Study

sed是个极其强大的东西,今天开始学习一点点:)

以前的一个sed的命令终于明白了:

1
find ./ -name '*.html' | xargs sed -i 's/iso-8859-1/utf-8/g'

这是替换html编码用的一个语句,find出当前目录下的html文件名字,然后传给sed,当然这里用到了xrags中转,其实没有的话也ok(除非你不用-i模式),sed用了-i模式,可以编辑文件内容保存,并且存一个备份,当然你得传入一个扩展名字才能保存,没有的话就不存和没有-i效果一样。后面的一个字符串,s表示用正则匹配,s后面的是一个分隔符,可以用斜杠,可以换你喜欢的,但后面都要统一起来,上面的意思是iso-8859-1这个替换成utf-8,最后的加的/g是表示global替换,全部替换,否则就替换一次。

后来看起别的书来了。

Change Shopping Cart

今天taowen给我们show了一个很fancy的日志处理过程,当然是in the future的,深度打动了wanglei,由于是刚刚吃过饭,站着听久了难免会发困,主要听来的意思就是app的log会自己在local记录,然后发送json给syslog,后面接上logstash做一个处理,再往后就是接入各种图表啊、search啊这样的终端app,如果能完全跑起来应该是足够玄的。不知道成形的互联网电商们会不会也是这样做的。

我主要在修改shopping cart,临下班eric过来和我做了一点东西,后来taowen觉得shopping cart有redis和db两种不同实现很不爽,我倒是没那么强烈,不过如果要改全db对我的工作量会加大。回家后吃了饭感觉身体还好,就修改成全db吧,看看是什么效果。

好在都过了测试,但我删掉了一个功能,所以测试文件也进行了修改,没问题:)

明天应该会把手上的issue全部弄好,哦对了,今天花了挺长时间在Set-Cookie,弄了半天发现就只有几行增加,真是不全局看的话,工作量就会无形的被自己放大。。。

Pragmatic Programmer Log

Bad code requires lots of comments!

head file 也是一种重复,这属于language的重复,一般只能妥协。

“出来混迟早要还的”,这句话又出现了!!!

deal with interdeveloper duplication的方法就是多多交流。。。每天的站立会议是不错的!

依然补充几个单词:

contradictory:          矛盾的
marauding:              恶意的
harness:                管理,控制
enhacing:               增强
constantly:             不断地
discrete:               不连续的
entire:                 全部的
representation:         陈述
nightmare:              噩梦
authoritative:          权威性的
inadvertent:            不注意的
imposed:                强制的
honoring:               尊敬
ingenuity:              精巧
metadata:               元数据
one-time:               一次的
inevitably:             不可避免地
defer:                  推迟
reveal:                 显示
illustrate:             说明
violate:                违犯
insidious:              暗中危害的
foster:                 培养

Shell Study 2

shell的参数很有意思,是用数字来命名的,从1~9,如果超过了9就应该这样写:${10},以后就以此类推。

跟踪shell的执行步骤:sh -x prog,这样就能看到prog的执行动作,如果是在脚本内部,使用set -x开启跟踪,使用set +x关闭跟踪。

终于知道i18n和l10n的意思了:internationalization=i18n,起始字母和末尾字母之间有18个字母。。。同理,localization=l10n。

UNIX中有几个环境变量和i18n,l10n相关:LANG、LC开头的很多个,LANG是默认值,没有任何LC_xxx设置的时候使用这个。这块内容实在太复杂了,还是用默认的英文简单,估计全球程序员也都看得懂。有时候不成熟反而是一种很好的解决方案:)

至此书的前两章就结束了,后面就开始具体的工具学习,至少我自己看着后面章节的标题是这么想的——查找与替换。这些study完全是为了给自己强化知识用的,没打算让别人照着学下去,所以我也就不在乎章节的分隔了,感到应该断开的地方就断开,其他基本是一气呵成,要吃饭睡觉的时候就不写了。

原来的grep有好几个版本,最终在01年被合并成了一个,通过不同的option来选择如何查找字符串。使用

1
grep -F xxx

可以查找带有xxx的文本行,默认情况下如果你查找的xxx内容不含正则的mate字符就是使用了-F选项,所以简单的查找可以不加这个选项。

Shell Study

上次说到了echo有可能出现标准不一致的情况,所以建议使用printf,但如果你只是使用最简单的echo输出一段话,那还是没问题的。printf更加复杂,功能和C语言中的printf基本相同。

IO重定向默认在你登录的时候就把standard input/output绑定到了terminal中,所以你可以在terminal中完成很多工作。

简单的重定向:“>”、“<”、“>>”,分别是改变重定向input、output,最后一个是附加到某个文件,如果你在使用">“的时候不存在目标文件,那么会被创建出来,如果已经存在就会被覆盖掉,原有数据丢失,如果使用”>>“则会追加到目标文件中,原有数据依然存在。

管道也是重定向的一部分,prog1 | prog2,可以把prog1的标准输出重定向到prog2的标准输入上,如果你需要连接多个程序的时候,最好用管道方式,这样比临时文件效率高很多(据说10倍)。在使用管道的时候应该逐级让数据量减少,这样能够提高脚本的整体性能,例如在sort之前,你可以grep出需要sort的行,这样会好一些:)

特殊文件:/dev/null 和 /dev/tty。null这个被称为bit bucket,传输到这里的东西都会被丢弃,就如同黑洞一般:)程序把文件写入到这里就会被认为是成功的,但实际什么都没做,例如:

1
2
3
4
5
6
if grep pattern myfile > /dev/null
then
else
fi

可以做一个探测,是否myfile有pattern,这样不会产生输出。

/dev/tty的功能是,当程序打开这个文件时会重定向到一个terminal,在需要输入密码的时候用的到:

1
2
3
4
5
6
printf "Enter password: "
stty -echo #关闭自动回显输入的字符功能
read pass < /dev/tty
printf "Enter Again: "
read pass2 < /dev/tty
stty echo #打开自动回显输入的字符功能

shell的PATH中最好不要放入当前目录这一选项,这会带来安全问题,所以干脆就不要这么想了:)

Shell Study

今天开始学学Shell编程,不光是因为需要在惯例服务器的时候使用到,平常作为一门必须掌握的脚本语言也是很有必要的,所以就学吧,况且那本《Shell脚本学习指南》已经买了放那里好久了,就书刚到的时候看了两页,真的就像是两页,后来光看《The Pragmatic Programmer》和《1Q84》了。

shell脚本的第一行一般写明这个脚本使用哪种脚本解释器运行,以"#!“开头,后面加脚本解释器的名字和相应参数,如果不需要什么参数就写上“-”,这是出于安全考虑,可以避免某种程度上的欺骗式攻击(spoofing attack)。

选项:命令后面用一个“-”开头书写的内容,如:ls -l,那么“-l”就是选项。
参数:有的选项需要传入参数,那么就要紧跟着那个需要参数的“选项”,如:cc -o exp exp.c
没参数的选项合并,例如:ls -al = ls -a -l,书写非常方便吧。
分号分隔开几条命令,会逐一执行;如果用“&”的话,就会让命令进入后台执行,可以立刻相应你的下一条命令。

shell中的变量赋值有个要求,变量名后,到等号,到值都不能有空格:“var=1”这是正确的,“var = 1、var= 1等等都不对”,这点有些别扭,我喜欢多加空格。。。而且大多数coder也是如此吧?

取出刚刚你创建的变量需要在变量名前面加"$“符号,看来和取钱的感觉差不多哈哈,或许以前认为变量中的值放在内存或者磁盘上都是昂贵的,如同取钱。

变量赋值这里还有些东西值得说一下:

可以一行多次赋值,比如,first=1 second=2 third=3
如果有空格就加双引号: var="1 2 3",这看起来像string
还可以这样,var="$first $second $third",最后var的值里面会包含first、second、third的值,这点就不太像string了,需要注意!!!

由于echo命令在Unix多个发行版之间有差异,所以输出的话还是用printf好了:—)

今天就先到这。

Pragmatic Programmer Log

昨晚看完了第一章,顿时感觉十分充实,因为在过去的一个星期里每晚都在看书而不是把时间花在weibo上。Your Knowledge Protfolio讲的是为自己的知识不断投资,你现在钟爱的或者正在使用的技术可能只是当前这个时期火热的,他们会随着时间的推演发生巨变,如果你不不断为自己的知识投资,那很难适应社会的发展需要。我们搞编程的感受应该非常丰富,可以说每天都有新技术出现老技术衰亡,应对这种挑战就应该定期学习新技术,更多的掌握技术从而面对一个问题你能有很多种解决方案。

后面讲了要批判性思维,海量信息涌入的时候不要乱了阵脚,思考哪些是真的哪些是假的,对于信息社会这点已经很平常了。

交流。我们不能闭门造车,人与人之间的交流永远大于人与机器间的交流。作者介绍了一些交流方面的技巧,其实不必太在乎这么多,只要合理处理好人际关系,跟着感觉走就不会有问题。

补充很多单词:

interest:           投资
pithy:              简称的
homily:             训诫
irrlelvant:         不恰当的、不想干的
obsolete:           过时的
regularly:          定期的,有规律的
diversification:    多元化
spectrum:           范围
potentially:        潜在的
high-reward:        高回报
conservatively:     保守地
miss out:           错过机会
emerging:           正在浮现的
payoff:             收益
intellectual:       智力的
capital:            资本
rut:                常规
equation:           相等、均衡
vice:               代替
versa:              反
cross-pollination:  交叉授粉
voraciously:        贪婪地
faintest:           模糊的
guru:               专家
thumbing:           翻阅
vendor:             小贩
beware:             小心
unswayed:           不受影响的
zealot:             狂热者
underestimate:      低估
commercialism:      商业主义
dogma:              教条
insist:             坚持
torrent:            激流
sterile:            无结果的
proposal:           提议
advocate:           主张
justify:            证明
convey:             表达

“出来混总是要还的”,这句话已经被很多人认定是亘古不变的真理了,呵呵。

Pragmatic Programmer Log

比较喜欢的一章,讲软件的足够完美性。世间几乎所有东西都不是完美的,当然有完美的——“不完美”就是完美的,就像“永远不变的只有变化”一样。

似乎和昨天的有些关联,要先给用户们一个不够完美的东西用,他们就会给出意见,你再逐渐完美这个软件,当然这也不可能达到完美的标准,只是更接近用户的需求了,其实这已经足够了,你为了用户制定出软件,满足了他们的需求不就是完美的了么?那些什么良好的UI、UE,如果end user根本都没能感到你的用心良苦,那只能算是你的蛋疼设计了(为用户创造出需求的除外)。

质量算是需求的一部分么?

我们的需求文档会包含质量的规约么?乍一看似乎有不同声音,需求文档只要满足需求,需求又是什么呢?人们在描述自己需求的时候会加入质量这个衡量标准么?还是找大牛们交流去吧。

何时stop。这个问题在我这里常常出现,似乎coder都免不了带点完美主义,做一个feature会不断refine it,最终overrefinement,make a solution becomes academic research。作者没明确说when,只是说for a while,然后慢慢完善就好了。。。不负责的作者。

补充几个单词:

overembellishment:      过于美化
sketch out:             拟订
preferable:             更好的
tight:                  紧的
polish up:              改善
advocate:               提倡
stringent:              紧迫的
pacemaker:              心脏起搏器
space shuttle:          航天飞机
disseminate:            公开的
shorter incubation:     短潜伏期
conspire:               阴谋
oft:                    常常
mar:                    破坏
strive:                 努力

Pragmatic Programmer Log

stone soup 和 boiled forgs是两种不同的引导,一种是良性的,一种是”恶性”的。恶性的意思是,你对forg有伤害,最后被你煮死了。而stone soup只是借助其他人的力量达到自己的愿望,所以,boiled forgs主要还是提醒我们要有一个big picture的概念,时刻拥有,感知周围的changes,否则你只有被cook了。

我们似乎正处在stone soup这个环境里,做出的产品正在给编辑们用,还有一些别的部门后期也会参与进来,让他们使用这个并不完善的系统,然后得到那种“如果加上xxx就会更好用”了的建议,我们再改进,最终能够做一个让用户满意的系统,那也是我们的愿望。

来几个单词:

hoard:          贮存
undeterred:     未受损的
ingredient:     作料
moral:          道德
trick:          戏弄
catalyst:       催化剂
synergistic:    协同的
tackle:         处理
stare:          凝视
fatigue:        疲劳
reasonably:     适当地
marvel:         惊异
glimpse:        一瞥
gradual:        逐渐
progressively:  逐渐地
deception:      骗局
tightly:        紧紧地
creep up on:    爬向
inexorably:     不可阻挡地
disaster:       灾难
morale:         斗志
perceive:       注意到
will:           决心,意志