<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<?xml-stylesheet type="text/css" href="css/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>pencat's blog</title><link>http://blog.bigcomic.com/</link><description>我的日记</description><generator>RainbowSoft Studio Z-Blog 1.8 Devo Build 80201</generator><language>zh-CN</language><copyright>Copyright © 1998-2007 bigcomic.com All rights reserved.</copyright><pubDate>Fri, 25 Jun 2010 15:10:58 +0800</pubDate><item><title>我的QQ, 我的十年</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/294.html</link><pubDate>Fri, 25 Jun 2010 15:07:37 +0800</pubDate><guid>http://blog.bigcomic.com/post/294.html</guid><description><![CDATA[<p style="text-align: left; ">&nbsp;</p><p style="text-align: left; ">1999年，我开始使用QQ。那时候叫OICQ，用的人不多，只有拨169的兄弟们才会用它，拨163的米人，用的都是ICQ。随着互联网的发展，QQ也在壮大，周围越来越多的朋友加入QQ的行列。渐渐地，QQ成为我生活中仅次于手机的通讯工具。</p><p style="text-align: left; ">时光飞逝，转眼间QQ伴随我已经九年，还有几个月就要十周年时，QQ被盗了，就在伟大的祖国举办奥运会那年。那时，对我来说好象世界末日。突然发现认识很多年的朋友，居然连电话都没有，只能通过QQ联络。愤怒、无奈、惊慌、萎靡，当时的心情写照。29858曾经是我的幸运数字，但现在留给我的只有回忆和几百兆的聊天记录。被盗之后，我积极申诉，把能想起来的历史密码和个人资料都填上去了，发动N个5位数好友协助我申诉。两年间，我不记得申诉了多少次，但得到的是一次次的拒绝，一次次的无奈。</p><p style="text-align: left; ">两年后，当我渐渐地从丢失QQ的阴影中走出的时候，接到一个电话。凌晨，陌生号码，陌生男，推销墓地。我开始以为什么人在恶作剧，这种情况持续了几天。最后，我终于爆发了。用我能想起来的、最恶毒的语言，XX他和他的全家。没想到那哥们比我还愤怒，就好象我真的XX了他全家一样。之后双方都冷静下来，谈了一次。原来那倒霉孩子被29858骗了几百块的Q币。居然有比我还笨的人......无语。</p><p style="text-align: left; ">接下来，就是更多的人打电话过来骂我。报警，我能想到的第一件事，从南京110打到深圳110，从派出所到网监处。以上情况描述了不下十几次。最后可爱的警察同志说: &ldquo;这情况我们也办法，要不你再想想密码？&rdquo; &nbsp;.......再次无语。</p><p style="text-align: left; ">腾讯客服的回答更是让我菊花一紧:&ldquo;要不你放弃这个几个号码，你的朋友就不会被骗了。&rdquo; ......我想骂人，却骂不出来。</p><p style="text-align: left; ">六月的南京，烈日如火。不知道为什么，突然想起李大师。于是我买了一瓶雪碧和一张单程飞深圳的机票。</p><p>&nbsp;</p>]]></description><category>日记?周记?年记?</category><comments>http://blog.bigcomic.com/post/294.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=294</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=294&amp;key=a6901635</trackback:ping></item><item><title>我X</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/293.html</link><pubDate>Thu, 27 May 2010 21:01:09 +0800</pubDate><guid>http://blog.bigcomic.com/post/293.html</guid><description><![CDATA[<p>&nbsp;最近一个月违章，罚了1K &nbsp;-___- &nbsp;</p>]]></description><category>日记?周记?年记?</category><comments>http://blog.bigcomic.com/post/293.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=293</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=293&amp;key=9add9510</trackback:ping></item><item><title>南京修理工惊曝修车黑幕</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/292.html</link><pubDate>Tue, 13 Oct 2009 13:32:35 +0800</pubDate><guid>http://blog.bigcomic.com/post/292.html</guid><description><![CDATA[<p>&nbsp;<span class="Apple-style-span" style="font-family: 宋体; font-size: 14px; color: rgb(102, 102, 102); line-height: 21px; ">&nbsp; 据权威部门统计，截至2007年底，我国私家轿车保有量巳超过1800万辆，其中天津和广州每百户家庭拥有私家轿车分别为l7．4辆和12．7辆。<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp; 有车就得养车修车。然而，最近一项调查显示，对目前修车行业信不过的高达71．6％，基本信得过的只有11．4％。尽管有那么多人对修车行业的服务不满意，但他们一点办法也没有，因为他们根本就搞不清修车行业到底有多少黑幕&hellip;&hellip;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp; 一技在身，修车接触&ldquo;潜规则&rdquo;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp; 2008年3月18日，在南京市一家4s修车店当高级修理工的张宇清接到一个电话：他12岁的外甥女在跟同学一家驾车外出春游时出了车祸。张字清心里一紧，马上赶过去。外甥女虽然命保住了，但可能留下终身残疾。他一眼看出，事故车一定是在维修时被人做了手脚，不禁呆住了&hellip;&hellip;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp; 今年29岁的张宇清是南京市下关区人，10年前，他高中毕业后，到南京市一家民办小汽车修理学校学习。经过两年半学习，他取得了专业技术资格证书。结业后，他到南京几家机修厂做了几年的学徒工。由于他努力钻研，修车技术提高很快。两年后，只要仔细听听发动机的声音，他就能大概判断出汽车故障出在什么地方。然而，一些老师傅对张宇清说：&ldquo;搞汽修这一行，技术当然重要，但对其中的&lsquo;门道&rsquo;更不能不了解。&rdquo;张字清虚心地向他们请教什么是&ldquo;门道&rdquo;，师傅们说：&ldquo;这种事情只可意会，不可言传。时间长了，你自然就知道了。&rdquo;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 2005年夏，张宇清是比较成熟的机修工了。当时他在一家维修店当学徒，一天，一辆马自达6因电脑故障前来维修，师傅正好不在，张字清就上前帮车主检查。通过检查，张宇清发现汽车没有大毛病，只是电脑进水了，用电吹风吹干就行了。然而，正当他拿着电吹风准备吹的时候，老板把他叫到一边说：&ldquo;你这是干什么？都像你这样修车，大家喝西北风啊？想办法让他进行&lsquo;套餐维修&rsquo;，找个理由把电脑换掉!&rdquo;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 张宇清说：&ldquo;车子没什么毛病，这样做不是害人吗？&rdquo;老板压低嗓子盯着张宇清说道：&ldquo;玩得起好车的人都有钱，不宰他们宰谁？按我说的做！&rdquo;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 张宇清这才明白师傅们说的话，只好学着师傅们的样子对车主说，因为车子保养不当，很多零部件都到了更新期，最好按照&ldquo;套餐维修&rdquo;全面修理。当时车主还有点犹豫，老板走上前来，递给车主一支香烟说：&ldquo;车子可不是开玩笑的事情，你坐到驾驶位上就把身家性命交给了它，千万不能将就。你这车很多零部件如果不及时更新，路上随时都可能出问题。&rdquo;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 听了老板的话，车主才表态说：&ldquo;既然这样，那就&lsquo;套餐&rsquo;吧。&rdquo;结果，那辆车按套餐维修规定，把很多根本不需要更新的东西都更新了，光是更新那台电脑，车主就多花了4000元。这下子，本来20元就能解决的问题，车主花了7000多元。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 让张宇清有些气恼的是，事后，车主不光没觉得老板宰了他，反倒感激老板做事认真负责。张宇清心想，这些有钱人真是欠宰!不过，仅这次维修，他就拿了1000多元的提成。此后，他也学会了宰客，凡车主来修车，他总是找各种理由要求车主尽量多更换零部件。这样一来，他的&ldquo;业务量&rdquo;有了很大提高，收入自然也水涨船高。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 2006年初，通过考试，张宇清获得了民企小汽车维修三级技师职称，成了&ldquo;师傅&rdquo;级的高级技工，可以单独修车并带徒弟了。就在这时，张宇清谈了三年多的女朋友怀孕了。因为两人没有结婚，他好不容易才做通工作让她做了人流。但女朋友说：&ldquo;我都快30岁了，你们家到底什么时候才能买房给我们办喜事啊？&rdquo;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 本来，张宇清家的老宅子说是要拆迁的，父母准备到时候用安置房给他们结婚，但不知为什么，后来拆迁的事又没了消息，女朋友不愿意在破旧的老宅里结婚，张宇清每个月只有3000多元收入，家里也没有能力帮他买房，所以婚期一推再推。现在，听女朋友这么一说，他连忙哄女朋友说：&ldquo;亲爱的，你放心，今年年底前，我就是砸锅卖铁也买套房子跟你结婚!&rdquo; 话虽这么说，但当时张宇清手里根本没有多少钱，连付房子的首付款都拿不出，这事让他很头疼。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp; 疯狂宰客，花样百出月赚2万多</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp; 谁知，祸不单行。就在他不知如何兑现对女朋友的承诺时，母亲得了直肠癌，急需钱做手术。他的父母都是下岗工人，只有张宇清这一个儿子，他只得向师傅借了3万多元给母亲做手术。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp; 张宇清的师傅姓许，他劝张字清说：&ldquo;你也太死心眼了。像你这样下去，收入太少不说，时间长了，老板也会炒你的鱿鱼，因为你没帮老板赚到钱。不过，凭你现在的技术，只要你好好跟我学，收入一定会跟我一样多。&rdquo;张宇清说：&ldquo;我已经宰了不少车主啊!&rdquo;许师傅&ldquo;嗨&rdquo;了一声，说：&ldquo;那算什么？毛毛雨啦!有人还故意把发动机敲裂了宰车主呢!&rdquo;张宇清有点儿担心，说：&ldquo;万一被车主发现了怎么办？&rdquo;师傅说：&ldquo;那就得看你有没有绝招了。&rdquo;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 就在这时，有一辆大半新的本田雅阁来调整点火时间。许师傅向张宇清使了个眼色，那意思是&ldquo;看我的&rdquo;。调整点火是技术含量非常高的活儿，许师傅当着车主和张宇清的面仔细为汽车调整了点火时间，车主试了试．非常满意。许师傅说：&ldquo;我们这里专门修理汽车疑难杂症，以后有什么修不好的，别忘了来照顾我们的生意。找我就行，我姓许。&rdquo;说着，还递给车主一张名片。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp; 调整点火时间工时收费80元，张宇清觉得许师傅并没有宰车主。许师傅点燃一支香烟得意地说：&ldquo;别急，过几天你就知道了。&rdquo;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 果然，三天后，那位本田雅阁车主又来了。他径直找到许师傅说：&ldquo;不知为什么，上次调整了点火时间后，我的车还是没劲。跑了几家修理店都找不到原因，所以又找你来了。&rdquo;许师傅不紧不慢地问：&ldquo;是不是我点火时间没调好？&rdquo;车主忙说不是。于是许师傅开始仔细检查起汽车的发动机，然后说：&ldquo;你这车前期保养很不到位，发动机磨损严重，肯定无力。要想彻底治好毛病，最好是换发动机。&rdquo;当车主听说换发动机需要好几万元时，有些犹豫。许师傅说：&ldquo;这样吧，我帮你仔细修一下，但发动机缸头必须换，否则谁也没办法。&rdquo;换缸头也要花近两万元，车主还是答应了。汽车换了缸头，毛病果然好了。当然，许师傅也从这笔生意上拿了将近4000元的提成。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 可是，许师傅好像没做什么手脚啊!许师傅说：&ldquo;被你看出来，那还是我的绝招吗？想知道晚上就请我喝两杯。&rdquo;当天晚上，张宇清请许师傅喝酒。在酒桌上，张宇清终于搞明白了。原来，车主第一次来调整点火时间时，许师傅悄悄地在汽车发动机的空气格里塞了一小团棉纱，这样一来，发动机的通气渠道被堵住，汽车当然乏力。而这种秘密只有许师傅自己清楚，在别的地方根本检查不出来，所以车主很快成了他的回头客。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp;&nbsp; 许师傅说：&ldquo;那个换下来的缸头一点毛病也没有，以后把它换给别的车，我又能赚好几千。&rdquo;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 张宇清心想：修车的门道真的太深了，怪不得许师傅每个月都有两万多元的收入!于是他试着用自己知道的几种方法宰了几位车主，千方百计让车主多花钱，对方一点也不知情，甚至还大夸自己修车技术。这样，张宇清也第一次拿到了15000多元工资加提成。他对女朋友说：&ldquo;亲爱的，我现在完全有把握在年底以前挣到买房首付款。你就等着当我的新娘吧!&rdquo;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 开初，他没敢在那些关乎行车安全的事情上做手脚，只是玩一些让车主做冤大头、可以多赚点钱的&ldquo;猫腻&rdquo;。但几次做下来，他见什么问题也没出，胆子越来越大，不管车上的东西是否需要更换，他都千方百计劝车主换。如果车主犹豫，他就把后果说得很严重，大多数车主也就同意了。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp; 2007年的一天，在向一位车主推销新型刹车片时，车主坚决不愿意换，还说张宇清想宰他。张字清有些生气地想：真不识好歹了，自己并没有狠宰他，也戴上了宰客的帽子，看来不宰白不宰。他想起从许师傅那里学到的另一种宰客方法，于是往车子的刹车油里放了一些酒精。这样一来，用不了多久，汽车变速箱齿轮就会受损严重，由于酒精可以稀释刹车油，又能挥发，所以谁也发现不了。 果然，一周后，那辆车就出了问题。张宇清发现，自己在刹车油里加了酒精，刹车油失去了润滑作用，整个变速箱都被磨坏了，如果在高速路上高速行驶，很难说不出大问题。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp; 这都是自己做手脚造成的啊，万一出事故闹出人命，自己就是犯罪啊!他强压住狂跳的心，把磨损的部位指给车主看，说：&ldquo;都是你养车经验不足，又不听我们劝，还说我想宰你。这下可好，整个变速箱都得换了。&rdquo;结果车主再三认错，表示以后一定听张宇清的。那次，张字清一下子就拿了4000多元提成，车主还跟他建立一种&ldquo;信任&rdquo;的关系，从此完全掉入陷阱中。不过，从那以后，张宇清再也没敢往刹车油里加酒精了。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 2007年10月的一天，张宇清在偷换车主的零件时，不小心穿了帮，只得跳槽去一家4s店当师傅。在4s店，他又学会了新的宰客方法。 很多车主都认为4s店的技术力量好，配件质量也有保障，虽然收费较高，但玩车嘛，首先得放心。他们根本就不知道，其实在有些4s店修车，比在一些小店修车还不安全。在4s店工作的师傅。的确有一定技术，但正因为如此，如果他们做了手脚你也不会知道。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 张宇清很快就发现，4s店有个&ldquo;潜规则&rdquo;，就是当维修人员对病车的毛病判断不确定的时候，可以把别的车上的好零件装到&ldquo;病车&rdquo;上来证实自己的判断，经常事后根本就不把零件换回去，一是图省事，二是防止做二次手脚被发现。这样一来，可能一台只用了1年的功能完好的发动机，进厂维修或保养出来后，却变&ldquo;老&rdquo;了好几岁。2007年11月的一天，张宇清把一辆奥迪A6(图库 论坛)车的启动器拆下换到另一辆车上，后来被细心的车主发现了。车主当即跟店里发生争执，事后还向有关部门投诉了修车店。张宇清只说是自己忘了换回来，所以事情后来还是不了了之。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 张宇清最喜欢修理事故车。如果遇到事故车．他经常把所有的旧件甚至残次件都一口气换上去，把比较新的部件拿走。保险公司来人定损时，他就想办法跟定损人员搞好关系，甚至送些&ldquo;好处&rdquo;给对方，然后说这个不行了、那个也不行了，都得换。这样一来，新件就可以卖钱了。但事故车再怎么修，也成了一辆烂车，修理工则可以把责任全都推到事故上。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp; 自从张宇清学会宰客后，他平均每个月收入2万元左右，最高时一个月收入4万多元。2007年12月中旬，他带着女朋友在南京市白下区某小区按揭买下了一套96平方米的房子。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp;&nbsp; 性命攸关，迷途知返心路太长</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 在修车行业干了几年，张宇清对这一行的&ldquo;猫腻&rdquo;越来越清楚了，可以说是千奇百怪，令车主防不胜防，何况很多车主根本就不会设防。 比如机修工故意往机油里放白糖，因为白糖受热后会成黏糊状，却没有任何润滑作用，别人也发现不了，很快就会导致发动机&ldquo;抱瓦&rdquo;，不能正常工作。张宇清刚到45店工作的当天，忽然接到一个电话，是武进市一家修车店打来的，对方说他们介绍一辆车到南京去找张宇清所在的店，一个小时后就到。原来，一条公路上的修车部往往是有联系的，机修工知道放了白糖的汽车最多只能跑百儿八十公里，他们放了糖后．还会打电话告诉下一个维修部做好等那辆车的准备，大家相互介绍&ldquo;生意&rdquo;!</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp; 至于用火碱代替专用的发动机清洗液剂、国产漆代替进口漆，往防冻液里放盐毁坏水箱、私开车主的车去兜风等等就更不用说了。而很多车主对这些做法虽然有所察觉，却没有真凭实据，只得自认倒霉。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp; 真正触动张宇清的是一场车祸。2008年2月12日，一辆黑色帕萨特被拖到店里修理，那车的前部已经被撞得面目全非，挡风玻璃也碎了，里面的人肯定受伤不轻。张宇清仔细一看车牌，记得几天前那车才在他们店里修过，但不是他修的。再一检查车辆，他发现刹车油的颜色不对，一定是里面放了酒精!</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp; 终于出事了!这起车祸的真正祸首是机修工。这是在犯罪啊!但是，由于酒精可以挥发，而且谁也不会用嘴去尝刹车油，所以没有人会想到竟然有人会往刹车油里放酒精。再说，就是有人知道，现在酒精已经挥发了，也是神不知鬼不觉啊!</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp; 张宇清把修车的一些黑幕告诉女朋友，女友对他说：&ldquo;你可千万不能做那种缺德事，那样的钱，赚得再多我也不稀罕!&rdquo;有了女友的这个态度，加上房子已经买了，他的宰客行为收敛了不少。 没想到就在这时，3月18日上午，张宇清的外甥女跟着同学父母的丰田佳美轿车去六合区金牛湖春游，在路上因刹车失灵出了车祸，车上五个人有三人受了重伤，其中张宇清的外甥女骨盆和大腿骨折，可能留下终身残疾。姐姐得知这些，哭得死去活来，差点都要疯了。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp;&nbsp;&nbsp; 外甥女才12岁，像花一样啊!如果造成残疾，她这一辈子怎么办？特别是张宇清一眼看出，是因为在轿车的剥车油中加酒精才造成这起车祸时，他的心灵震撼了：这都是修理工造的孽啊!如果不说，难道任由这种犯罪行为继续下去？这是人命关天的大事啊!如果把这事说出去，自己以后就没法在这一行干了。怎么办？经过几个小时的内心挣扎，张宇清再也忍不住了，他觉得就像是自己害了外甥女，不说出来良心不安。他向交警部门进行举报，并现身说法。说了很多修车行业的黑摹．经对利车油检验．交警部门证实了张宇清说的情况是真实的。那家修车店的老板和维修工被警方带走协助调查。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp; 第三天晚上，张字清在那家4s店里值夜晚班。凌晨l点多，不知从什么地方蹿出几个人，抡起铁棍就将店的门窗砸个稀巴烂。他连忙从后门跑出去，才没有出大事。他想起以前曾有人警告他，干修车这一行就得严守这一行的秘密，所以他知道，一定是自己举报了那家修车店，人家报复他来了。老板听说张宇清把修车行业的很多内幕告诉了警方，很快也找理由将他&ldquo;炒鱿鱼&rdquo;。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;&nbsp; 2008年4月2日接受笔者采访时张宇清表示：&ldquo;修车这个行业的内幕太黑了，赚钱的毒招太多．有不少甚至涉及违法犯罪。如果不加强管理．车主们还不知道要吃多少亏，更有可能会出人命的!以后只要有机会，我还要说，一定要让更多的人知道这里面的黑幕&hellip;&hellip;&rdquo;</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; height: auto; text-align: left; line-height: 1.5; font-size: 14px; ">&nbsp;</p></span></p>]]></description><category>文档</category><comments>http://blog.bigcomic.com/post/292.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=292</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=292&amp;key=2d10dfbc</trackback:ping></item><item><title>还是小事故</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/291.html</link><pubDate>Tue, 29 Sep 2009 14:17:40 +0800</pubDate><guid>http://blog.bigcomic.com/post/291.html</guid><description><![CDATA[<p>&nbsp;很不幸 又事故了。。。。。。</p><p>&nbsp;</p><p>右后方车门刮到车库 &nbsp;</p>]]></description><category>日记?周记?年记?</category><comments>http://blog.bigcomic.com/post/291.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=291</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=291&amp;key=30564d9a</trackback:ping></item><item><title>又见车祸</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/290.html</link><pubDate>Fri, 25 Sep 2009 14:32:08 +0800</pubDate><guid>http://blog.bigcomic.com/post/290.html</guid><description><![CDATA[<p>&nbsp;路考终于过了。 可以拿驾照了，兴奋。</p><p>兴奋过渡，倒车时撞到灌木丛 -_- &nbsp;还好损伤不大 抛光一下就可以了</p>]]></description><category>日记?周记?年记?</category><comments>http://blog.bigcomic.com/post/290.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=290</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=290&amp;key=76f8c0b9</trackback:ping></item><item><title>小型车祸</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/289.html</link><pubDate>Tue, 22 Sep 2009 14:14:07 +0800</pubDate><guid>http://blog.bigcomic.com/post/289.html</guid><description><![CDATA[<p>倒车时擦到同事的车，掉了漆，给丫200解决问题。第一次事故就这么过去了。</p><p>下次要小心 -.-</p>]]></description><category>日记?周记?年记?</category><comments>http://blog.bigcomic.com/post/289.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=289</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=289&amp;key=5c644cca</trackback:ping></item><item><title>戒烟日记 第一天</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/288.html</link><pubDate>Mon, 07 Sep 2009 21:29:53 +0800</pubDate><guid>http://blog.bigcomic.com/post/288.html</guid><description><![CDATA[<p>&nbsp;戒烟吧，又一次对自己说。</p><p>这大概是第八次还是第九次了</p><p>这次没什么特殊原因，只是想戒掉。</p><p>特写此帖，用以MARK。</p><p>&nbsp;</p><p>先把剩下这盒抽完的。。。不然太浪费</p>]]></description><category>日记?周记?年记?</category><comments>http://blog.bigcomic.com/post/288.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=288</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=288&amp;key=d35d6978</trackback:ping></item><item><title>再次向ubuntu说byebye</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/287.html</link><pubDate>Wed, 24 Jun 2009 23:47:11 +0800</pubDate><guid>http://blog.bigcomic.com/post/287.html</guid><description><![CDATA[<p>ubuntu9.04出来的第一天我就下载了，不过一直很忙，直到上周才抽出时间来安装。&nbsp;</p><p>台机已经很久未用，所以顺利成章的装到笔电上。 TC4400 T7600 4G RAM 320G HD 其他都是标配。</p><p>安装过程相比7.04就痛苦太多了。 记得当年7.04装到TC4200的时候，所有驱动都识别，包括触摸屏。 好容易解决了内核出错问题。结果蓝牙鼠标装不上去。 搞定蓝牙鼠标发现指纹不支持。放弃指纹之后发现触摸屏是不好用的。</p><p>&nbsp;</p><p>-----------------------我是迷茫的分割线------------------</p><p>&nbsp;</p><p>放弃硬件，搞搞软件。 相对好一些。 现在开发环境主要是python, 这个linux下还是不错的。但我钟爱的google浏览器和输入法没有。有替代品到也能忍。 pplive pps 都不支持。。。唯一的娱乐活动难道要终止？</p><p>&nbsp;</p><p>&nbsp;</p><p>-----------------------我是沮丧的分割线------------------</p><p>&nbsp;</p><p>&nbsp;</p><p>前后折腾了一个星期，还是决定放弃ubuntu。 期间还尝试了suse....他娘的还不如ubuntu. &nbsp;wifi都搞不定。 老老实实做人，踏踏实实用windows。</p><p>其实windows也不错，起码我所有的硬件都可以驱动起来，我需要的功能都有软件支持。 我。。。。。。。。。。也只能这么安慰自己了，寄希望于9.10吧。</p>]]></description><category>日记?周记?年记?</category><comments>http://blog.bigcomic.com/post/287.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=287</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=287&amp;key=534f6108</trackback:ping></item><item><title>用BWMeter进行本地但款带宽限制</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/286.html</link><pubDate>Thu, 18 Jun 2009 00:55:21 +0800</pubDate><guid>http://blog.bigcomic.com/post/286.html</guid><description><![CDATA[<p>游戏里总有一些无聊的技能要练。 这个时候总要找个电影打发时间。 &nbsp;我钟爱PPS，但是开了PPS游戏就很卡。&nbsp;</p><p>&nbsp;后来找到一个流量监控软件：BWMeter &nbsp;这个软件可以根据IP地址，协议，端口等条件进行带宽限制。&nbsp;</p><p>PPS是UDP协议。 所以只要限制协议17的流量就可以。 经过多次测试 100K 是比较理想的数值。</p><p>&nbsp;</p>]]></description><category>开发随笔</category><comments>http://blog.bigcomic.com/post/286.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=286</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=286&amp;key=5a032959</trackback:ping></item><item><title>Logging in to RuneScape makes crops take longer to grow</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/284.html</link><pubDate>Tue, 16 Jun 2009 15:32:30 +0800</pubDate><guid>http://blog.bigcomic.com/post/284.html</guid><description><![CDATA[<p>&nbsp;</p><p style="margin-top: 0px; ">引用:&nbsp;<a href="http://seanv.info/2007/farming_timers.html">http://seanv.info/2007/farming_timers.html</a></p><p style="margin-top: 0px; ">In&nbsp;<a style="color: rgb(128, 0, 128); " href="http://www.runescape.com/">RuneScape</a>, the act of logging in affects how long your crops take to grow. Specifically, it makes them take longer to grow.</p><p style="margin-top: 0px; "><strong>Hypothesis:</strong>&nbsp;When you log in the timers on your patches are reset.</p><p style="margin-top: 0px; ">(The experiment supporting this article was done on Thu 11 May 2007 GMT; earlier or later experiments may yield different data if RuneScape&rsquo;s code and/or constants were different from those running at the time of this experiment.)</p><h2 style="font-size: 18px; margin-bottom: 0.6em; ">Motivation</h2><p style="margin-top: 0px; ">What got me thinking about this was the way herbs sometimes took a lot longer to grow than I&rsquo;d anticipated. In a preliminary experiment, similar to the one documented below but with watermelons and ranarr weed, the watermelon took a full ten minutes to grow after logging in and the ranarr twenty minutes.</p><h2 style="font-size: 18px; margin-bottom: 0.6em; ">A bit of background: the patch timers</h2><p style="margin-top: 0px; ">As you are probably aware if you&rsquo;ve tried the&nbsp;<a style="color: rgb(0, 0, 255); " href="http://www.runescape.com/kbase/viewcategory.ws?cat_id=789">Farming skill</a>&nbsp;in&nbsp;<a style="color: rgb(128, 0, 128); " href="http://www.runescape.com/">RuneScape</a>, crops grow in discrete stages. Each type of patch has a timer associated with it which, when it runs out, triggers a &lsquo;grow event&rsquo;.</p><p style="margin-top: 0px; ">I measured the time between grow events for the allotment/herb/flower set of patches:</p><div style="width: 700px; margin-left: 105px; margin-right: auto; "><table>    <caption>Length of timers</caption>    <thead>        <tr style="background-color: rgb(153, 204, 153); ">            <th>Patch type</th>            <th>Approx length&nbsp;<br />            (minutes)</th>        </tr>    </thead>    <tbody>        <tr style="background-color: rgb(204, 255, 204); ">            <td>Flower patch</td>            <td class="n" style="text-align: right; ">5</td>        </tr>        <tr style="background-color: rgb(204, 255, 204); ">            <td>Allotment</td>            <td class="n" style="text-align: right; ">10</td>        </tr>        <tr style="background-color: rgb(204, 255, 204); ">            <td>Herb patch</td>            <td class="n" style="text-align: right; ">20</td>        </tr>    </tbody></table></div><p style="margin-top: 0px; ">(The timers seem to run a few seconds longer than these times. E.g. I measured times of 5:05 and 5:09 for flower patches.)</p><p style="margin-top: 0px; ">For at least some (and in my opinion probably all) of the different types of patches the timers are synchronised. I observed (as many farmers probably will have) that herb patch grow events occur simultaneously with every second allotment grow event.</p><h2 style="font-size: 18px; margin-bottom: 0.6em; ">The experiment: observation of effect of logging in on timing of grow events</h2><p style="margin-top: 0px; ">The plan:</p><ul>    <li style="margin-top: 0px; ">Plant a limpwurt seed and water it</li>    <li style="margin-top: 0px; ">Watch for grow events and record the time of each</li>    <li style="margin-top: 0px; ">Log out and then quickly log back in while the limpwurt&rsquo;s growing</li>    <li style="margin-top: 0px; ">See what affect this has on the timing of the grow events</li></ul><p style="margin-top: 0px; ">The flower patch south of Falador was used.</p><div style="width: 700px; margin-left: 105px; margin-right: auto; "><table>    <caption>Log of experiment</caption>    <thead>        <tr style="background-color: rgb(153, 204, 153); ">            <th>Time&nbsp;<br />            (hh:mm:ss)</th>            <th>What happened</th>        </tr>    </thead>    <tbody>        <tr style="background-color: rgb(204, 255, 204); ">            <td>02:12:21</td>            <td>Limpwurt planted</td>        </tr>        <tr style="background-color: rgb(204, 255, 204); ">            <td>02:12:37</td>            <td>Limpwurt grew</td>        </tr>        <tr style="background-color: rgb(204, 255, 204); ">            <td>02:17:42</td>            <td>Limpwurt grew</td>        </tr>        <tr style="background-color: rgb(204, 255, 204); ">            <td>02:22:00</td>            <td>Logged out</td>        </tr>        <tr style="background-color: rgb(204, 255, 204); ">            <td>02:24:00</td>            <td>Logged in (pressing the Login button)</td>        </tr>        <tr style="background-color: rgb(204, 255, 204); ">            <td>02:24:02</td>            <td>Welcome to RuneScape screen displays</td>        </tr>        <tr style="background-color: rgb(204, 255, 204); ">            <td>02:29:11</td>            <td>Limpwurt grew. (It is now fully grown)</td>        </tr>    </tbody></table></div><p style="margin-top: 0px; ">Logging out extended the period between the second and third grow events. The third grow event occurred about five minutes after logging back in. This is the evidence presented in support of this article&rsquo;s hypothesis.</p><h2 style="font-size: 18px; margin-bottom: 0.6em; ">Length of time to fully grow crops</h2><p style="margin-top: 0px; ">(How long crops take to fully grow wasn&rsquo;t the principal data the experiment was designed gather. I&rsquo;m including here some of the reliable data I got in order to be able to illustrate the effect of logging in on crops&rsquo; maturation times.)</p><div style="width: 700px; margin-left: 105px; margin-right: auto; "><table>    <caption>Time required for full growth of crops</caption><colgroup></colgroup><colgroup span="2"></colgroup><colgroup></colgroup><colgroup span="2"></colgroup>    <thead>        <tr style="background-color: rgb(153, 204, 153); ">            <th rowspan="2">Crop</th>            <th colspan="2">Patch</th>            <th rowspan="2" class="smalltext" style="font-size: 12px; ">Nr of grow events reqd<br />            for maturity</th>            <th colspan="2">Maturation time</th>        </tr>        <tr style="background-color: rgb(153, 204, 153); ">            <th class="smalltext" style="font-size: 12px; ">Type</th>            <th class="smalltext" style="font-size: 12px; ">Time between&nbsp;<br />            grow events</th>            <th>Min</th>            <th>Max<a style="color: rgb(0, 0, 255); " href="http://seanv.info/2007/farming_timers.html#tbl_note">*</a></th>        </tr>    </thead>    <tbody>        <tr style="background-color: rgb(204, 255, 204); ">            <td>Ranarr</td>            <td class="i" style="font-style: italic; ">herb</td>            <td class="n" style="text-align: right; ">20</td>            <td class="n" style="text-align: right; ">4</td>            <td class="n" style="text-align: right; ">60</td>            <td class="n" style="text-align: right; ">80</td>        </tr>        <tr style="background-color: rgb(204, 255, 204); ">            <td>Limpwurt</td>            <td class="i" style="font-style: italic; ">flower</td>            <td class="n" style="text-align: right; ">5</td>            <td class="n" style="text-align: right; ">3</td>            <td class="n" style="text-align: right; ">10</td>            <td class="n" style="text-align: right; ">15</td>        </tr>    </tbody></table></div><p style="margin-top: 0px; ">(All times in minutes.)</p><p id="tbl_note" style="margin-top: 0px; ">(*If the outcome of any of a crop&rsquo;s grow events is&nbsp;<i>disease</i>&nbsp;or&nbsp;<i>don&rsquo;t grow this time</i>&nbsp;then the maximum maturation time may be longer than the figures in this column.)</p><h2 style="font-size: 18px; margin-bottom: 0.6em; ">Consequences for farmers</h2><p style="margin-top: 0px; ">If you want your crops to grow as quickly as possible:</p><ul>    <li style="margin-top: 0px; ">stay logged in continuously, or</li>    <li style="margin-top: 0px; ">if you log out, do not log back in until you know your crops will be fully grown.</li></ul><p style="margin-top: 0px; ">Admittedly, I neither strive to make my crops grow as quickly as possible nor do either of these things. These suggestions might apply, say, to someone trying to get the maximum rate of farming experience.</p><p style="margin-top: 0px; ">The situation is interesting for crops which take a long time to grow, e.g. trees. I expect for normal or fruit trees the time between grow events is considerably longer, for otherwise fruit trees would have a large number of different stages of growth, which is not what I have observed. In fact I notice Maxromulan has said that fruit tree patch grow events occur every four hours. Now</p><p class="eqn" style="margin-top: 0px; text-indent: 8em; font-style: italic; ">4 hr = 240 min = 12 x 20 min</p><p style="margin-top: 0px; ">so perhaps fruit tree patch grow events are synchronised with every twelfth herb patch grow event. If logging in actually does reset a four hour timer, each login could lengthen the time to maturity of fruit trees by up to four hours, two hours on average if the time you spend logged on is completely random (whatever that means).</p><h2 style="font-size: 18px; margin-bottom: 0.6em; ">Further investigations</h2><p style="margin-top: 0px; ">What about the other types of crop (trees, calquats, etc., etc.)? Their patch timers are quite a bit longer than 20 minutes. Does logging in completely reset the timer? I don&rsquo;t know, but I may attempt to experiment to find out and if I do I&rsquo;ll post the results here.</p><h2 style="font-size: 18px; margin-bottom: 0.6em; ">Acknowledgements and references</h2><p style="margin-top: 0px; ">Thanks to Maxromulan for sharing some snippets of her farming knowledge in a thread on the<a style="color: rgb(128, 0, 128); " href="http://forum.runescape.com/forums.ws?27,28">RuneScape Rants forum</a>. After I noticed that something interesting was happening with the farming timers, her thread confirmed it for me and encouraged me to investigate further. One of Maxromulan&rsquo;s posts alerted me to the fact that there is a random chance that the outcome of a grow event is &lsquo;don&rsquo;t grow this time&rsquo;. Thanks also to Luciferzero0 for his/her posts on that thread, in one of which he or she states the hypothesis of this article.</p><p style="margin-top: 0px; ">This document was originally written on 13 May 2007 GMT and was most recently updated on 22 May 2008.</p><p>&nbsp;</p><p>&nbsp;</p>]]></description><category>Runescape/UO</category><comments>http://blog.bigcomic.com/post/284.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=284</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=284&amp;key=baab4d7b</trackback:ping></item><item><title>狗样花猫</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/283.html</link><pubDate>Wed, 10 Jun 2009 19:37:25 +0800</pubDate><guid>http://blog.bigcomic.com/post/283.html</guid><description><![CDATA[<embed src="http://player.youku.com/player.php/sid/24401195/v.swf" quality="high" width="480" height="400" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed>]]></description><category>相册</category><comments>http://blog.bigcomic.com/post/283.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=283</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=283&amp;key=47eef3a3</trackback:ping></item><item><title>IMAP与MAILDROP造成的邮件服务器IO占用过高</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/282.html</link><pubDate>Wed, 10 Jun 2009 12:49:06 +0800</pubDate><guid>http://blog.bigcomic.com/post/282.html</guid><description><![CDATA[<p>最近几周，用户经常抱怨邮件服务器慢，连不上，邮件发不出去。</p><p>写了几个监控脚本，对CPU,交换分区，硬盘使用率，进程等情况做了监视。 得到以下结论：</p><p>imap和maildrop引起的系统IO阻塞，是造成故障的主要原因。</p><p>imap 在大量用户的情况下本身就是瓶颈。 目前常规在线人数在100左右，邮件使用高峰期 IO的使用率是100%。 所以考虑换回POP3。</p><p>maildrop 主要是设置问题，之前没有限制最大进程数，群发的时候会启动1xxx个进程，而且都是读写硬盘的，所以要限制maxproc。</p><p>在master.cf里</p><p><p>maildrop &nbsp;unix &nbsp;- &nbsp; &nbsp; &nbsp; n &nbsp; &nbsp; &nbsp; n &nbsp; &nbsp; &nbsp; - &nbsp; &nbsp; &nbsp; - &nbsp; &nbsp; &nbsp; pipe</p><p>&nbsp;&nbsp;flags=DRhu user=vuser argv=maildrop -w 90 -d ${user}@${nexthop} ${recipient} ${user} ${extension} {nexthop}</p><p>改为</p><p><p>maildrop &nbsp;unix &nbsp;- &nbsp; &nbsp; &nbsp; n &nbsp; &nbsp; &nbsp; n &nbsp; &nbsp; &nbsp; - &nbsp; &nbsp; &nbsp; 21 &nbsp; &nbsp; &nbsp; pipe</p><p>&nbsp;&nbsp;flags=DRhu user=vuser argv=maildrop -w 90 -d ${user}@${nexthop} ${recipient} ${user} ${extension} {nexthop}</p><div>maxproc改成21，基本上不会太卡</div><div>&nbsp;</div><div>&nbsp;</div><div>&nbsp;</div><div>尽管做了以上设置，但磁盘IO效率还是存在问题。 下一步准备把ext3换成reiserfs。 如果还是不成的话，那就只能上NAS了 。</div><div>&nbsp;</div><div>&nbsp;</div><div>EOF</div></p><div>&nbsp;</div></p>]]></description><category>日记?周记?年记?</category><comments>http://blog.bigcomic.com/post/282.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=282</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=282&amp;key=30f1e53a</trackback:ping></item><item><title>Android Dev Phone 1</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/281.html</link><pubDate>Sun, 12 Apr 2009 12:17:15 +0800</pubDate><guid>http://blog.bigcomic.com/post/281.html</guid><description><![CDATA[<p><a href="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0397.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="364" alt="CIMG0397" src="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0397_thumb.jpg" width="484" border="0"></a> </p> <p><a href="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0398.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="364" alt="CIMG0398" src="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0398_thumb.jpg" width="484" border="0"></a> </p> <p>&nbsp;</p> <p>这键位基本能够满足所有linux操作需求. 很强大</p> <p><a href="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0399.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="364" alt="CIMG0399" src="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0399_thumb.jpg" width="484" border="0"></a> </p> <p>&nbsp;</p> <p>这个滚轮和黑莓很象</p> <p><a href="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0403.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="364" alt="CIMG0403" src="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0403_thumb.jpg" width="484" border="0"></a> </p> <p>&nbsp;</p> <p>USB充电口. 那个小孔应该是MIC, 我差点当成RESET......</p> <p><a href="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0404.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="364" alt="CIMG0404" src="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0404_thumb.jpg" width="484" border="0"></a> </p> <p>&nbsp;</p> <p>相机钮, 感觉用处不大</p> <p><a href="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0409.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="364" alt="CIMG0409" src="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0409_thumb.jpg" width="484" border="0"></a> </p> <p>&nbsp;</p> <p>音量钮</p> <p><a href="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0410.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="364" alt="CIMG0410" src="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0410_thumb.jpg" width="484" border="0"></a> </p> <p>&nbsp;</p> <p>我的最爱..后面的图案很迷人</p> <p><a href="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0405.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="644" alt="CIMG0405" src="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0405_thumb.jpg" width="484" border="0"></a> </p> <p>&nbsp;</p> <p>尤其是这个机器人 ;-)</p> <p><a href="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0406.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="364" alt="CIMG0406" src="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0406_thumb.jpg" width="484" border="0"></a> </p> <p>&nbsp;</p> <p>G1键盘滑出的方式很特别 下面一组图可以看出滑动路线</p> <p><a href="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0411.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="364" alt="CIMG0411" src="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0411_thumb.jpg" width="484" border="0"></a> </p> <p><a href="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0412.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="364" alt="CIMG0412" src="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0412_thumb.jpg" width="484" border="0"></a> </p> <p><a href="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0413.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="364" alt="CIMG0413" src="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0413_thumb.jpg" width="484" border="0"></a> </p> <p><a href="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0414.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="364" alt="CIMG0414" src="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0414_thumb.jpg" width="484" border="0"></a> </p> <p>&nbsp;</p> <p>特别的代价就是磨损严重....我才用了几天啊</p> <p><a href="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0415.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="364" alt="CIMG0415" src="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0415_thumb.jpg" width="484" border="0"></a> </p> <p>&nbsp;</p> <p>G1 VS P4550</p> <p><a href="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0407.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="364" alt="CIMG0407" src="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0407_thumb.jpg" width="484" border="0"></a>&nbsp; </p> <p><a href="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0408.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="364" alt="CIMG0408" src="http://blog.bigcomic.com/upload/AndroidDevPhone1_AC6D/CIMG0408_thumb.jpg" width="484" border="0"></a></p>]]></description><category>日记?周记?年记?</category><comments>http://blog.bigcomic.com/post/281.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=281</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=281&amp;key=12e691c6</trackback:ping></item><item><title>comiclrf的改良</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/280.html</link><pubDate>Sun, 15 Mar 2009 01:23:37 +0800</pubDate><guid>http://blog.bigcomic.com/post/280.html</guid><description><![CDATA[<p>买505的目的非常明确, 看漫画.&nbsp; 在505未到之前就开始研究漫画的转换. 很多工具都可以转, 十分完美的几乎没有.&nbsp; <br>comiclrf算是比较不错的. 但也有几个缺陷.<br>1. 不支持中文, 要用其他软件再改名.<br>2. AB页顺序错位, 需要用comic2psp先转换一次. 美版漫画是从左向右看. 作者没考虑到扫描版用户啊.<br>3. 转换后体积偏大<br>4. 转换速度慢<br>5. rar, zip 文件需要改名后才能转换.&nbsp; 图象文件要先压缩.<br>问题不大, 但是漫画多了实在有点吃不消. 所以我在2.4版的基础上进行改良.<br>1,2,5 已经修正. <br>3,4 是因为comiclrf把图象都转成了gif格式. 大概是想锐化吧. 所以体积要比转换前大好多.&nbsp; 速度慢也可以理解了.&nbsp; 这个问题还未调整, 正在考虑一个新的锐化算法。 做好之后再放上来.  <p>&nbsp;</p> <p><a href="http://blog.bigcomic.com/upload/comiclrf_update.rar" target="_blank">Download</a></p>]]></description><category>开发随笔</category><comments>http://blog.bigcomic.com/post/280.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=280</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=280&amp;key=c9ac1c42</trackback:ping></item><item><title>505扫盲结束</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/279.html</link><pubDate>Mon, 23 Feb 2009 15:00:23 +0800</pubDate><guid>http://blog.bigcomic.com/post/279.html</guid><description><![CDATA[<p>不务正业一整天, 总算对505有了初步的了解. lrf的文件格式. 中文化方法. 漫画的转化.&nbsp; 该准备的都准备好了. 就等机器到手开始折腾..</p>]]></description><category>日记?周记?年记?</category><comments>http://blog.bigcomic.com/post/279.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=279</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=279&amp;key=3a476c43</trackback:ping></item><item><title>lrf cover tools</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/278.html</link><pubDate>Mon, 23 Feb 2009 10:30:56 +0800</pubDate><guid>http://blog.bigcomic.com/post/278.html</guid><description><![CDATA[<p>1. lrf2lrs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://blog.bigcomic.com/upload/lrf2lrs_03.zip">http://blog.bigcomic.com/upload/lrf2lrs_03.zip</a><br /><br />&nbsp;&nbsp;&nbsp; lrf to lrs .&nbsp; python写的小工具</p><p>2. pylrs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://blog.bigcomic.com/upload/pylrs-1.0.0.zip">http://blog.bigcomic.com/upload/pylrs-1.0.0.zip</a></p><p>&nbsp;&nbsp;&nbsp; python模块, 可以生成lrf</p>]]></description><category>文档</category><comments>http://blog.bigcomic.com/post/278.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=278</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=278&amp;key=78057c71</trackback:ping></item><item><title>History of LRF format</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/277.html</link><pubDate>Mon, 23 Feb 2009 10:24:45 +0800</pubDate><guid>http://blog.bigcomic.com/post/277.html</guid><description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt">The LRF format is a proprietary format by Sony used in their e-readers.The format is still undocumented. Many efforts were done by enthusiasts to understand the format and to make utilities for LRF conversion since appearing Sony Librie (Japaneese version) reader on the market. This review is my personal vision of the history and is limited to the resources I used in my work. LRF conversion is rapidly growing area of the content generation development (inspired by new Sony Reader PRS-500). There are several other resources and wiki pages devoted to the LRF format and tools for conversion; the goal of this page is a review of major achievements for the beginners. This section reflects works done before February 2007, some links may not work. I'm not going to update this page for new resources, please visit forums listed in the Link section for up-to-date information.<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt">The goal of this page is to provide a reference to the programs that can be used for understanding the LRF format, the program listed here are not the only (and not necessarily the best) way to make lrf content. <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt">Formats<o:p></o:p></span></b></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt">LRF format. This BINARY format used in Sony Librie and Sony PRS-500 Readers. The format is barely documented. Some very limited information can be found at http://www.sven.de/librie/Librie/BBeB . The LRF format can be understood with the python code of lrf2lrs converter and utilities for extracting the objects from LRF files (see below). The LRF can contain text or images, the ability to show images sometimes used by homemade programs with the reference to &quot;picture&quot; LRF (actually this is just simple implementation of one of the features of LRF format). <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt">LRS (Librie Reader Source) format. LRS is a &quot;source&quot; XML format with the description for the objects used in LRF. This format was introduced in the Book Creator program (commercial program with Japanese interface) by Canon (see below). The format is documented: http://www.y-adagio.com/public/committees/iec_pt62448/1_np(0509)/100_1017e_DC.pdf . LRS files can be generated by either 3 ways: 1) with commercial Book Creator program by Canon; 2) with freeware Book Designer program (see below for more details) 3) with Python lrf2lrs converter by roxfan, Igor Skochinsky and several newly developed utilities available at www.mobileread.com. <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt">BBeB &quot;Broadband ebook&quot; format by Sony. Another name of LRF and, sometimes, LRS formats.<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt">Programs useful for understanding the LRF format <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt">Major programs for understanding the LRF format, listed by date: <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt">1. Book Creator Commercial program by Canon. First mentioned in yahoo Librie group in June 2004, see post #18). The program has Japanese interface. Since that time the development of homemade LRF content was started. First, many affords were done to make English version of Book Creator (see Librie yahoo group); Second, some homebrew programs use XYLogParser.dll (with Lrs2lrf wrapper by roxfan) to create LRF files from LRS source; Third, reverse engineering of LRF format was started to develop programs independent from XYLogParser.dll. <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt">2. Makelrf program by scythic (first introduced in yahoo librie group in October, 2004). The program comes with C-code and available in the File section of Librie group. The program allows to create Lrf files from the text files with support of the images. The program cannot create rich lrf files (only basic objects are supported), but it is hard to underestimated the progress archived with the program. Till now makelrf is widely used in many other programs as an engine for creation either simple text LRF or image-based LRF. Until recently makelrf was used in BookDesigner program (in &quot;simple&quot; conversion mode); and JAP programs to generate image-based LRFs. <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt">3. LRFParser by roxfan (yahoo Librie group, November 2004, comes with C-source). The program decompiles LRF files to the objects, including TOC, header and compressed streams. To my knowledge, LRFparser is the first program where complex LRF objects and majority of tags were understood.<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt">4. lrf2lrs (first version signed by roxan, February 2006; yahoo Librie group); the latest versions (signed by roxfan, Igor Skochinsky) are available at www.mobileread.com (Sony Portable Reader - Reader Developer's Corner - Lrf2Lrs thread, posts by igorsk). (I believe that roxfan=Igor Skorchinsky=igorsk). With the program the LRF files can be converted to the LRS files. Up to date the source of this Python program is the major source of information on LRF objects and tags. Almost all possible LRF objects and tags are supported by the program.<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt">5. LRFunpack (by me, available at download section of this site, November 2006). NET2.0 C# application for extracting objects from LRF files with some translation of the tags and description of the streams. Creates both dump hex files for each of the object together with the text files with some decryption. I was using this program to understand the LRF format. The advantage of this program - it never stops decompiling even if tag is unknown. Some example of decompiled lrf can be found at download section. Sorry, no source available. <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt">----------- <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt">I did not mention Java tools, because I never tried them myself. Please have a look at the forums of the sites listed in the Link section. I believe the most significant contributions are flatLrf (http://monalipse.sourceforge.jp/tmp/lrf/, January 2005) and LRFParser.java (by Scotty1024, May 2005, Librie yahoo group). FlatLrf is Java application to create lrf from html files; LRFParser.java is Java version of LRFParser by roxfan.<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt">BookDesigner (Wiki page) (by Valerii Woizechovsky (aka vvv))). This program is an universal program for conversion between many formats, reading and ebook creation. The program creates LRS file, than the LRS file is converted to LRF with external third-party converters (makelrf, lrs2lrf , LRSparser by AlexXF, the latest version uses my MSH_Lrsparser). The strong side of the BookDesigner for understanding the LRF format is ability to generate custom LRS together with corresponding LRF file for further analysis.<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt">LRF conversion utilities <o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-themecolor: text1; mso-font-kerning: 0pt">Please refer to the Wiki page and the link section for recent progress on content generation. Recently Sony launched site for the developers at www. prslabs.com. Unfortunately there is almost no new information. The LRS format specification is given (the one mentioned above), the XYLogParser.dll (almost the same to the discussed above, it is also very slow), and the description of the interface around the XYLogparser.dll.<o:p></o:p></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><o:p><font face="Calibri" size="3">&nbsp;</font></o:p></span></p><p>&nbsp;<a style="color: #00c; text-decoration: underline" href="http://www.msh-tools.com/ebook/lrfformat.html">http://www.msh-tools.com/ebook/lrfformat.html</a></p>]]></description><category>文档</category><comments>http://blog.bigcomic.com/post/277.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=277</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=277&amp;key=fd878d63</trackback:ping></item><item><title>Lrf file format</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/276.html</link><pubDate>Mon, 23 Feb 2009 10:21:36 +0800</pubDate><guid>http://blog.bigcomic.com/post/276.html</guid><description><![CDATA[<p class="vspace">A LRF file consists of a header, a number of objects and an object index. All values are in Intel (LSB first) order.</p><div class="vspace">&nbsp;</div><h2>Header</h2><p><table border="1">    <tbody>        <tr>            <td align="center">Offset (hex)</td>            <td align="center">Size(bytes)</td>            <td align="center">Name/meaning</td>            <td align="center">Example value</td>        </tr>        <tr>            <td align="center">0</td>            <td align="center">8</td>            <td align="center">LRF Signature</td>            <td align="center">4C 00 52 00 46 00 00 00 = &quot;LRF&quot; in Unicode</td>        </tr>        <tr>            <td align="center">8</td>            <td align="center">2</td>            <td align="center">version?</td>            <td align="center">999 in most files</td>        </tr>        <tr>            <td align="center">A</td>            <td align="center">2</td>            <td align="center">&quot;Psuedo-Encryption&quot; key byte</td>            <td align="center">48</td>        </tr>        <tr>            <td align="center">0C</td>            <td align="center">4</td>            <td align="center"><span class="wikiword"><a class="wikilink" href="http://www.sven.de/librie/Librie/RootObjectID">RootObjectID</a></span></td>            <td align="center">0x0044</td>        </tr>        <tr>            <td align="center">10</td>            <td align="center">8</td>            <td align="center"><span class="wikiword"><a class="wikilink" href="http://www.sven.de/librie/Librie/NumberOfObjects">NumberOfObjects</a></span></td>            <td align="center">342</td>        </tr>        <tr>            <td align="center">18</td>            <td align="center">8</td>            <td align="center"><span class="wikiword"><a class="wikilink" href="http://www.sven.de/librie/Librie/ObjectIndexOffset">ObjectIndexOffset</a></span></td>            <td align="center">0x00093440</td>        </tr>        <tr>            <td align="center">20</td>            <td align="center">4</td>            <td align="center">unknown</td>            <td align="center">0</td>        </tr>        <tr>            <td align="center">24</td>            <td align="center">1</td>            <td align="center">Flags (16 - back to front, 1 = front to back)</td>            <td align="center">16</td>        </tr>        <tr>            <td align="center">25</td>            <td align="center">1</td>            <td align="center">unknown (padding?)</td>            <td align="center">0</td>        </tr>        <tr>            <td align="center">26</td>            <td align="center">2</td>            <td align="center">unknown</td>            <td align="center">1600</td>        </tr>        <tr>            <td align="center">28</td>            <td align="center">2</td>            <td align="center">unknown (padding?)</td>            <td align="center">0</td>        </tr>        <tr>            <td align="center">2A</td>            <td align="center">2</td>            <td align="center">Height?</td>            <td align="center">600</td>        </tr>        <tr>            <td align="center">2C</td>            <td align="center">2</td>            <td align="center">Width?</td>            <td align="center">800</td>        </tr>        <tr>            <td align="center">2E</td>            <td align="center">1</td>            <td align="center">unknown</td>            <td align="center">24</td>        </tr>        <tr>            <td align="center">2F</td>            <td align="center">1</td>            <td align="center">unknown (padding?)</td>            <td align="center">0</td>        </tr>        <tr>            <td align="center">30</td>            <td align="center">0x14</td>            <td align="center">unknown</td>            <td align="center">zeroes</td>        </tr>        <tr>            <td align="center">44</td>            <td align="center">4</td>            <td align="center">Object ID of only <span class="wikiword"><a class="wikilink" href="http://www.sven.de/librie/Librie/PlaneStream">PlaneStream</a></span> (0x1E) object</td>            <td align="center">0x0042</td>        </tr>        <tr>            <td align="center">48</td>            <td align="center">4</td>            <td align="center">unknown</td>            <td align="center">0x1536</td>        </tr>        <tr>            <td align="center">4C</td>            <td align="center">2</td>            <td align="center"><span class="wikiword"><a class="wikilink" href="http://www.sven.de/librie/Librie/XMLCompSize">XMLCompSize</a></span></td>            <td align="center">0x035C</td>        </tr>    </tbody></table></p><p class="vspace">Next two fields are only present if version&gt;=800.</p><p><table border="1">    <tbody>        <tr>            <td align="center">4E</td>            <td align="center">2</td>            <td align="center">unknown</td>            <td align="center">0x0014</td>        </tr>        <tr>            <td align="center">50</td>            <td align="center">4</td>            <td align="center"><span class="wikiword"><a class="wikilink" href="http://www.sven.de/librie/Librie/GifSize">GifSize</a></span></td>            <td align="center">0x03F2</td>        </tr>    </tbody></table></p><p class="vspace">Immediately follows the compressed XML metainfo, of size <span class="wikiword"><a class="wikilink" href="http://www.sven.de/librie/Librie/XMLCompSize">XMLCompSize</a></span>. First dword of it is the size of uncompressed data, the rest is zlib compressed unicode XML.</p><p class="vspace">If version&gt;=800, the gif thumbnail follows, of size <span class="wikiword"><a class="wikilink" href="http://www.sven.de/librie/Librie/GifSize">GifSize</a></span>.</p><div class="vspace">&nbsp;</div><h2>Object index</h2><p>Offset to the index is specified by the <span class="wikiword"><a class="wikilink" href="http://www.sven.de/librie/Librie/ObjectIndexOffset">ObjectIndexOffset</a></span> in the header, and number of entries is <span class="wikiword"><a class="wikilink" href="http://www.sven.de/librie/Librie/NumberOfObjects">NumberOfObjects</a></span>.</p><p class="vspace">Each index entry has the following layout:</p><p><table border="1">    <tbody>        <tr>            <td align="center">Offset (hex)</td>            <td align="center">Size(bytes)</td>            <td align="center">Name/meaning</td>            <td align="center">Example value</td>        </tr>        <tr>            <td align="center">00</td>            <td align="center">4</td>            <td align="center">id</td>            <td align="center">0x32</td>        </tr>        <tr>            <td align="center">04</td>            <td align="center">4</td>            <td align="center">offset</td>            <td align="center">0x07B0</td>        </tr>        <tr>            <td align="center">08</td>            <td align="center">4</td>            <td align="center">size</td>            <td align="center">0x44</td>        </tr>        <tr>            <td align="center">0C</td>            <td align="center">4</td>            <td align="center">reserved?</td>            <td align="center">0</td>        </tr>    </tbody></table></p><div class="vspace">&nbsp;</div><h2>Objects</h2><p>See <span class="wikiword"><a class="wikilink" href="http://www.sven.de/librie/Librie/LrfObject">LrfObject</a></span> [http://buycialis.cc<a class="apprlink" href="http://www.sven.de/librie/Librie/LrfFormat?action=approvesites">(approve sites)</a> buy cialis online] [http://buycialis.cc<a class="apprlink" href="http://www.sven.de/librie/Librie/LrfFormat?action=approvesites">(approve sites)</a> buy cialis] http://buycialis.cc buy cialis online<a class="apprlink" href="http://www.sven.de/librie/Librie/LrfFormat?action=approvesites">(approve sites)</a></p>]]></description><category>文档</category><comments>http://blog.bigcomic.com/post/276.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=276</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=276&amp;key=120a7611</trackback:ping></item><item><title>file format</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/275.html</link><pubDate>Mon, 23 Feb 2009 10:09:51 +0800</pubDate><guid>http://blog.bigcomic.com/post/275.html</guid><description><![CDATA[<p><a title="http://en.wikipedia.org/wiki/Alphabetical_list_of_file_extensions#L" href="http://en.wikipedia.org/wiki/Alphabetical_list_of_file_extensions#L">http://en.wikipedia.org/wiki/Alphabetical_list_of_file_extensions#L</a></p>]]></description><category>文档</category><comments>http://blog.bigcomic.com/post/275.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=275</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=275&amp;key=960200b1</trackback:ping></item><item><title>生命不熄 败家不止</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/274.html</link><pubDate>Sun, 22 Feb 2009 21:57:59 +0800</pubDate><guid>http://blog.bigcomic.com/post/274.html</guid><description><![CDATA[<p>我对电子产品向来没什么抵抗力. 今天败了htc p4550和sony prs 505. 等货到手这段时间是最心焦的. p4550还好, 是天津过来的. 505得从美国过来. 估计得个10天半月</p> <p>我等 我等</p>]]></description><category>开发随笔</category><comments>http://blog.bigcomic.com/post/274.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=274</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=274&amp;key=f79d55c3</trackback:ping></item><item><title>Centos5.2 下的 vsftpd 虚拟用户</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/273.html</link><pubDate>Sun, 22 Feb 2009 21:11:20 +0800</pubDate><guid>http://blog.bigcomic.com/post/273.html</guid><description><![CDATA[<p>安装步骤基本和Ubuntu下差不多, 只不过需要多装一个pam_userdb, 我是yum装的 <font face="Courier New">yum install db4-utils</font></p><p>ubuntu下参考之前的文章: <a title="http://blog.bigcomic.com/post/241.html" href="http://blog.bigcomic.com/post/241.html">http://blog.bigcomic.com/post/241.html</a></p><p>有一点不同的是ubuntu下的pam日志在 /var/log/auth.log.&nbsp; 而centos5.2是在 /var/log/secure</p><p>&nbsp;</p><p>EOF</p>]]></description><category>文档</category><comments>http://blog.bigcomic.com/post/273.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=273</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=273&amp;key=3e038bec</trackback:ping></item><item><title>侧边栏工具 TopWords</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/272.html</link><pubDate>Fri, 20 Feb 2009 12:55:47 +0800</pubDate><guid>http://blog.bigcomic.com/post/272.html</guid><description><![CDATA[<p>基本功能写出来了, 没有时间优化, 凑合着用先...</p> <p><a href="http://blog.bigcomic.com/upload/TopWords.gadget.rar" target="_blank">下载TopWords</a></p>]]></description><category>文档</category><comments>http://blog.bigcomic.com/post/272.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=272</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=272&amp;key=7018bc34</trackback:ping></item><item><title>Nagios学习笔记 (1)</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/271.html</link><pubDate>Fri, 20 Feb 2009 08:57:29 +0800</pubDate><guid>http://blog.bigcomic.com/post/271.html</guid><description><![CDATA[<p><strong><u>NRPE</u></strong></p> <p>NRPE is an addon that allows you to execute <a href="http://nagios.sourceforge.net/plugins.html">plugins</a> on remote Linux/Unix hosts. This is useful if you need to monitor local resources/attributes like disk usage, CPU load, memory usage, etc. on a remote host. Similiar functionality can be accomplished by using the <i>check_by_ssh</i> plugin, although it can impose a higher CPU load on the monitoring machine - especially if you are monitoring hundreds or thousands of hosts.</p> <p><img height="141" alt="nrpe" src="http://blog.bigcomic.com/upload/Nagios_7B61/nrpe.png" width="479" border="0"> </p> <p>&nbsp;</p> <p><strong><u>NSCA</u></strong></p> <p>NSCA is an addon that allows you to send <a href="http://nagios.sourceforge.net/passivechecks.html">passive check</a> results from remote Linux/Unix hosts to the Nagios daemon running on the monitoring server. This is very useful in <a href="http://nagios.sourceforge.net/distributed.html">distributed</a> and <a href="http://nagios.sourceforge.net/redundancy.html">redundant/failover</a> monitoring setups.</p> <p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="141" alt="nsca" src="http://blog.bigcomic.com/upload/Nagios_7B61/nsca.png" width="475" border="0"> </p> <p>&nbsp;</p> <p><strong><u>NSClient++</u></strong></p> <p>Monitoring private services or attributes of a Windows machine requires that you install an agent on it. This agent acts as a proxy between the Nagios plugin that does the monitoring and the actual service or attribute of the Windows machine. Without installing an agent on the Windows box, Nagios would be unable to monitor private services or attributes of the Windows box.</p> <p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="152" alt="monitoring-windows" src="http://blog.bigcomic.com/upload/Nagios_7B61/monitoringwindows.png" width="437" border="0"> </p> <p>&nbsp;</p> <p><strong><u>NDOUtils</u></strong></p> <p>NDOUtils is an addon that allows you to store all status information from Nagios in a MySQL database. Multiple instances of Nagios can all store their information in a central database for centralized reporting. This will likely serve as the basis for a new PHP-based web interface for Nagios in the future.</p> <p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="93" alt="ndoutils" src="http://blog.bigcomic.com/upload/Nagios_7B61/ndoutils.png" width="521" border="0"></p>]]></description><category>开发随笔</category><comments>http://blog.bigcomic.com/post/271.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=271</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=271&amp;key=45651c49</trackback:ping></item><item><title>Wall E</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/269.html</link><pubDate>Sun, 15 Feb 2009 09:32:00 +0800</pubDate><guid>http://blog.bigcomic.com/post/269.html</guid><description><![CDATA[<p><a href="http://blog.bigcomic.com/upload/WallE_8607/wall_e_1.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="324" alt="wall_e_1" width="484" border="0" src="http://blog.bigcomic.com/upload/WallE_8607/wall_e_1_thumb.png" /></a></p><p><a href="http://blog.bigcomic.com/upload/WallE_8607/wall_e_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="324" alt="wall_e_2" width="484" border="0" src="http://blog.bigcomic.com/upload/WallE_8607/wall_e_2_thumb.png" /></a></p><p><a href="http://blog.bigcomic.com/upload/WallE_8607/wall_e_3.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="324" alt="wall_e_3" width="484" border="0" src="http://blog.bigcomic.com/upload/WallE_8607/wall_e_3_thumb.png" /></a></p><p>&nbsp;<a href="http://blog.bigcomic.com/upload/WallE_8607/wall_e_4.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="324" alt="wall_e_4" width="484" border="0" src="http://blog.bigcomic.com/upload/WallE_8607/wall_e_4_thumb.png" /></a></p><p><a href="http://blog.bigcomic.com/upload/WallE_8607/wall_e_5.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="324" alt="wall_e_5" width="484" border="0" src="http://blog.bigcomic.com/upload/WallE_8607/wall_e_5_thumb.png" /></a></p><p><a href="http://blog.bigcomic.com/upload/WallE_8607/wall_e_6.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="324" alt="wall_e_6" width="484" border="0" src="http://blog.bigcomic.com/upload/WallE_8607/wall_e_6_thumb.png" /></a></p><p>&nbsp; <a href="http://blog.bigcomic.com/upload/WallE_8607/wall_e_7.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="324" alt="wall_e_7" width="484" border="0" src="http://blog.bigcomic.com/upload/WallE_8607/wall_e_7_thumb.png" /></a></p><p>&nbsp;<a href="http://blog.bigcomic.com/upload/WallE_8607/wall_e_8.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="324" alt="wall_e_8" width="484" border="0" src="http://blog.bigcomic.com/upload/WallE_8607/wall_e_8_thumb.png" /></a></p><p><a href="http://blog.bigcomic.com/upload/WallE_8607/wall_e_9.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="324" alt="wall_e_9" width="484" border="0" src="http://blog.bigcomic.com/upload/WallE_8607/wall_e_9_thumb.png" />&nbsp;</a></p>]]></description><category>相册</category><comments>http://blog.bigcomic.com/post/269.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=269</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=269&amp;key=a1bf56ab</trackback:ping></item><item><title>侧边栏开发计划</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/268.html</link><pubDate>Fri, 13 Feb 2009 21:43:46 +0800</pubDate><guid>http://blog.bigcomic.com/post/268.html</guid><description><![CDATA[<p>整天在电脑前工作却很少有时间去看新闻, 搞到不闻不问天下事. 久而久之孤陋寡闻.&nbsp; 拥有最先进的新闻渠道, 却也是什么都不知道.</p> <p>Vista推出一个很有意思的东西Sidebar. 可以在桌面显示一些小工具.&nbsp;&nbsp; </p> <p>这周计划制作一个工具, 可以显示当前最热门的关键词.</p> <p>&nbsp;</p> <p>参考地址:</p> <p><a title="http://msdn.microsoft.com/en-us/library/aa974179.aspx#rightui" href="http://msdn.microsoft.com/en-us/library/aa974179.aspx#rightui">http://msdn.microsoft.com/en-us/library/aa974179.aspx#rightui</a></p> <p><a title="http://msdn.microsoft.com/en-us/library/bb456468(VS.85).aspx#_sidebar_basic_example" href="http://msdn.microsoft.com/en-us/library/bb456468(VS.85).aspx#_sidebar_basic_example">http://msdn.microsoft.com/en-us/library/bb456468(VS.85).aspx#_sidebar_basic_example</a></p> <p>&nbsp;</p> <p>EOF</p>]]></description><category>开发随笔</category><comments>http://blog.bigcomic.com/post/268.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=268</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=268&amp;key=46e5b4a2</trackback:ping></item><item><title>解决/dev/fb0无法打开的问题</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/266.html</link><pubDate>Thu, 12 Feb 2009 16:45:28 +0800</pubDate><guid>http://blog.bigcomic.com/post/266.html</guid><description><![CDATA[<div><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> 最近要在Linux做基于frame Buffer的图形显示，不论我在独立分区的Linux FC6系统中，还是在装有Red hat9的VPC中，都无法打开/dev/fb0。从网上找了很多资料，都没能解决。经过几天的的郁闷之后，终于解决了这个问题。先记录如下：</span></span></div><div><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> 1、首先确认对Frame Buffer的支持是否编译到Linux的内核中。在安装的Linux中，默认都会把这个支持打开编译到内核中。但是如果自己重新编译了内核，或者升级内核，得确认把Frame Buffer的支持编入内核，并且还要把Console display driver support编译到内核中，还要把Logo&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">configuration编译到内核中。这些选项都在Device drivers下的graphics support选项下。</span></span></div><div><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> 2、在启动项中打开对Frame Buffer的支持。由于虽然把对Frame Buffer的支持编译到内核中了，但是默认下是没有打开的。故要修改/boot/grub/menu.lst文件。在该文件的kernel那一行后面加上vga=0xXXX，0xXXX表示的是屏幕的分辨率和色彩数。</span></span></div><div><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> 其中vga=0x后面的数值可以从下表中查出。<br /></span></span></div><div><table style="width: 429px; height: 103px" cellspacing="1" cellpadding="1" width="429" border="1">    <tbody>        <tr>            <td><span style="font-size: larger"><span style="font-family: 宋体">色彩数</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">640 X 480</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">800X600</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">1024X768</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">1280X1024</span></span></td>        </tr>        <tr>            <td><span style="font-size: larger"><span style="font-family: 宋体">256</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">0x301</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">0x303</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">0x305</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">0x307</span></span></td>        </tr>        <tr>            <td><span style="font-size: larger"><span style="font-family: 宋体">32k</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">0x310</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">0x313</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">0x316</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">0x319</span></span></td>        </tr>        <tr>            <td><span style="font-size: larger"><span style="font-family: 宋体">64k</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">0x311</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">0x314</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">0x317</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">0x31A</span></span></td>        </tr>        <tr>            <td><span style="font-size: larger"><span style="font-family: 宋体">16M</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">0x312</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">0x315</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">0x318</span></span></td>            <td><span style="font-size: larger"><span style="font-family: 宋体">0x31B</span></span></td>        </tr>    </tbody></table></div><div><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> 我原先的/boot/grub/menu.lst文件如下:</span></span></div><div><span style="font-size: larger"><span style="font-family: 宋体"># grub.conf generated by anaconda<br />#<br /># Note that you do not have to rerun grub after making changes to this file<br /># NOTICE:&nbsp;</span></span><font face="宋体"><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> You have a /boot partition.&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> This means that<br />#&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> all kernel and initrd paths are relative to /boot/, eg.<br />#&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> root (hd0,0)<br />#&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> kernel /vmlinuz-version ro root=/dev/hda3<br />#&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> initrd /initrd-version.img<br />#boot=/dev/hda<br />default=0<br />timeout=10<br />splashimage=(hd0,0)/grub/splash.xpm.gz<br />title Red Hat Linux (2.6.18)<br />&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> root (hd0,0)<br />&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> kernel /vmlinuz-2.6.18 ro root=LABEL=/&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"><br />&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> initrd /initrd-2.6.18.img<br />title Red Hat Linux (2.4.20-8)<br />&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> root (hd0,0)<br />&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> kernel /vmlinuz-2.4.20-8 ro root=LABEL=/&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"><br />&nbsp;</span></span><wbr></wbr></font><span style="font-size: larger"><span style="font-family: 宋体"> initrd /initrd-2.4.20-8.img</span></span></div><div><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> 因为我对red hat9升级了一个2.6.18的内核，故有两个启动项。修改后，如下：</span></span></div><div><span style="font-size: larger"><span style="font-family: 宋体"><font face="宋体"># grub.conf generated by anaconda<br />#<br /># Note that you do not have to rerun grub after making changes to this file<br /># NOTICE:&nbsp;</font></span></span><font face="宋体"><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> You have a /boot partition.&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> This means that<br />#&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> all kernel and initrd paths are relative to /boot/, eg.<br />#&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> root (hd0,0)<br />#&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> kernel /vmlinuz-version ro root=/dev/hda3<br />#&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr></font><span style="font-size: larger"><span style="font-family: 宋体"><font face="宋体"> initrd /initrd-version.img<br />#boot=/dev/hda<br />default=0</font></span></span></div><div><span style="font-size: larger"><span style="font-family: 宋体">timeout=10<br />splashimage=(hd0,0)/grub/splash.xpm.gz<br />title Red Hat Linux (2.6.18)<br />&nbsp;</span></span><font face="宋体"><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> root (hd0,0)<br />&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> <font color="#ff0000">kernel /vmlinuz-2.6.18 ro root=LABEL=/ vga=0x311</font><br />&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> initrd /initrd-2.6.18.img<br />title Red Hat Linux (2.4.20-8)<br />&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> root (hd0,0)<br />&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> <font color="#ff0000">kernel /vmlinuz-2.4.20-8 ro root=LABEL=/ vga=0x311</font><br />&nbsp;</span></span><wbr></wbr></font><span style="font-size: larger"><span style="font-family: 宋体"> initrd /initrd-2.4.20-8.img</span></span></div><div><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr></div><div><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> 3、重启系统。然后运行cat /dev/fb0，如果发现有一堆乱码输出在屏幕上，则表示找到了/dev/fb0这个设备。如果没有，则可能是你的显卡不支持。</span></span></div><div><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体">&nbsp;</span></span><wbr></wbr><span style="font-size: larger"><span style="font-family: 宋体"> 通过上述操作以后，我的虚拟机中的Linux和独立分区装的Linux都可以打开/dev/fb0了。最后还说一句，打开/dev/fb0是在控制台下打开，在XWindow界面下能打开，但是操作屏幕缓存区画图的时候，会不正确。</span></span></div>]]></description><category>文档</category><comments>http://blog.bigcomic.com/post/266.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=266</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=266&amp;key=b478552c</trackback:ping></item><item><title>django的数据库操作</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/265.html</link><pubDate>Sun, 28 Dec 2008 21:31:44 +0800</pubDate><guid>http://blog.bigcomic.com/post/265.html</guid><description><![CDATA[<p><span style="font-size: large"><span style=""><b>过滤器组合:</b></span></span><br />Q(id__ge=10),Q(pid__ge=10)&nbsp;&nbsp;(id &gt; 10) AND (pid &gt; 10)<br />Q(id__ge=10)|Q(pid__ge=10)&nbsp;&nbsp;(id &gt; 10) OR (pid &gt; 10)</p><p><b><span style="font-size: large">条件搜索:</span></b><br />order_by()&nbsp;&nbsp;&nbsp;&nbsp;排序<br />distinct()&nbsp;&nbsp;&nbsp;&nbsp;消除重复结果<br />id__gt=10&nbsp;&nbsp;&nbsp;&nbsp;id &gt;&nbsp; 10<br />id__gte=10&nbsp;&nbsp;&nbsp;&nbsp;id &gt;= 10<br />id__lt=10&nbsp;&nbsp;&nbsp;&nbsp;id &lt;&nbsp; 10<br />id__lte=10&nbsp;&nbsp;&nbsp;&nbsp;id &lt;= 10<br />id__startswith='xx'&nbsp;&nbsp;&nbsp;id like 'xx%'<br />id__istartswith='xx'&nbsp;&nbsp;&nbsp;id ILIKE 'xx%'<br />id__endswith='xx'&nbsp;&nbsp;&nbsp;id LIKE '%xx'<br />id__iendswith='xx'&nbsp;&nbsp;&nbsp;id ILIKE '%xx'<br />id__exact='xx'&nbsp;&nbsp;&nbsp;&nbsp;id LIKE 'xx'<br />id__iexact='xx'&nbsp;&nbsp;&nbsp;&nbsp;id ILIKE 'xx'<br />id__contains='xx'&nbsp;&nbsp;&nbsp;id LIKE '%xx%'<br />id__icontains='xx'&nbsp;&nbsp;&nbsp;id ILIKE '%xx%'<br />id__in=[1, 3, 4]&nbsp;&nbsp;&nbsp;id IN (1, 3, 4)<br />id__exact=14&nbsp;&nbsp;&nbsp;&nbsp;id = 14<br />id__exact=None&nbsp;&nbsp;&nbsp;&nbsp;id IS NULL<br />id__isnull=Ture&nbsp;&nbsp;&nbsp;&nbsp;id IS NULL<br />start_date = datetime.date(2005, 1, 1)<br />end_date = datetime.date(2005, 3, 31)<br />id__range=(start_date, end_date)&nbsp;id BETWEEN '2005-01-01' and '2005-03-31';<br />id__year=2009&nbsp;&nbsp;&nbsp;&nbsp;EXTRACT('year' FROM id) = '2009'<br />id__iregex=r'^(an?|the) +'&nbsp;&nbsp;id REGEXP '^(an?|the) +'</p><p><br /><span style="font-size: large"><b>返回结果数量限制:</b></span><br />Entry.objects.all()[:5]&nbsp;&nbsp;&nbsp;LIMIT 5<br />Entry.objects.all()[5:10]&nbsp;&nbsp;OFFSET 5 LIMIT 5<br />Entry.objects.all()[:10:2]&nbsp;&nbsp;step 2<br />Entry.objects.order_by('headline')[0]&nbsp;LIMIT 1</p><p><br /><span style="font-size: large"><b>数据操作:</b></span><br />.delete()&nbsp;&nbsp;&nbsp;&nbsp;删除<br />.save()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;更新<br />.count()&nbsp;&nbsp;&nbsp;&nbsp;结果数量</p><p>&nbsp;</p><p><span style="font-size: large"><b>容错处理:</b></span></p><p>from django.core.exceptions import ObjectDoesNotExist<br />try:<br />&nbsp;e = Entry.objects.get(id=3)<br />except ObjectDoesNotExist:<br />&nbsp;print &quot;Either the entry doesn't exist.&quot;</p><p><br />try:<br />&nbsp;&nbsp;&nbsp; obj = Person.objects.get(first_name='John', last_name='Lennon')<br />except Person.DoesNotExist:<br />&nbsp;&nbsp;&nbsp; obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))<br />&nbsp;&nbsp;&nbsp; obj.save()<br />&nbsp;</p>]]></description><category>日记?周记?年记?</category><comments>http://blog.bigcomic.com/post/265.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=265</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=265&amp;key=9026b9db</trackback:ping></item><item><title>centos5.2下编译安装lighttpd,python2.5,django1.0.2,mysql5.2</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/264.html</link><pubDate>Sun, 28 Dec 2008 21:24:26 +0800</pubDate><guid>http://blog.bigcomic.com/post/264.html</guid><description><![CDATA[<p>mysql<br /># tar zxvf mysql-5.1.30.tar.gz<br /># cd mysql-5.1.30<br /># ./configure --prefix=/usr/local/mysql --enable-thread-safe --enable-assembler --enable-shared --with-charset=utf8 --with-</p><p>collation=utf8_general_ci --with-mysqld-ldflags=-all-static --without-debug<br /># make &amp;&amp; make install<br /># cp /usr/src/mysql-5.1.30/support-files/mysql.server /etc/rc.d/init.d/mysqld<br /># chmod 755 /etc/rc.d/init.d/mysqld<br /># chkconfig --add mysqld<br /># chkconfig --level 345 mysqld on<br /># cp support-files/my-medium.cnf /etc/my.cnf<br /># vi /etc/my.cnf<br />&nbsp; - skip-federated<br />&nbsp; + #skip-federated<br /># ./scripts/mysql_install_db<br /># cd /usr/local<br /># groupadd database<br /># adduser mysql -G database<br /># vi /etc/passwd<br />&nbsp; - mysql:x:500:501::/home/mysql:/bin/bash<br />&nbsp; + mysql:x:500:501::/home/mysql:/sbin/nologin<br /># chmod 750 mysql -R <br /># chgrp database mysql -R<br /># chown mysql mysql/var -R<br /># ln -s /usr/local/mysql/bin/mysql /sbin/mysql<br /># ln -s /usr/local/mysql/bin/mysqladmin /sbin/mysqladmin<br /># ln -s /usr/local/mysql/bin/mysql_config /sbin/mysql_config<br /># service mysqld start</p><p>&nbsp;</p><p><br />Python<br /># tar zxvf Python-2.5.2.tgz<br /># cd Python-2.5.2<br /># ./configure --prefix=/usr/local/python<br /># make &amp;&amp; make install<br /># ln -s /usr/local/python/bin/python /usr/bin/python<br /># ln -s /usr/local/python/lib/python2.5 /usr/lib/python2.5</p><p>MySQL-python<br /># tar zxvf MySQL-python-1.2.2.tar.gz<br /># cd MySQL-python-1.2.2<br /># python setup.py install<br /># ln -s /usr/local/mysql/lib/mysql/libmysqlclient_r.so.16 /usr/lib/libmysqlclient_r.so.16<br /># python<br />&gt;&gt;&gt; import MySQLdb&nbsp;/检验mysql-python安装是否正确<br />&nbsp;</p><p><br />Django<br /># tar xzvf Django-1.0.2-final.tar.gz<br /># cd Django-1.0.2-final<br /># python setup.py install</p><p>&nbsp;</p><p><br />pcre<br /># tar zxvf pcre-7.8.tar.gz<br /># cd pcre-7.8<br /># ./configure<br /># make &amp;&amp; make install</p><p>lighttpd<br /># tar xzvf lighttpd-1.4.20.tar.gz<br /># cd lighttpd-1.4.20<br /># ./configure --prefix=/usr/local/lighttpd --disable-ipv6 --with-linux-aio&nbsp; --without-bzip2<br /># make &amp;&amp; make install<br /># mkdir /usr/local/lighttpd/conf<br /># mkdir /usr/local/lighttpd/logs<br /># cp doc/lighttpd.conf /usr/local/lighttpd/conf/<br /># vi /usr/local/lighttpd/conf/lighttpd.conf<br />&nbsp; @ server.document-root<br />&nbsp; @ server.errorlog<br />&nbsp; @ index-file.names<br />&nbsp; @ accesslog.filename<br /># cp doc/rc.lighttpd.redhat /etc/rc.d/init.d/lighttpd<br /># chmod 755 /etc/rc.d/init.d/lighttpd<br /># vi /etc/rc.d/init.d/lighttpd<br />&nbsp; - LIGHTTPD_CONF_PATH=&quot;/etc/lighttpd/lighttpd.conf&quot;<br />&nbsp; + LIGHTTPD_CONF_PATH=&quot;/usr/local/lighttpd/conf/lighttpd.conf&quot;<br /># chkconfig --add lighttpd<br /># chkconfig --level 345 lighttpd on</p><p>&nbsp; <br />python-flup<br /># tar zxvf flup-1.0.1.tar.gz<br /># cd flup-1.0.1<br /># python ez_setup.py<br /># python setup.py install</p><p>&nbsp;</p><p># &nbsp;<br /># vi settings.py<br />&nbsp; + FORCE_SCRIPT_NAME = &quot;&quot;</p><p># vi /usr/local/lighttpd/conf/lighttpd.conf<br />&nbsp; - # mod_rewrite<br />&nbsp; + mod_rewrite<br />&nbsp; - # mod_fastcgi<br />&nbsp; + mod_fastcgi<br />&nbsp; + fastcgi.server = ( &quot;/mysite.fcgi&quot; =&gt;<br />&nbsp; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( &quot;main&quot; =&gt;<br />&nbsp; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( &quot;socket&quot; =&gt; &quot;/tmp/fcgi.sock&quot;,<br />&nbsp; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;check-local&quot; =&gt; &quot;disable&quot;,<br />&nbsp; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />&nbsp; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br />&nbsp; + )&nbsp; <br />&nbsp; + url.rewrite = (<br />&nbsp; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;^(/media.*)$&quot; =&gt; &quot;$1&quot;,<br />&nbsp; +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;^(/.*)$&quot; =&gt; &quot;/mysite.fcgi$1&quot;,<br />&nbsp; + )</p><p><br /># service lighttpd restart</p><p>&nbsp;</p><p>&nbsp;</p><p>#server.document-root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = &quot;/home/radio/htdocs/&quot;<br />server.document-root = &quot;/home/radio/workspace/pywork/bigcomic/&quot;</p><p>&nbsp;&nbsp;&nbsp;&nbsp; &quot;^(/media.*)$&quot; =&gt; &quot;$1&quot;,<br />&nbsp;&nbsp;&nbsp;&nbsp; &quot;^(/.*)$&quot; =&gt; &quot;/mysite.fcgi$1&quot;,</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p><br />&nbsp;</p>]]></description><category>日记?周记?年记?</category><comments>http://blog.bigcomic.com/post/264.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=264</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=264&amp;key=5999024e</trackback:ping></item><item><title>svn 1.50 编译安装</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/263.html</link><pubDate>Sun, 28 Dec 2008 21:15:06 +0800</pubDate><guid>http://blog.bigcomic.com/post/263.html</guid><description><![CDATA[<p>下载subversion-1.5.0.tar和subversion-deps-1.5.0.tar<br /># tar xvf subversion-1.5.0.tar&nbsp;<br /># tar xvf subversion-deps-1.5.0.tar&nbsp;//会解到一个subversion-1.5.0目录下<br /># cd subversion-1.5.0<br /># ./configure -prefix=/usr/local/svn <br /># make<br /># make install<br /># mkdir /home/svndata&nbsp;//建立项目的存储库<br /># vi svn_service<br />#!/bin/sh</p><p>#<br /># chkconfig: - 91 35<br /># description: Starts and stops the Subversion service<br /># subversion options</p><p>OPTIONS=&quot;-d -r /home/svndata&quot;</p><p>prog=_subversion<br />RETVAL=0<br />_subversion=/usr/bin/svnserve</p><p># Source function library.</p><p>. /etc/rc.d/init.d/functions</p><p># Source networking configuration.</p><p>. /etc/sysconfig/network</p><p>start() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KIND=&quot;SubVersion&quot;<br />&nbsp;&nbsp;&nbsp; echo -n $&quot;Starting $KIND services: &quot;<br />&nbsp;&nbsp;&nbsp; daemon $_subversion $OPTIONS<br />&nbsp;&nbsp;&nbsp; RETVAL=$?<br />&nbsp;&nbsp;&nbsp; echo<br />&nbsp;&nbsp;&nbsp; [ $RETVAL -eq 0 ] &amp;&amp; touch /var/lock/subsys/subversion || \<br />&nbsp;&nbsp;&nbsp;&nbsp; RETVAL=1<br />&nbsp;&nbsp;&nbsp; return $RETVAL<br />}&nbsp;&nbsp;&nbsp;</p><p>stop() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KIND=&quot;SubVersion&quot;<br />&nbsp;&nbsp;&nbsp; echo -n $&quot;Shutting down $KIND services: &quot;<br />&nbsp;&nbsp;&nbsp; killproc $_subversion<br />&nbsp;&nbsp;&nbsp; RETVAL=$?<br />&nbsp;&nbsp;&nbsp; [ $RETVAL -eq 0 ] &amp;&amp; rm -f /var/lock/subsys/subversion<br />&nbsp;&nbsp;&nbsp; echo &quot;&quot;<br />&nbsp;&nbsp;&nbsp; return $RETVAL<br />}&nbsp;&nbsp;&nbsp;</p><p>restart() {<br />&nbsp;&nbsp;&nbsp; stop<br />&nbsp;&nbsp;&nbsp; start<br />}&nbsp;&nbsp;&nbsp;</p><p>case &quot;$1&quot; in<br />&nbsp; start)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start<br />&nbsp;&nbsp;&nbsp; ;;<br />&nbsp; stop)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stop<br />&nbsp;&nbsp;&nbsp; ;;<br />&nbsp; restart|reload)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; restart<br />&nbsp;&nbsp;&nbsp; ;;<br />&nbsp; status)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; status $dc_server<br />&nbsp;&nbsp;&nbsp; RETVAL=$?<br />&nbsp;&nbsp;&nbsp; ;;<br />&nbsp; condrestart)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [ -f /var/lock/subsys/subversion ] &amp;&amp; restart || :<br />&nbsp;&nbsp;&nbsp; ;;<br />&nbsp; *)<br />&nbsp;&nbsp;&nbsp; echo $&quot;Usage: $0 {start|stop|restart|reload|status|condrestart}&quot;<br />&nbsp;&nbsp;&nbsp; exit 1<br />esac</p><p>exit $?</p><p># chmod 755 svn_service<br /># cp svn_service /etc/rc.d/init.d/svn<br /># chkconfig --add svn<br /># chkconfig --level 345 svn on<br /># netstat -an|grep 3690&nbsp;&nbsp;//查看svn的端口是否已经开启，没记错的话应该就是3690端口<br />可以使用绿毛龟（svn客户端）来查看项目情况，使用svn://ip:port/test来查看项目源码</p><p>&nbsp;</p><p>配置<br />#cd /home/svndata/test/conf<br />#vi authz<br />&nbsp;[groups]对组进行配置<br />&nbsp;# harry_and_sally = harry,sally</p><p>&nbsp;# [/foo/bar]按目录进行用户读写配置<br />&nbsp;# harry = rw<br />&nbsp;# * =</p><p>&nbsp;[repository:/test]对svn库的路径进行配置<br />&nbsp;# @harry_and_sally = rw<br />&nbsp;# * = r<br />&nbsp;radio=rw<br />&nbsp;pencat=rw<br />&nbsp;koala=rw<br />&nbsp;soul=rw<br />#vi passwd<br />&nbsp;[users]<br />&nbsp;# harry = harryssecret<br />&nbsp;# sally = sallyssecret<br />&nbsp;radio=123456<br />&nbsp;都是明文的<br />#vi svnserv.conf<br />password-db = passwd将这行的注释去掉，就会要求用户验证</p><p>svn换端口<br />#./svnserve --help 可以看到命令，里面有个参数--listen-port<br />不过我没有使用过</p><p><br />因为ssl关系出现认证失败的解决办法<br />1、停掉ssl<br />2、# authz-db = authz这行的#保留</p><p>#去掉#[general]前面的#号<br />[general]<br />#匿名访问的权限，可以是read,write,none,默认为read<br />anon-access = none<br />#认证用户的权限，可以是read,write,none,默认为write<br />auth-access = write<br />#密码数据库的路径，去掉前面的#<br />password-db = passwd</p>]]></description><category>日记?周记?年记?</category><comments>http://blog.bigcomic.com/post/263.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=263</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=263&amp;key=d6f22efc</trackback:ping></item><item><title>Centos5.2下mysql5 编译安装</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/262.html</link><pubDate>Sun, 28 Dec 2008 21:11:17 +0800</pubDate><guid>http://blog.bigcomic.com/post/262.html</guid><description><![CDATA[<p># tar zxvf mysql-5.1.30.tar.gz<br /># cd mysql-5.1.30<br /># ./configure --prefix=/usr/local/mysql --with-charset=utf8 --with-collation=utf8_general_ci</p><p>./configure --prefix=/usr/local/mysql --enable-thread-safe --enable-assembler --enable-shared --with-charset=utf8 --with-collation=utf8_general_ci --with-mysqld-ldflags=-all-static --without-debug</p><p># make &amp;&amp; make install<br /># .......漫长的等待<br /># cp /usr/src/mysql-5.1.30/support-files/mysql.server /etc/rc.d/init.d/mysqld<br /># chmod 755 /etc/rc.d/init.d/mysqld<br /># chkconfig --add mysqld<br /># chkconfig --level 345 mysqld on<br /># cp support-files/my-medium.cnf /etc/my.cnf<br /># vi /etc/my.cnf<br />&nbsp; - skip-federated<br />&nbsp; + #skip-federated<br /># ./scripts/mysql_install_db<br /># cd /usr/local<br /># groupadd mysql_g<br /># adduser mysql -G mysql_g<br /># vi /etc/passwd<br />&nbsp; - mysql:x:500:501::/home/mysql:/bin/bash<br />&nbsp; + mysql:x:500:501::/home/mysql:/sbin/nologin<br /># chmod 750 mysql -R <br /># chgrp_g mysql mysql -R<br /># chown mysql mysql/var -R<br /># ln -s /usr/local/mysql/bin/mysql /sbin/mysql<br /># ln -s /usr/local/mysql/bin/mysqladmin /sbin/mysqladmin<br /># ln -s /usr/local/mysql/bin/mysql_config /sbin/mysql_config<br /># service mysqld start</p>]]></description><category>日记?周记?年记?</category><comments>http://blog.bigcomic.com/post/262.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=262</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=262&amp;key=fc61249f</trackback:ping></item><item><title>IT时代的婚礼</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/261.html</link><pubDate>Wed, 17 Dec 2008 21:48:10 +0800</pubDate><guid>http://blog.bigcomic.com/post/261.html</guid><description><![CDATA[<p>一搞IT多年的哥们终于结婚了,&nbsp; 没有传统的请贴, 而是发了个URL过来.&nbsp; 打开之后赫然发现4个大字， 在线报名.........</p><p>&nbsp;<a href="http://www.2008-12-27.com/">http://www.2008-12-27.com/</a></p><p>&nbsp;</p><p>&nbsp;</p>]]></description><category>日记?周记?年记?</category><comments>http://blog.bigcomic.com/post/261.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=261</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=261&amp;key=0d11830b</trackback:ping></item><item><title>奶油蛤蜊蘑菇汤</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/260.html</link><pubDate>Sun, 14 Dec 2008 17:09:58 +0800</pubDate><guid>http://blog.bigcomic.com/post/260.html</guid><description><![CDATA[<p><strong>材料:</strong>  <p>高汤(鸡汤) 、蛤蜊、黄油、奶油（或鲜奶）、口蘑、面粉  <p>&nbsp; <p><strong>做法：</strong>  <p>1. 蘑菇洗好、切片、抄一下。  <p>2. 蛤蜊抄一下。一定要处理好沙子，否则影响汤的口感。  <p>3. 把黄油放入锅中，完全化开之后放入面粉。 翻炒至金黄。 炒好之后呈面糊状。 盛出待用  <p>4. 高汤中加入蘑菇、蛤蜊大火3分钟。  <p>5. 加入制好的面酱。  <p>6. 文火搅拌10分钟。  <p>完成.&nbsp; 口感和比胜客的蘑菇汤味道一样.&nbsp; <p>&nbsp; <p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="484" alt="奶油蛤蜊蘑菇汤" src="http://blog.bigcomic.com/upload/c3619a6aa571_F16A/95a8aa11f88e.jpg" width="644" border="0">]]></description><category>美味多得</category><comments>http://blog.bigcomic.com/post/260.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=260</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=260&amp;key=5a8908ca</trackback:ping></item><item><title>用mysqlslap进行MySQL压力测试</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/258.html</link><pubDate>Fri, 05 Dec 2008 14:30:30 +0800</pubDate><guid>http://blog.bigcomic.com/post/258.html</guid><description><![CDATA[<blockquote> <p>–auto-generate-sql, -a<br>自动生成测试表和数据 <p>–auto-generate-sql-load-type=type<br>测试语句的类型。取值包括：read，key，write，update和mixed(默认)。 <p>–number-char-cols=N, -x N<br>自动生成的测试表中包含多少个字符类型的列，默认1 <p>–number-int-cols=N, -y N<br>自动生成的测试表中包含多少个数字类型的列，默认1 <p>–number-of-queries=N<br>总的测试查询次数 <p>–query=name,-q<br>使用自定义脚本执行测试，例如可以调用自定义的一个存储过程或者sql语句来执行测试。 <p>–create-schema<br>测试的schema，MySQL中schema也就是database <p>–commint=N<br>多少条DML后提交一次 <p>–compress, -C<br>如果服务器和客户端支持都压缩，则压缩信息传递 <p>–concurrency=N, -c N<br>并发量，也就是模拟多少个客户端同时执行select。可指定多个值，以逗号或者–delimiter参数指定的值做为分隔符 <p>–engine=engine_name, -e engine_name<br>创建测试表所使用的存储引擎，可指定多个 <p>–iterations=N, -i N<br>测试执行的迭代次数 <p>–detach=N<br>执行N条语句后断开重连 <p>–debug-info, -T<br>打印内存和CPU的信息 <p>–only-print<br>只打印测试语句而不实际执行 <p>测试的过程需要生成测试表，插入测试数据，这个mysqlslap可以自动生成，默认生成一个mysqlslap的schema，如果已经存在则先 删除，这里要注意了，不要用–create-schema指定已经存在的库，否则后果可能很严重。可以用–only-print来打印实际的测试过程： <p>$mysqlslap -a --only-print<br>DROP SCHEMA IF EXISTS `mysqlslap`;<br>CREATE SCHEMA `mysqlslap`;<br>use mysqlslap;<br>CREATE TABLE `t1` (intcol1 INT(32) ,charcol1 VARCHAR(128));<br>INSERT INTO t1 VALUES (1804289383,'mxvtvmC9127qJNm06sGB8R92q2j7vTiiITRDGXM9ZLzkdekbWtmXKwZ2qG1llkRw5m9DHOFilEREk3q7oce8O3BEJC0woJsm6uzFAEynLH2xCsw1KQ1lT4zg9rdxBL');<br>...<br>SELECT intcol1,charcol1 FROM t1;<br>INSERT INTO t1 VALUES (364531492,'qMa5SuKo4M5OM7ldvisSc6WK9rsG9E8sSixocHdgfa5uiiNTGFxkDJ4EAwWC2e4NL1BpAgWiFRcp1zIH6F1BayPdmwphatwnmzdwgzWnQ6SRxmcvtd6JRYwEKdvuWr');<br>DROP SCHEMA IF EXISTS `mysqlslap`; <p>可以看到最后由删除一开始创建的schema的动作，整个测试完成后不会在数据库中留下痕迹。假如我们执行一次测试，分别50和100个并发，执行1000次总查询，那么： <p>$mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --debug-info<br>Benchmark<br>Average number of seconds to run all queries: 0.375 seconds<br>Minimum number of seconds to run all queries: 0.375 seconds<br>Maximum number of seconds to run all queries: 0.375 seconds<br>Number of clients running queries: 50<br>Average number of queries per client: 20<br>Benchmark<br>Average number of seconds to run all queries: 0.453 seconds<br>Minimum number of seconds to run all queries: 0.453 seconds<br>Maximum number of seconds to run all queries: 0.453 seconds<br>Number of clients running queries: 100<br>Average number of queries per client: 10<br>User time 0.29, System time 0.11<br>Maximum resident set size 0, Integral resident set size 0<br>Non-physical pagefaults 4032, Physical pagefaults 0, Swaps 0<br>Blocks in 0 out 0, Messages in 0 out 0, Signals 0<br>Voluntary context switches 7319, Involuntary context switches 681 <p>上结果可以看出，50和100个并发分别得到一次测试结果(Benchmark)，并发数越多，执行完所有查询的时间越长。为了准确起见，可以多迭代测试几次: <p>$ mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --debug-info <br>Benchmark<br>Average number of seconds to run all queries: 0.380 seconds<br>Minimum number of seconds to run all queries: 0.377 seconds<br>Maximum number of seconds to run all queries: 0.385 seconds<br>Number of clients running queries: 50<br>Average number of queries per client: 20<br>Benchmark<br>Average number of seconds to run all queries: 0.447 seconds<br>Minimum number of seconds to run all queries: 0.444 seconds<br>Maximum number of seconds to run all queries: 0.451 seconds<br>Number of clients running queries: 100<br>Average number of queries per client: 10<br>User time 1.44, System time 0.67<br>Maximum resident set size 0, Integral resident set size 0<br>Non-physical pagefaults 17922, Physical pagefaults 0, Swaps 0<br>Blocks in 0 out 0, Messages in 0 out 0, Signals 0<br>Voluntary context switches 36796, Involuntary context switches 4093 <p>测试同时不同的存储引擎的性能进行对比： <p>$ mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --engine=myisam,innodbmysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --engine=myisam,innodb --debug-info<br>Benchmark<br>Running for engine myisam<br>Average number of seconds to run all queries: 0.200 seconds<br>Minimum number of seconds to run all queries: 0.188 seconds<br>Maximum number of seconds to run all queries: 0.210 seconds<br>Number of clients running queries: 50<br>Average number of queries per client: 20<br>Benchmark<br>Running for engine myisam<br>Average number of seconds to run all queries: 0.238 seconds<br>Minimum number of seconds to run all queries: 0.228 seconds<br>Maximum number of seconds to run all queries: 0.251 seconds<br>Number of clients running queries: 100<br>Average number of queries per client: 10<br>Benchmark<br>Running for engine innodb<br>Average number of seconds to run all queries: 0.375 seconds<br>Minimum number of seconds to run all queries: 0.370 seconds<br>Maximum number of seconds to run all queries: 0.379 seconds<br>Number of clients running queries: 50<br>Average number of queries per client: 20<br>Benchmark<br>Running for engine innodb<br>Average number of seconds to run all queries: 0.443 seconds<br>Minimum number of seconds to run all queries: 0.440 seconds<br>Maximum number of seconds to run all queries: 0.447 seconds<br>Number of clients running queries: 100<br>Average number of queries per client: 10<br>User time 2.83, System time 1.66<br>Maximum resident set size 0, Integral resident set size 0<br>Non-physical pagefaults 34692, Physical pagefaults 0, Swaps 0<br>Blocks in 0 out 0, Messages in 0 out 0, Signals 0<br>Voluntary context switches 87306, Involuntary context switches 10326</p></blockquote>]]></description><category>文档</category><comments>http://blog.bigcomic.com/post/258.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=258</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=258&amp;key=a360e8f9</trackback:ping></item><item><title>使用MySQL Proxy和MySQL Replication实现读写分离</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/256.html</link><pubDate>Fri, 05 Dec 2008 00:22:16 +0800</pubDate><guid>http://blog.bigcomic.com/post/256.html</guid><description><![CDATA[<p align="center"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="Sakila_proxy_256x298" src="http://blog.bigcomic.com/upload/MySQLProxyMySQLReplication_537/Sakila_proxy_256x298.jpg" width="210" border="0"></p> <p>&nbsp;</p> <p>MySQL Replication可以将master的数据复制分布到多个slave上，然后可以利用slave来分担master的读压力。那么对于前台应用来说，就要考虑如何将读的压力分布到多个slave上。如果每个应用都需要来实现读写分离的算法，一则成本太高，二来如果slave增加更多的机器，应用就要随之修改。明显的，如果在应用和数据库间加一个专门用于实现读写分离的中间层，则整个系统的架构拥有更好的扩展性。MySQL Proxy就是这么一个中间层代理，简单的说，MySQL Proxy就是一个连接池，负责将前台应用的连接请求转发给后台的数据库，并且通过使用<a href="http://www.lua.org/">lua脚本</a>，可以实现复杂的连接控制和过滤，从而实现读写分离和负载平衡。对于应用来说，MySQL Proxy是完全透明的，应用则只需要连接到MySQL Proxy的监听端口即可。当然，这样proxy机器可能成为单点失效，但完全可以使用多个proxy机器做为冗余，在应用服务器的连接池配置中配置到多个proxy的连接参数即可。 </p> <p>&nbsp;</p> <p><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="254" alt="transaction" src="http://blog.bigcomic.com/upload/MySQLProxyMySQLReplication_537/transaction_thumb.png" width="527" border="0">  <p>&nbsp; <p><a href="http://forge.mysql.com/wiki/MySQL_Proxy">MySQL Proxy</a>是2007年6月由<a href="http://jan.kneschke.de/">Jan Kneschke</a>发布的一个项目，基于GPL，目前还处于Alpha测试阶段，最新版本0.6.1，可以从<a href="http://dev.mysql.com/downloads/mysql-proxy/">这里下载</a>。使用MySQL Proxy需要MySQL 5.0.x以上版本，详细的安装使用手册可以参考<a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-proxy.html">MySQL 5.1手册第27章</a>。  <p>mysql-proxy --help-all<br>Usage:<br>&nbsp; mysql-proxy.exe [OPTION...] - MySQL Proxy<br>Help Options:<br>&nbsp; -?, --help&nbsp;&nbsp;&nbsp;&nbsp; Show help options<br>&nbsp; --help-all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Show all help options<br>&nbsp; --help-admin&nbsp;&nbsp;&nbsp; Show options for the admin-module<br>&nbsp; --help-proxy&nbsp;&nbsp;&nbsp; Show options for the proxy-module<br>admin module<br>&nbsp; --admin-address=&lt;host:port&gt;&nbsp;&nbsp; listening address:port of internal admin-server (default:4041)<br>proxy-module<br>&nbsp; --proxy-address=&lt;host:port&gt;&nbsp;&nbsp; listening address:port of the proxy-server (default:4040)<br>&nbsp; --proxy-read-only-backend-addresses=&lt;host:port&gt;&nbsp; address:port of the remote slave-server (default: not set)<br>&nbsp; --proxy-backend-addresses=&lt;host:port&gt;&nbsp;&nbsp; address:port of the remote backend-servers (default: 127.0.0.1:3306)<br>&nbsp; --proxy-skip-profiling&nbsp; disables profiling of queries (default: enabled)<br>&nbsp; --proxy-fix-bug-25371&nbsp; fix bug #25371 (mysqld &gt; 5.1.12) for older libmysql versions<br>&nbsp; --proxy-lua-script=&lt;file&gt;&nbsp;&nbsp; filename of the lua script (default: not set)<br>&nbsp; --no-proxy&nbsp;&nbsp;&nbsp;&nbsp; Don't start proxy-server<br>Application Options:<br>&nbsp; -V, --version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Show version<br>&nbsp; --daemon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Start in daemon-mode<br>&nbsp; --pid-file=&lt;file&gt;&nbsp;&nbsp;&nbsp; PID file in case we are started as daemon</p>]]></description><category>开发随笔</category><comments>http://blog.bigcomic.com/post/256.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=256</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=256&amp;key=85789088</trackback:ping></item><item><title>DRBD笔记</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/251.html</link><pubDate>Thu, 04 Dec 2008 23:57:19 +0800</pubDate><guid>http://blog.bigcomic.com/post/251.html</guid><description><![CDATA[<p></p> <p>一、主要功能 <p>&nbsp;&nbsp;&nbsp; DRBD实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之中。他是有内核模块和相关程序而组成，通过网络通信来同步镜像整个设备，有点类似于一个网络RAID的功能。也就是说当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上，并以完全相同的形式记录在一个文件系统中（实际上文件系统的创建也是由DRBD的同步来实现的）。本地节点（主机）与远程节点（主机）的数据可以保证实时的同步，并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用，以达到高可用的目的。 <p>&nbsp;&nbsp;&nbsp; 在高可用(HA)解决方案中使用DRBD的功能,可以代替使用一个共享盘阵存储设备。因为数据同时存在于本地主机和远程主机上,在遇到需要切换的时候,远程主机只需要使用它上面的那份备份数据,就可以继续提供服务了。 <p>二、底层设备支持 <p>&nbsp;&nbsp;&nbsp; DRBD需要构建在底层设备之上，然后构建出一个块设备出来。对于用户来说，一个DRBD设备，就像是一块物理的磁盘，可以在商脉内创建文件系统。DRBD所支持的底层设备有以下这些类： <p>&nbsp;&nbsp;&nbsp; 1、一个磁盘，或者是磁盘的某一个分区； <p>&nbsp;&nbsp;&nbsp; 2、一个soft raid 设备； <p>&nbsp;&nbsp;&nbsp; 3、一个LVM的逻辑卷； <p>&nbsp;&nbsp;&nbsp; 4、一个EVMS（Enterprise Volume Management System，企业卷管理系统）的卷； <p>&nbsp;&nbsp;&nbsp; 5、其他任何的块设备。 <p>三、配置简介 <p>&nbsp;&nbsp;&nbsp; 1、全局配置项（global） <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基本上我们可以做的也就是配置usage-count是yes还是no了，usage-count参数其实只是为了让linbit公司收集目前drbd的使用情况。当drbd在安装和升级的时候会通过http协议发送信息到linbit公司的服务器上面。 <p>&nbsp;&nbsp;&nbsp; 2、公共配置项（common） <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里的common，指的是drbd所管理的多个资源之间的common。配置项里面主要是配置drbd的所有resource可以设置为相同的参数项，比如protocol，syncer等等。 <p>&nbsp;&nbsp;&nbsp; 3、资源配置项（resource） <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resource项中配置的是drbd所管理的所有资源，包括节点的ip信息，底层存储设备名称，设备大小，meta信息存放方式，drbd对外提供的设备名等等。每一个resource中都需要配置在每一个节点的信息，而不是单独本节点的信息。实际上，在drbd的整个集群中，每一个节点上面的drbd.conf文件需要是完全一致的。 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外，resource还有很多其他的内部配置项： <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; net：网络配置相关的内容，可以设置是否允许双主节点（allow-two-primaries）等。 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; startup：启动时候的相关设置，比如设置启动后谁作为primary（或者两者都是primary：become-primary-on both） <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; syncer：同步相关的设置。可以设置“重新”同步（re-synchronization）速度（rate）设置，也可以设置是否在线校验节点之间的数据一致性（verify-alg 检测算法有md5，sha1以及crc32等）。数据校验可能是一个比较重要的事情，在打开在线校验功能后，我们可以通过相关命令（drbdadm verify resource_name）来启动在线校验。在校验过程中，drbd会记录下节点之间不一致的block，但是不会阻塞任何行为，即使是在该不一致的block上面的io请求。当不一致的block发生后，drbd就需要有re-synchronization动作，而syncer里面设置的rate项，主要就是用于re-synchronization的时候，因为如果有大量不一致的数据的时候，我们不可能将所有带宽都分配给drbd做re-synchronization，这样会影响对外提提供服务。rate的设置和还需要考虑IO能力的影响。如果我们会有一个千兆网络出口，但是我们的磁盘IO能力每秒只有50M，那么实际的处理能力就只有50M，一般来说，设置网络IO能力和磁盘IO能力中最小者的30%的带宽给re-synchronization是比较合适的（官方说明）。另外，drbd还提供了一个临时的rate更改命令，可以临时性的更改syncer的rate值：drbdsetup /dev/drbd0 syncer -r 100M。这样就临时的设置了re-synchronization的速度为100M。不过在re-synchronization结束之后，你需要通过drbdadm adjust resource_name 来让drbd按照配置中的rate来工作。 <p>五、资源管理 <p>&nbsp;&nbsp;&nbsp; 1、增加resource的大小： <p>&nbsp;&nbsp;&nbsp; 当遇到我们的drbd resource设备容量不够的时候，而且我们的底层设备支持在线增大容量的时候（比如使用lvm的情况下），我们可以先增大底层设备的大小，然后再通过drbdadm resize resource_name来实现对resource的扩容。但是这里有一点需要注意的就是只有在单primary模式下可以这样做，而且需要先在所有节点上都增大底层设备的容量。然后仅在primary节点上执行resize命令。在执行了resize命令后，将触发一次当前primary节点到其他所有secondary节点的re-synchronization。 <p>&nbsp;&nbsp;&nbsp; 如果我们在drbd非工作状态下对底层设备进行了扩容，然后再启动drbd，将不需要执行resize命令（当然前提是在配置文件中没有对disk参数项指定大小），drbd自己会知道已经增大了容量。 <p>&nbsp;&nbsp;&nbsp; 在进行底层设备的增容操作的时候千万不要修改到原设备上面的数据，尤其是drbd的meta信息，否则有可能毁掉所有数据。 <p>&nbsp;&nbsp;&nbsp; 2、收缩resource容量： <p>&nbsp;&nbsp;&nbsp; 容量收缩比扩容操作要危险得多，因为该操作更容易造成数据丢失。在收缩resource的容量之前，必须先收缩drbd设备之上的容量，也就是文件系统的大小。如果上层文件系统不支持收缩，那么resource也没办法收缩容量。 <p>&nbsp;&nbsp;&nbsp; 如果在配置drbd的时候将meta信息配置成internal的，那么在进行容量收缩的时候，千万别只计算自身数据所需要的空间大小，还要将drbd的meta信息所需要的空间大小加上。 <p>&nbsp;&nbsp;&nbsp; 当文件系统收缩好以后，就可以在线通过以下命令来重设resource的大小：drbdadm — –size=***G resize resource_name。在收缩的resource的大小之后，你就可以自行收缩释放底层设备空间（如果支持的话）。 <p>&nbsp;&nbsp;&nbsp; 如果打算停机状态下收缩容量，可以通过以下步骤进行： <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a、在线收缩文件系统 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b、停用drbd的resource：drbdadm down resourcec_name <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c、导出drbd的metadata信息（在所有节点都需要进行）：drbdadm dump-md resource_name &gt; /path_you_want_to_save/file_name <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d、在所有节点收缩底层设备 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e、更改上面dump出来的meta信息的la-size-sect项到收缩后的大小（是换算成sector的数量后的数值） <p>f、如果使用的是internal来配置meta-data信息，则需要重新创建meta-data:drbdadm create-md resource_name <p>g、将之前导出并修改好的meta信息重新导入drbd（摘录自linbit官方网站的一段导入代码）： <p>&nbsp;&nbsp;&nbsp; drbdmeta_cmd=$(drbdadm -d dump-md test-disk) <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${drbdmeta_cmd/dump-md/restore-md} /path_you_want_to_save/file_name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h、启动resource：drbdadm up resource_name <p>六、磁盘损坏 <p>&nbsp;&nbsp;&nbsp; 1、detach resource <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果在resource的disk配置项中配置了on_io_error为pass_on的话，那么drbd在遇到磁盘损坏后不会自己detach底层设备。也就是说需要我们手动执行detach的命令（drbdadm detach resource_name），然后再查看当前各节点的ds信息。可以通过cat /proc/drbd来查看，也可以通过专有命令来查看：drbdadm dstat resource_name。当发现损坏的那方已经是Diskless后，即可。如果我们没有配置on_io_error或者配置成detach的话，那么上面的操作将会由自动进行。 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外，如果磁盘损坏的节点是当前主节点，那么我们需要进行节点切换的操作后再进行上面的操作。 <p>&nbsp;&nbsp;&nbsp; 2、更换磁盘 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当detach了resource之后，就是更换磁盘了。如果我们使用的是internal的meta-data，那么在换好磁盘后，只需要重新创建mata-data（drbdadm create-md resource_name），再将resource attach上（drbdadm attach resource_name），然后drbd就会马上开始从当前primary节点到本节点的re-synchronisation。数据同步的实时状况可以通过 /proc/drbd文件的内容获得。 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不过，如果我们使用的不是internal的meta-data保存方式，也就是说我们的meta-data是保存在resource之外的地方的。那么我们在完成上面的操作（重建meta-data）之后，还需要进行一项操作来触发re-synchnorisation，所需命令为：drbdadm invalidate resource_name 。 <p>七、节点crash（或计划内维护） <p>&nbsp;&nbsp;&nbsp; 1、secondary节点 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果是secondary接待你crash，那么primary将临时性的与secondary断开连接，cs状态应该会变成WFConnection，也就是等待连接的状态。这时候primary会继续对外提供服务，并在meta-data里面记录下从失去secondary连接后所有变化过的block的信息。当secondary重新启动并连接上primary后，primary –&gt; secondary的re-synchnorisation会自动开始。不过在re-synchnorisation过程中，primary和secondary的数据是不一致状态的。也就是说，如果这个时候primary节点也crash了的话，secondary是没办法切换成primary的。也就是说，如果没有其他备份的话，将丢失所有数据。 <p>&nbsp;&nbsp;&nbsp; 2、primary节点 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般情况下，primary的crash和secondary的crash所带来的影响对drbd来说基本上是差不多的。唯一的区别就是需要多操作一步将secondary节点switch成primary节点先对外提供服务。这个switch的过程drbd自己是不会完成的，需要我们人为干预进行一些操作才能完成。当crash的原primary节点修复并重新启动连接到现在的primary后，会以secondary存在，并开始re-synchnorisation这段时间变化的数据。 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在primary节点crash的情况下，drbd可以保证同步到原secondary的数据的一致性，这样就避免了当primary节点crash之后，secondary因为数据的不一致性而无法wcitch成primary或者即使切换成primary后因为不一致的数据无法提供正常的服务的问题。 <p>&nbsp;&nbsp;&nbsp; 3、节点永久性损坏（需要更换机器或重新安装相关软件的情况） <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当某一个节点因为硬件（或软件）的问题，导致某一节点已经无法再轻易修复并提供服务，也就是说我们所面对的是需要更换主机（或从OS层开始重新安装）的问题。在遇到这样的问题后，我们所需要做的是重新提供一台和原节点差不多的机器，重新开始安装os，安装相关软件，从现有整提供服务的节点上copy出drbd的配置文件（/etc/drbd.conf），创建meta-data信息，然后启动drbd服务，以一个secondary的身份连接到现有的primary上面，后面就会自动开始re-synchnorisation。 <p>八、split brain的处理 <p>&nbsp;&nbsp;&nbsp; split brain实际上是指在某种情况下，造成drbd的两个节点断开了连接，都以primary的身份来运行。当drbd某primary节点连接对方节点准备发送信息的时候如果发现对方也是primary状态，那么会会立刻自行断开连接，并认定当前已经发生split brain了，这时候他会在系统日志中记录以下信息：“Split-Brain detected,dropping connection!”当发生split brain之后，如果查看连接状态，其中至少会有一个是StandAlone状态，另外一个可能也是StandAlone（如果是同时发现split brain状态），也有可能是WFConnection的状态。 <p>&nbsp;&nbsp;&nbsp; 如果我们在配置文件中配置了自动解决split brain（好像linbit不推荐这样做），drbd会自行解决split brain问题，具体解决策略是根据配置中的设置来进行的。 <p>&nbsp;&nbsp;&nbsp; 如果没有配置split brain自动解决方案，我们可以手动解决。首先我们必须要确定哪一边应该作为解决问题后的primary，一旦确定好这一点，那么我们同时也就确定接受丢失在split brain之后另外一个节点上面所做的所有数据变更了。当这些确定下来后，我们就可以通过以下操作来恢复了： <p>&nbsp;&nbsp;&nbsp; a、首先在确定要作为secondary的节点上面切换成secondary并放弃该资源的数据： <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drbdadm secondary resource_name <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drbdadm — –discard-my-data connect resource_name <p>&nbsp;&nbsp;&nbsp; b、在要作为primary的节点重新连接secondary（如果这个节点当前的连接状态为WFConnection的话，可以省略） <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drbdadm connect resource_name <p>&nbsp;&nbsp;&nbsp; 当作完这些动作之后，从新的primary到secondary的re-synchnorisation会自动开始。 <p>八、meta data存放地点的比较 <p>&nbsp;&nbsp;&nbsp; 1、internal meta-data（meta-data和数据存放在同一个底层设备之上） <p>&nbsp;&nbsp;&nbsp; 优点：一旦meta-data创建之后，就和实际数据绑在了一起，在维护上会更简单方便，不用担心meta-data会因为某些操作而丢失。另外在硬盘损坏丢失数据的同时，meta-data也跟着一起丢失，当更换硬盘之后，只需要执行重建meta-data的命令即可，丢失的数据会很容易的从其他节点同步过来。 <p>&nbsp;&nbsp;&nbsp; 缺点：如果底层设备是单一的磁盘，没有做raid，也不是lvm等，那么可能会造成性能影响。因为每一次写io都需要更新meta-data里面的信息，那么每次写io都会有两次，而且肯定会有磁头的较大寻道移动，因为meta-data都是记录在dice设备的最末端的，这样就会造成写io的性能降低。 <p>&nbsp;&nbsp;&nbsp; 2、external meta data（meta-data存放在独立的，与存放数据的设备分开的设备之上） <p>&nbsp;&nbsp;&nbsp; 优点：与internal meta-data的缺点完全相对，可以解决写io的争用问题。 <p>&nbsp;&nbsp;&nbsp; 缺点：由于meta-data存放在与数据设备分开的地方，就意味着当磁盘损坏更换磁盘之后，必须手动发起全量同步的操作。也就是管理维护会稍微麻烦那么一点点，很小的一点点。 <p>&nbsp;&nbsp;&nbsp; 如果我们希望在已经存在数据的设备上面建立drbd的资源，并且不希望丢失该设备上面的数据，又没办法增大底层设备的容量，而且上层文件系统又没办法收缩的话，我们就只能将meta data创建成external方式。</p>]]></description><category>文档</category><comments>http://blog.bigcomic.com/post/251.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=251</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=251&amp;key=bc24301b</trackback:ping></item><item><title>MySQL Replication(复制)基本原理</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/250.html</link><pubDate>Thu, 04 Dec 2008 23:32:00 +0800</pubDate><guid>http://blog.bigcomic.com/post/250.html</guid><description><![CDATA[<p>1、复制进程<br>Mysql的复制（replication）是一个异步的复制，从一个Mysql instace（称之为Master）复制到另一个Mysql instance（称之Slave）。实现整个复制操作主要由三个进程完成的，其中两个进程在Slave（Sql进程和IO进程），另外一个进程在 Master（IO进程）上。  <p>要实施复制，首先必须打开Master端的binary log（bin-log）功能，否则无法实现。因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。<br>复制的基本过程如下：<br>1)、Slave上面的IO进程连接上Master，并请求从指定日志文件的指定位置（或者从最开始的日志）之后的日志内容；<br>2)、Master接收到来自Slave的IO进程的请求后，通过负责复制的IO进程根据请求信息读取制定日志指定位置之后的日志信息，返回给Slave 的IO进程。返回信息中除了日志所包含的信息之外，还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置；<br>3)、Slave的IO进程接收到信息后，将接收到的日志内容依次添加到Slave端的relay-log文件的最末端，并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中，以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪 个位置开始往后的日志内容，请发给我”；<br>4)、Slave的Sql进程检测到relay-log中新增加了内容后，会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容，并在自身执行。  <p>实际上在老版本的Mysql的复制实现在Slave端并不是两个进程完成的，而是由一个进程完成。但是后来发现这样做存在较大的风险和性能问题，主要如下：<br>首先，一个进程就使复制bin-log日志和解析日志并在自身执行的过程成为一个串行的过程，性能受到了一定的限制，异步复制的延迟也会比较长。<br>另外，Slave端从Master端获取bin-log过来之后，需要接着解析日志内容，然后在自身执行。在这个过程中，Master端可能又产生了大量 变化并声称了大量的日志。如果在这个阶段Master端的存储出现了无法修复的错误，那么在这个阶段所产生的所有变更都将永远无法找回。如果在Slave 端的压力比较大的时候，这个过程的时间可能会比较长。<br>所以，后面版本的Mysql为了解决这个风险并提高复制的性能，将Slave端的复制改为两个进程来完成。提出这个改进方案的人是Yahoo!的一位工程 师“Jeremy Zawodny”。这样既解决了性能问题，又缩短了异步的延时时间，同时也减少了可能存在的数据丢失量。当然，即使是换成了现在这样两个线程处理以后，同 样也还是存在slave数据延时以及数据丢失的可能性的，毕竟这个复制是异步的。只要数据的更改不是在一个事物中，这些问题都是会存在的。如果要完全避免 这些问题，就只能用mysql的cluster来解决了。不过mysql的cluster是内存数据库的解决方案，需要将所有数据都load到内存中，这 样就对内存的要求就非常大了，对于一般的应用来说可实施性不是太大。  <p>2、复制实现级别<br>Mysql的复制可以是基于一条语句（Statement level），也可以是基于一条记录（Row level），可以在Mysql的配置参数中设定这个复制级别，不同复制级别的设置会影响到Master端的bin-log记录成不同的形式。<br>Row Level：日志中会记录成每一行数据被修改的形式，然后在slave端再对相同的数据进行修改。<br>优点：在row level模式下，bin-log中可以不记录执行的sql语句的上下文相关的信息，仅仅只需要记录那一条记录被修改了，修改成什么样了。所以row level的日志内容会非常清楚的记录下每一行数据修改的细节，非常容易理解。而且不会出现某些特定情况下的存储过程，或function，以及 trigger的调用和触发无法被正确复制的问题。<br>缺点：row level下，所有的执行的语句当记录到日志中的时候，都将以每行记录的修改来记录，这样可能会产生大量的日志内容，比如有这样一条update语 句：update product set owner_member_id = ‘b’ where owner_member_id = ‘a’，执行之后，日志中记录的不是这条update语句所对应额事件（mysql以事件的形式来记录bin-log日志），而是这条语句所更新的每一条 记录的变化情况，这样就记录成很多条记录被更新的很多个事件。自然，bin-log日志的量就会很大。尤其是当执行alter table之类的语句的时候，产生的日志量是惊人的。因为Mysql对于alter table之类的表结构变更语句的处理方式是整个表的每一条记录都需要变动，实际上就是重建了整个表。那么该表的每一条记录都会被记录到日志中。<br>Statement Level:每一条会修改数据的sql都会记录到 master的bin-log中。slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql来再次执行。<br>优点：statement level下的优点首先就是解决了row level下的缺点，不需要记录每一行数据的变化，减少bin-log日志量，节约IO，提高性能。因为他只需要记录在Master上所执行的语句的细节，以及执行语句时候的上下文的信息。<br>缺点：由于他是记录的执行语句，所以，为了让这些语句在slave端也能正确执行，那么他还必须记录每条语句在执行的时候的一些相关信息，也就是上下文信 息，以保证所有语句在slave端杯执行的时候能够得到和在master端执行时候相同的结果。另外就是，由于Mysql现在发展比较快，很多的新功能不 断的加入，使mysql得复制遇到了不小的挑战，自然复制的时候涉及到越复杂的内容，bug也就越容易出现。在statement level下，目前已经发现的就有不少情况会造成mysql的复制出现问题，主要是修改数据的时候使用了某些特定的函数或者功能的时候会出现，比 如：sleep()函数在有些版本中就不能真确复制，在存储过程中使用了last_insert_id()函数，可能会使slave和master上得到 不一致的id等等。由于row level是基于每一行来记录的变化，所以不会出现类似的问题。<br>从官方文档中看到，之前的Mysql一直都只有基于statement的复制模式，直到5.1.5版本的Mysql才开始支持row level的复制。从5.0开始，Mysql的复制已经解决了大量老版本中出现的无法正确复制的问题。但是由于存储过程的出现，给Mysql的复制又带来 了更大的新挑战。另外，看到官方文档说，从5.1.8版本开始，Mysql提供了除Statement Level和Row Level之外的第三种复制模式：Mixed，实际上就是前两种模式的结合。在Mixed模式下，Mysql会根据执行的每一条具体的sql语句来区分对 待记录的日志形式，也就是在Statement和Row之间选择一种。新版本中的Statment level还是和以前一样，仅仅记录执行的语句。而新版本的Mysql中队row level模式也被做了优化，并不是所有的修改都会以row level来记录，像遇到表结构变更的时候就会以statement模式来记录，如果sql语句确实就是update或者delete等修改数据的语句， 那么还是会记录所有行的变更。  <p>3、复制常用架构<br>Mysql复制环境90%以上都是一个Master带一个或者多个Slave的架构模式，主要用于读压力比较大的应用的数据库端廉价扩展解决方案。因为只 要master和slave的压力不是太大（尤其是slave端压力）的话，异步复制的延时一般都很少很少。尤其是自slave端的复制方式改成两个进程 处理之后，更是减小了slave端的延时。而带来的效益是，对于数据实时性要求不是特别的敏感度的应用，只需要通过廉价的pc server来扩展slave的数量，将读压力分散到多台slave的机器上面，即可解决数据库端的读压力瓶颈。这在很大程度上解决了目前很多中小型网站 的数据库压力瓶颈问题，甚至有些大型网站也在使用类似方案解决数据库瓶颈。<br>一个Master带多个slave的架构实施非常简单，多个slave和单个slave的实施并没有太大区别。在Master端并不care有多少个 slave连上了master端，只要有slave进程通过了连接认证，向他请求binlog信息，他就会按照连接上来的io进程的要求，读取自己的 binlog信息，返回给slave的IO进程。对于slave的配置细节，在Mysql的官方文档上面已经说的很清楚了，甚至介绍了多种实现slave 的配置方法。  <p>Mysql不支持一个Slave instance从属于多个Master的架构。就是说，一个slave instance只能接受一个master的同步源，听说有patch可以改进这样的功能，但没有实践过。Mysql AB之所以不实现这样的功能，主要是考虑到冲突解决的问题。  <p>Mysql也可以搭建成dual master模式，也就是说两个Mysql instance互为对方的Master，也同时为对方的Slave。不过一般这种架构也是只有一端提供服务，避免冲突问题。因为即使在两边执行的修改有 先后顺序，由于复制的异步实现机制，同样会导致即使在晚做的修改也可能会被早做的修改所覆盖，就像如下情形：<br>时间点&nbsp;&nbsp; Mysql A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Mysql B<br>1&nbsp;&nbsp;&nbsp; 更新x表y记录为10<br>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 更新x表y记录为20<br>3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获取到A日志并应用，更新x表的y记录为10（不符合期望）<br>4&nbsp;&nbsp;&nbsp; 获取B日志更新x表y记录为20（符合期望）<br>这样，不仅在B库上面的数据不是用户所期望的结果，A和B两边的数据也出现了不一致的情况。除非能将写操作根据某种条件固定分开在A和B两端，保证不会交叉写入，才能够避免上面的问题。</p>]]></description><category>开发随笔</category><comments>http://blog.bigcomic.com/post/250.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=250</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=250&amp;key=7c56be9f</trackback:ping></item><item><title>MySQL查询缓存机制</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/257.html</link><pubDate>Thu, 04 Dec 2008 16:41:05 +0800</pubDate><guid>http://blog.bigcomic.com/post/257.html</guid><description><![CDATA[<p>缓存机制简单的说就是缓存sql文本及查询结果，如果运行相同的sql，服务器直接从缓存中取到结果，而不需要再去解析和执行sql。如果表更改了，那么使用这个表的所有缓冲查询将不再有效，查询缓存值的相关条目被清空。更改指的是表中任何数据或是结构的改变，包括INSERT、UPDATE、DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等，也包括那些映射到改变了的表的使用MERGE表的查询。显然，这对于频繁更新的表，查询缓存是不适合的，而对于一些不常改变数据且有大量相同sql查询的表，查询缓存会节约很大的性能。<br>查询必须是完全相同的(逐字节相同)才能够被认为是相同的。另外，同样的查询字符串由于其它原因可能认为是不同的。使用不同的数据库、不同的协议版本或者不同 默认字符集的查询被认为是不同的查询并且分别进行缓存。 <p>下面sql查询缓存认为是不同的：<br>SELECT * FROM tbl_name<br>Select * from tbl_name<br>查询缓存相关参数 <p>mysql&gt; SHOW VARIABLES LIKE '%query_cache%';<br>+------------------------------+---------+<br>| Variable_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Value&nbsp;&nbsp; |<br>+------------------------------+---------+<br>| have_query_cache&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | YES&nbsp;&nbsp;&nbsp;&nbsp; | --查询缓存是否可用<br>| query_cache_limit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 1048576 | --可缓存具体查询结果的最大值<br>| query_cache_min_res_unit&nbsp;&nbsp;&nbsp;&nbsp; | 4096&nbsp;&nbsp;&nbsp; | <br>| query_cache_size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 599040&nbsp; | --查询缓存的大小<br>| query_cache_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | ON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | --阻止或是支持查询缓存<br>| query_cache_wlock_invalidate | OFF&nbsp;&nbsp;&nbsp;&nbsp; | <br>+------------------------------+---------+ <p>下面是一个简单的例子： <p>[mysql@csdba1850 ~]$ mysql -u root -p<br>Enter password: <br>Welcome to the MySQL monitor.&nbsp; Commands end with ; or \g.<br>Your MySQL connection id is 3<br>Server version: 5.0.45-community MySQL Community Edition (GPL)<br>Type 'help;' or '\h' for help. Type '\c' to clear the buffer.<br>mysql&gt; set global query_cache_size = 600000; --设置缓存内存<br>Query OK, 0 rows affected (0.00 sec)<br>mysql&gt; set session query_cache_type = ON; --开启查询缓存<br>Query OK, 0 rows affected (0.00 sec)<br>mysql&gt; use test<br>Reading table information for completion of table and column names<br>You can turn off this feature to get a quicker startup with -A<br>Database changed<br>mysql&gt; show tables;<br>+----------------+<br>| Tables_in_test |<br>+----------------+<br>| animals&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br>| person&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | <br>+----------------+<br>5 rows in set (0.00 sec)<br>mysql&gt; select count(*) from animals;<br>+----------+<br>| count(*) |<br>+----------+<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 | <br>+----------+<br>1 row in set (0.00 sec)<br>--Qcache_hits表示sql查询在缓存中命中的累计次数，是累加值。<br>mysql&gt; SHOW STATUS LIKE 'Qcache_hits';<br>+---------------+-------+<br>| Variable_name | Value |<br>+---------------+-------+<br>| Qcache_hits&nbsp;&nbsp; | 0&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp; --0次<br>+---------------+-------+<br>8 rows in set (0.00 sec)<br>mysql&gt;&nbsp; select count(*) from animals;<br>+----------+<br>| count(*) |<br>+----------+<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 | <br>+----------+<br>1 row in set (0.00 sec)<br>mysql&gt;&nbsp; SHOW STATUS LIKE 'Qcache%';<br>+---------------+-------+<br>| Variable_name | Value |<br>+---------------+-------+<br>| Qcache_hits&nbsp;&nbsp; | 1&nbsp;&nbsp;&nbsp;&nbsp; | --表示sql在缓存中直接得到结果，不需要再去解析<br>+---------------+-------+<br>8 rows in set (0.00 sec)<br>mysql&gt; select count(*) from animals;<br>+----------+<br>| count(*) |<br>+----------+<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 | <br>+----------+<br>1 row in set (0.00 sec)<br>mysql&gt; select count(*) from animals;<br>+----------+<br>| count(*) |<br>+----------+<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 | <br>+----------+<br>1 row in set (0.00 sec)<br>mysql&gt; SHOW STATUS LIKE 'Qcache_hits';<br>+---------------+-------+<br>| Variable_name | Value |<br>+---------------+-------+<br>| Qcache_hits&nbsp;&nbsp; | 3&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; --上面的sql也是是从缓存中直接取到结果<br>+---------------+-------+<br>1 row in set (0.00 sec)<br>mysql&gt; insert into animals select 9,'testsds' ; --插入数据后，跟这个表所有相关的sql缓存就会被清空掉<br>Query OK, 1 row affected (0.00 sec)<br>Records: 1&nbsp; Duplicates: 0&nbsp; Warnings: 0<br>mysql&gt; select count(*) from animals;<br>+----------+<br>| count(*) |<br>+----------+<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 | <br>+----------+<br>1 row in set (0.00 sec)<br>mysql&gt; SHOW STATUS LIKE 'Qcache_hits';<br>+---------------+-------+<br>| Variable_name | Value |<br>+---------------+-------+<br>| Qcache_hits&nbsp;&nbsp; | 3&nbsp;&nbsp;&nbsp; |&nbsp; --还是等于3，说明上一条sql是没有直接从缓存中直接得到的<br>+---------------+-------+<br>1 row in set (0.00 sec)<br>mysql&gt; select count(*) from animals;<br>+----------+<br>| count(*) |<br>+----------+<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 | <br>+----------+<br>1 row in set (0.00 sec)<br>mysql&gt; SHOW STATUS LIKE 'Qcache_hits'; <br>+---------------+-------+<br>| Variable_name | Value |<br>+---------------+-------+<br>| Qcache_hits&nbsp;&nbsp; | 4&nbsp;&nbsp;&nbsp;&nbsp; | <br>+---------------+-------+<br>1 row in set (0.00 sec)</p>]]></description><category>文档</category><comments>http://blog.bigcomic.com/post/257.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=257</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=257&amp;key=228397ba</trackback:ping></item><item><title>Heartbeat的切换策略-积分统计方法</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/253.html</link><pubDate>Wed, 03 Dec 2008 15:59:47 +0800</pubDate><guid>http://blog.bigcomic.com/post/253.html</guid><description><![CDATA[<p>在V2的Heartbeat中，为了将资源的监控和切换结合起来，同时支持多节点集群，Heartbeat提供了一种积分策略来控制各个资源在集群中各节点之间的切换策略。通过该积分机制，计算出各节点的的总分数，得分最高者将成为active状态来管理某个（或某组）资源。 <p>如果在CIB的配置文件中不做出任何配置的话，那么每一个资源的初始分数（resource-stickiness）都会是默认的0，而且每一个资源在每次失败之后所减掉的分数（resource-failure-stickiness）也是0。如此的话，一个资源不论他失败多少次，heartbeat都只是执行restart操作，不会进行节点切换。一般来说，resource-stickiness的值都是正数，resource-failure-stickiness的值都是负数。另外还有一个特殊值那就是正无穷大（INFINITY）和负无穷大（-INFINITY）。如果节点的分数为负分，那么不管什么情况发生，该节点都不会接管资源（冷备节点）。随着资源的各种状态的发生，在各节点上面的分数就会发生变化，随着分数的变化，一旦某节点的分数大于当前运行该资源的节点的分数之后，heartbeat就会做出切换动作，现在运行该资源的节点将释放资源，分数高出的节点将接管该资源。 <p>在CIB的配置中，可以给每个资源定义一个分数，通过resource-stickiness来设置，同样也可以设置一个失败后丢失的分数，通过resource-failure-stickiness来设置。如下： <p>&lt;primitive id=”mysql_db” class=”ocf” type=”mysql” provider=”heartbeat”&gt; <p>&lt;meta_attributes id=”mysql_db_meta_attr”&gt;<br>&lt;attributes&gt;<br>&lt;nvpair name=”resource_stickiness” id=”mysql_db_meta_attr_1″ value=”100″/&gt;<br>&lt;nvpair name=”resource_failure_stickiness” id=”mysql_db_meta_attr_2″ value=”-100″/&gt;<br>&lt;/attributes&gt;<br>&lt;/meta_attributes&gt; <p>… <p>&lt;primitive /&gt; <p>上面的配置就是给mysql_db这个resource配置了两个分数，成功运行的时候所得到的分数（resource_stickiness）和运行失败会丢失的分数（resource_failure_stickiness），两项分数值一样多，成功则得100分，失败则-100分。 <p>除了可以通过给每个资源单独设置两项的分数之外，也可以将所有的resource设置成相同的分数，如下： <p>&lt;configuration&gt;<br>&lt;crm_config&gt;<br>&lt;cluster_property_set id=”cib-bootstrap-options”&gt;<br>&lt;attributes&gt;<br>… <p>&lt;nvpair id=”default-resource-failure-stickiness” name=”default-resource-failure-stickiness” value=”-100″/&gt;<br>&lt;nvpair id=”default-resource-stickiness” name=”default-resource-stickiness” value=”100″/&gt;<br>… <p>&lt;/attributes&gt;<br>&lt;/cluster_property_set&gt;<br>&lt;/crm_config&gt; <p>… <p>在这个配置中，就是给所有资源设置了两个默认的分数，省去单独每个资源都设置的麻烦。当然，如果在设置了这个default分数之后，同时也给部分或者全部资源也设置了这两个分数的话，将取单独设置的各个资源设置的分数而不取默认分数。 <p>除了资源的分数之外，节点自身同样也有分数。节点分数可以如下设置： <p>… <p>&lt;constraints&gt;<br>&lt;rsc_location id=”rsc_location_group_mysql” rsc=”group_mysql”&gt;<br>&lt;rule id=”mysql1_group_mysql” score=”200″&gt;<br>&lt;expression id=”mysql1_group_mysql_expr” attribute=”#uname” operation=”eq” value=”mysql1″/&gt;<br>&lt;/rule&gt;<br>&lt;rule id=”mysql2_group_mysql” score=”150″&gt;<br>&lt;expression id=”mysql2_group_mysql_expr” attribute=”#uname” operation=”eq” value=”mysql2″/&gt;<br>&lt;/rule&gt;<br>&lt;/rsc_location&gt;<br>&lt;/constraints&gt;<br>… <p>注意这里节点分数的设置是放在configuration配置项里面的constraints配置项下的，通过rule来设置。这里是通过节点主机名来匹配的（实际上heartbeat的很多配置中对主机名都是很敏感的）。这里的value值就是节点的主机名，rule里面的score就是一个节点的分数。 <p>通过上面的配置，我们可以作出如下计算： <p>a、在最开始，两边同时启动heartbeat的话，两边都没有开始运行这个resource，resource本身没有分数，那么仅仅计算节点的分数： <p>mysql1的分数：node+resource+failcount*failure=200+0+(0*(-100))=200 <p>mysql2的分数：node+resource+failcount*failure=150+0+(0*(-100))=150 <p>heartbeat会做出选择在mysql1上面运行mysql_db这个资源，然后mysql1的分数发生变化了，因为有资源自身的分数加入了： <p>mysql1的分数：node+resource+failcount*failure=200+100+(0*(-100))=300 <p>mysql2的分数：node+resource+failcount*failure=150+0+(0*(-100))=150 <p>b、过了一段时间，heartbeat的monitor发现mysql_db这个资源crash（或者其他问题）了，分数马上会发生变化，如下： <p>mysql1的分数：node+resource+failcount*failure=200+100+(1*(-100))=200 <p>mysql2的分数：node+resource+failcount*failure=150+0+(0*(-100))=150 <p>heartbeat发现mysql1节点的分数还是比mysql2的高，那么资源不发生迁移，将执行restart类操作。 <p>c、继续运行一段时间发现又有问题（或者是b后面restart没有起来）了，分数又发生变化了： <p>mysql1的分数：node+resource+failcount*failure=200+100+(2*(-100))=100 <p>mysql2的分数：node+resource+failcount*failure=150+0+(0*(-100))=150 <p>这时候heartbeat发现mysql2节点比mysql1节点的分数高了，资源将发生迁移切换，mysql1释mysql_db相关资源，mysql2接管相关资源，并在mysql2上运行mysql_db这个资源。这时候，节点的分数又会发生变化如下： <p>mysql1的分数：node+resource+failcount*failure=200+0+(2*(-100))=0 <p>mysql2的分数：node+resource+failcount*failure=150+100+(0*(-100))=250 <p>这时候如果在mysql2上面三次出现问题，那么mysql2的分数将变成-50，又比mysql1少了，资源将迁移回mysql1，mysql1的分数将变成100，而mysql2的分数将变成-150，因为又少了资源所有者的那100分。到这里，mysql2节点的分数已经是负数了。heartbeat还有一个规则，就是资源永远都不会迁移到一个分数分数是负数的节点上面去。也就是说从这以后，mysql1节点上面不管mysql_db这个资源失败多少次，不管这个资源出现什么问题，都不会迁移回mysql2节点了。一个节点的分数会在该节点的heartbeat重启之后被重置为初始状态。或者通过相关命令来对集群中某个节点的某个资源或者资源组来重置或者查看其failcount，如下： <p>crm_failcount -G -U mysql1 -r mysql_db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #将查看mysql1节点上面的mysql_db这个资源的failcount <p>crm_failcount -D -U mysql1 -r mysql_db&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #将重置mysql1节点上面的mysql_db这个资源的failcount <p>当然，在实际应用中，我们一般都是将某一些互相关联的资源放到一起组成一个资源组，一旦资源组中某资源有问题的时候，需要迁移整个资源组的资源。这个和上面针对单个资源的情况实际上没有太多区别，只需要将上面mysql_db的设置换到资源组即可，如下： <p>… <p>&lt;group id=”group-mysql”&gt;<br>&lt;meta_attributes id=”group-mysql_meta_attr”&gt;<br>&lt;attributes&gt;<br>&lt;nvpair id=”group-mysql_meta_attr-1″ name=”resource_stickiness” value=”100″/&gt;<br>&lt;nvpair id=”group-mysql_meta_attr-1″ name=”resource_failure_stickiness” value=”-100″/&gt;<br>&lt;/attributes&gt;<br>&lt;/meta_attributes&gt;<br>&lt;primitive&gt;<br>…<br>&lt;/primitive&gt;<br>…<br>&lt;/group&gt; <p>… <p>这样，在该资源组中任何一个资源出现问题之后，都会被认为该资源组有问题，当分数低于其他节点出现切换的时候就是整个资源组的切换。 <p>另外，对于INFINITY和-INFINITY这两个值，实际上主要用途就是为了控制永远不切换和只要失败必须切换用的。因为代表的意思就是拥有正无穷大的分数和失败就到负无穷大，主要用来满足极端规则的简单配置项。 <p>总的来说，一项资源（或者资源组）在一个节点运行迁移到另一个节点之前，可以失败的次数的计算公式可以如下表示： <p>(nodeA score - nodeB score + stickiness)/abs(failure stickiness)，即为A节点分数减去B节点分数，再加上资源运行分数后得到的总分数，除以资源失败分数的绝对值。]]></description><category>文档</category><comments>http://blog.bigcomic.com/post/253.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=253</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=253&amp;key=812b1b93</trackback:ping></item><item><title>Heartbeat V2 模块分析</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/252.html</link><pubDate>Wed, 03 Dec 2008 15:59:15 +0800</pubDate><guid>http://blog.bigcomic.com/post/252.html</guid><description><![CDATA[<p>一、heartbeat模块： <p>&nbsp;&nbsp;&nbsp; 整个Heartbeat软件的通信模块，各个节点之间的任何通信都是通过这个模块完成。这个模块会根据不同类型的通信启动不同的事件handler，当监听到不同类型的通信请求后会分给不同的handler来处理。这个从整个Heartbeat的启动日志中看出来。 <p>二、CRM：cluster resource manager <p>&nbsp;&nbsp;&nbsp; 从这个名字就可以看出这个模块基本上就是v2的heartbeat的一个只会中心，整个系统的一个大脑了，他主要负责整个系统的各种资源的当前配置信息，以及各个资源的调度。也就是根据各资源的配置信息，以及当前的运行状况来决定每一个资源（或者资源组）到底该在哪个节点运行。不过这些事情并不是他直接去做的，而是通过调度其他的一些模块来进行。 <p>&nbsp;&nbsp;&nbsp; 他通过heartbeat模块来进行节点之间的通信，调度节点之间的工作协调。随时将通过heartbeat模块收集到的各个成员节点的基本信息转交给CCM某块来更新整个集群的membership信息。他指挥LRM（local resource manager）对当前节点的各资源执行各种相应的操作（如start、stop、restart和monitor等等），同时也接收LRM在进行各种操作的反馈信息并作出相应的决策再指挥后续工作。另外CRM模块还负责将各个模块反馈回来的各种信息通过调用设定的日志记录程序记录到日志文件中。 <p>三、LRM：local resource manager <p>&nbsp;&nbsp;&nbsp; LRM是整个Heartbeat系统中直接操作所管理的各个资源的一个模块，负责对资源的监控，启动，停止或者重启等操作。这个模块目前好像支持有四种类型的资源代理（resource agent）：heartbeat自身的，ocf（open cluster framework），lsb（linux standard base，其实就是linux下标准的init脚本），还有一种就是stonith。stonith这种我还不是太清楚是一个什么类型的。 <p>&nbsp;&nbsp;&nbsp; 四种类型的resource agent中的前三种所调用的脚本分别存如下路径： <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; heartbeat：/etc/ha.d/resource.d/ <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ocf:/usr/lib/resource.d/heartbeat/ <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lsb:/etc/init.d/ <p>&nbsp;&nbsp;&nbsp; LRM就是通过调用以上路径下面的各种脚本来实现对资源的各种操作。每一种类型的脚本都可以由用户自定义，只要支持各类型的标准即可。实际上这里的标准就是接受一个标准的调用命令和参数格式，同时返回符合标准的值即可。至于脚本中的各种操作时如何的LRM并不care。 <p>四、PE：CRM Policy Engine <p>&nbsp;&nbsp;&nbsp; 他主要负责将CRM发过来的一些信息按照配置文件中的各种设置来进行计算，分析。然后将结果信息按照某种固定的格式通过CRM提交给TE（Transition engine）去分析出后续需要采取的相应的action。PE需要计算分析的信息主要是当前有哪些节点，各节点的状况，当前管理有哪些资源，各资源当前在哪一个节点，在各个节点的状态如何等等。 <p>五、TE：Transition engine <p>&nbsp;&nbsp;&nbsp; 主要工作是分析PE的计算结果，然后根据配置信息转换成后续所需的相应操作。个人感觉PE和TE组合成一个类似于规则引擎实现的功能，而且PE和TE这两个模块只有在处于active的节点被启动。另外PE和TE并不直接通信，而都是通过Heartbeat的指挥中心CRM来传达信息的。 <p>六、CIB：cluster information base <p>&nbsp;&nbsp;&nbsp; CIB在系统中充当的是当前集群中各资源原始配置以及之后动态变化了的状态，统计信息收集分发中心，是一个不断更新的信息库。当他收集到任何资源的变化，以及节点统计信息的变化后，都会集成整合到一起组成当前集群最新的信息，并分发到集群各个节点。分发动作并不是自己和各个节点通信，同样也是通过heartbeat模块来做的。 <p>&nbsp;&nbsp;&nbsp; CIB收集整理并汇总出来的信息是以一个xml格式保存起来的。实际上Heartbeat v2的资源配置文件也就是从haresources迁移到了一个叫cib.xml文件里面。该文件实际上就是CIB的信息库文件。在运行过程中，CIB可能会常读取并修改该文件的内容，以保证信息的更新。 <p>七、CCM：consensus cluster membership <p>&nbsp;&nbsp;&nbsp; CCM的最主要工作就是管理集群中各个节点的成员以及各成员之间的关系。他让集群中各个节点有效的组织称一个整体，保持着稳定的连接。heartbeat模块所担当的只是一个通信工具，而CCM是通过这个通信工具来将各个成员连接到一起成为一个整体。 <p>八、LOGD：logging daemon（non-blocking） <p>&nbsp;&nbsp;&nbsp; 一个无阻塞的日志记录程序，主要负责接收CRM从各个其他模块所收集的相关信息，然后记录到指定额度日志文件中。当logd接收到日志信息后会立刻返回给CRM反馈。并不是一定要等到将所有信息记录到文件后再返回，日志信息的记录实际上是一个异步的操作。 <p>九、APPHBD：application heartbeat daemon <p>&nbsp;&nbsp;&nbsp; apphbd模块实际上是给各个模块中可能需要用到的计时用的服务，是通过watchdog来实现的。这个模块具体的细节我还不是太清楚。 <p>十、RMD：recovery manager daemon <p>&nbsp;&nbsp;&nbsp; 主要功能是进程恢复管理，接受从apphbd所通知的某个（或者某些）进程异常退出或者失败或者hang住后的恢复请求。RMD在接受到请求后会作出restart（如果需要可能会有kill）操作。</p>]]></description><category>文档</category><comments>http://blog.bigcomic.com/post/252.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=252</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=252&amp;key=86bf6ad8</trackback:ping></item><item><title>MYSQL的master/slave数据同步配置</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/249.html</link><pubDate>Tue, 02 Dec 2008 20:45:31 +0800</pubDate><guid>http://blog.bigcomic.com/post/249.html</guid><description><![CDATA[<p>我的测试环境.基本上数据是瞬间同步 <p>redhat 9.0 <br>mysql3.23.57  <p>mysql数据同步备份  <p>A服务器： 192.168.1.2 主服务器master <br>B服务器： 192.168.1.3 副服务器slave  <p>A服务器设置  <p>#mysql –u root –p <br>mysql&gt;GRANT FILE ON *.* TO <a href="mailto:backup@10.168.2.3">backup@10.168.2.3</a> IDENTIFIED BY&nbsp; 'pencat'; <br>mysql&gt;\exit  <p>上面是Master开放一个账号backup密码1234给IP:10.168.2.3有档案处理的权限  <p>mysqladmin –u root –p shutdown  <p>备份Master所有数据库..通常都用tar指令. <br>#tar –cvf /tmp/mysql.tar /var/lib/mysql <br>注意:tar的时候,MySQL是要在stop情况下  <p>在A机器上修改/etc/my.cnf <br>在[mysqld]区段内加入参数 <br>log-bin <br>server-id=1 <br>sql-bin-update-same <br>binlog-do-db=vbb  <p>重启A服务器mysql  <p>此时因为有加入log-bin参数,因此开始有index产生了,在/var/lib/mysql目录下有.index档案纪录数据库的异动log.  <p>B服务器设置  <p>设定/etc/my.cnf <br>在[mysqld]区段加入  <p>master-host=10.168.2.2<br>master-user=backup <br>master-password=pencat<br>master-port=3306 <br>server-id=2 <br>master-connect-retry=60 预设重试间隔60秒 <br>replicate-do-db=pencat_db告诉slave只做pencat_db数据库的更新 <br>log-slave-updates  <p>将A上的mysql.tar copy到B上 <br>用ftp传B的/tmp <br>9.解压缩 <br>#cd /var/lib/  <p>状况测试 <br>1.A跟B网络及服务都正常情况下,由A端变化数据后,到B端浏览数据,检视是否有进行replication?! <br>2.模拟B当机,或是B不一定需要一直跟A有连接. <br>将由A端变化数据后,到B端浏览数据，B点应该是没有数据变化的  <p>#tar xvf /tmp/mysql-snapshot.tar <br>#chown –R mysql:mysql mysql  <p>1重启B服务器的mysql  <p>这时在/var/lib/mysql目录会出现master.info,此档案纪录了Master MySQL server的信息.  <p>状况测试 <br>1.A跟B网络及服务都正常情况下,由A端变化数据后,到B端浏览数据,检视是否有进行replication?! <br>2.模拟B当机,或是B不一定需要一直跟A有连接. <br>将由A端变化数据后,到B端浏览数据，B点应该是没有数据变化的 <p>&nbsp; <p><strong>mysql数据同步小技巧</strong> <p>如果slave服务器出了某种问题，比如数据不同步了，可以检查或者使得master database恢复到某个状态，然后执行： <p>show master status <p>看看binlog文件和position是什么，然后在salve上面执行： <p>stop slave; <p>change master to master_log_file="", master_log_pos=... <p>start slave; <p>即可]]></description><category>开发随笔</category><comments>http://blog.bigcomic.com/post/249.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=249</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=249&amp;key=dc1c46f6</trackback:ping></item><item><title>MySQL Master-Slave架构下使用MMM的必要性</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/248.html</link><pubDate>Tue, 02 Dec 2008 20:39:15 +0800</pubDate><guid>http://blog.bigcomic.com/post/248.html</guid><description><![CDATA[<p>来源:<a title="http://www.muduo.net/batch.viewlink.php?itemid=311439" href="http://www.muduo.net/batch.viewlink.php?itemid=311439">http://www.muduo.net/batch.viewlink.php?itemid=311439</a>&nbsp;</p> <p>MySQL本身没有提供replication failover的解决方案(见<a href="http://dev.mysql.com/doc/refman/5.1/en/replication-faq.html#qandaitem-15-3-4-9">How can I use replication to provide redundancy or high availability?</a>) </p> <p><br>如何使Replication方案具有HA？ 答案是<a href="http://blog.kovyrin.net/mysql-master-master-replication-manager/">MMM(MySQL Master-Master Replication Manager) </a></p> <p><br><strong>MMM对MySQL Master-Slave Replication绝对是一个很有益的补充!</strong></p><strong></strong> <p><br><strong>引言</strong><br>Master-Slave的数据库机构解决了很多问题，特别是read/write比较高的web2.0应用： <br>1、写操作全部在Master结点执行，并由Slave数据库结点定时(默认60s)读取Master的bin-log <br>2、将众多的用户读请求分散到更多的数据库节点，从而减轻了单点的压力 <br>这是对Replication的最基本陈述，这种模式的在系统Scale-out方案中很有引力(如有必要，数据可以先进行Sharding，再使用replication)。 </p> <p><br>它的缺点是： <br>1、Slave实时性的保障，对于实时性很高的场合可能需要做一些处理 <br>2、高可用性问题，Master就是那个致命点(<a href="http://en.wikipedia.org/wiki/Single_point_of_failure ">SPOF:Single point of failure</a>) </p> <p><br>本文主要讨论的是如何解决第2个缺点。 </p> <p><br>DB的设计对大规模、高负载的系统是极其重要的。高可用性(<a href="http://en.wikipedia.org/wiki/High_availability ">High availability</a>)在重要的系统(critical System)是需要架构师事先考虑的。存在<a href="http://en.wikipedia.org/wiki/Single_point_of_failure ">SPOF:Single point of failure</a>的设计在重要系统中是危险的。 <br></p><strong></strong> <p><strong>Master-Master Replication</strong><br>1、使用两个MySQL数据库db01,db02，互为Master和Slave，即：一边db01作为db02的master，一旦有数据写向db01时，db02定时从db01更新 另一边db02也作为db01的master，一旦有数据写向db02时，db01也定时从db02获得更新 (这不会导致循环，MySQL Slave默认不会记录Master同步过来的变化)</p> <p><br>2、但从AppServer的角度来说，同时只有一个结点db01扮演Master，另外一个结点db02扮演Slave，不能同时两个结点扮演Master。即AppSever总是把write操作分配某个数据库(db01)，除非db01 failed，被切换。 </p> <p><br>3、如果扮演Slave的数据库结点db02 Failed了： <br>&nbsp;&nbsp;&nbsp;&nbsp; a)此时appServer要能够把所有的read,write分配给db01，read操作不再指向db02 <br>&nbsp;&nbsp;&nbsp;&nbsp; b)一旦db02恢复过来后，继续充当Slave角色，并告诉AppServer可以将read分配给它了 </p> <p><br>4、如果扮演Master的数据库结点db01 Failed了 <br>&nbsp;&nbsp;&nbsp;&nbsp; a)此时appServer要能够把所有的写操作从db01切换分配给db02，也就是切换Master由db02充当 <br>&nbsp;&nbsp;&nbsp;&nbsp; b)db01恢复过来后，充当Slave的角色，Master由db02继续扮演 <br></p> <p>难点： <br>3、4要如何自动进行？<br><strong></strong></p> <p><strong>Master-Master with n Slaves Replication</strong><br><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="436" alt="redundancy-after" src="http://blog.bigcomic.com/upload/MySQLMasterSlaveMMM_1227F/redundancyafter.png" width="542" border="0"> </p> <p><br>这比上一个还要复杂，即：当一个Master Fail时，所有的Slave不再从原来失败的那个Master(db01)获取更新日志，而应该“自动”切换到最新充当Master角色的数据库db02。 </p> <p><br><strong>MMM，a greate project!</strong></p><strong></strong> <p>MMM的基本信息请参考它的网站(见后"参考资料") <br>MMM有3个重要的器件: <br>1、mmmd_mon - monitoring script which does all monitoring work and makes all decisions about roles moving and so on. </p> <p>2、mmmd_agent - remote servers management agent script, which provides monitoring node with simple set of remote services to make servers management easier, more flexible abd highly portable. <br>3、mmm_control - simple script dedicated to management of the mmmd_mon processes by commands. <br></p> <p>每一个MySQL服务器器结点需要运行mmmd_agent，同时在另外的一个机器上(可以是独立的一台机器，也可以是和AppServer共享同一个服务器)运行mmmd_mon。形成1 * mmmd_mon + n * mmmd_agent的部署架构。 <br></p> <p>MMM利用了虚拟IP的技术：1个网卡可以同时使用多个IP。(所以使用MMM时，需要2*n+1个IP，n为mysql数据库结点个数，包括master,slave) <br></p> <p>当有数据库结点fail时，mmmd_mon检测不到mmmd_agent的心跳或者对应的MySQL服务器的状态，mmmd_mon将进行决定，并下指令给某个正常的数据库结点的mmmd_agent，使得该mmmd_agent“篡位”<em>使用(注)</em>刚才fail的那个结点的虚拟IP，使得虚拟IP实际从指向fail的那个机器自动转为此时的这个正常机器。 </p> <p><br>注：据Qieqie猜测是将获得的虚拟IP设置给网卡，也只能这样了，改天测试验证一下。</p> <p>repeat: <a href="http://blog.kovyrin.net/mysql-master-master-replication-manager/">MMM</a>对MySQL Master-Slave Replication绝对是一个很有益的补充! </p> <p><strong></strong>&nbsp;</p> <p><strong>参考资料</strong><br>Switching Masters During Failover <br><a href="http://dev.mysql.com/doc/refman/5.1/en/replication-solutions-switch.html">http://dev.mysql.com/doc/refman/5.1/en/replication-solutions-switch.html</a><br>downpour: 讨论一下基于Master-Slave数据库模式的J2EE开发的框架选择 <br><a href="http://www.javaeye.com/topic/143714">http://www.javaeye.com/topic/143714</a><br>MMM <a href="http://blog.kovyrin.net/mysql-master-master-replication-manager/">http://blog.kovyrin.net/mysql-master-master-replication-manager/</a><br>Project page on Google Code: <a href="http://code.google.com/p/mysql-master-master">http://code.google.com/p/mysql-master-master</a><br>mmm-devel users group: <a href="http://groups.google.com/group/mmm-devel">http://groups.google.com/group/mmm-devel</a></p>]]></description><category>文档</category><comments>http://blog.bigcomic.com/post/248.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=248</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=248&amp;key=22558a27</trackback:ping></item><item><title>mysql压力测试工具：mysqlslap</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/254.html</link><pubDate>Mon, 01 Dec 2008 16:01:15 +0800</pubDate><guid>http://blog.bigcomic.com/post/254.html</guid><description><![CDATA[<p><strong>mysqlslap是一个mysql官方提供的压力测试工具。以下是比较重要的参数：</strong><br>–defaults-file，配置文件存放位置<br>–concurrency，并发数<br>–engines，引擎<br>–iterations，迭代的实验次数<br>–socket，socket文件位置 <p><strong>自动测试：</strong><br>–auto-generate-sql，自动产生测试SQL<br>–auto-generate-sql-load-type，测试SQL的类型。类型有mixed，update，write，key，read。<br>–number-of-queries，执行的SQL总数量<br>–number-int-cols，表内int列的数量<br>–number-char-cols，表内char列的数量 <p>例如：<br>shell&gt;mysqlslap –defaults-file=/u01/mysql1/mysql/my.cnf –concurrency=50,100 –iterations=1 –number-int-cols=4 –auto-generate-sql –auto-generate-sql-load-type=write –engine=myisam –number-of-queries=200 -S/tmp/mysql1.sock<br>Benchmark<br>Running for engine myisam<br>Average number of seconds to run all queries: 0.016 seconds<br>Minimum number of seconds to run all queries: 0.016 seconds<br>Maximum number of seconds to run all queries: 0.016 seconds<br>Number of clients running queries: 50<br>Average number of queries per client: 4 <p>Benchmark<br>Running for engine myisam<br>Average number of seconds to run all queries: 0.265 seconds<br>Minimum number of seconds to run all queries: 0.265 seconds<br>Maximum number of seconds to run all queries: 0.265 seconds<br>Number of clients running queries: 100<br>Average number of queries per client: 2 <p><strong>指定数据库的测试：</strong><br>–create-schema，指定数据库名称<br>–query，指定SQL语句，可以定位到某个包含SQL的文件 <p>例如：<br>shell&gt;mysqlslap –defaults-file=/u01/mysql1/mysql/my.cnf –concurrency=25,50 –iterations=1 –create-schema=test –query=/u01/test.sql -S/tmp/mysql1.sock<br>Benchmark<br>Average number of seconds to run all queries: 0.018 seconds<br>Minimum number of seconds to run all queries: 0.018 seconds<br>Maximum number of seconds to run all queries: 0.018 seconds<br>Number of clients running queries: 25<br>Average number of queries per client: 1 <p>Benchmark<br>Average number of seconds to run all queries: 0.011 seconds<br>Minimum number of seconds to run all queries: 0.011 seconds<br>Maximum number of seconds to run all queries: 0.011 seconds<br>Number of clients running queries: 50<br>Average number of queries per client: 1</p>]]></description><category>文档</category><comments>http://blog.bigcomic.com/post/254.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=254</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=254&amp;key=e53d0df6</trackback:ping></item><item><title>使用TC4400自带蓝牙连接简报鲨8000</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/246.html</link><pubDate>Mon, 17 Nov 2008 16:38:08 +0800</pubDate><guid>http://blog.bigcomic.com/post/246.html</guid><description><![CDATA[<p>一、在设备管理器中查看鼠标的设备ID号.</p><p><strong>HID\{00001124-0000-1000-8000-00805f9b34fb}&amp;VID_045E&amp;PID_0701&amp;Col02</strong></p><p>上面的字符就是简报鲨鱼8000的设备ID</p><p><a href="http://blog.bigcomic.com/upload/TC44008000_E669/image.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="199" alt="image" width="414" border="0" src="http://blog.bigcomic.com/upload/TC44008000_E669/image_thumb.png" /></a></p><p>&nbsp;</p><p>二、修改驱动</p><p>我安装的是IntelliPoint 6.3， 其他版本的驱动文件名称或路径可能不同。</p><p><strong>C:\Program Files\Microsoft IntelliPoint\pnt32uw.inf</strong></p><p>搜索</p><p>HID\{00001124-0000-1000-8000-00805f9b34fb}_VID&amp;0002045e_PID&amp;0701&amp;Col02</p><p>改为</p><p>HID\{00001124-0000-1000-8000-00805f9b34fb}&amp;VID_045E&amp;PID_0701&amp;Col02</p><p>一共有三处，修改之前注意备份.</p><p>&nbsp;</p><p>三、更新驱动</p><p>一定要从列表或指定位置安装，不要自动搜索。</p><p>&nbsp;</p><p>四、重新启动</p><p>&nbsp;</p><p>EOF</p>]]></description><category>文档</category><comments>http://blog.bigcomic.com/post/246.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=246</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=246&amp;key=5c941239</trackback:ping></item><item><title>TC4400入手</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/247.html</link><pubDate>Fri, 14 Nov 2008 02:08:35 +0800</pubDate><guid>http://blog.bigcomic.com/post/247.html</guid><description><![CDATA[<p>Mark</p> <p>TC4200 -&gt; TC4400</p> <p>价格 7.5K</p>]]></description><category>日记?周记?年记?</category><comments>http://blog.bigcomic.com/post/247.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=247</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=247&amp;key=08370122</trackback:ping></item><item><title>SSO方案</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/243.html</link><pubDate>Thu, 06 Nov 2008 01:34:01 +0800</pubDate><guid>http://blog.bigcomic.com/post/243.html</guid><description><![CDATA[<p><a href="http://blog.bigcomic.com/upload/SSO_1600/SSO.png"><img height="719" alt="企业SSO方案" src="http://blog.bigcomic.com/upload/SSO_1600/SSO_thumb.png" width="553" border="0"></a></p>]]></description><category>开发随笔</category><comments>http://blog.bigcomic.com/post/243.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=243</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=243&amp;key=b04ccf02</trackback:ping></item><item><title>ubuntu 7.10 vsftp的虚拟用户设置</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/241.html</link><pubDate>Thu, 06 Nov 2008 01:04:42 +0800</pubDate><guid>http://blog.bigcomic.com/post/241.html</guid><description><![CDATA[第一步: 配置PAM  <table class="term" cellspacing="0" cellpadding="2" width="609" border="0"> <tbody> <tr> <td class="term" valign="top" width="607">[root@www linux]# vi /etc/pam.d/vsftpd<br><span class="text_command"><br>#%PAM-1.0<br>session optional pam_keyinit.so force revoke<br>auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_users<br>account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_users<br>#auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed<br>#auth required pam_shells.so<br>#auth include system-auth<br>#account include system-auth<br>#session include system-auth<br>#session required pam_loginuid.so</span></td></tr></tbody></table> <p>&nbsp; <p>第二步: 建立vsftp的本地帐户</p> <table class="term" cellspacing="0" cellpadding="2" width="609" border="0"> <tbody> <tr> <td class="term" valign="top" width="607"> <p>[root@www linux]# adduser -d /home/ftp/ pencat</p></td></tr></tbody></table> <p>&nbsp;</p> <p>第三步: 配置vsftp</p> <table class="term" cellspacing="0" cellpadding="2" width="609" border="0"> <tbody> <tr> <td class="term" valign="top" width="607"> <p>[root@www linux]# vim /etc/vsftpd.conf  <p>local_enable=YES<br>write_enable=YES<br>local_umask=022<br>dirmessage_enable=YES<br>xferlog_enable=YES<br>connect_from_port_20=YES<br>xferlog_file=/var/log/vsftpd.log<br>xferlog_std_format=YES<br>chroot_local_user=YES<br>listen=YES<br>pam_service_name=vsftpd<br>userlist_enable=YES<br>user_sub_token=$USER<br>local_root=/home/ftp/$USER<br>guest_enable=YES<br>guest_username=pencat<br>anon_umask=0022<br>anon_upload_enable=YES<br>anon_mkdir_write_enable=YES<br>anon_other_write_enable=YES<br>anonymous_enable=NO</p></td></tr></tbody></table> <p>&nbsp;</p> <p>第四步: 建立虚拟用户</p> <table class="term" cellspacing="0" cellpadding="2" width="608" border="0"> <tbody> <tr> <td class="term" valign="top" width="606"> <p>[root@www linux]# vim <span class="text_command">/etc/vsftpd/vsftpd_users.txt</span></p> <p><span class="text_command">username<br>password<br>pencat<br>password for pencat</span></p> <p>[root@www linux]# db3_load -T -t hash -f <span class="text_command">/etc/vsftpd/vsftpd_users.txt </span><span class="text_command">/etc/vsftpd/vsftpd_users.db</span></p> <p>[root@www linux]# chmod 600 /etc/vsftpd/vsftpd_users.db /etc/vsftpd/vsftpd_users.txt</p></td></tr></tbody></table> <p>这里需要注意ubuntu 7.10下需要用db3_load, 否则验证是会失败的.</p> <p>&nbsp;</p> <p>第五步: 建立虚拟用户的目录,以及设置权限</p> <table class="term" cellspacing="0" cellpadding="2" width="609" border="0"> <tbody> <tr> <td class="term" valign="top" width="607"> <p>[root@www linux]# mkdir -p /home/ftp/username<br><br>[root@www linux]# mkdir -p /home/ftp/pencat<br><br>[root@www linux]# chwon -R pencat.pencat /home/ftp</p></td></tr></tbody></table> <p><br>第六步: 完成并测试</p> <table class="term" cellspacing="0" cellpadding="2" width="609" border="0"> <tbody> <tr> <td class="term" valign="top" width="607"> <p>[root@www linux]# tail -f /var/log/auth.log</p> <p>Mar 2 15:14:51 www vsftpd: pam_userdb(vsftpd:auth): user 'pencat' granted access</p></td></tr></tbody></table> <p>&nbsp;</p> <p>[EOF]</p>]]></description><category>文档</category><comments>http://blog.bigcomic.com/post/241.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=241</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=241&amp;key=3c5645d7</trackback:ping></item><item><title>远程打印流程</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/242.html</link><pubDate>Tue, 09 Sep 2008 03:13:46 +0800</pubDate><guid>http://blog.bigcomic.com/post/242.html</guid><description><![CDATA[<img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="323" alt="异地打印流程" src="http://blog.bigcomic.com/upload/f19cf4ea9efd_1158/d0c12bdcc2ea.png" width="432" align="left" border="0">]]></description><category>开发随笔</category><comments>http://blog.bigcomic.com/post/242.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=242</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=242&amp;key=c5d0bfe4</trackback:ping></item><item><title>centos 5.2 配置pptp客户端</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/239.html</link><pubDate>Mon, 01 Sep 2008 01:27:28 +0800</pubDate><guid>http://blog.bigcomic.com/post/239.html</guid><description><![CDATA[<p>1. 下载源码包</p><p># wget http://nchc.dl.sourceforge.net/sourceforge/pptpclient/pptp-1.7.2.tar.gz</p><p>2. 编译</p><p># make</p><p>3. 安装</p><p># make install</p><p>4. 配置</p><p># pptpsetup --create tunnelname --server xxx.xxx.xxx.xxx --username somebody --password sercet</p><p>5. 连接</p><p># pppd call tunnelname</p><p>6. 断开</p><p># killall pppd</p><p>注意事项：</p><p>在处理路由的时候采用client to lan方式，需要增加对方lan的路由或者目标网络的路由. </p><p># route add -net 192.168.2.0 netmask 255.255.255.0 dev ppp0</p><p>ppp0是pptp连接的名字， 如果不确定 可以使用ifconfig命令查看</p><p>&nbsp;</p>]]></description><category>文档</category><comments>http://blog.bigcomic.com/post/239.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=239</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=239&amp;key=8562c7b6</trackback:ping></item><item><title>srt字幕时间校对</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/238.html</link><pubDate>Thu, 15 May 2008 13:20:37 +0800</pubDate><guid>http://blog.bigcomic.com/post/238.html</guid><description><![CDATA[<p>下了个国家宝藏2, 居然是枪版....与发行的字幕完全对不上. 不过无论是枪版还是影版说话的时间间隔总是不变的。只要调整时间差就OK.&#160; 用VB6写了个程序完成这个工作.</p>  <blockquote>   <p>Dim linestr As String     <br />Dim x As Integer      <br />Dim y As Integer      <br />Open App.Path &amp; &quot;\z.new.srt&quot; For Append As #2      <br />Open App.Path &amp; &quot;\z.srt&quot; For Input As #1      <br />&#160;&#160;&#160; Do While Not EOF(1)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Line Input #1, linestr&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; '&#160;&#160; 将数据读入变量。      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; If InStr(linestr, &quot;--&gt;&quot;) &gt; 0 Then      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Debug.Print linestr      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; x = InStr(linestr, &quot;,&quot;)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Time1 = Mid(linestr, 1, x - 1)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; T1 = DateAdd(&quot;s&quot;, Val(Text1.Text), CDate(Time1))      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; linestr = Replace(linestr, Time1, &quot;0&quot; &amp; T1)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; x = InStr(linestr, &quot;--&gt; &quot;)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; y = InStr(x, linestr, &quot;,&quot;)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Time1 = Mid(linestr, x + 4, y - x - 4)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; T1 = DateAdd(&quot;s&quot;, Val(Text1.Text), CDate(Time1))      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; linestr = Replace(linestr, Time1, &quot;0&quot; &amp; T1)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Debug.Print linestr      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Debug.Print &quot;&quot;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; End If      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Print #2, linestr      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; DoEvents      <br />&#160;&#160;&#160; Loop      <br />Close #1      <br />Close #2</p> </blockquote>  <p><a href="http://blog.bigcomic.com/upload/srtchange.rar">下载编译版本</a></p>]]></description><category>开发随笔</category><comments>http://blog.bigcomic.com/post/238.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=238</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=238&amp;key=5ac6709b</trackback:ping></item><item><title>建立RouterOS与Fortigate 之间的IPSec tunnel</title><author>pencat@bigfoot.com (pencat)</author><link>http://blog.bigcomic.com/post/237.html</link><pubDate>Thu, 15 May 2008 12:42:06 +0800</pubDate><guid>http://blog.bigcomic.com/post/237.html</guid><description><![CDATA[<p>&#160;</p>  <p>拓扑如下:</p>  <p><a href="http://blog.bigcomic.com/upload/top_1_4.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="162" alt="top_1" src="http://blog.bigcomic.com/upload/top_1_thumb_1.png" width="464" border="0" /></a> </p>  <p>&#160;</p>  <p>RouterOS 端设置:</p>  <p><strong>policy</strong></p>  <p>[admin@pencat] ip ipsec policy&gt; pr    <br />Flags: X - disabled, D - dynamic, I - invalid     <br />0&#160;&#160; src-address=192.168.2.0/24:any dst-address=192.168.1.0/24:any protocol=all     <br />&#160;&#160;&#160;&#160; action=encrypt level=require ipsec-protocols=esp tunnel=yes     <br />&#160;&#160;&#160;&#160; sa-src-address=1.1.1.1 sa-dst-address=2.2.2.2     <br />&#160;&#160;&#160;&#160; proposal=default manual-sa=none dont-fragment=clear</p>  <p><strong>peer</strong></p>  <p>[admin@pencat] ip ipsec peer&gt; pr    <br />Flags: X - disabled     <br />0&#160;&#160; address=2.2.2.2/32:500 secret=&quot;password&quot;     <br />&#160;&#160;&#160;&#160; generate-policy=yes exchange-mode=main send-initial-contact=yes     <br />&#160;&#160;&#160;&#160; proposal-check=obey hash-algorithm=md5 enc-algorithm=aes-256     <br />&#160;&#160;&#160;&#160; dh-group=modp1536 lifetime=30m lifebytes=0</p>  <p><strong>proposal</strong></p>  <p>[admin@pencat] ip ipsec proposal&gt; pr    <br />Flags: X - disabled     <br />0&#160;&#160; name=&quot;default&quot; auth-algorithms=sha1 enc-algorithms=3des lifetime=30m     <br />&#160;&#160;&#160;&#160; lifebytes=0 pfs-group=modp1536</p>]]></description><category>开发随笔</category><comments>http://blog.bigcomic.com/post/237.html#comment</comments><wfw:comment>http://blog.bigcomic.com/</wfw:comment><wfw:commentRss>http://blog.bigcomic.com/feed.asp?cmt=237</wfw:commentRss><trackback:ping>http://blog.bigcomic.com/cmd.asp?act=tb&amp;id=237&amp;key=fbc495a8</trackback:ping></item></channel></rss>
