IE6 float 显示异常 消失问题 解决方法

Tagged Under : ,

上一篇日志中写了 IE6 对 float 元素显示不正常的问题,现在找到了一个解决办法。

测试了很多次,发现跟 margin 和 padding 没有直接的关系,本质的问题根源在于,包含 float 元素的外层 div,没有设置足够的宽度和高度,也就是说,这个容器没有足够的空间用来显示内部所有的 float 元素。

margin 和 padding 只是一个间接原因,如果没有内外边距,可能外层 div 刚好可以容纳内部的 float。

加上边距后,每个 float 占用的空间就变大了,首先带来的问题是 div 的宽度不够,那么,愚蠢的 IE6 就会产生莫名其妙的问题,反映给用户的现象就是出现鬼影。

解决方案:准确计算内部 float 元素加在一起占用的宽高,确保外层 div 在 css 中明确指定了具体的 width 和 height 像素值,问题不会再出现。

可悲啊,95% 以上的桌面浏览器被这样愚蠢、垃圾的 IE6 霸占着!!!

IE6 float 异常 消失

Tagged Under : ,

IE6 浏览器对 float 属性的元素显示不太正常,经常遇到的情况是,打开页面,发现某个区域的内容是空的,什么都不显示,但鼠标移动到那个区域,或者附近的一些区域时,那个空的区域立刻显示出原有的内容。

另一个 case 可以称之为“鬼影”,现象是,某串文字,会在 2 个位置同时显示,如果有 hightlight 效果,那么任凭你把光标放到二者任意一个上面,另一串文字也会立刻高亮。

以前对这个问题很抓狂,也没有总结出一个很好的解决方法。

今天又碰到类似的问题,查了一下 Google,有人给出一个结论,当某个元素有 float 属性时,再给他添加 padding 或 margin 等属性,在 IE6 下可能会出现显示问题。

具体的解决方法我总结一下会发布到 Blog 上。

这篇文字算是一个 bug 记录吧。

Google 把国内的企业邮局提供商逼到了生命的尽头

Tagged Under : ,

你有自己的域名吗,比如 example.com?

想不想给自己搞一个邮件,例如:genius@example.com 或 tiancai@example.com。

给你自己的家人和朋友,分配一个超级个性化的邮箱?

你的女朋友可能喜欢:beauty@example.com 或 meinv@example.com。

你的父母也想尝试用用互联网,那给他们开通一个好记的邮件:baba@example.com、mama@example.com。

……

尽情发挥吧。

现在域名是如此的便宜,cn 域名现在注册费用是第一年 8 块钱,可能你跟朋友吃饭吹牛的时候少喝一瓶冰镇啤酒就可以省出来。

还需要其他费用麽?不要了。
真的麽?真的不要了。

有人问,我以前试用过国内某家企业邮局提供商的收费服务,每年要几百块钱,只能有 20 个用户,每个用户只有 50M 的空间,还很不好用。

现在的情况是,你用过 GMail 吗?Google的邮件服务。

简单易用,尤其是基于 Ajax 的操作方式,可是说是世界上最好用的邮件界面了。

值得信赖的稳定性,要说服务最稳定的互联网公司,也只有 Google 才配的上吧。

每个帐户目前是 7G 的空间,而且还在不断增长中。

特性就不多说了,了解互联网的人都知道……

http://www.google.com/a/help/intl/zh-CN/index.html

打开上面的地址,按照提示一步一步做吧,其实只要 2 个关键步骤:

1、上传一个指定的文件到你的域名下,或者修改域名的 CNAME 记录,让 Google 相信这个域名是由你在管理;

2、修改你域名的 mx 记录,配置到 Google 提供的几个域名上;

然后一切就 OK。

马上给你的域名配上邮箱吧,要的就是个性,赞 Google!

PHP 文件下载 IE 无法打开页面

Tagged Under : , ,

IE 又有一个弱得不行的问题让我发现!

有个项目,要限制文件的下载权限,只有注册用户才可以下载,用户登录后,点击下载链接,弹出保存附件的提示。

我用 PHP 写了一个下载类,支持断点续传的。

今天发现一个问题,在 IE 7 下,点击链接,可以弹出对话框,提示 “打开”、”保存” 和 “取消”,点击打开没问题,点击保存,却马上弹出错误提示 “该页面无法打开”!

这时可以注意到一个细节,弹出保存对话框的时候,正常情况下窗口左边会根据文件类型显示图标,而此时却是一个没有类型的默认图标。

我怀疑是 PHP 在设置 Http Header 的时候有问题,仔细检查了每一项,逐项注释,问题依旧。

可是同样的链接,在 Firefox、Opera 和 Safari 下都没问题,打开或保存都正常。

后来去网上搜了好多文件下载的 header 设置,发现我少了 2 个属性:

Expires 和 Cache-Control,我想起来我以前写过一个 Case,说要加 Cache-Control,否则用IE 打开文件会提示 “文档已损坏”:

http://www.leakon.com/archives/76

这提醒了我,我应该加上 Cache-Control 的。

果然,加上下面这 2 行,问题就完全解决:
header(’Expires: 0′);
header(’Cache-Control: must-revalidate, post-check=0, pre-check=0′);

全部代码请见我的 GoogleCode:

http://leakon.googlecode.com/svn/trunk/leakon/php/iplimit/smart_download.php

这是支持短点续传的哦,很好用。

使用很简单,用文件绝对路径 new 一个对象,然后调用 $obj->download() 就可以啦。

当然,还可以通过参数,配置文件名和文件类型。

大伙儿看看吧,这是我给互联网的贡献~~

更新 Blog

Tagged Under : , ,

今天顺利把blog更新到最新版本。本来早就想做了,一直没有找到足够的时间验证。

借助于我最近开发的一个web版的命令行工具(虚拟主机 SSH),把主机上的程序文件夹打成tar包,下载了回来。

又把数据库导出成sql文件存到本地。

在自己的机器上重新搭了一套blog环境,和线上版本完全一致。然后用新程序覆盖老程序,并执行upgrade程序,顺利升级。更换了现在这套模板,同时下载了最新的防止垃圾评论的plugin。仔细检查了一番,没有发现问题。

最近一直有一些做事方法上的心得,也好长时间没写blog了。

就说说这干活儿快与慢的问题吧,我是写代码的coder,工作上的项目安排,一般都有时间排期,定好了某天完成开发。但我总是会比预想的慢,总是不能按时完成任务。

这样的次数多了,我就觉得我自己很笨,为什么别人都能很快写完程序,我就不行呢?

每当看到有人晋升,老大们给写评价时,都有工作快速这么一条,而且一般工程师的评价标准中,如果能提前完成任务,都会有更高的评分。

我怎么就不行呢?

最近我接手的项目,出现的接二连三的bug,都是以前的开发人员遗留的,让我吃了不少苦。不过通过解决这些问题,我也看到了我开发速度慢的深层原因:我不是为了完成任务去coding,我是为了把一件事做好。

前一阵写了一篇wiki,是关于php的pack函数性能调研的,经过优化,调用pack的性能可以提高4倍以上!!!

但是,为了这个性能调研,我花了1天多的时间。

本来,如果不考虑性能,我直接写一行pack调用就完事儿了,用不了1分钟。

事后,没有人会知道,我的程序的运行时间从8小时变成了2小时,大家只知道,我比原计划晚了1天提交程序……

另一个故事:自动发邮件的php程序,部分中文字符会变成乱码。

调查问题原因的时候,有个同事告诉我在邮件正文的换行处把\n替换成\r\n就可以了。

我不理解为什么要这样做,我觉得这只是跳过问题的方法,问题本身并没有得到解决。

我又花了半天时间一步一步重现bug,最后看到,由于没有对邮件正文进行编码,邮件服务器每隔1000个字节,会自动添加一个换行符。如果遇到汉字,这个换行符加到了2个字节之间,后面的部分字符就会变成乱码。

知道了原因,马上修改邮件发送程序,改用base64编码,然后再测试,此bug彻底解决,再也不会出现!

同事给我提的办法,实际上是歪打正着,乱码就是因为汉字被强行截断的,而他的程序的环境,恰好是加了\r后就跳过了那个汉字,所以没有乱码。下次有其他项目要用邮件程序的时候,这位老兄调乱码可有的玩了,呵呵……

当然,我可不是那种幸灾乐祸的人,我查到原因后,立刻跟大家分享了经验。只是……,我的3个小时都花在这上面了……。接手我的程序的人,不会再遇到邮件乱码问题,接手那位老兄代码的人,日后估计会比较惨……

回到今天的引子,关于blog升级。

按照官方的说法,只要用新程序覆盖老程序,就可以完成升级。

都是写php的,我总感觉自己不在测试环境下试一把,真不敢直接拿线上blog开刀。

所以才拖了好长时间,今天才完成升级。(我分别在2个不同的环境下进行了升级,都没有问题)

看了看虚拟主机上程序文件的修改时间,还是2007年6月的呢,那会儿刚搭好这个blog,将近一年没升级过了……

新的blog,后台界面漂亮多了,至少是我喜欢的风格。

我拿新wp后台模板,帮朋友开发了一个客服程序,被对方的客服评价为非常难看!

无语了,他们居然认为那个纯table的连一点css修饰都没有的系统比wp的后台好看!

审美啊……这就是中国特色吧,要不外国的网站在中国混不起来呢,人家著名视觉设计师和用户体验设计师做的界面,在土惯了的中国人眼里它就是不好看,不好用……

虚拟主机 SSH

问题由来:

我买了美国的虚拟主机,机器性能很好,空间巨大(150G) ,唯一的也是最大的问题,就是访问速度慢。

其实服务器本身至少能保证3M的带宽,我用其他服务器,单线程wget美国主机的文件,都可以稳定地保持在300K/s以上。

但用浏览器访问,由于需要发起多次tcp连接,而每次连接只传很小的几k文件就立即断掉,所以很慢。

最让我抓狂的就是,我上传一个软件包,总大小也就4、5M,但文件数量特别多,至少有几百甚至上千,传这么一个文件夹,没有2小时根本完不了。

我就想,如果虚拟主机有命令行,可以执行压缩或解压命令就好了。

传单个文件,再慢,也能保证每秒50K,像这样几M的文件,几分钟就可以搞定。

但如何解压呢?

答案就是:web版的命令行工具。

最简单的,就是system或exec函数,可以像SSH客户端一样,执行我们想要的命令。

注意,有些虚拟主机限制执行system和exec这两个函数,但我做了测试,证明是有其他方法的,一会儿再说这个方法是什么。

请您看到这个方法后,不要大肆宣传,或利用这个方法做一些危害主机安全的操作。如果这个方法也被禁用了,那以后就再也没有类似的方法了。

有了web的ssh,我们该怎么用呢?

1、首先要有清晰的unix文件的路径知识,知道什么是绝对路径,什么是相对路径,如何引用一个路径,等等。因为web版ssh只能方便地在当前一个目录下操作,稍有不慎,就可能造成无法挽回的后果。

2、学会使用ls、df、du、cp、mv、tar、zip等常用命令。使用web版ssh的出发点,就是希望以后在上传或下载文件时,可以预先打包,然后只传一个文件,这样可以大大减少传输时间的浪费。因此,列出目录、复制、移动、压缩和解压,就是必备的命令工具。

3、web版ssh还有一个功能,就是可以执行命令行的MySQL!!!最近我刚试着迁移discuz论坛,俗称论坛搬家,就是把论坛从A服务器迁移(搬家)到B服务器,重要的过程就是dump数据库,再import。而传统的工具,只有phpmyadmin,导出sql文件到还容易,但导入到另一个服务器,尤其是导入到另一个虚拟主机的时候,会受B主机的上传文件大小限制,大文件没法导入。还有,就是我遇到的乱码问题,由于B主机的大小限制只有2M,我的sql有5M,没办法,只能先压缩。import的时候,没有出错,但是导完发现都是乱码。A服务器是utf8,B是gbk。import的时候,本来import时选择了utf8编码的,但貌似对zip压缩的sql文件无效,最终是按gbk编码导入utf8的sql文件,这必然是乱码啊,结果就是论坛变成“蝌蚪文”。逼得我没办法了,只能开发一个web版ssh工具,最后用 mysql –default-character-set=utf8 -uleakon -pleakon leakon < leakon.sql 这个命令行才成功导入。这回,导入过程快多了,瞬间完成,不必再等着phpmyadmin上传本地sql文件。这一切,多亏了我的ssh工具,也就是本为的主角:web_shell。

按说这不叫ssh,只是一个web的命令行转发函数,但为了大家搜索虚拟主机ssh的时候能方便一些,就故意写了好多ssh。

大家可以看看国外的虚拟主机,大部分都支持ssh,而且……

唉,我都不想重复这些了,国外主机的优势,真不是国内idc服务商们可以比的。国内用最烂的服务、最烂的技术、最烂的界面来提供的虚拟主机,价格却是国外的好几倍甚至几十倍。价格我真不想再说了,反正最贵的都比国内最便宜的便宜好多好多,而且服务好得更多。

跑题了,回来说我的web_shell。

这是我简单开发的一个辅助工具,专门解决我上文提到的各种问题,加了一个简单安全验证,文件放在服务上,别人无法使用,只有你自己能用。

源码在我的GoogleCode里可以找到,地址是:

http://leakon.googlecode.com/svn/trunk/leakon/php/web_shell/web_zip.php

现在充其量是alpha 0.0.0.1版,里面还有一大堆debug的注释,本来还想加入一些新功能,但没那么多时间,先解决眼前的问题吧。

使用的时候,需要自己写一个web_inc.php,里面只要定义一个AUTH_KEY就可以了,这是你的密钥,只有知道密钥的人才可以使用这个web_shell。

默认的密钥,我是用一个字符串加当天日期的md5写的,如何快速计算一个字符串的md5呢?我早就写了一个工具,也许大家都没注意过,我就再发一次吧:

http://code.leakon.com/php/tools/

可以做一些简单的编码、解码计算,很好用哦。

源码也在googlecode里,大家自己找吧。

盼望得到您的指点或回复,谢谢!

另,php本身还有一个popen,也可以执行命令,一般的虚拟主机都没禁用,还是那句话,请慎用,要是用烂了,以后也就没得用了。

MySQL 字符集

两个不同的字符串,分别插入一个表,保存字符串的字段叫 word,在 word 上建了唯一索引(unique key)。

连续插入这 2 个字符串,第二个居然报错:Duplicate entry ‘%s’ for key %d - Error: 1062 SQLSTATE: 23000 (ER_DUP_ENTRY)

是索引存在,不能插入 2 条相同 word 的记录。

这就奇怪了,明明是 2 个不同的字符串啊,urlencode() 和 md5() 计算出来的结果都不一样,怎么就不能插入呢?

后来仔细对比,并查了 ASCII 码表,发现有些字符经 urlencoe 以后,有一个字节是 %93,或者其他的,反正都大于 0×80 了。

如果这个字节加上后面的一个字节,不是一个有效的 GBK 编码,那么,MySQL 会把字符串截断到这个字节之前。

我做了一个测试,两个字符串经 urlencode 编码后是这样的:

‘%3F%3F%3F%3F%3F%3F%3F%3F%3F%3F’

‘%3F%3F%3F%3F%3F%3F%3F%3F%3F%3F%93%3F%3F%94%3F%3F%3F%3F%3F%3F’

在一个表建立唯一索引,然后按照先插入第一个字符串,再插入第二个,肯定会报错(GBK编码的数据库、表和字段)。

分析原因:

这段时间在钻研 mysql_real_escape_string() 与 addslashes() 等函数的内在区别。

mysql_real_escape_string() 需要数据库连接句柄作为第二个参数,也就是说,这个函数需要参考当前连接的字符集进行转义。

GBK 编码,汉字是双字节的,第一个字节的 ASCII 码必须要大于 0×80,而第二个字节必须满足另一个规律才可以。这个规律就是 GBK 的字符集。第一个字节大于 0×80 的双字节字符有 128 * 256 个,但并不是说 GBK 的字符集就有 32768 个字符,我们的汉字好像没有这么多。

mysql_real_escape_string() 函数会参考当前连接的字符集,检查需要转义的字符串的每一个字节。

因此,如果一个汉字是 %bf%5c,并不会被转义成 %bf%5c%5c (addslashes() 的结果就是这样,\ 的ASCII 码就是 %5c),因为 %bf%5c 是一个有效的汉字。

我写了一个Wiki,里面是测试代码,用于验证上面的唯一索引的例子:

http://wiki.leakon.com/MySQLUniqueKeyCharset

PHP 性能优化 二进制转换 pack()

今天搞一个数据存储程序,需要把数据转换成二进制存储。

在转换过程中,发现效率很低,不能满足需要。

经过反复测试和修改,总结了一些经验。

写在我的 Wiki 里了,Wiki 里贴代码比较方便,也顺便在这里推广一下我的Wiki

<<Leakon’s Wiki>>

性能优化的Wiki地址:http://wiki.leakon.com/PerformancePack

如何做事

很巧的一件事,让我感觉到,在做事的时候,人与人之间的差别怎么那么大。

今早,公司发布了IM。以前一直没有见过真正的版本,公司在保密方面做得还不错。

早上到公司,马上试用了一下。

心想这也是个大新闻了,就想发在博客里,吸引一下大家的眼球。

感觉直接发在博客上,有点不太好,毕竟是内测的软件,多少有点泄密的感觉,虽然早在我之前,就有好多人把消息泄露给各大网站了。

于是想到在雪宝宝论坛发这个,毕竟Discuz的论坛,发图片,还可以防盗链,同时,只有注册的会员才可以看到图片。

就算趁机给雪宝宝带点流量吧。

把软件的使用截图,用户名部分经过模糊处理后,发给了yoyo,她帮我在雪宝宝上发帖(感谢老婆~~) 。

看到帖子后,我立刻把链接发给qq里和msn里的每个好友,只发给在线的了,加在一起20多个人吧。

过了一会儿,大家的反应,真是让我感慨颇深。

超过一半以上的人,给我回复的是:“您所在的用户组无法下载或查看附件”,看不了啊!

我就不明白了,您就不会自己注册一下吗?

这就是我这篇文章要说的问题,做事的方法!

可能我们这代人,尤其是在北京长大的这帮少爷小姐们,过惯了衣来伸手饭来张口的日子,习惯了别人为我们准备好一切,自己只要直接拿到结果就可以了,甚至不愿意为了结果付出那么一丁点的劳动。

我发给你一个链接,你肯定觉得很好奇。

在尝试解开谜底的时候,突然发现有点障碍。

然后,这十几个少爷小姐们,立刻把问题抛给了我:你给的图片没法显示啊!

我想说的是:您想看不想看啊?想看为什么不自己动手注册一下呢?用不了你1分钟,很难的事吗?非要我给你准备好了,您直接看吗?

这里不讨论我为什么没给他准备好的问题,因为我在前面说过了,我之所以把图片发在雪宝宝论坛,就是为了吸引用户注册,并且保证图片防盗链。

我到新的公司,有半年了,我感觉这半年里,我成长了很多,最重要的成长,就是学会了做事的方式。

更具体一点,就是做事的主动性。

作为开发人员,在写程序时,肯定会遇到很多问题。

下面有两种情况,看看你是哪种吧:

A:立刻把牛人召唤过来,帮我看看是什么问题,帮我解决一下;

B:自己查问题,一步一步缩小问题的范围,最终定位问题, 分析原因,自己解决。

以前,我是用A的做法,所以,我成长得很慢,尽管解决问题的速度很快,因为是别人帮我解决嘛。

现在,我一直用B的做法,每次查问题,都会花上不少时间,但逐渐的,我积累了越来越多的经验,而且坚定了自己的信心:没有我解决不了的问题!

我的同事,是一个实习生,经验不多,搞程序时,经常出现问题,然后立刻就叫我过去看。

我问他是哪里的问题,他什么都不知道,胡乱猜,甚至改程序,尝试着把大括号从第二行开头换到第一行结尾!

完全是胡乱猜啊!

有这功夫,您到apache2/logs下面查查error_log不好吗?

到底是啥原因导致的白屏,那里不是明明白白地写着吗?

还有的人,一个PHP的函数不知道怎么用,每次都叫我写例子给他看,你自己手里不是有PHP手册吗?上面不是清清楚楚地写了很多例子吗?就算那里没有,您百度一下,或者Google一把,例子也是无穷无尽吧?怎么就那么懒呢?

还有做项目的时候,几个人联调程序,出问题了,总是猜测是别人的Bug,您怎么不事先查查自己程序的日志,看看有没有任何异常呢?

这样的例子太多太多了……

中国的互联网公司不计其数,程序开发人员更是满地都是。

当你吵吵着薪水低,比别人累,公司对你待遇不公平的时候,你有没有想过是你自己做事方法本来就不怎么样么?

我今天发这个图片的链接,有好多人最终也没看到实际的图片。

就连这么简单的事,您都搞不定,还指望拿高薪呢?

也不是我说话难听,我觉得良药苦口,我说出来,您要是觉得不好听,但觉得是那么回事,下回改了, 对自己好,多您的公司也好,对您的未来更好!

那些成功的人,他们真的一点也不聪明,都是很普通的人,只是做事方法不同而已。

不同的方法导致不同的结果。

好方法,尚需好运气才能成就一番事业。

坏方法,永远只能做个干体力活的coder。

IE 盒模型

很多网站在写HTML的时候,没有指定DTD,也就是没有设置DOCTYPE。

上学的时候,老师说,DreamWeaver 生成的页面,头部的DOCTYPE都是垃圾信息,应该直接写成<html>。

学院派真是误人子弟……

W3C标准是要制定DOCTYPE的,最显著的区别,我认为就是IE显示Div等元素时采用的盒模型问题。

也就是说,对margin、border等样式所占的面积,是算在Div内部还是外部?

在设定DOCTYPE之前和之后,显示方式是完全不同的。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<style type="text/css">
#box    {
  width:720px;!important;    /* For Modern Browsers */
  width:704px;            /* For IE */
}
</style>

可以在

http://leakon.googlecode.com/svn/trunk/leakon/html/ie_box/

看到源码。

通过设置dtd参数,可以看到在两种DOCTYPE下显示方式的不同。

但在Firefox等现代浏览器下,两种显示方式是一样的。

Google

Google
LAMP-Linux-redhat LAMP-Apache LAMP-MySQL LAMP-Php Leakon-Wiki Leakon-BBS XueBaoBao Xyoyou