<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7253982</id><updated>2025-11-17T12:41:35.491-08:00</updated><category term="life"/><category term="multi-core"/><category term="eclipse"/><category term="java"/><category term="parallel"/><category term="linux"/><category term="ubuntu"/><category term="vim"/><category term="python"/><category term="asm"/><category term="ruby"/><category term="newzealand"/><category term="performance"/><category term="emf"/><category term="git"/><category term="C++"/><category term="apple"/><category term="gmf"/><category term="openmp"/><category term="rails"/><category term="aix"/><category term="data"/><category term="mongodb"/><category term="publish"/><category term="stock"/><category term="tour"/><category term="Xcode"/><category term="appengine"/><category term="google"/><category term="iOS"/><category term="jee"/><category term="mac"/><category term="mysql"/><category term="rational"/><category term="spreadsheet"/><category term="spring"/><category term="svn"/><category term="x86"/><title type='text'>Gan, Zhi</title><subtitle type='html'>My current interests:&#xa;1. Multi-threaded programming&#xa;2. Performance tuning&#xa;3. Programming language and tools.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>173</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7253982.post-4997125282199969110</id><published>2014-05-30T16:25:00.001-07:00</published><updated>2014-05-30T16:25:43.020-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="ruby"/><title type='text'>Context Manager: One important advantage of Python</title><content type='html'>&lt;br /&gt;
In Python, context manager is a relatively new feature which can greatly simplify your program. It&#39;s pretty easy to implement the context manager with class or function. Following is a runnable example:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;pre id=&quot;vimCodeElement&quot; style=&quot;background-color: #333333; color: white; font-size: 13px; white-space: pre-wrap;&quot;&gt;&lt;span class=&quot;LineNr&quot; id=&quot;L1&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 1 &lt;/span&gt;&lt;span class=&quot;PreProc&quot; style=&quot;color: #ff80ff; font-size: 1em;&quot;&gt;from&lt;/span&gt; contextlib &lt;span class=&quot;PreProc&quot; style=&quot;color: #ff80ff; font-size: 1em;&quot;&gt;import&lt;/span&gt; contextmanager
&lt;span class=&quot;LineNr&quot; id=&quot;L2&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 2 &lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L3&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 3 &lt;/span&gt;&lt;span class=&quot;PreProc&quot; style=&quot;color: #ff80ff; font-size: 1em;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;Identifier&quot; style=&quot;color: #40ffff; font-size: 1em;&quot;&gt;contextmanager&lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L4&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 4 &lt;/span&gt;&lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;Identifier&quot; style=&quot;color: #40ffff; font-size: 1em;&quot;&gt;tblock&lt;/span&gt;():
&lt;span class=&quot;LineNr&quot; id=&quot;L5&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 5 &lt;/span&gt;    &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;yield&lt;/span&gt; &lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt;&quot;hello&quot;&lt;/span&gt;, &lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt;&quot;world&quot;&lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L6&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 6 &lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L7&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 7 &lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L8&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 8 &lt;/span&gt;&lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;Identifier&quot; style=&quot;color: #40ffff; font-size: 1em;&quot;&gt;main&lt;/span&gt;():
&lt;span class=&quot;LineNr&quot; id=&quot;L9&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 9 &lt;/span&gt;    &lt;span class=&quot;Identifier&quot; style=&quot;color: #40ffff; font-size: 1em;&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt;&#39;start method&#39;&lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L10&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;10 &lt;/span&gt;    &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;for&lt;/span&gt; i &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;Identifier&quot; style=&quot;color: #40ffff; font-size: 1em;&quot;&gt;range&lt;/span&gt;(&lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt;5&lt;/span&gt;):
&lt;span class=&quot;LineNr&quot; id=&quot;L11&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;11 &lt;/span&gt;        &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;with&lt;/span&gt; tblock() &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;as&lt;/span&gt; (a, b):
&lt;span class=&quot;LineNr&quot; id=&quot;L12&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;12 &lt;/span&gt;            &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;if&lt;/span&gt; i % &lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt;2&lt;/span&gt; == &lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt;0&lt;/span&gt;:
&lt;span class=&quot;LineNr&quot; id=&quot;L13&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;13 &lt;/span&gt;                &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;continue&lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L14&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;14 &lt;/span&gt;            &lt;span class=&quot;Identifier&quot; style=&quot;color: #40ffff; font-size: 1em;&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt;&quot;bbb &quot;&lt;/span&gt;, a, b, i
&lt;span class=&quot;LineNr&quot; id=&quot;L15&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;15 &lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L16&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;16 &lt;/span&gt;    &lt;span class=&quot;Identifier&quot; style=&quot;color: #40ffff; font-size: 1em;&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt;&#39;end of method&#39;&lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L17&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;17 &lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L18&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;18 &lt;/span&gt;main()&lt;/pre&gt;
&lt;/blockquote&gt;
In above example, we defined a context manager tblock(), which does nothing but return two strings. When &lt;b&gt;with&lt;/b&gt;&amp;nbsp;statement is executed (line 11), the tblock() will be called firstly. Code in tblock() is executed until &lt;b&gt;yield&lt;/b&gt;&amp;nbsp;statement is executed. When &lt;b&gt;yield&lt;/b&gt;&amp;nbsp;statement is executed, the code in &lt;b&gt;with&lt;/b&gt;&amp;nbsp;block will be executed. After &lt;b&gt;with &lt;/b&gt;block, the left part of tblock() will be executed as the final step.&lt;br /&gt;
&lt;br /&gt;
So you might want to ask, &quot;what&#39;s the difference between a context manager and a normal Python function?&quot;. Actually, you can find the answer from above example. Although code in &lt;b&gt;with&lt;/b&gt;&amp;nbsp;block is invoked by tblock(), its execution flow is tightly related to the caller of &lt;b&gt;with&lt;/b&gt;&amp;nbsp;block. That means:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;return&lt;/b&gt;&amp;nbsp;statement in &lt;b&gt;with&lt;/b&gt;&amp;nbsp;block will return from wrapping function ( main () defined at line 8).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;continue &lt;/b&gt;statement will jump to next iteration of &lt;b&gt;for&lt;/b&gt; loop defined at line 10.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
The result code can be much more natural, intuitive and less disruptive. One recent real world usage of context manager in my project is to provide a common exception handler for external API calls. Pseudo code looks like:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;pre id=&quot;vimCodeElement&quot; style=&quot;background-color: #333333; color: white; font-size: 13px; white-space: pre-wrap;&quot;&gt;&lt;span class=&quot;LineNr&quot; id=&quot;L1&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 1 &lt;/span&gt;&lt;span class=&quot;PreProc&quot; style=&quot;color: #ff80ff; font-size: 1em;&quot;&gt;from&lt;/span&gt; contextlib &lt;span class=&quot;PreProc&quot; style=&quot;color: #ff80ff; font-size: 1em;&quot;&gt;import&lt;/span&gt; contextmanager
&lt;span class=&quot;LineNr&quot; id=&quot;L2&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 2 &lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L3&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 3 &lt;/span&gt;&lt;span class=&quot;PreProc&quot; style=&quot;color: #ff80ff; font-size: 1em;&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;Identifier&quot; style=&quot;color: #40ffff; font-size: 1em;&quot;&gt;contextmanager&lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L4&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 4 &lt;/span&gt;&lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;Identifier&quot; style=&quot;color: #40ffff; font-size: 1em;&quot;&gt;api_guard&lt;/span&gt;():
&lt;span class=&quot;LineNr&quot; id=&quot;L5&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 5 &lt;/span&gt;    &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;try&lt;/span&gt;:
&lt;span class=&quot;LineNr&quot; id=&quot;L6&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 6 &lt;/span&gt;        &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;yield&lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L7&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 7 &lt;/span&gt;    &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;except&lt;/span&gt; TransientError &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;as&lt;/span&gt; e:
&lt;span class=&quot;LineNr&quot; id=&quot;L8&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 8 &lt;/span&gt;        logging.warning(e)
&lt;span class=&quot;LineNr&quot; id=&quot;L9&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 9 &lt;/span&gt;        &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;raise&lt;/span&gt; Retriable(&lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt;&#39;can retry&#39;&lt;/span&gt;)
&lt;span class=&quot;LineNr&quot; id=&quot;L10&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;10 &lt;/span&gt;    &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;except&lt;/span&gt;:
&lt;span class=&quot;LineNr&quot; id=&quot;L11&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;11 &lt;/span&gt;        &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;raise&lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L12&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;12 &lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L13&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;13 &lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L14&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;14 &lt;/span&gt;&lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;Identifier&quot; style=&quot;color: #40ffff; font-size: 1em;&quot;&gt;execute&lt;/span&gt;(task):
&lt;span class=&quot;LineNr&quot; id=&quot;L15&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;15 &lt;/span&gt;    &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;with&lt;/span&gt; api_guard();
&lt;span class=&quot;LineNr&quot; id=&quot;L16&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;16 &lt;/span&gt;        call_dropbox_api(task)
&lt;span class=&quot;LineNr&quot; id=&quot;L17&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;17 &lt;/span&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
The context manager provides similar abstraction as Ruby block, which is pervasively used in many ruby applications. Arguably, the syntax of Ruby block is a little bit more intuitive. Following is a simple sample of definition and usage of Ruby block:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;pre id=&quot;vimCodeElement&quot; style=&quot;background-color: #333333; color: white; font-size: 13px; white-space: pre-wrap;&quot;&gt;&lt;span class=&quot;LineNr&quot; id=&quot;L1&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 1 &lt;/span&gt;&lt;span class=&quot;PreProc&quot; style=&quot;color: #ff80ff; font-size: 1em;&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;Identifier&quot; style=&quot;color: #40ffff; font-size: 1em;&quot;&gt;exception_handler&lt;/span&gt;(&amp;amp;block)
&lt;span class=&quot;LineNr&quot; id=&quot;L2&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 2 &lt;/span&gt;    &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;begin&lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L3&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 3 &lt;/span&gt;        block.call
&lt;span class=&quot;LineNr&quot; id=&quot;L4&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 4 &lt;/span&gt;    &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;rescue&lt;/span&gt; &lt;span class=&quot;Type&quot; style=&quot;color: #60ff60; font-size: 1em; font-weight: bold;&quot;&gt;ZeroDivisionError&lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L5&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 5 &lt;/span&gt;        puts &lt;span class=&quot;Special&quot; style=&quot;background-color: #0d0d0d; color: orange; font-size: 1em; padding-bottom: 1px;&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt;I got ZeroDivisionError and I swallow it&lt;/span&gt;&lt;span class=&quot;Special&quot; style=&quot;background-color: #0d0d0d; color: orange; font-size: 1em; padding-bottom: 1px;&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L6&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 6 &lt;/span&gt;    &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L7&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 7 &lt;/span&gt;&lt;span class=&quot;PreProc&quot; style=&quot;color: #ff80ff; font-size: 1em;&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L8&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 8 &lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L9&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt; 9 &lt;/span&gt;&lt;span class=&quot;PreProc&quot; style=&quot;color: #ff80ff; font-size: 1em;&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;Identifier&quot; style=&quot;color: #40ffff; font-size: 1em;&quot;&gt;main&lt;/span&gt;()
&lt;span class=&quot;LineNr&quot; id=&quot;L10&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;10 &lt;/span&gt;    puts &lt;span class=&quot;Special&quot; style=&quot;background-color: #0d0d0d; color: orange; font-size: 1em; padding-bottom: 1px;&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt;Begin of program&lt;/span&gt;&lt;span class=&quot;Special&quot; style=&quot;background-color: #0d0d0d; color: orange; font-size: 1em; padding-bottom: 1px;&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L11&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;11 &lt;/span&gt;    exception_handler{
&lt;span class=&quot;LineNr&quot; id=&quot;L12&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;12 &lt;/span&gt;        &lt;span class=&quot;Statement&quot; style=&quot;color: #ffff60; font-size: 1em; font-weight: bold;&quot;&gt;return&lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L13&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;13 &lt;/span&gt;    }
&lt;span class=&quot;LineNr&quot; id=&quot;L14&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;14 &lt;/span&gt;    puts &lt;span class=&quot;Special&quot; style=&quot;background-color: #0d0d0d; color: orange; font-size: 1em; padding-bottom: 1px;&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt;End of program&lt;/span&gt;&lt;span class=&quot;Special&quot; style=&quot;background-color: #0d0d0d; color: orange; font-size: 1em; padding-bottom: 1px;&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L15&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;15 &lt;/span&gt;&lt;span class=&quot;PreProc&quot; style=&quot;color: #ff80ff; font-size: 1em;&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L16&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;16 &lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L17&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;17 &lt;/span&gt;main()&lt;/pre&gt;
&lt;/blockquote&gt;
Both Python context manager and Ruby block can be used to greatly simplify program. Another simple yet powerful example is the &#39;each&#39; function of Ruby array:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;pre id=&quot;vimCodeElement&quot; style=&quot;background-color: #333333; color: white; font-size: 13px; white-space: pre-wrap;&quot;&gt;&lt;span class=&quot;LineNr&quot; id=&quot;L1&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;1 &lt;/span&gt;arr = [&lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt;2&lt;/span&gt;, &lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt;3&lt;/span&gt;, &lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt;4&lt;/span&gt;, &lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt;5&lt;/span&gt;]
&lt;span class=&quot;LineNr&quot; id=&quot;L2&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;2 &lt;/span&gt;arr.each { |&lt;span class=&quot;Identifier&quot; style=&quot;color: #40ffff; font-size: 1em;&quot;&gt;a&lt;/span&gt;|
&lt;span class=&quot;LineNr&quot; id=&quot;L3&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;3 &lt;/span&gt;    print a -= &lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt;10&lt;/span&gt;, &lt;span class=&quot;Special&quot; style=&quot;background-color: #0d0d0d; color: orange; font-size: 1em; padding-bottom: 1px;&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;Constant&quot; style=&quot;background-color: #0d0d0d; color: #ffa0a0; font-size: 1em; padding-bottom: 1px;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;Special&quot; style=&quot;background-color: #0d0d0d; color: orange; font-size: 1em; padding-bottom: 1px;&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;LineNr&quot; id=&quot;L4&quot; style=&quot;color: yellow; font-size: 1em;&quot;&gt;4 &lt;/span&gt;}&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/4997125282199969110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/4997125282199969110' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/4997125282199969110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/4997125282199969110'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2014/05/context-manager-one-important-advantage.html' title='Context Manager: One important advantage of Python'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-2384142039936728467</id><published>2014-01-19T17:15:00.000-08:00</published><updated>2014-01-19T17:15:23.487-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="appengine"/><category scheme="http://www.blogger.com/atom/ns#" term="google"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="spreadsheet"/><title type='text'>Creating Google SpreadSheet and populating data with Python</title><content type='html'>This task can be completed in two steps. First step, we use Google Drive API to create the spreadsheet. Second step, we use Google Spreadsheet API to modify the spreadsheet. Here is the code:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Step 1:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; oauthToken = gdata.gauth.TwoLeggedOAuthHmacToken( consumer_key.encode(&#39;ascii&#39;), consumer_secret.encode(&#39;ascii&#39;), userid.encode(&#39;ascii&#39;) )&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; docsclient = gdata.docs.client.DocsClient(source=&quot;Arbitrary string&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; docsclient.auth_token = oauthToken&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; docsclient.ssl = True&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; docclient = auth.getDocsClient(domain, owner&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Step 2:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;def getSpreadsheetService(domain, userid, prefs=None):&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; consumer_key = &#39;XXXXXXXX&#39;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; consumer_secret = &#39;XXXXXXX&#39;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; spservice = gdata.spreadsheet.service.SpreadsheetsService(source=&quot;Arbitrary string&quot;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; spservice.SetOAuthInputParameters(gdata.auth.OAuthSignatureMethod.HMAC_SHA1, consumer_key.encode(&quot;ascii&quot;),&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; consumer_secret.encode(&quot;ascii&quot;), two_legged_oauth=True, requestor_id=userid)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; return spservice&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;client = auth.getSpreadsheetService(domain, owner)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;worksheet_key = &#39;od6&#39;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;headers = [&quot;timestamp&quot;, &quot;row&quot;, &quot;email&quot;, &quot;type&quot;, &quot;context&quot;, &quot;message&quot;]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;for i, header in enumerate(headers):&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; client.UpdateCell(row=1, col=i+1, inputValue=header, key=spreadsheet_key, wksht_id=worksheet_key)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;for log in logs:&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; row = {&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;timestamp&quot;: log.created_at.isoformat(),&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;row&quot;: log.rowNum, &quot;Email&quot;: log.email,&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;type&quot;: log.type,&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;context&quot;: log.context,&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;message&quot;: log.message&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; client.InsertRow(row, spreadsheet_key, worksheet_key)&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/2384142039936728467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/2384142039936728467' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/2384142039936728467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/2384142039936728467'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2014/01/creating-google-spreadsheet-and.html' title='Creating Google SpreadSheet and populating data with Python'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-8743085657162516759</id><published>2012-11-17T23:40:00.000-08:00</published><updated>2014-05-30T16:27:43.588-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="data"/><category scheme="http://www.blogger.com/atom/ns#" term="mongodb"/><category scheme="http://www.blogger.com/atom/ns#" term="mysql"/><title type='text'>Migrate data from mysql to mongodb (1)</title><content type='html'>It looks as difficult as moving mountains when I start to move some of my data from MySQL to MongoDB. &amp;nbsp;It&#39;s even more difficult as I&#39;m dealing with an application used by client everyday. And it&#39;s absolutely unacceptable to break the SLA just for some mysterious data migration work that business people never care.&lt;br /&gt;
&lt;br /&gt;
Secondly, I&#39;m not 100% sure about the quality of the new code. Some of our old DB queries took weeks to become correct, fast and robust. I don&#39;t think we can build Rome on MongoDB in one day. Obviously, we need a relatively long period of time to make our new data access layer matured enough. And test team should be an important part of this transition.&lt;br /&gt;
&lt;br /&gt;
Even simple things become complex if quality matters. In order to make sure this is a smooth and painless transition, we split a simple task into a not so simple sequence:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Modify our data access layer to write to MongoDB as well as MySQL&lt;/li&gt;
&lt;li&gt;Create script to migrate existing data from MySQL to MongoDB. Python is our choice but any modern script language should work too.&lt;/li&gt;
&lt;li&gt;Gradually modify 100+ queries so that they query from MongoDB instead of MySQL. As data are stored in both data store, all existing MySQL queries work as before, thus we don&#39;t need to change all queries in one day.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;After all queries are moved from MySQL to MongoDB, drop MySQL tables and completely switch to MongoDB.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/8743085657162516759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/8743085657162516759' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/8743085657162516759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/8743085657162516759'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2012/11/migrate-data-from-mysql-to-mongodb-1.html' title='Migrate data from mysql to mongodb (1)'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-4628192633636394375</id><published>2012-11-16T20:41:00.001-08:00</published><updated>2012-11-16T20:41:34.192-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="newzealand"/><title type='text'>搬到山上了</title><content type='html'>为了应对最近家庭人口的快速增长，我们再次搬家了 &lt;br/&gt;&lt;br/&gt;&lt;div class=&quot;separator&quot;style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKmcX6mOn_HusPXPMmKyJO-duAmI-wrv2c91VuvoejMqyg4fTdI22-mm0-lJkFugVdnCN3RrTvA4K8K5sdcjDOPPk8oT49mFZriVAkkCTvED_15BOANf79jslXtFIw3YfA9SLLaA/s640/blogger-image--1742477414.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKmcX6mOn_HusPXPMmKyJO-duAmI-wrv2c91VuvoejMqyg4fTdI22-mm0-lJkFugVdnCN3RrTvA4K8K5sdcjDOPPk8oT49mFZriVAkkCTvED_15BOANf79jslXtFIw3YfA9SLLaA/s640/blogger-image--1742477414.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt; &lt;br/&gt;&lt;br/&gt;&lt;div class=&quot;separator&quot;style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6TPerNt1DNw76CD6_DY6OkJHYBSGOGautwX-7aoKQzboP9QBhtpVlqXRZdHrCJU5b5pHCvyKj5FB_ym5HY256zNK_2gfAWs_IgNXBEYhzDD3zmDmcNfD2qGVxnP6jwJ7VZzt58w/s640/blogger-image--874275926.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6TPerNt1DNw76CD6_DY6OkJHYBSGOGautwX-7aoKQzboP9QBhtpVlqXRZdHrCJU5b5pHCvyKj5FB_ym5HY256zNK_2gfAWs_IgNXBEYhzDD3zmDmcNfD2qGVxnP6jwJ7VZzt58w/s640/blogger-image--874275926.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/4628192633636394375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/4628192633636394375' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/4628192633636394375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/4628192633636394375'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2012/11/blog-post.html' title='搬到山上了'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKmcX6mOn_HusPXPMmKyJO-duAmI-wrv2c91VuvoejMqyg4fTdI22-mm0-lJkFugVdnCN3RrTvA4K8K5sdcjDOPPk8oT49mFZriVAkkCTvED_15BOANf79jslXtFIw3YfA9SLLaA/s72-c/blogger-image--1742477414.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-7791712043324588643</id><published>2012-11-16T20:34:00.000-08:00</published><updated>2012-11-16T20:43:08.063-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="data"/><category scheme="http://www.blogger.com/atom/ns#" term="mongodb"/><title type='text'>Data are created unequal in MongoDB</title><content type='html'>&lt;!--[if !mso]&gt;
&lt;style&gt;
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
&lt;/style&gt;
&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;o:OfficeDocumentSettings&gt;
  &lt;o:AllowPNG/&gt;
 &lt;/o:OfficeDocumentSettings&gt;
&lt;/xml&gt;&lt;![endif]--&gt;

&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:WordDocument&gt;
  &lt;w:View&gt;Normal&lt;/w:View&gt;
  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;
  &lt;w:TrackMoves&gt;false&lt;/w:TrackMoves&gt;
  &lt;w:TrackFormatting/&gt;
  &lt;w:PunctuationKerning/&gt;
  &lt;w:ValidateAgainstSchemas/&gt;
  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;
  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;
  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;
  &lt;w:DoNotPromoteQF/&gt;
  &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt;
  &lt;w:LidThemeAsian&gt;JA&lt;/w:LidThemeAsian&gt;
  &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;
  &lt;w:Compatibility&gt;
   &lt;w:BreakWrappedTables/&gt;
   &lt;w:SnapToGridInCell/&gt;
   &lt;w:WrapTextWithPunct/&gt;
   &lt;w:UseAsianBreakRules/&gt;
   &lt;w:DontGrowAutofit/&gt;
   &lt;w:SplitPgBreakAndParaMark/&gt;
   &lt;w:EnableOpenTypeKerning/&gt;
   &lt;w:DontFlipMirrorIndents/&gt;
   &lt;w:OverrideTableStyleHps/&gt;
   &lt;w:UseFELayout/&gt;
  &lt;/w:Compatibility&gt;
  &lt;m:mathPr&gt;
   &lt;m:mathFont m:val=&quot;Cambria Math&quot;/&gt;
   &lt;m:brkBin m:val=&quot;before&quot;/&gt;
   &lt;m:brkBinSub m:val=&quot;&amp;#45;-&quot;/&gt;
   &lt;m:smallFrac m:val=&quot;off&quot;/&gt;
   &lt;m:dispDef/&gt;
   &lt;m:lMargin m:val=&quot;0&quot;/&gt;
   &lt;m:rMargin m:val=&quot;0&quot;/&gt;
   &lt;m:defJc m:val=&quot;centerGroup&quot;/&gt;
   &lt;m:wrapIndent m:val=&quot;1440&quot;/&gt;
   &lt;m:intLim m:val=&quot;subSup&quot;/&gt;
   &lt;m:naryLim m:val=&quot;undOvr&quot;/&gt;
  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;w:LatentStyles DefLockedState=&quot;false&quot; DefUnhideWhenUsed=&quot;true&quot;
  DefSemiHidden=&quot;true&quot; DefQFormat=&quot;false&quot; DefPriority=&quot;99&quot;
  LatentStyleCount=&quot;276&quot;&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;0&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Normal&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;heading 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 7&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 8&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 9&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 7&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 8&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 9&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;35&quot; QFormat=&quot;true&quot; Name=&quot;caption&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;10&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Title&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;1&quot; Name=&quot;Default Paragraph Font&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;11&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtitle&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;22&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Strong&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;20&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Emphasis&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;59&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Table Grid&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; UnhideWhenUsed=&quot;false&quot; Name=&quot;Placeholder Text&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;1&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;No Spacing&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; UnhideWhenUsed=&quot;false&quot; Name=&quot;Revision&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;34&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;List Paragraph&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;29&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Quote&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;30&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Quote&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 1&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 2&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 3&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 4&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 5&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 6&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;19&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtle Emphasis&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;21&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Emphasis&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;31&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtle Reference&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;32&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Reference&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;33&quot; SemiHidden=&quot;false&quot;
   UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Book Title&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;37&quot; Name=&quot;Bibliography&quot;/&gt;
  &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; QFormat=&quot;true&quot; Name=&quot;TOC Heading&quot;/&gt;
 &lt;/w:LatentStyles&gt;
&lt;/xml&gt;&lt;![endif]--&gt;

&lt;!--[if gte mso 10]&gt;
&lt;style&gt;
 /* Style Definitions */
table.MsoNormalTable
 {mso-style-name:&quot;Table Normal&quot;;
 mso-tstyle-rowband-size:0;
 mso-tstyle-colband-size:0;
 mso-style-noshow:yes;
 mso-style-priority:99;
 mso-style-parent:&quot;&quot;;
 mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 mso-para-margin:0cm;
 mso-para-margin-bottom:.0001pt;
 mso-pagination:widow-orphan;
 font-size:12.0pt;
 font-family:Cambria;
 mso-ascii-font-family:Cambria;
 mso-ascii-theme-font:minor-latin;
 mso-hansi-font-family:Cambria;
 mso-hansi-theme-font:minor-latin;}
&lt;/style&gt;
&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;o:shapedefaults v:ext=&quot;edit&quot; spidmax=&quot;1027&quot;/&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;o:shapelayout v:ext=&quot;edit&quot;&gt;
  &lt;o:idmap v:ext=&quot;edit&quot; data=&quot;1&quot;/&gt;
 &lt;/o:shapelayout&gt;&lt;/xml&gt;&lt;![endif]--&gt;



&lt;!--StartFragment--&gt;

&lt;br /&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
I’m really happy that we chose MongoDB from the
very beginning of my current project. After several months of practicing, we
became very satisfied with this elegant open source software. &amp;nbsp;Now the only thing I’m feeling pity is that we
should adopt it more bravely. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
There are already overwhelming talks about it all through
the Internet. Some of its best features, such as document data model, advanced
query operations, indexing support, map/reduce, are well discussed. While all
of these features are very good and enjoyed by my team, our biggest surprise
comes from the flexibility provided by MongoDB to manage data consistency
differently under a unified framework. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Enterprise often utilizes tons of data, which is created,
collected, distributed, consumed at everywhere, every moment. These endless
types of data have many different requirements to the data management system,
while we can categorize them under the CAP theorem. CAP theorem from Brewers
states that any networked shared-data system can have at most two of three
desirable properties:&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoListParagraphCxSpFirst&quot; style=&quot;mso-list: l1 level1 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;text-indent: -18pt;&quot;&gt;Consistency (C) equivalent to having a single
up-to-date copy of the data;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;text-indent: -18pt;&quot;&gt;High availability (A) of that data, and&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;text-indent: -18pt;&quot;&gt;Tolerance to network partitions (P).&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!--[if !supportLists]--&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;
&lt;div class=&quot;MsoListParagraphCxSpMiddle&quot; style=&quot;mso-list: l1 level1 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoListParagraphCxSpLast&quot; style=&quot;mso-list: l1 level1 lfo1; text-indent: -18.0pt;&quot;&gt;
&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
This is a somewhat despairing theorem for data scientists
and practioners who always pursue perfectness. Of cause, we want our system
have all three attributes. And this theorem told us it’s impossible. It’s
really bad, right?&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Fortunately, MongoDB provides a way to save us from this
imperfect world. While large amount of data are created, collected, arranged,
integrated, and consumed, they are not equal. From the terminology of CAP
theorem, they can be categorized as:&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Drop partition tolerance. One way to do this is to put everything one machine, or in one specialized rack.&lt;/li&gt;
&lt;li&gt;Drop availability. On encountering event, affected service simply waits until data is consistent.&lt;/li&gt;
&lt;li&gt;Drop consistency. When partitions communication has problem, nodes just return its data, which might be staled.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoListParagraphCxSpFirst&quot; style=&quot;mso-list: l0 level1 lfo2; text-indent: -18.0pt;&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
It’s so good that MongoDB provided fine-grained control in
this aspect. For each read and write operation, application can specify preference
for each single operation. This is really handy cause we can access the same set
of data with different policy at different moment. Thus we can reduce
application latency further by reducing slow synchronized operations as more as
possible. &lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot;&gt;
Now a major portion of our data follows the popular
“eventually consistency” paradigm, thus access to them are very fast. Still, a
minor portion of data adopts the strong consistency paradigm. Access to these
data is slow but always up-to-date. And best of all, all the data are living
under the same roof of MongoDB peacefully.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;
&lt;!--EndFragment--&gt;</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/7791712043324588643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/7791712043324588643' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/7791712043324588643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/7791712043324588643'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2012/11/data-are-created-unequal-in-mongodb.html' title='Data are created unequal in MongoDB'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-2242224484720395609</id><published>2012-10-11T19:32:00.002-07:00</published><updated>2012-10-14T19:09:43.697-07:00</updated><title type='text'>Beautify XML and JSON in VIM</title><content type='html'>&lt;br /&gt;
map &amp;lt;f8&amp;gt;  :% !xmllint --format - &lt;cr&gt;&lt;/cr&gt;&lt;br /&gt;
map &amp;lt;f9&amp;gt;  :%!python -m json.tool&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/2242224484720395609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/2242224484720395609' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/2242224484720395609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/2242224484720395609'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2012/10/beautify-xml-and-json-in-vim.html' title='Beautify XML and JSON in VIM'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-2734923627639621693</id><published>2012-08-18T01:49:00.002-07:00</published><updated>2012-11-16T20:43:51.502-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="iOS"/><category scheme="http://www.blogger.com/atom/ns#" term="Xcode"/><title type='text'>How to highlight document comments in XCode</title><content type='html'>There are multiple solutions to add document comments to Objective C code, such as Doxygen and AppleDoc. They can generate API doc from the source code. To java programmer, it&#39;s javadoc for Objective C.&lt;br /&gt;
&lt;div&gt;
By default, the &quot;document comments&quot; and &quot;document comment keywords&quot; are not highlighted in XCode. That&#39;s not a big problem, cause we can easily enable the syntax highlight by following steps:&lt;/div&gt;
&lt;div&gt;
1. Firstly, change XCode &quot;Font &amp;amp; Color&quot; preference to use different color to display &quot;document comments&quot; and &quot;document comment keywords&quot;, as shown in blow image:&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilQuJVLO66-k7uy8mKMrYaihyphenhyphenL_YjAoNyec6-lrxyEPwsh_ljzVsJTxrAAm0co2gxFfPs1SVPIuw1l1KR9buc1IzUg1vHrsGuzsX-AwibLFabKOOIuvUdyL_VObmMsWMKc4jZsbQ/s1600/Screen+Shot+2012-08-18+at+8.34.37+PM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;237&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilQuJVLO66-k7uy8mKMrYaihyphenhyphenL_YjAoNyec6-lrxyEPwsh_ljzVsJTxrAAm0co2gxFfPs1SVPIuw1l1KR9buc1IzUg1vHrsGuzsX-AwibLFabKOOIuvUdyL_VObmMsWMKc4jZsbQ/s320/Screen+Shot+2012-08-18+at+8.34.37+PM.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
2. Secondly, modify &quot;Applications/Xcode.app/Contents/OtherFrameworks/DevToolsCore.framework/Versions/Current/Resources/Built-in languages.pblangspec&quot; and add following snippets to Objective-C configuration:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DocComment = &quot;*&quot;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DocCommentKeywords = (&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;@author&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;@param&quot;,&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ...&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; );&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
3. After above two steps, we can see the document comments and specified keywords are highlighted in XCode:&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFb1LZybIfAQ1JBg65Weif3fN-jrShse8Q7bpFX4BTAPNv5x0kszDBXpcYMN_8Pqa8xAMh8hDrm9bngbg5s8yVQaQmVoX_qbMd4NF8x051yD6xROpWcZwzpqQ3O3hgrFN3wT5wbg/s1600/xcodehighlight.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;56&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFb1LZybIfAQ1JBg65Weif3fN-jrShse8Q7bpFX4BTAPNv5x0kszDBXpcYMN_8Pqa8xAMh8hDrm9bngbg5s8yVQaQmVoX_qbMd4NF8x051yD6xROpWcZwzpqQ3O3hgrFN3wT5wbg/s320/xcodehighlight.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/2734923627639621693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/2734923627639621693' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/2734923627639621693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/2734923627639621693'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2012/08/how-to-highlight-document-comments-in.html' title='How to highlight document comments in XCode'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilQuJVLO66-k7uy8mKMrYaihyphenhyphenL_YjAoNyec6-lrxyEPwsh_ljzVsJTxrAAm0co2gxFfPs1SVPIuw1l1KR9buc1IzUg1vHrsGuzsX-AwibLFabKOOIuvUdyL_VObmMsWMKc4jZsbQ/s72-c/Screen+Shot+2012-08-18+at+8.34.37+PM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-3352711136482925010</id><published>2012-03-25T01:35:00.001-07:00</published><updated>2012-03-25T02:07:41.805-07:00</updated><title type='text'>Verify the atomic operation of MongoDB with PyMongo</title><content type='html'>The purpose of this experiment is to verify the atomic operation in MongoDB. So firstly, I created a collection which has one record like:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
{ &quot;_id&quot; : ObjectId(&quot;4f6d82...0&quot;), &quot;name&quot; : &quot;jjj&quot;, &quot;num&quot; : 0, &quot;version&quot; : 0 }&lt;/blockquote&gt;
In above record, &quot;version&quot; attribute is used to keep version of the object. And for each modification, this version number will increase by &quot;1&quot;. The existence of the &quot;version&quot; attribute is for preventing &lt;a href=&quot;http://en.wikipedia.org/wiki/ABA_problem&quot;&gt;ABA problem&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Then I created a small python script for modifying this record with the &quot;Compare And Set&quot; operation:&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/2192499.js?file=gistfile1.py&quot;&gt;&lt;/script&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;from&lt;/span&gt; pymongo &lt;span class=&quot;s1&quot;&gt;import&lt;/span&gt; Connection&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
conn = Connection()&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
db = conn.test&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
coll = db.atomicNum&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s2&quot;&gt;sum&lt;/span&gt; = &lt;span class=&quot;s3&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;for&lt;/span&gt; i &lt;span class=&quot;s1&quot;&gt;in&lt;/span&gt; range(&lt;span class=&quot;s3&quot;&gt;100000&lt;/span&gt;):&lt;/div&gt;
&lt;div class=&quot;p3&quot;&gt;
&lt;span class=&quot;s4&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;while&lt;span class=&quot;s4&quot;&gt;(&lt;/span&gt;True&lt;span class=&quot;s4&quot;&gt;):&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; atomic_num = coll.find_one()&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; version = atomic_num[&lt;span class=&quot;s5&quot;&gt;&quot;version&quot;&lt;/span&gt;]&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; num = atomic_num[&lt;span class=&quot;s5&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;&quot;&lt;/span&gt;]&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; coll.update({&lt;span class=&quot;s5&quot;&gt;&quot;name&quot;&lt;/span&gt;:&lt;span class=&quot;s5&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;jjj&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;&quot;&lt;/span&gt;, &lt;span class=&quot;s5&quot;&gt;&quot;version&quot;&lt;/span&gt;:version},{&lt;span class=&quot;s5&quot;&gt;&quot;$&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;inc&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;&quot;&lt;/span&gt;:{&lt;span class=&quot;s5&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s6&quot;&gt;num&lt;/span&gt;&lt;span class=&quot;s5&quot;&gt;&quot;&lt;/span&gt;:&lt;span class=&quot;s3&quot;&gt;1&lt;/span&gt;, &lt;span class=&quot;s5&quot;&gt;&quot;version&quot;&lt;/span&gt;:&lt;span class=&quot;s3&quot;&gt;1&lt;/span&gt;}})&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; status = db.last_status()&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;if&lt;/span&gt; status[&lt;span class=&quot;s5&quot;&gt;&quot;updatedExisting&quot;&lt;/span&gt;]:&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;break&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;else&lt;/span&gt;:&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s2&quot;&gt;sum&lt;/span&gt; = sum+&lt;span class=&quot;s3&quot;&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span class=&quot;s1&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;s5&quot;&gt;&quot;RETRY: &quot;&lt;/span&gt; + str(sum)&lt;/div&gt;
&lt;div class=&quot;p2&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;p1&quot;&gt;
&lt;span class=&quot;s1&quot;&gt;print&lt;/span&gt; coll.find_one()&lt;/div&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
I launched two instances of this python script. The script prints many lines of &quot;RETRY:&quot;, but the final result is correct:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
{u&#39;_id&#39;: ObjectId(&#39;4f6d828b0618e88800000000&#39;), u&#39;num&#39;: 200000.0, u&#39;name&#39;: u&#39;jjj&#39;, u&#39;version&#39;: 200000.0}&amp;nbsp;&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/3352711136482925010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/3352711136482925010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/3352711136482925010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/3352711136482925010'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2012/03/verify-atomic-operation-of-mongodb-with.html' title='Verify the atomic operation of MongoDB with PyMongo'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-1118466887458587177</id><published>2012-03-06T02:14:00.003-08:00</published><updated>2012-03-06T02:14:45.113-08:00</updated><title type='text'>儿子上学一个多月了</title><content type='html'>儿子在新西兰这边上学一个多月了，目前看来一切都好。虽然刚开始的时候我们很担心语言问题，不过对于我儿子来说好像不成问题。当然，他英语还有待提高，但是他在学校比较外向，相当敢说，有时候听他和隔壁的洋人小孩聊天，听得我直冒汗。&lt;br /&gt;
&lt;br /&gt;
稍微总结一下吧：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;学校教的东西比较少，主要是讲故事、阅读什么的。我们就当成英语课程在上了，呵呵&lt;/li&gt;
&lt;li&gt;早上8点上课，下午3点下课，怎么接送孩子呢？头疼&lt;/li&gt;
&lt;li&gt;气氛比较自由，小孩之间合作和沟通的机会很多。讲故事的时候，小朋友们都坐在地上听，很随意。&lt;/li&gt;
&lt;li&gt;小孩都经常光着脚上学，在学校的游乐场中象猴子一样玩耍。见过的每个小学都有很大的草地，以及利用率很高的游乐设施。&lt;/li&gt;
&lt;li&gt;儿子学数学都以为是game时间，因为上课的方式都是做游戏，玩色子什么的&lt;/li&gt;
&lt;li&gt;老师穿着很随意，美术课穿的衣服都被画的五颜六色的&lt;/li&gt;
&lt;li&gt;3年纪以上可以出去camping&lt;/li&gt;
&lt;li&gt;课间吃饭都在外面草地上吃饭，毫无组织纪律&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
总的来说，儿子还是挺喜欢这边的学校的。</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/1118466887458587177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/1118466887458587177' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/1118466887458587177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/1118466887458587177'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2012/03/blog-post.html' title='儿子上学一个多月了'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-1172014278416334682</id><published>2012-03-06T01:45:00.001-08:00</published><updated>2012-03-06T01:45:52.767-08:00</updated><title type='text'>How to use different SSH for different git repositories</title><content type='html'>In order to separate different SSH key for different git provider, we need to modify the underlying SSH config files, as shown below:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
vim ~/.ssh/config&lt;br /&gt;Host bitbucket bitbucket.org&lt;br /&gt;Hostname bitbucket.org&lt;br /&gt;IdentityFile ~/.ssh/id_bb&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/1172014278416334682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/1172014278416334682' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/1172014278416334682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/1172014278416334682'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2012/03/how-to-use-different-ssh-for-different.html' title='How to use different SSH for different git repositories'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-6156538014835775158</id><published>2011-12-30T20:11:00.000-08:00</published><updated>2011-12-30T20:11:06.147-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="mac"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><title type='text'>How to install python package to your home directory with easy_install</title><content type='html'>&lt;br /&gt;
If you are a cautious python user like me, &amp;nbsp;who is not very keen to pollute global package hierarchy, this article is for you! This is pretty easy, but it takes me sometime to figure it out. Firstly, Mac OS &lt;b&gt;&lt;i&gt;Lion&lt;/i&gt;&lt;/b&gt; already has Python 2.7 installed. And it already support locating packages inside one special directory under user&#39;s home. So we only need to create a file named .pydistutils.cfg under user&#39;s home directory and put following content into it:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;[install]&lt;br /&gt;install_lib = /Users/ganzhi/Library/Python/2.7/lib/python/site-packages&lt;br /&gt;install_scripts = ~/Application/bin&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
After that, easy_install will install packages to the location specified by &quot;&lt;i&gt;install_lib&lt;/i&gt;&quot; property. In my case, it&#39;s &quot;/Users/ganzhi/Library/Python/2.7/lib/python/site-packages&quot;. We should assign a path, which allows &quot;write&quot; operation and is a part of PATH environment environment, to &quot;&lt;i&gt;install_scripts&lt;/i&gt;&quot;property. After that, we can install python packages by following command:&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;easy_install jinja2&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #990000;&quot;&gt;easy_install PIL&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/6156538014835775158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/6156538014835775158' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/6156538014835775158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/6156538014835775158'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2011/12/how-to-install-python-package-to-your.html' title='How to install python package to your home directory with easy_install'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-7937774005939200108</id><published>2011-12-10T23:02:00.001-08:00</published><updated>2011-12-10T23:15:30.057-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="life"/><category scheme="http://www.blogger.com/atom/ns#" term="newzealand"/><title type='text'>搬到新屋子了</title><content type='html'>经过两个周末的忙碌之后，我搬到了一个新的房子里面。主要原因是为了准备儿子的入学，不得不去到一个好学校的附近。在之前的房子住了一个多月，走的时候也颇为留恋。房子住得非常舒服，首先要感谢Mike和Emily的诸多照顾。在Remuera房子里，什么都不用操心，水、电、宽带一应俱全。今天搬过来之后，一切都需要自己负责了，麻烦啊...&lt;br /&gt;
&lt;br /&gt;
说太多也没用，还是上图吧&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOX8yq2MghwRSDRyXzm_C2IoEuU3J8htv5za-ZiH8B2PnLU32KnphROszBEpVEkP0CcDdpNbtwk_JRS-hSCoHV2JJ91rHI7LgBDNHFWFezkf2w0m9iR_Su_z6-mys_mjFyptJSzg/s1600/IMG_1534.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;238&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOX8yq2MghwRSDRyXzm_C2IoEuU3J8htv5za-ZiH8B2PnLU32KnphROszBEpVEkP0CcDdpNbtwk_JRS-hSCoHV2JJ91rHI7LgBDNHFWFezkf2w0m9iR_Su_z6-mys_mjFyptJSzg/s320/IMG_1534.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
房子后面有一小片花园&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGAvenKk-2dM2mFmU0269822_N9-PTudbD2NkccPyRyMz91qgwjye0ybrEvEICoQHyhsC-FDrOc20n6vaTv2YyNlBi9KTLPuoircOfRPnfLPnvoiV_JVs69ooKp5R7SkIkGIrF5Q/s1600/IMG_1602.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;238&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGAvenKk-2dM2mFmU0269822_N9-PTudbD2NkccPyRyMz91qgwjye0ybrEvEICoQHyhsC-FDrOc20n6vaTv2YyNlBi9KTLPuoircOfRPnfLPnvoiV_JVs69ooKp5R7SkIkGIrF5Q/s320/IMG_1602.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
今天刚申请了Telecom的宽带，这个不用说太必要了，接下来是水、电和气了...&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/7937774005939200108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/7937774005939200108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/7937774005939200108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/7937774005939200108'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2011/12/blog-post_10.html' title='搬到新屋子了'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOX8yq2MghwRSDRyXzm_C2IoEuU3J8htv5za-ZiH8B2PnLU32KnphROszBEpVEkP0CcDdpNbtwk_JRS-hSCoHV2JJ91rHI7LgBDNHFWFezkf2w0m9iR_Su_z6-mys_mjFyptJSzg/s72-c/IMG_1534.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-2592447638926350094</id><published>2011-12-01T01:10:00.001-08:00</published><updated>2011-12-01T01:25:31.871-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="life"/><category scheme="http://www.blogger.com/atom/ns#" term="newzealand"/><title type='text'>新公司工作一月体会</title><content type='html'>到新公司报道已经一个月有余了，这个过程怎么说呢，痛并快乐着吧。新公司让我喜欢的有以下几点：&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;基本没有政治斗争，小公司没精力搞这些。老板大权在握，员工之间利益没有冲突，没有必要搞政治。&lt;/li&gt;
&lt;li&gt;用的工具非常顺手，都是小而精的工具。小公司怎么选择工具呢，最大的考量是员工的工作效率，其次是成本。基于互联网的服务在这方面非常有优势。基本不会出现由于工具原因造成效率降低的现象。&lt;/li&gt;
&lt;li&gt;不用加班。由于公司文化的原因，基本不会有加班。这一个月来的经验，德国人真的很敬业。&lt;/li&gt;
&lt;li&gt;对人比较尊重，人情味相对浓厚一些。&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
目前来说，还没有适应的地方也有很多：&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;语言问题，由于英语现在是第一语言，所以使用频率更高，要求也更高了。目前还是感觉障碍很多。&lt;/li&gt;
&lt;li&gt;需要了解的技术和产品很多，由于小公司人少，所以每个人需要多了解一些。这个无可厚非了，只是需要改变一下学习习惯。&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
希望能尽快度过这个过渡时期，尽早进入得心应手的时代 :)&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/2592447638926350094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/2592447638926350094' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/2592447638926350094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/2592447638926350094'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2011/12/blog-post.html' title='新公司工作一月体会'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-2025536947639476102</id><published>2011-10-28T04:17:00.000-07:00</published><updated>2011-10-28T04:17:24.979-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="life"/><category scheme="http://www.blogger.com/atom/ns#" term="newzealand"/><title type='text'>寻访Justices of Peace</title><content type='html'>&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: white; font-family: arial, sans-serif; font-size: 13px;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
Justices of Peace是我来新西兰之后才了解到的。就我粗略的理解来讲，Justices of Peace是当地有声望的一些志愿者，他们充当公证员的角色。当你需要证明你某些方面的承诺，例如支持你的直系亲属拿到新西兰的visa时，会需要Justices of Peace来签字认证。有点类似于中国的公证员。但是Justices of Peace不收取任何费用和礼物。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;wbr&gt;&lt;/wbr&gt;昨天我上Google找到了周围的几个JP的地址和联系方式，&lt;wbr&gt;&lt;/wbr&gt;不过心里一直在犹豫。一来觉得自己英文不好担心解释不清楚，&lt;wbr&gt;&lt;/wbr&gt;二来觉得冒昧打扰别人不太好。有点举棋不定，&lt;wbr&gt;&lt;/wbr&gt;是要去图书馆找那种责任在身的JP还是找在家的JP呢？&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
不过随后我想到要尽早让家人过来，所以就下定决心给人家(Mr. Gover)打电话了。在一阵令人紧张的沟通之后，&lt;wbr&gt;&lt;/wbr&gt;对方终于弄懂了我的意思，然后非常慷慨的承诺帮忙。&lt;wbr&gt;&lt;/wbr&gt;我随后确认时间，对方说你现在过来就可以。于是，我就激动的拎着书包就冲了过去。首先经历了找路一关，&lt;wbr&gt;&lt;/wbr&gt;由于我的新SIM卡这一阵不能用（可能是电话被联通锁机了），&lt;wbr&gt;&lt;/wbr&gt;所以我就只好一边找路一边前行了。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
靠着我那奇差的找路天赋，&lt;wbr&gt;&lt;/wbr&gt;最后终于在天黑之前找到了Mr. Gover的家，还好这里天黑得晚。Mr. Gover的家签名的铭牌上刻了Justices of Peace的字样。主人家对这个称号还是非常自豪的。&lt;wbr&gt;&lt;/wbr&gt;在一阵自我介绍和我表达了希望和家人尽早团聚的心情之后，&lt;wbr&gt;&lt;/wbr&gt;JP非常爽快的帮我签名了。Mr. Gover人非常好，非常和蔼。&lt;wbr&gt;&lt;/wbr&gt;在签字盖章之后，他还表示以后有事情随时找他帮忙。结束之后，Mr. Gover拿出一个本子记录我的一些信息，&lt;wbr&gt;&lt;/wbr&gt;因为新西兰移民局会找他验证这个。&lt;wbr&gt;&lt;/wbr&gt;他的本子上满满的都是找他帮忙的人的记录，相当多！&lt;wbr&gt;&lt;/wbr&gt;我想他肯定花了很多自己的空闲时间来做这个Justices of Peace。做完这个之后，我很快就和主人道别离开了，&lt;wbr&gt;&lt;/wbr&gt;因为不希望过多的占用他的休息时间。回来的路更黑了，&lt;wbr&gt;&lt;/wbr&gt;不过这时的心情已经不一样了。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
有点感慨，在一个陌生的国家，一个陌生人都能这样愿意帮助你。&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
BTW，这里有个Justices of Peace的列表：&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: #fdf6e5; color: #009933; font-family: arial, sans-serif; font-size: x-small; line-height: 15px;&quot;&gt;www.yellow.co.nz/&lt;b style=&quot;color: #009933; font-style: normal;&quot;&gt;justices&lt;/b&gt;_of_the_&lt;b style=&quot;color: #009933; font-style: normal;&quot;&gt;peace&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/2025536947639476102/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/2025536947639476102' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/2025536947639476102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/2025536947639476102'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2011/10/justices-of-peace.html' title='寻访Justices of Peace'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-6743603457489133858</id><published>2011-10-27T02:45:00.000-07:00</published><updated>2011-10-27T02:45:52.382-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="life"/><category scheme="http://www.blogger.com/atom/ns#" term="newzealand"/><title type='text'>新西兰游记 (2)</title><content type='html'>上班两天了，我上班的地方在Surrey Crescent，住的地方在Ladies Mile。开车过去非常快，只需要14分钟，不过坐公车就非常不方便了。充分体会到了新西兰公共交通的不完善，跟国内比完全不是一个数量级的！公交车半小时才有一趟，还相当的昂贵。现在每天上班都需要1个半小时。不过坐公车的人也不多，这几天我还没有见过有人站立的。更不要说北京的城铁比了。&lt;br /&gt;
&lt;br /&gt;
上了两天班，大致上什么也没干，光看文档了。周围的同事都是5～6点准时下班，真是太让人舒心了。在这里，项目经理会把时间安排得相对合理，不会把人压榨得非常厉害。嗯，不管世界怎么变，不加班才应该是常态。&lt;br /&gt;
&lt;br /&gt;
新西兰风光优美，城市整洁。据说很多人家里都有小船。这是在公车上拍到的帆船俱乐部的港口，停靠着一排排的小船。生活真够愉快的。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr5pdDTLvLcK-NhBtN4luwXA_4_fmuu-kajQa4PHO4sk8gle2RWtC5A7Zpy7d47IRQNCiuxJCtMms3wvG3P_7A-AgS_jvtBiPC6VqdOgsSNeq6NNaIjxY9uUAlKeYSsOjsr5i2pA/s1600/IMG_1102.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;239&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr5pdDTLvLcK-NhBtN4luwXA_4_fmuu-kajQa4PHO4sk8gle2RWtC5A7Zpy7d47IRQNCiuxJCtMms3wvG3P_7A-AgS_jvtBiPC6VqdOgsSNeq6NNaIjxY9uUAlKeYSsOjsr5i2pA/s320/IMG_1102.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
天空永远都是那么蓝，而且直到晚上8点多才天黑，很适合小孩放学之后玩耍：&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTU8rLVmH6XsyEMlUHiptwLzCvqegOB1XYsxng6jWAn1IbU-ljy1EGLWLJ6Yg-UYl_QJf9vtfK8ci25eMWSM-vGcEzv7PK7H3gIKtlPbw0GmijYitra4tuvT4ldZo4rlXf10hh0Q/s1600/IMG_1067.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;239&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTU8rLVmH6XsyEMlUHiptwLzCvqegOB1XYsxng6jWAn1IbU-ljy1EGLWLJ6Yg-UYl_QJf9vtfK8ci25eMWSM-vGcEzv7PK7H3gIKtlPbw0GmijYitra4tuvT4ldZo4rlXf10hh0Q/s320/IMG_1067.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
在countdown超市看到的的青岛啤酒：&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxc9fl2XYDhRtiGnk2ivLREiYMHspwaHMFfo_YC8GNVPrjUfsl-9a3_V4SPGJeiDV98_t34Rx7-zhdn4dRdcitX68rGJJva6DOpom0_VDzIKBC5UkUCN85-u053CbPDlML7FZrjw/s1600/IMG_1090.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;239&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxc9fl2XYDhRtiGnk2ivLREiYMHspwaHMFfo_YC8GNVPrjUfsl-9a3_V4SPGJeiDV98_t34Rx7-zhdn4dRdcitX68rGJJva6DOpom0_VDzIKBC5UkUCN85-u053CbPDlML7FZrjw/s320/IMG_1090.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
最大的担心，现在英语有点不够用了，希望能早点提升上来吧。</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/6743603457489133858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/6743603457489133858' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/6743603457489133858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/6743603457489133858'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2011/10/2.html' title='新西兰游记 (2)'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr5pdDTLvLcK-NhBtN4luwXA_4_fmuu-kajQa4PHO4sk8gle2RWtC5A7Zpy7d47IRQNCiuxJCtMms3wvG3P_7A-AgS_jvtBiPC6VqdOgsSNeq6NNaIjxY9uUAlKeYSsOjsr5i2pA/s72-c/IMG_1102.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-6216090110805292526</id><published>2011-10-24T13:33:00.000-07:00</published><updated>2011-10-27T02:46:40.562-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="life"/><category scheme="http://www.blogger.com/atom/ns#" term="newzealand"/><title type='text'>新西兰游记 (1)</title><content type='html'>今天是到达新西兰的第二天，对新西兰还没有什么感觉。从北京经香港转机到Auckland，一路上大概花了20个小时。其实从北京有直飞的飞机，不过不是每天都有。因为周一是这边的劳动节，所以在家里过完周六才走的。&lt;br /&gt;
&lt;div&gt;
有朋友问我怎么过来的新西兰，我这边的大致经过如下：&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;拿到Job Offer，这一步会比较难。如果没有新西兰的朋友帮忙介绍。&lt;/li&gt;
&lt;li&gt;办理工作签证，在北京的新西兰有一个专门的机构办理，在东直门附近。我办理的是Work to Resident签证，20天就拿到了。签证机构会联系给你offer的雇主来确认工作的真实性。现在IT算是新西兰的短缺机能，所以签证比较好办。&lt;/li&gt;
&lt;li&gt;买机票，单程的机票大概在5000人民币左右。&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
由于刚住下没多久，所以对Auckland还没有什么感觉。不过房东Mike和Emily两人都很好，相信应该会相处的比较愉快。&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/6216090110805292526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/6216090110805292526' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/6216090110805292526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/6216090110805292526'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2011/10/1.html' title='新西兰游记 (1)'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-7490445092802461589</id><published>2011-09-28T06:48:00.000-07:00</published><updated>2011-09-28T06:48:01.181-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jee"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><title type='text'>It&#39;s very easy to create GWT projects with Spring Roo</title><content type='html'>Spring Roo is a very cool open source tool, which can great reduce the time for forging a workable application. After executing below steps, a website can be established:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;project --topLevelPackage com.ibm.sde --projectName FeatureManagement --java 6&lt;br /&gt;
persistence setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY&lt;br /&gt;
enum type --class ~.domain.FeatureStatus&lt;br /&gt;
enum constant --name ENABLE&lt;br /&gt;
enum constant --name DISABLE&lt;br /&gt;
entity --class ~.domain.Feature --testAutomatically &lt;br /&gt;
field string --fieldName displayName --notNull&lt;br /&gt;
focus --class com.ibm.sde.domain.Feature&lt;br /&gt;
field date --fieldName created --type java.util.Date&lt;br /&gt;
field enum --fieldName status --type com.ibm.sde.domain.FeatureStatus&lt;br /&gt;
gwt setup&lt;br /&gt;
logging setup --level INFO&lt;/blockquote&gt;After that, execute &quot;mvn gwt:run&quot; to execute the application. Spring Roo is still very young, so it has several problems:&lt;br /&gt;
&lt;blockquote&gt; It has no support to multiple module project yet&lt;br /&gt;
If you move classes to a new folder in Eclipse, it brings a little chaos&lt;/blockquote&gt;But still, this tool looks promising. When it become 2.0, 3.0, or 4.0, it can be a very handy tool for java software developers.</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/7490445092802461589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/7490445092802461589' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/7490445092802461589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/7490445092802461589'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2011/09/its-very-easy-to-create-gwt-projects.html' title='It&#39;s very easy to create GWT projects with Spring Roo'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-5369514195411162075</id><published>2011-09-10T20:53:00.000-07:00</published><updated>2011-09-10T20:56:12.534-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="life"/><title type='text'>&quot;How can I keep from singing&quot; - 儿子诗歌朗诵的题目</title><content type='html'>&amp;nbsp; 我挺喜欢的一首诗歌，为了儿子的诗歌朗诵，又找了个中午翻译版，稍微改了改：&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&amp;nbsp; 我的生命在无尽的歌声中流淌&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 尽管人世间仍然充满了忧伤&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 我听见了那来自远方的声音&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 那清晰的歌声带来了新生的曙光&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 虽然生活中充斥着争吵和喧嚷&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 那音乐却始终在我耳边回响&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 她早已进入了我的灵魂深处&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 没有什么东西能让我停止歌唱&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 虽然那暴风雨在我身边隆隆作响&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 我心中的真理却仍和从前一样&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 虽然那黑暗正悄悄吞噬着大地&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 我心中的歌声却把整个世界照亮&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 再大的风暴也不会让我惊慌&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 只要我能坚持自己的理想&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 既然爱是整个世界的主宰&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp; 那还有什么能让我停止歌唱？&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/5369514195411162075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/5369514195411162075' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/5369514195411162075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/5369514195411162075'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2011/09/how-can-i-keep-from-singing.html' title='&quot;How can I keep from singing&quot; - 儿子诗歌朗诵的题目'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-6244536359038635139</id><published>2011-07-09T07:04:00.000-07:00</published><updated>2011-07-09T07:04:59.778-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="tour"/><title type='text'>夏威夷旅行记 （4）</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj6K9os3J1EMG2uAZoxlXg7zY5089b47CTVQp1xPMmtCzsTG1IenaR1L1l8F_crNRKO9QsppXsmAyM3hTUp-SFxd_PsJrPw42MkpG608doQvwWpNBO3NauNOn5_pM7JOQa1FtdvQ/s1600/DSC_3535.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj6K9os3J1EMG2uAZoxlXg7zY5089b47CTVQp1xPMmtCzsTG1IenaR1L1l8F_crNRKO9QsppXsmAyM3hTUp-SFxd_PsJrPw42MkpG608doQvwWpNBO3NauNOn5_pM7JOQa1FtdvQ/s320/DSC_3535.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhssNlbrfqm7q40FxYnsb-Gm7HFTd5Rwh8OMyp8yZiuavVhV41-9uTRtSjgYNsRMKnfcBnx4hXEetPBwcM9JNqzscm51gYVp15bTQSI7N9nNA00_a-P3pJhwRg5hpbBaI1Al8E_rQ/s1600/DSC_3536.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhssNlbrfqm7q40FxYnsb-Gm7HFTd5Rwh8OMyp8yZiuavVhV41-9uTRtSjgYNsRMKnfcBnx4hXEetPBwcM9JNqzscm51gYVp15bTQSI7N9nNA00_a-P3pJhwRg5hpbBaI1Al8E_rQ/s320/DSC_3536.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkXsl7pDkqPQ0ml9t287AedsHK4FnXCRjyFQskRT4Mb9D-7fasLFvOwKX0GNn_S7YCmmZAoCSN6IkLOkav1aZZXhwxKaJFT_1PuiUByrtahU_bjgDTpAmYinoMwUB1PzzcjXBAKw/s1600/DSC_3537.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkXsl7pDkqPQ0ml9t287AedsHK4FnXCRjyFQskRT4Mb9D-7fasLFvOwKX0GNn_S7YCmmZAoCSN6IkLOkav1aZZXhwxKaJFT_1PuiUByrtahU_bjgDTpAmYinoMwUB1PzzcjXBAKw/s320/DSC_3537.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1YLp638bFpyR7xVrpo3wgeaovpf26830gU21SPBu4TWSbdFqx8yok97ZpWlQVX_k5IWviNYYSdJAdXriteBeK1WwYuerrG5hXYgVdG0hushOWvb2Gzx7FuN4e5OeH5DEkBKtdnA/s1600/DSC_3538.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1YLp638bFpyR7xVrpo3wgeaovpf26830gU21SPBu4TWSbdFqx8yok97ZpWlQVX_k5IWviNYYSdJAdXriteBeK1WwYuerrG5hXYgVdG0hushOWvb2Gzx7FuN4e5OeH5DEkBKtdnA/s320/DSC_3538.JPG&quot; width=&quot;212&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0GrnL2soVH9ukcZK9_9gYNccQt2iBxyL4Iz5bkkBwyF0l-Sb9y4ALJJMt47mvPf1pPpMUKrJkFlxhREDBDSBkQ05ijKfSnpXvlmo8Pb4dW3pK9BMpXq1gjPx1rD-jwfiJNy-3Ng/s1600/DSC_3539.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0GrnL2soVH9ukcZK9_9gYNccQt2iBxyL4Iz5bkkBwyF0l-Sb9y4ALJJMt47mvPf1pPpMUKrJkFlxhREDBDSBkQ05ijKfSnpXvlmo8Pb4dW3pK9BMpXq1gjPx1rD-jwfiJNy-3Ng/s320/DSC_3539.JPG&quot; width=&quot;212&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/6244536359038635139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/6244536359038635139' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/6244536359038635139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/6244536359038635139'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2011/07/4.html' title='夏威夷旅行记 （4）'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgj6K9os3J1EMG2uAZoxlXg7zY5089b47CTVQp1xPMmtCzsTG1IenaR1L1l8F_crNRKO9QsppXsmAyM3hTUp-SFxd_PsJrPw42MkpG608doQvwWpNBO3NauNOn5_pM7JOQa1FtdvQ/s72-c/DSC_3535.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-8689666005696751150</id><published>2011-07-09T06:38:00.000-07:00</published><updated>2011-07-09T06:40:38.492-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="tour"/><title type='text'>夏威夷旅行记 （3）</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_oCsRtrRRbSzyRczitFhG6GM0u27HdqV155MqKNf_WwMbkK6dBHYW07iYv3vTYyGXpFSP4uqCbUiSSxSeIvkQwbiTm2JMQT1dLztNkx0QXjM6dUzQvf1Q2UUmSOywanVa8XDQUw/s1600/DSC_3343.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_oCsRtrRRbSzyRczitFhG6GM0u27HdqV155MqKNf_WwMbkK6dBHYW07iYv3vTYyGXpFSP4uqCbUiSSxSeIvkQwbiTm2JMQT1dLztNkx0QXjM6dUzQvf1Q2UUmSOywanVa8XDQUw/s320/DSC_3343.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo_zKpnwhyhMbBIowss7eqOmTN5XO48Poq_9i16Fbv1fyME-hgwsyg0IMD25vmP5cufEiiew3GhnhySVbfoXRLz1hneF8wuORNJmRO0_SEXqYodqTGNoGNTglIXOOxKcQiT4ocUg/s1600/DSC_3372.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgo_zKpnwhyhMbBIowss7eqOmTN5XO48Poq_9i16Fbv1fyME-hgwsyg0IMD25vmP5cufEiiew3GhnhySVbfoXRLz1hneF8wuORNJmRO0_SEXqYodqTGNoGNTglIXOOxKcQiT4ocUg/s320/DSC_3372.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8_n0XqDhbXOQe6jAg4Edh26hJ7tdDp7W67ZAmswXYnXrieQYbm3MmqC30KtvkwNUSHbUtCnThsX2J9x4WrzEugEIhQRjhvzHH7xUuYbRal0zG_y-PiDF2OJRHQ5ZCv6U3g3NhFA/s1600/DSC_3376.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8_n0XqDhbXOQe6jAg4Edh26hJ7tdDp7W67ZAmswXYnXrieQYbm3MmqC30KtvkwNUSHbUtCnThsX2J9x4WrzEugEIhQRjhvzHH7xUuYbRal0zG_y-PiDF2OJRHQ5ZCv6U3g3NhFA/s320/DSC_3376.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeiMXx6k3d-5PZ5U6XzH_2oULD8G-DeLyNU220-CE1-fVzGtm0LqxSHnHhve1brMGEHF6yoE7rjWzf-iAqe-KlFLWstPb4gIhVpUgey3CI_if_th3h8HYWxDUImwKNNrNExkjgJw/s1600/DSC_3380.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeiMXx6k3d-5PZ5U6XzH_2oULD8G-DeLyNU220-CE1-fVzGtm0LqxSHnHhve1brMGEHF6yoE7rjWzf-iAqe-KlFLWstPb4gIhVpUgey3CI_if_th3h8HYWxDUImwKNNrNExkjgJw/s320/DSC_3380.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0-AClYvMooqqPCUjR-hqnJQCxLRKDVRFwZkyeYqkRpXbbDZr4PCh5d7Aw6Sko64jaCZnNyFQmAwO9xj-dPsE4ZmhKBfo7FVBxVYCs-WeienaeKCyQupTyOTLvVZQufrMw0r8ysg/s1600/DSC_3395.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0-AClYvMooqqPCUjR-hqnJQCxLRKDVRFwZkyeYqkRpXbbDZr4PCh5d7Aw6Sko64jaCZnNyFQmAwO9xj-dPsE4ZmhKBfo7FVBxVYCs-WeienaeKCyQupTyOTLvVZQufrMw0r8ysg/s320/DSC_3395.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYaY0fiikWgB06ckuOR-5etwXYAewz0_PFDfYH5YbIZ3s_4YRbr1zNor8AZhUnuYEIPAxlV7LRslWWHFKkONvpqWfpmsaY5MCRP2SvWQv3HqkmdboOcfsZ_AmScppYdb2uXZmASw/s1600/DSC_3410.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYaY0fiikWgB06ckuOR-5etwXYAewz0_PFDfYH5YbIZ3s_4YRbr1zNor8AZhUnuYEIPAxlV7LRslWWHFKkONvpqWfpmsaY5MCRP2SvWQv3HqkmdboOcfsZ_AmScppYdb2uXZmASw/s320/DSC_3410.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil7unOQhEqAr8CCVNvla6VLOKrNkM1_vG1tqpF3Aw33y1Mx_OZqsVQ7_HlFEdzmo1c3aQh9vQ64RjqceWq6g5AlaZ89wQLh__czMBCQQGtEg2ISiH3ZiFvjIwCjMZ012ywq0YrMg/s1600/DSC_3417.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil7unOQhEqAr8CCVNvla6VLOKrNkM1_vG1tqpF3Aw33y1Mx_OZqsVQ7_HlFEdzmo1c3aQh9vQ64RjqceWq6g5AlaZ89wQLh__czMBCQQGtEg2ISiH3ZiFvjIwCjMZ012ywq0YrMg/s320/DSC_3417.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilK-TwWiTdHQDintI8RmgJxIr7zrtMAYbmLY6uR48BJkhcd3JfE6slKzyftvHHzUIthTM3r8CK69JZtjHaXlcn2PNnGchlEjTMFyOGiOSN2Sup9TFHA4Fvkwuyxz6Yks_MODMVNg/s1600/DSC_3426.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilK-TwWiTdHQDintI8RmgJxIr7zrtMAYbmLY6uR48BJkhcd3JfE6slKzyftvHHzUIthTM3r8CK69JZtjHaXlcn2PNnGchlEjTMFyOGiOSN2Sup9TFHA4Fvkwuyxz6Yks_MODMVNg/s320/DSC_3426.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXiKIHLn0TeQV0937wYNAad1SQZS0pwKYjoC28iSMgLY93Mbcs5irB89NJIC30Wz6-yIz47Ll8yb9YvcLZmDAI532fvMlAJ-pzwhQvnhfL_dR6YSr86LFyiP6TgkbCtgLN7h_EoA/s1600/DSC_3446.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXiKIHLn0TeQV0937wYNAad1SQZS0pwKYjoC28iSMgLY93Mbcs5irB89NJIC30Wz6-yIz47Ll8yb9YvcLZmDAI532fvMlAJ-pzwhQvnhfL_dR6YSr86LFyiP6TgkbCtgLN7h_EoA/s320/DSC_3446.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNOtIZ-MPJvkk1MB5KSQg2sjG-HDHqPEj-pfttUYqmoz3suMF8pvOZhJroHSaSOVRtXnNdkqgv2sBsgvaEh9AU8thSTSHjoPpFSMdMFVTSXgsayZ_omMraqYOyh8J2rN1MAn7IDQ/s1600/DSC_3522.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNOtIZ-MPJvkk1MB5KSQg2sjG-HDHqPEj-pfttUYqmoz3suMF8pvOZhJroHSaSOVRtXnNdkqgv2sBsgvaEh9AU8thSTSHjoPpFSMdMFVTSXgsayZ_omMraqYOyh8J2rN1MAn7IDQ/s320/DSC_3522.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhixryJSoaLbHVH5JiLMAvoTHpa34KfQE3puM8h6ME6W1oQBMU1af5gjKYAdeQoZdpM7F3R7DnmJmi4Lt-1SCyJMcsvPNT_iS4wYFBRSYRNq72mXFbp00LKfggrFhHf7EJ7ci1Mmg/s1600/DSC_3525.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhixryJSoaLbHVH5JiLMAvoTHpa34KfQE3puM8h6ME6W1oQBMU1af5gjKYAdeQoZdpM7F3R7DnmJmi4Lt-1SCyJMcsvPNT_iS4wYFBRSYRNq72mXFbp00LKfggrFhHf7EJ7ci1Mmg/s320/DSC_3525.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4Uq1FlrYCt2jz-x88JkaWUpyn_UC38KlO_ke_EcI4NrUQ3gzRYgr0pMxL2a4CA2FiYJtyq51EkNOTFMpwy2uHTepD2s-ugM7hsQn6hrTcokVNvRNQm-bhm-Xz07nwq4vZiCG7AQ/s1600/DSC_3526.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4Uq1FlrYCt2jz-x88JkaWUpyn_UC38KlO_ke_EcI4NrUQ3gzRYgr0pMxL2a4CA2FiYJtyq51EkNOTFMpwy2uHTepD2s-ugM7hsQn6hrTcokVNvRNQm-bhm-Xz07nwq4vZiCG7AQ/s320/DSC_3526.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-1gyy8nptvyw_PVldl1QtfNyl_pUI3rPjDFemcqVC4X_IJT4uTJMzzjy-cUv-ukoqkk9s4jFvo9zFf7Jtj0GDh81ZI_2tEqecTwKGBnC9-ZB3GOwixGSbf-INeFLKG-r6-Xl9Iw/s1600/DSC_3528.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-1gyy8nptvyw_PVldl1QtfNyl_pUI3rPjDFemcqVC4X_IJT4uTJMzzjy-cUv-ukoqkk9s4jFvo9zFf7Jtj0GDh81ZI_2tEqecTwKGBnC9-ZB3GOwixGSbf-INeFLKG-r6-Xl9Iw/s320/DSC_3528.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVVKpjTdBMUloMSgqUFfFZJZ_Lc5WsiNRA_WPFL1XZbOBCiTt7ghNJZtrIi4abxkMmRSUn8utzDuP6Hvfuo4SChrrRZ6eTVK0P_CxYurF8UrYYLr7aqYlSicCuxXntjpjW7rZxSg/s1600/DSC_3529.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVVKpjTdBMUloMSgqUFfFZJZ_Lc5WsiNRA_WPFL1XZbOBCiTt7ghNJZtrIi4abxkMmRSUn8utzDuP6Hvfuo4SChrrRZ6eTVK0P_CxYurF8UrYYLr7aqYlSicCuxXntjpjW7rZxSg/s320/DSC_3529.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/8689666005696751150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/8689666005696751150' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/8689666005696751150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/8689666005696751150'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2011/07/3.html' title='夏威夷旅行记 （3）'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_oCsRtrRRbSzyRczitFhG6GM0u27HdqV155MqKNf_WwMbkK6dBHYW07iYv3vTYyGXpFSP4uqCbUiSSxSeIvkQwbiTm2JMQT1dLztNkx0QXjM6dUzQvf1Q2UUmSOywanVa8XDQUw/s72-c/DSC_3343.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-2017252361615163585</id><published>2011-07-09T06:11:00.000-07:00</published><updated>2011-07-09T06:11:59.557-07:00</updated><title type='text'>夏威夷旅行记 （2）</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS9l7dPs8MxQxaaWsHQ2HyVxAPXTiGDdh0Bz6GT8ItTMHaL4Vlh-lpqxywkXPaINOoRY1ren-VAPEvb8gsaAt1herluNtydGRa6C8D3EeJallul5FXxDoTd0-krGXiy6zjob54wg/s1600/DSC_3122.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS9l7dPs8MxQxaaWsHQ2HyVxAPXTiGDdh0Bz6GT8ItTMHaL4Vlh-lpqxywkXPaINOoRY1ren-VAPEvb8gsaAt1herluNtydGRa6C8D3EeJallul5FXxDoTd0-krGXiy6zjob54wg/s320/DSC_3122.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSVxMjMS-yQi92cQTGnVdth5mgVUuOp6ZKQj-GhUjCWHrlHFbsfxlB_3ndpS-J_55TD0f5d-0iTGTdWaP3jfN7dT0XE7knQXESKK-OOX-xUIdhobqI934yTr3kcY3k4OZkKlmbNw/s1600/DSC_3155.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSVxMjMS-yQi92cQTGnVdth5mgVUuOp6ZKQj-GhUjCWHrlHFbsfxlB_3ndpS-J_55TD0f5d-0iTGTdWaP3jfN7dT0XE7knQXESKK-OOX-xUIdhobqI934yTr3kcY3k4OZkKlmbNw/s320/DSC_3155.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqPG4v0darlueGkAwRsXlSrt5Faa-i7srWxNcx9byqfZNaFKQ6qk26OV4OKLk8MAQkg2_L9wueJRR-FAH6wisHIWZ3GQy741FYfGId_XjDTXJAQkOi80sn5atBeoQCzol-5TBCkA/s1600/DSC_3180.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqPG4v0darlueGkAwRsXlSrt5Faa-i7srWxNcx9byqfZNaFKQ6qk26OV4OKLk8MAQkg2_L9wueJRR-FAH6wisHIWZ3GQy741FYfGId_XjDTXJAQkOi80sn5atBeoQCzol-5TBCkA/s320/DSC_3180.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6jtuNcwObsj1FalBM5vHoe6drixhhkqXqyEpQqqIVWOtuRDW5BoMKLoRJj5l2oH_9-Yrs-pbiL_nQY6InYRjMAmUTZhQOapCdVzScvz49QHgrL3bkSOnWUBQHeMJvwC1fq8KOdw/s1600/DSC_3181.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6jtuNcwObsj1FalBM5vHoe6drixhhkqXqyEpQqqIVWOtuRDW5BoMKLoRJj5l2oH_9-Yrs-pbiL_nQY6InYRjMAmUTZhQOapCdVzScvz49QHgrL3bkSOnWUBQHeMJvwC1fq8KOdw/s320/DSC_3181.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ6Mf-gJ6fq0ulLWFMXIxczXqbvLZS-4WBlvzdFa6bDMD0y-_R2gV70xzeVSgPLAKCAUoLYURyk6d3sw2LdSdvkZPOSmRmTqaJWu0uHE9l-o8gBCSbMkPaFkrwcrV1PjU8K3MytA/s1600/DSC_3184.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZ6Mf-gJ6fq0ulLWFMXIxczXqbvLZS-4WBlvzdFa6bDMD0y-_R2gV70xzeVSgPLAKCAUoLYURyk6d3sw2LdSdvkZPOSmRmTqaJWu0uHE9l-o8gBCSbMkPaFkrwcrV1PjU8K3MytA/s320/DSC_3184.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0wQQ5hgZqcW_cPXJO2ugJDw9MdLgnVs2hYn1oatOtpQrRuKgiVBjHXUD2HBe4ZYHFLtXnWgIB94kBQ11r5TijjDYkgZw1G85hSNc_norLemjK0_pA_4RoQdDj__orHeVLb4qa7w/s1600/DSC_3246.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0wQQ5hgZqcW_cPXJO2ugJDw9MdLgnVs2hYn1oatOtpQrRuKgiVBjHXUD2HBe4ZYHFLtXnWgIB94kBQ11r5TijjDYkgZw1G85hSNc_norLemjK0_pA_4RoQdDj__orHeVLb4qa7w/s320/DSC_3246.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGFo5iPGtokgsvD7T3xR_Q82OpdUz77Yy09OH3aWQqVuNffzkHSeh8ug5g3SPKyjO5U3VU3r4n2suZOv2CggCpwPJCEdGFeR6NYJAEoyoc8GiI0R85kvyznjbIYYKUP3o9OQDYRQ/s1600/DSC_3228.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;212&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGFo5iPGtokgsvD7T3xR_Q82OpdUz77Yy09OH3aWQqVuNffzkHSeh8ug5g3SPKyjO5U3VU3r4n2suZOv2CggCpwPJCEdGFeR6NYJAEoyoc8GiI0R85kvyznjbIYYKUP3o9OQDYRQ/s320/DSC_3228.JPG&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/2017252361615163585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/2017252361615163585' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/2017252361615163585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/2017252361615163585'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2011/07/2.html' title='夏威夷旅行记 （2）'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS9l7dPs8MxQxaaWsHQ2HyVxAPXTiGDdh0Bz6GT8ItTMHaL4Vlh-lpqxywkXPaINOoRY1ren-VAPEvb8gsaAt1herluNtydGRa6C8D3EeJallul5FXxDoTd0-krGXiy6zjob54wg/s72-c/DSC_3122.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-7426793645635614107</id><published>2011-07-09T04:27:00.000-07:00</published><updated>2011-07-09T04:41:53.139-07:00</updated><title type='text'>夏威夷旅行记 （1）</title><content type='html'>&lt;div class=&quot;mobile-photo&quot;&gt;&lt;/div&gt;今年我非常幸运的获得了公司的Best Of IBM大奖，获得了去夏威夷的机会。 &lt;br /&gt;
&lt;br /&gt;
发图片吧： &lt;br /&gt;
&lt;br /&gt;
夏威夷的机场很小：&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5627313920344592178&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqCrtSCH7BGOpf8wx0-r4XvFthyaccom-CTg8tFWdY3xXKPQyqP-2UJ4rko3VWLrLAD9FvNMQHYN2EcK_ctCckq10mkuRbrsHWt4JxFe36hubo6BL72a5uSF0zH1u2aKb4odhV7A/s320/IMG_0337-721566.JPG&quot; style=&quot;margin-left: auto; margin-right: auto;&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;机场入口&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class=&quot;mobile-photo&quot;&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;mobile-photo&quot;&gt;Honolulu的酒店很好，给我们免费升级到了海景房： &lt;/div&gt;&lt;div class=&quot;mobile-photo&quot;&gt;&lt;/div&gt;&lt;div class=&quot;mobile-photo&quot;&gt;&lt;/div&gt;&lt;div class=&quot;mobile-photo&quot;&gt;&lt;/div&gt;&lt;div class=&quot;mobile-photo&quot;&gt;&lt;/div&gt;&lt;div class=&quot;mobile-photo&quot;&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5wS60f-XPWq03-uP3mYB3H2cRDjDMC6hYIRm8Uon7W5sKReyqRMWFry4Du729sC6FpCJ-Xn2NWhaSsLfrkXTjlyPQDhbT1f5OpJsMkHkszPz4i8HKzl32_hfbtWs5ULS8RRLrVA/s1600/IMG_0340-722902.JPG&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5627313926922537202&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5wS60f-XPWq03-uP3mYB3H2cRDjDMC6hYIRm8Uon7W5sKReyqRMWFry4Du729sC6FpCJ-Xn2NWhaSsLfrkXTjlyPQDhbT1f5OpJsMkHkszPz4i8HKzl32_hfbtWs5ULS8RRLrVA/s320/IMG_0340-722902.JPG&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;海景&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class=&quot;mobile-photo&quot;&gt;&lt;/div&gt;&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsZ5as9syWTnyJ94Lv6EcVNSoyj0EiJPzemageV9lqFu4CB_CPmFZOBLs3c-VhovZ4gL2xjvVSvTVNbOKBBlnlExZICoyb2Xytg2LfdAYuNaUIRdO9re_1Tv75rwTTVzFry-Gwxg/s1600/IMG_0341-725456.jpg&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; id=&quot;BLOGGER_PHOTO_ID_5627313938120403634&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsZ5as9syWTnyJ94Lv6EcVNSoyj0EiJPzemageV9lqFu4CB_CPmFZOBLs3c-VhovZ4gL2xjvVSvTVNbOKBBlnlExZICoyb2Xytg2LfdAYuNaUIRdO9re_1Tv75rwTTVzFry-Gwxg/s320/IMG_0341-725456.jpg&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;传说中的火烈鸟&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/7426793645635614107/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/7426793645635614107' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/7426793645635614107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/7426793645635614107'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2011/07/1.html' title='夏威夷旅行记 （1）'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqCrtSCH7BGOpf8wx0-r4XvFthyaccom-CTg8tFWdY3xXKPQyqP-2UJ4rko3VWLrLAD9FvNMQHYN2EcK_ctCckq10mkuRbrsHWt4JxFe36hubo6BL72a5uSF0zH1u2aKb4odhV7A/s72-c/IMG_0337-721566.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-4228394500748325022</id><published>2011-05-03T00:34:00.000-07:00</published><updated>2011-05-03T00:34:44.775-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><title type='text'>从Lotus Notes同步联系人到Gmail的简易方法</title><content type='html'>周末买了iPhone 4，又面临从就手机同步“联系人”到新手机上的工作。网上查了一下，发现很多收费的工具，看上去都很不靠谱。随后研究了一下Lotus Notes和Gmail，找到了一个很简单的方法。&lt;br /&gt;
1. 首先，进入到Lotus Notes的Contacts功能里面，然后export所有的联系人到一个.csv文件里&lt;br /&gt;
2. 随后，在Gmail的Contact管理页面，Import这个.csv文件&lt;br /&gt;
3. 设置iPhone4使得其和Google同步calendar和contacts：&lt;br /&gt;
&lt;blockquote&gt;在iphone（ipad）的设置中将Exchange账号设置为Gmail账号的话，可以实现iphone自带日历和此Gmail账号的Google Calendar同步。&lt;/blockquote&gt;完成！</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/4228394500748325022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/4228394500748325022' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/4228394500748325022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/4228394500748325022'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2011/05/lotus-notesgmail.html' title='从Lotus Notes同步联系人到Gmail的简易方法'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-182671160237830003</id><published>2010-10-14T18:01:00.000-07:00</published><updated>2010-10-14T18:11:34.135-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="parallel"/><title type='text'>一个多线程Java程序的潜在bug</title><content type='html'>多线程编程的难点就在于程序的正确性难以判断。Jeremy Manson发现了今天我们要介绍的这个在多线程环境下有bug的程序。首先，下面的Java代码在多线程环境下是正确的吗？&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class String {&lt;br /&gt;  private int hashcode;&lt;br /&gt;  public static int hashcode() {&lt;br /&gt;      if (this.hashcode == 0) {&lt;br /&gt;               int h = ... compute hash ...&lt;br /&gt;               this.hashcode = h;&lt;br /&gt;       }&lt;br /&gt;       return this.hashcode;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;初看上去似乎没有什么问题。尽管有一个data race存在，两个线程可能同时计算并保存hash值，但应该不影响正确性。&lt;br /&gt;&lt;br /&gt;问题在于编译器可能进行把以上代码翻译成为如下所示：&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;class String {&lt;br /&gt;   private int hashcode;&lt;br /&gt;   public static int hashcode() {&lt;br /&gt;       int h = this.hashcode;&lt;br /&gt;       if (this.hashcode == 0) {&lt;br /&gt;           h = ... compute hash ...&lt;br /&gt;           this.hashcode = h;&lt;br /&gt;       }&lt;br /&gt;       return h;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;上面代码中我们用h来缓存了hashcode，随后，我们判断如果hashcode不等于0，那么就返回h。问题在于，在做第二个判断之前，hashcode的值可能已经被另外的线程改变，因此这个程序有可能返回一个0。这种错误即使是有多年经验的程序员也很难发现。</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/182671160237830003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/182671160237830003' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/182671160237830003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/182671160237830003'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2010/10/javabug.html' title='一个多线程Java程序的潜在bug'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7253982.post-4565008580687900613</id><published>2010-10-10T05:08:00.000-07:00</published><updated>2010-10-10T05:26:23.971-07:00</updated><title type='text'>IBM中国的新家</title><content type='html'>Google Earth上的盘古大观模型:&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCtONnCQhYO-A3YBe7GcdXnutS-VMe5nfn6V5vWiIenhJdCf1z-aLBVySbMyfarJl8TxXHtmd_eZlaP_xapc4MNDkXsez68w36kkZM5R2LyR4yeJsFltTCEtBdndh-QAkODg-YfQ/s1600/pangu.png&quot;&gt;&lt;img style=&quot;display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 357px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCtONnCQhYO-A3YBe7GcdXnutS-VMe5nfn6V5vWiIenhJdCf1z-aLBVySbMyfarJl8TxXHtmd_eZlaP_xapc4MNDkXsez68w36kkZM5R2LyR4yeJsFltTCEtBdndh-QAkODg-YfQ/s400/pangu.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5526388832364889106&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://ganzhi.blogspot.com/feeds/4565008580687900613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/7253982/4565008580687900613' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/4565008580687900613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7253982/posts/default/4565008580687900613'/><link rel='alternate' type='text/html' href='http://ganzhi.blogspot.com/2010/10/ibm.html' title='IBM中国的新家'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCtONnCQhYO-A3YBe7GcdXnutS-VMe5nfn6V5vWiIenhJdCf1z-aLBVySbMyfarJl8TxXHtmd_eZlaP_xapc4MNDkXsez68w36kkZM5R2LyR4yeJsFltTCEtBdndh-QAkODg-YfQ/s72-c/pangu.png" height="72" width="72"/><thr:total>1</thr:total></entry></feed>