Flash 是目前十分普及随处可见的网页动画格式,但不知从何时开始,Flash 在IE中出现了恼人的大问题,当你想要按下Flash选单中的按钮或广告时,按第一下没反应,再按一次才会有效果。这是这个Flash动画制作者不留心的 Bug 吗?No No No…,快回去检查你以前做过的 Flash 网页,是不是也会如此。 这是什么怪问题? 首先用 IE 来浏览一个很久以前制作、包含 Flash 的页面,当你用鼠标滑过某个 […]
leakon
单元测试
有些道理,大家都明白的,但真正要做的时候,却很少有人能落到实处。 在学软件工程的时候,第一次听到了单元测试和测试用例这些词,印象很深刻 。 书上讲的都是软件开发这个行业几十年来总结的经验,很有道理,也很有说服力,我也十分认同书上的做法。 我也感觉自己是一个喜欢追求完美的人,看到书上说的那些测试的方法,比如边缘测试之类的,在感叹前人总结的方法很优秀的同时,自己也暗下决心,以后我写的程序,也要有规范的接口,有明确的输入输出,要有完备的测试用例,把每一个细节都测试到,让自己的程序表现完美。 然而,在现实中,总是事与愿违。 大学期间写的程序就不说了,我到现在正式工作已经两年半了,写的代码少说也就几万行。Bug是难免的,但总是被别人发现。 我一直没有做过规范的单元测试。 原因是多方面的,但主要在自己。 懒惰,是程序员最大的敌人! 当需求明确时,我会立即投入编码,把脑子里那些自认为不错的逻辑,用程序代码实现出来,这个过程是十分开心的。程序完成后,输入预定的参数,得到预想的结果,那种成就感,难以用语言形容。 我想问一句,这个时候,这个程序算是开发完毕了吗? 以前,我是这样认为的。我也坚信,国内绝大部分的程序员,都是这样认为的。 实际上,这就好像万里长征刚迈出第一步而已。虽然有些夸张,但事实如此。 你给你的程序写出测试用例了吗?你对程序的每一个模块,做了单元测试了吗?在输入数据的时候,是否输入了边界值?是否输入了非法值?有没有试过不给输入,看看程序输出什么? […]
说点什么
现在是周五22:20,本来想玩会儿游戏,可想起blog已经好几天没写东西了,攒了好多想说的,再不说就忘了。 这周有点郁闷,但也比以前更充实一些。 上周给新部门的同事讲了一些PHP网站开发方面的经验,也聊了一些优化方面的东西。来的人不少,弄得我挺紧张的。 因为比较忙,在做一个紧急上线的新项目,没有做充分的准备,有些东西没有讲得很深入。后来还讲了一个IP查询算法,是我自己想的,讲出来才知道,原来大家都有过研究。 肯定让来参加讨论会的同学们有些失望,我也觉得很郁闷。 后来和同事聊了聊,我给人的感觉是知道的东西挺多,但都不深入。 我不希望自己是这样,可实事求是地讲我确实一直存在这样的缺点。 可是话又说回来,我所了解的东西,也没有完全讲出来,我有自己深入了解的东西,工作2年了,每天都很忙,积累了很多经验,恐怕不可能在2个小时内全都讲完吧。 从另一个角度看,我觉得自己被别人小看了,也许这才是我郁闷的真正原因。 每个人都有虚荣心,像我这样的开发人员,最希望得到的,恐怕就是得到别人对我技术的认可吧。 恰巧昨天看到公司内部的技术周刊,有人讲了很多Web开发方面的东西,主要是html、css和javascript的,写得很长,很深入,也很具体。 我做Web开发也2年多了,那篇文章里说的每一条,我都知道,而且有些方面比文章里写的有更深的研究,但,我唯一没有做到的,就是把这每一点都写下来,都积累成文字记录,传给大家看。 这个问题我前一段时间已经意识到了,通过这件事,也让我有了更深的体会。 因此,我建了这个blog。 我也要把我积累的点点滴滴,都写下来,为自己记录,也为别人分享。 […]
许三多 百度 首页人物
许三多,电视剧《士兵突击》的主人公。一个农村的土孩子,一个突然的因素,进入了最为需要聪颖灵巧年轻人的部队,也将许三多推入生命的绝境,从而开始了一个“孬兵”在绝境中成长,在失去中成熟的故事。这样的绝境,似曾相识。有多少人没有过这样的生命绝境呢?面对这样的绝境,我们能够做什么?…… 详情请进:http://renwu.baidu.com/
GMail 安全隐患 Google 密码
尽管我下面要讲述的情景并不会经常出现,但后果却是很严重,希望引起Google的注意,同时也希望能提醒提供类似功能的其他公司! 我注册了Google的帐号,有了一个GMail邮箱,他很好用,而且我每天都要登录我的邮箱收发信件。 正是由于使用频繁,我在登录的时候,选中了“在此计算机上保存我的信息”,免去了每次登录都要输入密码的麻烦。 我在家,在公司,在我的笔记本上,三处地方,都应用了这种设置,所以我在这三台电脑上打开http://mail.google.com的时候,都是直接进入邮箱。 如果,我因为某事,不再继续为这家公司工作了,而我临走时忘记清空浏览器的cookie,那么,这个公司的网管,就可以登录我的系统,查看我遗留的各种文档。 当他再次打开http://mail.google.com的时候,直接进入了我的邮箱!!! 这是一个非常严重的问题。 我曾经想过补救,我认为这方法应该有效,但Google没有这样做: 我在家里的电脑上登录GMail,更改我的密码,然后退出登录,当我再次登录时,需要输入新的密码。这个过程没问题。 但我用我的笔记本,在浏览器上打开http://mail.google.com,依然可以访问。 这就是问题的根源!!! 这个时候,那家公司的网管,是可以访问我的邮箱的,因为Google没有对密码做数字签名!这是问题的关键!也是我这篇文章的核心内容! 在Web安全方面,Google应该有很深的经验了。 利用cookie记录登录状态,避免每次输入密码,是很好的设计,很人性化。 唯一的缺点,就是没有提供给用户一个既安全又方便的途径来取消这一遍历登录方式。 […]
z-index 层次 堆叠 style zIndex
CSS可以处理高度、宽度、深度三个维度。在前面的课程中,我们已经了解了前两个维度。在本课中,我们将学习如何令不同元素具有层次。简言之,就是关于元素堆叠的次序问题。 为此,你可以为每个元素指定一个数字( z-index )。其原理是:数字较大的元素将叠加在数字较小的元素之上。 比方说,我们正在打扑克,并且拿了一手同花大顺。我们可以通过为各张牌设定一个 z-index 的方式来表示这手牌: 在这个例子中,我们采用了1-5五个连续的数字来表示堆叠次序,但是你也可以用五个不同的其他数字来取得同样的效果。这里的要点在于:用数字的大小次序反映希望的堆叠次序。 扑克牌这个例子的代码可以这样写: #ten_of_diamonds { position: absolute; left: 100px; […]
PHP 数组 递归 magic_quotes 回调函数
为了适应不同的服务器设置,首先判断是否打开了 magic_quotes,如果打开了,在开始的地方就全部过滤。 后面程序统一默认为 magic_quotes 已关闭,避免了多次转义的问题。 一行代码的函数,两点需要注意,一个是递归调用,另一个是传递回调函数的方法,可以引用一个类的静态方法。 实现过程,比较优雅,不是吗?
DNSPod Squid CDN
好几天没有写东西了,最近有点忙,一直在学东西。 今天看了看 用DNSPod和Squid打造自己的CDN ,是长篇教程,感觉还不错,我转载了一下。 在论坛里发的,在这里发实在是太占篇幅了。 另外,为了统一格式,做了一个小的javascript工具,地址是: http://code.leakon.com/javascript/auto_format/ 可以去掉连续换行,并加入首行缩进,而且支持正则替换,功能很单一,慢慢完善吧。 想看代码,可以去http://leakon.googlecode.com/svn/trunk/leakon/javascript/auto_format/,这是Google的SVN服务。
PHP header location 继续执行 exit
PHP的header可以输出http头部信息,前提是,在header之前不能输出任何内容,因为所有的内容都作为http的body输出给客户端了,一旦有body的内容,就不可能再添加任何head部分的信息。 header函数的一个常用的方式就是用来做转向,redirect。 比如,我需要转到某个地址,只要执行下述代码: 浏览器会收到一个302的http状态码,告诉他这个内容已经被转移了。 重要的是,php会在调用header函数后,继续执行后面的代码,你可以用我的代码亲自试验一下: 肯定会执行到fwrite函数的,打开header.txt文件,检查时间! 对此,解决的办法是,要在每一个header函数后面加上exit,保证当前页面停止执行,进而转向location指定的地址。 为了避免到处都是exit,可以写一个专门用作转向的函数,比如: 另,为了避免在header之前输出body的内容,许多php框架都采用了php页面尾部不写?>的方式,因为有些人总习惯在?>后面添加一个换行,这真的是个不好的习惯。
PHP 基础
这是很简单的一个问题,但是我做错了。 我在这里这么强调他的简单,你肯定会比较注意他的陷阱。 但是,在你的代码里,会不会也有类似的情况呢?你还会注意到这些细节上的问题吗? 一次性答对的,说明你的基础比较扎实了。 你慢慢看我写的其他文章吧,我回去补课了……