<?xml version="1.0" encoding="UTF-8"?><rss version="0.92">
<channel>
	<title>welefen</title>
	<link>http://www.welefen.com</link>
	<description>风为人世在，在世人为风。</description>
	<lastBuildDate>Thu, 09 Sep 2010 11:29:24 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>en</language>
	<!-- generator="WordPress/3.0.1" -->

	<item>
		<title>如何减少代码上线过程中对线上服务的影响</title>
		<description><![CDATA[目前现状 在一些大公司中，每个服务几乎都有CDN，也就是说一个服务都有很多很多的服务器。并且一般做服务优化的话往往是把程序和静态资源放在不同的服务器上。 在实际开发中，一般是按功能将代码分成不同的模块。上线时OP一般是一个模块一个模块的上线。虽然上线时是并行上线的，但每个模块以及模板与静态资源生效是有时间差的。尤其是模块之间依赖程度很高，如：模板和静态资源依赖程度很高，上线有时间差极有可能出现JS报错或者一些点击不能响应。 所以在上线这个时间差内，用户在操作过程中极有可能出现问题。 解决方案 改变已有的一个模块一个模块的上线方案，而是先将所有要上线的文件都传到各个机器上去，并不是直接覆盖线上文件，而是通过一个的规则成为新建的文件。 如：我要上线覆盖的文件夹为 vote，那么先将代码都拷贝到vote.online文件下（各个机器），其他模块的代码拷贝到其他对应的文件夹下。待所有要上线的代码都准备好后，然后执行mv的操作，将要上线的代码覆盖到真正的文件夹下。在这个过程中，虽然要有时长，但这个时间要小很多。 借助自动化上线，这种方式要比现有的上线要快很多。上线时间差越小，对线上服务的影响越小。 特殊情况 上面讲的方式虽然将时间差缩小了很多，但还是有一些很小的时间差。对于一般的服务大家都是可以接受的，但对于一些交易类的服务（如：电子商务，金融），这种时间差还是不能接受的。对于这种要求非常严格的服务估计还是只能夜里停服务上线了。]]></description>
		<link>http://www.welefen.com/reduce-bad-online-service-on-upgrade.html</link>
			</item>
	<item>
		<title>如何减少前端异步请求的数量</title>
		<description><![CDATA[开发模式 在前端开发中，一条很重要的优化原则就是减少HTTP请求数。但在实际开发中，有时候不得不用大量的异步请求。这里的异步请求所指的都是页面加载时的，之后用户操作过程中所发生的异步请求并不影响加载的速度。 在百度这边，由于FE需要写模板。所以很多时候有些功能如果有接口了，RD同学就要你使用异步接口。但异步接口使用多了就会影响页面的性能。比如说百度空间个人中心在页面加载时差不多要处理10个异步请求。这个数量是非常大的。如果减少这些异步请求的数量成为了优化的重点之重。 实现方案 目前想到一条比较可行的实现方案是通过一个公用的代理页面，前端在处理时将这些异步请求分组去处理。代理页面获取到打包的URL，然后服务器端去请求，最后将合并后的数据输出。 在服务器端去请求，由于数据是服务器对服务器的，数据网络传输时间可以忽略不计。 实现代码 if(typeof Space == 'undefined') window.Space = {}; Space.asynJs = function(){ &#160; &#160; var&#160;_isStart = false, &#160; &#160; &#160; &#160; stack = []; &#160; &#160; function&#160;start(){ &#160; &#160; &#160; &#160; if(_isStart){ &#160; &#160; &#160; &#160; &#160; &#160; throw&#160;new Error('asynJs request is start.'); &#160; &#160; &#160; &#160; &#160; &#160; return&#160;false; [...]]]></description>
		<link>http://www.welefen.com/reduce-asyn-request.html</link>
			</item>
	<item>
		<title>MBTI在线职业测试</title>
		<description><![CDATA[MBTI是什么？ MBTI 人格理论的基础是著名心理学家卡尔·荣格先生关于心理类型的划分，后经一对母女Katharine Cook Briggs 与Isabel Briggs Myers 研究并加以发展。 四个维度 共有四个维度： MBTI 人格共有四个维度，每个维度有两个方向，共计八个方面。 分别是： 外向（E） 和 内向（I） 感觉（S） 和 直觉（N） 思考（T） 和 情感（F） 判断（J） 和 知觉（P） 十六种类型 四个维度，两两组合，共有十六种类型。以各个维度的字母表示类型，如下： ESFP            ISFP               ENFJ              ENFP ESTP            ISTP               INFJ               INFP ESFJ            ISFJ                ENTP              INTP ESTJ            ISTJ                ENTJ              INTJ [...]]]></description>
		<link>http://www.welefen.com/mbti%e5%9c%a8%e7%ba%bf%e8%81%8c%e4%b8%9a%e6%b5%8b%e8%af%95.html</link>
			</item>
	<item>
		<title>月陀岛之行</title>
		<description><![CDATA[周末space大bui，带了媳妇去月陀岛，由于下雨的关系，玩的地方并不多。发几张照片纪念下。]]></description>
		<link>http://www.welefen.com/%e6%9c%88%e9%99%80%e5%b2%9b%e4%b9%8b%e8%a1%8c.html</link>
			</item>
	<item>
		<title>巧用XSS为实际需求服务</title>
		<description><![CDATA[昨天早上和JerryQu骑车上班的途中聊天，他这几天遇到一个特殊的需求。 页面中调用一个通过CMS发布的callback，callback返回一段字符串内容，然后页面拿到内容后直接innerHTML塞到某个ID里面去。本身这是个很简单的需求。 但是现在需求复杂了，希望callback返回内容中有一段脚本，用来操作页面的DOM。不想改变页面的原因是，要走整套上线流程，非常麻烦，你们懂的。 也就是本事返回的内容是“这是返回的内容”，现在变成“这是返回的内容&#60;script&#62;这里增加一些脚本操作页面&#60;/script&#62;”，但是这样直接innerHTML进去的话是不被执行的。 一种解决方案是，将script标签变成iframe,嵌套一个新的页面（这个页面也是通过CMS发布，所以也很方便），然后iframe的页面用来操作父页面的DOM（当然是在同一个域下）。 后来想到了一种解决方案。利用XSS经常用的方式，插入一个img标签，设置src为一个不存在的URL，然后再onerror事件里操作页面的DOM，如： 返回内容为“这是返回的内容&#60;img src=&#8221;h&#8221; onerror=&#8221;这里的脚本用来操作页面DOM&#8221;&#62;”。 经测试，一切OK。]]></description>
		<link>http://www.welefen.com/use-xss-for-program.html</link>
			</item>
	<item>
		<title>按字节截取字符串</title>
		<description><![CDATA[在JS中，由于中文和英文是同等对待的，但有时候我们希望是一个中文按两个字节算，这就出现了按字节截取字符串的功能。下面列举了 2种实现方式。 循环检测 这种实现方式来自于Tangram，具体实现如下： baidu.string.getByteLength = function (source) { &#160;&#160; return&#160;String(source).replace(/[^\x00-\xff]/g, &#34;ci&#34;).length; &#160;&#160; }; /* * Tangram * Copyright 2009 Baidu Inc. All rights reserved. * * path: baidu/string/subByte.js * author: dron, erik * version: 1.1.0 * date: 2009/11/30 */ /** * 对目标字符串按gbk编码截取字节长度 * * @param {string} source 目标字符串 * @param {number} length 需要截取的字节长度 * [...]]]></description>
		<link>http://www.welefen.com/substr-by-byte.html</link>
			</item>
	<item>
		<title>js动态创建类和实例化</title>
		<description><![CDATA[在js中，创建一个类和实例化该类一般方式是： var cls = function(){} cls.prototype = { attr:'', method:function(){} } var&#160;clsInstance = new cls; 这种方式简单明了，但如果类很多的话就比较痛苦了，并且代码看起来不够优化。 动态创建类 动态创建类实际上类似于一种代理的模式，代码如下： var Fath = function(methods){ &#160; &#160; var&#160;cls = function(){ &#160; &#160; &#160; &#160; return&#160;new fn(arguments); &#160; &#160; }, &#160; &#160; fn = function(args){ &#160; &#160; &#160; &#160; return&#160;this.init &#38;&#38; this.init.apply &#38;&#38; this.init.apply(this,args); &#160; &#160; }; &#160; &#160; [...]]]></description>
		<link>http://www.welefen.com/js%e5%8a%a8%e6%80%81%e5%88%9b%e5%bb%ba%e7%b1%bb%e5%92%8c%e5%ae%9e%e4%be%8b%e5%8c%96.html</link>
			</item>
	<item>
		<title>Smarty中实现模板继承功能</title>
		<description><![CDATA[在PHP+Smarty大行其道的今天，怎么样进行快速的模板开发成为了前端开发人员必须思考的问题。不同的页面，相同或者相似的页面结构是否进行了模块化处理，同样的头部或者尾部是否进行了内容分离决定了开发的效率。虽然Smarty本身支持include a file的功能，但这远远不够。我们需要的是不想重写同样的页面结构。 Jinja2的模板继承功能 Jinja是基于python的模板引擎，有个非常实用的功能就是模板继承。不太了解的可以去这里看详细的介绍http://opensource.csdn.net/bbs/thread/3943?lp=1 模板继承的好处就是你不在需要写整个页面，只要写页面的模块，然后用一个布局的页面套一下就可以了。并且页面中的模块书写顺序是无序的。 smarty本身并没有模板继承的功能，但我们可以通过block,capture和方法插件（其实block,capture也是插件）。 Smarty实现模板继承 首先我们看看一个实际的页面需要怎么写？ {=block name=page type=normal =} //这里标识block名称和页面类型，这里是{=,=}是smarty的左右标记符，你可以定义其他的 &#160; {=block name=title=} 这里是页面的标题 {=/block=} &#160; {=block name=head_static=} 这里是页面的静态样式（如css） {=/block=} &#160; {=block name=header=} 这里是页面的头部 {=/block=} &#160; {=block name=content=} 这里是页面的内容区 {=/block=} &#160; {=block name=footer=} 这里是页面的地步 {=/block=} &#160; {=block name=foot_static=} 这里是页面的静态样式（如js） {=/block=} &#160; {=/block=} 从上面的代码我们可以看到，原本需要写一个完成的页面，现在只需要写页面的模块就可以了。如果某个模块引用是公共模块的话，还可以省略。这里主要的实现方式就是定义了一个为名为block的block块。下面我们看看是怎么解析这些block的。 解析block的插件放在smarty的插件目录下，名为block.block.php文件。 &#60;?php function&#160;smarty_block_block($params, $content, &#38;$smarty) { &#160; &#160; [...]]]></description>
		<link>http://www.welefen.com/smarty-tpl-inherit.html</link>
			</item>
	<item>
		<title>生日与星座绑定的杯具</title>
		<description><![CDATA[这个标题是基于生日是阴历的情况下。在中国，我相信有很多人过的都是阴历，我就是其中一个，并且是在腊月。但在国内很大网站，包括一些大型网站生日都没有阴阳历的选择。这样会导致什么样的后果呢？就拿我自己来说吧，我过的是阴历，本来我很想把真实的生日填上去的，这样在生日的时候可以接受一些生日礼物，这对社区型网站是非常重要的，这样可以增加用户的回访率。但现实很残酷，由于并不是每一年的阴阳历都是对应的（如：我出生是86年12月11日，对应的阳历是87年01月10日。但在2009年这两个日期是不对应的）。曾经出现这样的事情，hi上给我祝贺时，我只能说今天不是我生日。但个人很杯具，但对这个产品更杯具，几次下来这个用户可能就流失了。 现在已经有几个产品已经注意到这个问题了。下面从我知道的意义列举，他们做的确实非常不错。 QQ 不管QQ是如何出生的，但QQ2009做的非常不错，非常好看的UI，也很不错的UE。QQ2009用了一年多了没出现过崩溃和卡死的现象，这是百度Hi和阿里旺旺所不能及的，当然后2款IM产品存在时间确实也ＱＱ要短很多，所以可以原谅。 回到本文的标题上，最近QQ2009有个更新，那就是生日有阴阳历选择了，并且生日不与星座绑定的。效果如下： 并且阴阳历可以对应切换，虽然这个实现了不难。 并且结合qzone里提前给好友送生日礼物，对增加用户粘度是非常不错的。 kaixin001和白社会 SNS网站kaixin001和搜狐的白社会现在也有了生日可以选择阴阳历的功能。 但开心网上生日是与星座绑定的，白社会上根本就没星座这个选项。 对于生日与星座需不需要绑定，这还要用户的心声。 我认为，如果生日有阴阳历选择的功能，绑定也没啥关系了。 百度需要做的工作 百度的passport产品线在这个方面还要做很多的工作： 1、生日没有阴阳历选择，并且生日还和星座绑定。 2、邮箱绑定后无法修改，这是个非常严重的问题。]]></description>
		<link>http://www.welefen.com/%e7%94%9f%e6%97%a5%e4%b8%8e%e6%98%9f%e5%ba%a7%e7%bb%91%e5%ae%9a%e7%9a%84%e6%9d%af%e5%85%b7.html</link>
			</item>
	<item>
		<title>那些伴随成长的野果</title>
		<description><![CDATA[那些伴随成长的野果，现在却叫不全名字来，着实是个大杯具。 记忆力下降惊人啊。。。 大茶树上长的果子，未成熟时是青色，待外面的皮脱了才好吃。不过吃的时候要小心掰开，因为有的里面会有“百节虫”。]]></description>
		<link>http://www.welefen.com/%e9%82%a3%e4%ba%9b%e4%bc%b4%e9%9a%8f%e6%88%90%e9%95%bf%e7%9a%84%e9%87%8e%e6%9e%9c.html</link>
			</item>
</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->