历史总是要通过这样决绝的悲情成就一段佳话,后来无数的传记这样记载那段故事,“1987年,任正非因为工作失误离开南油公司,被逼着走上了创业的道路。”
  1987年,也是一个草莽英雄起家的年代。

  1987年,宗庆后靠借来的14万元承包连年亏损的杭州上海校办企业经销部,并开始蹬三轮卖冰棍。1945年出生的宗庆后,这一年刚好42岁。

  1987年,两个日后引领中国经济转折点的人一个刚从清华毕业,赶赴MIT攻读硕士学位。一个即将从杭州师范毕业。他们恰好都出生在1964年,这一年,他们都恰好是23岁。

  去MIT的张朝阳遇见了尼葛洛庞帝,他们是最早投资中国互联网的人。杭州师范毕业的马云创办了海博翻译社,开始了曲折的试错过程。

  1987年,44岁的任正非被迫辞职,离开了转业后分配到的南油公司。

  是下面这段文字激发我研究1987年的深圳,1988年的中国和这两年的任正非。
   “一个44岁老男人,经营中被骗了200万,被国企南油集团除名。曾求留任遭拒绝,还背负还清200万债。妻子又离婚,他一个人带着老爹老娘弟弟妹妹在深圳住棚屋,借钱创立了华为公司。已过了冲锋势头,没有资本、没有人脉、没有资源、没有技术、没有市场经验,看谁都比他强的一个人,逆袭成功。用27年把华为带到通讯行业世界第一位置。如果是你也有类似,今天你在哪里呢。”
  我查了目前市面上的任正非传,基本上这段话的前半部分是有根据的。但后半部分有刻意曲解的成分。任正非当时是有一点点资本的,跟几个朋友一起创业也并非孤家寡人,他从南油退出时已经官至副总经理。而且他处在管制最为宽松的深圳,当时他跟王石一样,靠倒卖产品差价获得第一桶金。而且他们都赶上深圳最适合创业的年代,1988年,那不过是中国的“五月花号”把全中国最不安分的人都带到了这个国境线最南端的小渔港的时候。

  为了说明一个人的传奇其实并不必附会他的苦难过去,并非苦难越多越能衬托一个人的成功意义。

  44岁的任正非,并不比70多的褚时健缺乏励志性,那些触底反弹的故事只要让人们明白触底不一定会跟着反弹就够了,而不用一直强调底有多深多长。

  任何人,如果灾难足够长,困难足够多,命运足够惨一定是可以被打倒的,所谓活下来的人,三分之一靠努力,三分之一靠人品,三分之一靠运气,概莫能外,缺一不可。后代人写历史,不应老盯着人的意志和主观能动性,这会教坏年轻人,因为大部分走投无路的成功说到底不过是靠了运气之手在背后推了一把而已。
    若成功太容易,它的深刻性和参考性就可能不足。同样是成功者,陈天桥和史玉柱可能恰好只是在对的时间抓住了对的行业。“恰好”是统计学里的概率问题,不可能人人学会。

  倒是任正非这种不屈服和不放弃能成为年轻人的精神动力。所谓雄关漫道真如铁,而今迈步从头越,每一个有追求但身陷囹圄的年轻人,在最无助的时候想想任正非,你应该还没有他那么惨吧,至少你还有青春,还有宽松的社会环境,还有再来一次的可能。

  相信历史总不缺乏再一次的巧合,只是到那个时候,能不能问自己一句,在那个波澜壮阔的年份,当时的你在哪里?跟谁风云际会?

摘自:http://www.cfi.net.cn/p20150908000864.html
背景:转这个哥们的文章有两点:1)他的博客和我的样式几乎一样,有缘分。2)现在移动互联网如火如荼,虚火很大,很多人都往里面钻,但真正懂用户懂产品技术的还是少,这个哥们的语言有点调侃,描绘生动,心理活动也很丰富,集合现实的一些人情关系的描写,跃然纸上,转了吧。

这是一个“如有雷同,纯属巧合”的故事,外加一些废话,大家请勿对号入座。开始了……

我有些尴尬地拿着水杯,正对面坐着来访的王总,他是在别处打拼的人,这几年据说收获颇丰,见移动互联网如火如荼,自然也想着要进来干一场,尽管王总从事的行当也算跟IT沾边,但毕竟太长时间不接触技术,有些东西不太熟,总要咨询下我这个在一线开发混了十几年的老程序员,十几年的开发,有好几种可能性,不过这不是重点,所以暂时忽略掉这个细节吧。

我之所以尴尬,是对王总的需求有些不知如何回答,仿佛陷入了某种习惯性的沉思中。

王总站了起来,把手机递到我面前,说:“你看看,就这样一个APP。”他不太熟练地在屏幕上划了几下,我并没有很认真地看,因为我知道这个问题很难,那就是所有的开发者都会被问,并且可能是被问得最频的一个问题:“开发这么一个APP需要多长时间?”我很想说不知道,这可能是最直截了当和准确的回答,但面对王总这位老朋友,我要是这么回答估计有些失礼,所以这个时候,我除了大致思量了一下他所指的那个APP大致涉及到哪些方面之外,还要组织下自己的语言,如何用非常得体的话告诉他,这个事情我估算不出。“你看,就这么简单的一个APP”,王总继续在屏幕上拨弄了几下,然后带着几分期待的眼神看着我。

我谨慎地说:“坦白说,我说不准,我这方面经验也不是很足,尽管做过APP开发,但又跟这个很不一样,得具体分析好所有的逻辑,才能估算出时间。”

王总对我的说法似乎不以为然,他晃了晃手机,说:“我要求不多,其实比这个还简单”,他指着屏幕上某些地方,继续说:“这个,这个,这个都可以不要,只需要这么一个列表,里面有详情,可以查看修改……”

我心里很自然地想到这是很典型的“想当然简单”的态度,我想我得让他认识到这个问题的复杂程度,我反问道:“需要登录吗?”

王总稍作停顿后,说:“那当然。”

“什么登录?用户名密码方式,还是手机登录,抑或像QQ,微博,微信这种可以借用的第三方登录?”

王总这回似乎想了一下:“作为移动互联网,我想手机登录肯定是要的,QQ,微博,对了,微信,微信最好也要……哦,你前面说用户名密码,这个应该也是要的吧。”

我很流利地接着问:“那总得有注册,如果你打算用手机登录,那得找个短信平台,还有微信登录,你得先做好企业身份认证,对了,有登录,有密码,那密码找回功能也得有吧。”

“这是肯定的。”

“同时有多种登录途径,你必须要想出一种合理的逻辑来将它们‘整合’,最常见的当然是账号绑定,例如给你的账号绑定手机号码,这样就能用手机号来登录同样一个账号,对微信登录也同理,但如今移动互联网的用户们都挺厌恶注册流程的,所以往往会要求直接手机登录或者直接微信登录,自动完成注册过程,那考虑这种情况,如果用户先用微信登录,然后再用手机登录,而不是绑定,那么就会产生两个不同的账号,而且无法将其再‘整合’起来,我们得想出一套比较完善的方案……”

王总对我所说的似乎有些缺乏耐心:“没必要这么复杂吧?你看看这个APP,这些不都有吗?”

“有没有我前面所描述的那个问题,你尝试过了吗?”

但王总似乎对问题并不关心,他只想知道做这么一个APP需要多长时间,当然要多少钱,这也是他关心的问题,他拿出了信心满满的语气:“有问题怕什么?困难算什么?这些我相信都能解决,但时间很要紧,得快,我们的竞争对手不会等我们,就这么一个东西,你想想看,要多久?”

看他的架势,像十足那种混得风生水起的成功人士,而我这种身份低微的程序员在他面前确实是有口难言,我本来还想继续告诉他细节的重要性,却被他打断:“不,不需要有多精确,你只需要估算一个范围,两个星期?或是两个月?”

我觉得我没必要再隐瞒什么了:“我真的不知道,也许一支优秀的团队两个星期就能做好(不过我自己可不相信有这么牛逼的团队),但我很明显不是那个能创造这种奇迹的人。”我心想其实就算说出了“两个星期到两年”这么一个开玩笑式的范围,也可能是错的。

王总似乎对我这样的回答很失望。但他是个执行力很强的人,想做一件事,就一定会行动,行动一定快,一定要有结果,这种雷厉风行的行事风格,确实,我挺欣赏,不过他的这个项目,我可真帮不上忙,但我还是出于礼貌,说道:“技术方面有什么问题,还是可以来问我的。”

====================== 不怎么华丽的分隔线 ======================

“做一个APP需要多长时间?”这个问题估计比测一个人还能活几天还难,一个条件如此不充分的问题,如何回答呢?

总体来说,需求越是明确,团队越是成熟,估算出来的时间就越是准确。而软件开发这个事情,不管发展多少年,不管提出了怎样的方法论,都没办法像传统制造业那样把“工时”算得那么精确,其内部错综复杂的逻辑关系使然,软件工程,绝无可能量产。

用户看到的只是一个APP,如果他用的是iOS系统,也许他根本就不会接触Android,不知道开发者除了iOS版之外,还需要做一个Android版,(有没可能还有Windows版?这样工作量无疑更大)或者,网页版搞定一切?也许你真正动手做过后就不会这么认为,再说微信小店那种模式真能适用于所有场合么?而且,如果不是网络出现异常的话,一般用户也不会注意到服务器的存在,服务器总是那么默默无闻地为用户全天候地工作,它的开发难度恐怕也不亚于APP本身,而负责APP运维的还需一些人力,大了之后甚至需要组建一个专业团队,他们需要一个“后台”,能随时查看和处理数据,如果需要随时随地都能查看和处理数据,恐怕还得给后台专门弄个APP。

这个道理就有点类似:我们看到了战机在天上华丽地完成了歼敌任务,以为只是战机本身很牛,往往忽视了战机相关的那些配套,如果没有娴熟的飞行员、作战指挥中心、地面雷达、预警机、补给、机场或航母、地勤人员等等,那么战机将失去战斗力。APP也一样,它不是一个只要能跑起来就完事的东西,支持它的配套设施和维护工作丝毫不比APP本身简单。

除开这些大的方面,细节上也带有许多的不确定性,所以一支成熟的团队尤为重要,一个经验丰富的开发者会知道,至少大致知道这个开发过程会遇到哪些问题,哪些问题比较简单,哪些问题则可能需要耗费大量的时间,这得依赖经验。我有一句话常常挂在嘴边,那就是:“没做过的东西别轻易说简单。”“想当然简单”的态度对项目没有任何好处,如果自己不确定,那么去咨询一个有这方面经验的人,就算得不到具体的答案也有大致的方向,沿着这些方向研究一下,就能知道会面临的那些问题,当然往往还不是全部。

关于“低估了难度”这事情,我过去的公司有个经典故事,当时有个小项目,就是准备把一套已经在仪器上使用的只支持英语的程序增加多语言支持,程序并不大,涉及内容也不算太多,工程师一开始认为这只是个简单的翻译工作,顶多两个星期就能完成,但一做下去就发现不简单,首先翻译得找专业人士来做,自己做不好,我们没人精通欧洲各国语言,接下来还有单位换算,有些国家用公制,有些用英制,这个得考虑,包括日期显示格式也得考虑,一下子不知道多了多少工作,这些都差不多了之后又发现了德语单词过长,我们的仪器的屏幕显示不下,超出范围,于是再调字体,做精简,前前后后开会讨论了N次,最后想Release的时候发现这么一改,程序的Size变大了很多,有些仪器的存储器装不下,这下大家可都傻了,优化呗,精简呗,程序开始有些凌乱不堪了,最后勉强通过质控部检验,总算发布了,发觉足足搞了半年。不过如今想想之所以耗费了这么多时间,一个很重要的原因是经验不足,对多语言,国际化这块不熟,走了不少弯路,所以我前面也提到,成熟的团队尤为重要。

我们在估算项目时间的时候,往往只算了“写代码的时间”,而把那些和老板或客户扯皮,做需求分析,设计,测试,和修复bug的时间不考虑进去,而这些时间加起来通常比写代码的时间多出不少,我个人是不轻易为了讨好老板而把完成时间说得很短的,为啥?——根本做不到嘛,干嘛要撒谎?如果一个需要一星期完成的新功能开发,我通常得把这个时间double,这已经算比较“不保守”的了。

即便只算写代码的时间,也往往会被低估,老板或客户对你开发的东西很可能不满意,或许你误解了他的功能需求,或者界面有点卡顿,或者这个图标颜色不好看,你是开发者,不是美工,虽然凑合可以当一下美工,但毕竟不专业,更重要的是做做UI设计,做做图这种事情,也得耗费不少时间,当你为“一个像素”焦头烂额的时候,是不是很渴望团队中有一名设计师?这时候得提醒下老板:你必须要在时间和功能之间,做点取舍。老板当然很不高兴,但也不得不在功能上做出了一些妥协。虽然这样做能让难产的项目早点上线,但却为来日项目的失败,给老板添加了一个很好的借口:我们的工程师太差了,没按我说的去做。

老板或客户除了会抱怨你做出来的东西不够好看之外,还会再提很多东西:这个界面能不能改成多选,能否增加通知功能,已读未读状态要有,界面能不能再流畅点,昨晚程序咋“闪退”了一次……需求只管提功能,但没说具体这个UI要多美观,也没说程序稳定性要好,更没涉及到要达到多大的吞吐量,当然,可能更重要的——安全性也没提,你心一惊:是啊,如果有黑客,不,只要稍微懂一点技术的恶意用户想刷爆我们的服务器,那简直太简单了,而这些防护措施我都没做!所幸的是项目名气太小,暂时无需考虑这个。(貌似大多数APP都活不到需要考虑这个的时候)

所有这些,你说功能也好,细节也好,稳健性也好,都不是能自动从土里长出来的东西,都得需要花时间去想,去做,有些甚至还是个“系统工程”,如果头痛医头脚痛医脚去做的话,系统里到处充满“飞线”,无疑会给将来的维护留下了许多隐患。攻城狮的你,都考虑了吗?更别说老板为了节省成本而给你购置的低性能电脑让你整天抓狂这些“无关紧要”的事。

====================== 不怎么华丽的分隔线 ======================

话说王总告别我之后就以迅雷不及掩耳之势注册了公司,注册了域名,搞到了办公室,还一下子叫来了一帮子人风风火火地搞了起来,这种发展势头,这种干劲,我只有自叹不如。心底里真有些后悔怎么没跟他去干事业,不过这只是感性的一瞬间,理性又在接下来的几百毫秒里将我拉了回来:还是别去好,跟他沟通不来的。

王总的项目后来以一飞冲天之势迅猛发展,而他如今已经是一家估值几亿的公司的CEO,我嘛,越来越觉得自己是个Loser,独自坐在办公室里,还是拿着那个水杯,懊恼不已——打住!这样是不是比较有戏剧性?可虽然一开始我就声明此故事“如有雷同,纯属巧合”,但也不能胡乱瞎编,真正的结局是:确实风风火火弄了几个月,后来就突然杳无音讯了,本来想打电话问问王总究竟怎样,无奈他变成了另一个超级忙人,再无心思跟我聊家常了。嗯,结局还是差不多,我还是那个继续苦逼地坐在办公室里的程序员,唉,别想了,开工吧!


原文原创来自:http://www.cnblogs.com/guogangj/p/4676836.html
背景:这位兄弟做的lnmp包细节上不错,不支持hhvm,最主要是这位兄弟其服务意识好,之前有一个lnmp.org,我觉得都挺不错,这块主要是对nginx代码了apache后,apache如何获取ip这块是个大问题,需要一些模块来设置的一个配置,对来源IP有一个日志需求很正常,这块像Tencent的TGW,其实在这一块从一个大的IP进来分到后面的机器处理,到底落到哪台机器了,及IP是多少,也涉及到这些类似问题,对于此种架构来讲,没有过实际生产经验,仅供参考,一般直接从硬件如F5,或lvs代理到apache或nginx,我想这个哥们的应用场景可能不大一样吧。

Internet -> Nginx -> Apache
最近在将Apache-2.2和Apache-2.4添加到《lnmp一键安装包》中,Nginx作为前端,Apache作为后端的情况下,Apache只能获取到Nginx前端的ip地址(127.0.0.1),而无法获取到用户的真实ip地址,在这种情况下,后端是Apache如何获取用户真实IP地址?

Nginx配置如下:

location / {
        try_files $uri @apache;
        }

location @apache {
        internal;
        proxy_pass http://127.0.0.1:8080;
        include proxy.conf;
        }

location ~ .*\.(php|php5)?$  {
        proxy_pass http://127.0.0.1:8080;
        include proxy.conf;
        }
proxy_connect_timeout 300s;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 32k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_redirect off;
proxy_hide_header Vary;
proxy_set_header Accept-Encoding '';
proxy_set_header Referer $http_referer;
proxy_set_header Cookie $http_cookie;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
获取真实IP地址有Apache有2个模块:
mod_rpaf:Apache-2.2支持;Apache-2.4不支持。网上教程很多
mod_remoteip:Apache-2.4自带模块;Apache-2.2支持;推荐

Apache-2.2.25
mod_rpaf模块

wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
tar -xzvf mod_rpaf-0.6.tar.gz
cd mod_rpaf-0.6/
/usr/local/apache/bin/apxs  -i -c -n mod_rpaf-2.0.slo mod_rpaf-2.0.c
添加Apache配置

vi  /usr/local/apache/conf/httpd.conf
Include conf/extra/httpd-rpaf.conf
vi /usr/local/apache/conf/extra/httpd-rpaf.conf

LoadModule rpaf_module        modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 10.8.0.110 # 代理服务器的ip地址(记得做相应修改)
RPAFheader X-Forwarded-For
备注:RPAFproxy_ips后面添加代理服务器的ip地址,有几个填几个
测试

# /usr/local/apache/bin/apachectl -t
# /usr/local/apache/bin/apachectl restart
# 看日志
mod_remoteip
Apache-2.2下配置mod_remoteip如下:
安装

wget https://github.com/ttkzw/mod_remoteip-httpd22/raw/master/mod_remoteip.c
/usr/local/apache/bin/apxs -i -c -n mod_remoteip.so mod_remoteip.c
修改配置文件:

vi /usr/local/apache/conf/httpd.conf
Include conf/extra/httpd-remoteip.conf
vi /usr/local/apache/conf/extra/httpd-remoteip.conf
LoadModule remoteip_module modules/mod_remoteip.so
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1
测试:

# /usr/local/apache/bin/apachectl -t
# /usr/local/apache/bin/apachectl restart
# 看日志
Apache-2.4配置mod_remoteip除了上面(自带mod_remoteip模块不需要安装),还需要修改日志格式(折腾很久)

LogFormat "%h %a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %a %l %u %t \"%r\" %>s %b" common
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedi
在日志格式中加上%a

摘自:https://blog.linuxeye.com/378.html

Q:这里是老大的教程,但最后有一个修改日志格式的教程,请问日志格式在哪修改,文件路径是什么啊?
那最后面 Apache-2.4配置mod_remoteip除了上面(自带mod_remoteip模块不需要安装),还需要修改日志格式(折腾很久),这里的日志格式在哪里修改呢,谢谢?
A:请看这文章:http://blog.sina.com.cn/s/blog_672c5a470100xj7z.html
背景:想要做一个高性能的框架也好,其实还是站在内核上面跳舞,为此,其对内核的设置很重要,就以swoole来讲,其queque是基于epoll,进程间通讯用到内核的que,当然要设置它 了,再就是消息队列这块的通讯,是不是也得设置,这块还有高并发的句柄这块,也需要设置为更大。这块linux下的epoll和freebsd的kqueque都要设置一下,否则,用不上内核的能力也就问题大了,swoole的nginx配置到swoole的通讯用unix socket dgram,也需要配置,你可能说这个框架性能不行了,其实性能是一个综合体,不是一个框架就能说明的。

当使用消息队列作为进程间通信方式时,需要调整此内核参数

kernel.msgmnb = 4203520,消息队列的最大字节数
kernel.msgmni = 64,最多允许创建多少个消息队列
kernel.msgmax = 8192,消息队列单条数据最大的长度

————————————————————————————
ulimit设置

ulimit -n 要调整为100000甚至更大。 命令行下执行 ulimit -n 100000即可修改。如果不能修改,需要设置 /etc/security/limits.conf,加入

* soft nofile 262140
* hard nofile 262140
root soft nofile 262140
root hard nofile 262140
* soft core unlimited
* hard core unlimited
root soft core unlimited
root hard core unlimited
内核设置

net.unix.max_dgram_qlen = 100

swoole使用unix socket dgram来做进程间通信,如果请求量很大,需要调整此参数。系统默认为10,可以设置为100或者更大。
或者增加worker进程的数量,减少单个worker进程分配的请求量。

net.core.wmem_max

修改此参数增加socket缓存区的内存大小

net.ipv4.tcp_mem  =   379008       505344  758016
net.ipv4.tcp_wmem = 4096        16384   4194304
net.ipv4.tcp_rmem = 4096          87380   4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_tw_reuse

是否socket reuse,此函数的作用是Server重启时可以快速重新使用监听的端口。如果没有设置此参数,会导致server重启时发生端口未及时释放而启动失败

net.ipv4.tcp_tw_recycle

使用socket快速回收,短连接Server需要开启此参数

消息队列设置

当使用消息队列作为进程间通信方式时,需要调整此内核参数

kernel.msgmnb = 4203520,消息队列的最大字节数
kernel.msgmni = 64,最多允许创建多少个消息队列
kernel.msgmax = 8192,消息队列单条数据最大的长度

开启CoreDump

设置内核参数

kernel.core_pattern = /data/core_files/core-%e-%p-%t
通过ulimit -c命令查看当前coredump文件的限制

ulimit -c
如果为0,需要修改/etc/security/limits.conf,进行limit设置。

开启core-dump后,一旦程序发生异常,会将进程导出到文件。对于调查程序问题有很大的帮助
其他重要配置

net.ipv4.tcp_syncookies=1
net.ipv4.tcp_max_syn_backlog=81920
net.ipv4.tcp_synack_retries=3
net.ipv4.tcp_syn_retries=3
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 20000 65000
net.ipv4.tcp_max_tw_buckets = 200000
net.ipv4.route.max_size = 5242880
查看配置是否生效

如:修改net.unix.max_dgram_qlen = 100后,通过

cat /proc/sys/net/unix/max_dgram_qlen
如果修改成功,这里是新设置的值。

摘自:http://wiki.swoole.com/wiki/page/11.html
本地socket--SOCK_DGRAM方式:http://blog.csdn.net/shanzhizi/article/details/16883601
背景:我是一个同事,操作一些命令后出现这个问题,经过chmod 755 / 问题得到解决。


客户一个oracle突然当机了,由于业务启动,客户下意识的重启了服务器,系统是起来了,准备切换到oracle用户下启动数据库,可以怎么都无法su切换,真是火上浇油呀,描述如下:
在root用户下,su到一个普通用户oracle,得到如下错误:

[root@localhost ~]# su -  oracle
su: warning: cannot change directory to /home/oracle: Permission denied
su: /bin/bash: Permission denied

而oracle用户也无法通过直接登录,出现同样错误。

这是一个非常奇怪的问题,到底是什么导致的呢?思路如下:
1,程序执行权限问题
2,程序依赖的共享库权限问题
3,目录权限问题
4,根空间问题。

检查/bin/bash,权限正确,检查/home/oracle权限正确,检查/lib/ld-***.so,权限也正确。

继续调试,检查/etc/passwd,将oracle的home设置为/tmp,把/tmp设置为777,这个权限应该是最宽松的。

而su出现同样的错误。

也就是oracle用户无法访问777权限的/tmp。

问题到底出现在哪里呢?

最后
通过star命令,看到了问题根本,
[root@localhost ~]#stat  /
输出如下:因为你ls是看不到的。
  File: “/”
  Size: 1024            Blocks: 2          IO Block: 1024   目录
Device: 803h/2051d      Inode: 2           Links: 22
Access: (0666/drw-rw-rw-)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2007-12-01 22:28:48.000000000 +0800
Modify: 2007-12-01 22:28:34.000000000 +0800
Change: 2007-12-01 23:17:35.000000000 +0800

问题出来了,这里的权限是错误的,X权限的丢失造成的。

[root@localhost ~]#chmod 755 /


修改后,问题消失。

产生上述问题的方法:
第一种,chmod 666 /,可以导致。

或者,
第二种,chmod 700 /lib/ld-xxxx.so,也可以导致su失败。

有兴趣可以自己试一下。

/ 权限的丢失对于各种运行在自己用户身份上的daemon也存在同样的影响。
原文链接: http://www.ixdba.net/a/mz/2010/0421/14.html
背景:c语言把整数写入文件,并读出,C语言写整数到文件用啥函数? 我看 fwrite 是写char*的。这个在调试队列时可以用上,有时入队出队不一致时,通过入队写了多少行出队写了多少行就知道到底队列程序在数据量大时有没有问题。




摘自:http://blog.163.com/song_0803/blog/static/4609759720112231158527/

入队写文件:


出队写文件:





整个换行到里面去,否则全是888不太好用vim 打开直接set nu看多少行:


w+以纯文本方式读写,而wb+是以二进制方式进行读写。

mode说明:
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
wb 只写方式打开或新建一个二进制文件,只允许写数据。
wb+ 读写方式打开或建立一个二进制文件,允许读和写。
r 打开只读文件,该文件必须存在,否则报错。
r+ 打开可读写的文件,该文件必须存在,否则报错。
rb+ 读写方式打开一个二进制文件,只允许读写数据。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。
背景:有时PHP像python那样可交互能对小代码片段的验证提高效果,但默认编译好像是不行的。
[root@localhost htdocs]# php -i | grep readline
[root@localhost htdocs]# 主要的差異在於 Compile 時, 有沒有加入 "--with-readline",

试着安一个扩展:
readline 相关错误
现象:configure: error: Please reinstall libedit – I cannot find readline.h
解决办法:安装 Editline Library (libedit),官网:http://thrysoee.dk/editline/
下载最新版 libedit 编译安装即可。
直载后,直接:configure && make && make install
_____________________________________________________________________________
./configure --with-readline
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.


./configure
make && make install

[root@iZ25dcp92ckZ readline]# make install
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/

安上了,但还是失败了:
[root@iZ25dcp92ckZ readline]# php -a
php > echo "helo";
php: symbol lookup error: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/readline.so: undefined symbol: append_history

这儿有一个兄弟也在问一样的问题,说是:php 的 readline 模块和所使用的 readline 库的版本差异太大了。
摘自:http://segmentfault.com/q/1010000002455369
——————————————————————————————————————————————————————


0 === false???

php > var_dump( 0 === false);
bool(false)
php > $res =0;
php > var_dump( $res === false);
bool(false)



php -a
Interactive mode enabled

<?php
echo time() . "\n";
$a = 1;
echo $a;
?> Ctrl + d
1440560402
1





————————————————————————————————————————————————————
臨時要測個簡單的程式片段 或 Function, 一般都會於 CLI 寫來跑一跑, Interactive 模式 可以邊寫邊測試~ (互動模式, 寫完一行就 Compile 一行)

而 PHP CLI 的模式有兩種差異: (執行方法: $ php -a, 說明可見: PHP: Interactive shell)

Interactive shell 比較像是 互動式, 有問有答的執行程式.
Interactive mode enabled 則是輸入一整個區塊的程式碼, Ctrl-D 執行.

目前 (2012年) Ubuntu Linux 內建預設的是 Interactive shell, 而 Debian 是 Interactive mode enabled.

主要的差異在於 Compile 時, 有沒有加入 "--with-readline", 可使用 "php -i | grep readline" 查看.

Interactive mode enabled

$ php -a
Interactive mode enabled

<?php
echo time() . "\n";
$a = 1;
echo $a;
?> Ctrl + d
1330954647
1

Interactive shell

$ php -a
Interactive shell

php > echo time();
1330954675
php > $a = 1;
php > echo $a;
1

来自:http://blog.longwin.com.tw/2012/03/php-interactive-shell-2012/
解决办法就是重新编译并安装一次加上参数:
http://blog.csdn.net/pqhdp/article/details/9386185



在php Interactive mode里敲代码不需要<?php ?>的啊,直接输入echo "hello"; 回车就可以了。
还有php现在有一个还不错的repl实现
https://github.com/borisrepl/boris
比 php -a 要更舒服一些。

演示:http://segmentfault.com/a/1190000000353069
需要git。


—————————Centos安装git并装Boris不用重新编译PHP实现类python命令行交互。—————————
[root@localhost boris-1.0.10]# yum install git
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
* base: 10.64.5.100
* updates: 10.64.5.100
* addons: 10.64.5.100
* extras: 10.64.5.100
base                      100% |=========================| 1.1 kB    00:00    
updates                   100% |=========================| 1.9 kB    00:00    
primary.sqlite.bz2        100% |=========================| 504 kB    00:00    
addons                    100% |=========================| 1.9 kB    00:00    
extras                    100% |=========================| 2.1 kB    00:00    
Setting up Install Process
Parsing package install arguments
No package git available.
Nothing to do
[root@localhost boris-1.0.10]# cat /etc/redhat-release
CentOS release 5.2 (Final)
[root@localhost boris-1.0.10]# rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
Retrieving http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
warning: /var/tmp/rpm-xfer.Q9d5Ba: Header V3 DSA signature: NOKEY, key ID 217521f6
Preparing...                ########################################### [100%]
   1:epel-release           ########################################### [100%]
[root@localhost boris-1.0.10]# yum install git        
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile

yum install git
Total download size: 7.5 M
Is this ok [y/N]: y
Downloading Packages:
(1/4): git-1.8.2.1-1.el5.  20% |=====                    | 1.5 MB    00:12 ETA

安git参看:http://www.letuknowit.com/post/19.html,为何要安?是因为想用它安装PHP的Boris——PHP也有REPL。
演示:http://segmentfault.com/a/1190000000353069  

你可以通过 Packagist 来安装 Boris。当然你也可以直接克隆它的 git 仓库:

git clone git://github.com/d11wtq/boris.git
cd boris
./bin/boris
Boris以MIT许可证发布。更多信息请访问Boris在GitHub上的项目主页。

[root@localhost local]# git clone git://github.com/d11wtq/boris.git
Cloning into 'boris'...
remote: Counting objects: 1061, done.
remote: Total 1061 (delta 0), reused 0 (delta 0), pack-reused 1061
Receiving objects: 100% (1061/1061), 204.32 KiB | 62 KiB/s, done.
Resolving deltas: 100% (506/506), done.


[root@localhost local]# cd boris
[root@localhost boris]# ./bin/boris

背景:从某种意义来讲用memcache做缓存已经相当成熟,对于中小型的一些高并发也是可以的,但是伴随微博的兴起(现在好像不行了),有了No-sql这样一种东西出来,但究其从底层来讲和memcache不同在memcache是基于libevent的主进程下用pipe进行通讯的多线程机制,可能是不需要锁的还提供原子锁,而那个redis呢是基于epoll啥的事件驱动的异步的(好像是柱塞的,我再查下:是非阻塞IO ,epoll加自己实现的事件框架,redis实际上是采用了线程封闭的观念,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作的复合操作来说,依然需要锁,而且有可能是分布式锁,这块不太明白,反正有利有弊吧,有了锁性能肯定不是太好。)一个单进程在跑,其规避了memcache的全放内存,而是隔一会儿会刷新到那个较为活跃的数据到硬盘里,还支持一部分的数据结构,结构化数据可能会影响其性能,其稳定性和高效来讲,我个人觉得和memcache差不多(mm略高一丝),但对大的粒度的存储来讲,可能mm性能更好,而对于小粒度那当然是redis了,这是因为一个是基于多线程和单进程,二是epoll这玩意好像生来就有这个对大粒度的东西不是太在行,比如:apache之于用epoll写的nginx,对于长时间的重逻辑处理来讲还是apache稳定,至于为什么,这个是实践出来的。获取数据和设置数据在协议上memcache是字符的,redis是二进制???
好了,下载一个最新稳定版本的吧:
http://download.redis.io/releases/redis-3.0.3.tar.gz
http://download.redis.io/releases/redis-stable.tar.gz
解压缩: tar -zxvf redis-3.0.3.tar.gz
cd redis-3.0.3
$ make
$make install
$cp redis.conf /etc/


Q:默认目录:/usr/local/bin 我不想装这儿啊。怎么办?
A:make完  不要install了 手工做
make完了之后,cd utils,里面有个install_server.sh,执行的时候会问你要安装到哪个路径
./install_server.sh



参数介绍:
make install命令执行完成后,会在/usr/local/bin目录下生成本个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-check-aof 、redis-check-dump
redis-server:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具。也可以用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在当前系统下的读写性能
redis-check-aof:数据修复
redis-check-dump:检查导出工具
修改系统配置文件,执行命令
a) echo vm.overcommit_memory=1 >> /etc/sysctl.conf
b) sysctl vm.overcommit_memory=1 或执行echo vm.overcommit_memory=1 >>/proc/sys/vm/overcommit_memory
修改redis配置文件
a) $ cd /etc
b) vi redis.conf
c) 修改daemonize yes---目的使进程在后台运行
启动redis
a) $ cd /usr/local/bin
b) ./redis-server /etc/redis.conf
/usr/local/bin/redis-server /etc/redis.conf
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
7. 检查是否启动成功
a) $ ps -ef | grep redis

果然是单进程且是epoll:
[root@localhost bin]# ps -ef | grep redis
root       317     1  0 17:20 ?        00:00:00 ./redis-server *:6379
[root@localhost bin]# strace  -f -p 317
Process 317 attached with 3 threads - interrupt to quit
[pid   325] futex(0x6e6c54, FUTEX_WAIT_PRIVATE, 1, NULL <unfinished ...>
[pid   324] futex(0x6e6c24, FUTEX_WAIT_PRIVATE, 1, NULL <unfinished ...>
[pid   317] epoll_wait(3, {}, 10128, 3) = 0
[pid   317] open("/proc/317/stat", O_RDONLY) = 6
[pid   317] read(6, "317 (redis-server) R 1 317 317 0"..., 4096) = 233
[pid   317] close(6)                    = 0
[pid   317] epoll_wait(3, {}, 10128, 100) = 0
[pid   317] open("/proc/317/stat", O_RDONLY) = 6
[pid   317] read(6, "317 (redis-server) R 1 317 317 0"..., 4096) = 233
[pid   317] close(6)                    = 0
[pid   317] epoll_wait(3, {}, 10128, 100) = 0
[pid   317] open("/proc/317/stat", O_RDONLY) = 6
[pid   317] read(6, "317 (redis-server) R 1 317 317 0"..., 4096) = 233
[pid   317] close(6)                    = 0
[pid   317] epoll_wait(3,  <unfinished ...>
PHP是最好的语言,那安装个PHP扩展,选个自己的PHP版本的扩展:
https://github.com/nicolasff/phpredis/downloads
[root@localhost software]# php -v
PHP 5.3.10 (cli) (built: Jun  4 2013 11:51:25)
Win:https://github.com/downloads/phpredis/phpredis/php_redis-5.3-vc9-ts-73d99c3e.zip
*nix: https://github.com/phpredis/phpredis
        https://github.com/phpredis/phpredis/releases
Linux代码  收藏代码
$  tar zxvf nicolasff-phpredis-2.2.2-48-g7dfac44.tar.gz  
$ cd  nicolasff-phpredis-7dfac44/  
$ /usr/local/webserver/php/bin/phpize  
$ ./configure --with-php-config=/usr/local/webserver/php/bin/php-config  
$ make  
$ make install  
3 修改php.ini
    查看/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613是否有redis.so
[root@localhost phpredis-2.2.7]# make install
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/
在php.ini中 添加  
  extension=redis.so
/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/redis.so
[root@localhost phpredis-2.2.7]# php -i|grep php.ini
Configuration File (php.ini) Path => /usr/local/php/etc
Loaded Configuration File => /usr/local/php/etc/php.ini
[root@localhost phpredis-2.2.7]# vi /usr/local/php/etc/php.ini
4 重启php进程
  $  /usr/local/webserver/php/sbin/php-fpm restart
5 查看phpinfo() 是否有redis扩展

6 用PHP文件测试
Php代码

输出:Hello World
成功!
参考来自:http://alfred-long.iteye.com/blog/1685092
redis server安装部分摘自并参考:http://www.cnblogs.com/zhuhongbao/archive/2013/06/04/3117997.html

开机启动,没试过,需要实践:

把上述代码存为redis,放到/etc/init.d/下面
[html] view plaincopy在CODE上查看代码片派生到我的代码片
chmod +x /etc/init.d/redis  
设定开机启动服务
sudo chkconfig redis on  
启动,停止redis
service redis start   #或者 /etc/init.d/redis start  
service redis stop   #或者 /etc/init.d/redis stop  
测试redis
redis-cli  
redis 127.0.0.1:6379> set foo 123  
OK  
redis 127.0.0.1:6379> get foo  
"123"  
redis 127.0.0.1:6379> exit  
背景:做温度比较时有用。
PHP如何比较两个浮点数的大小?

在程序开发中,通常有会涉及到两个大浮点数的比较:如:1.9999999999999999999981.999999999999999999999这样两个大精度的数的比较方法除了以字符串的形式来比较,还有其它方式比较吗?php的bccomp比较出来是相等的。


注意第三个参数

$a = '1.999999999999999999998';
$b = '1.999999999999999999999';
$flag = bccomp($a, $b, 21);
var_dump($flag); // int(-1) 说明b比a大
exit;


From:http://baike.1688.com/doc/view-d35956820.html
背景:用树莓派下的chromium调试confirm阻止此页面创建其他对话框的解决方法







用Firefox操作弹出界面时总是遇到“firefox 阻止此页面创建其他对话框”,点击确定后,控制台就会报错误.

解决方法:

1. 在firefox里输入about:config

2. 在列表框里右键->新建->整数

3.输入选项名dom.successive_dialog_time_limit,值设为0,点确认。
echo exec('whoami')
背景:想在树莓派上使用,Raspberry Pi下的chromium没有声音,但在电脑上的FF和Chrome有声音。


Demo:


来自:http://blog.csdn.net/fdipzone/article/details/8170337
每天做得最多的就是用VIM打开文件、保存文件。使用VIM编辑文件时我习惯用'x'命令在保存并退出。而我的一个同事习惯用'wq'命令保存并退出,有一次他问我用'x'和'wq'有什么区别吗?我当时答不出来。

今天我在用'x'命令保存退出时发现了一个有趣的地方,保存退出后有时会显示 "filename" 1L, 10C 已写入  这么一行,有时又不显示。多试了几次才发现在没有修改文件时用'x'命令保存退出时不会显示 "filename" 1L, 10C 已写入 ,文件的修改时间也不会发生变化。有修改时则会显示这一行,而且文件的修改时间也会随之更新。接着我又使用'wq'命令保存退出时终于发现了点问题:不管我是否修改了文件内容,用'wq'命令保存退出时都会显示 "filename" 1L, 10C 已写入 ,并更新文件的修改时间。呵呵原来"x"与"wq"的的真正区别在这里:

wq   强制性写入文件并退出。即使文件没有被修改也强制写入,并更新文件的修改时间。
x    写入文件并退出。仅当文件被修改时才写入,并更新文件修改时间,否则不会更新文件修改时间。


From:http://blog.chinaunix.net/uid-12115233-id-3268894.html
首先,用 telnet 链接WEB服务器:
telnet 172.21.73.12 80
键入下面两行命令,然后回车2次,即可得到HTTP响应(下面的命令是get index.html文件,请根据你测试的server的实际情况修改这个参数)。
GET /index.html HTTP/1.1
host:172.21.73.12:80

响应的结果如下所示:
HTTP/1.1 200 OK
Date: Thu, 30 Jul 2009 03:42:18 GMT
Server: Apache/2.2.3 (Debian) mod_python/3.2.10 Python/2.4.4 PHP/5.2.0-8+etch5~pu1 mod_perl/2.0.2 Perl/v5.8.8
Last-Modified: Thu, 30 Jul 2009 03:21:07 GMT
ETag: "320692-19e-cb5d6ec0"
Accept-Ranges: bytes
Content-Length: 414
Content-Type: text/html; charset=UTF-8
来自:http://blog.chinaunix.net/uid-20644632-id-68039.html

可以用来排查一下那个网路的问题:


——————————————————————————————
实践OK如下:


不用这么复杂,但有一个问题,用telnet手打的话就写个 GET /  就好了
这host没有设置,访问默认到ip了: curl -H"Host:jackxiang.com" ...怎么体现在telnet里:


得用ip去连接后,写Host才行,如下:


=================================================================================
Telnet Post/Get  实现方式:
Get方式
1. telnet 192.168.1.110 80,连接上之后。
2.

windows doc命令行下:ctrl键 + ']' 键 进入输入模式,接着按回车切换到显式输入模式(可以显示输入的字符)

linux命令行则不需要此此操作。



3. 输入http头部,两次回车(\r\n)。

GET  /api.do?user=charlie&pwd=w2ss42   HTTP/1.0

Content-Type: text/html; charset=UTF-8


POST方式
1. telnet 192.168.1.110 80,连接上之后。
2. 同上。



3. 输入http头部,两次回车(\r\n),接着输入post参数。

POST   /api.do   HTTP/1.0

Content-Type: application/x-www-form-urlencoded  

Content-Length: 15



user=charlid&pwd=w2ss42

POST/GET 来自:http://blog.csdn.net/xiongli880612/article/details/40300861
来源2:http://blog.csdn.net/fym0121/article/details/7647887
==========================一个哥们是IOS上这样就行,我发现不行======================================
http GET http://jackxiang.com    GET必须大写,否则返回:400 Bad Request:



本文转载自:http://www.cnblogs.com/stg609/archive/2008/07/06/1237000.html
      1、打开"运行"->cmd进入命令环境;
      2、输入"telnet www.baidu.com 80",回车后 ,屏幕为全黑,此时我们利用快捷键"Ctrl+](右中括号)"来打开本地回显功能,这样我们就可以看见我们所打的东西了,如图:(注本阶段执行过程和以下的过程均要求操作时间尽可能短,因为时间一长,便会被认为断开连接。)


      3、单击回车,进行编辑状态。
      4、输入:"GET / HTTP/1.1"后回车,在第二段接着输入:"HOST:"然后按回车,这样一个简单的HTTP请求就完成了,接着我人只要再按下回车,便向服务器递交这个请求了。如图:(我们来看一下这个是什么意思:GET表示请求方式,/表示请求的根目录下的文件,HTTP/1.1表示HTTP协议版本,HOST就是一个消息头,据某些朋友说1.1的版本一定要加一个"HOST:"可是我实验后发现"HOST :"不加仍旧可以正常发送请求,但是GET HTTP这个必须大写,否则就该请求无法发送)


      5、接收服务器返回,这步其实不需要我们来做,因为当我们发送请求后,只需几秒钟,我们便会收到来自服务器反应.


      6、这样,请求就算完成了。下面我们在百度中搜一下"1",浏览器中的地址应该是:http://www.baidu.com/s?wd=1.看看请求是怎么样的


      怎么样,大家会了吗?以上只是用GET方式进行请求,当然还可以用POST方式进行请求,只是POST我这不方便做实验,所以就不写了。大概的格式给大家参考下:
      POST /localhost/login.aspx HTTP/1.1
      HOST:
      Content-Type:application/x-www-form-urlencoded
      Content-Length:10
      
      uid=xxxxxx
用C语言实现一个循环队列并不难。关键点在于对队列 "空" 和 "满" 状态的判断。

正如《C和指针》中所描写的,有两种方法来实现对队列空和满状态的判断。

在数组中空一个元素不填,起始时, 置tail为0, front为1, 这样一来, 实现要浪费queue buffer中两个元素空间:
队列空:  (tail+1) % queue_size == front
队列满:  (tail+2) % queue_size == front
定义一个变量来记录队列中元素的个数, 判断队列的空和满直接看变量的值即可


本文中使用的是第2种:


来自:http://blog.csdn.net/huangkangying/article/details/44066729
背景:公司服务器存的ftp是utf-8,用那个leapftp打开是乱码,如何让leapftp支持UTF-8编码?
leapftp 通过发送命令 可以将服务器的乱码识别为正常编码:
登录乱码服务器;
随意点击服务器上任意乱码文件或目录;
按键盘CTRL+R 弹出对话框;
输入opts utf8 off  点击确定;(需勾选完成时刷新选项)
服务器会从乱码态转为正常可识别状态;
缺点:每次登陆都需要敲入这个命令,但是对于下载已经没有影响了;

以上实践OK。
在 .vimrc里添加:


按一下 f 键就能显示函数名字。

来自:http://blog.csdn.net/caspiansea/article/details/42570311


vim里一个函数很长(几百行),光标在函数中间的某个位置,怎么快速跳到函数头?
[]
是跳到函数头。[ 是 p 右侧那个键。
正常模式
跳到头
[[
跳到尾
][
跳到下一个函数
]]
调到上一个函数
[]
调到上一层大括号
[{


ctrl + o 回到光标回到上次位置:
ESC下面那个按两下也可以实现


命令模式下跳转到某行:
比如开始在第n行,然后用mG后,跳到了m行,
技术创新持续进行、速度不断加快,企业竞争优势主要来自创新。随着科技的日新月异,人们的生活节奏越来越快以及对个性的追求,产品的生命周期不断缩短。
顾客需求瞬息万变,产品周期不断缩短。在知识经济时代,那种”生产什么就卖什么”的时代已经一去不复返了。如今的”买方市场”使顾客的选择范围大大拓宽,也使得他们对产品的期望值在不断提高,他们不再满足于合理的价格,而且还要追求产品的个性化,企业往往要根据顾客的需求”量体裁衣”。
于是顾客不再有耐心为某一种产品而长时间地等待了。 企业如果不能即时对市场需求变化做出快速响应,不能在短时间内开发、生产并销售出其产品,企业就会被淘汰出局,SO,中小企业如雨后春笋,进行专业化灵活多便的生产或服务,并以其低成本运营对规模化企业高成本运营直接产生竞争威胁。
目前,不求最好,但求最贵的公司,设备该上的都上了,事故该来的仍然会来,使用第三方企业提供的解决方案未必靠谱,昂贵的硬件与软件投资并没有为创造出应有的价值。为什么?在我看来,是因为硬件软件分离太久用户行为思维习惯审美发生了大变化,在天下大势,分久必合,合久必分的必然演变下以合为主要潮流,鉴于此背景,我们也必须要顺应潮流,把整个软硬件的链条拉长并牢牢的控制在我们手中,这不是不可能,现在软件硬件的技术已然成熟不再是难点问题而最多的是利用这一整套结构体系去满足用户的迁移和品味的变化,同时,这个潮流不是迅速就来就过而是一个循序渐进的过程,这也就是为何慢也没关系再就是硬件的研发本来就慢,即便如此,我们出发时就要在整个链条上贯穿上我们自己的兄弟,势必完整把握住灵活构建出软硬件一体化的根本原因所在。

————————————————————————————————————————————————————————————————
警惕IT黑洞

什么是IT黑洞

IT黑洞是指企业在利用信息技术进行经营管理时,巨额的软硬件或软件投资并不能给企业带来预期的管理效率,企业在这方面的投资好像陷入一个“黑洞”的现象。

产生IT黑洞原因是,运维管理层没有能力解决生产中遇到的问题,害怕承担责任,从而将风险转嫁给第三方。试图说服企业,上了这些硬件就能保证生产安全稳定。

如此一来IT预算成倍增长,企业几乎将所有的技术都应用的生产环境中。

使用最新的防火墙,转发能力最强的路由器,吞吐最强的交换机,昂贵的负载均衡,高大上的SAN区域存储,去重复压缩备份,实时备份与恢复,主流的服务器甚至小型机。

我曾经写过一个段子调侃一下IT黑洞:

要是咱做首席架构师
一定要的选Java
选最好的五星级机房
万兆骨干以太网直接接入
至少百十来个机柜吧
什么防火墙,路由器,交换机,负载均衡呀
能给他接的全给他接上
楼上有健身房,楼内有游戏室
一进门儿,甭管有事儿没事儿都得跟人家说
may i help you sir?
一口地道的英国伦敦腔儿
倍儿有面子
什么 hibernate, structs, spring,ActiveMQ 全都给我装上
别说代码多少行,光 xml 配置文件就100M多兆
一个 EMC 存储放那儿, 干啥, 存储Log4J的日志
一年服务费就得几万美金
这样一个系统, 你猜得多少码农开发, 得, 光累死的就10好几个
这样的系统能用吗? 当然不能
你还得找个外包公司, 一打 Application Server管理员, 18M认证的那种 , 24*365
在招聘几十个运维的,二十四小时候着
系统光启动就得好几天
周围的公司不是Hadoop就是BigTable
你要是用PHP, MySQL都不好意思跟人家打招呼
就是一个字儿---“贵”
一天的网络流量得花个万八千的
你说这样的开发,码畜一天的多少钱
我觉得怎么着也得四千美金吧
四千美金?!那是成本
八千美金起
你别嫌贵,还不打折
你得研究老板的心理
愿意掏几千美金租五星级机房的企业
根本不在乎再多掏两千
什么叫土豪企业你知道吗?
土豪企业就是
买什么东西都买最贵的,不买最好的
所以,我们做项目的口号就是
不求最好,但求最贵.

设备该上的都上了,事故该来的仍然会来,使用第三方企业提供的解决方案未必靠谱,昂贵的硬件与软件投资并没有为创造出应有的价值。

起初IBM,EMC,VMware,Oracle,Microsoft,SAP 等等企业针对不同行业提出很多解决方案,例如ERP,CRM,零售业,航空业解决方案等等。 传统行业经过半个世纪发展,提炼,已经有一个完整、完善、科学的管理方法,流程明确,如制造业有ISO标准,这些软件企业经过漫长需求收集整理最终针对不同行业开发出完善的产品与行业解决方案。 这些方案在传统企业是成功的,我们可以看到IBM,SAP,Oracle在各种传统行业取得了辉煌的成功。

然而,进入90年代,这种传统企业管理模式越来越跟不上时代的步伐,新经济时代的到来致使企业所处的时代背景和竞争环境发生了根本性的变化。 软件供应商的传统解决方案也不适合当下的企业,日益显露出其弊端。传统软件开发方式,一年过半年发布一个版本已经不能适应互联网时代,我们需要一周甚至每天一个版本。尤其在当前中国互联网大环境下,每天可能频繁更新数个版本到生产环境。

技术创新持续进行、速度不断加快,企业竞争优势主要来自创新。随着科技的日新月异,人们的生活节奏越来越快以及对个性的追求,产品的生命周期不断缩短。 与工业经济时代不同,创新(Innovation)成为知识经济时代的首要目标。人们通过有计划的、连续不断的创新来赢得市场的竞争优势。 也就是说在知识经济时代创新不再具有一定的阶段性,产品变化不再具有相对稳定性的特点,从而企业通过将产品生产分解再分解,使生产的每一步骤规范化和简单化,并通过规模化大生产降低生产成本,获得市场竞争优势的历史成为过去。

顾客需求瞬息万变,产品周期不断缩短。在知识经济时代,那种”生产什么就卖什么”的时代已经一去不复返了。如今的”买方市场”使顾客的选择范围大大拓宽,也使得他们对产品的期望值在不断提高,他们不再满足于合理的价格,而且还要追求产品的个性化,企业往往要根据顾客的需求”量体裁衣”。同时,市场竞争加剧,大量的替代产品使得任何一家企业都无法垄断市场,而贸易壁垒的取消还意味着顾客不仅仅可以从本国产品还能从外国产品中寻求其最佳利益,于是顾客不再有耐心为某一种产品而长时间地等待了。 企业如果不能即时对市场需求变化做出快速响应,不能在短时间内开发、生产并销售出其产品,企业就会被淘汰出局。

竞争空间不断扩大,激烈程度不断加剧。随着全球经济一体化,企业竞争将不再受地域限制,任何企业都要承受来自国际化企业发展的竞争压力。另一方面,中小企业如雨后春笋,进行专业化灵活多便的生产或服务,并以其低成本运营对规模化企业高成本运营直接产生竞争威胁。

IT黑洞产生的原因分析

人的因素

企业重管理,轻技术。趋向于管理层把人管好,而不是充分授权技术人员,重视技术研发。

管理层没有能力解决生产中遇到的问题

害怕承担责任,如果在生产环境使用MySQL出了问题怎么办,谁能承担责任?不如使用Oracle,出现问题厂家上门解决,将责任转嫁给厂商。

求稳心态,不做事就不会出事,不要在我任上出事,评价下属工作的标准是办事的准确度如何,任何冒险与创新的行为都是不受欢迎的。 因此极大地抑制了成员自我决策的积极性与创造性。导致员工技能单一,适应性差,员工缺乏积极性、主动性、责任感差,致使工作和服务质量下降。

来自组织架构的问题

传统的企业组织理论告诉我们,当组织规模扩大到一定程度,必须通过增加管理层次来保证有效领导。在企业规模一定的情况下,管理幅度与管理层次成反比。当企业发展到一定规模后,这种管理体制的弊端就突显出来。

组织层次过多,各部门按专业职能划分,组织机构臃肿,助长官僚作风 这些都是出现IT黑洞的主要原因。各部门只关心本部门的工作,并以达到上级部门满意为准,缺乏合作与服务意识。 各部门往往会从自己局部的利益出发,精心构思自己的行为,使自己的目标凌驾于整个组织的目标之上。这种分散主义和利益分歧,或许能够实现局部利益的提高,但却弱化了整个组织的功效。

延伸阅读《Netkiller 系列 手札》

作者

陈景峰,昵称 Netkiller, 英文名 Neo 《Netkiller 系列 手札》电子书的作者,读者QQ群:128659835,个人网站:http://netkiller.github.io/

转载请注明出处与作者声明

2015-8-4
背景:尽管登录vps会发邮件,但是会偶出现,登录了又发了一邮件,于是想此时看到底有多少个终端在登录态,还是阿里的alikid触发,还是真有黑客,怎么办,w查看,w tux。
LINUX是个多用户系统,一旦连接到网络中,它可以同时为多个登录用户提供服务。系统管理员可以随时了解系统中有那些用户,用户都在进行什么操作。
查看用户的操作
系统管理员若想知道某一时刻用户的行为,只需要输入命令w即可,在SHELL终端中输入如下命令:
tux@tux-desktop:~$ w
21:13:14 up 7:08, 2 users, load average: 0.22, 0.32, 0.20
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
tux      tty7     :0               14:05     ?    37:55   0.33s x-session-manag
tux      pts/1    :0.0             21:13    0.00s 0.13s 0.00s w

可以看到执行W命令及显示结果。
命令信息含义
上述显示的信息分别表示如下:
第一行显示系统的汇总信息,字段分别表示系统当前时间、系统运行时间、登陆哟内用户总数及系统平均负载信息。对于上述势力中的几个显示数据意义为:
21:13:14 表示执行W的时间是在晚上9点13分。
7:08 表示系统运行7小时8分。
2 users 表示当前系统登陆用户总数为2。
load average与后面的数字一起表示系统在过去1,5,10分钟内的负载程度,数值越小,系统负载越轻。
从第二行开始构成一个表格,共有8个栏目,分别显示各个用户正在做的事情及该用户所占用的系统资料。
USER:显示登陆用户帐号名。用户重复登陆,该帐号也会重复出现。
TTY:用户登陆所用的终端。
FROM:显示用户在何处登陆系统。
LOGIN@:是LOGIN AT的意思,表示登陆进入系统的时间。
IDLE:用户空闲时间,从用户上一次任务结束后,开会记时。
JCPU:一终端代号来区分,表示在摸段时间内,所有与该终端相关的进程任务所耗费的CPU时间。
PCPU:指WHAT域的任务执行后耗费的CPU时间。
WHAT:表示当前执行的任务。

查看某用户
当登陆系统用户很多的时候,可以在W后面加上某个用户名,则会查看该用户执行任务的情况。
tux@tux-desktop:~$ w tux
21:19:01 up 7:14, 2 users, load average: 0.25, 0.21, 0.18
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
tux      tty7     :0               14:05     ?    38:05   0.33s x-session-manag
tux      pts/1    :0.0             21:13    0.00s 0.13s 0.00s w tux

默认情况下,系统会显示上述所有的信息,如果只关心某一方面,可以只使用相关的选项。
http://mp.weixin.qq.com/s?__biz=MzAxNjAzMTQyMA==&mid=204468062&idx=1&sn=bfafd45d802964c8b4636841a38011d1&scene=5&ptlang=2052&ADUIN=372647693&ADSESSION=1438218622&ADTAG=CLIENT.QQ.5425_.0&ADPUBNO=26505#rd
防风9克,当归9克,赤茯苓15克,杏仁9克,黄芩9克,秦艽9克,葛根7克,麻黄9克,肉桂3克(后下),生姜6克,甘草3克,大枣4枚。适用于类风湿患者。
热盐熨烫治:用大盐粒500克,炒热,装布口袋捆结实(不要让盐粒掉出),放在患部慰烫。此法以治新病为佳,旧病亦有效。日本的缤漮是我一个国外同学给我带回来非常管用,疗效真的很牛,揪心的是,有点把贵。望采纳,祝早日康复!
分页: 21/245 第一页 上页 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 下页 最后页 [ 显示模式: 摘要 | 列表 ]