<?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>Google Stop Blog - Make a change</title>
	<atom:link href="http://googlestop.com/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://googlestop.com/blog</link>
	<description>Just another weblog of Charry</description>
	<lastBuildDate>Fri, 23 Mar 2012 03:14:05 +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>Driving In Austin</title>
		<link>http://googlestop.com/blog/2012/03/driving-in-austin/</link>
		<comments>http://googlestop.com/blog/2012/03/driving-in-austin/#comments</comments>
		<pubDate>Fri, 23 Mar 2012 03:14:05 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/?p=873</guid>
		<description><![CDATA[比起国内，在北美开车真是一个字‘爽’，瞬间开到60-80mile，由于路上比较安静，引擎声在耳边嗡嗡的响，很有速度感。 &#160;]]></description>
			<content:encoded><![CDATA[<p><a href="http://googlestop.com/blog/wp-content/uploads/2012/03/IMG_27131.jpg" rel="lightbox"><img class="alignnone size-medium wp-image-882" title="IMG_2713" src="http://googlestop.com/blog/wp-content/uploads/2012/03/IMG_27131-300x224.jpg" alt="" width="300" height="224" /></a></p>
<p><a href="http://googlestop.com/blog/wp-content/uploads/2012/03/IMG_27151.jpg" rel="lightbox"><img class="alignnone size-medium wp-image-883" title="IMG_2715" src="http://googlestop.com/blog/wp-content/uploads/2012/03/IMG_27151-300x224.jpg" alt="" width="300" height="224" /></a></p>
<div id="attachment_884" class="wp-caption alignnone" style="width: 310px"><a href="http://googlestop.com/blog/wp-content/uploads/2012/03/IMG_27161.jpg" rel="lightbox"><img class="size-medium wp-image-884" title="IMG_2716" src="http://googlestop.com/blog/wp-content/uploads/2012/03/IMG_27161-300x224.jpg" alt="" width="300" height="224" /></a><p class="wp-caption-text">在Enterprise租的车</p></div>
<p>比起国内，在北美开车真是一个字‘爽’，瞬间开到60-80mile，由于路上比较安静，引擎声在耳边嗡嗡的响，很有速度感。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2012/03/driving-in-austin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>All things Hadoop</title>
		<link>http://googlestop.com/blog/2012/03/all-things-hadoop/</link>
		<comments>http://googlestop.com/blog/2012/03/all-things-hadoop/#comments</comments>
		<pubDate>Wed, 07 Mar 2012 05:06:06 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/?p=864</guid>
		<description><![CDATA[Recommended articles or tutorials about Hadoop: Apache Hadoop Wiki: http://wiki.apache.org/hadoop/ Yahoo Developer Network: http://developer.yahoo.com/hadoop/tutorial/index.html IBM DeveloperWorks: http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop1/ http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop2/ InfoQ: http://www.infoq.com/cn/articles/hadoop-process-develop -To be updated]]></description>
			<content:encoded><![CDATA[<p>Recommended articles or tutorials about Hadoop:</p>
<p>Apache Hadoop Wiki:<br />
<a href="http://wiki.apache.org/hadoop/">http://wiki.apache.org/hadoop/</a></p>
<p>Yahoo Developer Network:<br />
<a href="http://developer.yahoo.com/hadoop/tutorial/index.html">http://developer.yahoo.com/hadoop/tutorial/index.html</a></p>
<p>IBM DeveloperWorks:<br />
<a href="http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop1/">http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop1/</a><br />
<a href="http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop2/index.html">http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop2</a>/</p>
<p>InfoQ:<br />
<a href="http://www.infoq.com/cn/articles/hadoop-process-develop">http://www.infoq.com/cn/articles/hadoop-process-develop</a></p>
<p>-To be updated</p>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2012/03/all-things-hadoop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>新年新密码</title>
		<link>http://googlestop.com/blog/2012/01/%e6%96%b0%e5%b9%b4%e6%96%b0%e5%af%86%e7%a0%81/</link>
		<comments>http://googlestop.com/blog/2012/01/%e6%96%b0%e5%b9%b4%e6%96%b0%e5%af%86%e7%a0%81/#comments</comments>
		<pubDate>Sat, 07 Jan 2012 09:35:26 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/?p=849</guid>
		<description><![CDATA[新年到了，又到了我改密码的时间。前两周各大网站闹的沸沸扬扬的密码泄露事件，算是给每个人提了个醒。从泄露出来的密码看，很多人的密码不只是不够复杂，而是十分的简单，很容易引起安全问题。这里顺便分享一下我的一套密码规则，我已经使用了很多年，自我感觉还是相当的安全。 简单的说，我用的密码不是一个或者几个密码，而是一套算法。主要分成两大类： 一个普通密码。密码比较简单、容易记、容易输入，比如：herecomesanewch，它是Here Comes A New Character的缩写。对于这个密码，我一般很少去修改（当然现在修改了：），通常用于注册一些无关紧要的网站或者服务，账号里面没有个人信息，也不重要。比如有些论坛要求你注册了账号才可以下载文件，这个密码就可以派上用场了。 一组动态密码。它其实就是一个普通密码+一个算法。假设这个普通密码为P298*%c，算法为： 非SSO网站 如果这个网站是SNS类的，比如www.facebook.com，那么密码前面补z，z就是SNS分类的代码，这时候密码为：zP298*%c 把网站域名的第一位大写放在密码后面，这时候密码为：zP298*%cF 把网站域名的倒数第二位放在密码后面，这时候密码为：zP298*%cFo 对于条件一提到的分类，你可以自己找一个合适自己的，原则是：不要太复杂，容易分类，否则自己的都搞不清楚你要访问的网站是属于哪个分类 支持SSO的网站 如果这个网站是个支持SSO的网站，比如Google, Microsoft，它们通常有很多域名，比如(www.live.com，www.hotmail.com)都是微软的网站，密码都是共享的，这样就不方便把域名放到密码里面了，它的规则有所不同 第一位加*，表示这是个支持SSO的网站，这时候密码为：*P298*%c 最后一位加5，这个5没有任何意义，这时候密码为：*P298*%c5 最后一位放这个公司的名称的首字母大写，这里以微软为例，所以最后的密码就为：*P298*%c5M 上面的规则看起来比较复杂，弄明白了其中的道理其实很简单，也容易记忆，这样，每个网站的密码几乎都是不相同的，一个网站密码泄露了，不会殃及其他网站，除非你的密码和规则全部都被别人知道了。 除此以外还有一些辅助措施： 对于国内的网站和国外的网站，上面的算法是不同的，之所以这么做，是考虑到很多国内的网站安全意识不高，不少是保存明文密码，为了减少泄露的可能性，分开为妙。 每年更改密码，我通常在每年的前两周内使用新的算法，把所有的密码都更改一遍]]></description>
			<content:encoded><![CDATA[<p>新年到了，又到了我改密码的时间。前两周各大网站闹的沸沸扬扬的密码泄露事件，算是给每个人提了个醒。从泄露出来的密码看，很多人的密码不只是不够复杂，而是十分的简单，很容易引起安全问题。这里顺便分享一下我的一套密码规则，我已经使用了很多年，自我感觉还是相当的安全。</p>
<p>简单的说，我用的密码不是一个或者几个密码，而是一套算法。主要分成两大类：</p>
<ul>
<li>一个普通密码。密码比较简单、容易记、容易输入，比如：herecomesanewch，它是Here Comes A New Character的缩写。对于这个密码，我一般很少去修改（当然现在修改了：），<strong>通常用于注册一些无关紧要的网站或者服务，账号里面没有个人信息，也不重要</strong>。比如有些论坛要求你注册了账号才可以下载文件，这个密码就可以派上用场了。</li>
<li>一组动态密码。它其实就是一个普通密码+一个算法。假设这个普通密码为P298*%c，算法为：</li>
<ul>
<li>非SSO网站</li>
<ul>
<li>如果这个网站是SNS类的，比如www.facebook.com，那么密码前面补z，z就是SNS分类的代码，这时候密码为：<span style="color: #ff0000;">z</span>P298*%c</li>
<li>把网站域名的第一位大写放在密码后面，这时候密码为：<span style="color: #ff0000;">z</span>P298*%c<span style="color: #00ff00;">F</span></li>
<li>把网站域名的倒数第二位放在密码后面，这时候密码为：<span style="color: #ff0000;">z</span>P298*%c<span style="color: #00ff00;">F</span><span style="color: #0000ff;">o</span></li>
<li>对于条件一提到的分类，你可以自己找一个合适自己的，原则是：不要太复杂，容易分类，否则自己的都搞不清楚你要访问的网站是属于哪个分类</li>
</ul>
<li>支持SSO的网站</li>
<ul>
<li>如果这个网站是个支持SSO的网站，比如Google, Microsoft，它们通常有很多域名，比如(www.live.com，www.hotmail.com)都是微软的网站，密码都是共享的，这样就不方便把域名放到密码里面了，它的规则有所不同</li>
<li>第一位加*，表示这是个支持SSO的网站，这时候密码为：<span style="color: #ff0000;">*</span>P298*%c</li>
<li>最后一位加5，这个5没有任何意义，这时候密码为：<span style="color: #ff0000;">*</span>P298*%c<span style="color: #00ff00;">5</span></li>
<li>最后一位放这个公司的名称的首字母大写，这里以微软为例，所以最后的密码就为：<span style="color: #ff0000;">*</span>P298*%c<span style="color: #00ff00;">5</span><span><span style="color: #0000ff;">M</span></span></li>
</ul>
</ul>
</ul>
<div></div>
<div>上面的规则看起来比较复杂，弄明白了其中的道理其实很简单，也容易记忆，这样，<strong>每个网站的密码几乎都是不相同的，一个网站密码泄露了，不会殃及其他网站</strong>，除非你的密码和规则全部都被别人知道了。</div>
<p>除此以外还有一些辅助措施：</p>
<div>
<ul>
<li>对于国内的网站和国外的网站，上面的算法是不同的，之所以这么做，是考虑到很多国内的网站安全意识不高，不少是保存明文密码，为了减少泄露的可能性，分开为妙。</li>
<li><strong>每年更改密码</strong>，我通常在每年的前两周内使用新的算法，把所有的密码都更改一遍</li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2012/01/%e6%96%b0%e5%b9%b4%e6%96%b0%e5%af%86%e7%a0%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JDBC的批量更新测试</title>
		<link>http://googlestop.com/blog/2011/08/jdbc-batch-update/</link>
		<comments>http://googlestop.com/blog/2011/08/jdbc-batch-update/#comments</comments>
		<pubDate>Sun, 07 Aug 2011 03:34:10 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[Database]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/?p=800</guid>
		<description><![CDATA[上回书说道MySQL的auto-reconnect的问题，可以通过重新建立Connection的方法解决之，于是我就更新了一下该数据库封装类。这里介绍一下背景：为了使用方便，一些小型项目中，我倾向于直接使用JDBC，这样执行效率和开发效率相对而言都比较高，而实际使用中，所有的数据库操作，都被封装在一个DatabaseFactory类中（有时间我会考虑一下，整理一下Open Source It）。 在修改这个类的过程中，顺便研究了下数据批量更新的效率问题，分析结果如下。由于对于不同的数据库，效果也不尽相同，这里以MySQL和Oracle为例，并分开描述： MySQL： MySQL本身并不支持批量更新，只是驱动程序提供了这个特性，只有高版本才支持该特性，并且连接URL上必须加上 rewriteBatchedStatements=true 这样的参数，这样驱动程序会自动将多条SQL语句拼接成一条，从而提高了执行效率。 ... for (int i = 0; i &#60; sqlList.size(); i++) { stmt.addBatch(sqlList.get(i)); } stmt.executeBatch(); connection.commit(); 效率提升是必然的，原因很简单：非批量更新方式，autoCommit=true，每一条SQL语句都会自动提交，都会产生网络数据包、磁盘IO。而批量更新方式，只会产生少量的数据包，因为很多条SQL语句被打成一个数据包，一次性的通过网络传输到服务器，相应的，服务器的IO操作也少了很多，当然效率自然会提高。 就是因为这个和网路相关，所以网络环境不同，产生的提升效果也不相同，经测试，在比较快速的网络环境下，比如局域网，我的试验结果是：10万条SQL语句，在非批量情况下，使用了约36秒，而批量操作只使用了约9秒，效率提高了3倍。 如果在比较差的网络环境下，提升的效果会更明显，我使用VPN从家里连接到公司的内网，更新1万条数据，非批量方式，大概需要270秒左右，而批量方式大约9秒，提升了近30倍。效率提升的倍数和很多因素相关，比如刚才提到的网络环境，每次提交多少条SQL语句也很关键，并且MySQL表的类型也会影响这个：MyISAM类型的表的提升效率就远远的高于InnoDB类型的表。 注：上述的所有的所有测试都没有使用Prepared Statement，只是使用普通的Statement和executeBatch()，如果使用Prepared Statement，几乎没有任何效率提升，后来发现是因为我用的mysql-connector-java的版本过低(5.1.8)，替换为5.1.17后，VPN状态，效率提升50倍左右。 Oracle： 和MySQL相反，Oracle使用批量更新，如果不使用Prepared Statement，效果可能会更差，使用了Prepared Statement，我用VPN连接到公司的内网，效率提高了75倍左右。可能是因为我用的Oracle JDBC驱动对非Prepared Statement的支持不够好吧。 MSSQL: 待测试，稍后更新&#8230; 小结 数据库更新的效率提升，由很多原因决定：网络环境，服务器内存、服务器I/O、驱动版本、代码编写方式、数据库的版本、表的类型等。我们必须综合考量所有因素，才能达到理想的效果。推荐你在你实际的环境中做相应的测试，找出最优的方法，别人的优化方法，不一定完全适用于你，比如这里提到的提升倍数，每个人的试验结果肯定不一样。]]></description>
			<content:encoded><![CDATA[<p>上回书说道MySQL的auto-reconnect的问题，可以通过重新建立Connection的方法解决之，于是我就更新了一下该数据库封装类。这里介绍一下背景：为了使用方便，一些小型项目中，我倾向于直接使用JDBC，这样执行效率和开发效率相对而言都比较高，而实际使用中，所有的数据库操作，都被封装在一个DatabaseFactory类中（有时间我会考虑一下，整理一下Open Source It）。</p>
<p>在修改这个类的过程中，顺便研究了下数据批量更新的效率问题，分析结果如下。由于对于不同的数据库，效果也不尽相同，这里以MySQL和Oracle为例，并分开描述：</p>
<h3>MySQL：</h3>
<p>MySQL本身并不支持批量更新，只是驱动程序提供了这个特性，只有高版本才支持该特性，并且连接URL上必须加上</p>
<pre>rewriteBatchedStatements=true</pre>
<p>这样的参数，这样驱动程序会自动将多条SQL语句拼接成一条，从而提高了执行效率。</p>
<pre>
...
for (int i = 0; i &lt; sqlList.size(); i++) {
stmt.addBatch(sqlList.get(i));
}

stmt.executeBatch();
connection.commit();
</pre>
<p>效率提升是必然的，原因很简单：非批量更新方式，autoCommit=true，每一条SQL语句都会自动提交，都会产生网络数据包、磁盘IO。而批量更新方式，只会产生少量的数据包，因为很多条SQL语句被打成一个数据包，一次性的通过网络传输到服务器，相应的，服务器的IO操作也少了很多，当然效率自然会提高。</p>
<p>就是因为这个和网路相关，所以网络环境不同，产生的提升效果也不相同，经测试，在比较快速的网络环境下，比如局域网，我的试验结果是：10万条SQL语句，在非批量情况下，使用了约36秒，而批量操作只使用了约9秒，效率提高了3倍。</p>
<p>如果<strong>在比较差的网络环境下，提升的效果会更明显</strong>，我使用VPN从家里连接到公司的内网，更新1万条数据，非批量方式，大概需要270秒左右，而批量方式大约9秒，提升了近30倍。效率提升的倍数和很多因素相关，比如刚才提到的网络环境，每次提交多少条SQL语句也很关键，并且MySQL表的类型也会影响这个：MyISAM类型的表的提升效率就远远的高于InnoDB类型的表。</p>
<p>注：上述的所有的所有测试都没有使用Prepared Statement，只是使用普通的Statement和executeBatch()，如果使用Prepared Statement，几乎没有任何效率提升，后来发现是因为我用的mysql-connector-java的版本过低(5.1.8)，替换为5.1.17后，VPN状态，效率提升50倍左右。</p>
<h3>Oracle：</h3>
<p>和MySQL相反，Oracle使用批量更新，如果不使用Prepared Statement，效果可能会更差，使用了Prepared Statement，我用VPN连接到公司的内网，效率提高了75倍左右。可能是因为我用的Oracle JDBC驱动对非Prepared Statement的支持不够好吧。</p>
<h3>MSSQL:</h3>
<p>待测试，稍后更新&#8230;</p>
<h3>小结</h3>
<p>数据库更新的效率提升，由很多原因决定：网络环境，服务器内存、服务器I/O、驱动版本、代码编写方式、数据库的版本、表的类型等。我们必须综合考量所有因素，才能达到理想的效果。<strong>推荐你在你实际的环境中做相应的测试，找出最优的方法</strong>，别人的优化方法，不一定完全适用于你，比如这里提到的提升倍数，每个人的试验结果肯定不一样。</p>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2011/08/jdbc-batch-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL的Connection自动断开问题</title>
		<link>http://googlestop.com/blog/2011/07/mysql-auto-reconnect-issue/</link>
		<comments>http://googlestop.com/blog/2011/07/mysql-auto-reconnect-issue/#comments</comments>
		<pubDate>Thu, 28 Jul 2011 13:28:31 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[Database]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/?p=795</guid>
		<description><![CDATA[MySQL缺省配置下，会自动断开那些idle超过8小时的Connection，如果应用程序保持这个连接，8个小时(wait_timeout=28800秒)后，用JDBC，再次访问数据库，会有异常抛出，据说用autoReconnect=true可以避免这个问题，不管你信不信，反正我信了，而且好多年前，我就这么做的。 直到最近，在一个鲜有人访问的应用中发现，问题依旧，8小时候后的第一次访问，总是失败，刷新一下页面，就正常了。Google了一下，才知道MySQL不推荐使用autoReconnect=true来解决此问题，http://bugs.mysql.com/bug.php?id=5020，如下： [12 Aug 2004 18:46] Mark Matthews Note: Autoreconnect functionality will be depcreated and eventually removed in future releases. The reason this isn't working for your particular case is that the methodolgy for autoreconnect was changed to be safer after 3.0.11, and is related to autoCommit state, which will also cause the current 'in-flight' [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL缺省配置下，会自动断开那些idle超过8小时的Connection，如果应用程序保持这个连接，8个小时(wait_timeout=28800秒)后，用JDBC，再次访问数据库，会有异常抛出，据说用autoReconnect=true可以避免这个问题，不管你信不信，反正我信了，而且好多年前，我就这么做的。</p>
<p>直到最近，在一个鲜有人访问的应用中发现，问题依旧，8小时候后的第一次访问，总是失败，刷新一下页面，就正常了。Google了一下，才知道MySQL不推荐使用autoReconnect=true来解决此问题，<a href="http://bugs.mysql.com/bug.php?id=5020">http://bugs.mysql.com/bug.php?id=5020</a>，如下：</p>
<div>[12 Aug 2004 18:46] Mark Matthews</div>
<pre>Note: Autoreconnect functionality will be depcreated and eventually removed in future
releases. 

The reason this isn't working for your particular case is that the methodolgy for
autoreconnect was changed to be safer after 3.0.11, and is related to autoCommit state,
which will also cause the current 'in-flight' transaction to fail (if you attempt your
transaction again _after_ the failure, the driver will reconnect). Please see the docs
for the explanation on how to correctly use this feature in the 'Troubleshooting'
section.

In any case, there is no 100% safe way that a JDBC driver can re-connect automatically if
a TCP/IP connection dies without risking corruption of the database 'state' (even _with_
transactional semantics), which is why this feature will eventually be removed.

The JDBC spec does not specify that a connection is alive no matter what happens to the
underlying network for this very reason. 

Clients of JDBC drivers are responsible for dealing with network failures, as only the
application itself (really the developer of the application) 'knows' what the 'correct'
response to a transaction failing due to the network going down is. 'Wait_timeout'
expiring on the server is basically a 'forced' network failure by the server. You can
correct this in a non-robust way by setting 'wait_timeout' higher, however, you as a
developer should be handling SQL exceptions in your code and taking appropriate recovery
actions, not just passing them up the call stack.</pre>
<p>解决也很简单，记录最近一次的Connection访问时间，如果超过了8小时，就重新建立这个连接，经验证是可行的。另外也可以在建立Connection的同时，创建一个线程定时的去执行一个SELECT 1语句，前面的方法比较简单。</p>
<p>这里要指出的是，用Connection的isValid()方法去检测Connection是否有效是不行的，程序会死在那里（未调查原因），试图用isClosed()去判断Connection是否断开也是行不通的，因为只有明确的调用了Connection的close()方法后，你才能用isClosed()去判断，也就是说Connection在idle超过8小时候后，这个时候你如果去打印它的isClosed()的值，它还是显示false，但实际上却不能使用。</p>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2011/07/mysql-auto-reconnect-issue/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone流量偷跑探秘</title>
		<link>http://googlestop.com/blog/2011/07/iphone_data_usage/</link>
		<comments>http://googlestop.com/blog/2011/07/iphone_data_usage/#comments</comments>
		<pubDate>Sun, 03 Jul 2011 05:42:31 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/?p=785</guid>
		<description><![CDATA[换了部iPhone，用的是联通的3G卡，96的套餐，一个月才340M数据，如果要每月1G以上的流量，就得办386的套餐，有些不划算，并且我的移动卡还继续用，算起来就更不划算了。于是先用起来再说。 前3个月，联通每月额外赠送500M的流量，三个月后就恢复到正常的340M每月，所以我得在前几个月把自己的使用方式和习惯建立起来，以便达到套餐使用的最大利用率。第一件事情就是分析自己的每日数据使用量。 于是乎，安装了几个流量监控软件，比如QQ手机管家，Data Usage等。几天监控下来，发现日平均流量很大，至少有几十兆，这样一个月下来，肯定远远超过340M的上限。这些流量监控软件都无法具体看到是哪个程序耗费了流量，所以很难对症下药。我猜测大概是邮件占了绝大多数流量，我设置了2个邮箱，一个Google Apps Gmail，一个是公司的Exchange，还有一个MobleMe的Find My iPhone，都是Push的方式。Push虽然很方便，但是对于这个套餐，太让人纠结了，只能关闭了。 关闭Push后，只开一个Data Usage软件，每隔10多秒观察一下，发现还有流量产生，小的几十、几百B，大的20、30KB。这个就让人纳闷了，难怪网上很多关于iPhone流量偷跑的帖子。Google了一下，发现一个Paros的软件可以嗅探到HTTP访问（我没有去找更好的软件，比如Sniffer Pro，基于HTTP的分析就可以大概了解情况了）。用Paros设置好代理，将iPhone的Cellular Data和3G都关闭，只是使用Wifi，将代理指向Paros。结果很有意思： 需要上网的软件，使用网络无可厚非。那些看似无需网络的软件，很多也会偷偷的访问网络。举几个例子： iPhone自带的相册，如果以位置方式查看，会访问: POST http://www.google.cn/glm/mmap HTTP/1.1 &#8230; iPhone自带的Calendar，每次打开会访问: POST https://m.google.com/Microsoft-Server-ActiveSync?User=hi[at]tcharry.org&#38;DeviceId=Appl8S&#38;DeviceType=iPhone&#38;Cmd=Sync HTTP/1.1 &#8230; iPhone自带的AppStore，每次打开会访问: GET http://ax.init.itunes.apple.com/bag.xml?ix=2 HTTP/1.1 &#8230; Google Map，这个是毋庸置疑的，每次都会访问: POST http://www.google.cn/glm/mmap HTTP/1.1 &#8230; YouDao词典，每次打开访问: GET http://dict.youdao.com/dp/ad?type=pro HTTP/1.1 &#8230; iBooks:每次打开时访问： GET http://ax.init.itunes.apple.com/bag.xml?ix=2 HTTP/1.1 &#8230; 穿越小说2011，每次打开时访问: GET http://mob.adwhirl.com/getInfo.php?appid=249a80c9dfab417893156859479944c1&#38;appver=300&#38;client=1 HTTP/1.1 &#8230; 卫斯理全集，每次打开时访问: GET http://r.admob.com/ad_source.php?isu=666E7E24B1AFD0807B62E0D9DCD9550B&#38;pub_data%5Bdisplay_name%5D=%E5%8D%AB%E6%96%AF%E7%90%86%E5%85%A8%E9%9B%86&#38;ex=1&#38;audio=0&#38;f=jsonp&#38;ad_type=bar&#38;l=en&#38;pub_data%5Bidentifier%5D=com.qq.ireading-wslj&#38;s=a14d720395114b6&#38;client_sdk=1&#38;pub_data%5Bname%5D=aiBooks_glscV1.55&#38;so=p&#38;v=20101108-iSDK-5096df531ccfaf53 HTTP/1.1 &#8230; iWorks [...]]]></description>
			<content:encoded><![CDATA[<p>换了部iPhone，用的是联通的3G卡，96的套餐，一个月才340M数据，如果要每月1G以上的流量，就得办386的套餐，有些不划算，并且我的移动卡还继续用，算起来就更不划算了。于是先用起来再说。</p>
<p>前3个月，联通每月额外赠送500M的流量，三个月后就恢复到正常的340M每月，所以我得在前几个月把自己的使用方式和习惯建立起来，以便达到套餐使用的最大利用率。第一件事情就是分析自己的每日数据使用量。</p>
<p>于是乎，安装了几个流量监控软件，比如QQ手机管家，Data Usage等。几天监控下来，发现日平均流量很大，至少有几十兆，这样一个月下来，肯定远远超过340M的上限。这些流量监控软件都无法具体看到是哪个程序耗费了流量，所以很难对症下药。我猜测大概是邮件占了绝大多数流量，我设置了2个邮箱，一个Google Apps Gmail，一个是公司的Exchange，还有一个MobleMe的Find My iPhone，都是Push的方式。Push虽然很方便，但是对于这个套餐，太让人纠结了，只能关闭了。</p>
<p>关闭Push后，只开一个Data Usage软件，每隔10多秒观察一下，发现还有流量产生，小的几十、几百B，大的20、30KB。这个就让人纳闷了，难怪网上很多关于iPhone流量偷跑的帖子。Google了一下，发现一个Paros的软件可以嗅探到HTTP访问（我没有去找更好的软件，比如Sniffer Pro，基于HTTP的分析就可以大概了解情况了）。用Paros设置好代理，将iPhone的Cellular Data和3G都关闭，只是使用Wifi，将代理指向Paros。结果很有意思：</p>
<p>需要上网的软件，使用网络无可厚非。<strong>那些看似无需网络的软件，很多也会偷偷的访问网络</strong>。举几个例子：</p>
<ul>
<li>iPhone自带的相册，如果以位置方式查看，会访问: POST http://www.google.cn/glm/mmap HTTP/1.1 &#8230;</li>
<li>iPhone自带的Calendar，每次打开会访问: POST https://m.google.com/Microsoft-Server-ActiveSync?User=hi[at]tcharry.org&amp;DeviceId=Appl8S&amp;DeviceType=iPhone&amp;Cmd=Sync HTTP/1.1 &#8230;</li>
<li>iPhone自带的AppStore，每次打开会访问: GET <a href="http://ax.init.itunes.apple.com/bag.xml?ix=2">http://ax.init.itunes.apple.com/bag.xml?ix=2</a> HTTP/1.1 &#8230;</li>
<li>Google Map，这个是毋庸置疑的，每次都会访问: POST <a href="http://www.google.cn/glm/mmap%20HTTP/1.1">http://www.google.cn/glm/mmap HTTP/1.1</a> &#8230;</li>
<li>YouDao词典，每次打开访问: GET <a href="http://dict.youdao.com/dp/ad?type=pro">http://dict.youdao.com/dp/ad?type=pro</a> HTTP/1.1 &#8230;</li>
<li>iBooks:每次打开时访问： GET <a href="http://ax.init.itunes.apple.com/bag.xml?ix=2">http://ax.init.itunes.apple.com/bag.xml?ix=2</a> HTTP/1.1 &#8230;</li>
<li>穿越小说2011，每次打开时访问: GET <a href="http://mob.adwhirl.com/getInfo.php?appid=249a80c9dfab417893156859479944c1&amp;appver=300&amp;client=1">http://mob.adwhirl.com/getInfo.php?appid=249a80c9dfab417893156859479944c1&amp;appver=300&amp;client=1</a> HTTP/1.1 &#8230;</li>
<li>卫斯理全集，每次打开时访问: GET <a href="http://r.admob.com/ad_source.php?isu=666E7E24B1AFD0807B62E0D9DCD9550B&amp;pub_data%5Bdisplay_name%5D=%E5%8D%AB%E6%96%AF%E7%90%86%E5%85%A8%E9%9B%86&amp;ex=1&amp;audio=0&amp;f=jsonp&amp;ad_type=bar&amp;l=en&amp;pub_data%5Bidentifier%5D=com.qq.ireading-wslj&amp;s=a14d720395114b6&amp;client_sdk=1&amp;pub_data%5Bname%5D=aiBooks_glscV1.55&amp;so=p&amp;v=20101108-iSDK-5096df531ccfaf53">http://r.admob.com/ad_source.php?isu=666E7E24B1AFD0807B62E0D9DCD9550B&amp;pub_data%5Bdisplay_name%5D=%E5%8D%AB%E6%96%AF%E7%90%86%E5%85%A8%E9%9B%86&amp;ex=1&amp;audio=0&amp;f=jsonp&amp;ad_type=bar&amp;l=en&amp;pub_data%5Bidentifier%5D=com.qq.ireading-wslj&amp;s=a14d720395114b6&amp;client_sdk=1&amp;pub_data%5Bname%5D=aiBooks_glscV1.55&amp;so=p&amp;v=20101108-iSDK-5096df531ccfaf53</a> HTTP/1.1 &#8230;</li>
</ul>
<ul>
<li>iWorks (包括Keynote、Pages、Numbers) ，每次打开时访问: GET <a href="http://help.apple.com/config/mobileframework/com.apple.Keynote.plist">http://help.apple.com/config/mobileframework/com.apple.Keynote.plist</a> HTTP/1.1 &#8230;</li>
<li>Adobe iDeas打开时访问: GET <a href="http://ax.init.itunes.apple.com/bag.xml?ix=2">http://ax.init.itunes.apple.com/bag.xml?ix=2</a> HTTP/1.1 &#8230;</li>
<li>愤怒的小鸟，AngryBird: POST <a href="http://data.flurry.com/aap.do">http://data.flurry.com/aap.do</a> HTTP/1.1 &#8230;</li>
<li>Tom猫，Talking Tom2: POST <a href="http://i.w.inmobi.com/showad.asm">http://i.w.inmobi.com/showad.asm</a> HTTP/1.1 &#8230;</li>
<li>Line Jumper : GET <a href="http://SVRSecure-G2-aia.verisign.com/SVRSecureG2.cer">http://SVRSecure-G2-aia.verisign.com/SVRSecureG2.cer</a> HTTP/1.1 &#8230;</li>
<li>Data Usage: GET <a href="http://quotaxml.southfreo.com/prod_updates/v12_8/Data%20Usage/version.txt">http://quotaxml.southfreo.com/prod_updates/v12_8/Data%20Usage/version.txt</a> HTTP/1.1 &#8230;</li>
</ul>
<p>注：这些程序并非只访问一个地址，很多程序会访问很多地址，很多次，我只是列出了一个而已。</p>
<p>很多游戏需要连接到Apple的Game Center，即使是非网络游戏，启动的时候也要联网。让人受不了的是，那个我用来检测流量的软件Data Usage也在不停的消耗流量，它每隔一段时间会从去访问一下它的服务器上的Version.txt，估计是为了提示更新。</p>
<p>我还发现有的软件，每次打开都去访问一下新浪博客的注册页面，URL后面跟着它的邀请码，不知道这样会不会给它带来收益，没有仔细的分析，不做论断。综上所述，结论如下：</p>
<ol>
<li>iPhone自带的单机软件，也可能访问网络</li>
<li>第三方的单机软件，更是扑朔迷离，有的为了广告，有的为了了解自己软件的使用情况，有的为了别的目的</li>
<li>单机版的游戏可能会在和Game Center通信的时候消耗流量</li>
<li>有的软件，没有做好优化，访问时，发送大量的数据，比如，下图中的‘我查查’，每次请求一个非常长的请求，浪费了用户的流量。</li>
<li>最后，如果你的套餐流量有限，不用时就关闭Cellular Data，否则联通就笑开了花。</li>
</ol>
<p>&nbsp;</p>
<p>下图为‘我查查’的请求URL之一：</p>
<p lang="zh-CN"><a href="http://googlestop.com/blog/wp-content/uploads/2011/07/wocha.png" rel="lightbox"><img class="alignnone size-medium wp-image-786" title="wocha" src="http://googlestop.com/blog/wp-content/uploads/2011/07/wocha-300x64.png" alt="" width="300" height="64" /></a></p>
<p lang="zh-CN">上面的分析，不一定全面和准确，请自行验证，并且这里只有HTTP的嗅探，如果程序用别的方式访问网络（比如QQ），还是会消耗你的流量。但是管中窥豹，其他协议也不用具体分析了，分析了也不好解决。总之一句话：在天朝用3G，就得认这个蛋疼的命，如果资费便宜了，谁会在乎这点流量。</p>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2011/07/iphone_data_usage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex项目的Session验证</title>
		<link>http://googlestop.com/blog/2011/06/flex%e9%a1%b9%e7%9b%ae%e7%9a%84session%e9%aa%8c%e8%af%81/</link>
		<comments>http://googlestop.com/blog/2011/06/flex%e9%a1%b9%e7%9b%ae%e7%9a%84session%e9%aa%8c%e8%af%81/#comments</comments>
		<pubDate>Tue, 14 Jun 2011 15:11:36 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/?p=775</guid>
		<description><![CDATA[[暂定用此方法] 一新项目，考虑到Flex做UI太方便了，准备用Flex做，遇到一个用户鉴权的问题。Flex本身是属于客户端的东西，无法获得Session，所以不能直接得知当前用户是否Session过期。 这里提到的解决方法是：写一个Filter，然后在doFilter()中，查看Session是否存在，如果不存在，就转向登录页面，比如SignIn.html。 看似简单，不过今天走了些弯路，我原先的web.xml配置如下： &#60;filter&#62; &#60;filter-name&#62;authFilter&#60;/filter-name&#62; &#60;filter-class&#62;org.charry.lib.rbac.filter.AuthFilter&#60;/filter-class&#62; &#60;/filter&#62; &#60;filter-mapping&#62; &#60;filter-name&#62;authFilter&#60;/filter-name&#62; &#60;url-pattern&#62;/*&#60;/url-pattern&#62; &#60;/filter-mapping&#62; Filter中转向到SignIn.html，这样有个问题：上面的配置会让所有的资源访问都会被转向SignIn.html，甚至对Sigin.html本身的访问都会被转向SignIn.html，造成无限循环，浏览器会指出该错误。所以我在doFilter()里面判断当前访问的资源的URI是否包含SignIn.html，如果包含，就不做redirect。不过，这样还是有问题，SignIn.html页面里面会引用一些其他的资源，比如foo.js, bar.swf, foobar.gif等，对这些资源的访问也会被redirect。所以我尝试将Filter配置如下，也就是说只过滤html页面： &#60;filter&#62; &#60;filter-name&#62;authFilter&#60;/filter-name&#62; &#60;filter-class&#62;org.charry.lib.rbac.filter.AuthFilter&#60;/filter-class&#62; &#60;/filter&#62; &#60;filter-mapping&#62; &#60;filter-name&#62;authFilter&#60;/filter-name&#62; &#60;url-pattern&#62;*.html&#60;/url-pattern&#62; &#60;/filter-mapping&#62; 这样还是会有问题：因为SWF文件可以访问，很多Flex项目的SWF文件是可以直接使用的，所以，还存在用户鉴权的问题。由于该项目用的是BlazeDS，我只要堵住所有的DataService的Servlet就可以了，所以我最后用了如下的配置： &#60;filter&#62; &#60;filter-name&#62;authFilter&#60;/filter-name&#62; &#60;filter-class&#62;org.charry.lib.rbac.filter.AuthFilter&#60;/filter-class&#62; &#60;/filter&#62; &#60;filter-mapping&#62; &#60;filter-name&#62;authFilter&#60;/filter-name&#62; &#60;url-pattern&#62;/messagebroker/*&#60;/url-pattern&#62; &#60;url-pattern&#62;*.html&#60;/url-pattern&#62; &#60;/filter-mapping&#62; 第一个模式匹配的目的是：让所有的AMF调用全部用过滤器检查一下权限，第二条的作用是所有的.html也要经过过滤器检查（此条不加，会出现刷新未登录页面，不跳转的问题）。新的问题又来了，我原先的Session管理是用BlazeDS调用的，现在自己把路堵死了，所以只能再写个单独的Servlet用来实现用户登录，完整的Filter和Servlet配置如下： &#60;filter&#62; &#60;filter-name&#62;authFilter&#60;/filter-name&#62; &#60;filter-class&#62;org.charry.lib.rbac.filter.AuthFilter&#60;/filter-class&#62; &#60;/filter&#62; &#60;filter-mapping&#62; &#60;filter-name&#62;authFilter&#60;/filter-name&#62; &#60;url-pattern&#62;/messagebroker/*&#60;/url-pattern&#62; &#60;url-pattern&#62;*.html&#60;/url-pattern&#62; &#60;/filter-mapping&#62; &#60;servlet&#62; &#60;servlet-name&#62;loginServlet&#60;/servlet-name&#62; &#60;servlet-class&#62;org.charry.lib.rbac.servlet.ServletLogin&#60;/servlet-class&#62; &#60;/servlet&#62; &#60;servlet-mapping&#62; &#60;servlet-name&#62;loginServlet&#60;/servlet-name&#62; &#60;url-pattern&#62;/loginServlet&#60;/url-pattern&#62; &#60;/servlet-mapping&#62; 经验证，方法可行，但总觉得比较麻烦，继续留意是否有更为简便的方法。]]></description>
			<content:encoded><![CDATA[<p>[暂定用此方法]<br />
一新项目，考虑到Flex做UI太方便了，准备用Flex做，遇到一个用户鉴权的问题。Flex本身是属于客户端的东西，无法获得Session，所以不能直接得知当前用户是否Session过期。</p>
<p>这里提到的解决方法是：写一个Filter，然后在doFilter()中，查看Session是否存在，如果不存在，就转向登录页面，比如SignIn.html。</p>
<p>看似简单，不过今天走了些弯路，我原先的web.xml配置如下：</p>
<pre>&lt;filter&gt;
    &lt;filter-name&gt;authFilter&lt;/filter-name&gt;
    &lt;filter-class&gt;org.charry.lib.rbac.filter.AuthFilter&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
    &lt;filter-name&gt;authFilter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;</pre>
<p>Filter中转向到SignIn.html，这样有个问题：上面的配置会让所有的资源访问都会被转向SignIn.html，甚至对Sigin.html本身的访问都会被转向SignIn.html，造成无限循环，浏览器会指出该错误。所以我在doFilter()里面判断当前访问的资源的URI是否包含SignIn.html，如果包含，就不做redirect。不过，这样还是有问题，SignIn.html页面里面会引用一些其他的资源，比如foo.js, bar.swf, foobar.gif等，对这些资源的访问也会被redirect。所以我尝试将Filter配置如下，也就是说只过滤html页面：</p>
<pre>&lt;filter&gt;
    &lt;filter-name&gt;authFilter&lt;/filter-name&gt;
    &lt;filter-class&gt;org.charry.lib.rbac.filter.AuthFilter&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
    &lt;filter-name&gt;authFilter&lt;/filter-name&gt;
    &lt;url-pattern&gt;*.html&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;</pre>
<p>这样还是会有问题：因为SWF文件可以访问，很多Flex项目的SWF文件是可以直接使用的，所以，还存在用户鉴权的问题。由于该项目用的是BlazeDS，我只要堵住所有的DataService的Servlet就可以了，所以我最后用了如下的配置：</p>
<pre>&lt;filter&gt;
    &lt;filter-name&gt;authFilter&lt;/filter-name&gt;
    &lt;filter-class&gt;org.charry.lib.rbac.filter.AuthFilter&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
    &lt;filter-name&gt;authFilter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/messagebroker/*&lt;/url-pattern&gt;
    &lt;url-pattern&gt;*.html&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;</pre>
<p>第一个模式匹配的目的是：让所有的AMF调用全部用过滤器检查一下权限，第二条的作用是所有的.html也要经过过滤器检查（此条不加，会出现刷新未登录页面，不跳转的问题）。新的问题又来了，我原先的Session管理是用BlazeDS调用的，现在自己把路堵死了，所以只能再写个单独的Servlet用来实现用户登录，完整的Filter和Servlet配置如下：</p>
<pre>&lt;filter&gt;
    &lt;filter-name&gt;authFilter&lt;/filter-name&gt;
    &lt;filter-class&gt;org.charry.lib.rbac.filter.AuthFilter&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
    &lt;filter-name&gt;authFilter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/messagebroker/*&lt;/url-pattern&gt;
    &lt;url-pattern&gt;*.html&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
&lt;servlet&gt;
    &lt;servlet-name&gt;loginServlet&lt;/servlet-name&gt;
    &lt;servlet-class&gt;org.charry.lib.rbac.servlet.ServletLogin&lt;/servlet-class&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
    &lt;servlet-name&gt;loginServlet&lt;/servlet-name&gt;
    &lt;url-pattern&gt;/loginServlet&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;</pre>
<pre>经验证，方法可行，但总觉得比较麻烦，继续留意是否有更为简便的方法。</pre>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2011/06/flex%e9%a1%b9%e7%9b%ae%e7%9a%84session%e9%aa%8c%e8%af%81/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>关于培训</title>
		<link>http://googlestop.com/blog/2011/05/%e5%85%b3%e4%ba%8e%e5%9f%b9%e8%ae%ad/</link>
		<comments>http://googlestop.com/blog/2011/05/%e5%85%b3%e4%ba%8e%e5%9f%b9%e8%ae%ad/#comments</comments>
		<pubDate>Sat, 28 May 2011 07:45:22 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/?p=769</guid>
		<description><![CDATA[又是在职场节目中看到的，很多人把在职培训看的很重要，觉得将来可能从中能学到很多东西。对此，我持保留意见，在我看来，在职培训是个有也罢，无也罢的东西。原因有三： 其一：时间短，培训时间通常只有几天或几周不等，有的会长些，这么短的时间不能系统化的学习 其二：培训师水平不济。关于培训师，一种是企业从外面聘请的专人，一类是内训师，通常内训师的存在是为了节约成本。我们姑且认为外面的和尚会念经，而内训师很多都是兼职，难免有赶鸭子上架之嫌，多数情况对培训项目无法完美的掌控（内容的熟练程度、学习气氛的调动、进度安排等） 其三：培训的内容多数流于表面和理论，很多都是多数人都知道的东西，只是在培训期间显得有些系统化 我所推荐的培训方式是： 一：自学，具体的途径有很多种，阅读相关书籍，在线资料，论坛交流等。优点是，你可以按照自己的需要，灵活的调配时间，以及你要学习的深度和范围；缺点是，有了问题，没有培训老师给你解惑，但是网络上热心人士如此之多，这个不是个大问题。 二：On Job Training，中文不好翻译，叫‘在职培训’？似乎不对，大概是实战训练的意思，这个会给我们带来第一手的信息。对于知识，听来的，和自己切身感受到的是完全不同的，就犹如你买个地球仪，不能当做环游世界一样。对于此法，如果有些企业做job rotation（工作轮换），比较合适。]]></description>
			<content:encoded><![CDATA[<p>又是在职场节目中看到的，很多人把在职培训看的很重要，觉得将来可能从中能学到很多东西。对此，我持保留意见，在我看来，在职培训是个有也罢，无也罢的东西。原因有三：<br />
其一：时间短，培训时间通常只有几天或几周不等，有的会长些，这么短的时间不能系统化的学习<br />
其二：培训师水平不济。关于培训师，一种是企业从外面聘请的专人，一类是内训师，通常内训师的存在是为了节约成本。我们姑且认为外面的和尚会念经，而内训师很多都是兼职，难免有赶鸭子上架之嫌，多数情况对培训项目无法完美的掌控（内容的熟练程度、学习气氛的调动、进度安排等）<br />
其三：培训的内容多数流于表面和理论，很多都是多数人都知道的东西，只是在培训期间显得有些系统化</p>
<p>我所推荐的培训方式是：<br />
一：自学，具体的途径有很多种，阅读相关书籍，在线资料，论坛交流等。优点是，你可以按照自己的需要，灵活的调配时间，以及你要学习的深度和范围；缺点是，有了问题，没有培训老师给你解惑，但是网络上热心人士如此之多，这个不是个大问题。<br />
二：On Job Training，中文不好翻译，叫‘在职培训’？似乎不对，大概是实战训练的意思，这个会给我们带来第一手的信息。对于知识，听来的，和自己切身感受到的是完全不同的，就犹如你买个地球仪，不能当做环游世界一样。对于此法，如果有些企业做job rotation（工作轮换），比较合适。</p>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2011/05/%e5%85%b3%e4%ba%8e%e5%9f%b9%e8%ae%ad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trip to Canada</title>
		<link>http://googlestop.com/blog/2011/05/trip-to-canada/</link>
		<comments>http://googlestop.com/blog/2011/05/trip-to-canada/#comments</comments>
		<pubDate>Thu, 12 May 2011 02:47:23 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/?p=752</guid>
		<description><![CDATA[第一次到加拿大，第一印象是：这里天黑的真晚，出了Toronto机场，都已经晚上9点左右，天还是亮的。第二印象是：这里的天空真的很蓝，很清澈，可以看的很远，所见之处都是色彩很鲜艳。我和同事说：The sky is very clear in Canada，他回到：The sky is clear everywhere, except for China。虽然是开玩笑，但是却大约是事实。 下面是透过玻璃拍的，还是蛮清楚的： Niagara Falls所在的小镇和 Lake Ontario]]></description>
			<content:encoded><![CDATA[<p>第一次到加拿大，第一印象是：这里天黑的真晚，出了Toronto机场，都已经晚上9点左右，天还是亮的。第二印象是：这里的天空真的很蓝，很清澈，可以看的很远，所见之处都是色彩很鲜艳。我和同事说：The  sky is very clear in Canada，他回到：The sky is clear everywhere, except for  China。虽然是开玩笑，但是却大约是事实。</p>
<p>下面是透过玻璃拍的，还是蛮清楚的：</p>
<p><a href="http://googlestop.com/blog/wp-content/uploads/2011/05/IMG_2707.jpg" rel="lightbox"><img class="alignnone size-large wp-image-753" title="IMG_2707" src="http://googlestop.com/blog/wp-content/uploads/2011/05/IMG_2707-1024x768.jpg" alt="" width="614" height="461" /></a></p>
<p><a href="http://googlestop.com/blog/wp-content/uploads/2011/05/IMG_2711.jpg" rel="lightbox"><img class="alignnone size-large wp-image-754" title="IMG_2711" src="http://googlestop.com/blog/wp-content/uploads/2011/05/IMG_2711-1024x768.jpg" alt="" width="614" height="461" /></a></p>
<p>Niagara Falls所在的小镇和 Lake Ontario</p>
<p><a href="http://googlestop.com/blog/wp-content/uploads/2011/05/IMG_2737.jpg" rel="lightbox"><img class="alignnone size-medium wp-image-760" title="IMG_2737" src="http://googlestop.com/blog/wp-content/uploads/2011/05/IMG_2737-300x225.jpg" alt="" width="300" height="225" /></a><a href="http://googlestop.com/blog/wp-content/uploads/2011/05/IMG_2805.jpg" rel="lightbox"><img class="alignnone size-medium wp-image-761" title="IMG_2805" src="http://googlestop.com/blog/wp-content/uploads/2011/05/IMG_2805-300x225.jpg" alt="" width="300" height="225" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2011/05/trip-to-canada/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>奇怪的WinSCP登录问题</title>
		<link>http://googlestop.com/blog/2011/04/%e5%a5%87%e6%80%aa%e7%9a%84winscp%e7%99%bb%e5%bd%95%e9%97%ae%e9%a2%98/</link>
		<comments>http://googlestop.com/blog/2011/04/%e5%a5%87%e6%80%aa%e7%9a%84winscp%e7%99%bb%e5%bd%95%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Sat, 23 Apr 2011 13:30:34 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/2011/04/%e5%a5%87%e6%80%aa%e7%9a%84winscp%e7%99%bb%e5%bd%95%e9%97%ae%e9%a2%98/</guid>
		<description><![CDATA[Linux下的/etc/motd的作用是全局的消息提示，我想为每个账户设置自己的motd，就在$HOME/.bashrc的最后加了行： ~/.msg 而.msg的内容如下： #!/bin/sh . /mnt/autofs/dvlp/libs/shell/color-def.sh def_colors echo Welcome to&#34;$c_red&#34; viper project&#34;$c_normal&#34; home directory: echo 1. &#34;$c_blue&#34;vupload-install&#34;$c_normal&#34; &#8211; upload install.bin to OSAT home dir echo 2. &#34;$c_blue&#34;vinstall&#34;$c_normal&#34; &#8211; install viper to OSAT echo 3. &#34;$c_blue&#34;vget&#34;$c_normal&#34; &#8211; get files from OSAT to local echo 4. &#34;$c_blue&#34;vput&#34;$c_normal&#34; &#8211; put files from local to OSAT 这时候用WinSCP登录，就会遇到一个奇怪的问题，它一直提示：The error is [...]]]></description>
			<content:encoded><![CDATA[<p>Linux下的/etc/motd的作用是全局的消息提示，我想为每个账户设置自己的motd，就在$HOME/.bashrc的最后加了行：</p>
<blockquote><p>~/.msg</p>
</blockquote>
<p>而.msg的内容如下：</p>
<blockquote><p>#!/bin/sh</p>
<p>. /mnt/autofs/dvlp/libs/shell/color-def.sh     <br />def_colors</p>
<p>echo Welcome to&quot;$c_red&quot; viper project&quot;$c_normal&quot; home directory:</p>
<p>echo 1. &quot;$c_blue&quot;vupload-install&quot;$c_normal&quot; &#8211; upload install.bin to OSAT home dir     <br />echo 2. &quot;$c_blue&quot;vinstall&quot;$c_normal&quot; &#8211; install viper to OSAT      <br />echo 3. &quot;$c_blue&quot;vget&quot;$c_normal&quot; &#8211; get files from OSAT to local      <br />echo 4. &quot;$c_blue&quot;vput&quot;$c_normal&quot; &#8211; put files from local to OSAT</p>
</blockquote>
<p>这时候用WinSCP登录，就会遇到一个奇怪的问题，它一直提示：<strong>The error is typically caused by message printed from startup…</strong>这样的错误，无法登录。Google了一下，无解。大概是因为WinSCP不支持在.bashrc里面打印出字符。</p>
<p>解决方法：将~/.msg 移至 .bash_profile 即可。</p>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2011/04/%e5%a5%87%e6%80%aa%e7%9a%84winscp%e7%99%bb%e5%bd%95%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

