饭鱼一刀

添香楼?名闻天下的添香楼?因一道“游鱼戏水”而惊动大内御厨的添香楼?有先帝御赐“添香夜宴天下绝”的添香楼?
是的,正是此添香楼。楠木为栋,梨木为梁,上下三层,一十二间。间间铁木为桌,铁木为凳,汇聚天下名贵瓷器的添香楼。
听说添香楼早以不复当年盛况,那些瓷器早在战火中毁坏殆尽,那些曾经光亮如镜的铁桌也早已被金兵的铁剑划出了道道刻痕。
那些又算得了什么?只要饭鱼还在,添香楼就永远是添香楼,添香楼的游鱼戏水就永远失传不了。
听说他昔年做“添香夜宴”曾引得万人空巷一时传为美谈,可惜自金兵破城后就再也没有听说过他的名字。莫非,他又出现了?
寒门柴草贫家事,锦衣华服帝王家。
越过紫环朱漆的大门,穿过雕梁画柱的回廊,修竹摇曳的一座庭院出现在眼前。
四面青石案几,几上清水一盅,盅后各坐一人。
人,众人皆默,目注场中。
一张永远看不出表情的脸,一双冷冰冰不沾尘事的眼,一双拢在袖中看不见指甲的手。
灶塘里没有火,铁锅里没有油,厨子手里没有铲,这样怎能做出菜?
火升起来了,一尺长五寸宽在八月的烈日下暴晒整整一个月的一点就着的凤梨木,红通通的火苗生起来足有一丈高。
油下了锅了,一两二钱银子一两的脆香坊今晨刚运到的阳光照射时间最长雨水最好秦岭芝麻酿出的小磨香油,倒一滴进锅里逸出的香味足可以飘出三层楼。
铲?没有铲。饭鱼做菜从不用铲。用铲做出的菜也绝不是饭鱼做的。饭鱼擅长一柄五寸三分薄刃带弯滴水不沾的小刀,用时手出袖刀出手,片刻之间挥划而就。
一斤二两一条的青鱼,肉白质嫩,刚由渔夫自水清见底的昙溪捕了送来。养在青釉蓝瓷白底的圆盆里,跳跃之间,便似有三斤的鱼性。
火,越烧越旺;油,四溅散香。
饭鱼已经站在了鱼盆前。青鱼似乎预见到自己的命运,在盆里不安分的游动,越游越快,终至跳动起来。就在青鱼跳起来又将落入盆中的一刹那间,衣袖挥动,刀已出手。
随着溅起的油香,片片鱼球便如雪片似滚入锅中。饭鱼刀未入袖,就势转身,以迅捷无比的动作将葱、姜、蒜、盐、糖抖入锅中。
芳香四溢,鱼已就碗。
饭鱼一脸平静的站在那里。那姿势,竟仿佛未动分毫。
“好!饭鱼一刀果不其然!”说话之人一身紫裘裹住健硕的身材,四方脸,浓眉,一双眼虽在笑中仍如有雷霆之火,不怒而威。正是当日率兵攻破京师的大将军宗恕。
“宗将军有所不知,饭鱼神技不仅在此,请将军移步。”站在宗恕身边之人一身蓝衫,青巾裹头,观其面貌本当极为俊朗,却因带有一股阿谀奉承之气,整个人气势顿时减了几分。
“哦,莫非还有奥妙不成?玉林你倒知道的清楚!”宗恕随玉林来到围宴中间。
青釉蓝瓷白底的圆盆里,青鱼竟娓娓而游。
水清,瓷白,鱼青,随着鱼尾的晃动,清水,白瓷,青鱼仿佛都在动,都是富有生命力的。
宗恕不由睁大了双眼。
“将军请再看这里。”玉林躬身一揖。
白玉碗里,一粒粒滚圆的鱼球竟像被一只无形的手操纵,在热油翻滚中成一个圆环在碗里转动。
“真神技也!”
“将军请回座。”饭鱼端起白玉碗。
“闻这香味已足够回味三生,想必吃起来更是冠绝天下。今天宗某有幸要一尝为快了。哈哈哈哈!”
宗恕回到座位之上。“玉林,听说这道菜名为‘游鱼戏水’……”
正说话间,饭鱼将白玉碗端至宗恕面前。
“这就是‘游鱼戏水’?”宗恕似乎有点失望,原来盛名之下未必是真。碗中鱼球浑圆,何来游鱼之说?但方才看他挥刀破鱼,鱼仍可游动也可称绝天下了。
“将军请借此盅中水一用。”青石雕成的水盅就在宗恕的案上。盅中盛自玉泉山中新取之水,清冽透亮,甜而不浮。
“请!”
饭鱼将盅中清水缓缓注入白玉碗中。
仿若奇迹,原本浑圆天成的鱼球竟慢慢舒展开来,渐至展成鱼形,头,尾,身,翼,无不俱全,在水中翕张游动,仿若天生。而玉碗中油则滴滴如雨滴荷叶般浮在水上。
青釉蓝瓷白底的圆盆,一斤二两一条的昙溪青鱼。盆,还是那个盆;鱼,也仍是那条鱼。
水,清澈见底;鱼,娓娓游动。
四个锦衣裘服的人围着圆盆坐了足足有一个时辰。
“好鱼!”
“好刀功!”
“手非常稳!”
“冷静得可怕!”最后开口的,正是紫衫裘服的大将军宗恕。
“当时在场的,连我在内一共二十五人,他们分别站在饭鱼前后左右不到五丈的不同位置,可说从任何一个角度都绝对可以看清他的出手;这二十四人无论武功,身手,眼力都可说是铁卫队里百中挑一的好手,我相信即使我施展全部的武功也绝难逃过这二十四人的围攻,就算我逃过他们的围攻我施展的武功招式也必定落入他们的眼睛;更何况我就坐在离饭鱼最近的地方,这个位置是我精挑细选的,我确信只要他手一出袖我必定能看清楚他的招式。可惜……”
“可惜?”
“可惜!可惜这二十四人并我在内竟未能看清他的招式。”宗恕一声长叹。
“哦?”
“当时我已感到他的刀气,生冷,凌厉,当他的手挥动时我几乎要一跃而起,我告诉自己,如果他鱼刀一出,我将避无可避。”他似乎又看见了饭鱼那一刀。
“他有三次机会均未出手?”
“是的,三次。仅有的三次机会,但……”
“但你并未感觉到一丝杀气,既没有杀气他当然也就不会出手,你又何必戒备?”
说话之人身倚窗棂,背对众人,黑发束起,腰肢细长挺直,身上披一件团云盘龙的金黄长袍,语声轻而带有一种威仪。这人自打他们进屋就一直未动身形。但是,即使他没有移动过一分,在坐的每一人也都觉得他在看着自己,就仿佛他的后背上也长着一双眼睛,这眼睛就盯着自己。
“是,他未动,臣也不敢擅动。” 宗恕小心翼翼。
“先发制人,后发则受制于人。宗恕呵宗恕,昔**领奇兵孤军直下,铁蹄所到之处无不披靡,而今你的雄风安在?你何时变得谨慎起来了?”年青人转了过来,一张苍白的脸上竟没有年轻人应该有的朝气。他的脸上虽也含着笑意,但这笑意却并没有到达他的眼中,这令他的笑容也生冷了许多。
“臣不敢不谨慎。”身形健硕的宗恕在他面前竟也仿佛矮了一截,宽阔的额头上竟冒出了滴滴的冷汗。
“我大金开疆裂土靠的是英勇无畏,若都似宋人怯弱怕战,今日之宋都又岂是我等能踏足的?”年青人目光在四人脸上一转,四人均暗觉心中一凛,暗想“我圣宗当可算上目光如炬了。”
“朝闻道,夕可死。能见识破鱼一刀,又岂畏死?”年青人目注宗恕。
“滋味如何?”年青人将头复转了出去。窗外暗黑的夜色中开始飘起了雪。
“鲜美润滑,单是那精美已足膛目。”
“飞雪一落,河面结冰,青鱼将难以捕捉。宗恕,叫饭鱼后日进宫来罢。”年青人挥手令四人退出屋外。
“玉林,你已是第几次看饭鱼做菜了?”良久,圣宗缓缓道。
“禀圣宗,已是第三次了。”清秀俊朗的玉林一身蓝衫未变,不知何时出现
在屋里。而屋里的四角也早已升起炭火,令得整间屋子温暖如春。
“仍是一无所获么?”
“圣宗,玉林无法看出破绽。”
“你看!”圣宗伸出一只手。他的手,修长细致,手指曲伸,两指中夹着一条青鱼。
玉林看着他手中的那尾青鱼。一斤二两的青鱼纵然离开了水也有二斤的鱼性,此刻夹在圣宗左手的两根手指中间竟动弹不得。圣宗右手轻轻在鱼身抚过,只见鱼身两边各竖起三道被刀划出后掀起的鱼鳞,鳞未散而鱼肉已缺。
“挥刀,破鱼,成球,入锅,仅在一瞬之间。”圣宗手指一抖,已将青鱼弹入盆中,鱼入水,而滴水未溅。
“鱼身划了6刀而鱼似未损,此人刀功非凡。”圣宗以一条雪白的手绢搽拭手指。“据说徽宗曾品尝过他的游鱼戏水,并赐字?”
“是。”
“徽宗书画妙绝天下,可惜因画误国,如今在五羊城虽身陷樊笼但仍可作画,也算对得起他了。”
“是,圣宗仁慈。”
“听说你曾在徽宗身边服侍?你看我比之徽宗何如?”
“玉林不敢。玉林虽曾服侍徽宗但为远侍,只在殿外伺候,徽宗与圣宗……不可同日而语。”玉林一直低垂着头。
“是么?……你也下去吧。”
“圣宗……”
圣宗意兴阑珊,竟似再也不愿多说一个字,挥挥手径自往屋里走去。
雪白的绢纸。
未干的墨迹。
一枝湖州钟氏所做玉管小毫横陈纸上。
画中,是一树傲雪而开的白梅。遒劲的枝干,乍开的梅花,凌乱的雪花。
雪花虽乱,但又怎及人的心乱?
圣宗站在窗前,似有千头万绪,想仰首一啸,欲振臂一呼。
多少日了,那种独立云霄罕匹敌手的感觉。
冬月初三。雪住,风冷。
圣宗在玉华殿。
四面屏风围住寒风,殿内温暖如春。
新锅已架起,凤梨木噼里啪啦烧得正欢,青鱼在圆盆里自由自在的游来游去。
白玉碗,青石盅一一摆在案上。
宫中的太医过来用银针一一试探,他逐一细致地检查了每一件器皿,向立在一边的铁卫首领摇了摇头,退下。
圣宗对眼前的一切很满意。
他一直很想亲眼看一下饭鱼。此刻饭鱼就站在他面前的台阶下。样貌并不太出众,身材也只是中等,一双眼睛细长。此刻他正用一种平静而内敛的眼光看着自己。他突然觉得自己找到了一直在寻而未得的某种东西。是什么?脑海里一闪而过,却无法抓住。
“饭鱼,你可以开始了。”玉林看了看圣宗,圣宗的眼睛里有某种期待。
饭鱼转身向灶边走去。他的步伐稳重而坚定,每一步跨出的都是那么的自然,充满了信心。
青鱼跳起,饭鱼袖挥手动刀出,鱼球落入锅中,青鱼落回水中。一切是那么的自然。
圣宗双目盯着饭鱼的衣袖。
调料,盛碗,做汤,一气呵成。
“游鱼戏水!”圣宗看着眼前的鱼球慢慢舒展。白玉碗里,六条饭鱼活灵活现的游动,油滴在水上轻盈的晃动,眼前简直是一个绝美的奇迹,又教人怎生下箸?
生似不忍破坏这一切,圣宗素手一拈,一滴鲜汤落入喉中。
就在此刻,饭鱼衣袖一挥,手已探出。就在他动的同时,圣宗突然也动了,素手连弹,后发而先至已一击点在饭鱼胸前。
“哦?”圣宗一惊,手往回缩。
就在他手将缩未缩之际,玉林已如猛虎扑林一跃而来。手中霍然一柄锋利至极的薄刃宝刀。
刀身直没至背。
“护驾!”站在殿下的铁卫首领大声道。宗恕等并殿外的铁卫蜂拥而至。
“你?”
“为什么?”圣宗的语气中有着太多的不相信与愕然。
“玉林,孤王自问待你不薄,自你入宫以来孤王对你信任有加,你为何背叛孤王?”
“饭鱼,你为什么要这么做?”圣宗看着在铁卫的剑戟下已满身血痕的两人。
“饭鱼你的手艺天下无双,只要你愿意,孤王可以封你为御厨,搜罗天下珍禽供你尽情发挥,你尽可以创造出诸如游龙戏水,单凤朝阳这样的旷世奇菜,你的绝技将名列膳食谱,你的盛名将代代相传,你可愿归顺我大金?”
“孤王一向爱才惜才,只要你二人降服,孤王对今日之事可以既往不咎。”
“我只有一事不明,尚盼告之。”良久,圣宗道。
“你的刀功破鱼是为一绝,以宗恕之眼力,原可断定饭鱼绝非会武功之人,你明知宗恕乃我大金一员猛将,他一生乃是在戎马中度过,统领军士无数,可谓阅人无错,你为何要显露你的刀功?如果你在宗恕府不施展出来,我原本不会在意你挥刀的动作,更想不到你原来丝毫不会武功。”
饭鱼浅笑,他松开了一直紧握住的手,也就是他方才在案前突然挥动引起圣宗随之而动的手。
饭鱼的手由于常年握刀变得坚毅无比,短而粗的手指上充满了力度。
此刻在他摊开的手掌中间并没有握有鱼刀,而是轻柔的握着一条饭鱼,一条以青鱼肉挥划而做成的游鱼。
原来他方才挥手只不过是自碗里取了一条游鱼。
“我明白了,你知我定然防你,故意取鱼吸引我视线,好教玉林一击得中。可惜你计谋虽好,孤王早已洞悉其谋,否则,又岂会容你近孤王身侧?”圣宗苍白的脸上此刻由于兴奋而变得红润。
“至于你,玉林,你又岂是孤王敌手,你刺向孤王的一剑又岂能伤孤王分毫?”圣宗双臂一振,玉林插在他背上的短剑已抖落地上。
“玉林,你又有何话说?”他得意的转向玉林。
“金贼毁我河山,残我百姓,凶行历历,凡我大宋百姓人人恨不得食汝之肉,可恨我功亏一篑,未能斩杀你于刀下!”玉林恨恨地将目光转向一旁。
“可惜你宋朝无人,我大军到处无不披靡,那继任的新君已躲在新都向我俯首称臣,你二人又何必在此枉送性命?”圣宗面色数变。
“你错了。我大宋义士就如过江之鲤斩杀不尽,我二人不过是马前小卒而已!”
“义士?是,汉人崇尚此风。可惜天佑我大金,你们的计谋终是不能得逞。”圣宗以睥睨的目光忘向二人。“我还可给你们一次机会。”
“休要得意!只我二人就可将你杀死!”一直没有开口的饭鱼道。
“是么?”圣宗一脸的不信。他注目饭鱼。
突然,他又看到了饭鱼眼中那种平静而内敛的神色,那种稳重而坚定,充满了信心的表情。
是什么环节出了错?有什么他没有注意到的细节?圣宗的内心不安起来。玉林转首看向饭鱼,神色开始平静,再不复刚才的冲动。
电光火石之间,圣宗面色狂变,他跃下座椅一把抓住饭鱼衣领。“快说,你在鱼汤里下了什么?”
“鲜汤一碗入君喉,包君无愁亦无忧。”饭鱼曼声轻吟。
“快说!”铁卫的剑戟再次抵住二人。
“一碗鱼汤就叫圣宗变了颜色,可笑啊可笑。圣宗自以为会万寿无疆么?”玉林看着他,饭鱼的笑容原也可以这么洒脱的。
“至毒之毒,无药可解!”玉林的嘴角含着冷笑。
“饭鱼!”圣宗心念数转,终颓然放弃。
“圣宗!”宗恕等人跪倒在大殿上。
“将此二人斩首,添香楼夷为平地。”圣宗坐回座椅,望着被拖走的二人,神色渐复平静。
“游鱼戏水自此失传矣!可惜我朝无此智勇双全之侠士。宗恕听令,示众三日后将二人盛殓。

三日后,金圣宗 殁。

Flash和PHP交互中同步session

今天在使用Uploadify和thinkphp进行多文件上传时遇到一个问题,在选择上传的文件并自动上传完成之后,弹出警告窗口提示“http 301”或者“http 302”重定向。后来发现是因为通过Flash插件发起的请求是另外一个客户端发起的,跟浏览器的会话不一致,而我的服务器后端代码恰好是有登录认证的。这就需要我们把当前的session_id通过url或者post的方式传递给php。

一开始我设想将session_id作为query_string传递给php后(即$_GET['session_id']或者$_POST['session_id']),通过session_destory()、session_id($_REQUEST['session_id'])、session_start()系列函数,将flash的会话同步为和浏览器一致。而一技术群里有高手提醒说只要把php.ini中的session.name作为参数传递,PHP就会自动处理了。也就是$_GET或者$_POST或者$_COOKIE数组里有一个“PHPSESSID=当前会话的id”,就能让php自动处理、实现会话的传递了。就是这样:

$("#uploadify").uploadify({
    'uploader'       : '/xxx/xxx/uploadify.swf',
    'script'         : '/xxx/xxx/xxx.php',
    'scriptData'     : {'PHPSESSID' : ''},
    ....

或者:

$("#uploadify").uploadify({
    'uploader'       : '/xxx/xxx/uploadify.swf',
    'script'         : '/xxx/xxx/xxx.php?PHPSESSID=',
    ...

不过谁能告诉我Flash的Cookies要怎么清除啊。。因为这个原因调试过程中一直困难重重。哈哈。。实在太笨了

淘宝商城轮播(幻灯片)效果的jQuery实现及反思

淘宝网的前端开发团队是业界最优秀的前端开发团队之一。淘宝网和淘宝商城的每一个页面都凝结了淘宝前端开发者的心血——他们关心用户操作和感受,力求给用户最好的体验。

KISSY是淘宝前端团队自主设计的一个Javascript 类库,其设计原则是“小巧灵活、简洁实用,使用起来让人感觉愉悦”。KISSY还封装了一些常用的组件,比如图片轮播等各种Switchable组件,被广泛的应用到了淘宝网和淘宝商城的各个角落,但今天的主角……呃……好像是它,也许不是它,这并不重要,先让我们来试试基于jQuery的仿淘宝网图片轮播效果的实现,并作一些浅显的反思。

博主曾写过一个简单的jQuery幻灯插件Xslider。那么能不能通过对Xslider的定制,制作出符合我们要求的轮播效果呢?答案是可以的。下面我们看代码以及Demo:
Code:


Demo:

可以看到,通过对博主的Xslider插件进行简单的定制,我们貌似就可以做出类似淘宝商城的各种轮播特效。
然而实际工作中,需求往往是变化多端的,我们还应该考虑在其他情况下插件的可重用性:比如图片轮播每次不是切换单一张图片,而是多张图片;比如轮播的形式不仅仅是图片,有可能是文字,甚至每张幻灯片的版面都截然不同;再比如怎么去构建一个本质上与轮播类似的tab(标签)页(可能还要实现内容的AJAX加载)——诸如此类的情况我们在插件设计的时候也应该尽量考虑到。
反观博主自己开发的Xslider插件,一旦有新需求,往往会比较依赖对css、HTML结构、甚至是插件代码的修改以适应新需求,代码可重用的程度仍然比较低,而且长期这么修修补补,代码也容易变臃肿。其根本原因就是没有去分析这些特定需求、场景,从而进行不同层次的抽象,真正达到组件化。
当然,这么做也有好处就是,只进行了一层抽象,结构清晰,比较容易理解。
说到这里,竟免不了要拿jQuery的插件与KISSY的组件进行一番比较。可博主没有用过KISSY,只看过少量的文档,进行这番比较难免断章取义,所以留给读者和自己将来再作对比,暂且打住……mark here
那么在前端代码中,我们应该怎样做才能确保插件(组件)的可重用和扩展性呢?下面一段摘自《行进中的前端类库:KISSY》,供大家参考。

KISSY的组件严格遵守适度灵活原则,在特定的场景下进行设计。任何抽象场景,都有不同的抽象层次。比如淘宝首页的图片轮播,至少有以下三种层次的抽象:

  1. 图片轮播是可轮播的多张图片
  2. 图片轮播是可切换的一组内容
  3. 图片轮播是对命令的响应

第一种抽象,会让我们做出像TBra里的SimpleSide类似的组件,功能很纯粹单一。大部分站点用jQuery等代码实现的图片轮播,也是基于这种简单明了的抽象。

第二种抽象,会让我们思考更多。比如图片轮播和标签页切换的关系,从这一层的抽象来讲,标签页和轮播图片本质上一样的,都是一组可切换的内容。在这一层抽象上,我们就可以实现Switchable(可切换)组件,有了Switchable,所有可以抽象为可切换内容的可视化组件,就都可以快速基于Switchable来实现,而不是全新写一个。在淘宝首页上,大部分可视化组件都是Switchable组件,非常便捷。

第三层抽象,很抽象,但抽象层次越高,落地越难。基本所有交互组件,都可以抽象成为对用户行为的响应。适度灵活原则,能避免我们掉入过度抽象的陷阱。

改进Smarty的缓存过期检测

Smarty仍然是被广泛采用的模板引擎,国产的开源网店程序Ecshop就是使用Smarty作模板引擎,它广泛采用了Smarty的静态缓存技术。

然而,Smarty检查缓存新旧居然是通过往缓存文件的开头写入经过一串经过序列化的数组(记录着缓存的过期时间等信息)——检查的时候把第一个“<”出现之前的字符串读入并unserialize(),从而获取原本数组中记录着的缓存过期时间,进而来判断是否更新缓存。

这么做有一个缺点,就是每次检查缓存是否过期的时候都要进行一次读取文件和unserialize()操作,势必影响了效率,我们不妨用以下方法来取代Smarty默认的缓存机制:

$compile_file = '../temp/compile/index.html';
if (file_exist($compile_file))
{
    $filestat = stat($compile_file)
    if (time() - $tmp['mtime'] < $smarty->cache_lifetime) //如果缓存未过期则直接输出
    {
        echo file_get_contents($compile_file);
        exit(1);
    }
    //如果缓存过期了 生成缓存+输出
    do_some_db_query(); //一些数据库查询操作
    $html = $smarty->fetch($compile_file,$smarty->cache_id);
    file_put_contents($compile_filel);
    echo $html;
}

此外,根据“在输出缓存之前,永不加载没用的东西”这条原则,Smarty类的引入和实例化应该放在过期检测之后,而不是放在init.php里,这样,如果缓存存在,就直接输出缓存并终止代码的运行,能最大化的提升应用的效率。

在网上找到了篇牛人写的关于此方法的测试和改进:
http://www.9enjoy.com/optimize-smarty-html-test/

[转]MySQL+HandlerSocket = MySQL的功能+NoSQL的性能

下文转自国内某PHP大牛的博客,原文链接:http://www.dualface.com/index.php/archives/1124

最近看到一篇博客,用8核服务器跑MySQL达到了每秒750,000次PK(主键)查询。原文网址:http://yoshinorimatsunobu.blogspot.com/2010/10/using-mysql-as-nosql-story-for.html(翻墙)。

文章首先分析了MySQL查询时的瓶颈(SQL分析、数据表的打开关闭等),然后介绍了HandlerSocket插件。HandlerSocket插件让MySQL达到了近两倍于memcached的查询性能,灰常的niubi!

                           approx qps     server CPU util
MySQL via SQL                105,000      %us 60%  %sy 28%
memcached                    420,000      %us  8%  %sy 88%
MySQL via HandlerSocket      750,000      %us 45%  %sy 53%

MySQL+HandlerSocket的架构如下图(来自原文):

mysql_handlersocket_thumb.png

从图中可以看到,HandlerSocket开了9998和9999端口,分别用于读写操作。对于基于主键的CRUD操作,客户端通过HandlerSocket进行,省略了SQL分析、数据表的打开关闭等操作。而其他查询仍然通过MySQL的3306端口进行。

相比常见的memcached+MySQL的架构,MySQL+HandlerSocket架构有两个最明显的优势:

  • 节约内存:由于MySQL InnoDB本身就会缓存数据,所以没必要在memcached多保存一份。
  • 避免数据不一致性:引入memcached后,一个很头痛的问题就是保证数据的一致性。而去掉memcached后,由于所有的数据库操作都是直接达到InnoDB引擎,所以完全消除了此问题。

相对于其他NoSQL解决方案,MySQL+HandlerSocket也有优势:

  • 降低应用开发难度:由于SQL提供了丰富的查询功能,相当于大多数NoSQL来说,开发应用时更简单。
  • 降低风险:NoSQL各有特色,选择不慎会造成深远的影响。而且能够完全掌握NoSQL的技术人员也不够普遍,出了问题不一定能够马上解决。

不过,HandlerSocket虽然省掉了一些步骤,但要是内存不足以缓存大部分常用数据。那么HandlerSocket带来的优势就荡然无存了。因此在使用HandlerSocket时,服务器一定要具备足够的内存空间用于InnoDB的Buffer Pool。此外对PHP开发者来说,HandlerSocket目前还没有可用的PHP扩展。

作者说他们已经将HandlerSocket用于了生产环境,取得了很好的效果。作者目前就职于日本最大的社会化游戏平台提供商DeNA

最后,附上HandelrSocket的仓库地址,这是一个开源项目:http://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL

发布一个jQuery插件-Xslider – 令我着迷的jQuery(二)

算是自己写的第一个jQuery插件,js代码很早就写好了,但是因为一个css问题被困住了,直到今天才重新想起。

Xslider:基于jQuery的拉样片特效插件,也可以用作jQuery Tab选项卡,目前支持四种切换特效:X轴、Y轴、渐变和基本,这里是Demo
使用方法很简单:

$("#slider1").Xslider();

自定义选项:

$("#slider1").Xslider({
    affect: 'scrollx', //效果  有scrollx|scrolly|fade|none
    speed: 800, //动画速度
    space: 5000, //时间间隔
    auto: true, //自动滚动
    trigger: 'mouseover', //触发事件 注意用mouseover代替hover
    conbox: '.conbox', //内容容器id或class
    ctag: 'a', //内容标签 默认为a
    switcher: '.switcher', //切换触发器id或class
    stag: 'a', //切换器标签 默认为a
    current:'cur', //当前切换器样式名称
    prebtn: '.pre', //TODO 前一张按钮
    nextbtn:'.next', //TODO 下一张按钮
    recycle:true, //TODO 是否循环
    rand:false //TODO 是否随机指定首张幻灯图片
});

最后说一句,IE6很邪恶,但我爱它的盒子模型。

我常用的gVim配置和插件

这几天一直在Linux底下折腾,免不了怀着一颗装B的心,把gVim打造成一个“接近IDE的编辑器”,再怀着一颗媚俗的心,来这里写一篇《我常用的gVim配置和配置》。但本人确确实实是体会到了gVim的高效,尤其是在使用笔记本键盘的情况下,号称“让你的双手不离开打字区”,这真是个伟大的设计思路。

先上一张我的gVim截图:

怎么样,还行吧,自我感觉挺酷的:-)

下面是我的gVim配置,都写了注释的:

"gVim启动窗口位置 大小
winpos 173 162
set lines=25 columns=108 

"设定文件编码
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936

syntax on

"配色风格
colorscheme desert

"文本缩进设置
set tabstop=4
set softtabstop=4
set shiftwidth=4
set autoindent
set cindent
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
set nu

"如果没有下面这段就拷贝进来吧 虽然不知道干什么的
if &term=="xterm"
set t_Co=8
set t_Sb=^[[4%dm
set t_Sf=^[[3%dm
endif

"设定折叠方式
"set foldmethod=indent

"以下字符将被视为单词的一部分 (ASCII):
"set iskeyword+=33-47,58-64,91-96,123-128

"打开文件自动跳转到上次编辑的行
au BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif

"Get out of VI's compatible mode..
set nocompatible

"Sets how many lines of history VIM har to remember
set history=400

"文件在外部被修改则自动保存
set autoread

" vim用户界面

"Turn on WiLd menu
set wildmenu

"Always show current position
set ruler

"The commandbar is 2 high
set cmdheight=2

"Show line number 显示行号
set nu

"Set backspace
set backspace=eol,start,indent

"Bbackspace and cursor keys wrap to
set whichwrap+=<,>,h,l

"show matching bracets
set showmatch

"How many tenths of a second to blink
set mat=2

filetype plugin on

"同样适用于jQuery的js语法高亮
au BufRead,BufNewFile *.js set syntax=jquery

map  :NERDTreeToggle

nmap   :TlistToggle
let Tlist_Use_Right_Window=1
set tags=tags;/

"对NERD_commenter的设置
let NERDShutUp=1
"支持单行和多行的选择,//格式
map  ,c

" phpDocumentor for VIM
inoremap  :call PhpDocSingle()
nnoremap  :call PhpDocSingle()
vnoremap  :call PhpDocRange()

"对.vimrc配置文件的修改立即生效
autocmd! bufwritepost _vimrc source %

然后是我使用的插件:
NERDTreeToggle :用于导航和打开文件,在上面截图的左边区域
TlistToggle :用于导航代码中的类、变量以及函数(方法)
OmniComplete :代码的自动补全,快捷键是Ctrl+x Ctrl+o,支持很多种语言
NERDCommenter :用于给代码加注释
phpDocumentor :用于给php类和函数加文档 按下alt+/时

非常Cool的滑块导航菜单-令我着迷的jQuery(一)

As is known to us,jQuery是一个短小精悍的javascript library。它以”Write less,do more”的宗旨,以及提供许多成熟的插件及实现,俘获了无数爱偷懒的Programmers的心。今天和大家分享我在项目中使用jQuery编写的一处页面特效,我姑且自顾自的把它称作滑块导航菜单,是一种类似LavaLamp的特效,菜单按钮的背景会有鼠标跟随、以及弹簧动画的特效,很有意思(ps:大家如果有更好的命名方式,荒淫指出,哈哈)。
全部源代码如下,此外Demo地址,荒淫指教:
javascript(除了jQuery,还使用了easing扩展):

$(function(){
	$('#nav_btn_bg').fadeIn(0.2);
	$('#nav_btn').mouseover(function(e){ //这里用到了比事件绑定更高级的事件委托机制
		if(e.target.id=='home') {
			var ml = -5;
		}else if(e.target.id=='sk') {
			var ml = 145;
		}else if(e.target.id=='lottery') {
			var ml = 290;
		}
		$('#nav_btn_bg').stop(true).animate({marginLeft:ml},{easing: 'easeOutBack'});
	});
	$('#nav_btn').mouseleave(function(){
		$('#nav_btn_bg').stop(true).animate({marginLeft:[290,'easeOutBounce'],duration: 800}); //jQuery1.4以后才能这么写
	});
});

HTML(How To Make Love):

CSS样式:

@charset "utf-8";
/* CSS Document */
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,
form,fieldset,input,textarea,p,blockquote,th,td {
padding: 0;
margin: 0;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
fieldset,img {
border: 0;
}
address,caption,cite,code,dfn,em,strong,th,var {
font-weight: normal;
font-style: normal;
}
ol,ul {
list-style: none;
}
caption,th {
text-align: left;
}
h1,h2,h3,h4,h5,h6 {
font-weight: normal;
font-size: 100%;
}
q:before,q:after {
content:”;
}
abbr,acronym { border: 0;
}
#header{
	width:100%;
	height:175px;
	background:url('head_bg.jpg') repeat-x;
}
#nav{
	width:960px;
	margin:0 auto;
	position:relative !important;
}
#logo{
	display:inline-block;
	width:325px;
	height:70px;
	margin-top:15px;
	float:left;
}
#nav_btn{
	height:60px;
	width:420px;
	float:left;
	margin-top:35px;
	margin-left:45px;
	background:url('nav_btn_bg_06.gif') no-repeat;
	position:relative;
}
#nav_bar{
	position:absolute;
	z-index:2;
}
#nav_btn a{
	display:inline-block;
	width:133px;
	height:55px;
}
#nav_btn_bg{
	width:120px;
	height:55px;
	background:#cccccc;
	-webkit-border-radius:5px;
	-moz-border-radius:5px;
	border-radius:5px;
	position:absolute;
	z-index:1;
	left:0px;
	top:2px;
	opacity:0.2;
	filter:alpha(opacity=20);
	margin-left:290px;
	display:none;
}

如何将删除的Ubuntu面板找回来

刚才因为淘气,把Ubuntu的上下面板都给删除鸟~

在网上搜索到了恢复面板到默认状态的方法如下

打开终端,终端窗口打开之后,立即在提示符后面输入下列命令:
gconftool –recursive-unset /apps/panel
(注意:每个斜杠 “/” 后面没有空格)
接下来输入下列命令:
rm -rf ~/.gconf/apps/panel

最后 重启Gnome,方法是:

Ctrl+Alt+F1登录到终端后

/etc/init.d/gdm restart

不要迷信IETester

今天由于部门唯一的美工Yang请假回家,下面这个页面的头部的切图任务就理所当然的就由我临时客串美工来完成。在做到导航按钮的时候,需要在鼠标移过的时候,背景会出现切换的效果。本来只要在a标签的:hover伪类中把背景图片换成另一张,而我觉得这样的切换太普通,没有什么挑战性。于是我决定试试自己实现类似LavaLamp的效果。

我在按钮下面加了个div作为背景,颜色是#cccccc,并设置透明度是20%。于是在chrome、Firefox和ie7+下,均能正常显示(ie8以下版本浏览器不能显示出圆角),而使用IETester模拟的IE6的下,却出现了不透明度的bug。尝试很多了方法,包括使用jQuery兼容的.css({‘opacity’:0.2})和ie6下的filter:alpha(opacity=20),均是一样的ugly。。如下图:

最后尝试使用原版IE6打开,发现一切正常,哇哈哈。。如果没亲自遇到,实在不敢相信,原先我是迷信ietester的,现在看来只有春哥和曾哥,才值得你信赖。