<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Show Framework</title>
	<atom:link href="http://www.showframework.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.showframework.com</link>
	<description>作为一个WEB技术受益者，无论使用那种浏览器，都请升级到最新版本</description>
	<lastBuildDate>Thu, 17 May 2012 17:35:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>抛弃移动硬盘，全面转向云存储</title>
		<link>http://www.showframework.com/2012/05/%e6%8a%9b%e5%bc%83%e7%a7%bb%e5%8a%a8%e7%a1%ac%e7%9b%98%ef%bc%8c%e5%85%a8%e9%9d%a2%e8%bd%ac%e5%90%91%e4%ba%91%e5%ad%98%e5%82%a8/</link>
		<comments>http://www.showframework.com/2012/05/%e6%8a%9b%e5%bc%83%e7%a7%bb%e5%8a%a8%e7%a1%ac%e7%9b%98%ef%bc%8c%e5%85%a8%e9%9d%a2%e8%bd%ac%e5%90%91%e4%ba%91%e5%ad%98%e5%82%a8/#comments</comments>
		<pubDate>Thu, 17 May 2012 17:35:27 +0000</pubDate>
		<dc:creator>ishowshao</dc:creator>
				<category><![CDATA[cloud]]></category>

		<guid isPermaLink="false">http://www.showframework.com/?p=390</guid>
		<description><![CDATA[现在网盘服务已经遍地开花了，我感觉今年才是云存储的转折之年。看好云服务，过若干年，本地化应用一定会相当弱化，这个若干年是长是短，还要看人们的观念转变快慢，现在更多的人还是习惯花两三千块买电脑到手，而不太能接受一年百十来块钱看上去虚无缥缈的云存储和云服务。 只是时间问题。 是时候做一些云计算的思考和积累了。]]></description>
			<content:encoded><![CDATA[<p>现在网盘服务已经遍地开花了，我感觉今年才是云存储的转折之年。看好云服务，过若干年，本地化应用一定会相当弱化，这个若干年是长是短，还要看人们的观念转变快慢，现在更多的人还是习惯花两三千块买电脑到手，而不太能接受一年百十来块钱看上去虚无缥缈的云存储和云服务。<br />
只是时间问题。<br />
是时候做一些云计算的思考和积累了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.showframework.com/2012/05/%e6%8a%9b%e5%bc%83%e7%a7%bb%e5%8a%a8%e7%a1%ac%e7%9b%98%ef%bc%8c%e5%85%a8%e9%9d%a2%e8%bd%ac%e5%90%91%e4%ba%91%e5%ad%98%e5%82%a8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mac os 文件分割 突破网盘大小限制</title>
		<link>http://www.showframework.com/2012/05/mac-os-%e6%96%87%e4%bb%b6%e5%88%86%e5%89%b2-%e7%aa%81%e7%a0%b4%e7%bd%91%e7%9b%98%e5%a4%a7%e5%b0%8f%e9%99%90%e5%88%b6/</link>
		<comments>http://www.showframework.com/2012/05/mac-os-%e6%96%87%e4%bb%b6%e5%88%86%e5%89%b2-%e7%aa%81%e7%a0%b4%e7%bd%91%e7%9b%98%e5%a4%a7%e5%b0%8f%e9%99%90%e5%88%b6/#comments</comments>
		<pubDate>Thu, 17 May 2012 16:48:37 +0000</pubDate>
		<dc:creator>ishowshao</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.showframework.com/?p=388</guid>
		<description><![CDATA[有两个办法 1. 用split 命令   split [-a suffix_length] [-b byte_count[k&#124;m]] [-l line_count] [-p pattern] [file [name]] 例如 split  -b 100m windows.iso  windows.iso. 他会按照100m把windows.iso文件分割成 windows.iso.aa windows.iso.ab &#8230;. ac &#8230; ad &#8230; 合并用 cat windows.iso.* &#62; windows.iso 即可 2. zip -s 100m 解压时也要先cat &#8230; <a href="http://www.showframework.com/2012/05/mac-os-%e6%96%87%e4%bb%b6%e5%88%86%e5%89%b2-%e7%aa%81%e7%a0%b4%e7%bd%91%e7%9b%98%e5%a4%a7%e5%b0%8f%e9%99%90%e5%88%b6/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>有两个办法</p>
<p>1. 用split 命令   split [-a suffix_length] [-b byte_count[k|m]] [-l line_count] [-p pattern] [file [name]]</p>
<p>例如 split  -b 100m windows.iso  windows.iso.</p>
<p>他会按照100m把windows.iso文件分割成 windows.iso.aa windows.iso.ab &#8230;. ac &#8230; ad &#8230;</p>
<p>合并用 cat windows.iso.* &gt; windows.iso 即可</p>
<p>2. zip -s 100m</p>
<p>解压时也要先cat  合并</p>
]]></content:encoded>
			<wfw:commentRss>http://www.showframework.com/2012/05/mac-os-%e6%96%87%e4%bb%b6%e5%88%86%e5%89%b2-%e7%aa%81%e7%a0%b4%e7%bd%91%e7%9b%98%e5%a4%a7%e5%b0%8f%e9%99%90%e5%88%b6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mac 版 skydrive 安装后提示无法在指定位置创建SkyDrive文件夹</title>
		<link>http://www.showframework.com/2012/05/mac-%e7%89%88-skydrive-%e5%ae%89%e8%a3%85%e5%90%8e%e6%8f%90%e7%a4%ba%e6%97%a0%e6%b3%95%e5%9c%a8%e6%8c%87%e5%ae%9a%e4%bd%8d%e7%bd%ae%e5%88%9b%e5%bb%baskydrive%e6%96%87%e4%bb%b6%e5%a4%b9/</link>
		<comments>http://www.showframework.com/2012/05/mac-%e7%89%88-skydrive-%e5%ae%89%e8%a3%85%e5%90%8e%e6%8f%90%e7%a4%ba%e6%97%a0%e6%b3%95%e5%9c%a8%e6%8c%87%e5%ae%9a%e4%bd%8d%e7%bd%ae%e5%88%9b%e5%bb%baskydrive%e6%96%87%e4%bb%b6%e5%a4%b9/#comments</comments>
		<pubDate>Thu, 17 May 2012 09:59:37 +0000</pubDate>
		<dc:creator>ishowshao</dc:creator>
				<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://www.showframework.com/?p=386</guid>
		<description><![CDATA[mac 版 skydrive 安装后提示无法在指定位置创建SkyDrive文件夹 任何位置都不行。 我的mac系统分区大小写敏感 由于SkyDrive文件夹不支持在大小写敏感分区创建，建议您在非大小写敏感分区创建SkyDrive文件夹。]]></description>
			<content:encoded><![CDATA[<h1 id="threadTitle">mac 版 skydrive 安装后提示无法在指定位置创建SkyDrive文件夹</h1>
<p>任何位置都不行。</p>
<div>我的mac系统分区大小写敏感</div>
<div></div>
<div>由于SkyDrive文件夹不支持在大小写敏感分区创建，建议您在非大小写敏感分区创建SkyDrive文件夹。</div>
]]></content:encoded>
			<wfw:commentRss>http://www.showframework.com/2012/05/mac-%e7%89%88-skydrive-%e5%ae%89%e8%a3%85%e5%90%8e%e6%8f%90%e7%a4%ba%e6%97%a0%e6%b3%95%e5%9c%a8%e6%8c%87%e5%ae%9a%e4%bd%8d%e7%bd%ae%e5%88%9b%e5%bb%baskydrive%e6%96%87%e4%bb%b6%e5%a4%b9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExtJS Grid中文字链接点击事件的更合理的处理办法</title>
		<link>http://www.showframework.com/2012/05/extjs-grid%e4%b8%ad%e6%96%87%e5%ad%97%e9%93%be%e6%8e%a5%e7%82%b9%e5%87%bb%e4%ba%8b%e4%bb%b6%e7%9a%84%e6%9b%b4%e5%90%88%e7%90%86%e7%9a%84%e5%a4%84%e7%90%86%e5%8a%9e%e6%b3%95/</link>
		<comments>http://www.showframework.com/2012/05/extjs-grid%e4%b8%ad%e6%96%87%e5%ad%97%e9%93%be%e6%8e%a5%e7%82%b9%e5%87%bb%e4%ba%8b%e4%bb%b6%e7%9a%84%e6%9b%b4%e5%90%88%e7%90%86%e7%9a%84%e5%a4%84%e7%90%86%e5%8a%9e%e6%b3%95/#comments</comments>
		<pubDate>Wed, 16 May 2012 16:09:48 +0000</pubDate>
		<dc:creator>ishowshao</dc:creator>
				<category><![CDATA[ExtJS]]></category>

		<guid isPermaLink="false">http://www.showframework.com/?p=381</guid>
		<description><![CDATA[我们经常会给GridPanel中的某一个column加一个renderer，让它的内容可以变成一个链接，例如： resultRenderer: function (value) { return &#8216;&#60;a href=”http://www.example.com/” onclick=”some_function()” &#62;查看&#60;/a&#62;&#8217;; } 这样在Grid中，查看那两个字就变成链接了，如果点击这个查看的时候，想弹出窗口，那么我们最普通的方式，就是给链接加一个onclick响应函数，onclick这里调用的函数，必然是通过全局的方式了，这样做有个缺点，就是全局函数的扩散，造成可维护性下降 其实，有一种更合理的处理办法，不论renderer中生成的是链接，还是其他的内容比如button，都是通用的 代码如下 首先给grid添加一个cellclick事件的响应函数 grid.on(&#8216;cellclick&#8217;, grid.onCellClick, grid); 响应函数中做如下处理 onCellClick: function (grid, rowIndex, columnIndex, e) { if (e.getTarget().innerHTML === &#8216;查看&#8217; ) { //借助事件的target来判断，这里是链接可以这样判断，其他方式亦可 var record = grid.getStore().getAt(rowIndex);  // Get the &#8230; <a href="http://www.showframework.com/2012/05/extjs-grid%e4%b8%ad%e6%96%87%e5%ad%97%e9%93%be%e6%8e%a5%e7%82%b9%e5%87%bb%e4%ba%8b%e4%bb%b6%e7%9a%84%e6%9b%b4%e5%90%88%e7%90%86%e7%9a%84%e5%a4%84%e7%90%86%e5%8a%9e%e6%b3%95/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>我们经常会给GridPanel中的某一个column加一个renderer，让它的内容可以变成一个链接，例如：</p>
<p>resultRenderer: function (value) {<br />
return &#8216;&lt;a href=”http://www.example.com/” onclick=”some_function()” &gt;查看&lt;/a&gt;&#8217;;<br />
}</p>
<p>这样在Grid中，查看那两个字就变成链接了，如果点击这个查看的时候，想弹出窗口，那么我们最普通的方式，就是给链接加一个onclick响应函数，onclick这里调用的函数，必然是通过全局的方式了，这样做有个缺点，就是全局函数的扩散，造成可维护性下降<br />
其实，有一种更合理的处理办法，不论renderer中生成的是链接，还是其他的内容比如button，都是通用的</p>
<p>代码如下</p>
<p>首先给grid添加一个cellclick事件的响应函数</p>
<p>grid.on(&#8216;cellclick&#8217;, grid.onCellClick, grid);</p>
<p>响应函数中做如下处理</p>
<p>onCellClick: function (grid, rowIndex, columnIndex, e) {<br />
if (e.getTarget().innerHTML === &#8216;查看&#8217; ) { //借助事件的target来判断，这里是链接可以这样判断，其他方式亦可<br />
var record = grid.getStore().getAt(rowIndex);  // Get the Record<br />
var fieldName = grid.getColumnModel().getDataIndex(columnIndex); // Get field name<br />
var data = record.get(fieldName);//这个data就是点击的单元格的数据了，一定有用的</p>
<p>if (fieldName == &#8216;this_column&#8217;) {<br />
//如果是这一列，做这个事<br />
}</p>
<p>if (fieldName === &#8216;that_column&#8217;) {<br />
//如果是另外一列，做另外的事<br />
}<br />
}<br />
}</p>
<p>这个方法，不仅可以处理链接，简化一下就是处理某个单元格点击，onCellClick的作用域还是grid，这个是重点， onCellClick还是在grid这个组件之内，而没有产生全局调用 ，另外点击onclick的响应函数，只能接收字面参数，想传递一个对象是不可能的，如果应用上述方法，即可解决</p>
]]></content:encoded>
			<wfw:commentRss>http://www.showframework.com/2012/05/extjs-grid%e4%b8%ad%e6%96%87%e5%ad%97%e9%93%be%e6%8e%a5%e7%82%b9%e5%87%bb%e4%ba%8b%e4%bb%b6%e7%9a%84%e6%9b%b4%e5%90%88%e7%90%86%e7%9a%84%e5%a4%84%e7%90%86%e5%8a%9e%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>各浏览器处理padding-margin滚动条-神一般的特立独行</title>
		<link>http://www.showframework.com/2012/05/%e5%90%84%e6%b5%8f%e8%a7%88%e5%99%a8%e5%a4%84%e7%90%86padding-margin%e6%bb%9a%e5%8a%a8%e6%9d%a1-%e7%a5%9e%e4%b8%80%e8%88%ac%e7%9a%84%e7%89%b9%e7%ab%8b%e7%8b%ac%e8%a1%8c/</link>
		<comments>http://www.showframework.com/2012/05/%e5%90%84%e6%b5%8f%e8%a7%88%e5%99%a8%e5%a4%84%e7%90%86padding-margin%e6%bb%9a%e5%8a%a8%e6%9d%a1-%e7%a5%9e%e4%b8%80%e8%88%ac%e7%9a%84%e7%89%b9%e7%ab%8b%e7%8b%ac%e8%a1%8c/#comments</comments>
		<pubDate>Thu, 10 May 2012 07:33:40 +0000</pubDate>
		<dc:creator>ishowshao</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[padding]]></category>

		<guid isPermaLink="false">http://www.showframework.com/?p=378</guid>
		<description><![CDATA[&#60;div style=”overflow: auto; width: 200px; height: 200px; border: 1px solid blue;”&#62; &#60;div style=”border: 1px solid black; height: 300px; margin: 20px;”&#62;&#60;/div&#62; &#60;/div&#62; &#60;div style=”padding: 20px; overflow: auto; width: 160px; height: 200px; border: 1px solid blue;”&#62; &#60;div style=”border: 1px solid black; height: &#8230; <a href="http://www.showframework.com/2012/05/%e5%90%84%e6%b5%8f%e8%a7%88%e5%99%a8%e5%a4%84%e7%90%86padding-margin%e6%bb%9a%e5%8a%a8%e6%9d%a1-%e7%a5%9e%e4%b8%80%e8%88%ac%e7%9a%84%e7%89%b9%e7%ab%8b%e7%8b%ac%e8%a1%8c/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>&lt;div style=”overflow: auto; width: 200px; height: 200px; border: 1px solid blue;”&gt;<br />
&lt;div style=”border: 1px solid black; height: 300px; margin: 20px;”&gt;&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;div style=”padding: 20px; overflow: auto; width: 160px; height: 200px; border: 1px solid blue;”&gt;<br />
&lt;div style=”border: 1px solid black; height: 300px;”&gt;&lt;/div&gt;<br />
&lt;/div&gt;<br />
就这样简单一段代码，当蓝色框滚动条滚动到底部，各种浏览器，组合出了所有可能的组合方式，注意观察蓝色方框底部的留白</p>
<p><a href="http://www.showframework.com/wp-content/uploads/2012/05/margin-padding-scroll.png"><img class="alignnone size-full wp-image-379" title="margin-padding-scroll" src="http://www.showframework.com/wp-content/uploads/2012/05/margin-padding-scroll.png" alt="" width="954" height="577" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.showframework.com/2012/05/%e5%90%84%e6%b5%8f%e8%a7%88%e5%99%a8%e5%a4%84%e7%90%86padding-margin%e6%bb%9a%e5%8a%a8%e6%9d%a1-%e7%a5%9e%e4%b8%80%e8%88%ac%e7%9a%84%e7%89%b9%e7%ab%8b%e7%8b%ac%e8%a1%8c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>苹果发布Mac OS X更新10.7.4</title>
		<link>http://www.showframework.com/2012/05/%e8%8b%b9%e6%9e%9c%e5%8f%91%e5%b8%83mac-os-x%e6%9b%b4%e6%96%b010-7-4/</link>
		<comments>http://www.showframework.com/2012/05/%e8%8b%b9%e6%9e%9c%e5%8f%91%e5%b8%83mac-os-x%e6%9b%b4%e6%96%b010-7-4/#comments</comments>
		<pubDate>Thu, 10 May 2012 03:00:57 +0000</pubDate>
		<dc:creator>ishowshao</dc:creator>
				<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://www.showframework.com/?p=373</guid>
		<description><![CDATA[建议所有 OS X Lion 用户都安装 10.7.4 更新，本更新包括一般性的操作系统修正，增强了 Mac 的稳定性、兼容性和安全性，修正的内容包括： 解决了“重新登录时重新打开窗口”设置总是启用的问题 增强了与某些英国第三方 USB 键盘的兼容性 解决了可能会阻止文件存储到服务器的问题 增强了将文件拷贝到 SMB 服务器时的可靠性 有关本更新的详细信息，请访问此网站：http://support.apple.com/kb/HT5167?viewlocale=zh_CN。 有关本更新的安全性内容的信息，请访问：http://support.apple.com/kb/HT1222?viewlocale=zh_CN。 &#160;]]></description>
			<content:encoded><![CDATA[<p>建议所有 OS X Lion 用户都安装 10.7.4 更新，本更新包括一般性的操作系统修正，增强了 Mac 的稳定性、兼容性和安全性，修正的内容包括：</p>
<ul>
<li>解决了“重新登录时重新打开窗口”设置总是启用的问题</li>
<li>增强了与某些英国第三方 USB 键盘的兼容性</li>
<li>解决了可能会阻止文件存储到服务器的问题</li>
<li>增强了将文件拷贝到 SMB 服务器时的可靠性</li>
</ul>
<p>有关本更新的详细信息，请访问此网站：<a href="http://support.apple.com/kb/HT5167?viewlocale=zh_CN">http://support.apple.com/kb/HT5167?viewlocale=zh_CN</a>。<br />
有关本更新的安全性内容的信息，请访问：<a href="http://support.apple.com/kb/HT1222?viewlocale=zh_CN">http://support.apple.com/kb/HT1222?viewlocale=zh_CN</a>。</p>
<p><a href="http://www.showframework.com/wp-content/uploads/2012/05/Snip20120510_2.png"><img class="alignnone size-full wp-image-376" title="Snip20120510_2" src="http://www.showframework.com/wp-content/uploads/2012/05/Snip20120510_2.png" alt="" width="512" height="620" /></a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.showframework.com/2012/05/%e8%8b%b9%e6%9e%9c%e5%8f%91%e5%b8%83mac-os-x%e6%9b%b4%e6%96%b010-7-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>寻找并合并苹果 iPhone 通讯录里重复联系人的 iOS 应用：Smart Merge</title>
		<link>http://www.showframework.com/2012/05/%e5%af%bb%e6%89%be%e5%b9%b6%e5%90%88%e5%b9%b6%e8%8b%b9%e6%9e%9c-iphone-%e9%80%9a%e8%ae%af%e5%bd%95%e9%87%8c%e9%87%8d%e5%a4%8d%e8%81%94%e7%b3%bb%e4%ba%ba%e7%9a%84-ios-%e5%ba%94%e7%94%a8%ef%bc%9asmart-m/</link>
		<comments>http://www.showframework.com/2012/05/%e5%af%bb%e6%89%be%e5%b9%b6%e5%90%88%e5%b9%b6%e8%8b%b9%e6%9e%9c-iphone-%e9%80%9a%e8%ae%af%e5%bd%95%e9%87%8c%e9%87%8d%e5%a4%8d%e8%81%94%e7%b3%bb%e4%ba%ba%e7%9a%84-ios-%e5%ba%94%e7%94%a8%ef%bc%9asmart-m/#comments</comments>
		<pubDate>Thu, 10 May 2012 02:51:31 +0000</pubDate>
		<dc:creator>ishowshao</dc:creator>
				<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://www.showframework.com/?p=368</guid>
		<description><![CDATA[在被 Google、iCloud、iTunes 和其它带通讯录同步和导入功能的服务折腾几轮以后，我的 iPhone 通讯录已经惨不忍睹了：一堆重复联系人。有的是同一个名字，电话、邮件、IM、地址等数据各建了个联系人。有的是同一个电话，张三、三张、张 三（空格）、zhangsan（网名）等等也分别建了个联系人。 还好前几天找到了 Smart Merge 这款应用，能自动查找通讯录里的重复信息，让我节省了大量时间。 Smart Merge 的界面真不咋地，好在这 App 只用一次。进去就能看到 iPhone 通讯录里的各种重复联系人列表： Duplicate Contacts —— 人名重复的 Duplicate Phones —— 电话号码重复（上文提到的 “张三、三张、张 三” 杯具） Duplicate Emails —— 邮件重复（同上） Smart Merge 不会自己把这些重复联系人合并，毕竟通讯录这玩意儿删错了会出大事的。你可以点进去查看详情，自己打钩合并。比如：5 个叫 iLike 的联系人，有的记录了电话，有的记录 iChat，还有空联系人。合并后只剩下一个联系人，且此前各条目下的联系方式汇总到一起。既不丢失通讯录信息，又大大节省了今后的查找时间。 Smart &#8230; <a href="http://www.showframework.com/2012/05/%e5%af%bb%e6%89%be%e5%b9%b6%e5%90%88%e5%b9%b6%e8%8b%b9%e6%9e%9c-iphone-%e9%80%9a%e8%ae%af%e5%bd%95%e9%87%8c%e9%87%8d%e5%a4%8d%e8%81%94%e7%b3%bb%e4%ba%ba%e7%9a%84-ios-%e5%ba%94%e7%94%a8%ef%bc%9asmart-m/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>在被 Google、iCloud、iTunes 和其它带通讯录同步和导入功能的服务折腾几轮以后，我的 iPhone 通讯录已经惨不忍睹了：一堆重复联系人。有的是同一个名字，电话、邮件、IM、地址等数据各建了个联系人。有的是同一个电话，张三、三张、张 三（空格）、zhangsan（网名）等等也分别建了个联系人。</p>
<p>还好前几天找到了 Smart Merge 这款应用，能自动查找通讯录里的重复信息，让我节省了大量时间。</p>
<p><a href="http://www.showframework.com/wp-content/uploads/2012/05/1.png"><img class="alignnone size-full wp-image-369" title="1" src="http://www.showframework.com/wp-content/uploads/2012/05/1.png" alt="" width="650" height="480" /></a></p>
<div align="center"></div>
<p>Smart Merge 的界面真不咋地，好在这 App 只用一次。进去就能看到 iPhone 通讯录里的各种重复联系人列表：</p>
<ul>
<li>Duplicate Contacts —— 人名重复的</li>
<li>Duplicate Phones —— 电话号码重复（上文提到的 “张三、三张、张 三” 杯具）</li>
<li>Duplicate Emails —— 邮件重复（同上）</li>
</ul>
<div align="center"></div>
<p><a href="http://www.showframework.com/wp-content/uploads/2012/05/2.png"><img class="alignnone size-full wp-image-370" title="2" src="http://www.showframework.com/wp-content/uploads/2012/05/2.png" alt="" width="650" height="480" /></a></p>
<p>Smart Merge 不会自己把这些重复联系人合并，毕竟通讯录这玩意儿删错了会出大事的。你可以点进去查看详情，自己打钩合并。比如：5 个叫 iLike 的联系人，有的记录了电话，有的记录 iChat，还有空联系人。合并后只剩下一个联系人，且此前各条目下的联系方式汇总到一起。既不丢失通讯录信息，又大大节省了今后的查找时间。</p>
<p>Smart Merge 在苹果 App Store 应用商店的下载地址 <span style="text-decoration: underline;"><a title="Smart Merge 在苹果 App Store 应用商店的下载地址" href="http://itunes.apple.com/cn/app/id519076307?mt=8" rel="nofollow" target="_blank"><span style="color: #0000ff;">http://itunes.apple.com/cn/app/id519076307?mt=8</span></a></span></p>
<p>原文 <a href="http://www.mac52ipod.cn/post/merge-apple-iphone-address-book-duplicate-contacts-ios-app-smart-merge.php">http://www.mac52ipod.cn/post/merge-apple-iphone-address-book-duplicate-contacts-ios-app-smart-merge.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.showframework.com/2012/05/%e5%af%bb%e6%89%be%e5%b9%b6%e5%90%88%e5%b9%b6%e8%8b%b9%e6%9e%9c-iphone-%e9%80%9a%e8%ae%af%e5%bd%95%e9%87%8c%e9%87%8d%e5%a4%8d%e8%81%94%e7%b3%bb%e4%ba%ba%e7%9a%84-ios-%e5%ba%94%e7%94%a8%ef%bc%9asmart-m/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>苹果发布 iOS 5.1.1 系统更新</title>
		<link>http://www.showframework.com/2012/05/%e8%8b%b9%e6%9e%9c%e5%8f%91%e5%b8%83-ios-5-1-1-%e7%b3%bb%e7%bb%9f%e6%9b%b4%e6%96%b0/</link>
		<comments>http://www.showframework.com/2012/05/%e8%8b%b9%e6%9e%9c%e5%8f%91%e5%b8%83-ios-5-1-1-%e7%b3%bb%e7%bb%9f%e6%9b%b4%e6%96%b0/#comments</comments>
		<pubDate>Tue, 08 May 2012 09:06:05 +0000</pubDate>
		<dc:creator>ishowshao</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://www.showframework.com/?p=365</guid>
		<description><![CDATA[苹果今天发布了 iOS 5.1.1 系统更新（固件版本 9B206），推荐以 OTA 方式更新系统：WiFI 网络下，点击 “设置——通用——软件更新” 自动检查和下载系统更新，增量更新下载的文件体积很小，几分钟即可完成升级。 &#160;]]></description>
			<content:encoded><![CDATA[<p>苹果今天发布了 iOS 5.1.1 系统更新（固件版本 9B206），推荐以 OTA 方式更新系统：WiFI 网络下，点击 “设置——通用——软件更新” 自动检查和下载系统更新，增量更新下载的文件体积很小，几分钟即可完成升级。</p>
<p><a href="http://www.showframework.com/wp-content/uploads/2012/05/IMG_0187.png"><img class="alignnone size-medium wp-image-366" title="IMG_0187" src="http://www.showframework.com/wp-content/uploads/2012/05/IMG_0187-200x300.png" alt="" width="200" height="300" /></a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.showframework.com/2012/05/%e8%8b%b9%e6%9e%9c%e5%8f%91%e5%b8%83-ios-5-1-1-%e7%b3%bb%e7%bb%9f%e6%9b%b4%e6%96%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php json_encode 遇到html标签 js错误</title>
		<link>http://www.showframework.com/2012/05/php-json_encode-%e9%81%87%e5%88%b0html%e6%a0%87%e7%ad%be-js%e9%94%99%e8%af%af/</link>
		<comments>http://www.showframework.com/2012/05/php-json_encode-%e9%81%87%e5%88%b0html%e6%a0%87%e7%ad%be-js%e9%94%99%e8%af%af/#comments</comments>
		<pubDate>Tue, 08 May 2012 06:55:35 +0000</pubDate>
		<dc:creator>ishowshao</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.showframework.com/?p=363</guid>
		<description><![CDATA[当php  json_encode 如下的 $output = array(&#8216;success&#8217; =&#62; true, &#8216;data&#8217; =&#62; &#8216;&#60;p&#62;test&#60;/p&#62;&#8217;); 时候有可能， 如果前端的js是用eval(&#8216;(&#8216; + jsonStr + &#8216;)&#8217;);的方式，亦或window.JSON.parse  都会报错 原因在于php的json_encode 默认是不转义&#60; &#62; 这种标签的， 这时候使用json_encode($output, JSON_HEX_TAG) 来把输出的tag开始结束符号转移掉就不会出错了 &#60; 会被转义成\u003C &#62; 会被转义成 \u003E]]></description>
			<content:encoded><![CDATA[<p>当php  json_encode 如下的</p>
<p>$output = array(&#8216;success&#8217; =&gt; true, &#8216;data&#8217; =&gt; &#8216;&lt;p&gt;test&lt;/p&gt;&#8217;);</p>
<p>时候有可能，</p>
<p>如果前端的js是用eval(&#8216;(&#8216; + jsonStr + &#8216;)&#8217;);的方式，亦或window.JSON.parse  都会报错</p>
<p>原因在于php的json_encode 默认是不转义&lt; &gt; 这种标签的，</p>
<p>这时候使用json_encode($output, JSON_HEX_TAG) 来把输出的tag开始结束符号转移掉就不会出错了</p>
<p>&lt; 会被转义成\u003C &gt; 会被转义成 \u003E</p>
]]></content:encoded>
			<wfw:commentRss>http://www.showframework.com/2012/05/php-json_encode-%e9%81%87%e5%88%b0html%e6%a0%87%e7%ad%be-js%e9%94%99%e8%af%af/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Extjs Combobox displayField有相同值造成的经典bug</title>
		<link>http://www.showframework.com/2012/05/extjs-combobox-displayfield%e6%9c%89%e7%9b%b8%e5%90%8c%e5%80%bc%e9%80%a0%e6%88%90%e7%9a%84%e7%bb%8f%e5%85%b8bug/</link>
		<comments>http://www.showframework.com/2012/05/extjs-combobox-displayfield%e6%9c%89%e7%9b%b8%e5%90%8c%e5%80%bc%e9%80%a0%e6%88%90%e7%9a%84%e7%bb%8f%e5%85%b8bug/#comments</comments>
		<pubDate>Tue, 08 May 2012 06:52:51 +0000</pubDate>
		<dc:creator>ishowshao</dc:creator>
				<category><![CDATA[ExtJS]]></category>

		<guid isPermaLink="false">http://www.showframework.com/?p=361</guid>
		<description><![CDATA[今天同事说combobox有两个选项选出来的id是一样的，看了一下还确实是两个选项选出来的id一样(store里面这两个record的值确实不一样)，头一次遇见这种诡异的bug，但是有个特征就是这两个选项的字是一样的，就是displayField的值相同才会出现这种bug。 查了一下源码(Combo.js)里面没有太特殊的实现，有几处值得怀疑的 &#160; // private onSelect : function(record, index){ if(this.fireEvent('beforeselect', this, record, index) !== false){ this.setValue(record.data[this.valueField &#124;&#124; this.displayField]); this.collapse(); this.fireEvent('select', this, record, index); } }, assertValue : function(){ var val = this.getRawValue(), rec = this.findRecord(this.displayField, val); if(!rec &#38;&#38; this.forceSelection){ if(val.length &#8230; <a href="http://www.showframework.com/2012/05/extjs-combobox-displayfield%e6%9c%89%e7%9b%b8%e5%90%8c%e5%80%bc%e9%80%a0%e6%88%90%e7%9a%84%e7%bb%8f%e5%85%b8bug/">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>今天同事说combobox有两个选项选出来的id是一样的，看了一下还确实是两个选项选出来的id一样(store里面这两个record的值确实不一样)，头一次遇见这种诡异的bug，但是有个特征就是这两个选项的字是一样的，就是displayField的值相同才会出现这种bug。</p>
<p>查了一下源码(Combo.js)里面没有太特殊的实现，有几处值得怀疑的</p>
<p>&nbsp;</p>
<pre>    // private
    onSelect : function(record, index){
        if(this.fireEvent('beforeselect', this, record, index) !== false){
            this.setValue(record.data[this.valueField || this.displayField]);
            this.collapse();
            this.fireEvent('select', this, record, index);
        }
    },</pre>
<pre>    assertValue  : function(){
        var val = this.getRawValue(),
            rec = this.findRecord(this.displayField, val);

        if(!rec &amp;&amp; this.forceSelection){
            if(val.length &gt; 0 &amp;&amp; val != this.emptyText){
                this.el.dom.value = Ext.value(this.lastSelectionText, '');
                this.applyEmptyText();
            }else{
                this.clearValue();
            }
        }else{
            if(rec){
                // onSelect may have already set the value and by doing so
                // set the display field properly.  Let's not wipe out the
                // valueField here by just sending the displayField.
                if (val == rec.get(this.displayField) &amp;&amp; this.value == rec.get(this.valueField)){
                    return;
                }
                val = rec.get(this.valueField || this.displayField);
            }
            this.setValue(val);
        }
    },</pre>
<p>来分析一下，onSelect的时候是先setValue然后fireEvent select事件，我让同事实验了一下，发现在select事件响应函数中取得的选择是对的，那是不是setValue的时候出错了，很有可能，因为getValue就是返回之前setValue设置的值</p>
<p>看一下setValue的实现：</p>
<pre>    setValue : function(v){
        var text = v;
        if(this.valueField){
            var r = this.findRecord(this.valueField, v);
            if(r){
                text = r.data[this.displayField];
            }else if(Ext.isDefined(this.valueNotFoundText)){
                text = this.valueNotFoundText;
            }
        }
        this.lastSelectionText = text;
        if(this.hiddenField){
            this.hiddenField.value = Ext.value(v, '');
        }
        Ext.form.ComboBox.superclass.setValue.call(this, text);
        this.value = v;
        return this;
    },</pre>
<p>setValue里面最可疑的就是那个this.findRecord，</p>
<pre>    findRecord : function(prop, value){
        var record;
        if(this.store.getCount() &gt; 0){
            this.store.each(function(r){
                if(r.data[prop] == value){
                    record = r;
                    return false;
                }
            });
        }
        return record;
    },</pre>
<p>findRecord使用record中的一个字段做循环比较，是不是哪里弄错了误用了displayField做为比较的字段，这里面displayField是有相同值的，那肯定findRecord的结果是第一个匹配的record了，但是查了一下这个过程，确实没有误用的地方。</p>
<p>这个时候我同事说在 combobox的blur事件之后 再调用这个combobox的getValue就不对了，之前提到的可疑点assertValue 在beforeBlur的时候有调用，而且就只有这一个地方调用，firebug调试了一下果然是这个函数的问题，这个函数的实际运行结果是走到了函数中setValue那一行，而setValue设置的值却是用getRawValue的结果去findRecord，之前说了，如果findRecord用displayField作为比较字段，取出来的肯定是displayField所有相同值中排在最前面的那个值。  让同事又增加了一个相同的displayField值试验了一下，果然如此。</p>
<p>但是有个疑问：assertValue这个函数从名字上看不出什么作用，那beforeBlur中为什么要调用这个校验函数呢，结合这个函数中一个if语句判断了this.forceSelection 突然明白了：</p>
<p>如果forceSelection为false，Extjs的combobox是既可以选择，又可以手动输入值的，这个时候它就需要校验你手动输入的值，是否在displayField中已经出现，如果已经出现，那提交的时候需要提交这个displayField对应的valueField，如果没有出现，那么直接提交手动输入的内容。这个时候，如果displayField中有两个相同的值，这个combobox的value 就被设为第一个相同值的id了，由此导致了这个bug</p>
<p>但是想想，这真的算个bug吗，当用户点开下拉框，看到两个相同的选项，他应该选哪个？在Extjs出bug之前，我们已经犯了错误。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.showframework.com/2012/05/extjs-combobox-displayfield%e6%9c%89%e7%9b%b8%e5%90%8c%e5%80%bc%e9%80%a0%e6%88%90%e7%9a%84%e7%bb%8f%e5%85%b8bug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

