Shell's Home

Aug 12, 2013 - 1 minute read - Comments

台湾行——第一二天,COSCUP

早场 今早的签到挺有意思,在嘉宾牌里面含有RFID芯片。用平板照一下就可以完成签到。演讲中有人讲到,他们在做这个技术支持。将来可以用悠游卡或者星巴克卡完成签到,或者互相绑定到主帐号,替代身份登录使用。 上午听说外面有taiwan python社区的摊位,就出去挑战一下。他们找人背对屏幕写程序,挑战三道题对的就有奖品。实话说这个比不许调试更难,也能容易看出水准。这里也可以看到他们的水准。如果大家都不会python的话,一般都是讲一些鸡毛蒜皮的有趣东西吸引一下兴趣。直接挑战这个东西会被当作刁难人拉。 我上去试了一下。第一道是fib,闭着眼也能写出来。第二道是对一句话中的每个单词反向。这道题差一点,功亏一篑。我的解是这样的。 f = lambda x: ' '.join(map(reversed, x.split())) 问题在于,reversed返回的是迭代器,而join不吃迭代器。正解是这样的。 f = lambda x: ' '.join(''.join(reversed(i)) for i in x.split()) 所以,拿到一套纪念衫,还算可以拉。 然后我反过来给他们出了一道题目,一行内计算fib数列。这个问题有点难度。 正解是使用Y算子。大家都知道原理了,就懒得写了。 第二个解是我提出来,可以用fib通项公式规避迭代。 然后摊位上有人解出来,可以用set函数来替代赋值,利用列表推导式完成迭代。 最后我发现,python3里面print可以作为函数用,因此也可以做个弊。 反正最后各种作弊解法。觉得他们挺有意思的,回去准备保持联系。 下午的演讲 下午是我的演讲,不得录象。据主办方说,我这个是唯一一个非赞助商,非商业性质的不得录象的演讲。演讲开始的时候,会场就在狂进人,到最后人已经在前排坐在地上了,外面进来的通道上还塞满了人。这是我头一次碰到演讲会场爆场的情况。 内容就不能多说了,反正梗一堆。大家也挺开心。演讲能开心结束我也很高兴。 凯道运动 晚上跟着雨苍去凯道观光。那里正好举行游行,为一位在国军内遭到黑幕待遇惨死的士兵声援(这算不算讽刺?)。 我们跟着frank的一个朋友,从台大医院跑到了会场。会场很闷热,但是气氛很高。人山人海全是人,据事后统计说有20-25万。整个会场很有秩序,我拍了一下地上和垃圾箱,大部分的垃圾都在垃圾箱里。不知道我们什么时候才能做到。 夜市 在去夜市的路上,碰到两个日本来的MM。我们正好要去,就顺道一起过去。 两个日本MM的英语很烂,经常说到一半就开始说日语。偏偏我们的日语也很烂,frank好久不听了。三国语言鸡同鸭讲说了半天,聊的倒是很热闹。 夜市这里的东西都很不错。我们一路走一路吃了过去,大多数东西都很好吃,而且很便宜。一份饼包鸡肉什么的只要60台币,大约12-15人民币。和上海夜市上卖的价钱差不多,但是好吃无数倍。感觉上上海消费比台北还要高。 第二天 抽奖 今年的抽奖可谓一波三折。先是显示器无法投影,然后抽大奖的时候四次杠龟。先抽到两个观众,都不在,然后抽到讲者,再抽到观众,再抽到工作人员,才在。工作人员又在抽奖场外直播,由组长在无线里面喊着有有有有一路跑下来,才好容易领到一个大奖。 个人认为这是最有趣最完美的结局了。 lighting talk 个人认为lighting talk是COSCUP最high的一个环节。 大致概念是这样。当天报名,然后上去讲。每个人五分钟,如果超时就要拔显示器。讲什么都可以,只要大致搭边。今年居然有人上去讲台南牛肉汤。 不过开始的时候,显示器设定并不是很好。大部分人(包括主持人)都无法顺利投影,只能拿着笔记本在摄像头前。直到有个美女(记忆中是mosky,台湾的python女神)提前上去,把mac接好,才能看到slide。 lighting talk之所以是最high的一个环节,是因为在实际操作的时候什么事情都可能发生。主持人又在一边给压力,所以什么荒腔走板的事情都会发生,场面各种欢乐。 庆功宴 庆功宴到一半的时候,大家基本开始串场了。 这次我和台湾大会网络组的组长聊了一下,COSCUP的网路用的是从中华电信租的五条百兆线路,从TICC的机房直接接出来,服务1800人。加上讲师和场务,平均每人31KB/s。 作为对比的,上次PyCon2011,我们会场使用的是2Mbps的线路,服务100人以上。如果全接上去,平均每人2.5KB/s。 所以你就知道为什么网络会爆了。

Jul 19, 2013 - 1 minute read - Comments

一种新的python局部调试手法

我们都知道,python里面可以用pdb来调试代码。但是pdb往往不大好用。有时候调试代码往往在多重条件里面,直接用pdb需要下条件断点,设定复杂的条件。 一个简单的办法就是这么干。 __import__('pdb').set_trace() 但是有的时候,连这个出现的条件都不满足。例如,代码必须在一个受限环境中运行,很难拿到console,或者其他林林总总的毛病。这时候,我们还有一招秘技。 import pdb, socket s = socket.socket() s.connect(('127.0.0.1', 8888)) f = s.makefile() pdb.Pdb(stdin=f, stdout=f).set_trace() 在连接到的目标端口上,提前用nc做好监听,就可以在触发断点的时候直接连接上来调试。

Jul 18, 2013 - 1 minute read - Comments

公司的导向

客户导向 最初级的公司,是基于客户导向的。所谓客户导向,就是“客户要什么我做什么”。 从服务型公司来说,这也没什么错。但是IT界挣钱的主要秘诀是边际成本递减效应。同样开发成本,如果一家公司用,也许要亏本。但是100家公司用,不但价格大幅下降,还能海赚一票。因为从第二家开始,就没有了研发成本,只需要营销就好了。这就是复制的边际成本递减效应。而基于客户导向的公司,很难做到边际成本递减。为了一个客户的需求,不得不委曲求全,在产品里面反复做出修改。 也许很多甲方在这里会不平。“我提要求有什么错?”,“我出钱的!”。是的,从甲方角度,这些都是合理的。甚至从服务的角度,有这些也是好的。然而从产品角度,对各种业务场景(尤其是非预想的业务场景)的适应,会严重冲击核心系统,造成维护困难。明明90%的客户只用10%的功能,但是还是要维护所有功能。而且每次修改一点功能的时候,都要大幅动全身。由此,不能将第二家客户的研发成本压到最低,导致边际成本递减不下去。 在技术导向公司内,最“明星”的职位是项目经理。他需要负责项目的前前后后各种方面,并且直接关系到项目是否成功。公司离开任何一个程序员(甚至包括老板)都可以运转,但是离开项目经理,目前他正在做的项目就无法完成了。话虽如此,大部分项目经理的日子过的也很苦。因为客户并没有什么特别的理由需要选择你。多个项目组竞争的结果就是低价开发和高价维护策略。 大部分的客户导向公司,在开发系统的时候往往会采取低价策略,有的时候甚至会亏本。然而在维护和后续开发的时候,会提出各种加价要求。因为客户一旦采用系统,就很难将原有系统直接切除。因此反过来,客户往往在提出需求的时候,必尽必全,力求毕其功于一役。这反过来加剧了系统共性提取的难度。 大多数老板对客户导向的问题一清二楚,所以很多人都想做产品。然而不是每个人都能成功的做出产品来。东西不够牛,在营销阶段客户就会选择定制性更好一些的公司。最后为了抢客户,从市场导向沦为客户导向,从把握客户变成被客户把握。 市场导向 市场导向的公司比客户导向好一些。他们提出客户中共性的部分,做到最好。由于他们是最好的,因此只做一些小的改动就可以迎合大部分客户。由此,他们可以在市场中尽情的攻城略地,日进斗金。客户导向的公司无论是在成本上还是在口碑上,都无法和市场导向公司相竞争。 能够完成市场导向的核心在于两点。首先是对客户共性的把握。如果不能把握客户中具有共性的部分,就无法开发出通用性的产品。其次是产品的易定制性。无论产品的共性多强,定制还是无法避免的。如果不能将定制隔离在产品主线之外,就又会沦为各个厂家的代工商。 市场导向公司往往会采用“封装层二次开发”的手段来实现上述两点。首先基于客户的共性需求开发出一个基础平台,然后在基础平台上做第二次开发。甚至由于二次开发技术要求低,利润率低,因此往往会被外包出去。 在市场导向公司里,最“明星”的职位是产品经理。由于不能盲从于客户的需求,因此产品经理必须了解客户,从客户的共性入手,提取需求,引导客户合理使用。 然而市场导向和客户导向的边界并不明晰。有的时候产品推出的时候预定是市场导向,封装层基础平台做的有模有样。但是在卖到一半的时候就开始狂改封装层。到最后一次开发量比二次开发还大,产品彻底做成一堆项目。这就滑回了客户导向。 营销导向 营销导向的公司常见于公众领域。他们做的是“谁都会做”的东西。但是通过群体营销手段,将这个东西推广到上千万客户面前。从而取得巨大的效益。营销导向公司的特征是市场预测和营销费用异常的高,有的时候干脆干的就是转手卖营销的勾当。 从技术上说,任何东西要做大都是有技术难度的。因此营销导向公司在做到一定规模前异常的轻松。基本上可以想像成拿现成的系统改一改,招几个人负责运营,然后狂打广告,最后坐地数钱。唯一的难点,就在这个狂打广告上。谁的广告,如何打,如何尽量少花钱多出名。这里有无数讲究。 然而一旦超过一定规模,就会立刻出现瓶颈。同时在线用户数无法增加,系统bug不断,经常崩溃。冯大辉说过一句,技术的作用在短期往往被高估,而在长期往往被低估。其中后半句在这种情况下异常显著。 当然,并不是所有营销导向公司最后都会死在技术上。有些公司有足够的远见,或者运气很好。在问题出现前,就开始策划和解决技术问题。这些公司往往在经历几次阵痛后,转型为了半营销半技术公司。甚至有些公司在主营业务之外,也把他们的技术服务卖给其他公司。 技术导向 技术导向的公司比市场导向更加强一些。他们追求的是“人无我有”。通过完成其他人短期不可模仿的功能,造成市场上没有其他选择的局面。只要你想用类似的东西,就只能找他们。 技术导向的公司必然是以程序员为导向的。也只有基于技术的公司,才可能真正善待程序员。甚至其中一些核心成员经常需要谈到分成或者股权,期权。逻辑很简单,如果某种技术只有一个人可以搞定,老板自然不希望这个人从手里流失出去自己单干。他必须提供和单干差不多的福利(当然,是去除经营的风险后)。 具体提供分成,股权,还是期权,取决于技术的“保质期”。如果技术在短期(半年或者更短)内是不可复制的,但是一定时间后必然可以复制。那么一般是提供分成。如果技术成员需要为公司的长远考虑的,或者技术在长期(一年到三年)是不可复制的,那么一般提供股权期权。三年以上不可复制?这种神人一般都被大公司当宝一样供起来了,你没机会见到的。 产品导向 产品导向是个奇葩的情况,一般很少见。只有对产品理解到一定深度,同时公司大到一定程度时。才能自如的驾驭技术,将一项项技术当作组件一样组合,产生影响世界的东西。在这里,最重要的并不是“拳头技术”,而是已经存在的技术的组合和发挥。 目前最知名的产品导向公司,就是前苹果。

Jul 16, 2013 - 1 minute read - Comments

从齐治科技辞职了

最近贝壳又一次的辞职了。 离职的原因还是很单纯的,主要是管理上跟不上老板思路。既然如此,那就不要勉强为之了。 我很感激现在的公司给我的帮助。毕竟在现在的公司,我的技术得到了长足的进步。同时,也给了我很多把想法变成现实的机会。 目前我的意向是七牛云存储。在此感谢他们给我的机会,希望能在他们那里玩到一些有趣的东西。 谢谢几位朋友给我的机会,我不愿意参与你们的项目并不是不看好你们。一方面,要同时做好下属和朋友是非常困难的。作为老板,不能因为私人的交情而偏颇公司的业务。按孔明的说法,就是“宜付有司论其刑赏”。而作为朋友,必然嘻嘻哈哈吐槽打屁。对着一个“不可因私废公”的人要放松下来,神经要不是一般的粗才行。 另一方面,目前贝壳还没有孩子,而创业是一个全力投入的事情。万一创业到一半变成超级奶爸,事情就比较被动,害人害己。所以我目前更偏好至少第一轮天使投资过之后的公司。有创业的氛围,紧张但是不紧迫。我更喜欢正常的生活。每天都有时间做点自己的事情,有点自己的小娱乐,研究点自己的小技术。可以想像的是,在孩子到一定年岁前,我都很难承担从头创业的巨大风险了。 最后,我也不认为自己有在创业团队中能够hold住大部分东西的能力(这并非出自我的妄自菲薄,而是基于实际评估的结果)。我希望在新的公司,至少做一些特定方面的事情,积累一定经验。 要下海弄潮,先要搞清楚自己的斤两。其中最重要的两条,就是自己是否能承受风险,和自己是否能撑起一片天。既然两者目前都还欠缺。所以,请原谅我难以回报你们的厚爱。

Jul 5, 2013 - 1 minute read - Comments

薪水高的人纳税少

我们不关注税前和税后的工资,让我们来关注老板的付出的和员工到手的差。 中国(至少上海)的税法规定,企业需要先缴纳44%的四金,再缴纳18%的个人四金,然后扣除所得税,才是员工到手部分。所得税是逐级递增的,所以很多非财务出身的老板会以为工资高的人扣除多。 实际上,在50k以下月薪的情况下,四金扣除比所得税更厉害。而四金扣除是有上下限度的,具体在去年平均工资的60%-300%之间。以2012年为例,当员工工资不足2815的时候,扣除是按照2815计算的,因此公司必须付出1143的企业四金——无论其工资多低。而当员工工资高于14076的时候,扣除不会增加,因此无论工资多高,公司只需要付6193的企业四金。 我们以500, 5000, 15000, 25000, 45000为例,分别计算到手比例。 500月薪,到手88,付出1643,比例5%。 5000月薪,到手4082,付出7200,比例56.7%。 15000月薪,到手11228,付出21193,比例53%。 25000月薪,到手18729,付出31193,比例60%。 45000月薪,到手33531,付出51193,比例65.5%。 是的,当员工工资正好在15000不到的时候,到手比例最低。在2800-5000之间的到手比会比较好。在工资更低的情况下,到手比例也会极度的变糟。而在15000往上,到手比情况又会变好,在20000附近和5000左右持平。

Jul 3, 2013 - 1 minute read - Comments

使用getmail备份imap邮件数据(例如gmail备份)

使用getmail备份imap(例如gmail)服务器上数据的方法。 原因 随着7.1的到来,诸位geek最重要的事情就是备份google reader的数据了。很多人都在讨论gmail还要不要用。 废话,当然要。这么好的服务,为什么不用? 只是随着google reader的事,在用gmail的时候也得留个心眼。平时数据勤备份,不要所有的内容都绑定到这个邮箱上,否则有得你哭的。 安装和配置 getmail是一个用于将远程数据取到本地的系统,和fetchmail是一类东西。废话不多说,先装getmail。 sudo aptitude install getmail4 之所以用getmail不用fetchmail,是因为fetchmail我搞不定。而且getmail比较容易备份到指定地点。要是输出能gzip掉就更好了。 建立~/.getmail目录,下面放一个文件,例如gmail [retriever] type = SimpleIMAPSSLRetriever server = imap.gmail.com username = [username] password = [password] mailboxes = ("[Gmail]/所有邮件",) [destination] type = Mboxrd path = ~/shell/gmail.mbox [options] read_all = false delivered_to = false received = false verbose = 2 message_log = ~/.getmail/gmail.log username填你自己的用户名,普通用户不需要@gmail.com,企业用户需要@你的域名。password填密码,两次认证的需要分配一个Application-specific passwords。mailboxes里面不要照网络上的填写[Gmail]/All Mail,那是英文环境用的。 ~/shell/gmail.mbox是目标文件,你需要先touch出来。~/.getmail/gmail.log是log,建议和配置文件同名。 执行 把下面的gmail替换为你的配置文件名,注意不需要写.getmail/的前缀。 getmail -r gmail 系统就会开始备份你的数据。像贝壳的gmail这种数据,量比较大,时间也会比较长。 问题 getmail是python写的,备份数据比较大的时候,内存消耗会很惊人。而且当处理巨量数目的文件时。在启动时会将目录全部下载到本地,然后计算一阵。这个耗时,网络消耗和CPU都比较大。要有点耐性。

Jul 1, 2013 - 1 minute read - Comments

解决问题的艺术

网上有篇经常用的文档,叫做提问的艺术。我这里狗尾续貂一番,恶搞一篇解决问题的艺术。大家看看就好,不要认真。 谁说出问题的?提示是什么?他为什么是个错误? 有太多人,和风车打了半天,才发现他不是巨人。。。 提示在google上有搜到么? 太多和没有都是错。太多的话,说明提示是个万金油,很多情况都会出。你分不清文章中哪篇才是有用的。没有的话——那就没什么好说了。 能够复现么?条件是什么?其他版本也有问题么? 能复现的看数据,不能复现的打log,连log都打不出的在脑子里面模拟代码。 系统的工作机理是什么?每一步进出的数据是什么?数据都对么? 问题越奇葩,原因越傻逼,往往如此。 因为通常情况都被你考虑掉了,所以往往问题出来时,你会抽自己两个耳刮子。 问题往往都出在调用者身上,而不是供应者身上。 因为用的人有责任保证用对,而写的人没这个责任。 RTFM

Jun 25, 2013 - 1 minute read - Comments

效率,慈善和歧视

这个话题的最初,是因为和同事讨论到就业中的禁止歧视条款而起的。我们当时讨论到,很多行业中明文或者潜规则的禁止招收女员工,是否合理?偏向不招收生理残缺的人呢? 市场自然抉择 这个问题的第一直觉和最基础原则,就是市场自然选择机制。自然机制而言,市场会自然选择合适的人,以保持最大的竞争力。企业不愿意招收女员工,或者生理残缺的人,自然是有其理由的。 女员工这个问题,我想让不止一个企业吃过亏了,尤其是略微大一点,还讲那么点规矩的企业。在经济危及来临的时候,女性员工害怕裁员,所以抢先怀孕。按照国家规定,你非但不能裁她,还得保证她的生理和心理健康。一个企业就那么点人,你非但不能裁那个干的不好又没有劳动力的,相反还得裁掉一个正常员工来保证她的岗位。我想是个老板都不说有多呕了。 至于生理残疾,也是很麻烦的。软件这个行业的门槛还比较低一些。普通的办公室文员,你是打算招个看不见的呢?还是听不见的? 所以,老板喜欢高学历的,你不能说这是歧视没有学历吧。那老板喜欢男性(汗。。。),为什么就一定是性别歧视呢? 适任原则 自然,上述言论听起来很刺耳,很冷冰冰。为了保证竞争,难道孕妇,女性,残疾人必然要成为牺牲品么? 其实孕妇和生理残缺,并不一定和生产效率有关。例如生理残缺,我最近就碰到了一回。有个朋友来投简历,自称是听力残疾,有残疾人证明的。我问他是否能够正常进行日常对话。他回答说,在听力辅助设备的支持下没问题。我说,那么就和普通人没有区别。我接受的了方言,接受的了客户,我想我就能接受你。 以前说过的乙肝也是一例。只要员工都做过乙肝接种,我觉得也没道理不接受乙肝患者,尤其是小三阳患者。至于大三阳,还有某些对生理卫生要求比较严格的岗位,例如食品卫生,那就是另一回事了。 同样,我也不介意性别,学历,种族,国籍。我在意的事情只有,你是否能完成工作,你的成本有多少。大家知道某些民族和国籍的员工招进来特别麻烦,这非我力所能及,我就不展开阐述了。 当然,作为软件公司,限制很小。有些地方就不行了。男性澡堂里给人搓澡的,招一女的算怎么回事,是吧? 没有理由的歧视 所以,我反对任何没有理由的歧视。例如女性不适合做计算机?这是什么道理?有多少程序员因为这种莫名其妙的歧视,被迫走上了断背山之路。 同样,要求司机必须是男性的,我觉得这个才是不合理要求。从生理上说,男性司机久坐对健康不利。如果说大货司机,经常要参与装卸货物,一路上风吹日晒,路段还可能不太平。要求必须是男性还有点道理。那普通商务车辆司机必须是男性的理由我实在是想不到了,你不觉得一个美女给你开车比男的更加赏心悦目么? 当然,不同的人对歧视的判断是不同的。我个人并不认为女性不适合做计算机,但是很多老板这么认为。我个人认为女性可以做司机,但是很多老板不这么认为。但是没关系,只要歧视原因和劳动力之间确实是无关的,我相信总有老板会赏识你的。 禁止歧视限制 当然,为了一些我们都想的到的理由,政府也会立法禁止一些有理由的歧视。例如刚刚的不得歧视女性员工和保护怀孕就是一例。如果企业都因为适任而不愿意让员工怀孕,那么谁还去怀孕生子呢?国家将来的人口(尤其是主流族群人口)肯定会锐减,这和国家的利益相违背。 当然,为了做到这点,毫无疑问的,就违背了市场机制。立法保护孕妇权益,就迫使企业歧视女性(尤其是未生育女性,幸好在中国还有计划生育这种东西)。立法不得歧视女性,那又容易和适任原则打架。到最后,还是市场机制和扶助孕妇打架。 类似的打架还出现在欧洲的另一个领域——雇佣。据欧洲的一些朋友说,欧洲的法律相当重视保护雇员权利,重视到了简直歧视雇主的地步。有个欧洲的愤青就写过一篇长文,为什么我让你喝西北风。大意是,如果我多雇两个人,我得保证他们一直有事情做,雇主没事做导致的雇员空闲还是要付薪水。而且还要缴纳高昂的社会保证金,又不能随便裁员。成本核算下来,现阶段每增加一个雇员,利润居然是递减的。多雇两个人,还不如老板解散了公司吃低保呢。 当然,那文章里的数据什么的都不能当真算的,一认真就满地窟窿(哪篇具体研究文章都是这个样子,光一个物价水平核算就够吵半天了)。但是本质问题却说的没错。如果国家不保护雇员,要国家何用?毕竟大部分人都是雇员而非老板。如果国家保护雇员,把老板搞跑了。那国家的经济增长哪里来?税收哪里来? 党员算不算歧视 原文请看这里。我只说一句简单的。人以类聚,物以群分。想想这哥们曾经想(可能现在还是想)加入一群什么人做什么事。再想想他现在想加入你们。。。

Jun 13, 2013 - 1 minute read - Comments

用户友好的密码

用户友好的密码 何谓用户友好的密码?我是指在密码中尽量不给自己找麻烦,又能正常使用。 不包含空白字符。否则你会烦恼有哪个空白字符,有几个的问题。 不包含特殊字符。否则会烦恼怎么输入。 不使用容易混淆的字母。不容易输入错误。 方便手机输入。 尽量少包含大写字母。 只包含容易在手机上输入的符号,或者不输入。 手机上容易输入的符号 在android上,以下符号可以在google输入法中直接输入。 @*+-=/#()'":?!~ 总计15个。估计加上iphone后会更少。如果要用符号,建议从这些里面取,会减少你很多密码输入的烦恼。 容易混淆的字母 Il1 0O 连续的mn 连续的wv 强度规范 我把密码管理规范里面的结论总结一下,略去推导,凑凑数,把密码级别排列成以下几个: 弱密码:不希望别人看到,然而别人看到并没有直接损失的内容。熵应当在20bit以上,五年修改一次。 中密码:不希望别人看到,别人看到会对你产生损失的内容。熵应当在33bit以上,两年修改一次。 强密码:有价内容。熵应当在45bit以上,一年修改一次。同时作为弱本地密码规范, 本地密码:熵应当在58bit以上。 每个级别之间大约差12bit的熵。初始熵强度至少20bit,低于这个水平就很难说这是一个密码了。 强度估计 以最容易使用的密码计算,符号应当最多包含26个字母+10个数字,排除l10这3个。每一位有33种可能,熵大约是5多一点。 弱密码:至少4位。 中密码:至少7位。 强密码:至少9位。 本地密码:至少12位。 更强一些的密码可以用52个大小写字幕+10个数字,排除Il10O这5个。每一位有57种可能,熵大约是5.8。 弱密码:至少4位。 中密码:至少6位。 强密码:至少8位。 本地密码:至少10位。 建议 网络: 弱密码:4位小写字母+数字,5年修改一次。 中密码:7位小写字母+数字,2年修改一次。用于保护大部分内容。 强密码:8位大小写字母+数字,1年修改一次。保护重要内容。 本地: 低:8位大小写字母+数字。 高:10位大小写字母+数字。 注意避开Il1O0,以及其他可能的混淆方式。

Jun 8, 2013 - 1 minute read - Comments

nagios配置

nagios的结构 nagios的结构其实很简单,一个监视系统,一个web展现系统,一个remote服务器,没了。 监视系统是根本,在debian中,需要安装的包是nagios3。在安装这个包之后,会启动一个监视进程,负责检查所有的服务是否OK。不OK就触发事件。 检查的时候,nagios会去调一些“插件”。这些插件其实都在/etc/nagios-plugins/config下面注册过的。每个插件配置都是name!v1!v2…的格式。在注册里面,可以看到这个command_name,对应一个command_line。你很容易看到这就将一个定义转换为了一个命令行。 直接执行这个命令行,你可以看到一个标准输出。nagios就是解析这个标准输出,得到值是否在一个合法的范围内的。所以从原理上说,你可以自己写插件,对任何事情做nagios的监控。 对于某些远程可以获得的信息,目标设备上可以什么都不动,例如ping连通性,或者是端口连通性等。而对于其他信息,例如磁盘空间剩余值,靠远程可能没法获得,就需要在目标设备上装nrpe,Nagios Remote Plugin Executor Server。在debian中,就是nagios-nrpe-server这个包。如果获得本地信息,不需要这个包。 最后,cgi会将本地的信息暴露给web查询,这就构成了完整的nagios体系。在debian中,这是nagios3-cgi这个包。 nagios页面在nginx上的配置 这个过程比较繁琐,因为apache会自动配置,而nginx没有宿主进程,也没有cgi。因此实际上需要运行两个宿主进程。 首先,你需要安装php-fpm宿主进程,这个是nginx搭配php执行的最佳宿主。在nagios中有用到php,所以你需要php执行能力。 其次,安装fcgiwrap这个包。这是cgi执行宿主,以fastcgi协议暴露。这里需要注意。如果你的nginx和nagios的宿主不在同一个设备上(例如像贝壳这样执行了虚拟化的),那么实际上只要在nagios的宿主上执行fcgiwrap即可。php-fpm和nginx可以执行在其他不同设备上,没有关系。只是前者必须有nagios的cgi代码,后两者必须有nagios的网页和php代码。而这三者又都在nagios3-cgi包里面。因此几台机器都需要安装nagios3-cgi包。 最后,配置nginx。 location /nagios3 { index index.html index.htm index.php; } location /nagios3/stylesheets { root /etc; } 第一个映射是nagios的基础目录,在根目录中,我其实配置了nagios3 -> /usr/share/nagios3/htdocs/(debian中的链接位置)。第二个映射是样式表配置,我用系统缺省的。 location ~ ^/nagios3/.*.php$ { include fastcgi_params; fastcgi_pass unix:/var/run/php5-fpm.sock; } 这个是nagios的php解析代码。我的php-fpm执行在同一台机器上,因此直接如此配置即可。 location /cgi-bin/nagios3 { root /usr/lib; include fastcgi_params; fastcgi_param REMOTE_USER $remote_user; fastcgi_pass dev:port; } 最后是cgi暴露的配置。由于我的nagios宿主并不在web服务器上,因此fastcgi是个远程地址。而且注意REMOTE_USER,传递这个才能让远程认到你的用户basic auth。由于nagios的cgi通过这个工作,因此没有这个会直接导致对方始终认为你是无权限用户。 nagios的简单配置 我们首先认清一点,nagios并不负责管理机器的维护。他的设计目标是“可用性”。因此目标是否可达,服务是否可用,是nagios的关心重点。至于磁盘,负载,只是顺便监控而已。所以你可以看到,nagios并没有直接的插件来监控CPU或者内存。他只有snmp插件可以查询到这些数据。 所以,我们开心一点。最低限度,我们将所有需要监控的设备和服务端口加入列表。当这些设备不可达时,nagios会发出告警(有邮件)。而如果运气好,我们是可以监控到这台机器是否有apt包需要升级,磁盘空间是否够的。作为建议,其实你只需要监控load和磁盘空间利用率就够了。其余的东西一般不大需要。当内存或者CPU发生问题的时候,你的query其实也拿不到返回。相对的,目标端口很快失去响应进而引发告警才是我们的预期。 OK,在这个基础之上,让我们看看有什么可以配置的。 服务器添加 首先,你可以定义一些机器。localhost_nagios2.cfg里面有例子,大致是这个样子。 define host{ use generic-host ; Name of host template to use host_name host alias host address IP } 我建议你专门弄个文件来管理这些自己的设备,例如我这里叫hosts.