HTML重构的一些最佳实践

以下所有内容都摘自《重构HTML这本书》,留在这里做个笔记。版权属于原作者。

1、将名称改为小写。所有的元素和属性的名称都要小写,大部分实体名称也要小写,当然设计大写字母的除外。
2、给所有的属性都加上引号。
3、补足遗漏的属性值。为所有不带属性值的属性加上属性值。如:<input type=”radio” checked>应该改成:<input type=”radio” checked=”checked”>
4、将空标签替换成空元素标签,如将<br>这样的元素替换为<br class=”empty” />
5、添加结束标签。关闭所有的段落、清单项目、表格单元格和其他非空的元素
6、消除重叠,在父级元素上关闭每个子元素
7、把文本转换成UTF-8,因为他是唯一全平台支持的字符集
8、转义小于号,尽管有些浏览器有时候能够复原未转义的小于号,但并不是所有的浏览器都能。一个未转义的小于号更有可能导致浏览器中的内容被隐藏。就算你没有完全转换成XHTML,这也是一个需要修复的问题。
9、转义&符号,把&转换成&amp;尽管大部分浏览器都可以处理空格后原始的&符号,但是如果没有空格会迷惑一小部分浏览器。未经转义的&符号会对读者隐藏。
10、替换虚构的实体引用,如将&copyright; 替换成&copy;
11、加入根元素,确保每个页面都一个html根元素。

发表在 Study & Reading | 标签为 , | 留下评论

迟到的2009总结

2008年末在车东的要求下写了08总结,其实08年没有什么好总结的,干了一点点小的事情,不错也算是第一步,如果09年的是充满机遇的一年,那么08年也算是一个准备吧,刚哥也好,神仙也好,曹宇伟也好,甚至科科和小龙都给了我莫大的帮助和指导。

2009年一年实现了很多梦想,或者说是设想吧:

  1. 加入一个快速成长的公司,不为生存发愁,
  2. 能够给予父母一些物质上的反哺,能够一年回两次家
  3. 能够住一次5星级酒店,
  4. 能够出门旅游一次,
  5. 能够方便的回去见女友,
  6. 能够在同学、老师、朋友面前证明自己的价值,
  7. 能够读完30本书
  8. 玩一次黑莓
  9. 买一台mac
  10. 参加一次技术聚会

细细数来,除了mac没买之外,其他的都实现了,貌似2009年一年没白活,那么2010年来一点更高的愿望吧

  1. 买一台笔记本,性能要好,是不是mac不重要
  2. 为女友买一台单反相机
  3. 接父母来杭州住一段时间
  4. 完成一个开源作品
  5. 好好学好两个语言,英语和Python
  6. 学会理财
  7. 参加两次以上的技术聚会
  8. 看完《代码大全》《程序设计语言原理》《high performance mysql》
  9. 再读一遍曼昆的《经济学原理》
  10. 每周至少健身一次
发表在 Life Diary | 标签为 , | 一条评论

Google AppEngine Launcher不能启动的解决方法

好久不玩 Google AppEngine,google 居然用WXPython整出一个带界面的GAE  server管理器,有点进步,虽然这个东西在Mac早就有了,至少现在不用在艳羡用Mac的同志了,当初我就觉得,难道google的工程师都用Mac?为啥不顾及大部分开发者呢?google真的太有个性了。down了一个到本地,结果死活加载不了项目,不停的报错,打开log一看,全是如下错误信息:

Traceback (most recent call last):
File “GoogleAppEngineLauncher.py”, line 42, in <module>
File “wx\_core.pyc”, line 7913, in __init__
File “wx\_core.pyc”, line 7487, in _BootstrapApp
File “launcher\app.pyc”, line 53, in OnInit
File “launcher\app.pyc”, line 97, in _CreateModels
File “launcher\maintable.pyc”, line 35, in __init__
File “launcher\maintable.pyc”, line 86, in _LoadProjects
File “launcher\project.pyc”, line 63, in ProjectWithConfigParser
File “launcher\project.pyc”, line 250, in _LoadFromConfigParser
File “ConfigParser.pyc”, line 520, in get
ConfigParser.NoOptionError: No option ‘name’ in section: ’1′

看样子是加载不了project的配置文件或者是project的配置文件出错了,于是乎按照当初修改picasa的逻辑,到C:\Documents and Settings\自己的用户名\Google 文件夹下,删除所有的东西,重新启动,重新添加project,启动web server,结果还是启动不起来,还是在刚才的目录下,打开配置文件一看,就差不多明白了,我放在桌面上,理论上project的存放路径中应该有汉字包含其中,结果没有,于是把项目文件夹剪切到某盘(如D盘)的根目录下,再删除google文件夹下的所有文件,重新添加project,点击启动web server按钮,居然变绿了,启动成功,看来google还不支持中文路径名。 各位大侠要小心喽

发表在 Operating System | 标签为 , | 一条评论

找人,招人~~

最近工作一直很忙,好久没更新博客了,大脑有点呆滞,不如给年底想换工作的朋友多一个选择吧

基于公司业务的急速腾飞和对人才储备的需求,最主要的是不差钱的原因,现在正在岁末疯狂招人中,只要你觉得自己合适,不妨投个简历试试,负责招聘的同学还是很热情的,前面说了,不差钱,并不表示我们富得流油,我们会根据您的技能和专长,给予富有竞争力的薪酬,如果您想年薪二十万,我觉得我们可以单独商量,因为公司业务的扩张,劳累在所难免,因此我们需要您有健康的身体和心理,当然偶尔身体不适也是正常的,我们提供完善的医疗和福利保障,刷了您的医保卡之后还能从商业保险那里得到一部分赔偿,这是我们福利的一部分。餐补,为加班同学提供免费的晚餐和加班打车报销之类的自然是必不可少的。更多福利和详细薪酬体系,请见我们HR,呵呵,

公司网站:phpwind

我们对以下职位有需求:

一、高级商务专员(1人)
工作地点: 杭州
职位描述:
1. 负责进行合作洽谈
2.线上线下推广活动策划
职位要求:
1. 大专或以上学历,相关专业毕业;有一定英文听说能力者优先
2. 三年以上互联网企业市场推广经验,熟悉主要线上线下媒体传播渠道
3. 对phpwind有一定的认识,对站长文化有敏锐嗅觉,从而产生独到有效的传播创意
4. 具有较强的执行能力,能独立运作线上线下推广的各个环节
5. 良好的人际关系,出色的沟通技巧
6. 吃苦耐劳,拥有强烈的上进心,热爱phpwind团队文化

二、高级PHP工程师(5人)
工作地点: 杭州
职位描述:
1. 负责产品的研发工作;
2. 负责产品产品架构设计;
3. 负责产品数据库设计;
4. 负责产品前后台功能模块开发。
职位要求:
1. 大专或以上学历,相关专业毕业优先;
2. 两年以上PHP实际项目编程经验,精通PHP与Mysql;
3. 熟练掌握HTML、JavaScript、CSS、XML、AJAX等知识,用户行为分析等web2.0关键技术;
4. 熟悉软件设计流程和软件工程规范,具备良好而规范的设计和技术文档编写能力;
5. 掌握Linux/FreeBSD/Windows等各操作系统web环境配置的各种优化方案,掌握网站访问速度的各种优化方案;
6. 有大型网站开发经验者优先,有C/C++编程经验者优先。

三、高级运营经理(1人)
工作地点: 杭州
职位描述:
1、负责公司项目的整体设计、规划运营;
2、执行公司发展策略;
3、管理团队,提升团队士气和工作质量;
4、负责协调各部门的合作。
职位要求:
1、大专以上学历,专业不限;
2、五年以上的大中型互联网公司从业经验,熟悉和热爱社区;
3、具备项目跟进、资源协调能力,熟悉社区管理、用户互动;
4、熟悉与网站产品,具有很强的用户行为分析能力;
5、成熟稳重,负责敬业,具有较强的社区管理能力;
6、熟悉互联网领域的WEB2、0产品;
7、沟通协调能力强,有团队合作精神;
8、工作主动,能承担较强工作压力。

四、大客户销售经理(1人)
工作地点:杭州
职位描述:
1、主动寻找有建站软件需求的客户,洽谈并销售phpwind各产品及增值服务,从社区网站运营角度帮助客户成长。
职位要求:
1、学历不限,专业不限;毕业后二年以上网络销售(网络营销)工作经验;
2、文字组织与表达能力强,能通过电话、Email、即时通讯工具等各种方式与客户进行沟通;
3、能吃苦耐劳,拥有强烈的上进心,热爱phpwind团队文化;
4、属于phpwind.net忠实会员者优先;
5、拥有PHP+Mysql技术以及服务器技术功底者优先考虑;
6、具有一定社区运营经验者优先考虑。

五、高级商务经理(1人)
工作地点:杭州
职位描述:
1. 负责合作洽谈、活动策划等
职位要求:
1. 学历不限,专业不限;有一定英文听说能力者优先;
2. 有五年以上互联网企业市场推广经验,熟悉主要线上线下媒体传播渠道;
3. 对phpwind有较深的认识,对站长文化有敏锐嗅觉,从而产生独到有效的传播创意;
4. 具有较强的执行能力,能独立运作线上线下推广的各个环节;
5. 良好的人际关系,出色的沟通技巧 ;
6. 能吃苦耐劳,拥有强烈的上进心,热爱phpwind团队文化 。

六、运营专员(1人)
工作地点:杭州
岗位职责:
1、负责平台信息的收集、整理、维护、更新 ;
2、承担客户服务工作;
3、收集整理用户问题与建议,定期反馈,并跟踪解决。
任职要求:
1、精通电脑各项基本操作,熟悉论坛,了解互联网应用;
2、勤奋好学,踏实细心;
3、具备良好的沟通能力和团队合作能力;
4、有论坛建站、版主经验或软件公司客服经验者优先;
5、大专以上学历,一年以上相关工作经验或拥有互联网丰富实习、创业经验的优秀应届毕业生 。

PS:  据悉,我们PHPWind 还为2010年应届毕业生提供技术类的实习岗位,如果你对Linux和PHP有一定了解和理解,又有志于在开源技术方面的开拓,不妨尝试一下,我们为应届生提供一个足以在杭州生活下去的薪水和商业保险(包括租房和生活开支,当然首先您要确定自己是节俭的,如果你大手大脚花钱花习惯了,您可以忽略本条)

发表在 Life Diary | 标签为 | 2 条评论

传说中的google新搜索界面

indexsearch_result

google新的搜索界面显得更加靓丽和年轻,继续进一步和百度拉开差距,估计不久就应用到google 中国的的界面上,目前你还不能通过正常方式访问到这个界面,如果想感受一下新界面,方式如下:打开www.google.com页面,记得,是google.com页面,如果跳转到google.cn页面,只要点击搜索框下面的“Google.com in English”即可,然后复制下面的脚本到你的浏览器地址栏,然后敲回车,再刷新google.com页面即感受最新搜索界面。

javascript:void(document.cookie=”PREF=ID=20b6e4c2f44943bb:U=4bf292d46faad806:TM=1249677602:

LM=1257919388:S=odm0Ys-53ZueXfZG;path=/; domain=.google.com”);

关于google新搜索界面的更详细报道,请移步这个网站,E文的哦~~

发表在 Study & Reading | 标签为 | 留下评论

JavaScript完美验证URL正则

这个url的正则表达式判断的JavaScript!比较全面的。它验证的情况包括IP,域名(domain),ftp,二级域名,域名中的文件,域名加上端口!用户名等等信息,貌似作者也是在网上找的,我从一个项目代码中扣出来的,是我见过的最强最全面的url验证方式!太猛了,贴在这里与大家共享先,以后不记得的时候来博客上找找,URL的验证实在是很频繁。

function IsURL(str_url){
        var strRegex = "^((https|http|ftp|rtsp|mms)?://)"
        + "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp的user@
        + "(([0-9]{1,3}\.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.184
        + "|" // 允许IP和DOMAIN(域名)
        + "([0-9a-z_!~*'()-]+\.)*" // 域名- www.
        + "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\." // 二级域名
        + "[a-z]{2,6})" // first level domain- .com or .museum
        + "(:[0-9]{1,4})?" // 端口- :80
        + "((/?)|" // a slash isn't required if there is no file name
        + "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$";
        var re=new RegExp(strRegex);
		//re.test()
        if (re.test(str_url)){
            return (true);
        }else{
            return (false);
        }
}

感谢收集者和原作者,虽然我不知道是谁,非常感激~~

发表在 Programming, Tools | 标签为 | 5 条评论

会话状态模式

个人觉得会话状态模式其实算不得一种模式,因为无非就两种,而且必须是其中的一种,一种存放在客户端,一种存放在服务端。两者都有风险和优点。

通常将会话保存在客户端是为了获得服务端的高度无状态特性,即服务端可以做到完全的无状态。Java中通常使用传输对象来进行数据传输,因为传输对象可以在网上进行序列化,即使是很复杂的数据也可以进行传输。当然序列化是有风险和代价的,不是所有的序列化数据都能够被反序列化回来,虽然出现反序列化回来的出错的概率很小。

如果使用HTML的话,选择相对多一点,URL参数,隐藏表单域和Cookie,URL对于较小数据量还是比较容易使用的,现代浏览放开了对URL长度的限制,但我们不得不考虑一些古董用户的需求,毕竟IE6及以下版本的浏览器还主导着WEB世界,而且URL过长,也不符合REST原则,更不美观。

隐藏表单域适合于POST方式的请求,POST方式可以避免因浏览器限制URL长度而导致的被截断的问题。隐藏表单域在我曾经的代码中经常使用,主要是为了跟踪和referer的referer,也就是跳转到一个页面之前的原来页面。

Cookie方式是最优争议的一种方式,PHPWind采用了这一种方法,从开发者口中得知,是为了减少服务器的负载,因为服务器不用维护session状态。通过把数据序列化或者加密后以文本方式放到Cookie中,我没有测试过,PHPWind这样做是不是真的能降低服务器的负载,根据我以前的测试,session维护成本对于服务器的影响是微乎其微的,还不如优化一条SQL来得更痛快,更有效,而且放在Cookie中会导致用户请求的流量变大,在很多上下带宽不对称的机房中,这是个严重的问题,比如blogbus之前存放在上海的**机房就是这样。而且为了获得Cookie中的数据还需要进行一些列运算,未必比维护session的成本小,而且会导致严重的安全问题。只要算法是可逆的,就一定能被人破解,何况我等庸人搞的算法。

服务器会话状态最简单的一种就是把会话数据放到应用服务器的内存中,可以将会话数据以会话标识号作为键标识放到内存映射表中,现在很多工具可以做到,比如memcache等key-value 的内存存储工具。

另一种是持久化,持久化也可以分为两种,一种以二进制序列化形式存放,但这样做的缺点是不容易阅读,更新起来成本有点高,如果每个会话都一个文件的话,在高并发的时候还得解决文件系统的巨量小文件查找效率问题。还有一种就是持久化到数据库,这个存放会话的模式,可能会因为维护会话状态而带来巨大的数据库开销问题,而且为了及时清除过期的会话,往往配合触发器来进行。

总结起来每种会话管理都有天生的缺陷,如果能多种结合能够提升一些效率,比如内存缓存配合持久化数据库,就是眼下很多高负载网站正在使用的模式,也许还有其他的更多的模式和方法有待探寻~~

发表在 Study & Reading | 标签为 , , | 留下评论

OUTLOOK2007最小化到托盘显示

由于公司的提供邮箱实在是小,而且几乎可以说是没有Web界面,出于有条件的情况下,一定使用正版和与大家保持一致的原则,选择了outlook 2007 ,这家伙居然默认不支持最小化到任务栏~~~ :( OUTLOOK启动后最小化总是在任务栏上占一个位置,工作起来碍事, 最后修改注册表解决之。

1.打开注册表 : 开始菜单 -> 运行, 输入”regedit”并回车

2.打开HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Outlook\Preferences项目

3.建立一个DWord的值(双字节值),名称为”MinToTray”, 取值改成 1

4.关闭注册表编辑器, 如果Outlook 2007运行中,关闭.

5.启动Outlook2007, 此时系统托盘区已经有一个Outlook2007的小图标了, 当你把Outlook2007最小化的时候, 它就会自己缩到托盘区了.

最后不得不感叹一句,这年头,微软的东西也设计得不易用啊~~

发表在 Tools | 标签为 , | 一条评论

数据源架构模式笔记(一)

数据源架构模式笔记
一、表数据入口
表数据入口半酣了用于访问单个表的或视图的所有SQL,如CRUD操作,其他代码调用它的方法来实现所有与数据库的交互。
表数据入口很简单,一般包括几个从数据库中干活去数据的查找方法以及更新删除放放风每个方法都将输入参数映射为一个SQL调用并在数据库链接上执行改语句。由于表数据入口用于数据读写,所以通常是无状态的。

使用时机:
1、可以和表模块一起很好的使用,它称身隔一个记录集数据结构由表模块处理。
2、特别适用于事务脚本。
3、通常表数据入口和领域模型很少一起使用,因为数据映射器更好地分离了领域模型和数据库。

二、行数据入口

行数据入口充当数据源中单条记录入口的对象,每行一个实例。行数据入口和单条记录机器相似的对象,如数据库中的一行。在该对象中数据库中每一列变成了一个域。行数据入口一般能实现从数据源类型到内存中类型的任意转换,这种转换很简单。这个模式保持一行中的数据以便客户可以直接访问行数据入口,行数据入口是每一个数据行的良好接口。这种方法尤其适用于事务脚本。

使用行数据入口通常非为两步:第一步是否真的需要用入口;第二步,是使用行数据入口还是表数据入口。

行数据入口能和数据映射其一起配合使用,尽管这样看起来有点多此一举,当行数据入口从元数据自动生成,而数据映射器由手动实现时,这种方法会很有效。

如果把事务脚本和行数据入口一起使用,可能会发现业务逻辑在多处脚本中重复出现,这些逻辑可能在行数据入口中有族谱那个,不断移动这些逻辑会使行数据入口演变成活动记录,活动记录很好,因为他减少了业务逻辑中的重复。

发表在 Study & Reading | 标签为 | 留下评论

wordpress的nginx rewrite规则

由于godaddy不稳定和龟速,终于把博客搬到自己的VPS上,并且换了一套皮 :) ,最近日子过得比较快,可能因为事情比较多的缘故,最近两个月写的代码,超过我过去半年的写的代码的总和 :(
废话少说,直接上wordpress Nginx的rewrite规则,我的博客版本是2.8.5,一切正常,其他的不敢保证

if (-d $request_filename){
rewrite ^/(.*)([^/])$ $1$2/ permanent;
}
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}

第一条在很多Nginx主机上是默认就可以进行301 move的,意思是:如果请求的是目录,那么将请求rewrite到这个目录里面,不加这一条可能会导致二级或者三级目录无法访问,比如请求地址是http://www.abc.com/abc, abc是一个目录,abc中有一个index.html页面,还有一个名为style的目录,index.html 引用style中的css,js等文件,并且引用方式为相对地址,类似这样的结构:<script type=“text/javascript” src=”style/lib/jquery.js></script>,那么除index.html能被请求到之外,index.html中引用的所有文件的请求,都将是404

后面三条网上到处都是,如果你不是跟我一样,在Web根目录下放一些jquery,mysql之类的手册,后面三条就足够使用。包括你使用伪静态化

发表在 Operating System | 标签为 , | 留下评论