用OllyDbg反汇编静态分析破解VB程序

注:本文仅做破解技术学习交流之用,请勿用于商业用途!使用本文所介绍的技术手段产生任何法律后果由使用者承担,与本文作者无关!另:请大家多多支持国产共享软件,支持正版!——Candura

  关于用VB编写的程序的破解,网上搜索到的最常用的一种解决方案是使用“OllyDbg”给“MSVBVM60.dll”文件内几个常用的比较函数(比如“vbaStrCmp”“vbaStrComp”)下断点来进行动态分析,从而找出注册码。或者用“SmartCheck”来跟踪出错找出注册码,这些基本上都是属于动态分析的一个范畴。

  但是我本人比较懒,而且由于本人技术实在是有限,今天要破解的目标程序(为保护软件作者在此隐去所破解的软件名称,一律用“目标程序”代替,下同)动态追踪怎么也追不到注册码,所以只好用静态分析的方式来进行暴力破解了~

  今天要用到的软件主要是:PEiD(查壳)、OllyDbg(进行反汇编静态分析)、GetVBRes(修改VB资源的小工具)。

  首先用“PEiD”来对目标程序查壳(如下图),很好,没有加什么壳,省掉了脱壳的步骤。

  接下来先运行软件随便输入一个错误的注册码,唔,当然是不能注册的,弹出来一个对话框说“对不起,您输入的注册码有误!”

  唔,就根据这句提示来找跳转好了,进入“OllyDbg”载入目标程序,用“Ultra String Reference”插件来检索注册错误的提示,结果不管是用ASCII还是Unicode,都检索不到,不仅检索不到,更是连一个中文都没看到。

  好吧,面对这个问题就该轮到“GetVBRes”软件出场了,让你丫的找不到中文,我就把注册错误的提示信息改成英文,看你还搜不到!用“GetVBRes”载入目标程序,唔,这下找到注册失败的提示了,把注册失败的提示替换成英文字符(我把它改成了“CanduraCandura”,字符长度刚好跟原来一样,不过这不是必须的,因为软件会自动帮你补空格到原来长度)。

  修改完成之后再输入错误的注册码就提示我刚才替换的字符串了。

  现在替换完了重新用“OllyDbg”来载入目标程序查找,好家伙,竟然找到了四个地方!以前我破解过这款软件的1.01版本,只有一个地方进行注册码验证,果然作者更新版本的时候,在增加功能的同时也增加了一些防破解的处理。

  那么现在先从找到的第一个地方开始吧,在第一个“canduracandura”那一行按回车键进入它所在的汇编源码当中,我们来到了地址“00435915”,然后一边观察信息窗口一边按方向键“↑”来找关键跳转。没按几下,到达地址“004358AE”的时候信息窗口给出提示“跳转来自 00433B6E”,这就是我们要找的关键跳转了!

  按下“Ctrl+G”输入刚才找到的“00433B6E”地址之后确定,代码来到该地址的位置,发现它是使用“je”来进行跳转的。

  在这里先普及一下暴力破解时候用到的一些汇编小常识,汇编代码里面用来做跳转的一般有“je/jne、jz/jnz、jmp”等等,“je”的作用是上一条汇编指令执行完后标志位“ZF”如果为1则进行跳转,“jne”的作用是“ZF”为0则进行跳转,“jz/jnz”的作用基本相同。一般情况下他们的上一条语句是做减法或者是做cmp(比较命令)操作,这个很好理解,通过比较判断输入的注册码是否正确,如果正确则跳转到成功注册,如果错误则跳转到注册失败。

  在这个程序的例子中,我们通过静态分析发现它用“je”来进行跳转,那么我们可以理解为如果输入错误的注册码就跳转到注册失败。这样理解清楚了之后就好办了,只要把“je”改成“jne”,变成如果输入错误的注册码就不跳转到注册失败,那么既然无法跳转到注册失败,最后当然是能够跳转到注册成功的地方咯。

  说改就改,双击刚才找到的关键跳转那一行,把“je”改成“jne”之后回车,会发现代码并不是变成了“jne”而是变成了“jnz”,这刚好侧面印证了“je/jne”和“jz/jnz”在一定条件下是通用的。修改好了之后如下图。

  当然光修改这里还不行,忘了我们之前是搜索到了四个“canduracandura”么,要把那四个找到的地方都用这种方法找到关键跳转来进行修改。全部修改完成后,在汇编代码部分那里点击鼠标右键选择“复制到可执行文件”→“所有修改”,把我们做好修改的程序保存起来。运行新修改好的程序再进行注册看看,还是输入错误的注册码,这下能成功注册了!

  而且注册完成之后那个输入框自动会显示正确的注册码,所以之前也懒得动态追踪注册码算法来自己计算注册码了,直接暴力破解搞定多好~试一下原本注册之前不能用功能,现在都能一一使用了,破解完成!

  为了以后使用方便,再用制作补丁的软件来制作生成一个破解补丁,整个破解过程就圆满结束了~

  最后再要重新郑重声明一下,本文仅做技术的学习交流,不承担任何由此项技术造成的任何法律问题!然后还是希望大家多多支持正版,特别是国产的一些共享软件。这些软件给我们带来了很多方便,作者编写和维护很艰辛,而且很多很好用的小软件并没有漫天要价,而是那么几块十几块的价格,如果试用觉得合适并且想长期使用,并且口袋能够支持的话,最好还是尽量购买正版支持正版吧~

也来谈谈今晚的比赛

  比分最终定格在3-3!应该说,这场比赛的比分确实是充分反映了双方的实力和发挥的一个比分。今天的中国队确实是打出了自己的气势,果然没有辜负傅指导赛前做出的承诺“要让日本队对这支中国队留下深刻印象”。

  简单说说比赛过程,其实基本上一些关键过程都在我刷屏直播的说说里面了。开场4分钟的时候于大宝在禁区内灵活控球卡住身位,逼迫日本队犯规获得点球,然后王永珀轻松罚入点球,开始领先日本队。对于中国队来说这是一个非常好的开局,此后中国队一直通过前场的逼抢、压制控制着场上的节奏。在临近上半场结束的时候,日本队通过角球的机会,抢第二点破门扳平比分,从这时开始中国队后防线特别是两个中卫之间沟通不够盯漏人的问题已经开始展现出来了。下半场双方易地再战,其实在55分钟左右的时候,日本队就有一次快速发出界外球,然后边路传中,对方前锋工藤壮人迅速从两个中卫之间插上抢点头球,可惜没有顶到。这球因为太迅速了,甚至直播的导播都没来得及把镜头切换过来(还在放着之前的慢镜),等到镜头切换过去的时候,已经是门将曾诚冲着后卫怒吼的画面了。应该说,这就已经是对方要破门的前兆了。果然比赛到了59分钟的时候,对方下底中低球传中,柿谷曜一朗抢前点头球破门将比分反超为2-1。过了一分钟不到,又是柿谷曜一朗中路突破,杜威盯人失误,连同干扰李学鹏防守,让对方把球分给工藤壮人让后者单刀破门将比分改写为3-1。两个中后卫确实在本场比赛中发挥得不行。不过中国队并没有放弃,80分钟的时候王永珀劲射打在横梁上弹回来,下半场替换上场的小将张稀哲争抢时被对方侵犯,中国队再次获得点球,还是王永珀冷静的罚入点球将比分扳为2-3。比赛到了84分钟,最精彩的进球出现了,荣昊边路突破下底传中,孙可后点插上舍身铲射破门将比分扳平!恩,整场比赛的大致过程就是这样(貌似有点啰嗦了,表怪我~ ::>_<::)。

  纵观正常比赛下来,其实中国队还是有值得反思的地方的,几个丢球几乎都是跟中后卫的漏人和防守失误有关。到了下半场之后,中国队的球员体能也开始下降,不能再像上半场那样前场逼抢,而是只能收缩在后防线上,所以也给了对方压制的机会。但是好就好在中国队换上张稀哲、孙可这些小将之后,重新带动了整个球队的冲劲儿,又能继续坚持上半场的策略,重新掌握了比赛的节奏,给之后的反击和扳平比分打下了基础。

  说实话,今天的这支日本队并不是最强阵容,旅欧球员都没有回来参赛,所以这支日本队其实只是一支二线队而已。就单个球员的技术水平来看,其实双方是差不多的,但是日本队有几点是非常值得中国队学习的。一个是日本队员整体的战术素养,日本的职业联赛发展了那么多年,带给日本球员烙印最深的就是这个,不管是哪个年龄段的日本队,我们都可以看到他们是真正的团队作战,不管是大牌球员还是年轻球员,都是紧紧地团结在一起去执行战术;再一个就是他们的体能,日本队员的体能非常充沛,其实下半场日本队两次破门也跟中国队员体能开始下降有很大关系,而且到了比赛最后时刻中国队拼尽全力去压制的时候,对方也依然能够有体力来防守和反击。这两点是目前中国队跟日本队差别最大的地方,或者说差距最大的地方。虽然这场比赛中国队和日本队战成了3-3,对于球迷来说也是一个非常满意的结果,但是我们不能妄自菲薄,要认识到我们的国家队的水平其实还是跟其他强队有很大差距的。

  恩,其实有些话在上个月中泰之战之后就想说了。那场比赛踢完后,很多跳出来骂国家队的人大多都是没在关注中国队这几年的发展的人,而是纯粹从新闻里面看了比分就跳出来谩骂、人身攻击了!真正在关心中国足球,关心中国队的球迷一定不会忘记,就在中泰之战之前的三天,中国队用全主力阵容和同样是几乎全主力出站的荷兰队打了一场比赛,虽然那一场比赛是0-2输掉了,但是真正看了比赛的球迷会记得,那场比赛当中中国队也是拼得非常认真和努力,让荷兰队也是吃尽了苦头的。之后的那场中泰之战中国队做了大量的人员轮换,可以说基本上是以二线队阵容出战,虽然打出这个结果本身也是有他们的问题,但是我觉得那些根本没在关注和关心中国足球的人也没资格去谩骂和讽刺我们的国家队。

  回到今天的这一场比赛,就我个人觉得,中国队的表现非常卖力,也拼尽全力到了最后,甚至在扳平比分之后,最后的几分钟还继续在拼搏争取拿下3分的!这样的表现足以对得起他们身上的球衣了。看比赛那会儿我就想,如果坚持那样的拼抢,哪怕这场比赛的最终结果是输掉的,我们也没有理由去批评这支球队了。

  中国足球还有很长的一段路要走,我们不应该因为某场比赛的好坏就对这整支球队盲目的吹捧和排斥。中国足球真正需要的,是踏踏实实的完善年轻球员的培养体系,完善职业联赛的各个方面,不要急功近利,从最基础的地方做起。日本队也不是一朝一夕成为东亚强者的,他们也是一步步的从青少年培训、职业联赛组织这些基础上慢慢熬才有今天的水平。作为球迷,我们真正应该做的就是少一些谩骂,多一些支持和理解。中国队会越来越好的!加油!

别了,爵爷;别了,青春!

  终场哨吹响的那一霎那,我知道,该来的始终会来,该结束的始终会结束。也许比赛的结果,并不是我们期待的那个满意的答卷,可此时此刻,已经没有人会在关注这个无关痛痒的结果。

  自从爱上曼联以来,从来没有想过,曼联会没有那个红鼻子老头,没有那个会在更衣室里向任何大牌球员开吹风机的红鼻子老头,没有那个会在教练席上嚼着口香糖的红鼻子老头,没有那个会在场上队员进球后在场边蹦得像个孩子一样的红鼻子老头。

  他叫阿莱克斯·弗格森,一个倔强的苏格兰老头。我们这个时代熟知的那个红魔,属于这个有着女皇册封爵士头衔的老头。曼联之所以能成为红魔,是因为这个不服输的老头子,他为曼联注入了真正的红魔精神,把曼联打造成为令世界足坛颤抖的红色魔鬼!

  没有他,就没有现在的红魔。是他“把他妈的利物浦从王座上踢下来”,是他“凭借一群小孩子”就拿到了联赛冠军。在越来越金元化的职业足球时代,曼联遭受过各种各样的挑战,温格的阿森纳、穆里尼奥的切尔西、阿布扎比的曼城……但在这位功勋教头的带领下,曼联一次次的从低谷中爬起来,不断的用冠军向世人证明,这是永远不会服输的红魔!一次次比赛中的绝杀、一次次的赛季大逆转、一次次的创造奇迹!这就是老爵爷治下的铁血红魔!

  曼联可以没有大牌球星,但不能没有弗格森!在95年放弃当打之年的坎切尔斯基和保罗·因斯,在02年放弃了绝对的后防支柱斯塔姆,03年一只飞靴赶走绝对巨星大卫·贝克汉姆,06年为了保护C罗不惜赶走范尼斯特鲁伊,09年为了整支球队的薪资结构放走C罗……

  弗格森从来不害怕队内流失大牌球员,正如他的名言“有时候你必须做出残酷的决定。我的决定一直都是出于对曼联最大利益做出的。”正因为如此,当曼联的最大利益和里面的个别球星的利益不一致的时候,他会毫不犹豫的选择为球队的整体利益做出权衡。在这样一支纪律严明的球会里,没有哪个球星可以驾凌于球队之上!

  正是弗爵爷,开创了曼联一个鼎盛的时代。今天的90分钟比赛结束后,曼联告别了弗格森时代,告别了那个倔强的红鼻子老头。但是红魔依旧会继续前行,将老爵爷注入的精神,延续万世!

  这个夏天注定是充满着离别的一个夏天,我们告别了世界上最伟大的主教练。于此同时,我们也告别了生姜头保罗·斯科尔斯、告别了大卫·贝克汉姆、告别了迈克尔·欧文……尽管我一直为贝克汉姆当年的“叛逃”耿耿于怀,但不得不承认,当他和斯科尔斯一起在这个夏天退役的时候,心里面还是会有一阵失落。红魔的92黄金一代,如今就只剩下那代人里面年龄最大的王老吉还在球场上驰骋。

  一个时代的结束,同时带走的,是我们整个热火的青春年华。我们见证了99年诺坎普之夜那个不可思议的大逆转,见证了那个“三冠王”鼎盛时期的红魔王朝;我们见证了08年莫斯科的雨夜,见证了那一场点球大战中范德萨是如何用神奇的扑救将曼联从死神手中拉出来;我们见证了在被“吵闹的邻居”抢走联赛冠军之后,红魔是如何在本赛季用夺人的气势提前四轮夺冠!

  是红魔,充实了我们的整个青春年华!我很庆幸,在高中的三年,红魔用三连冠给了我面对高考的信心。记得08年欧冠决赛的晚上,在宿舍里凌晨爬起来用手机紧张地关注着文字直播,在C罗罚丢点球后心被提到了嗓子眼儿,不断地刷新着网页,最后奇迹地夺冠后,又激动得睡不着觉,早早地起床去教室自习。

  一转眼,大学的四年也就这么过去了,在这个离别的夏天,即将告别我的大学,告别我们美好的学生时代,告别那一群不知道以后还有没有机会再见面的兄弟姐妹。

  一日为红,终生为红!这是深入骨髓的信仰!如果要让我不再信仰曼彻斯特上空的那一片红色,除非改变我血液的颜色!告别了斯科尔斯,告别了弗格森,可红色的信仰依然继续,红魔曼联依旧前行!我们,也依旧前行在人生的路上!别了,青春!告别了青春,依旧前行!

一种基于定时器的按键检测方案

  对于按键检测,大家应该都不陌生。对于各种微控制器来说,按键检测都是最简单同时又最基础的东西。也许按键检测里面唯一比较需要花心思来考虑的地方就是去抖动而已。

  以往的按键检测无非是三种方式:基于CPU延时方式、基于外部中断方式、基于ADC转换器件方式。

  基于CPU延时的方式,就是通过CPU运行空指令的方式延时检测判断抖动。不管是上课也好,各种参考资料也好,都是介绍的这种方式,所以这应该是我们大家最早接触并且最常用的一种方式了。但是这种方式极大的降低了CPU的效率,实时性也非常差。特别是按键按着的时候CPU基本不能再做其他操作。

  基于外部中断的扫描方式,这种方法比起上一种,实时性很高。但是它需要占用外部中断资源,特别是常用的51单片机里面就只有2个外部中断,这显得相当浪费。

  第三种是使用ADC转换器件的方式,用这种方式进行按键扫描这种方法是非常有新意的,完全不同于之前两种。并且倒是很节省IO口,因为不管是单线并联多按键还是矩阵按键,最终只需要一根线接入ADC(当然IO口连ADC的数据线你们就另算吧,:-P ),而且可以很轻松的完成一些诸如“多按键检测”之类的高级功能。但是,对于要求不高的按键使用环境就用ADC就有点太大材小用了。

  这几天看书找到一种比较有新意的按键检测方案,就是使用定时器的资源,然后配合状态机的方式来进行按键检测。这样不仅可以轻松检测去抖和弹起,还可以做到既保证了CPU的效率,又在最大程度上释放了CPU。

  这种按键检测方式的流程大概是这样的,首先设定一个时间段的定时器中断(我用的是10ms),未到达定时器中断的时候CPU就执行程序其他操作。进入到定时器中断当中时,首先通过状态机判断状态(有3种状态,分别是状态0、状态1和状态2,未有按键按下时默认为状态0),进入状态0判断是否有按键按下,如若有按下则设置状态标志为状态1,如若没有则离开中断。当下一个10ms到来时再次进入中断,此时若之前有按键按下会进入到状态1,在状态1当中判断此时是否还是按下,若已经未按下说明刚才是按键抖动,不需要做动作,改变状态标志回状态0离开中断;如果此时继续按下说明是确实有按键按下,可以开始执行按键操作的程序,结束后设置状态标志为状态2,离开中断。当下一次进入状态机时,再进行判断是否是按下的状态,如果是则说明之前按下的没有抬起;如果此时没有按下了就说明已经抬起了,设置状态标志归零进行下一次按下的检测。

  整个方案的流程图如下:

  这种检测方式比起传统的那些有不少优势。它把一个完整的按键检测流程分割成不同的状态来分别呈现,这样的话就有效的节约了“延时”上面耗费的CPU效率,在延时的过程中CPU是回到主程序继续执行原来的流程的。这样的响应也很快,一旦检测到是非抖动的按键之后可以立即执行相应的操作(当然传统方式也可以通过编程实现一旦按下就执行相应操作,可是后面如果不检测弹起的话会变成按一下就动了好几次动作的状态,所以传统按键方式一般会采取松手后再执行动作)。而且它把松手的状态检测放在做相应动作之后,也可以很好的避免了按一下就动作好几次的情况。

  对了,刚想起来,如果用这种方式来进行状态判断的话,还可以通过增加状态来判断是否长按,对于按键不多但要实现功能多的系统来说,无疑有了更大的方便。

  当然这种检测方式也不是一点劣势也没有,毕竟它还是浪费了一个定时器中断的资源,如果是STM32之类的处理器当然是一丁点问题都没有的,但是如果是对于51之类本来资源就不多的处理器来说,可能还是会捉襟见肘。总之视情况使用呗,至少我觉得占用一个定时器比占用一个外部中断要来得实惠。

  最后晒一下我在我毕业设计里面分别用传统的延时方式检测按键和使用这种新型的方式检测按键的效果图对比一下~

(传统的按键检测方式)

(采用定时器中断按键检测方式)

  可能光看图还是看不出什么所以然来,我简单解说一下吧。上面采取传统按键检测方式的,当按键按下之后没弹起来之前,程序相当于停滞在按键检测的区域内,所以动态扫描七段数码管显示那里只能固定到按下之前的最后一个显示状态,ADC转换也是被暂停掉无法工作的。而下面采用定时器中断的按键检测方式,按下了立即在数码管上有所体现,没有多余的多按之类的误操作,并且ADC和数码管也是在持续工作中(锁定按下时,同时修改采集的电压,ADC能进行转换并把电压值显示在数码管上)。综上所述,还是能体现出这种方式的优势所在的。

  具体程序的源代码就不贴出来丢人现眼了,反正流程图都有在这里了,写出代码来还不是很简单的事情么?

检修美声达MX-08有源音箱小记

  也许是因为南宁前段时间的破天气,在我回到学校的头一天晚上还好好的音箱,第二天起来的时候就坏掉了。毕竟是在宿舍里被那潮湿的空气浸润了那么久,即便坏了也不觉得怎么奇怪。它坏掉的症状是按下开关没有反应,连电源指示灯什么的也不亮,更别说出声儿了。本来一开始就想自己拆来弄弄的,结果简单观察了一圈不知道从何下手,再加上音箱背面“机内高压,非专业人员严禁拆修;谨防触电,如机箱开裂不得使用!”的那两行小字,所以还是打算拿去狗洞的维修店去修。所以趁着同学修电脑的时候搭着一块儿拿过去,结果因为刚开学那里太忙了各种没时间帮看,加上用了好几天的耳机是在捂得难受,所以最后索性拿回来自己解决!好歹也是电子类专业的学生,怎么说也不能说是“非专业人员”吧,于是今天就开始动手了。

  首先第一步是拆音箱,这个是其实是整个过程里面最难的,因为它被用胶粘得稳稳的,最后要用小刀来割开各种撬才打开,这就是打开之后的样子。

 
 话说虽然只是几十块钱的便宜货,但是里面的电路板什么的倒是不含糊,我舍友也是美声达的音箱,型号是MX901,结果他的拆开来电路板明显就比我这个的拆开来要“山寨”了许多。。。

  整块电路板分成两个部分,其中一部分是电源部分,另外一部分经过降压整流之后到达功放模块。这两个模块在电路板上面是相互独立的,仅仅通过线圈变压连接在一起,所以我觉得问题应该是出在电源模块的部分。于是拿万用表来测量电源模块上面的各个元件,经过多次测量之后发现是那个1MΩ的熔断电阻坏了。用电阻档来测试它的时候,正接读数稳定在0.737,反接的时候读数从负数一直网上跳动直至超出量程达到正无穷。

  我猜测应该是之前那天晚上忘记关掉音箱的电源,然后加上天气潮湿,可能引起电路里面部分短路,导致这个保险电阻熔断损坏,所以第二天就开不了机了。于是去隔壁班宿舍淘了一个同样的电阻,打算给它换上去。

  因为这种电阻上面并没有标明是多少瓦的,网上说一般这种电阻都是1/4W的,或者说根据元件引脚的粗细可以判断瓦数的大小,但是根据比较发现用来换的这个新的电阻引脚比原来的看起来要细呢,所以换上去之前也比较忐忑不知道能不能行。不过反正原来这个坏了,换上去死马当活马医吧。

  好吧,我承认我焊接技术一般,焊好之后就像上面的图那样子啦。然后在装上去之前先给它插上电,打开开关,嘿!电源灯亮了,看来问题果然是在这里。接下来就是把它安装回去了。

  恩,应该就这样,整个音箱的检修就基本上完成了,其实只要找到问题的所在解决起来还是很快的。不过还是给它留下了一些印记,整个前塑料面板和木箱的连接那里有很多撬开的痕迹。

  虽然毕竟是修过有点小瑕疵,不过总算是修好能用了,省去了重新买个音箱的钱。另外,本来还担心有这些小裂痕会影响音质什么的,但是最后插上去使用跟原来一样。想着这种破天气以后也许还有机会坏,而且既然现在音质较原来也没有降低,所以也懒得重新拿胶来封上了,省得以后坏了难撬开。
  唉,木拆修过东西木调过音箱还真没脸说自己是电子专业的学生。。。

红魔,展翅高飞!《Lift It High》

  比赛结束了,输了,输了就输了。再提什么红牌该不该罚没什么意义,虽然它对正常比赛的影响显而易见。这次贝利继续展现了球王本色之必中乌鸦嘴,只是这次被球王黑掉的,轮到了曼联。

  至少,红魔的将士们,拼尽了全力,坚持到了最后一刻!虽然没能复制99年的奇迹,但是没人会否认这场比赛的每一名球员!特别是近38岁的老将Ryan Giggs,这位永远的左翼之王。虽然在他职业生涯的第1000场成年队正式比赛,没能取得好的结果,但是丝毫不会动摇他在红魔中的分量,也不会因为场外的花边影响他在每个红魔球迷心中的地位!

  今天的红魔,不管是在领先,还是在落后,都用自己的表现诠释了什么是男人样的战斗!没有像个娘们儿似地一撞就倒、在地上打滚,这便是为什么,英超联赛,比西甲充满激情和活力。即便英超联赛的队伍已经悉数离开欧冠联赛,也不会改变英超是世界上最好联赛的现状!

  看完了比赛,单曲循环着的,是99年三冠王后,红魔将士们集体录制的那首《Lift It High》。还记得初中那会儿,英语课老师让每个人上去唱一首英文歌,我毫不犹豫的选择了这首《Lift It High》,最后不断重复着的“It’s All About Belief”引起台下的哄笑,可他们永远不会理解这里面在每个红魔心中的意义!

  因为经历过胜利和悲伤,我们终将展翅高飞!红魔,永不言弃!

《Lift It High - All About Belief》

This could be the year
to celebrate and cheer
Pitch, bench and terraces
we’re all wanting the same thing
If you believe in us
we won’t betray that trust
Through the streets of Manchester
you’re gonna hear the people sing

“Gonna lift it high
gonna lift it high”
Our only limit is the sky
‘cos through the triumph and the grief
It’s all about
It’s all about belief
It’s all about belief

This could be the team
to achieve the dream
We’ve got nothing to prove
but we want it all the same
United we are
already come so far
We will not rest
until the whole world knows our name

Gonna lift it high
gonna lift it high
Our only limit is the sky
‘cos through the triumph and the grief
It’s all about
it’s all about belief
it’s all about belief

“Gonna lift it high
gonna lift it high”
Our only limit is the sky
‘cos through the triumph and the grief
It’s all about
it’s all about belief
it’s all about belief
it’s all about belief
it’s all about belief
it’s all about belief
it’s all about belief
it’s all about belief
it’s all about belief
it’s all about belief
This could be our year!

【视频】3分钟了解经济学社

  从周五下午到今天晚上,这两天半的时间赶了这个视频出来。虽然标题是说“3分钟了解经济学社”啦,但是实际上这个是“2012年广西高校十大明星社团”评比的一个视频资料。本来这些内容要说到5-6分钟的,结果被要求一定要控制在3分钟以内,所以就精简掉了好多内容。

  第一次接触Prezi,做得不好还请大家多多担待。

解决PHPWEB系统的“-1”死链问题

  算起来好久没有写什么东西了,貌似一整个月都没写了,所以今天随便写写。虽然这是一篇属于“技术类”的文章,不过我不是当做技术文来写的,还是想到什么说什么好了。这个假期除了下乡和去了一两个地方走走之外,时间占大头的就是去一个学长的公司去实习了。

  我在公司里负责网站的维护优化之类的,公司使用的网站是PHPWEB这一套系统。整个使用下来这套系统还是挺好的,这套系统跟我以前用过的传统的CMS区别还是挺大的,虽然排版、设计之类的操作更加简单了,但是它的各种小问题还是不断。而且由于这是一套闭源的商业整站系统,所以网上能参考的技术文档也比较少,搜索到的东西大部分都是“PHPWEB二次开发”“PHPWEB全套技术支持”之类的商业广告,有技术价值的消息不多。所以基本上遇到什么问题只能自己根据经验来慢慢修缮了,虽然技术操作起来其实对于我个人而言比较简单,但是整体弄下来还是挺有挑战的。

  PHPWEB大小问题不断,不过对于广大建站的站长来说,最头痛的莫过于“-1”的死链的问题了。一旦网站存在大量死链,对于搜索引擎的排名是非常不利的。更何况PHPWEB由于自身的页面构成原因,本身就对搜索引擎不是很友好,所以对它做SEO只能一步步慢慢来了。今天我就简单谈一下我对“-1”死链的解决处理方法。

  在做优化之前我先用“Xenu”这款软件来扫描一下,这是一款非常快速的检测网站死链的软件,扫描结果如下图:

  可以看到扫描出很多“-1”的死链接,链接的Title是“更多”。(注:我是在本地环境新搭建了一个测试站点的,所以死链只有这几个,但是对于正式上线的PHPWEB网站来说,这样的死链可能会多达20-30多个。)是了,这个“-1”的死链正是由于各种边框的“更多”引起的。我们先来看看造成死链的源文件:

  通过源文件我们就可以发现问题所在,可是为什么在页面中看不见这个“更多”呢?因为在PHPWEB的边框中,可以设置当有“更多”的设置的时候出现一个链接允许按进去的。但是对于一些模块并不能设置这个“更多”选项,所以在浏览的页面中就看不到这个“更多”出现,但是这并不代表它在网页里面就不存在了。它还是出现在了页面中,只是链接到了“-1”页面。所以就造成了这样的死链。

  开始我以为是模板里面的问题,于是就找了各种“templates”文件夹下面的模板来看,结果发现里面关于这里的代码是不能动的,否则会影响其他需要这个按钮的功能。又因为这套系统是闭源的,并不能通过看它的PHP代码来解决。

  就在这时我突然想到,这些动态的东西应该是存在数据库里面的,于是赶紧打开PhpMyAdmin进入数据库,搜索“-1”。果然搜索到了不少结果,而且基本集中在下图的三个表中:

  于是过去浏览这几个表,这几个表都存在 morelink 字段,就是这个字段!这个字段下面除了一些已经设置了“更多”链接的是正常的之外,其他的全部都是“-1”,这几个地方应该就是罪魁祸首了。

  所以我觉得要解决这个问题,只需要把这里面的“-1”替换成正常的值就可以了。刚开始我是想直接替换成空白,也就是留空,但是后来想想,在批量替换中要是替换之后发现没有用的话,要从空白再替换回来构造SQL语句就比较麻烦了(没办法,我没专门去系统的学过SQL语句,只是需要的时候即学即用,高手路过勿喷……╮(╯_╰)╭),所以我就打算把这些“-1”都替换成“#”,至于为什么拿“#”去链接,大家自己去恶补HTML吧,我在这里就不解释了。

  SQL的批量替换某个字段还是挺容易的的,语法是“UPDATE 表名 SET 字段名 = replace (字段名,’原字符串’,’新字符串’)”,所以我直接用了下面三行SQL语句来替换:

  唔,检查一下应该没有什么输入错误,可以执行了。。。。。。

  很好,成功执行了。这个时候应该就已经大功告成了,我们刷新一下页面重新看看原来造成出错的地方的源文件:

  看,原来的“-1”已经被替换成“#”了,这一系列的改动在页面上肉眼是看不出任何问题的,所以,替换好了之后还是要祭出“Xenu”来,重新扫描一下这个网站的死链接:

  唔,从扫描的结果可以看到,已经不存在那种“-1”的死链接了。经过这样的设置之后,就不需要再为网站的“-1”死链问题头痛纠结啦~当然,另外原因的死链还是要继续另外去解决的啦。对了,如果在操作之前网站是设置了生成静态页面的话,最好先把生成的HTML全部删掉等系统来重新生成,不然的话一些以前生成的静态页面还是会存在死链的。

  好啦,整体的解决方法就简单介绍到这里,希望大家有什么技术上的技巧一起来分享一下,这样才能共同进步。虽然PHPWEB是一套商业闭源的系统,虽然网上很多人靠着对这套系统的了解来做商业化的技术支持。但是我觉得,开源共享才是未来的节奏,一味的想通过闭源来获利,终究会被时代给抛弃的……

Life Is Random

  “Life Is Random,Give Chance A Chance”,这是iPod Shuffle著名的广告语。“生活随机演绎,予机会于偶然”,这也正应验了“Shuffle”这个品名——“洗牌”。

  生活总是在一次次洗牌,你永远无法预测下一秒会发生什么。也正是基于这一点,我一直喜欢用“随机播放”的方式来听音乐,永远不知道下一首歌是什么,直至它飘入耳廓。就像永远不知道下一秒谁会走入你的生活,谁会离开。也永远不知道下一秒,是通向天堂抑或坠入地狱的转折。也只有等到那一秒来临,才知道此时此刻是喜悦,还是悲伤、难过。

  好吧,扯远了,今天只想谈谈几种随机播放的方式,而无意于追忆其他。

  第一种方式是直接随机,用随机函数随机抽取一首歌曲来播放。这样的话,不管是点击“上一首”还是切换到“下一首”,都是切换到另外一首歌,而不能重新切回刚刚听完的歌曲。好吧,比较典型的例子就是“AIRPLAY”这款播放器了。

  第二种也算是直接随机,不过在第一种的基础上增加了记录播放过的曲目,这样可以切换回上一首,其他方面与第一种一样。貌似“千千静听”就是这样的。(不知道新版的改了算法没有,我用的是很老的版本……)

  这两种方式都会有一定几率出现连续播放一样的曲子,即便不一样,也有很大几率出现短期内出现过重复的曲目。而且这样的方式会造成不同曲目出现的概率亦完全随机,有的曲目出现概率很高,有些出现得很低。所以可以推测应该是使用了最方便快捷的“线性同余算法”,或者是以此为基础的其他方法。比如C语言的标准库中就是使用这种方法产生随机数,虽然产生的随机数是均匀分布,可是过于依赖上限。对于播放器而言,单一列表很少会有超过4位数的歌曲,所以很大程度重复。

  虽然我个人很喜欢这两个播放器,只是这种随机播放的方式不太完美。

  第三种就是对整个播放列表进行随机乱序排列,然后按照打乱之后的顺序来播放。这种方法本来是挺好的,很好的解决了曲目出现概率不均等和无法切回上一首的问题。可是这种模式下某一首歌的下一首都是固定的,如果对整个列表要听1一遍以上的话,不免厌倦,因为这与按序播放无异。我以前的那台昂达VX777就是这样,不过还好它每次重新开机后会再打乱一次。可是其他一些是千年不变的顺序,就这么乱序着按序播放。

  当未来可控且不可避免时,往往就没有了对未来的期待,似乎总是在走着,那无尽的循环……所以对于这种方式,会更加厌恶。

  第四种便是iPod Shuffle使用的方式,跟第三种一样也是对整个列表乱序之后再按序播放,不过每次轮完一圈会重新“洗牌”一次。这样下来就比之前的都更加完美一些,并且解决了上面提到的算法中的种种问题。这种随机算法,做到了“可以追溯,可以回忆”,即便年华已逝,也可回味那往昔之美好

  这正是我喜欢Shuffle这种设计理念的原因,不仅是外观,更喜欢这种内在的算法设计。一个好的设计,往往不仅仅是依靠外部的大气恢弘显山露水,恰恰相反,越是好的设计越是在于对细节的追求。苹果的设计理念也正是因为这人性化的一点,才受大众喜欢。(呃,那种纯粹为了跟风、显摆、炫富之类而去“喜欢”的除外。)

  Life Is Random,Give Chance A Chance。也许下一秒,会迎来能够让我不忆往昔的东西……

【写这首歌】Hope U Understand Me,《告白》

  隔了那么久,一直没想好到底要不要把这首歌发出来。其实四月初放假的时候就趁着回家的机会录好了,只是一直没空做后期,然后做完了后期又对各种效果不满意,索性就什么效果都不加了。其实,有些东西,自己也不知道到底说出来是对,是错。磨蹭了一个月,还是发出来吧。。。

  对了,差点忘说了,Beat是国内著名制作人“Crazy outopus”的Beat作品《吉他初体验》,希望大家多多支持国内的一些音乐制作人~


        
|