Submitted by gouki on 2009, April 2, 8:05 PM
又一篇不是我写的东西,不错,对于WEB开发人员来说还是有参考意义的。所以我就贴了回来,也可以做个参考吧。。
原文:摘自:http://xinsync.xju.edu.cn/index.php/archives/4504
2006年10月份,我开始对web开发产生了兴趣,并决定自己也尝试开发一个网站。在此之前,我做过3年的java application的开发,对web开发应该算一无所知。在比较了java,php,ror,和python后,我选择了基于python的web框 架 - django 。到目前为止,我还认为这是一个明智的决定。Django高效的开发效率让我仅仅用一个月的业余时间,就基本完成了网站的开发。这是一个网络书签的网站, 我加上了一些有意思的特性,让网站显得有些与众不同。
我购买了域名和Dreamhost 的主机空间。Dreamhost支持django,并且第一年的费用只有180元人民币。2006年11月份,http: //www.hpbookmarks.com 上线了。网友们发来了善意的评论,“很有创意”,“点意思”,“一些feature很不错”。同时,还有一个非常一致的意见就是,“访问速度太慢了”。其 实,当时的情况不只是访问速度慢,而且是相当不稳定。很多时候是几个小时网站无法访问。当时,我并没有在意,因为我有两个自以为“合理”的解释。第一,我 用的是国外最便宜的虚拟主机,国内访问慢是很正常的。第二,django的还处于0.95的状态,效率和稳定性方面有问题也正常。
但是,我慢慢发现上面的解释不过是自己骗自己的借口。很多用dreamhost的网站,访问起来也很快。而且django也已经被成功应用在许多 大型的网站。我开始认真考虑提高网站速度的问题了。毕竟,速度慢的网站很可能在第一次就失去的用户,他们可以永远不会再来了。终于,我进行了下面一步一步 的优化工作,并且取得了一个看起来还不错的结果。
第一步,用Ajax提高用户体验
由于我的网站上链接字体的大小是根据点击次数决定,所以每次点击都要提交到服务器端并记录次数,再在客户端打开网站链接。这在localhost 测试的时候没有发现问题,但是部署到服务器上,会感到明显的等待。解决办法就是用Ajax。用户点击网站链接后就直接打开,再通过Ajax将点击的事件提 交到服务器端记录。这样用户感觉不到任何延时。
第二步,将逻辑移到客户端的javascript中
在开始的时候,“网站标签高亮”和“手气不错”的功能都是提交到服务器端操作,然后返回结果的。后来,我发现其实很多逻辑是可以移到客户端,由 javascript来实现的。Javascript非常强大,可以完成很多复杂的逻辑。将逻辑移到客户端的javascript中,可以很有效的减少和 服务器通讯的次数,获得更好的访问速度。
第三步,解决进程的
由于采用的是fastCGI的方式,我配置了django.fcgi。可是,我发现系统进程中,有大量的django.fcgi进程被标记为 < defunct>(失去功能)。这些进程会导致服务器有时无法正常访问。我开始尝试用命令来kill掉这些进程,但是很快发现这无法从根本上解决问 题。后来,我看到一个老外在blog上提到一个解决方案,将django.fcgi改名为dispatch.fcgi。原来,dispatch.fcgi 是一个dreamhost的系统进程,它的健壮性是可以得到保障的。果然,我将django.fcgi改名为 dispatch.fcgi后,的现象再没有出现。
第四步,优化SQL语句
SQL语句的执行通常也是一个很花费时间的操作。经过检查,我发现我的一条SQL语句,是一个嵌套三层的子表查询。而这条SQL还必须是一个 Raw SQL,即不能采用django的OR Maping。这意味着不能被cache缓存,每次都是真刀真枪的执行。更失败的是,经过我的分析,这条SQL完全可以不执行。这是一次设计上的失误,标
准的over design(过渡设计)。当时,我是想通过数据库得到一个最精确的统计值。后来发现,这个值完全可以用一个近似的常量代替。优化SQL,尤其是避免不必要的SQL执行,带来的效果是非常明显的。
第五步,尽量减少页面大小
随着添加网站越来越多,有一天我发现django生成的首页已经达到了80k。我很清楚这是一个非常不能被接受的数字。我开始检查页面,很快发现 了线索。 第一,因为偷懒,页面中很多layout是用空格( )实现的。第二,因为为了增加代码可读行,调试方便,每行生成的页面都增加换行符 (\n)。第三,最糟糕的是,大量的用了
inline css。就是将css style直接嵌入标记块中。于是,我立即动手,用css的align解决layout,去掉\n,将inline css抽象到独立的css文件中。这样下来,在不更改任何内容的情况下,80k变成了57k。(补充:由于网站链接大部分是打开新窗口,所以用了大量的 target=_blank。在ylsdd的提示下,在html的head里增加了,又节约了4k。)
第六步,用gzip进行页面压缩
当我兴高采烈的把页面优化结果贴到了smth bbs上,却被直接泼了盆凉水。原来百分之二十几的优化结果,实在太一般了。ylsdd给我了一个很重要的线索,deflate。原来apache的 deflate模块可以把文件进行gzip压缩,压缩后的文件传到浏览器后再被解压。主流的浏览器都支持这种gzip的解压操作。于是,我在apache 的配置文
件中加入了Add OutputFilter DEFAULT html css js的语句。经过测试,css,js这些文本文件的压缩后都只有原来尺寸的25%。这里,和大家分享一个网站http: //www.port80software.com/products/httpzip/compresscheck 它的作用是检测你的网站是否被压缩,以及压缩比率等。
第七步,回归静态页面
新的问题又来了。原来deflate只支持静态文件的压缩。而我的首页是django动态生成的,deflate模块没有进行压缩。我突然想到, 网站的首页为什么不能是静态页面呢?于是,我增加了一个runtime的api,这个api提供的是和原来一样由django动态生成的页面。我又写了一 个 python的程序,通过urllib2模块下载这个动态生成的页面,并保存为index.html。我将网站的root映射到index.html这个 静态页面。最后,通过linux crontab定义一个行为,每五分钟执行一下这个python程序,生成新的index.html。值得一提的是,由于网络原因,python程序不一 定每次都能准确完整的下载动态生成的页面。所以我们必须再进行一个校验算法。当页面大小要超过一定数字,页面中出现某个校验字符串的情况下,才保存 index.html。这样,每次用户提交的访问,不是由服务器端动态生成页面,极大的节省了服务器端的开销。而静态页面又可以有效的被deflate压 缩。最后结果,首页被压缩为13k,为原来的22%。唯一的区别就是,新提交和推荐的网站不能立即出现在首页。但是我认为,这应该是可以被接受的。
至此,网站的优化工作基本完成。网站的访问速度从原来30秒以上,缩短到3秒左右,应该说算是一个飞跃。虽然,3秒的速度也不是非常快,但是,考虑到虚拟主机等客观原因,这个结果我还是满意的。原来感觉我的网站很慢的朋友们,也可以再试试。
以上的优化方案出自我的个人经验,并不一定适合所有网站。但是,它告诉我们一个事实。影响网站访问速度的不仅仅是服务器配置,网络带宽。也许,你 糟糕的设计,低效率的方案也是致命的因素。应当注意的是,优化工作也不能匆匆上手。一定要仔细研究,具体情况具体分析,得到统计数据,找到真正的问题所 在,再开始优化。相信自己,提高网站的访问速度并不是不可能。毕竟,Nothing is Impossible。祝大家成功。
Tags: 优化, 网站
PHP | 评论:0
| 阅读:21280
Submitted by gouki on 2009, March 27, 3:04 PM
下午上班,收到一条短信,一看,哇,189发来的,天翼用户啊。
激动不己的打开短信,发现内容为:上海XXXX大酒店现诚聘男女公关,需体健貌端思想开放,18至48岁,月薪三万,当天结算,咨询XXXXX李经理。
第一个XXXX是酒店名称,第二个XXXX是联系电话
一下子心情都没有了。唉。原来189的优惠已经被沦为干这种活的工具了。
突然间对189失去了热情。
Tags: 天翼, 189
Misc | 评论:1
| 阅读:18085
Submitted by gouki on 2009, February 23, 10:22 PM
最近上海的户籍政策作出了很大的变化,其实这也是很正常的。
上海的老龄化呈上升趋势,而社保资金随着社会老龄化的增长会逐渐不够使用,这时候怎么办?当然是需要有更多的人来为他们埋单,光靠上海现在这些年轻人肯定是不够的,于是新政策就会出来,吸引更多的人来加入埋单行列。
毕竟七年之长,才有机会加入上海户籍,但会有更多的人加入办理居住证的行列。(原先有很多人不愿意办,因为办了也是白办,又不在上海,交了这些钱都是白 交的,现在有动力了)
以下据说是现在的标准,好象是从02年开始的:
国内人才申领《上海市居住证》审核试行办法
第一条(依据)
根据市政府发布的《引进人才实行〈上海市居住证〉制度暂行规定》,制订本试行办法。
第二条(适用范围)
凡按规定申领《上海市居住证》(以下简称《居住证》)的国内人员,试行按要素计分审核。
第三条(用人单位)
本试行办法所称用人单位是指信誉良好,具有用人自主权,在本市行政区域内注册登记,符合本市产业发展方向的各类企业、事业、社团、民办非企业机构,以及住所在本市行政区域内的中央及外省市在沪单位。
第四条(评价计分体系)
本试行办法的评价计分体系由一般分和附加分两大部分、共14项要素组成,满分为120分。
一般分部分由基本分、专业能力分、导向分三小部分、共10项要素组成,满分为120分。
附加分由4项要素组成,满分为30分。
申领《居住证》者的得分,为两大部分、14项要素得分的累计分值;累计分值如超过120分,计为120分。
第五条(一般分)
一般分部分由基本分、专业能力分和导向分三小部分组成。
一、基本分部分满分为55分,由年龄、受教育程度、受聘情况、亲属关系、住房情况等5项要素组成。
(一)年龄
年龄项最高分为10分。
本项具体计分标准如下:
1、35周岁以下 10分
2、36??50周岁 5分
3、51周岁以上 0分
(二)受教育程度
受教育程度项最高分为25分,只计最高学历(学位);硕士、博士要求同时取得学历和学位。
本项具体计分标准如下:
1、博士 25分
2、硕士 23分
3、学士 21分
4、大学本科 20分
5、大专(高职) 10分
6、高中(含职校、技校、中专)及以下 0分
(三)受聘情况
受聘情况项最高分为10分,根据受聘于本市用人单位的情况计分。
本项具体计分标准如下:
1、以项目、任务等方式聘用 10分
2、聘用(劳动)合同期限在一年及以上 10分
3、聘用(劳动)合同期限不满一年 5分
4、未受聘 0分
(四)亲属关系
亲属关系项最高分为5分。
本项具体计分标准如下:
1、父母、配偶中有一人为本市户籍 5分
或配偶已取得3年及以上有效期《居住证》
或配偶要素累计分(不含本项分值)达到3年及以上有效期《居住证》标准分
2、其它 0分
(五)住房情况
住房情况项最高分为5分,“在本市有产权住房”是指本人为产权人或共有产权人。
本项具体计分标准如下:
1、在本市有产权住房 5分
2、其它 0分
二、专业能力分
专业能力分部分满分为35分,由专业能力和专业培训等2项要素组成。
“特殊才能”的人才,专业能力的计分标准另行制定。
(一)专业能力
专业能力项最高分为30分,同时符合两个及以上标准只计最高分值。“获得执业(职业)资格”根据不同的执业(职业)资格,给予5?15分。“拥有发明专利”是指由申请人发明创造的专利,经同行专家认定后根据专利水平给予5?10分。
本项具体计分标准如下:
1、两院院士 30分
2、博士生导师 25分
或获得国家级奖励
3、获正高级专业技术职务任职资格 20分
或受聘于事业单位正高级专业技术岗位
或受聘于机关担任局级以上职务
或受聘于企业高级管理或专业技术岗位,缴税月收入在10000元及以上
4、获副高级专业技术职务任职资格 18分
或受聘于事业单位副高级专业技术岗位
或受聘于机关担任处级以上职务
或受聘于企业中级管理或专业技术岗位、缴税月收入在5000元及以上
或获得省部级奖励
5、获中级专业技术职务任职资格 15分
或受聘于事业单位中级专业技术岗位
或受聘于机关担任科级以上职务
或受聘于企业一般管理或专业技术岗位,缴税月收入在2000元及以上
6、获初级专业技术职务任职资格 5分
或受聘于事业单位初级专业技术岗位
或受聘于机关担任一般职务
或受聘于企业初级专业技术岗位、缴税月收入在1000元及以上
7、获得执业(职业)资格 5?15分
8、拥有发明专利 5?10分
9、其它 0分
(二)专业培训
专业培训项最高分为5分。对于国家、本市和境外的专业培训证书,经认定给予1?5分。有多种证书分值可累计,但总分不超过5分。各类开展专业培训、发放专业培训证书的合法机构,可向市人事局申报专业培训证书认定,经认定后纳入本评价计分体系并予以公布。
本项具体计分标准如下:
1、取得经认定的专业培训证书 1?5分
2、未取得经认定的专业培训证书 0分
三、导向分
导向分部分满分为30分,由专业类别导向、产业(行业)导向、地区导向等3项要素组成。
(一)专业类别导向
专业类别导向项最高分为10分,根据年度人才开发目录划分紧缺、需要、控制。
本项具体计分标准如下:
1、紧缺 10分
2、需要 5分
3、控制 0分
(二)产业(行业)导向
产业(行业)导向项最高分为10分,“高新技术、软件、集成电路行业”指经市政府有关部门认定的上述行业的企业引进相关的人才;“本市重点发展产业(行业)”根据年度人才开发目录确定。
本项具体计分标准如下:
1、高新技术、软件、集成电路行业 10分
2、本市重点发展产业(行业) 10分
3、其它 0分
(三)地区导向
地区导向项最高分为10分,重点发展地区根据年度人才开发目录确定,要求居住地、工作地同时在重点发展地区。
本项具体计分标准如下:
1、重点发展地区 10分
2、一般地区 0分
第六条(附加分)
附加分部分最高分为30分,包括同行专家推荐附加分、人才在沪投资创业附加分、境外工作或学习经历附加分以及根据国家和本市法规规定经核定给予的附加分等4项要素,4项要素的得分可累计,但最高不超过30分。
(一)同行专家、行业协会或行业主管部门推荐附加分
同行专家、行业协会或行业主管部门推荐附加分项最高分为20分,如有多名专家和行业协会或行业主管部门同时推荐只计最高分。行业协会或行业主管部门向市人事局提出申请,经市人事局备案同意后具备推荐本行业“特殊才能”人才的资格
本项具体计分标准如下:
1、两院院士推荐 20分
2、行业协会或行业主管部门特别推荐 15分
3、博士生导师推荐 15分
4、其它 0分
(二)人才在沪投资创业附加分
人才在沪投资创业附加分项最高分为20分。在沪投资额可累计;如创办多个企业及机构,缴税额可累计,聘用本市员工人数可累计。
本项具体计分标准如下:
1、投资额在1000万元人民币及以上 20分
或投资创办的企业连续三年缴税额在100万元及以上
或投资创办的单位聘用本市员工100人及以上
2、投资额在500万元人民币及以上 15分
或投资创办的企业连续三年缴税额在50万元及以上
或投资创办的单位聘用本市员工50人及以上
3、投资额在300万元人民币及以上 10分
或投资创办的企业连续三年缴税额在30万元及以上
或投资创办的单位聘用本市员工30人及以上
或在本市投资创办民办非企业机构
4、投资额在100万元人民币及以上 5分
或投资创办的企业连续三年缴税额在10万元及以上
或投资创办的单位聘用本市员工10人及以上
5、其它 0分
(三)境外工作或学习经历附加分
境外工作或学习经历附加分最高分为10分,经历应当连续,不得累计;有多次经历只计最高分。
本项具体计分办法如下:
1、有一年及以上境外工作或留学经历 10分
2、有三个月及以上境外学习或工作经历 5分
3、其它 0分
(四)根据国家和本市法规规定经核定给予的附加分
根据国家和本市法规规定给予的附加分项最高分为20分,是指国家和本市的有关法律、法规和规章有相应规定,经市人事局核定后可给予5?20分。
本项具体计分办法如下:
1、法规有相应规定 5?20分
2、其它 0分
第七条(标准分)
一、暂未被本市用人单位聘用的本科及以上学历人员,要素累计分值在50分及以上者,可办理有效期为6个月的《居住证》。
二、已被本市用人单位聘用或在本市投资创业的人员,可按要素累计分值分别办理1年、3年、5年有效期的《居住证》:
1、分值在90分及以上者,可由申请人任选办理三种有效期的《居住证》;
2、分值在89分以下、70分及以上者,可由申请人选择办理3年及以下有效期的《居住证》;
3、分值在69分以下、60分及以上者,可办理1年有效期的《居住证》。
第八条(本办法的调整)
市人事局根据人才引进宏观调控的需要,及时确定、调整并公布申领6个月、1年、3年和5年有效期《居住证》的条件和标准分。
第九条(附则)
本试行办法自2002年6月15日起实行。
纯粹是一个备份
Tags: 居住证
Misc | 评论:1
| 阅读:19221
Submitted by gouki on 2009, February 20, 11:29 AM
不可否认,IBM在开发者资源方面做的还是挺不错的,虽然有偏重于IBM自己的工具的倾向,但对于WEB方面的资源还是很多。
对于英文不好的同学,可以查看:http://www.ibm.com/developerworks/cn/
这里的资料是全部中文的,当然你还可以有取向,比如我是做WEB的,我一般就看:http://www.ibm.com/developerworks/cn/web20/ ,WEB2.0的相关资源
如果你对自己写的文章有自信,你也可以去投稿,以期让更多的人了解你,投稿网站在:http://www.ibm.com/developerworks/cn/author/
会让你根据征稿内容和您的特长,然后下载WORD模版写好后发给网站,审核后就会公布哦。
Tags: ibm, 学习资料
Software | 评论:1
| 阅读:19435
Submitted by gouki on 2009, February 14, 10:08 PM
情人节快乐
google的图标居然也随之变化,很吃惊
gXOgle? 你没看错. 酒红色的G__gle字母形状没有变化, 中间两个O消失了, 取而代之的是用口红画上去的"xo"两个字母. 以上就是Google 2009情人节的logo图案. 由于时差关系, 谷歌换用logo的时候, google.com还没有换. 其他同在亚洲时区的国家也相继换用了此logo. 第一眼看到X和O, 肯定会想到一个网络名词: "OOXX". 不过, 这可是纯正的中国特色词语, 难道老外也有这种用法吗? 还是, 另有所指? 下面还是请大家欣赏一下这个logo, 然后跟随我们的文章猜想一下为什么logo会是这个样子.
无论如何, 祝所有情侣和所有去死团团员们, 情人节快乐!
XE的说法1: 网络语言"OOXX"
“OOXX online”本来是一款极限单车游戏的名字。“OOXX”即“圈圈叉叉”,就是指单车的车圈和车叉。这款游戏惊险刺激深受年轻人喜爱,因而逐渐引申为“ 惊险刺激的PK”之义。 而后,由于“圈圈叉叉”会被误读或误写作其同音字(和谐),从而“OOXX”就开始具备一些(和谐)的含义了,也就是(和谐)的意思。同时,因为(和谐) 在国人的传统观念中是见不得人的,所以“OOXX”在一些论坛中也指,因作坏事或说错话而被管理员封贴或封号。 有了(和谐)的意思之后,网路上众多具有高度语言天赋和智慧的达人,就真正开始YY和BT这个词了。用象形解释的话, “OO”和“XX”在(和谐)中就拥有了性别上的区分。从而,最终极最强的解释和引申就出现了:“OOXX”指“女上男下”,“XXOO”指 “男上女下”.
摘自百度知道(关键部分请脑内补完).
字面意思的说法2: "XO"
xo是指白兰地中的专用术语. 所有白兰地酒厂, 都用字母来分别品质, 例举如下:
E代表ESPECIAL (特别的)
F代表FINE (好)
V代表VERY (很好)
O代表OLD (老的)
S代表SUPERIOR (上好的)
P代表PALE (淡色而苍老)
X代表EXTRA (格外的)
对于干邑的级别, 法国政府有着极为严格的规则,酒商是不能随意自称的。总括而言,有下列之类别:
3-STAR三星干邑:蕴藏期不少于两年
V.S.O.P干邑:蕴藏期不少于四年
NAPOLEON干邑:蕴藏期不少于六年
X.O.干邑:蕴藏期多在八年以上
XO是白兰地的分级法中,算储存较久的一级。不过在法国的白兰地,除了法国政府所规定的事项外,各厂家为了凸显自己酒款的优势,常常做出比规定更严格条件,使的各家酒款都有自己的特色。而HENNESSY(轩尼诗)也是其中的一家。
摘自百度百科
有点儿靠谱的说法3: Hugs & Kisses
Inmedieval times, most people were unable to read or write. When it came time to sign a document, people who could not write usually made an "X" mark. Of course,an "X" is not much of a signature.To add a sense of commitment, it became customary to kiss the "X" after writing it.
在中世纪, 大多数人的文化水平都比较低. 在签署文件的时候, 中国人一般按手印, 西方人如果不知名字怎么写, 通常写一个"X"作为代替. 当然"X"本身不能作为签名, 为了添加个人信息, 通常会在那个"X"上亲吻一下.
Kissing the "X" was "performance law," a ritual act that bound thepartiesthe way legal documents bind us today. This act, witnessed by the person who wrote the text, represented asolemn guaranteeof the truthfulness of what was written, and an oath to carry out whatever obligations were stated in the document.
亲吻"X"是一项不成文的法则, 就象现在法律文档对我们的约束力一般. 这表明签字人对所写的东西保证其真实有效, 勇于对所写内容承担责任.
Over the years, the "X" and the kiss became interchangeable. Today, people who can read and write might still add one or more "X" marks to their letters, maybe with a couple of "O"s thrown in for hugs.
许多年过去了, "X"变成了和亲吻等价的符号. 人们在写信时加上"X"代表亲吻, 同时加上"O"则表示一个拥抱.
The Oxford English Dictionary states that X is "used to represent a kiss, esp. in the subscription to a letter.". There is no general consensus on the origins of the O as a hug. The O could relate to the shape formed when two hands are crossed in a hug, forming a type of O. The 'X' may also refer to the pursing of the lips when kissing.
牛津英语字典叙述 X 为“用于表达吻,尤其在书信的署名处”。但对于作为拥抱含义的 O 的起源并没有普遍共识。字母 O 可能与拥抱时两手交叠而成 O 的形状有关系。字母 X 可能也与接吻时噘起嘴唇而成的形状有关。
Google往年情人节logo


Tags: 情人节
Misc | 评论:0
| 阅读:20346