bnly.org使用crontab来不断fetch和send,这看起来很傻,不过挺容易搭建。目前send过程每分钟一次,fetch过程10分钟一次。
在ubuntu下默认没有cron的日志,需要这样开启:
1 2 3 4 |
|
这样就可以在/var/log/下找到cron.log查看了。
bnly.org使用crontab来不断fetch和send,这看起来很傻,不过挺容易搭建。目前send过程每分钟一次,fetch过程10分钟一次。
在ubuntu下默认没有cron的日志,需要这样开启:
1 2 3 4 |
|
这样就可以在/var/log/下找到cron.log查看了。
sed是个极其强大的东西,今天开始学习一点点:)
以前的一个sed的命令终于明白了:
1
|
|
这是替换html编码用的一个语句,find出当前目录下的html文件名字,然后传给sed,当然这里用到了xrags中转,其实没有的话也ok(除非你不用-i模式),sed用了-i模式,可以编辑文件内容保存,并且存一个备份,当然你得传入一个扩展名字才能保存,没有的话就不存和没有-i效果一样。后面的一个字符串,s表示用正则匹配,s后面的是一个分隔符,可以用斜杠,可以换你喜欢的,但后面都要统一起来,上面的意思是iso-8859-1这个替换成utf-8,最后的加的/g是表示global替换,全部替换,否则就替换一次。
后来看起别的书来了。
今天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,弄了半天发现就只有几行增加,真是不全局看的话,工作量就会无形的被自己放大。。。
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的参数很有意思,是用数字来命名的,从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
|
|
可以查找带有xxx的文本行,默认情况下如果你查找的xxx内容不含正则的mate字符就是使用了-F选项,所以简单的查找可以不加这个选项。
上次说到了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 |
|
可以做一个探测,是否myfile有pattern,这样不会产生输出。
/dev/tty的功能是,当程序打开这个文件时会重定向到一个terminal,在需要输入密码的时候用的到:
1 2 3 4 5 6 |
|
shell的PATH中最好不要放入当前目录这一选项,这会带来安全问题,所以干脆就不要这么想了:)
今天开始学学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好了:—)
今天就先到这。
昨晚看完了第一章,顿时感觉十分充实,因为在过去的一个星期里每晚都在看书而不是把时间花在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: 表达
“出来混总是要还的”,这句话已经被很多人认定是亘古不变的真理了,呵呵。
比较喜欢的一章,讲软件的足够完美性。世间几乎所有东西都不是完美的,当然有完美的——“不完美”就是完美的,就像“永远不变的只有变化”一样。
似乎和昨天的有些关联,要先给用户们一个不够完美的东西用,他们就会给出意见,你再逐渐完美这个软件,当然这也不可能达到完美的标准,只是更接近用户的需求了,其实这已经足够了,你为了用户制定出软件,满足了他们的需求不就是完美的了么?那些什么良好的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: 努力
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: 决心,意志