发布新日志

  • 【php】数组下标不加引号报Notice: Use of undefined constant

    2010-11-19 19:57:27

    php数组中,数组下标不加引号,就会报错:Notice: Use of undefined constant
    如:$config[title]="FinalFantasy";
    Notice: Use of undefined constant title

    解决:title是个索引.是一定要加单引号的..
    否则php会先去查找是否存在title这个常量.
    然后再当索引处理.效率相差是很大的.

  • 【php】php中与数组相关的处理函数

    2010-11-18 21:01:08

    php数组的相关处理函数
    current(数组名称) 输出数组中一个字符串的值,从第一个起.
    key(数组名称) 输出数组中一个下标,从第一个起.
    next(数组名称) 控制数组指针向后移动.
    prev(数组名称) 控制数组指针向前移动.
    end(数组名称) 控制数组指针移向最后一位.
    reset(数组名称) 控制数组指针移向第一位.
    array_change_key_case(1.目标数组 2.CASE_UPPER大写 或 CASE_LOWER小写) 将数组下标全部改为大写或小写.
    array_chunk(1.目标数组 2.分解个数 3.输出布尔型的真或假) 将一个数组分解成多个小数组.
    array_count_values(数组名称) 用来计算数组中各值出现的次数.
    array_fill(1.下标从几开始 2.输出多少个 3.他们的值是什么) 用来做初始化数组.
    array_filter(1.目标数组 2.使用者定义的函数) 过滤函数,自定义以什么标准为真,以什么标准为假,此函数可以自动过滤掉假的字符串.
    array_flip(目标数组) 将下标变值,值变下标.
    array_sum(目标数组) 计算目标数组中所有元素值的总和.
    array_unique(目标数组) 去除目标数组中重复的值.
    array_values(目标数组) 将目标数组中所有下标都去掉,重新从"0"开始计算此函数中值的下标.
    array_keys(目标数组) 输出目标数组中的所有下标.
    in_array(1.要找的东西 2.目标数组 3.是否严格按照数据类型查找,是就输true) 查找目标数组中有无查找的数据.
    array_search(1.要找的东西 2.目标数组 3.是否严格查找) 查找目标数组中有无查找的数据,有则输出此数据的下标.
    array_key_exists(1.要找的下标 2.目标数组) 查找目标数组中有无查找的下标,有则输出true,无则输出false.
    extract(目标数组) 将数组转换成变量.
    compact(要转换成数组的变量下标) 将多个变量转换成数组.
    数组与栈 (先进后出)
    array_push(1.目标数组 2.压入栈的值) 压入栈函数.
    array_pop(目标数组) 弹出栈函数.
    数组与队 (先进先出)
    array_unshift(1.目标数组 2.压入对的值) 压入对函数.
    array_shift(1目标数组) 弹出对函数.
    忽略键名的数组排序:
    sort(目标数组) 从小到大的排序.
    rsort(目标数组) 从大到小的排序.
    保留键名的数组排序:
    asort(目标数组) 保留原下标,值从小到大的排序.
    arsort(目标数组) 保留原下标,值从大到小的排序.
    自然排序法排序:
    natsort(目标数组) 保留原下标,值从大到小的排序,不区分大小写.
    natcasesort(目标数组) 保留原下标,值从小到大的排序,不区分大小写.
    array_merge(1.目标数组 2.目标数组......) 合并多个数组.
    array_diff(1.被比数组 2.比数组 3.比数组......) 求数组的差积.
    array_intersect(1.被比数组 2.比数组 3.比数组......) 求数组的交积
  • 【转帖】气质的养成--写的真不错,每个人都应该读读

    2010-06-28 20:20:26


    一:沉稳
         (1)不要随便显露你的情绪。
         (2)不要逢人就诉说你的困难和遭遇。
         (3)在征询别人的意见之前,自己先思考,但不要先讲。
         (4)不要一有机会就唠叨你的不满。
         (5)重要的决定尽量有别人商量,最好隔一天再发布。
         (6)讲话不要有任何的慌张,走路也是。

    二:细心
         (1)对身边发生的事情,常思考它们的因果关系。
         (2)对做不到位的执行问题,要发掘它们的根本症结。
         (3)对习以为常的做事方法,要有改进或优化的建议。
         (4)做什么事情都要养成有条不紊和井然有序的习惯。
         (5)经常去找几个别人看不出来的毛病或弊端。
         (6)自己要随时随地对有所不足的地方补位。
    三:胆识
         (1)不要常用缺乏自信的词句
         (2)不要常常反悔,轻易推翻已经决定的事。
         (3)在众人争执不休时,不要没有主见。
         (4)整体氛围低落时,你要乐观、阳光。
         (5)做任何事情都要用心,因为有人在看着你。
         (6)事情不顺的时候,歇口气,重新寻找突破口,就结束也要干净利落。

    四:大度
         (1)不要刻意把有可能是伙伴的人变成对手。
         (2)对别人的小过失、小错误不要斤斤计较。
         (3)在金钱上要大方,学习三施(财施、法施、无畏施)
         (4)不要有权力的傲慢和知识的偏见。
         (5)任何成果和成就都应和别人分享。
         (6)必须有人牺牲或奉献的时候,自己走在前面。

    五:诚信
         (1)做不到的事情不要说,说了就努力做到。
         (2)虚的口号或标语不要常挂嘴上。
         (3)针对客户提出的“不诚信”问题,拿出改善的方法。
         (4)停止一切“不道德”的手段。
         (5)耍弄小聪明,要不得!
         (6)计算一下产品或服务的诚信代价,那就是品牌成本。

    六:担当
         (1)检讨任何过失的时候,先从自身或自己人开始反省。    
         (2)事项结束后,先审查过错,再列述功劳。
         (3)认错从上级开始,表功从下级启动
         (4)着手一个计划,先将权责界定清楚,而且分配得当。
         (5)对“怕事”的人或组织要挑明了说。

    ps:附上培养的99个好习惯

    习惯从细节做起
    1. 从容从大方开始
    2. 培养自信的语言
    3. 让你的笑容像阳光一样
    4. 积极表露你的热情
    5. 让表达自己成为一种习惯
    6. 让你的肢体语言更有感染力
    7. 谈吐讲究“不凡”
    8. 站坐走要“有形”
    9. 让你的行动更干练
    10. 用知识来武装自己
    11. 用音乐来熏陶自己
    12. 让自己的穿着大方得体
    13. 时时注意自己的形象
    14. 做个懂得静修的人

    好习惯带来好心情
    15. 关键时刻要放松
    16. 紧张的时候深呼吸
    17. 别为小事生气
    18. 学会控制自己的情绪
    19. 让自己冷静而不狂躁
    20. 及时给自己减压
    21. 悲观时,进行自我暗示
    22. 自觉保持谦逊
    23. 人生不时要冒险
    24. 用变通打破困境
    25. 让自己充实起来
    26. 虚心接受别人批评
    27. 偶尔吃亏心要宽
    28. 时时提醒自己要从容
    29. 经常进行自我对话
    30. 定期进行自我评估
    31. 每天自省一小时
    32. 进行适当的自我肯定
    33. 正确认识自己的缺点
    34. 做你害怕的事


    好习惯造就好生活
    35. 每天晨炼半小时
    36. 养成用早餐的习惯
    37. 吃饭只吃八分饱
    38. 要养成吃鱼的习惯
    39. 蔬菜水果天天吃
    40. 充分利用纤维食品
    41. 多喝水,再多喝一点儿
    42. 常喝绿茶。细品茶的意蕴
    43. 经常服用维生素
    44. 戒烟戒酒,戒掉恶习
    45. 要养成按时作息的习惯
    46. 静心养神一刻钟
    47. 随时随地活动身体
    48. 走走楼梯好处多
    49. 带上绳子去运动
    50. 学会用游泳强健心肺
    51. 永远是跑步一族
    52. 保持快速步行
    53. 爬爬山,出出汗
    54. 定时走进健身房
    55. 爱上单车瘦身运动
    56. 隐形体操,忙里偷闲
    57. 定期体检,为健康护航
    58. 经常和大自然亲密接触


    好习惯成就好前程
    59. 制定有效目标的习惯
    60. 经常进行战略思考
    61. 用计划来掌控全局
    62. 遵循规则,尊重规则
    63. 大事化小,分段完成
    64. 要事第一,主次分明
    65. 管理好你的时间
    66. 心动就快行动
    67. 效率从办公桌开始
    68. 每天一张图表
    69. 全力以赴地做事
    70. 注重细节
    71. 快速处理小事
    72. 一次只做一件事
    73. 让电话变简洁
    74. 养成不屈不挠的风格
    75. 尽善尽美,方成就大事
    76. 把喜怒哀乐藏起来


    好习惯赢得好人缘
    77. 准时赴约
    78. 用“眼睛”去倾听
    79. 记住别人的姓名
    80. 认认真真去握手
    81. 少谈些自己,多谈些他人
    82. 投其所好来交流
    83. 欣赏之感溢于言表
    84. 做个好听众
    85. 多多鼓励,善于激励
    86. 双赢思维
    87. 不要抱怨别人
    88. 别总指责别人
    89. 学会交流,与人协作
    90. 尊重别人的隐私
    91. 善待他人
    92. 宽容是交友之道
    93. 用心经营你的家庭
    94. 充满爱与感激的小纸条
    95. 每天说句“我爱你”
    96. 别把工作带回家
    97. 温情的家庭日
    98. 小礼物的惊喜
    99. 把他的优点说出来

     

  • linux下svn的用法

    2010-05-05 14:07:56

    场景:
    写了新的testcase,需要上传至svn
    step1. 在svn中创建目录: svn mkdir -m "making a new dir..." http://...../newdirname
    step2. 将新建的目录check out出来: svn co http://...../newdirname
    step3. 将写好的testcase拷贝到该目录下
    step4. 进入newdirname目录,将testcase添加到svn控制(预定添加到版本库): svn add *
    step5. 将testcase上传至版本库: svn ci * -m "add your comments...."
    说明:如果在step4后,又对testcase做了修改,之后再ci会出现问题,此时需要使用svn revert取消对版本库的预定,然后再重新预定、上传即可。
  • vim中文本块拷贝黏贴(很好很强大...)

    2010-04-26 16:19:24

    请教:vi中的文本块拷贝和粘贴(附原创正解……^O^……)转自:http://bbs.chinaunix.net/archiver/?tid-448310.html

    如何用vi灵活地对文本块进行操作?(原创)

    // 版权所有,欢迎引用,但请标明出处和作者……^O^……

    一、预备知识:
    y  复制(yank)
    d  删除(delete)
    p  粘贴(put,小写表示在当前位置之后粘贴,大写表示在当前位置之前粘贴)
    c  修改(change)
    m<字母> 对光标位置做标志(mark)
    “<字母> 对寄存器进行操作(英文的双引号,小写字母为覆盖模式,大写字母为追加模式)
    `<字母> 将光标移至标志<字母>下(Esc下面的按键)
    ‘<字母> 将光标移至标志<字母>所属行第一个非空白字符下(英文的单引号)

    二、举例:
    yw   复制光标当前位置至该单词(word)结束位置的字符串
    yy   复制光标当前行
    y3y  复制从光标当前行开始往下3行
    ……

    三、实现需求:
    研究以上格式(第一个y意思是我要进行复制啦,之后是我要复制的是什么呢?)得出,欲复制某一文本块,其格式是y<文本块的范围>,其中<文本块的范围>可通过m<字母>来确定,所以可通过以下步骤灵活地对文本块进行操作:
    1、将光标移至欲对之操作的文本块开始或结尾字符处,m<字母>(例如ma);
    2、再将光标移至该文本块的另一端的字符处(如果m标志的是文本块开始字符,则将光标移至文本块结束字符之后;如果m标志的是文本块结束字符,则将光标移至文本块开始字符下);
    3、y`<字母>(例如y`a,其中“`”是“Esc”下的按键,如果用英文单引号则整行复制,切记);
    4、将光标移至欲粘贴的位置,p;
    5、ok,大功告成!

    四、扩展:
    在执行步骤3时,通过”<字母>y`<字母>(例如”ay`a,格式中的两处<字母>可以相同,因为它们是完全不相关的两个概念)可以将复制的内容放入寄存器<字母>中,然后通过”<字母>p(例如”ap)进行粘贴。

    五、进一步扩展:
    用以上方法将另一文本块标志,通过”<字母>y`<字母>(采用追加模式,例如”Ay`b,是大写的字母A)将该文本块追加到原寄存器<字母>中,然后还是通过”<字母>p(例如”ap)进行粘贴。

    d(elete)、c(hange)对文本块的操作类似于y(ank)操作……^O^……
  • 【ZT】AWK/shell/bash变量问题汇总

    2010-02-24 16:04:21

     

    awk中使用shell的环境变量
    一:"'$var'"
    这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法.如:
    var="test"
    awk 'BEGIN{print "'$var'"}'
    这种写法其实际是双括号变为单括号的常量,传递给了awk.
    如果var中含空格,为了shell不把空格作为分格符,便应该如下使用:
    var="this is a test"
    awk 'BEGIN{print "'"$var"'"}'
    二:'"$var"'
    这种写法与上一种类似.如果变量含空格,则变为'""$var""'较为可靠.
    三.把括起awk程序的''变为"",使用"$var"
    如:
    $var="this is a test"
    awk 'BEGIN{print "$var"}"
    这是因为在""里$是特殊字符,而在''里$是普通字符.
    四:export 变量,使用ENVIRON["var"]形式,
    如:
    $var="this is a test";export $var
    awk 'BEGIN{print ENVIRON["var"]}'
    五:当然也可以使用-v选项
    如:
    $var="this is a test"
    awk -vnvar="$var" '{print nvar}'
    这样便把系统变量定义成了awk变量.

    二.在awk中给系统变量附值

     eval $(awk 'BEGIN{print "a=ggg b=3"}')

    eval $(grep -v '#' "$CONFFILE" | awk 'BEGIN{FS="|"} NR=="'$var

  • 怎样才算做好了你的工作?

    2010-02-22 18:36:33

    其实这个问题想了好久了,一直觉得自己挺卖力的,一直认为自己在工作中勤勤恳恳尽职尽责,但却总找不到突破。
    之前我也抱怨过生活,抱怨过不公平,这段时间忽然有了一些别样的感受,不知道自己能不能突破,但是我会一直努力下去,努力改变自己,只有自己变化了,生活和工作才会在一成不变时有所突破。
    以前看到过这样一句话:当不知道自己该怎么做,当感觉自己很迷茫时,观察一下别人,看看他们是如何说话,做事,跟同事、上级交流的,我想你一定会有收获,总是缩在自己的空间里,永远得不到进步。
    另外,有一个很有必要也很有意思的前提需要说一下,如果你从事的行业非常顶尖,你做的事情别人做不了,ok,那该文对你不适合。如果你像我一样,做的工作很多人都可以做得到,但是有些人,哪怕资质并不一定比你强,却能总是那么好的完成工作,前进的步伐总是比你快呢?如果你也曾这样想过这样疑惑过,可以看看以下我的总结,希望大家能够跟我一起探讨。
    看看大家有没有真正到“做好工作,全心全意,尽职尽责”吧:
    1.做好应做的工作,说白了就是上头安排的任务------很多朋友只停留在这一层的吧,包括我也是
    2.交流----交流太重要了,工作中的任何事情,都可以交流,会的可以交流(适当的表现一下也无妨),不会的更要交流,适当的运用请教、商量、探讨的语气去交流,不能太卑微,也不能太自大。还是要强调交流啊,为什么呢,没事儿多交流,由一到二,由二到三,会从同事嘴里挖到好多你不知道的东西,思想的火花一碰撞,你会有新的发现,试试看吧。
    3.多关注部门的事情-----部门的生死存亡跟你的生死存亡息息相关的,部门的事情就是你的事情,多关注没什么坏处,不要每天一副事不关己的样子,说白了就是懒惰,我自己也是,懒,懒得去关注别人,更懒得去关注部门或者公司的事情;
    4.工作要做的周到,到位----工作完成了,测试结果出来了,bug提交了,好,ok了。真的ok了么?没有,你还需要整理数据、完善测试代码、整理文档、整理测试结果、发送测试报告……等等等,好多收尾的,细节的东西,你在做这些东西的时候,也是会有收获的,有时会发现一些自己测试CASE里的遗漏。另外,更重要的是,你发report给上级,给team,这样大家尤其是上级,才能知道你做了什么。
    5.report的重要性----继续4里说的,总结,总结,总结,报告,报告,报告。另外就是花一些心思在报告的格式和内容上,不要report那些leader不关心的东西,要重点突出。
    6.由自己工作中遇到问题,想到如何方便大家的工作-----由我及人的做法,平时和同事交流的时候可以探讨,我遇到了这类问题,你有没有遇到?怎么才能方便大家的工作等等,我一直相信碰撞的思想就像流水一样,流水不腐,千万不要当那一潭死水。
    7.多和上级交流----主管、teamleader工作经验、处事经验、应急能力,都比你强,资质比不比你强不一定,关键是他是如何坐到这个位置的,多请教,多交流,多学习,多观察,team leader的工作特点,处事方法,看看自己有哪些不一样的地方,好的就要吸收过来,改正自己的缺点。
    8.没事多总结----工作告一段落了,不是让你去花大把时间看片消遣的,先来个总结,把事情弄的完美无缺了,ok,玩吧,尽情的玩,前提是,看那个总结必须能让你记起来什么事情才行。其实我以前从来不总结的,觉得没必要,反正自己做过的事情,体验过了,记住了,但是,整理文件和物品的时候你知道,给个分门别类条条框框让你整理的整整齐齐,利用最小的空间更高效的存放和查找东西,是不是更好?我们的大脑也一样啊,像硬盘一样的存储空间,整理好了找起来更便捷。
    9.哈哈,以上的我都懂其实,只是我一直没这么做----因为你懒!你跟我一样是个懒惰者,思想上的懒惰者,快动起来吧,不然有你受的!
  • [ZT]Google百度和谷歌的那些事

    2010-01-15 16:57:42


    作者:virushuo 发表于 2010-01-14 22:01 最后更新于 2010-01-14 23:01
    版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明。
    http://blog.devep.net/virushuo/2010/01/14/blog56google_blogtinyfool_1_go.html

     

    很久不在这个blog上写和技术无关的东西了,尤其不想写跟业界有关的东西,觉得太空,太忽悠,对别人没价值。但这次,我想写写这56年对google和百度的一些观察心得。这里面,这里面存在大量的个人推论,我并不能担保完全正确,请只当作是一次思想的碰撞。

    这篇blog主要由我完成,Tinyfool提出了大量修改意见,亦有重要贡献。

    1 google,不作恶,信息流动

    众所周知,google的目标是"整合全球信息"。从另外一个角度看来,这可以看作加快信息流动。信息流动变快是有巨大的经济价值的。加速,始终是 人类经济活动的主线,快即是价值。从蒸汽时代到现在,每一次让移动速度加快的方式都造成了人类巨大的变化,只不过,在蒸汽和机械的时代,加快的是人和货物的移动,信息时代加快的是信息的流动。

    仔细观察,可以发现,很多事情不再需要实体物质的流动。比如,我们不再需要人去送一封信,而只需传递一封电子邮件。我们也不那么需要去订阅一份报纸 送上家门,而只需要浏览门户网站。这是信息时代带来的改变。而Google所做的,是继续加快这种信息流动的速度,让人们需要的东西更快的呈现在眼前。

    Google始终坚持Pagerank排名,除了惩罚作弊者,并未干预过任何排名。这是因为,信息的正常流动才会加速,加速信息是Google的价 值,也带来巨大的经济价值。Google绝对不允许把广告插入到搜索结果中。否则搜索结果质量会下降->用户不满意->搜索量降低-> 广告点击降低,最终仍然造成收入下降。(后面我们会讲到百度完全不同的做法)

    投放过Adword的同学会发现,并非价格越高越好,就算单价非常高,如果匹配度很低,广告点击率就会很低。这样Google仍然会降低这种匹配的出现频率。这样就避免了在AB的搜索结果中投放"我是B"的广告来误导用户。

    在这个体系下,有用的东西就是有用的,信息流动会变快,Google会推动这种信息变的更快,没用的东西就是垃圾,会阻碍信息流动,Google就让他变的更慢,直到被放弃。

    Don't be evil 这句口号,可以理解为东欧出生的布林对人生的追求,也可以理解为Google商业利益的准则。因为,越是不作恶,越是让信息有序,正常的流动,给 Google带来的实际利益也就越大。很多人认为这只是一句作秀的口号,事实上这是商业和个人追求的双重准则。


    2 baidu,竞价排名,Google

    百度显然看到了搜索的巨大价值,于是挤进了这个市场。我们且不论搜索质量,先看百度的利润来源。

    百度同样有右侧广告(类似Adsense)和左侧排名。左侧排名就是所谓的竞价排名,这是百度的"创新"。竞价排名是百度收入的主要来源(1)

    前面说过,竞价排名会干扰用户搜索体验,这大家都深有体验,某些热门关键词,百度前几页的结果都是竞价结果。那么为什么Google不敢这样做,而百度这样做就赚翻了呢?

    昨天我在twitter上说过一句话:"adsense是促使信息有序流动并盈利,竞价排名是破坏信息流动并盈利。也难怪两个公司的人看问题截然不同。"

    很多人有体验,如果你的搜索结果比较靠前,百度会有销售来找你做竞价排名,如果不做的话,很快你的搜索结果就骤减。这种"巧合"正好说明了阻碍信息流动也是可以盈利的。换言之,帮助别人照看孩子可以赚钱,威胁别人家孩子来收保护费也可以赚钱。

    那么,按照前面的说法,阻碍信息流动的应该会被用户抛弃,在百度这边为什么情况相反呢?

    搜索引擎的结果好坏实际很难评价,通常来说,"10%"是完全没有意义的。这在这个市场上反复被证实,仅仅让搜索结果比对方好10%,或差 10%,不会对用户体验影响太大。第二梯队中的搜狗,有道,搜索结果未必真的比百度差多少,但无论如何也无法翻身。同样的竞争也发生在了 Google,Bing,Yahoo之间。换言之,搜索引擎产品是一种先入为主的产品。

    在百度起家的年代,Google遭遇了最严重的屏蔽。大家应该都有体验,在大公司内基本无法正常访问Google。我们且不去讨论这种屏蔽的始作俑 者是否是百度(无论百度是否加快了这种行为,最终的结果也必然发生)。那几年,又正好是中国互联网用户增长最快的年代(2)。大量的新互联网用户直接成 为了百度的用户。

    搜索引擎市场上,"获得第一批用户"是至关重要的。

    比较百度和Google的产品和收购策略,百度通常收购能带来巨大流量的产品,包括hao123,天空软件站等等。而Google收购的通常是具有独特的技术,可产生独特数据的产品,比如Analytics,blogger

    百度的主要企业运营行为是围绕"获得第一批用户"的。这些方法包括:工具条,hao123,和软件下载站合作等等。Google被屏蔽看作这种行为的反向手法,无论是否百度造就的,至少这个结果导致了百度获得了更多的第一批用户。

    在一个基本没有竞争对手的市场上,百度可以"挟流量以令诸侯",这时候,他破坏一部分信息正常流动也不会造成太严重的后果。因为用户毫无比较。

    Google的铁杆用户分为两类。一类是早期用户,这部分用户用过Google,也用过百度。有明确的比较和鉴别能力。他们最终选择了 Google。另外一类是专业用户,他们真的发现百度找不到他们需要的东西。这时候Google对比百度的优势大大增加,到达了用户满意程度的临界点,于是这部分用户也选择了Google

    在中国互联网上,大部分用户偏重娱乐。这些用户很难分辨Google和百度的区别。甚至他们会觉得百度更好一些,因为百度提供了方便无比的MP3搜索。他们一旦先尝试了百度,那么就会留下,继续成为百度的用户。这就是我们今天看到的样子。


    3 谷歌做了什么

    2006年,Google决定开设中国办公室,并命名为谷歌。这是Google创始以来,最大胆,也是最小心的尝试。他们从来没有过试图进入一个需要过滤某些内容的国家(如前所述,这是阻碍信息流动,同时也背叛了Google的价值观)

    我们可以从一些细节看到Google的小心翼翼。比如,Google.cn是没有Google Account的。用户不能注册,也就没有密码,因此也就没有泄密之忧。后来有人嘲笑谷歌音乐可以用各种帐号登录,但就是不能用Google Account登录。所有需要登录的Google服务都没有进入中国。包括Gmail,Gtalk,Blogger等等等。

    Google从进入中国那一天,就给自己设置好了底限。这种底限,就是李开复所说的"总部压力"

    李开复的谷歌,是谷歌,绝不是Google。是一个像百度的外企。

    3个字可以来概括谷歌几年的工作:"倒流量"。倒流量的工作由一系列的合作(迅雷,sina,天涯,265)完成。这和Google的传统做法完全不同,Google几乎不去主动谋求流量,产品质量会解决所有问题。但谷歌必须谋求流量,一个急进,喜欢去大学讲座和写书的职业经理人,不会有创始人那样的耐心慢慢的守着一个市场。这让谷歌越来越像百度。

    众所周知,用和对手一样的手段不可能打倒对手。

    谷歌推出的最重量级产品,是谷歌音乐。这显然是看到了百度在MP3搜索上获得的好处,意图获得以娱乐为主的用户。当然,鉴于Google全球的品 牌,这些音乐需要有版权。我不评价这个产品的好坏,但这显然和Google总部习惯格格不入。难道Google不知道去做一个音乐下载产品吗?难道 Google不能去做一个下载站吗?总部不去做,只不过是因为这和价值观不符。

    同样的价值观不符,还包括和天涯合作的来吧。之前说过,除了独特的数据,Google不会主动创造内容。以Google的胸怀,可以去索引百度贴吧和知道,并放在结果的显著位置,但没必要自己去模仿一个贴吧出来。这种竞争的水平太低了。

    甚至,谷歌把中国访问Google.com的流量"劫持"到了Google.cn,以便提高自己的"占有率"。这件事让很多Google老用户恼火,Zola曾经在某个李开复参与的活动中举手提问,如何才能在中国正常的访问Google.com

    "倒流量"之后,谷歌的市场占有率有所上升。这是应该的。不过,新上升的占有率中,有多少是真正的搜索流量就不得而知了。正如百度搜索和贴吧等产品的比值是个秘密一样。

    百度跟在Google后面,而谷歌跟在百度后面。

    除了倒流量,谷歌也在"抓收入"

    投放过Adsense的朋友,大概会记得,Adsense的匹配质量越来越差,医疗方面的内容也越来越多。之前经常有人因为作弊被封掉帐号,后来再也没人说过自己的帐号被封。

    07年的两篇blog提到了这件事:
    对不起,这是谷歌,不是google
    去掉了blog上的google adsense

    这两个特点都不是Google Adsense应有的特性。Google Adsense应该是匹配准,不干扰用户,且提供有用信息。时常读英文内容的人会时常看到Adsense广告的匹配相当精确,时而有点击的必要。

    离开了这两个特点,可以把谷歌的广告看作一个大的广告联盟。这和拿了很多小网站的Banner的流量去找广告主谈价本质是一样的。在这种广告销售策略下,不需要匹配,不需要杜绝点击欺诈。最舍得花钱投这种广告的,无非是医疗,美容几类。

    这几类是最赚钱的部分。不仅对于谷歌,对于百度,甚至对电视台都是一样的。

    关于Adsense的故事,可以看看Tiny这篇文章 :我和Google Adsense那点故事

    在这5年中,最常被记者们提起的"谷歌困境"就是"总部压力"。在我列出的这些部分,都已经触及到了Google价值观,所以Google必然不满。

    有兴趣的同学可以对比一下2005~20105年,Google做了什么,谷歌做了什么。你会看到截然不同的项目。虽然结果看起来似乎都是:"市场份额增加,收入增加"Google在这几年,砸实了搜索的基础,扩大了搜索的内容来源和范围,把索引伸向了非数字内容,完成了地图/卫星图 /Earth/街景等一系列重要产品,完成了在移动和3G方面的布局。谷歌做了什么呢?音乐,热榜,还有一个抄袭的输入法。

    从谷歌存在的那天,我就写过一篇文章,核心意思是:要么把中国当作研发基地,投资,研发,但不运营,要么就干脆去印度开分公司。不幸言中。

    4 孙云丰的观点

    从商业价值和经济利益方面考量,都可以看出Google的不作恶,并不是作秀的口号。对于一个靠信息有序化赚钱的公司,必须要不作恶才行。百度正好相反,必须要作恶才行。

    Google是幸福的,可以把商业价值建立在一个正确的价值观之上。这确实是可遇不可求的机会。很不幸,百度不行。

    孙云丰的言论是无法自圆其说的。一方面,他认为Google不是人权斗士,只是个为了利润的市侩分子。另一方面,他又高举社会公平的大旗,宣称百度的道德感。这两者之间有明确的冲突。如果Google只为了利润,那么百度同样不应该有道德可言。

    一方面,他宣称自己观点毫无错误,另一方面,他又删掉了自己的文章。有人说删贴未必是他自己的意愿。那么,作为宣称"有道德感"的百度员工,他不应该屈从别人的意见删掉自己认为正确的东西。作为百度高管,不应该允许百度公关去打电话要求别人删贴。

    今天有一些百度员工为孙云丰辩护,这些说法同样无法自圆其说。试图证明百度是一家很好的公司,并不能证明孙云丰说的正确。正如纳粹德国有一支很有战 斗力的军队,并不能证明希特勒是正义的。他们甚至自相矛盾,认为孙云丰对竞争对手恶言相对是正确的,其他人骂孙云丰是错。如果孙云丰代表自己骂了一家公司,该公司的用户有权回击。如果孙云丰代表百度,那他严重的缺乏职业道德。从任何角度,我也得不出百度员工和前员工的那些结论。

    当然,我从来也没认为过百度是一家很糟糕的公司,甚至很多次认为百度正在逐渐变成一家有责任感的公司。遗憾的是,从高管到员工,似乎都没和这家公司一样完成这种转变。

    不要以为这次事件打击了Google在中国的份额就幸灾乐祸,事实上,中国的互联网市场消失了。这和市场份额无关,和宏观形势有关。这个国家温情脉脉的互联网时代就此结束,就好比IT精英们看不起的那些传统生意人一样,慢慢被兼并,重组,消亡,剩下的那一点,会被扫倒利润微薄的边边角角。就好比,你家楼下菜市场那个可怜的菜农,守着那一点点收入,还要担心城管。这是这个行业中每个人的悲剧。

    Tinyfool:百度的矛盾在于,Google的成功是他在全世界资本市场受宠的原因,但他们可能无时无刻不想google死掉会更好。在全世界范围内,这是不可能出现的,现在在中国出现了,他们真的会高兴吗?

    Google给我们的最大价值,除了信息流动加速,就是信息永存。当我写完这篇blog,发布在我的blog上,按下"发布"之后的几分钟,各种蜘 蛛就会蜂拥而至,把这篇文章复制若干次,存在这世界的各个角落。这文章即永存。无法被某个组织控制或删除,也无法阻止其流动。公关公司不行,某个国家政府也不行。孙云丰的言论,和百度其他员工的言论,也将和这篇文章一样,被永存,成为历史的一部分。这是我们热爱Google的原因。

    现在,我要按下发布按钮了。

  • SecureCRT客户端频繁超时问题

    2009-11-25 14:46:09

    由于客户端、服务器端存在路由器、防火墙,为了本身的安全性,在超过特定时间后会把空闲连接断开。

    解决办法:

    1.可以修改服务器端参数,使服务器每隔一段时间向客户端发送一个消息,用于保持连接。

    /etc/ssh/sshd_config 文件中的ClinetAliveInterval 300(默认为0)

    2.最好的办法是修改客户端设置,使客户端每隔一段时间向服务器发送一个消息,以保持连接:

    SecureCRT选项->会话选项->终端->反空闲,设置每隔多少秒发送一个字符串或者发送NO-OP协议包。

  • 人类一思考,上帝就发笑

    2009-09-02 10:33:30

    昨天被一个朋友问及职业发展的问题。我大谈特谈专注、领导、独当一面,结果朋友问,那5年以后的计划呢?

    我有懵掉。其实真是没想过5年以后,我的职业发展计划只停留在近三年。我问自己,5年以后呢?5年以后会是什么样子?5年以后,我是否还从事这个行业?是否还在继续耕耘我的技术之路,是否还和现在一样看待周围的一切,是否还跟如今一样清澈见底。不得而知。

    朋友问,5年以后想没想过转行做产品,或者市场等等。我没有回答。其实想想,挥霍了自己的青春去追寻一种自己向往的生活确实不会后悔但值不值得呢?可能明摆着一条适合自己走的道路,或者说能够让自己尽情挥洒长处和优点的道路,也或者说起点比大部分人都要高的道路,我不走,偏偏去走一条把自己摆在与众生平等之路上,生生埋没了自己的优点。

    我想啊,5年以后,也许不需要5年,在尝尽所有挫折,也尝尽成功之后,我会选择产品、市场、咨询等等,去做一些能够有所擅长的事情。其实什么叫做成功呢,就是当你从做的不好到做好,从别人都不需要你到别人都离不开你。从这个角度上讲,无论你从事什么行业,都可以成功。从另一个角度,即使你在一个自己期望,自己理想中的行业里,你满足于自己的成果却得不到大多数人的认可,那么,你仍然是不成功的。

    额。。好像很绕。。总之我想说的就是,善于发挥自己的长处,这才是最对的,无论对社会还是对自己,也是最有益的,不要碍于别人的目光和话语,要善于打破常规,呵呵,生活不需要太多条条框框,选择最有益于自己的就好了。

    我想说,无论在哪条道路上,无论职业生涯是怎样的挫折坎坷,五年以后,我一定会走在成功的道路上!

     

  • awk的学习和使用(四)

    2009-08-18 23:09:26

     
    在本系列的(一)中,学习了以下几个部分:
    awk的三种调用方式:命令行式、使用-f选项调用awk文件、将#!/bin/awk -f添加到awk文件首行。
    awk语法
    awk的记录、字段和内部变量
    awk的内置函数
    awk的自定义变量
     
    下面将继续学习后面的部分:awk的运算与判断awk的流程控制awk中的正则表达式awk与shell的混合编程
     
    一、awk的运算与判断
    awk支持多种运算,这些运算与c中的基本相同。
    运算符:+、-、*、/、%、++、--、+=、-=、=+、=-等;
    运算函数:log、sqr、cos、sin、length、substr等;
    条件测试:==、!=、>、<、>=、<=等;
    逻辑运算符:!、&&、||、()等;
     
    二、awk的流程控制
    BEGIN和END
    在awk中两个特别的表达式,BEGIN和END,这两者都可用于pattern中(参考前面的awk语法),提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。任何在BEGIN之后列出的操作(在{}内)将在awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。

    例:累计销售文件xs中的销售金额(假设销售金额在记录的第三字段):

    $awk
    >'BEGIN { FS=":";print "统计销售金额";total=0}
    >{print $3;total=total+$3;}
    >END {printf "销售金额总计:%.2f",total}' sx
    (注:>是shell提供的第二提示符,如要在shell程序awk语句和awk语言中换行,则需在行尾加反斜杠\)

    在这里,BEGIN预置了内部变量FS(字段分隔符)和自定义变量total,同时在扫描之前显示出输出行头。而END则在扫描完成后打印出总合计。

    流程控制语句
    awk提供了完备的流程控制语句,其用法与C语言类似:
    if...else语句
    while语句
    do-while语句
    for语句
     
    三、awk中的正则表达式
    对于awk而言正则表达式是置于两个正斜杠之间、由字符组成的模式。正则表达式位于awk语法中的pattern。如果输入行中的某个字符串与正则表达式相匹配,则最终条件为真,于是执行与该表达式关联的所有操作如果没有指定操作则打印与正则表达式匹配的记录
    例:显示文本文件mydoc匹配(含有)字符串"sun"的所有行。
    $awk '/sun/{print}' mydoc
    由于显示整个记录(全行)是awk的缺省动作,因此可以省略action项。
    $awk '/sun/' mydoc
    例:下面是一个较为复杂的匹配的示例:
    $awk '/[Ss]un/,/[Mm]oon/ {print}' myfile
    它将显示第一个匹配Sun或sun的行与第一个匹配Moon或moon的行之间的行,并显示到标准输出上。
    如何查找第一个字段匹配正则的行?
    例子:查找第一个字段中带有sun字符串的行,并打印;
    $awk -F"\t" '$1~/sun/{print $1 "\t" $2}' filename 
    awk中逗号分隔的两个pattern,表示对满足第一个pattern,到满足第二个pattern之间的行(包括满足pattern1的行,不包括满足pattern2的行),执行action操作。如我们常用的:
    awk 'NR==2,NR==5 {print $0} myfile'
    表示打印第二行到第四行。

     
    四、awk与shell的混合编程
    1.awk读取Shell script程序变量
    在awk中我们可以通过“'$变量名'”的方式读取sell scrpit程序中的变量。
    例:在下面的示例中,我们将读取sell scrpit程序中的变量Name,该变量存放的是文本myfile的撰写者,awk将打印出这个人名。 
    下面给出两种方式:
    第一种比较常用的方式:(双引号和单引号的意义需要明确)
    #!/bin/sh
    name='John'
    awk '{print $1,$2,"'$name'"}' myfile
    -------------------------------------------------
    第二种方式:
    #!/bin/sh
    name='John'
    awk '{print $1,$2,myname}' myname=$name myfile
    不过这种方式中,awk自定义变量myname不能在BEGIN中使用。
     
    2.将shell命令的执行结果送给awk处理
    作为信息传送的一种方法,我们可以将一条shell命令的结果通过管道线(|)传递给awk处理:
    例:示例awk处理shell命令的执行结果
    $who -u | awk '{printf("%s正在执行%s\n",$2,$1)}'
    该命令将打印出注册终端正在执行的程序名。

    3.shell script程序读awk的执行结果
    shell中可以将awk执行结果赋值给shell变量。我们可以用变量名=`awk语句`的形式将awk执行的结果存放入一个shell script变量。当然也可以用管道线的方法将awk执行结果传递给shell script程序处理。
    下面给出变量名=`awk语句`的方式(注释,awk语句必须使用键盘左上角的反引号引起来。)
    下例为:找出myfile中带有fail字符串的行并统计行数,最后打印出格式为:there are (行数) lines
    #!/bin/sh
    temp=`awk '/fail/{print $0}' myfile |wc -l`
    echo "there are $temp lines" 

    3.还有其他shell、awk混合编程的方式,由于本人对shell不是很熟,请参见原文吧。
  • Linux下的常用命令(不断整理中)

    2009-08-18 13:46:28

    1.合并两个文件:cat file1, file2 > file3

    2.清屏clear;客户端乱码时:reset;

    3.查看用户登录日志:who -u /var/log/wtmp  (也可以用last查看)

    4.统计记录行数: wc -l

    5.查找:find 路径 -name 文件/目录名

    6.显示隐藏文件(.开头的文件一般会被隐藏):ls -al 或者直接 ll

    7.查找rpm包安装路径 rpm -qlp xxx.rpm 或者rpm -ql xxx

      查找已安装的rpm包:rpm -qa|grep xxx

      查询一个已经安装的文件属于哪个软件包:rpm -qf 文件名 
      查看一下已安装软件所依赖的软件包及文件:rpm -qR 软件名

      查看未安装rpm包的信息,只要在上面的命令中多加一个参数p,比如:rpm -qpR ***.rpm

    8.在后台运行程序:后面加& 或者前面加 nohup
    9.ll -t 按修改时间倒序 (ll --help 查看)
      ll -rt 按修改时间正序
    10.xargs用法:
      ps -aux|grep "httpd"|grep -v "grep" |awk '{print $1}'|xargs kill 说明:把grep出来的结果,传给xargs执行kill操作;
    11.下载:wget url 举例:wget url -O filename.htm 
    12.cat /proc/version 查看版本信息
      cat /etc/issue 查看版本信息带有update信息
      uname -a 查看所有系统信息
      uname -r 查看kernel release
      uname -v 查看kernel version
      uname -p 查看处理器32位、46位
    13.文件编码转换:iconv -c -f utf-8 -t gbk file 将utf8编码的转成gbk编码
    14. 替换字符串:sed -i "s/zhangsan/lisi/g" `grep zhangsan -rl /modules`
    15.tee [-ai][--help][--version][文件...]  读取标准输入的数据,并将其内容输出成文件
    16. ls 2>&1 1>/dev/null 将错误信息输出到标准输出,将标准输出的其他信息输出到黑洞;
    17. rpm 卸载 rpm -e xx --nodeps
    18. 查看磁盘剩余空间: df -hl
    19. sar -r -5 -10 表示监控内存,并且每5秒取一个结果,一共取10个结果,sar是监控所有进程的资源占用情况,如果需要个别进程,可以使用ps aux |grep 方式

    20. top输出重定向有问题,无法重定向到文件
    21. zcat part-r-0000.gz | head -n 100 > a 
        zcat可以在不解压的情况下扩展压缩包并讲内容输出到标准输出

    18. chown -R admin:admin aaa/ 把aaa目录及目录下的所有文件修改为隶属于admin用户,admin租
    19. 查看机器cpu:cat /proc/cpuinfo
    20. 查看机器内存:free -m
    21. top查看cpu、内存占用率时,shift+o可以选择排序方式,默认是按用户名排序的
    23. 有sudo账号的情况下,想使用其他账号执行程序,比如想临时使用admin账号执行程序,可以这样:
         sudo -u admin  **.sh

         想一直使用admin账号,可以用su更好账号:sudo su admin

         退出使用exit


    24. 查看当前系统在线用户情况: w 、 who ,查看自己登录名:whoami
    25. dirname $PWD 查看当前目录的父目录
    26. sort后面不加文件的情况,默认从标准输入传入数据,使用ctrl+d终止终端输入
    27. cat file1 file2 > file3
    28. cd - 返回到上次所在的目录
    29. date -d"yesterday" +%Y%m%d 注意,+和%Y%m%d之间不能有空格
    30. unzip可以解压jar文件,unzip aa.jar -d AA
    31. 一个好用的for in 循环:
        for i in {1..100}
        do
          .......
        done

    32.vim时查看文件的编码:set fileencoding

       vim时转换文件的编码:set fileencoding=utf-8


     

    33. sudo /sbin/ldconfig
    命令解析:ldconfig是一个动态链接库管理命令

    为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfig
    ldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态 链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表. 

    ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令.
     
    34.

    :

    空命令[冒号]. 这个命令意思是空操作(即什么操作也不做). 它一般被认为是和shell的内建命令true是一样的。冒号":" 命令是Bash自身内建的,它的退出状态码是真(即0)。

    1.可以用于注释:

    : '
    code1
    code2
    code3   
    '
    2.表示true

    while :
    do
     operation-1
     operation-2
     ...
      operation-n
     done
     
     等同于:
     while true
      do
          ...
      done

    3.if/then结构中作占位符

    if condition
    then :   # 什么也不做的分支
    else
        take-some-action
    fi

    4.在必须要有两元操作的地方作为一个分隔符

    : ${username=`whoami`}
     # ${username=`whoami`}   如果没有开头的:,将会出错
     #                        除非"username"是一个外部命令或是内建命令...

     

    Shell脚本while read line 损失制表符的问题

    描述:

    采用读取每行的数据,再处理的方式

    while read line

    do

    done<$file

    问题:

    但是出现一个问题:read line后line中的\t不见了,导致我awk处理时找不到\t,这时默认的分隔符是空格,可是数据本身也会有空格,就会混淆

    原因:

    查找后得知read line会过滤掉行首、行尾的空格、制表符等。

    处理办法:

    read -r line

    yum install from list

    需要使用-y参数 
    while read line
    do
    yum -y install $line
    done

     

    df -h 用m、g的数量级显示大小

    du -h --max-depth=1 ./ 显示一级目录大小

    重启crontab:

    /etc/rc.d/init.d/crond   restart

    reloadcrontab

    sudo /etc/init.d/crond reload

    35./var/log/messages 可以查看用户sudo操作等信息

    36.文件分割:split -b 12M filename 按大小分割

    split -l 12000 filename 按行分割

    合并:cat file1 >>file2

    37.使用uniq时,文件编码与终端term编码必须一致,否则uniq无效;

    38.有些应用,在rpm安装后,会自己启动。一般情况下是在/etc/rc.d/init.d/下安装一个脚本,这个脚本时被系统service调用的:如脚本名叫:ppp.sh
    则service调用如下:service ppp.sh start
    会传入参数的

     

    39.如何修改机器名并生效

    修改/etc/hosts
    增加:10.232.128.86  kgbtest128086.sqa.cm4 
    执行hostname kgbtest128086.sqa.cm4

    使用hostname或者uname -n 检查设置的hostname是否生效

    40.curl、wget都可以指定host:

    curl -H "Host:fortest.net" "http://192.9.100.10/index.php"

    41.grep 输出匹配行的前后多行

    grep -B1 -A2 "DMA" message.txt

    42 . sed -i '12,15d' filename

      删除12到15行

    43.curl http://10.222.133.62/test.php -d "asfdasdfq3wfa42342"

    使用curl模拟post方式发送数据

    --data-binary <数据> 可以发送二进制数据 

    --data-urlencode <数据> 可以发送urlencode之后的数据

    crontab的log:

    /var/log/cron*

     

    查看字符的十六进制编码:od

    在vim查看十六进制编码:%!xdd
    返回普通模式:%!xdd -r
    二进制、八进制、十六进制:
    http://longmans1985.blog.163.com/blog/static/70605475201152802851529/

     
    大家在更新环境的时候查找线上地址,一般用grep  '地址'  -r  *  的命令,这样对于压缩的js文件查找的时候就非常麻烦,打出一屏的地址;没法看出在哪个具体文件
    没有效率;
    解决的办法:grep  -no  '地址'  -r  *     
    -n参数是打印grep的地址所在行号  
    -o参数是去掉其他的内容只显示你grep的地址;
    这样去找地址很方便,很有效率
     
     
    怎样查找一个文件夹在哪个目录下

    如果只显示所在目录的路径:
    find 目录 -type d -name "查询目录名" -printf "%h\n"

    如果同时显示目录名称和所在目录的路径:
    find 目录 -type d -name "查询目录名" -printf "%p %h\n"
     
     
     

    我们有时会用到测试机发送邮件的功能,但测试机器曾出现过不能发送邮件的情况,解决办法是把iptables关掉。       执行命令:/etc/init.d/iptables stop

     
    分享几个shell命令另类用法:
    1、快速备份文件
    cp filename{,.back}
    2、清空或创建一个文件
    > 1.php
    3、实时查看某个目录下最新改动过的文件
    watch -d -n 1 'df; ls -FlAt /path'
    4、查看被占用端口的进程
    netstat -tulnp
    5、切换回上一个目录
    cat -
  • awk的学习和使用(三)

    2009-08-17 17:50:03

    先看一篇文本,名为testfile,共6个字段:site、engine、url、num1、num2、num3

    "Boharu Sweet Days"     Google  http://www.acpit.com/~rental1/atlinkb/linkdisp.cgi?ID=mari215&KEY1=j01&RT=s1&SORT1=1    8       8  8
    "Aoharu Sweet Days"     Google  http://www.acpit.com/~rental1/atlinkb/linkdisp.cgi?ID=mari215&KEY1=j01&RT=s1&SORT1=1    8       8  8
    "Aoharu Sweet Days"     Google  http://www.acpit.com/~rental1/atlinkb/linkdisp.cgi?ID=mari215&KEY1=j01&RT=s1&SORT1=1    8       8  8
    "Aoharu weet Days"      Bing    http://www.acpit.com/~rental1/atlinkb/linkdisp.cgi?ID=mari215&KEY1=j01&RT=s1&SORT1=1    8       8  0

    A.找出site、engine、url均相同的记录,将这些相同记录的num1,mum2、num3相加;

    B.找到后三个值中为0的记录,将其赋值为NULL;

    解题思路:

    第一步:排序

    第二部:求和

    第三部:判断num为0的记录,做字符串替换

    1.sort即可将其排序。注:sort testfile表示将文件中的每一行进行全排序,先从第一个字段排序,一直到最后一个字段;字段由第一个字母排序,直到最后一个字母;sort的分隔符指定参数为-t,由于本例是由第一个字段往后进行全排序,因此不需要额外指定分隔符;

    2.比较前三个字段的值并求和,用awk。由于awk默认的分隔符为tab或者空格均视为分隔符,因此根据本文的特殊性(第一个字段中包含空格),需要单独指定分隔符为tab,打印第一个字段看看:

    awk -F"\t" '{print $1}' 结果正确。

    3.字符串替换.

    3.1由于需要检查的字符串本身都是一个单独的字段(num1、num2、num3),因此可以使用awk字段判定:

    if($4=="0")$4="NULL";

    3.2另外可以使用awk的内部函数gsub来替换字符串:

    gsub(/0/,"NULL");

    这样子的结果会将每行中所有0都替换为NULL,实际我们只要求将tab后紧跟着的0替换为NULL,linux下tab可以用\<\>表示:

    gsub(/\<0\>/,"NULL"); 表示将tab后面的0替换为NULL(这个解释非常奇怪,但是结果是对的。。有待考察)

    3.3字符串替换功能,一般会使用比较简洁的sed 's/source-charactor/dest-charactor/'。其中的字符匹配支持正则表达式。

    sed 's/\t0/\tNULL'

    4.最后:

        处理问题A的awk文件:testA.awk

    BEGIN{FS="\t"}
    {if(NR==1)
    {
            site=$1;engin=$2;url=$3;n1=$4;n2=$5;n3=$6;
    }
    else if(site==$1&&engin==$2&&url==$3)
    {
            n1+=$4;n2+=$5;n3+=$6;
    }
    else
    {
            print(site"\t"engin"\t"url"\t"n1"\t"n2"\t"n3);
            site=$1;engin=$2;url=$3;n1=$4;n2=$5;n3=$6;}
    }
    END{print(site"\t"engin"\t"url"\t"n1"\t"n2"\t"n3)}

        处理问题B的awk文件:testB.awk

    BEGIN{FS="\t"}
    {
            if($4=="0")$4="NULL";
            if($5=="0")$5="NULL";
            if($6=="0")$6="NULL";
            print($1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6);
    }

    合并:

    sort testfile | awk -f testA.awk | awk -f testB.awk > out

     

  • awk的学习和使用(二)

    2009-08-14 21:08:20

    举例, test文本,内容如下,三列分别表示:电话号码、通话时间、费用。

    13911025243      1          3

    13911125274      2          6

    13911025243      3          6

    13810025274      3          6

    13911025243      2          6

    将以上文本中,每个电话号码的总通话时间、总费用进行统计;

    1.先排序:sort test

    2.将第一条记录的三个字段均保存到自定义变量,分别为:phoneNum=$1;time=$2;cost=$3;

    3.此后没读取一条记录时,$1,$2,$3与phonenum,time,cost作比较,如果phoneNum相等,则time=time+$2;cost=cost+$3;如果不相等,就打印phonenum,time,cost,并重置自定义变量值为:phoneNum=$1;time=$2;cost=$3;

    4.最后,需要在end里打印最后一次统计信息;

    实现如下:

    sort test | awk '{if(NR==1){phoneNum=$1;time=$2;cost=$3}else if($1==phoneNum){time+=$2;cost+=$3}else{print (phoneNum,time,cost);phoneNum=$1;time=$2;cost=$3;}}END{print phoneNum,time,cost}'

     

  • 近期的总结

    2009-08-14 09:20:14

    看了早上Zee发过来的邮件,登录了这位测试友人苦心经营的测试论坛后,看到了那么多篇尽心尽力总结的经验也好,学习也好,突然有一些感悟,自己这段时间里一直告诫自己说,要学习,要总结,但却单单忘记了学习的大忌,就是浮躁。

    我太浮躁了,什么时候能够真正做到,平心静气的,认认真真的去学习和总结呢?如果不从现在开始改掉这个毛病,恐怕永远都成功不了了。

    总结一下自己的工作过往,是什么导致的目前这种状况?即使不想承认也必须去承认,就我的事业来说,目前的我是失败的。其实我很有能力去成就自己的事业,想想人生二十多年的经验,只要自己能够专注的把精力投入到一件事情中,每次每都会是一个惊人的结果,只是,我对事业没有抱着极大的热情,太不重视,太不专注了。

    时下流行《秘密》这本励志书,说的不无道理,想要在某件事上获得成功,就要专注,专注到每时每刻都在关注它,想要实现它,用不了多久,就一定会实现。为什么说用不了多久,就一定会实现呢?不是神奇,不是秘密,有句话讲得好,机遇总是留给那些有准备的头脑。而人又处于庞大、复杂的社会体中,与周围有着千丝万缕的联系,机遇总是无时无刻不在的,有时候只是没有发现,或者没有准备,一旦处于“警戒”的状态,就一定能够把握每一个机遇,成就自我。

    人生总少不了挫折,无论如何,都要不离不弃,不要轻易说放弃,不要轻易说不,每天早上醒来时,都告诉自己,今天又是新的一天,离理想的实现,就又近了一步,霏暄,加油!

  • awk的学习和使用(一)

    2009-08-11 09:29:45

    最近接触了linux的使用和一些命令、工具的使用,awk恐怕是linux用处最广的工具之一了,今天开始,我打算记录下我的学习过程。


    一.awk的简介

    与sed和grep很相似,awk是一种样式扫描与处理工具,其功能远远强于sed和grep,除了几乎所有的sed和grep功能之外,awk还可以进行样式装入,流控制,数学运算符,进程控制语句,甚至内置的变量和函数。它具备了一个完整的语言所应具备的特性,实际上awk确实拥有自己的语言,awk程序设计语言,awk的三位创建者已将其定义为:awk样式扫描和处理语言。

    基于文本的样式扫描和处理是我们经常要做的工作,比如从一个上千行的具有一定格式的文本文件中找出满足要求的行并输出到一个新文本,就可以使用awk。再比如,监控网络时,由于网络上流动的数据非常多,如果需要获得某些特定的数据,使用awk过滤。简而言之,awk就是一个强大的文本处理工具。

    在这里有一个可遵循的一般原则:如果你用普通的shell工具或shell script有困难的话,试试awk,如果awk仍不能解决问题,则便用C语言,如果C语言仍然失败,则移至C++。

    二.awk的调用方式

    1.awk命令行的方式,适用于解决简单问题,例如:打印testfile文本中第一列为abc的所有行(省略了print)

    [root@test myself]# awk '$1==abc' testfile

    2.使用-f选项调用awk程序文件,例如:将一段awk程序保存到文本,名为testawk1,在命令行中执行该文件

    [root@test myself]# awk -f testawk1 testfile

    3.利用命令解释器调用awk,例如:将一段awk程序保存至文本,名为myawk,与前面不同的是该文本首行需要添加:#!/bin/awk -f ,保存后赋予该文件执行权限,命令行中直接调用:

    [root@test myself]# myawk testfile

    三.awk语法

    awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...]

    -F re : 允许awk更改其字段分隔符。

    parameter :

    'prog' : awk程序语句段,必须使用单引号‘’引起来,防止被shell解释。

    其标准形式为'pattern{action}'。前面第二节中的第一小节举例:awk '$1==abc' testfile 其中'$1==abc'就是pattern,起过滤作用,即:只有符合$1==abc的行,才执行执行{action}操作。但此例中省略了{action},此时将默认执行print操作,即打印到标准输出。

    pattern和{action}二者可以省略其中之一,但是不能两者同时省略。pattern省略时表示不对任何行进行过滤。

    {action}中的语句之间,使用;进行分隔,使用#进行注释。

    -f progfile : 允许awk调用并执行progfile文件。progfile必须是一个符合awk语法的文本文件。

    in_file : awk的输入文件。awk允许对多个输入文件进行处理,其间用,隔开,awk不会修改输入文件。如果未指定输入文件,awk将接受标准输入,并将结果显示在标准输出。awk支持输入输出重定向。

    四.记录、字段和内置变量

    记录和字段:在awk中,缺省情况下会将文本中的一行视为一个记录,而将一行中的某一部分视作一个字段,这与数据库中对数据的处理方式类似。比如数据库中某个数据表的第一个字段名叫做ID,第二个叫做Name,在awk中使用$1、$2表示第一个字段、第二个字段。特殊的,awk用$0来表示整个行(整条记录)。

    分隔符:不同的字段之间是用称作分隔符的字符分隔开的。系统默认的分隔符是空格。awk允许在命令行中用-F re的形式来改变这个分隔符。事实上,awk用一个内置的变量FS来记忆这个分隔符。

    内置变量:除了FS外,awk中有好几个这样的内置变量,如记录和记录之间(行与行之间)的分隔符使用RS表示,当前工作的记录数为NR等等。这些内置的变量可以在awk程序中引用或修改,例如,可以利用NR变量在模式匹配中指定工作范围,也可以通过修改记录分隔符RS让一个特殊字符而不是换行符作为记录的分隔符。例如,以下语句表示,显示文本文件第7行到第15行中以%分给的第1、3、7个字段值。

    awk -F % 'NR==7,NR==15 {printf $1 $3 $7}' testfile

    awk的其他内置变量:A=awk,N=nawk,P=POSIX awk。以下内置变量以系统中的帮助为准(不同系统下的awk可能有所出入)。

    P ENVIRON UNIX环境变量
    A FILENAME 当前输入文件的名字
    P FNR 当前记录数
    A FS 输入字段分隔符 空格 
    A NF 当前记录中的字段个数
    A NR 已经读出的记录数
    A OFMT 数字的输出格式 %.6g
    A OFS 输出字段分隔符 空格
    A ORS 输出的记录分隔符 新行
    A RS 输入的记录他隔符 新行

    五.内置函数

    例:显示文件myfile中的行号和第3字段:

    $awk '{printf"%03d%s\n",NR,$1}' myfile

    其中,printf即内部函数,该函数类似c++中的printf,可以对输出格式进行控制;

    例:下面的示例显示了内置变量和内置函数length()的使用:

    $awk 'length($0)>80 {print NR}' myfile

    该命令行将显示文本myfile中所有超过80个字符的行号,在这里,用$0表示整个记录(行),同时,内置变量NR不使用标志符'$'。

    例:作为一个较为实际的例子,我们假设要对UNIX中的用户进行安全性检查,方法是考察/etc下的passwd文件,检查其中的passwd字段(第二字段)是否为"*",如不为"*",则表示该用户没有设置密码,显示出这些用户名(第一字段)。我们可以用如下语句实现:

    #awk -F: '$2=="" {printf("%s no password!\n",$1' /etc/passwd

    在这个示例中,passwd文件的字段分隔符是“:”,因此,必须用-F:来更改默认的字段分隔符,这个示例中也涉及到了内置函数printf的使用。

    其他内置函数:(以自己系统中的帮助为准)

    N gsub(reg,string,target) 每次常规表达式reg匹配时替换target中的string
    N index(search,string) 返回string中search串的位置
    A length(string) 求串string中的字符个数
    N match(string,reg) 返回常规表达式reg匹配的string中的位置
    N printf(format,variable) 格式化输出,按format提供的格式输出变量variable。
    N split(string,store,delim) 根据分界符delim,分解string为store的数组元素
    N sprintf(format,variable) 返回一个包含基于format的格式化数据,variables是要放到串中的数据
    G strftime(format,timestamp) 返回一个基于format的日期或者时间串,timestmp是systime()函数返回的时间
    N sub(reg,string,target) 第一次当常规表达式reg匹配,替换target串中的字符串
    A substr(string,position,len) 返回一个以position开始len个字符的子串
    P totower(string) 返回string中对应的小写字符
    P toupper(string) 返回string中对应的大写字符
    A atan(x,y) x的余切(弧度)
    N cos(x) x的余弦(弧度)
    A exp(x) e的x幂
    A int(x) x的整数部分
    A log(x) x的自然对数值
    N rand() 0-1之间的随机数
    N sin(x) x的正弦(弧度)
    A sqrt(x) x的平方根
    A srand(x) 初始化随机数发生器。如果忽略x,则使用system()
    G system() 返回自1970年1月1日以来经过的时间(按秒计算)

    六.awk的自定义变量

    awk允许用户在awk程序语句中定义并调用自已的变量。当然这种变量不能与内置变量及其它awk保留字相同。与C语言不同的是,awk中不需要对变量进行初始化,awk根据其在awk中第一次出现的形式和上下文确定其具体的数据类型。当变量类型不确定时,awk默认其为字符串类型。这里有一个技巧:如果你要让你的awk程序知道你所使用的变量的明确类型,你应当在在程序中给它赋初值。

    举例:

    awk '[name=$1;pwd=$2;print $1,$2]'  user.log

    说明:上例中的name、pwd均为自定义变量,不需初始化,非常简便.

  • 网络学习日志(五)--OSI七层模型和TCP/IP四层模型

    2009-08-05 10:14:29

        网络协议设计者不应当设计一个单一、巨大的协议来为所有形式的通信规定完整的细节,而应把通信问题划分成多个小问题,然后为每一个小问题设计一个单独的协议。这样做使得每个协议的设计、分析、时限和测试比较容易。协议划分的一个主要原则是确保目标系统有效且效率高。为了提高效率,每个协议只应该注意没有被其他协议处理过的那部分通信问题;为了主协议的实现更加有效,协议之间应该能够共享特定的数据结构;同时这些协议的组合应该能处理所有可能的硬件错误以及其它异常情况。为了保证这些协议工作的协同性,应当将协议设计和开发成完整的、协作的协议系列(即协议族),而不是孤立地开发每个协议。

        OSI七层模型

      在网络历史的早期,国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)共同出版了开放系统互联的七层参考模型。一台计算机操作系统中的网络过程包括从应用请求(在协议栈的顶部)到网络介质(底部) ,OSI参考模型把功能分成七个分立的层次。图1表示了OSI分层模型。

     

    图1 OSI七层参考模型


      OSI模型的七层分别进行以下的操作:

      第一层 物理层

      第一层负责最后将信息编码成电流脉冲或其它信号用于网上传输。它由计算机和网络介质之间的实际界面组成,可定义电气信号、符号、线的状态和时钟要求、数据编码和数据传输用的连接器。如最常用的RS-232规范、10BASE-T的曼彻斯特编码以及RJ-45就属于第一层。所有比物理层高的层都通过事先定义好的接口而与它通话。如以太网的附属单元接口(AUI),一个DB-15连接器可被用来连接层一和层二。

      第二层 数据链路层

      数据链路层通过物理网络链路提供可靠的数据传输。不同的数据链路层定义了不同的网络和协议特征,其中包括物理编址、网络拓扑结构、错误校验、帧序列以及流控。物理编址(相对应的是网络编址)定义了设备在数据链路层的编址方式;网络拓扑结构定义了设备的物理连接方式,如总线拓扑结构和环拓扑结构;错误校验向发生传输错误的上层协议告警;数据帧序列重新整理并传输除序列以外的帧;流控可能延缓数据的传输,以使接收设备不会因为在某一时刻接收到超过其处理能力的信息流而崩溃。数据链路层实际上由两个独立的部分组成,介质存取控制(Media Access Control,MAC)和逻辑链路控制层(Logical Link Control,LLC)。MAC描述在共享介质环境中如何进行站的调度、发生和接收数据。MAC确保信息跨链路的可靠传输,对数据传输进行同步,识别错误和控制数据的流向。一般地讲,MAC只在共享介质环境中才是重要的,只有在共享介质环境中多个节点才能连接到同一传输介质上。IEEE MAC规则定义了地址,以标识数据链路层中的多个设备。逻辑链路控制子层管理单一网络链路上的设备间的通信,IEEE 802.2标准定义了LLC。LLC支持无连接服务和面向连接的服务。在数据链路层的信息帧中定义了许多域。这些域使得多种高层协议可以共享一个物理数据链路。

      第三层 网络层

      网络层负责在源和终点之间建立连接。它一般包括网络寻径,还可能包括流量控制、错误检查等。相同MAC标准的不同网段之间的数据传输一般只涉及到数据链路层,而不同的MAC标准之间的数据传输都涉及到网络层。例如IP路由器工作在网络层,因而可以实现多种网络间的互联。

      第四层 传输层

      传输层向高层提供可靠的端到端的网络数据流服务。传输层的功能一般包括流控、多路传输、虚电路管理及差错校验和恢复。流控管理设备之间的数据传输,确保传输设备不发送比接收设备处理能力大的数据;多路传输使得多个应用程序的数据可以传输到一个物理链路上;虚电路由传输层建立、维护和终止;差错校验包括为检测传输错误而建立的各种不同结构;而差错恢复包括所采取的行动(如请求数据重发),以便解决发生的任何错误。传输控制协议(TCP)是提供可靠数据传输的TCP/IP协议族中的传输层协议。

      第五层 会话层

      会话层建立、管理和终止表示层与实体之间的通信会话。通信会话包括发生在不同网络应用层之间的服务请求和服务应答,这些请求与应答通过会话层的协议实现。它还包括创建检查点,使通信发生中断的时候可以返回到以前的一个状态。

      第六层 表示层

      表示层提供多种功能用于应用层数据编码和转化,以确保以一个系统应用层发送的信息可以被另一个系统应用层识别。表示层的编码和转化模式包括公用数据表示格式、性能转化表示格式、公用数据压缩模式和公用数据加密模式。

      公用数据表示格式就是标准的图像、声音和视频格式。通过使用这些标准格式,不同类型的计算机系统可以相互交换数据;转化模式通过使用不同的文本和数据表示,在系统间交换信息,例如ASCII(American Standard Code for Information Interchange,美国标准信息交换码);标准数据压缩模式确保原始设备上被压缩的数据可以在目标设备上正确的解压;加密模式确保原始设备上加密的数据可以在目标设备上正确地解密。

      表示层协议一般不与特殊的协议栈关联,如QuickTime是Applet计算机的视频和音频的标准,MPEG是ISO的视频压缩与编码标准。常见的图形图像格式PCX、GIF、JPEG是不同的静态图像压缩和编码标准。

      第七层 应用层

      应用层是最接近终端用户的OSI层,这就意味着OSI应用层与用户之间是通过应用软件直接相互作用的。注意,应用层并非由计算机上运行的实际应用软件组成,而是由向应用程序提供访问网络资源的API(Application Program Interface,应用程序接口)组成,这类应用软件程序超出了OSI模型的范畴。应用层的功能一般包括标识通信伙伴、定义资源的可用性和同步通信。因为可能丢失通信伙伴,应用层必须为传输数据的应用子程序定义通信伙伴的标识和可用性。定义资源可用性时,应用层为了请求通信而必须判定是否有足够的网络资源。在同步通信中,所有应用程序之间的通信都需要应用层的协同操作。

      OSI的应用层协议包括文件的传输、访问及管理协议(FTAM) ,以及文件虚拟终端协议(VIP)和公用管理系统信息(CMIP)等。


      TCP/IP分层模型

      TCP/IP分层模型(TCP/IP Layening Model)被称作因特网分层模型(Internet Layering Model)、因特网参考模型(Internet Reference Model)。图2表示了TCP/IP分层模型的四层。

     

    图2 TCP/IP四层参考模型


      TCP/IP协议被组织成四个概念层,其中有三层对应于ISO参考模型中的相应层。ICP/IP协议族并不包含物理层和数据链路层,因此它不能独立完成整个计算机网络系统的功能,必须与许多其他的协议协同工作。

      TCP/IP分层模型的四个协议层分别完成以下的功能:

      第一层 网络接口层

      网络接口层包括用于协作IP数据在已有网络介质上传输的协议。实际上TCP/IP标准并不定义与ISO数据链路层和物理层相对应的功能。相反,它定义像地址解析协议(Address Resolution Protocol,ARP)这样的协议,提供TCP/IP协议的数据结构和实际物理硬件之间的接口。

      第二层 网间层

      网间层对应于OSI七层参考模型的网络层。本层包含IP协议、RIP协议(Routing Information Protocol,路由信息协议),负责数据的包装、寻址和路由。同时还包含网间控制报文协议(Internet Control Message Protocol,ICMP)用来提供网络诊断信息。

      第三层 传输层

      传输层对应于OSI七层参考模型的传输层,它提供两种端到端的通信服务。其中TCP协议(Transmission Control Protocol)提供可靠的数据流运输服务,UDP协议(Use Datagram Protocol)提供不可靠的用户数据报服务。

      第四层 应用层

      应用层对应于OSI七层参考模型的应用层和表达层。因特网的应用层协议包括Finger、Whois、FTP(文件传输协议)、Gopher、HTTP(超文本传输协议)、Telent(远程终端协议)、SMTP(简单邮件传送协议)、IRC(因特网中继会话)、NNTP(网络新闻传输协议)等。

     

  • Linux学习日志(一)---文件权限

    2009-08-04 23:24:28

    1.使用ls -l命令显示文件的详细信息,包括权限:

    yekai@kebao:/media/sda5/软件压缩/Linux$ ls -lh
    总用量 191M
    -rwxrwx--- 1 root plugdev 18M 2007-02-28 18:05 ActionCube_v0.92.tar.bz2
    -rwxrwx--- 1 root plugdev 60M 2007-04-30 22:52 nexuiz-223.zip
    -rwxrwx--- 1 root plugdev 7.4M 2007-04-25 02:16 stardict-oxford-gb-2.4.2.tar.bz2
    -rwxrwx--- 1 root plugdev 102M 2007-05-01 18:22 tremulous-1.1.0-installer.x86.run
    -rwxrwx--- 1 root plugdev 4.9M 2007-04-30 14:32 wqy-bitmapfont-0.8.1-7_all.deb.bin

    其中显示的字符表示的权限信息-rwxrwx--- 中,第一位表示是文件还是目录,第二位到第十位表示权限。

    2.权限中第一位字符的含义

    d:表示这是一个目录,事实上在ext2fs中,目录是一个特殊的文件
    -:表示这是一个普通的文件
    l:表示这是一个符号链接文件,实际上它指向另一个文件
    b、c:分别表示区块设备和其他的外围设备,是特殊类型的文件
    s、p:这些文件关系到系统的数据结构和管道,通常很少见到

    3.权限中第二到第十位的含义

    第2~10个字符当中的每3个为一组,左边三个字符表示所有者权限,中间3个字符表示与所有者同一组的用户的权限,右边3个字符是其他用户的权限

    r(Read):对文件,具有读取文件内容的权限;对目录,具有浏览目录的权限。
    w(Write):对文件,具有新增、修改文件内容的权限;对目录,具有删除、移动目录内文件的权限。
    x(execute):对文件,具有执行文件的权限;对目录,具有进入目录的权限。


    下面举例说明:
    -rwx------: 文件所有者对文件具有读取、写入和执行的权限。
    -rwxr―-r--: 文件所有者具有读、写与执行的权限,其他用户则具有读取的权限。
    -rw-rw-r-x: 文件所有者与同组用户对文件具有读写的权限,而其他用户仅具有读取和执行的权限。
    drwx--x--x: 目录所有者具有读写与进入目录的权限,其他用户近能进入该目录,却无法读取任何数据。
    drwx------: 除了目录所有者具有完整的权限之外,其他用户对该目录完全没有任何权限。


    4.使用chmod和数字改变文件或目录的访问权限

    文件和目录的权限表示,是用rwx这三个字符来代表所有者、用户组和其他用户的权限。有时候,字符似乎过于麻烦,因此还有另外一种方法是以数字来表示权限,而且仅需三个数字。

    r:对应数值4
    w:对应数值2
    x:对应数值1
    -:对应数值0

    解释:我们将rwx看成二进制数,如果有则有1表示,没有则有0表示,那么rwx r-x r- -则可以表示成为:111 101 100 ,再将其每三位转换成为一个十进制数,就是754。

    例如,我们想让a.txt这个文件的权限为:

     权限  自己 同组用户   其他用户
     可读  是  是  是
     可写  是  是  
     可执行      

    根据上表得到权限串为:rw-rw-r--,转换成二进制数就是110 110 100,再每三位转换成为一个十进制数,就得到664,因此需要执行的执行命令为:
    [root@localhost ~]# chmod 664 a.txt

    5.批量修改权限

    如果需要一次修改某个目录下所有文件的权限,包括子目录中的文件权限也要修改,要使用参数-R表示启动递归处理。
    例如:

    [root@localhost ~]# chmod 777 /home/user 注:仅把/home/user目录的权限设置为rwxrwxrwx
    [root@localhost ~]# chmod -R 777 /home/user 注:表示将整个/home/user目录与其中的文件和子目录的权限都设置为rwxrwxrwx

    6.使用命令chown改变目录或文件的所有权

    文件与目录不仅可以改变权限,其所有权及所属用户组也能修改,和设置权限类似,用户可以通过图形界面来设置,或执行chown命令来修改。
    我们先执行ls -l看看目录情况:

    [root@localhost ~]# ls -l
    总用量 368
    -rwxrwxrwx 1 root root 12172 8月 15 23:18 conkyrc.sample

    可以看到conkyrc.sample文件的所属用户组为root,所有者为root。
    执行下面命令,把conkyrc.sample文件的所有权转移到用户user:

    [root@localhost ~]# chown user conkyrc.sample
    [root@localhost ~]# ls -l
    总用量 368
    -rwxrwxrwx 1 user root 12172 8月 15 23:18 conkyrc.sample

    要改变所属组,可使用下面命令:

    [root@localhost ~]# chown :users conkyrc.sample
    [root@localhost ~]# ls -l
    总用量 368
    -rwxrwxrwx 1 user users 12172 8月 15 23:18 conkyrc.sample

    7.批量修改文件权限

    要修改目录的权限,使用-R参数就可以了,方法和前面一样。



     

  • 网络学习日志(四)--linux下的抓包工具tcpdump

    2009-07-30 17:27:18

    由于有个项目涉及到TCP、HTTP、Soap的一些东西,于是回顾了一下以前曾经学过的东西,并学到了一些新东西,以此记录。根据我的逐步学习过程,分了以下5个部分。

    1.由netstat查看网络情况,引出的TCP建立连接、终止连接过程,以及TCP状态分析;

    2.Soap=XML+HTTP引出的HTTP协议分析;

    3.Soap(Simple Object Access Protocol)简单对象访问协议分析及应用;

    4.番外一:awk的使用

    5.番外二:Linux下抓包工具

    --------------------------篇四-------------------------------------

    这篇讲linux下的抓包工具。

    抓包工具比较好用的有两个,一个是snort,一个是tcpdump,这次不说snort了,觉得这个工具虽然很强大,但是比较复杂,还是tcpdump比较简单。tcpdump windows、linux版本均有。linux版本可以在以下网站下载:www.tcpdump.org.

    安装好tcpdump之后,运行tcpdump:

    1. tcpdump -D 获取网络适配器列表,以下是在windows上获取到的结果:

    1.\Device\PssdkLoopback (PSSDK Loopback Ethernet Emulation Adapter)
    2.\Device\{CF587901-C85F-4FD6-896F-D977DEFE76EC} (Intel(R) PRO/100 VE Network Co
    nnection)

    2. tcpdump -i <需要监控的网络适配器编号>,例如我想监控lo(127.0.0.1),即上面列表中的1.\Device\PssdkLoopback: (windows上特有的,linux不适用)

    tcpdump -i 1

    如果不使用-i来定义监控适配器的话,默认使用列表中的第一个;

    3. 监控主机为192.9.200.59上8000端口的tcp协议

    tcpdump host 192.9.200.59 and tcp port 8000

    4. 如果想要显示数据包的内容,需要使用-X参数,如,我想要显示捕获的http数据包http header的内容:

    tcpdump -X host 192.9.200.59 and tcp port 8000

    显示结果如下:

    22:13:19.717472 IP testhost59.12535 > liujuan59.8000: . 1:330(329) ack 1 win 327
    8
            0x0000:  4500 0171 e616 0000 8006 cb2b 0000 0000  E..q.......+....
            0x0010:  c009 c83b 30f7 1f40 0000 0002 0000 0002  ...;0..@........
            0x0020:  5010 8000 b066 0000 504f 5354 202f 2048  P....f..POST./.H
            0x0030:  5454 502f 312e 310d 0a43 6f6e 7465 6e74  TTP/1.1..Content
            0x0040:  2d54 7970 653a 2074 6578 742f 786d 6c3b  -Type:.text/xml;
            0x0050:  2063                                     .c

    可以看到该结果只显示了http头的一部分,没有显示全,是因为tcpdump默认将显示的数据长度截断了,可以使用-s后面加数据长度,来设置数据显示长度:

    tcpdump -X -s 0 host 192.9.200.59 and tcp port 8000

    以上的例子中,-s 0 表示自动设置长度使其能够显示所有数据。

    5. 捕获的数据太多,不断刷屏,可能需要将数据内容记录到文件里,需要使用-w参数

    tcpdump -X -s 0 -w aaa host 192.9.200.59 and tcp port 8000

    则将之前显示在屏幕中的内容,写入tcpdump可执行文件同级目录下的aaa文件中。

    文件查看方式如下,需要使用-r参数:

    tcpdump -X -s 0 -r aaa host 192.9.200.59 and tcp port 8000

    如果这样写:

    tcpdump -r aaa

    则只能看到最简单的数据传输交互过程,看不到数据包内容,查看时也需要使用相应的参数。

    6.总结

    总结一下,tcpdump的参数分两个部分,选项(Options)和表达式(expression):

    tcpdump [ -adeflnNOpqRStuvxX ] [ -c count ]
                   [ -C file_size ] [ -F file ]
                   [ -i interface ] [ -m module ] [ -r file ]
                   [ -s snaplen ] [ -T type ] [ -w file ]
                   [ -E algo:secret ] [ expression ]

     

  • 网络学习日志(三)--http协议中的get和post

    2009-07-29 11:26:46

    get和post


    概述:

    前面的http协议介绍中已经学到了,http协议结构如下:

    <request line>

    <headers>

    空行

    [<content>]

    request line 用来说明请求类型、要访问的资源,以及http版本;

    headers是服务器要使用的附加信息,如charset、connection等;

    下面是两个例子,分别使用get、post请求方式

    GET /index.php?uid-22578-action-viewspace-itemid-141083 HTTP/1.1
    Accept: image/gif, image/jpeg, image/pjpeg, application/xaml+xml, */*
    Accept-Language: zh-cn
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
    Host: www.51testing.com
    Connection: Keep-Alive

    POST /batch.comment.php HTTP/1.1
    Accept: image/gif, image/jpeg, image/pjpeg, application/xaml+xml, */*
    Accept-Language: zh-cn
    Content-Type: application/x-www-form-urlencoded
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
    Host: www.51testing.com
    Content-Length: 169
    Connection: Keep-Alive

    rates=0&message=%B1%C8%BD%CF%BC%F2%B5%A5%B5%C4%D2%BB%D0%A9%B3%A3%D3%C3sql%D3%EF%BE%E4&nickname=angelets&seccode=3878&itemid=141083&submitcomment=%CC%E1%BD%BB%C6%C0%C2%DB

    可以看到,上面的get只是在请求一个html页面的浏览,无数据提交;

    而post是有content内容的rates=后面的部分,可以看到nickname=angelets,密码、提交的submitcomment是已经加密过的;

    下面说一下post和get在使用中的一些区别:

    (1)   在客户端,Get方式通过URL提交数据,数据URL中可以看到;POST方式,数据放置在entity content内提交。

    (2)   GET由于是通过url提交数据的,因此数据大小受浏览器客户端的限制(微软support网站上说:Microsoft Internet Explorer has a maximum uniform. resource locator (URL) length of 2,083 characters)最多只能有2083字节。而POST不通过url提交数据,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制,例如,tomcat默认设置为2M。

    (3)   安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。

    (4)   安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。幂等的意味着对同一 URL 的多个请求应该返回同样的结果完整的定义并不像看起来那样严格换句话说GET 请求一般不应产生副作用从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源比如,新闻站点的头版不断更新虽然第二次请求会返回不同的一批新闻该操作仍然被认为是安全的和幂等的因为它总是返回当前的新闻反之亦然。POST 请求就不那么轻松了POST 表示可能改变服务器上的资源的请求仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解)。
    http://www.cnblogs.com/stu-acer/archive/2006/08/28/488802.html

    (5)表单提交中的post和get。

         get是从服务器上获取数据,post是向服务器传送数据。

         对于表单的提交方式,在服务器端只能用Request.QueryString来获取Get方式提交来的数据,用Post方式提交的数据只能用Request.Form来获取。

         一般来说,尽量避免使用Get方式提交表单,因为有可能会导致安全问题。比如说在登陆表单中用Get方式,用户输入的用户名和密码将在地址栏中暴露无遗。但是在分页程序中,用Get方式就比用Post好。

     

572/3<123>
Open Toolbar