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

<channel>
	<title>不可卷也</title>
	<atom:link href="http://www.xiaojiayi.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.xiaojiayi.com</link>
	<description>njuxjy&#039;s &#38;&#38; driftcloudy&#039;s blog</description>
	<lastBuildDate>Wed, 22 Feb 2012 15:25:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>图像滤镜之程序实现</title>
		<link>http://www.xiaojiayi.com/2011/11/13/%e5%9b%be%e5%83%8f%e6%bb%a4%e9%95%9c%e4%b9%8b%e7%a8%8b%e5%ba%8f%e5%ae%9e%e7%8e%b0/</link>
		<comments>http://www.xiaojiayi.com/2011/11/13/%e5%9b%be%e5%83%8f%e6%bb%a4%e9%95%9c%e4%b9%8b%e7%a8%8b%e5%ba%8f%e5%ae%9e%e7%8e%b0/#comments</comments>
		<pubDate>Sun, 13 Nov 2011 15:43:28 +0000</pubDate>
		<dc:creator>njuxjy</dc:creator>
				<category><![CDATA[symbian]]></category>
		<category><![CDATA[图像处理]]></category>

		<guid isPermaLink="false">http://www.xiaojiayi.com/?p=245</guid>
		<description><![CDATA[前段时间做了一段时间塞班平台的图像处理研究，想要做出类似于instagram、Q拍那样的滤镜特效，在手机拍完照后可以用我们提供的滤镜对照片进行美化处理（有空再做个ios版的）。看了一些instagram、Q拍、美图秀秀、可牛快拍等软件做出来的效果，对于图像处理零基础的我表示鸭梨很大。从RGB通道、alpha通道、位图结构、灰度图、图层、颜色表等概念看起，然后了解基本的图像处理方法如锐化、柔化、扩散、雕刻、黑白、反色等基本特效的原理，到高斯模糊、图像混合、柏林噪声等进阶的玩法，到最后总结出了一套做图像特效的方法，给我一个.psd的photoshop源文件，我便可以根据里面的拆分步骤用程序去实现该效果。其中参考了不少国外站点的东西，尤其是StackOverflow上找到了很多有用的东东，东拼西凑组成了我图像处理这块的一些心得。先上图吧。 原图如下： &#160; a. 基础效果 这里说基础是因为这些效果不涉及图像混合等更加复杂的东东，只是对每个像素的RGB通道做一些处理。 有的算法一行代码就能解决了，有的稍微复杂些，不过基本国内的网上都能找得到。 黑白 浮雕 素描 lomo 马赛克 扫描线 波普 鱼眼 b. 进阶效果 这里仅作了图像混合，并没有用函数去处理每个RGB分量，毕竟不是专门搞ps的，不知道怎么弄算好看.. 不过貌似可牛快拍里有些效果就是做了图像混合，然后稍做了些处理。这种做法比较没技术含量.. 不适合单独作为产品级的效果，可以作为复杂特效的某些步骤。 早晨 星光 这里就放出两张图了，因为做法其实都一样，最多传的参数不同罢了。当然图像混合也是有学问的，可以参考国外一哥们的系列文章：http://jswidget.com/blog/2011/03/11/image-blending-algorithmpart-i/ c.高级特效 下面两个效果挺花时间的，主要要知道怎么做比较费时间，做的过程的话第二个效果也比较复杂，是根据.psd文件的拆分步骤一步步做出来的，所以在移动平台上跑有些慢&#8230; 老照片 Nostalgia 做的方法受这个老外的影响很大：http://taptaptap.com/blog/creating-a-camera-plus-fx/ 这是个开发ios上滤镜app的老外设计师写的，而且是夫妻档，貌似老婆是设计师，她将做好的photoshop效果图给源文件给老公，然后老公根据.psd文件做成ios应用放到app store里去卖。我的Nostalgia特效就是模仿的他们的效果。不过老外没有把源代码放上来，就截了段核心函数，然后我自己摸索了好多天，不断的尝试，最后才搞成的效果。里面还涉及到了用Matlab模拟出曲线的函数，竟然用到了四次函数。。不过整个过程还是很享受的，很有乐趣。如果组内有需求，可以帮着搞一下。]]></description>
			<content:encoded><![CDATA[<p>前段时间做了一段时间塞班平台的图像处理研究，想要做出类似于instagram、Q拍那样的滤镜特效，在手机拍完照后可以用我们提供的滤镜对照片进行美化处理（有空再做个ios版的）。看了一些instagram、Q拍、美图秀秀、可牛快拍等软件做出来的效果，对于图像处理零基础的我表示鸭梨很大。从RGB通道、alpha通道、位图结构、灰度图、图层、颜色表等概念看起，然后了解基本的图像处理方法如锐化、柔化、扩散、雕刻、黑白、反色等基本特效的原理，到高斯模糊、图像混合、柏林噪声等进阶的玩法，到最后总结出了一套做图像特效的方法，给我一个.psd的photoshop源文件，我便可以根据里面的拆分步骤用程序去实现该效果。其中参考了不少国外站点的东西，尤其是StackOverflow上找到了很多有用的东东，东拼西凑组成了我图像处理这块的一些心得。先上图吧。</p>
<p>原图如下：</p>
<p><a href="http://www.xiaojiayi.com/wp-content/uploads/2011/11/Nostalgia1.bmp"><img class="alignnone size-full wp-image-257" title="Nostalgia" src="http://www.xiaojiayi.com/wp-content/uploads/2011/11/Nostalgia1.bmp" alt="" /></a></p>
<p>&nbsp;</p>
<p>a. 基础效果</p>
<p>这里说基础是因为这些效果不涉及图像混合等更加复杂的东东，只是对每个像素的RGB通道做一些处理。 有的算法一行代码就能解决了，有的稍微复杂些，不过基本国内的网上都能找得到。</p>
<ol>
<li>黑白<br />
<a href="http://www.xiaojiayi.com/wp-content/uploads/2011/11/blackwhite.png"><img class="alignnone size-full wp-image-247" title="blackwhite" src="http://www.xiaojiayi.com/wp-content/uploads/2011/11/blackwhite.png" alt="" width="600" height="449" /></a></li>
<li>浮雕<br />
<a href="http://www.xiaojiayi.com/wp-content/uploads/2011/11/emboss.png"><img class="alignnone size-full wp-image-248" title="emboss" src="http://www.xiaojiayi.com/wp-content/uploads/2011/11/emboss.png" alt="" width="600" height="449" /></a></li>
<li>素描<br />
<a href="http://www.xiaojiayi.com/wp-content/uploads/2011/11/sumiao.png"><img class="alignnone size-full wp-image-255" title="sumiao" src="http://www.xiaojiayi.com/wp-content/uploads/2011/11/sumiao.png" alt="" width="600" height="449" /></a></li>
<li>lomo<br />
<a href="http://www.xiaojiayi.com/wp-content/uploads/2011/11/lomo.png"><img class="alignnone size-full wp-image-249" title="lomo" src="http://www.xiaojiayi.com/wp-content/uploads/2011/11/lomo.png" alt="" width="600" height="449" /></a></li>
<li>马赛克<br />
<a href="http://www.xiaojiayi.com/wp-content/uploads/2011/11/mosaic.png"><img class="alignnone size-full wp-image-251" title="mosaic" src="http://www.xiaojiayi.com/wp-content/uploads/2011/11/mosaic.png" alt="" width="600" height="449" /></a></li>
<li>扫描线<br />
<a href="http://www.xiaojiayi.com/wp-content/uploads/2011/11/scanline.png"><img class="alignnone size-full wp-image-254" title="scanline" src="http://www.xiaojiayi.com/wp-content/uploads/2011/11/scanline.png" alt="" width="600" height="449" /></a></li>
<li>波普<br />
<a href="http://www.xiaojiayi.com/wp-content/uploads/2011/11/bopo.png"><img class="alignnone size-full wp-image-258" title="bopo" src="http://www.xiaojiayi.com/wp-content/uploads/2011/11/bopo.png" alt="" width="600" height="449" /></a></li>
<li>鱼眼<br />
<a href="http://www.xiaojiayi.com/wp-content/uploads/2011/11/fisheye.png"><img class="alignnone size-full wp-image-259" title="fisheye" src="http://www.xiaojiayi.com/wp-content/uploads/2011/11/fisheye.png" alt="" width="600" height="449" /></a></li>
</ol>
<div>b. 进阶效果</div>
<div>这里仅作了图像混合，并没有用函数去处理每个RGB分量，毕竟不是专门搞ps的，不知道怎么弄算好看.. 不过貌似可牛快拍里有些效果就是做了图像混合，然后稍做了些处理。这种做法比较没技术含量.. 不适合单独作为产品级的效果，可以作为复杂特效的某些步骤。</div>
<div>
<ol>
<li>早晨<br />
<a href="http://www.xiaojiayi.com/wp-content/uploads/2011/11/morning.png"><img class="alignnone size-full wp-image-250" title="morning" src="http://www.xiaojiayi.com/wp-content/uploads/2011/11/morning.png" alt="" width="600" height="449" /></a></li>
<li>星光<br />
<a href="http://www.xiaojiayi.com/wp-content/uploads/2011/11/star.png"><img class="alignnone size-full wp-image-260" title="star" src="http://www.xiaojiayi.com/wp-content/uploads/2011/11/star.png" alt="" width="600" height="449" /></a></li>
</ol>
</div>
<div>这里就放出两张图了，因为做法其实都一样，最多传的参数不同罢了。当然图像混合也是有学问的，可以参考国外一哥们的系列文章：http://jswidget.com/blog/2011/03/11/image-blending-algorithmpart-i/</div>
<div>c.高级特效</div>
<div>下面两个效果挺花时间的，主要要知道怎么做比较费时间，做的过程的话第二个效果也比较复杂，是根据.psd文件的拆分步骤一步步做出来的，所以在移动平台上跑有些慢&#8230;</div>
<div>
<ol>
<li>老照片<br />
<a href="http://www.xiaojiayi.com/wp-content/uploads/2011/11/old-photo.png"><img class="alignnone size-full wp-image-253" title="old photo" src="http://www.xiaojiayi.com/wp-content/uploads/2011/11/old-photo.png" alt="" width="600" height="449" /></a></li>
<li>Nostalgia<br />
<a href="http://www.xiaojiayi.com/wp-content/uploads/2011/11/nostalgia.png"><img class="alignnone size-full wp-image-252" title="nostalgia" src="http://www.xiaojiayi.com/wp-content/uploads/2011/11/nostalgia.png" alt="" width="600" height="449" /></a></li>
</ol>
<div>做的方法受这个老外的影响很大：http://taptaptap.com/blog/creating-a-camera-plus-fx/</div>
<div>这是个开发ios上滤镜app的老外设计师写的，而且是夫妻档，貌似老婆是设计师，她将做好的photoshop效果图给源文件给老公，然后老公根据.psd文件做成ios应用放到app store里去卖。我的Nostalgia特效就是模仿的他们的效果。不过老外没有把源代码放上来，就截了段核心函数，然后我自己摸索了好多天，不断的尝试，最后才搞成的效果。里面还涉及到了用Matlab模拟出曲线的函数，竟然用到了四次函数。。不过整个过程还是很享受的，很有乐趣。如果组内有需求，可以帮着搞一下。</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.xiaojiayi.com/2011/11/13/%e5%9b%be%e5%83%8f%e6%bb%a4%e9%95%9c%e4%b9%8b%e7%a8%8b%e5%ba%8f%e5%ae%9e%e7%8e%b0/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>移植zlib到Symbian实现gzip内存流解压</title>
		<link>http://www.xiaojiayi.com/2011/08/17/%e7%a7%bb%e6%a4%8dzlib%e5%88%b0symbian%e5%ae%9e%e7%8e%b0gzip%e5%86%85%e5%ad%98%e6%b5%81%e8%a7%a3%e5%8e%8b/</link>
		<comments>http://www.xiaojiayi.com/2011/08/17/%e7%a7%bb%e6%a4%8dzlib%e5%88%b0symbian%e5%ae%9e%e7%8e%b0gzip%e5%86%85%e5%ad%98%e6%b5%81%e8%a7%a3%e5%8e%8b/#comments</comments>
		<pubDate>Wed, 17 Aug 2011 14:11:00 +0000</pubDate>
		<dc:creator>njuxjy</dc:creator>
				<category><![CDATA[symbian]]></category>

		<guid isPermaLink="false">http://www.xiaojiayi.com/?p=193</guid>
		<description><![CDATA[客户端（v3版本）原先在处理服务器端传回gzip数据时采用的策略是先将gzip流保存成.gz文件，再用解压文件的方式将数据解压出来。这种方式显然不如直接从内存中实现gzip解压来得高效，但由于Symbian SDK中zlib的版本过低（1.1.3）等原因，网上介绍的很多内存流解压方法并不适用于此： http://apps.hi.baidu.com/share/detail/8355062 http://blog.sina.com.cn/s/blog_4d6f62190100md6k.html http://blog.sina.com.cn/s/blog_65db99840100kwh9.html http://www.devdiv.com/thread-8625-1-1.html http://www.developer.nokia.com/Community/Discussion/showthread.php?155614-GZip-and-RReadStream-problem 在解决过程中遇到了一些困难，开始使用http://apps.hi.baidu.com/share/detail/8355062 中的方法，并且将服务器返回的gzip数据去掉开头的10个gzip header，但程序始终卡在第13行： CBufFlat* CETNetOperator::DeCompressMemL(const TDesC8&#38; aData)         {         TInt nBufferSize = 128;         HBufC8* nSrc = NULL;         HBufC8* nTemp = aData.Mid(10).Alloc();   //去掉开头10个字节         nSrc = nTemp;         CleanupStack::PushL(nSrc);         CBufFlat* nBufFlat = CBufFlat::NewL(nBufferSize);         CleanupStack::PushL(nBufFlat);         CBufferManager* nBufferManager = CBufferManager::NewLC(*nSrc, *nBufFlat,                     nBufferSize);         CEZDecompressor* decompressor = CEZDecompressor::NewLC(*nBufferManager);         while (decompressor-&#62;InflateL())               {// loop here until the file is compressed               }         //    nBufFlat-&#62;Ptr(0);         CleanupStack::PopAndDestroy(3);         return nBufFlat;         }    然后尝试使用Symbian SDK自带的zlib库，include &#60;ezlib.h&#62;，代码如下： int ungzip(char* source, int len, char* des)        {        int ret, have; [...]]]></description>
			<content:encoded><![CDATA[<p>客户端（v3版本）原先在处理服务器端传回gzip数据时采用的策略是先将gzip流保存成.gz文件，再用解压文件的方式将数据解压出来。这种方式显然不如直接从内存中实现gzip解压来得高效，但由于Symbian SDK中zlib的版本过低（1.1.3）等原因，网上介绍的很多内存流解压方法并不适用于此：</p>
<ul>
<li><a href="http://apps.hi.baidu.com/share/detail/8355062">http://apps.hi.baidu.com/share/detail/8355062</a></li>
<li><a href="http://blog.sina.com.cn/s/blog_4d6f62190100md6k.html">http://blog.sina.com.cn/s/blog_4d6f62190100md6k.html</a></li>
<li><a href="http://blog.sina.com.cn/s/blog_65db99840100kwh9.html">http://blog.sina.com.cn/s/blog_65db99840100kwh9.html</a></li>
<li><a href="http://www.devdiv.com/thread-8625-1-1.html">http://www.devdiv.com/thread-8625-1-1.html</a></li>
<li><a href="http://www.developer.nokia.com/Community/Discussion/showthread.php?155614-GZip-and-RReadStream-problem">http://www.developer.nokia.com/Community/Discussion/showthread.php?155614-GZip-and-RReadStream-problem</a></li>
</ul>
<div>在解决过程中遇到了一些困难，开始使用<a href="http://apps.hi.baidu.com/share/detail/8355062">http://apps.hi.baidu.com/share/detail/8355062</a> 中的方法，并且将服务器返回的gzip数据去掉开头的10个gzip header，但程序始终卡在第13行：</div>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>CBufFlat* CETNetOperator::DeCompressMemL(</span><span class="keyword">const</span><span> TDesC8&amp; aData)   </span></span></li>
<li><span>     {   </span></li>
<li class="alt"><span>     TInt nBufferSize = 128;   </span></li>
<li><span>     HBufC8* nSrc = NULL;   </span></li>
<li class="alt"><span>     HBufC8* nTemp = aData.Mid(10).Alloc();   </span><span class="comment">//去掉开头10个字节 </span><span>  </span></li>
<li><span>     nSrc = nTemp;   </span></li>
<li class="alt"><span>     CleanupStack::PushL(nSrc);   </span></li>
<li><span>     CBufFlat* nBufFlat = CBufFlat::NewL(nBufferSize);   </span></li>
<li class="alt"><span>     CleanupStack::PushL(nBufFlat);   </span></li>
<li><span>     CBufferManager* nBufferManager = CBufferManager::NewLC(*nSrc, *nBufFlat,   </span></li>
<li class="alt"><span>                 nBufferSize);   </span></li>
<li><span>     CEZDecompressor* decompressor = CEZDecompressor::NewLC(*nBufferManager);   </span></li>
<li class="alt"><span>     </span><span class="keyword">while</span><span> (decompressor-&gt;InflateL())   </span></li>
<li><span>           {</span><span class="comment">// loop here until the file is compressed </span><span>  </span></li>
<li class="alt"><span>           }   </span></li>
<li><span>     </span><span class="comment">//    nBufFlat-&gt;Ptr(0); </span><span>  </span></li>
<li class="alt"><span>     CleanupStack::PopAndDestroy(3);   </span></li>
<li><span>     </span><span class="keyword">return</span><span> nBufFlat;   </span></li>
<li class="alt"><span>     }   </span></li>
</ol>
</div>
<p>然后尝试使用Symbian SDK自带的zlib库，include &lt;ezlib.h&gt;，代码如下：</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span class="datatypes">int</span><span> ungzip(</span><span class="datatypes">char</span><span>* source, </span><span class="datatypes">int</span><span> len, </span><span class="datatypes">char</span><span>* des)   </span></span></li>
<li><span>    {   </span></li>
<li class="alt"><span>    </span><span class="datatypes">int</span><span> ret, have;   </span></li>
<li><span>    </span><span class="datatypes">int</span><span> offset = 0;   </span></li>
<li class="alt"><span>    z_stream d_stream;   </span></li>
<li><span>    Byte compr[KETNET_BUFFER_SIZE] ={0}, uncompr[KETNET_BUFFER_SIZE * 4] ={0};   </span></li>
<li class="alt"><span>    memcpy(compr, (Byte*) source, len);   </span></li>
<li><span>    uLong comprLen, uncomprLen;   </span></li>
<li class="alt"><span>    comprLen = len;   </span></li>
<li><span>    uncomprLen = KETNET_BUFFER_SIZE * 4;   </span></li>
<li class="alt"><span>    strcpy((</span><span class="datatypes">char</span><span>*) uncompr, </span><span class="string">&#8220;garbage&#8221;</span><span>);   </span></li>
<li><span>    d_stream.zalloc = Z_NULL;   </span></li>
<li class="alt"><span>    d_stream.zfree = Z_NULL;   </span></li>
<li><span>    d_stream.opaque = Z_NULL;   </span></li>
<li class="alt"><span>    d_stream.next_in = compr;   </span></li>
<li><span>    d_stream.avail_in = comprLen;   </span></li>
<li class="alt"><span>    ret = inflateInit2(&amp;d_stream,47);   </span></li>
<li><span>    </span><span class="keyword">if</span><span> (ret != Z_OK)   </span></li>
<li class="alt"><span>        {   </span></li>
<li><span>        </span><span class="keyword">return</span><span> ret;   </span></li>
<li class="alt"><span>        }   </span></li>
<li><span>    </span><span class="keyword">do</span><span>  </span></li>
<li class="alt"><span>        {   </span></li>
<li><span>        d_stream.next_out = uncompr;   </span></li>
<li class="alt"><span>        d_stream.avail_out = uncomprLen;   </span></li>
<li><span>        ret = inflate(&amp;d_stream, Z_NO_FLUSH);   </span></li>
<li class="alt"><span>        </span><span class="keyword">switch</span><span> (ret)   </span></li>
<li><span>            {   </span></li>
<li class="alt"><span>            </span><span class="keyword">case</span><span> Z_NEED_DICT:   </span></li>
<li><span>                ret = Z_DATA_ERROR;   </span></li>
<li class="alt"><span>            </span><span class="keyword">case</span><span> Z_DATA_ERROR:   </span></li>
<li><span>            </span><span class="keyword">case</span><span> Z_MEM_ERROR:   </span></li>
<li class="alt"><span>                (</span><span class="keyword">void</span><span>) inflateEnd(&amp;d_stream);   </span></li>
<li><span>                </span><span class="keyword">return</span><span> ret;   </span></li>
<li class="alt"><span>            }   </span></li>
<li><span>        have = uncomprLen - d_stream.avail_out;   </span></li>
<li class="alt"><span>        memcpy(des + offset, uncompr, have);   </span></li>
<li><span>        offset += have;   </span></li>
<li class="alt"><span>        }   </span></li>
<li><span>    </span><span class="keyword">while</span><span> (d_stream.avail_out == 0);   </span></li>
<li class="alt"><span>    inflateEnd(&amp;d_stream);   </span></li>
<li><span>    memcpy(des + offset, </span><span class="string">&#8220;\0&#8243;</span><span>, 1);   </span></li>
<li class="alt"><span>    </span><span class="keyword">return</span><span> ret;   </span></li>
<li><span>    }  </span></li>
</ol>
</div>
<p>发现程序始终在第17行返回-2，即流初始化Z_STREAM_ERROR错误，zlib1.1.3的zlib.h中说原因是参数设置不正确，stream为空或者windowBits为负。而inflateInit2（）要求windowBits在8~15之间，在其他范围内的值会造成初始化错误。随后改成了15，但是在第26行inflate进行解压时返回值为-3，即Z_DATA_ERROR错误，原因是&#8221;the input data is corrupted (input stream not conforming to the zlib format or incorrect adler32 checksum)&#8221;。</p>
<p>于是怀疑是Symbian自带的zlib的版本问题，刚哥说得自己移植zlib库进去。由于没移植过程序，一开始犯了个错误，原地绕了个圈子：我从网上下了个人家已经编译好的1.2.3版本的zlib.lib文件和几个头文件放到项目工程中去，以为光更换了zlib版本就行了，结果还是那两个错误。最后才走移植的路子，并编译运行成功，现将步骤记录如下：</p>
<p>从网上下载1.2.3的源代码，将下面这些.h .c文件放入工程下面（全部放进去会使工程太大，由于只需要用zlib的解压功能，所以删除了部分没用的文件和函数，还可以继续减减肥，这个以后再做吧）：</p>
<p><a href="http://www.xiaojiayi.com/wp-content/uploads/2011/08/2.jpg"><img title="2" src="http://www.xiaojiayi.com/wp-content/uploads/2011/08/2.jpg" alt="" width="141" height="291" /></a></p>
<p>使用zlib提供的uncompress函数进行解压缩：</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>ZEXTERN </span><span class="datatypes">int</span><span> ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, </span><span class="keyword">const</span><span> Bytef *source, uLong sourceLen));  </span></span></li>
</ol>
<div>这个函数的实现其实就是上面的ungzip函数。在inflateInit2（）的时候使用了47，在1.2.3版本的zlib.h中有这么一段话，是1.1.3版本中没有的：</div>
<div><a href="http://www.xiaojiayi.com/wp-content/uploads/2011/08/21.jpg"><img class="alignnone size-full wp-image-196" title="2" src="http://www.xiaojiayi.com/wp-content/uploads/2011/08/21.jpg" alt="" width="642" height="318" /></a></div>
</div>
<p>难怪1.1.3版本的不行，因为在1.1.3版本中的inflateInit2()中对gzip只字未提，只有gzopen()等函数能对.gz的文件进行解压。因此1.1.3版本不支持内存流的gzip解压。</p>
<p>这样以后，一般的项目就算是可以大功告成了。下面的步骤仅针对于自己参与的这个项目，没兴趣的可以跳过：） 由于它在其他地方用到了Symbian SDK自带的系统文件ezlib.h，而这一部分代码没法更改为使用新移植进去的zlib库，所以只能在系统中保持两个库的并存，这样就会造成很多函数名和类、结构体声明重复，无法通过编译。唯一想到的办法就是将新加入的zlib源文件中与老版本的zlib冲突的部分全部重命名，但这是一个巨大的工作量，因为宏定义特别多。那就先给zlib减减肥吧，仅保留需要的解压缩的那部分。过程就不详说了，总之多尝试吧，也不是个容易的活。</p>
<p>在这过程中产生了些副产品：</p>
<ol>
<li>Carbide的断点调试，比打日志好多了，f6单步, f8执行</li>
<li>明白了移植是怎么回事</li>
<li>最好服务端过来的数据头部有gzip数据包的大小信息，<wbr>可以减少客户端动态分配的内存</wbr></li>
</ol>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiaojiayi.com/2011/08/17/%e7%a7%bb%e6%a4%8dzlib%e5%88%b0symbian%e5%ae%9e%e7%8e%b0gzip%e5%86%85%e5%ad%98%e6%b5%81%e8%a7%a3%e5%8e%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>工作一月小记</title>
		<link>http://www.xiaojiayi.com/2011/08/07/%e5%b7%a5%e4%bd%9c%e4%b8%80%e6%9c%88%e5%b0%8f%e8%ae%b0/</link>
		<comments>http://www.xiaojiayi.com/2011/08/07/%e5%b7%a5%e4%bd%9c%e4%b8%80%e6%9c%88%e5%b0%8f%e8%ae%b0/#comments</comments>
		<pubDate>Sun, 07 Aug 2011 09:10:45 +0000</pubDate>
		<dc:creator>njuxjy</dc:creator>
				<category><![CDATA[总结&计划]]></category>
		<category><![CDATA[生活]]></category>

		<guid isPermaLink="false">http://www.xiaojiayi.com/?p=175</guid>
		<description><![CDATA[7月5日入职到现在刚好一个月的时间。只不过是在大半年的张江男生活上又增添了一个月而已，没有什么新奇的地方。由于有过另外两家公司的实习经历，所以难免在工作中会进行些比对。不再是打酱油的实习生，而是需要产出的劳动者，辛苦是自然的，能学到东西是唯一的期许，薪资福利等等不在重点考虑范围。互联网行业，不慎落入LBS的从业人员。业务上的事情需要关注，但不需过多掺杂，有没有钱途不是我说了算，当然愿景是美好的。作为一名入司不久的新人，挨好你的踢才是根本，其他神马都是浮云。 跟两同学住在玉兰这块熟悉不过的地方，买了电瓶车，从益江路到居里路，天天20分钟路，算是很近了，路上听听有声小说。对面就是浦东软件园，是我吃饭的地方，一天两顿。平时基本9点走，周末加班是常事。组内都是年轻人，大多比我大个两三岁，但有的已经四五年经验了。如果现在让我决定的话，宁愿两年经验换两年的烟酒僧生活。挨踢这个行业，经验才是王道，除非你是学术男。会的太杂，深入的太少，一贯的老问题，面试时有几家重技术（百姓、阿里云）的公司都指出了这一点，“要么做产品经理，要么在某个技术上深入下去，否则是很恐怖的事情”。说的时候打击挺大，事后又成了云烟。想学的太多，今天在看php，明天买了mac又扔了php去看IOS开发，问题的根本是什么都想抓住，结果是什么都没能坚持、专注。 关于个人管理。为了改善这种情况，在保持广度的情况下突出深度，需要一些个人管理的方法。现在有了mac和win7双系统，需要一些跨平台的同步工具，evernote作为知识管理是个不错的选择，但之前使用wiz已经积累了很多资料，无法导入到evernote里，且mac下不能用，所以wiz现在也在用，wiz的好处是一些带附件的文档也能够导入。在时间管理方面，使用web版的doit.im作为GTD工具，其在手机端也有相应版本。doit.im有项目视图，我会把一些想做的多步骤才能完成的事情作为一个项目添加，完成该项目的步骤填入，确保不遗忘事情。在深度方面需要改进的是不要铺开N个项目同时进行，每次只针对一个项目，完成以后才能进行下一个项目，算是自己跟自己制定的游戏规则吧。在专注性方面，引入番茄工作法，由于doit.im没有番茄钟的功能，本地的番茄工作法软件又不支持数据云端同步，所以想自己实现一个web版的，这个还需要和熊继续商量。 关于技术。来这边当然是为了学技术，积累项目经验和得到产品级的历练。入职的前两天我在web后端组，搭好了环境准备看代码时却被临时换到symbian组去了，原因是项目紧、缺人。在那边改了一个月的bug，接下来更多的会是小特性的快速迭代，而大的版本变更暂时不会出现，以及改不完的bug和性能调优。当然在适当的时候也会考虑所做工作的价值，因为更核心的web后端才是我真正想做的事情，能得到更多的锻炼，为以后积累更多资本。对大数据量的处理才是互联网企业吸引我的地方，而不是停留在界面的修改、业务逻辑上的打打闹闹。这方面目前还没有积累，我希望自己能在业余时间抽出时间来积累，而不是都将时间卖给游戏和没意义的加班。 除了为将来的工作打基础，我希望自己能在业余时间接触一些开源项目，读一些源代码，自己试着编译和修改。能在业余时间做出一些自己的项目，出于兴趣，不受时间和产品经理的压力。在内功方面需要持之以恒的修炼，计划及方案都有，只剩下执行力了。会把能不能发布技术blog作为检验自己是否真正理解的标准。当然，现在参与的项目也力求总结出一些独立于项目本身的经验，强哥称之为智慧的东西。 关于身体。前段时间本科同一级的一位女生癌症去世了，在感慨生命脆弱的同时，也为自己敲响警钟。一天14+个小时对着电脑（公司+宿舍），伤不起啊。受条件所限，每天都要坚持做下俯卧撑和仰卧起坐。 其他种种，不多说了。关于工作有几句话说的不错，分享下： 为自己工作 以结果为导向 共生而不是堕化 挖掘自身的价值]]></description>
			<content:encoded><![CDATA[<p>7月5日入职到现在刚好一个月的时间。只不过是在大半年的张江男生活上又增添了一个月而已，没有什么新奇的地方。由于有过另外两家公司的实习经历，所以难免在工作中会进行些比对。不再是打酱油的实习生，而是需要产出的劳动者，辛苦是自然的，能学到东西是唯一的期许，薪资福利等等不在重点考虑范围。互联网行业，不慎落入LBS的从业人员。业务上的事情需要关注，但不需过多掺杂，有没有钱途不是我说了算，当然愿景是美好的。作为一名入司不久的新人，挨好你的踢才是根本，其他神马都是浮云。<br />
跟两同学住在玉兰这块熟悉不过的地方，买了电瓶车，从益江路到居里路，天天20分钟路，算是很近了，路上听听有声小说。对面就是浦东软件园，是我吃饭的地方，一天两顿。平时基本9点走，周末加班是常事。组内都是年轻人，大多比我大个两三岁，但有的已经四五年经验了。如果现在让我决定的话，宁愿两年经验换两年的烟酒僧生活。挨踢这个行业，经验才是王道，除非你是学术男。会的太杂，深入的太少，一贯的老问题，面试时有几家重技术（百姓、阿里云）的公司都指出了这一点，“要么做产品经理，要么在某个技术上深入下去，否则是很恐怖的事情”。说的时候打击挺大，事后又成了云烟。想学的太多，今天在看php，明天买了mac又扔了php去看IOS开发，问题的根本是什么都想抓住，结果是什么都没能坚持、专注。</p>
<p><strong>关于个人管理。</strong>为了改善这种情况，在保持广度的情况下突出深度，需要一些个人管理的方法。现在有了mac和win7双系统，需要一些跨平台的同步工具，evernote作为知识管理是个不错的选择，但之前使用wiz已经积累了很多资料，无法导入到evernote里，且mac下不能用，所以wiz现在也在用，wiz的好处是一些带附件的文档也能够导入。在时间管理方面，使用web版的doit.im作为GTD工具，其在手机端也有相应版本。doit.im有项目视图，我会把一些想做的多步骤才能完成的事情作为一个项目添加，完成该项目的步骤填入，确保不遗忘事情。在深度方面需要改进的是不要铺开N个项目同时进行，每次只针对一个项目，完成以后才能进行下一个项目，算是自己跟自己制定的游戏规则吧。在专注性方面，引入番茄工作法，由于doit.im没有番茄钟的功能，本地的番茄工作法软件又不支持数据云端同步，所以想自己实现一个web版的，这个还需要和熊继续商量。</p>
<p><strong>关于技术。</strong>来这边当然是为了学技术，积累项目经验和得到产品级的历练。入职的前两天我在web后端组，搭好了环境准备看代码时却被临时换到symbian组去了，原因是项目紧、缺人。在那边改了一个月的bug，接下来更多的会是小特性的快速迭代，而大的版本变更暂时不会出现，以及改不完的bug和性能调优。当然在适当的时候也会考虑所做工作的价值，因为更核心的web后端才是我真正想做的事情，能得到更多的锻炼，为以后积累更多资本。对大数据量的处理才是互联网企业吸引我的地方，而不是停留在界面的修改、业务逻辑上的打打闹闹。这方面目前还没有积累，我希望自己能在业余时间抽出时间来积累，而不是都将时间卖给游戏和没意义的加班。<br />
除了为将来的工作打基础，我希望自己能在业余时间接触一些开源项目，读一些源代码，自己试着编译和修改。能在业余时间做出一些自己的项目，出于兴趣，不受时间和产品经理的压力。在内功方面需要持之以恒的修炼，计划及方案都有，只剩下执行力了。会把能不能发布技术blog作为检验自己是否真正理解的标准。当然，现在参与的项目也力求总结出一些独立于项目本身的经验，强哥称之为智慧的东西。</p>
<p><strong>关于身体。</strong>前段时间本科同一级的一位女生癌症去世了，在感慨生命脆弱的同时，也为自己敲响警钟。一天14+个小时对着电脑（公司+宿舍），伤不起啊。受条件所限，每天都要坚持做下俯卧撑和仰卧起坐。</p>
<p>其他种种，不多说了。关于工作有几句话说的不错，分享下：</p>
<ol>
<li>为自己工作</li>
<li>以结果为导向</li>
<li>共生而不是堕化</li>
<li>挖掘自身的价值</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.xiaojiayi.com/2011/08/07/%e5%b7%a5%e4%bd%9c%e4%b8%80%e6%9c%88%e5%b0%8f%e8%ae%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>symbian学习笔记三（内存管理）</title>
		<link>http://www.xiaojiayi.com/2011/08/01/symbian%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%b8%89%ef%bc%88%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86%ef%bc%89/</link>
		<comments>http://www.xiaojiayi.com/2011/08/01/symbian%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%b8%89%ef%bc%88%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86%ef%bc%89/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 12:12:48 +0000</pubDate>
		<dc:creator>njuxjy</dc:creator>
				<category><![CDATA[symbian]]></category>

		<guid isPermaLink="false">http://www.xiaojiayi.com/?p=168</guid>
		<description><![CDATA[本文内容非原创，属于网上资源的整理。 ======================================== 二阶段构造 问题1：为什么需要二阶段构造？ 首先考虑如下的语句： CClassName* ptr = new (ELeave) CClassName();   在内存有足够空间的情况下，代码首先在堆上分配一个CClassName类型的对象，并将地址赋给ptr指针，然后调用类的构造函数初始化这个对象。 这样，如果类的构造函数出现了异常，则会发生问题，这种异常发生时没有任何指针指向成功分配给CClassName对象的内存区域，因此这些内存成为孤立内存，发生内存泄漏。这就引出了symbian内存处理的一个重要规则：构造函数绝对不能异常退出。 问题2：为什么二阶段函数能够避免内存泄漏？ 二阶段构造函数，顾名思义就是将一个对象的构造分为两个阶段： 第一个阶段是常规的的构造函数，在该构造函数中，没有可能导致异常退出的代码； 第二个阶段是可能会产生异常的构造阶段，实现为函数ConstructL()； 这样，对象的构造过程就应当包括了如下的代码： CClassName* self = new (ELeave) CClassName();    CleanupStack::PushL(self);    self-&#62;ConstructL();    CleanupStack::Pop(self);   这样的构造方式为什么就能够避免内存泄漏呢？下面我们来逐行分析代码： CClassName* self = new (ELeave) CClassName();   重载的运算符new首先将内存分配给新的self实例，如果分配失败，那么程序异常退出，如果成功给新的对象分配了内存，那么接着执行不会异常退出的第一阶段构造函数； CleanupStack::PushL(self);   接着我们将本地指针self推入清除栈，因为下面要调用可能发生异常的退出函数。 self-&#62;ConstructL();   如果该二阶段构造函数在执行时异常退出，那么新的CClassName的指针由清楚栈负责清楚，避免了内存泄漏；另外，如果该函数没有异常退出，则拥有了一个完全构造的CClassName实例。 CleanupStack::Pop(self);   安全的将本地指针从清除栈中弹出； 每实例化一个对象就要写上述代码确实有些啰嗦了，Symbian OS为了简化实例化的步骤，又引入了NewL(),NewLC()两个函数(其实也可以写成一个NewL(),然而大家都比较推崇同时创建NewL()和NewLC())，其具体的实现方式见问题3； 问题3：如何在新的类中创建二阶段构造函数？ .h头文件： Class CClassName : public CBase    {    public:           static CClassName* NewL();           static CClassName* NewlC();           ~CClassName();    private:           CClassName(); //第一阶段构造           void ConstructL(); //第二阶段构造    ……    }   cpp源文件: [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>本文内容非原创，属于网上资源的整理。</p>
<p>========================================</p>
</div>
<div><span class="Apple-style-span" style="color: #0000ff; font-size: small;"><strong>二阶段构造</strong></span></div>
<div><span class="Apple-style-span" style="color: #a52a00;">问题1：为什么需要二阶段构造？</span></div>
<div>
<div>首先考虑如下的语句：</div>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>CClassName* ptr = </span><span class="keyword">new</span><span> (ELeave) CClassName();  </span></span></li>
</ol>
</div>
<div>在内存有足够空间的情况下，代码首先在堆上分配一个CClassName类型的对象，并将地址赋给ptr指针，然后调用类的构造函数初始化这个对象。</div>
<div>这样，如果类的构造函数出现了异常，则会发生问题，这种异常发生时没有任何指针指向成功分配给CClassName对象的内存区域，因此这些内存成为孤立内存，发生内存泄漏。这就引出了symbian内存处理的一个重要规则：构造函数绝对不能异常退出。</div>
<div><span style="color: #a52a00;">问题2：为什么二阶段函数能够避免内存泄漏？</span></div>
<div>二阶段构造函数，顾名思义就是将一个对象的构造分为两个阶段：</div>
<div>第一个阶段是常规的的构造函数，在该构造函数中，没有可能导致异常退出的代码；</div>
<div>第二个阶段是可能会产生异常的构造阶段，实现为函数ConstructL()；</div>
<div>这样，对象的构造过程就应当包括了如下的代码：</div>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>CClassName* self = </span><span class="keyword">new</span><span> (ELeave) CClassName();   </span></span></li>
<li><span>CleanupStack::PushL(self);   </span></li>
<li class="alt"><span>self-&gt;ConstructL();   </span></li>
<li><span>CleanupStack::Pop(self);  </span></li>
</ol>
</div>
<div>这样的构造方式为什么就能够避免内存泄漏呢？下面我们来逐行分析代码：</div>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>CClassName* self = </span><span class="keyword">new</span><span> (ELeave) CClassName();  </span></span></li>
</ol>
</div>
<div>重载的运算符new首先将内存分配给新的self实例，如果分配失败，那么程序异常退出，如果成功给新的对象分配了内存，那么接着执行不会异常退出的第一阶段构造函数；</div>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>CleanupStack::PushL(self);  </span></span></li>
</ol>
</div>
<div>接着我们将本地指针self推入清除栈，因为下面要调用可能发生异常的退出函数。</div>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>self-&gt;ConstructL();  </span></span></li>
</ol>
</div>
<div>如果该二阶段构造函数在执行时异常退出，那么新的CClassName的指针由清楚栈负责清楚，避免了内存泄漏；另外，如果该函数没有异常退出，则拥有了一个完全构造的CClassName实例。</div>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>CleanupStack::Pop(self);  </span></span></li>
</ol>
</div>
<div>安全的将本地指针从清除栈中弹出；</div>
<div>每实例化一个对象就要写上述代码确实有些啰嗦了，Symbian OS为了简化实例化的步骤，又引入了NewL(),NewLC()两个函数(其实也可以写成一个NewL(),然而大家都比较推崇同时创建NewL()和NewLC())，其具体的实现方式见问题3；</div>
<div><span style="color: #a52a00;">问题3：如何在新的类中创建二阶段构造函数？</span></div>
<div>.h头文件：</div>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>Class CClassName : </span><span class="keyword">public</span><span> CBase   </span></span></li>
<li><span>{   </span></li>
<li class="alt"><span class="keyword">public</span><span>:   </span></li>
<li><span>       </span><span class="keyword">static</span><span> CClassName* NewL();   </span></li>
<li class="alt"><span>       </span><span class="keyword">static</span><span> CClassName* NewlC();   </span></li>
<li><span>       ~CClassName();   </span></li>
<li class="alt"><span class="keyword">private</span><span>:   </span></li>
<li><span>       CClassName(); </span><span class="comment">//第一阶段构造 </span><span>  </span></li>
<li class="alt"><span>       </span><span class="keyword">void</span><span> ConstructL(); </span><span class="comment">//第二阶段构造 </span><span>  </span></li>
<li><span>……   </span></li>
<li class="alt"><span>}  </span></li>
</ol>
</div>
<div>cpp源文件:</div>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>CClassName* CClassName::NewL()   </span></span></li>
<li><span>{   </span></li>
<li class="alt"><span>       CClassName* self = CClassName::NewLC();   </span></li>
<li><span>       CleanupStack::Pop(self);   </span></li>
<li class="alt"><span>       </span><span class="keyword">return</span><span> self;   </span></li>
<li><span>}   </span></li>
<li class="alt"><span>CClassName* CClassName::NewLC()   </span></li>
<li><span>{   </span></li>
<li class="alt"><span>       CClassName* self = </span><span class="keyword">new</span><span> (ELeave) CClassName();   </span></li>
<li><span>       CleanupStack::PushL(self);   </span></li>
<li class="alt"><span>       self-&gt;ConstructL(); </span><span class="comment">//二阶段构造 </span><span>  </span></li>
<li><span>       </span><span class="keyword">return</span><span> self;   </span></li>
<li class="alt"><span>}   </span></li>
<li><span class="keyword">void</span><span> CClassName::ConstructL()   </span></li>
<li class="alt"><span>{   </span></li>
<li><span class="comment">/**************可能产生异常的代码************/</span><span>  </span></li>
<li class="alt"><span>}  </span></li>
</ol>
<div>
<div align="left"><strong><span style="color: #0000ff;">Why Memory Management</span></strong></div>
<div align="left">    <a href="http://www.sf.org.cn/symbian-os.html" target="_blank">Symbian OS</a>本身就是为<a title="家电维修 电子技术 电脑知识@Vogate.com" href="http://action.vogate.com/c/c.php?r=http%3A//www.sf.org.cn/Article/symbiandev/List_12.html&amp;aid=2473&amp;sid=6235007045036118&amp;click=1&amp;url=http%3A//www.zfjd.cn&amp;v=0&amp;s=http%3A//www.sf.org.cn/Article/symbiandev/200610/19136.html&amp;rn=802405&amp;k=%E5%86%85%E5%AD%98" target="_blank">内存</a>和<a title="你放代码我付钱1@Vogate.com" href="http://action.vogate.com/c/c.php?r=http%3A//www.sf.org.cn/Article/symbiandev/List_12.html&amp;aid=5143&amp;sid=6235007045036118&amp;click=1&amp;url=http%3A//www.vogate.com/flow2.php&amp;v=0&amp;s=http%3A//www.sf.org.cn/Article/symbiandev/200610/19136.html&amp;rn=210306&amp;k=%E8%B5%84%E6%BA%90" target="_blank">资源</a>受限的设备开发的，应用<a title="中国站长－我要做属于自己的网站@Vogate.com" href="http://action.vogate.com/c/c.php?r=http%3A//www.sf.org.cn/Article/symbiandev/List_12.html&amp;aid=4744&amp;sid=6235007045036118&amp;click=1&amp;url=http%3A//www.cnzz.cn&amp;v=0&amp;s=http%3A//www.sf.org.cn/Article/symbiandev/200610/19136.html&amp;rn=436188&amp;k=%E7%A8%8B%E5%BA%8F" target="_blank">程序</a>运行过程中很可能碰到内存用光，或者<a title="维博电脑信息网@Vogate.com" href="http://action.vogate.com/c/c.php?r=http%3A//www.sf.org.cn/Article/symbiandev/List_12.html&amp;aid=6038&amp;sid=6235007045036118&amp;click=1&amp;url=http%3A//www.weibo800.cn&amp;v=0&amp;s=http%3A//www.sf.org.cn/Article/symbiandev/200610/19136.html&amp;rn=638529&amp;k=%E7%A1%AC%E4%BB%B6" target="_blank">硬件</a>资源不可用的情况。而这种exceptions是通过修改程序无法解决的，所以遵守以下几条：</div>
<ul type="disc">
<li>尽量不要<a title="校内网代码@Vogate.com" href="http://action.vogate.com/c/c.php?r=http%3A//www.sf.org.cn/Article/symbiandev/List_12.html&amp;aid=5383&amp;sid=6235007045036118&amp;click=1&amp;url=http%3A//biyela.net&amp;v=0&amp;s=http%3A//www.sf.org.cn/Article/symbiandev/200610/19136.html&amp;rn=167752&amp;k=%E4%BD%BF%E7%94%A8" target="_blank">使用</a>不必要的RAM</li>
<li>尽早释放资源，如文件server等</li>
<li>当你每次申请内存时，都须准备处理out-of-memory错误</li>
<li>当 out-of-memory错误发生时，返回到<a title="中国红娘-真实严肃的婚恋交友平台@Vogate.com" href="http://action.vogate.com/c/c.php?r=http%3A//www.sf.org.cn/Article/symbiandev/List_12.html&amp;aid=5373&amp;sid=6235007045036118&amp;click=1&amp;url=http%3A//www.hongniang.com&amp;v=0&amp;s=http%3A//www.sf.org.cn/Article/symbiandev/200610/19136.html&amp;rn=378695&amp;k=%E4%B8%80%E4%B8%AA" target="_blank">一个</a>stable的状态，并释放所有期间申请到的资源</li>
</ul>
<div>
<div align="left"><strong><span style="color: #0000ff;"> Stack and Heap</span></strong></div>
<div align="left">    Stack：默认大小8kb，自动删除，如 TInt i = 0;</div>
<div align="left">    Heap ：至少０.5Mb，由程序员手动删除，如 CMyObj* obj = new (ELeave) CMyObj;</div>
<div align="left"><strong><span style="color: #0000ff;">Leaves</span></strong></div>
<div align="left">    首先介绍Conventional C++ Memory Management，在Symbian看来，这是非常低效率的。</div>
<ul type="disc">
<li>NULL Pointer Checking  if ((myObj = new CMyObj( ) ) == NULL) { //Error Handling }</li>
<li>ANSI C++ Exeption Handling   try { //throw an Exception } catch (int e) { //Error Handling }</li>
</ul>
<div align="left">    在Symbian中<a title="各种行业研究报告！！一网打尽@Vogate.com" href="http://action.vogate.com/c/c.php?r=http%3A//www.sf.org.cn/Article/symbiandev/List_12.html&amp;aid=5301&amp;sid=6235007045036118&amp;click=1&amp;url=http%3A//bbs.21our.com&amp;v=0&amp;s=http%3A//www.sf.org.cn/Article/symbiandev/200610/19136.html&amp;rn=465235&amp;k=%E6%8E%A8%E8%8D%90" target="_blank">推荐</a><a title="网络电视在线看@Vogate.com" href="http://action.vogate.com/c/c.php?r=http%3A//www.sf.org.cn/Article/symbiandev/List_12.html&amp;aid=755&amp;sid=6235007045036118&amp;click=1&amp;url=http%3A//www.cntvs.net&amp;v=0&amp;s=http%3A//www.sf.org.cn/Article/symbiandev/200610/19136.html&amp;rn=260104&amp;k=%E9%87%87%E7%94%A8" target="_blank">采用</a>Leave，如果内存或者资源不能分配到，这个<a title="想成为成功站长？follow me！@Vogate.com" href="http://action.vogate.com/c/c.php?r=http%3A//www.sf.org.cn/Article/symbiandev/List_12.html&amp;aid=4864&amp;sid=6235007045036118&amp;click=1&amp;url=http%3A//www.llf535.com/&amp;v=0&amp;s=http%3A//www.sf.org.cn/Article/symbiandev/200610/19136.html&amp;rn=198436&amp;k=%E4%BB%A3%E7%A0%81" target="_blank">代码</a>就会Leave，沿着Call Stack，直到操作系统或者在某个函数中被Handle掉。</div>
<div align="left">    所有可能Leave的函数最好以L结尾，保证该函数的用户知道这个函数可能Leave。</div>
<div align="left">    Leave的例子：</div>
<ul type="disc">
<li>动态内存分配： return new (ELeave) TUint8[1000];</li>
<li>产生一个Leave：User::Leave(KErrNotFound);</li>
<li>内存不足时Leave：User::LeaveNoMemory();</li>
<li>NULL的时候Leave：User::LeaveIfNull(aNotify);</li>
<li>当发生错误时Leave：RFs fs; TInt err = fs.Connect(); User::LeaveIfError(err);</li>
</ul>
<div align="left">    处理Leave：</div>
<div align="left">    操作系统有默认的处理Leave的方式：</div>
<ul type="disc">
<li>在程序启动过程中：直接关闭应用程序。</li>
<li>应用程序启动后：显示一个错误消息。</li>
</ul>
<div align="left">    开发者<a title="你放代码我付钱3@Vogate.com" href="http://action.vogate.com/c/c.php?r=http%3A//www.sf.org.cn/Article/symbiandev/List_12.html&amp;aid=5145&amp;sid=6235007045036118&amp;click=1&amp;url=http%3A//www.vogate.com/flow2.php&amp;v=0&amp;s=http%3A//www.sf.org.cn/Article/symbiandev/200610/19136.html&amp;rn=858573&amp;k=%E5%8F%AF%E4%BB%A5" target="_blank">可以</a>通过trap装置来处理Leave。TRAP(_r, _s)和TRAPD(_r, _s)，其中：</div>
<ul type="disc">
<li>_r：是一个TInt类型的leave code，默认值为TErrNone。</li>
<li>_s：一系列可能Leave的C++ Statements。</li>
</ul>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>TRAPD(err, DoFunctionL());   </span></span></li>
<li><span class="keyword">if</span><span> (err != KErrNone)   </span></li>
<li class="alt"><span>    { </span><span class="comment">//Error Handling } </span><span>  </span></li>
<li><span class="keyword">else</span><span>  </span></li>
<li class="alt"><span>    { </span><span class="comment">//Everything is well }</span><span>  </span></li>
</ol>
</div>
<div align="left"><strong><span style="color: #0000ff;">  The Cleanup Stack</span></strong></div>
<div align="left">    Cleanup stack用于存储在leave发生后需要deallocating的局部变量(指针)。即：当一个函数leave了，所有在cleanup stack上的对象会被全部删除掉。</div>
<div align="left">    Cleanup Stack的使用方法：</div>
<div align="left">CleanupStack::PushL(ptr) ：当发生leave时所有内存都会被释放<br />
CleanupClosePushL(handle)：当发生leave时这个句柄（handler）会被关闭</div>
<div align="left">CleanupStack::Pop(pointer)：第一个元素出栈<br />
CleanupStack::PopAndDestroy(pointer)：第一个元素出栈并释放内存</div>
<div align="left">    如果一个函数可能leave，检查一下两种情况：</div>
<ul type="disc">
<li>如果leave了，是否所有在堆（heap）上的元素都在cleanup stack中了</li>
<li>如果没有leave，你是否自己恰当地将他cleanup了</li>
</ul>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>CMyClass* CMyClass::NewL(TInt aBufSize)   </span></span></li>
<li><span>   {   </span></li>
<li class="alt"><span>   CMyClass* self = </span><span class="keyword">new</span><span> (ELeave) CMyClass;   </span></li>
<li><span>   CleanupStack::PushL(self);   </span></li>
<li class="alt"><span>   self-&gt;ConstructL(aBufSize);   </span></li>
<li><span>   CleanupStack::Pop(self);   </span></li>
<li class="alt"><span>   </span><span class="keyword">return</span><span> self;   </span></li>
<li><span>   }  </span></li>
</ol>
</div>
<div align="left">    如果某个函数会在cleanup stack上留下一个对象，那么他必须以C结尾。</div>
<div align="left"><strong><span style="color: #0000ff;">Two Phase Construction</span></strong></div>
<div align="left">    C++构造函数一定不能leave。所有内存和资源的分配应该在第二阶段构造函数ConstructL( )中完成。</div>
<div align="left">编码指南，所有用户定义的C类必须：</div>
<ul type="disc">
<li>定义NewL和NewLC函数为public static</li>
<li>定义ConstructL和C++ Constructor为private</li>
</ul>
<div align="left"><strong><span style="color: #0000ff;">Best Practise</span></strong></div>
<div align="left">     Construction的规则：</div>
<ul type="disc">
<li>默认的C++构造函数中不能含有可能leave的代码</li>
<li>可能发生leave的函数必须在ConstructL中被调用</li>
<li>如果基类也有ConstructL，必须首先调用，不要忘了explicit scoping</li>
</ul>
<div align="left">    Destruction的规则：</div>
<ul type="disc">
<li>C类必须在析构函数中删除它自己所包含的对象</li>
<li>在删除一个对象后，把它的指针设为NULL</li>
<li>不要删除不是本类所拥有的对象</li>
<li>在reallocation前首先删除对象，并且将其指针设为NULL</li>
</ul>
<div align="left">    Further Discussion：</div>
<ul type="disc">
<li>Preserve Stack Memory：每个进程只有8K，以引用的方式传递参数，大的对象放在堆上</li>
<li>Preallocation vs last moment allocation：一般的原则是只在使用前分配资源并且在使用后马上释放。但是preallocation的好处是节约处理时间，并且在没有内存的情况下照常运行（资源已经分配到了）</li>
<li>where to put trap harness：最基本的情况是依靠GUI应用程序的框架。根据应用的不同，可以自定义粒度。</li>
<li>Error Code Returns vs. leaving functions：在执行某个处理前检测是否会出现问题，如下代码：</li>
</ul>
<div align="left">                                    User::LeaveIfError(fs.Connect());</div>
<div align="left"><strong><span style="color: #0000ff;">Memory Leaks</span></strong></div>
<div align="left">    如果你的程序有内存泄露，在模拟器上关闭时会crash。尽早发现并解决你的内存泄露，因为你可以追查到你可能导致内存泄露的代码改动。如果实在找不到，可用下面方法：</div>
<div align="left">    Heap Balance Checking：</div>
<ul type="disc">
<li>_UHEAP_MARK</li>
<li>_UHEAP_MARKEND</li>
</ul>
<div align="left">    用上述这两个宏放在你要检查的代码的开头和结尾，如果发生panic，则说明这段代码中发生了内存泄露。可以嵌套使用。</div>
<div align="left"><strong><span style="color: #0000ff;">Panics </span></strong></div>
<div align="left">    Panic是一个未经处理的exception，暗示着一个无法解决的错误。</div>
<div align="left">一般程序有以下三类错误：</div>
<ul type="disc">
<li>程序错误：如引用一个超过数组范围的元素</li>
<li>环境错误：内存、磁盘空间不够，或缺少其他资源等</li>
<li>用户错误：输入错误数据</li>
</ul>
<div>    可以使用trap和cleanup stack技术来解决环境和用户错误，但是对于第一类的程序错误，我们无法恢复，最好是使用User::Panic()函数，它带有两个参数，第一个是string，第二个是Tint。</div>
</div>
<div>
<div><span style="color: #ff6820;">内存管理的二十二条军规</span></div>
<div>1、C类必须有析构函数，这是CBase的一个虚函数。<br />
2、C类的构造函数和ConstructL()必须为protect或private类型的成员函数<br />
3、在C class中必须有一个NewLC()函数，除非它是嵌套类。NewL()是可选的，并且总是根据NewLC()来实现。<br />
4、NewL()和NewLC()在c class中必须是static函数。<br />
5、C类通过指针和引用来传递。<br />
6、拷贝构造函数在symbian中没有用。<br />
7、不要一定在析构函数中删除类的成员对象。（生命期结束即可删除）<br />
8、析构函数中必须对对象进行if检查。即</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span class="keyword">if</span><span>(iObject) </span><span class="keyword">delete</span><span> iObject;iObject = NULL;  </span></span></li>
</ol>
</div>
<p>9、R类没有明确的构造、析构或拷贝构造函数以及赋值操作。<br />
10、delete a;a=NULL;a=b;标准重新分配过程。<br />
11、任何可能导致异常退出的函数皆加L后缀。<br />
12、不要删除非拥有对象（也就是，那些仅仅只使用的对象）<br />
13、分配动态数组前定义一个合适粒度。<br />
14、把new换成new(ELeave).<br />
15、if(函数不能异常退出&amp;&amp;要自己处理错误时)使用TRAP&amp;&amp;不要过多嵌套。<br />
16、if(aObject被一个自动变量指针引用&amp;&amp;将进行一个可能在aObject生存期内Leave的操作）<br />
CleanupStack::PushL(aObject);<br />
17、决不能把一个i前缀的成员变量PushL入清理栈。<br />
18、构造函数决不能Leave，把可能异常退出的语句放到ConstructL()中去。<br />
19、Symbian的默认栈容量为8k，小心使用递归。<br />
20、TBuf的长度最好不超16，必要的情况下用HBufC代替TBuf.<br />
21、使用__UHEAP_MAEK 宏来检测你的内存状况。<br />
22、尽可能早的删除一切失去使用价值的东西，不要等到函数尾部（自动变量）或在析构函数中才删除（成员变量）。</p>
</div>
</div>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.xiaojiayi.com/2011/08/01/symbian%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%b8%89%ef%bc%88%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>symbian学习笔记二（字符串）</title>
		<link>http://www.xiaojiayi.com/2011/08/01/symbian%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%ba%8c%ef%bc%88%e5%ad%97%e7%ac%a6%e4%b8%b2%ef%bc%89-2/</link>
		<comments>http://www.xiaojiayi.com/2011/08/01/symbian%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%ba%8c%ef%bc%88%e5%ad%97%e7%ac%a6%e4%b8%b2%ef%bc%89-2/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 08:18:15 +0000</pubDate>
		<dc:creator>njuxjy</dc:creator>
				<category><![CDATA[symbian]]></category>

		<guid isPermaLink="false">http://www.xiaojiayi.com/?p=128</guid>
		<description><![CDATA[本文内容非原创，属于网上资源的整理。 ======================================== 8位：（TDesC8），用于二进制数据或者ASCII字符串 16位：（TDesC16），默认，Unicode 描述符可以分为五类： 抽象类（Abstract）：（TDes、TDesC、Tdes8、TdesC8），其他描述符的基类，仅提供接口和基本功能，不能被实例化，一般只用作函数的参数。  文字常量（Literal）：（TlitC、_LIT()），用于存储文字字符串（literal string），即C中字符串常量，通常使用_LIT()这种方式（当然还有_L()和_L8()的描述方式，但都不提倡用）。  栈类（Buffer）：（Tbuf、TbufC、 Tbuf8、TbufC8），数据存储于栈上，最基本的描述符变量类型，大小在编译时确定，包含描述符本身数据，使用最为普遍 堆类（Heap）：（HbufC、HbufC8），数据存储于堆上，大小在运行时确定，也就是是用来处理动态申请的描述符类。 指针类（Pointer）：（TPtr、TPtrC、TPtr8、TPtrC8），本身不包含描述符数据，但是包含长度数据，而且还包含一个指向位于描述符之外数据的指针。 1、  文字描述符常量 LIT(KMyFile, &#8220;c:\System\Apps\MyApp\MyFile.jpg&#8221;);   _L()可以生成一个指向字符值的地址（TPtrC），它经常被用来传递字符串到函数中（包括描述符的构造函数和格式化函数）；同理_L8()则可以生成一个指向二进制数据的地址（TPtrC8）举例如下： NEikonEnvironment::MessageBox(_L(&#8220;Error: init file not found!&#8221;));    //数字转字符串    TBuf16&#60;20&#62; buf;    TInt iNum = 20;    buf.Format( _L( &#8220;%d&#8221; ) , iNum  );   2、  栈描述符 LIT(Ktext , &#8220;Test Text&#8221;);    _LIT(Ktext1 , &#8220;Test1 Text&#8221;);    _LIT(KXtraText , &#8220;New:&#8221;);    _LIT(NewText , &#8220;New1&#8243;);    _LIT(NewText1 , &#8220;New2&#8243;);    TBufC&#60;10&#62; Buf1 ( Ktext );//Buf1长度为9 内容 “Test Text”    TBufC&#60;10&#62; Buf2 ( Ktext1 );//Buf2长度为10 内容 “Test1 Text”    // 通过赋值的方式改变数据    Buf2 = Buf1; //Buf2长度变为9 内容 “Test Text”    //通过使用Des()生成指针改变TBufC的数据    TPtr Pointer = Buf1.Des();    // 删除后四个字符    Pointer.Delete(Pointer.Length()-4, 4 ); //Buf1长度变为5 内容“Test ”//但是内存应该没变    // 增加新的数据    [...]]]></description>
			<content:encoded><![CDATA[<p>本文内容非原创，属于网上资源的整理。</p>
<p>========================================</p>
<p><a href="http://www.xiaojiayi.com/wp-content/uploads/2011/08/cfdb8e3b00aa7e6fb9998fd9.jpg"><img class="alignnone size-full wp-image-157" title="1" src="http://www.xiaojiayi.com/wp-content/uploads/2011/08/cfdb8e3b00aa7e6fb9998fd9.jpg" alt="" width="635" height="689" /></a></p>
<p><a href="http://www.xiaojiayi.com/wp-content/uploads/2011/08/a3b3aa30c8e67cb31b4cffa13.jpg"><img class="alignnone size-full wp-image-160" title="2" src="http://www.xiaojiayi.com/wp-content/uploads/2011/08/a3b3aa30c8e67cb31b4cffa13.jpg" alt="" width="574" height="508" /></a></p>
<ul>
<li>8位：（TDesC8），用于二进制数据或者ASCII字符串</li>
<li>16位：（TDesC16），默认，Unicode</li>
</ul>
<div><a href="http://www.xiaojiayi.com/wp-content/uploads/2011/08/32.jpg"><img class="alignnone size-full wp-image-161" title="3" src="http://www.xiaojiayi.com/wp-content/uploads/2011/08/32.jpg" alt="" width="468" height="243" /></a></div>
<p align="left">描述符可以分为五类：</p>
<ol start="1">
<li>抽象类（Abstract）：（TDes、TDesC、Tdes8、TdesC8），其他描述符的基类，仅提供接口和基本功能，不能被实例化，一般只用作函数的参数。</li>
<li> 文字常量（Literal）：（TlitC、_LIT()），用于存储文字字符串（literal string），即C中字符串常量，通常使用_LIT()这种方式（当然还有_L()和_L8()的描述方式，但都不提倡用）。</li>
<li> 栈类（Buffer）：（Tbuf、TbufC、 Tbuf8、TbufC8），数据存储于栈上，最基本的描述符变量类型，大小在编译时确定，包含描述符本身数据，使用最为普遍</li>
<li>堆类（Heap）：（HbufC、HbufC8），数据存储于堆上，大小在运行时确定，也就是是用来处理动态申请的描述符类。</li>
<li>指针类（Pointer）：（TPtr、TPtrC、TPtr8、TPtrC8），本身不包含描述符数据，但是包含长度数据，而且还包含一个指向位于描述符之外数据的指针。</li>
</ol>
<p align="left">1、  文字描述符常量</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>LIT(KMyFile, </span><span class="string">&#8220;c:\System\Apps\MyApp\MyFile.jpg&#8221;</span><span>);  </span></span></li>
</ol>
</div>
<p align="left">_L()可以生成一个指向字符值的地址（TPtrC），它经常被用来传递字符串到函数中（包括描述符的构造函数和格式化函数）；同理_L8()则可以生成一个指向二进制数据的地址（TPtrC8）举例如下：</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>NEikonEnvironment::MessageBox(_L(</span><span class="string">&#8220;Error: init file not found!&#8221;</span><span>));   </span></span></li>
<li><span class="comment">//数字转字符串 </span><span>  </span></li>
<li class="alt"><span>TBuf16&lt;20&gt; buf;   </span></li>
<li><span>TInt iNum = 20;   </span></li>
<li class="alt"><span>buf.Format( _L( </span><span class="string">&#8220;%d&#8221;</span><span> ) , iNum  );  </span></li>
</ol>
</div>
<p align="left">2、  栈描述符</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>LIT(Ktext , </span><span class="string">&#8220;Test Text&#8221;</span><span>);   </span></span></li>
<li><span>_LIT(Ktext1 , </span><span class="string">&#8220;Test1 Text&#8221;</span><span>);   </span></li>
<li class="alt"><span>_LIT(KXtraText , </span><span class="string">&#8220;New:&#8221;</span><span>);   </span></li>
<li><span>_LIT(NewText , </span><span class="string">&#8220;New1&#8243;</span><span>);   </span></li>
<li class="alt"><span>_LIT(NewText1 , </span><span class="string">&#8220;New2&#8243;</span><span>);   </span></li>
<li><span>TBufC&lt;10&gt; Buf1 ( Ktext );</span><span class="comment">//Buf1长度为9 内容 “Test Text” </span><span>  </span></li>
<li class="alt"><span>TBufC&lt;10&gt; Buf2 ( Ktext1 );</span><span class="comment">//Buf2长度为10 内容 “Test1 Text” </span><span>  </span></li>
<li><span class="comment">// 通过赋值的方式改变数据 </span><span>  </span></li>
<li class="alt"><span>Buf2 = Buf1; </span><span class="comment">//Buf2长度变为9 内容 “Test Text” </span><span>  </span></li>
<li><span class="comment">//通过使用Des()生成指针改变TBufC的数据 </span><span>  </span></li>
<li class="alt"><span>TPtr Pointer = Buf1.Des();   </span></li>
<li><span class="comment">// 删除后四个字符 </span><span>  </span></li>
<li class="alt"><span>Pointer.Delete(Pointer.Length()-4, 4 ); </span><span class="comment">//Buf1长度变为5 内容“Test ”//但是内存应该没变 </span><span>  </span></li>
<li><span class="comment">// 增加新的数据 </span><span>  </span></li>
<li class="alt"><span>Pointer.Append(KXtraText);</span><span class="comment">//Buf1长度为9 内容为“Test New：” </span><span>  </span></li>
<li><span class="comment">// 也可以使用下列方式改变数据 </span><span>  </span></li>
<li class="alt"><span>TBufC&lt;10&gt; Buf3(NewText);   </span></li>
<li><span>Pointer.Copy(Buf3);</span><span class="comment">//Buf1长度为4，内容为New1 </span><span>  </span></li>
<li class="alt"><span class="comment">// 或直接从字符串里获得数据 </span><span>  </span></li>
<li><span>Pointer.Copy(NewText1);</span><span class="comment">//Buf1长度为4，内容为New2</span><span>  </span></li>
</ol>
</div>
<p align="left">    以上介绍的是不可修改的栈描述符，而可修改的描述符就不用通过那么复杂的方法来实现修改，它直接可以用Copy、Delete等方法，但是无论可修改的还是不可修改的，一旦指定最大的数据长度后，最大长度就不能进行修改了。</p>
<p align="left">在内存中如下所示:</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>TBuf&lt;16&gt; helloWorld = KHelloWorld; TInt len = KHelloWorld().Length(); helloWorld[len-1]=&#8217;?';  </span></span></li>
</ol>
</div>
<p align="left">TBufC的用法如下：</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>_LIT(KHelloWorld, </span><span class="string">&#8220;Hello World&#8221;</span><span>); </span><span class="keyword">const</span><span> TInt maxBuf = 32; TBufCbuf; TInt currentLen = buf.Length(); </span><span class="comment">// == 0 buf = KHelloWorld; currentLen = buf.Length(); // == 11 TText ch = buf[2]; // == &#8217;l&#8217;</span><span>  </span></span></li>
</ol>
</div>
<p align="left"> TBuf的用法如下：</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span class="keyword">const</span><span> TInt bufLen = 6; TUInt8 objType = 1; TUInt8 objId = 1; TUInt8 xCoord = 128; TUInt8 yCoord = 192; &#8230;. TBuf8&lt;bufLen&gt; buf; buf.Append(objType); buf.Append(objId); &#8230; </span><span class="comment">//we can now do something with the buffer such as writting it to a binary file or send via socket.</span><span>  </span></span></li>
</ol>
</div>
<p align="left">3、  堆描述符</p>
<p align="left">堆描述符虽然都是不可修改类型的，但是它仍然具有构造和修改，与栈描述符不同的是：首先对内存需要显示释放，其次是堆描述符没有最大长度的限制，任何时候都可以用ReAlloc（）函数重新申请分配。具体见示例：</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span class="comment">//例1、构造 </span><span>  </span></span></li>
<li><span class="comment">//有两种方式来生成一个Heap Descriptor </span><span>  </span></li>
<li class="alt"><span class="comment">//第一种方式用New(),NewL(),或NewLC() </span><span>  </span></li>
<li><span class="comment">//如下操作便可以构建一个存放数据的空间，空间为15，不过目前大小为0 </span><span>  </span></li>
<li class="alt"><span>HBufC * Buf = HBufC::NewL(15);   </span></li>
<li><span class="comment">//第二种方式是采用Alloc()，AllocL()或AllcLC()来处理， </span><span>  </span></li>
<li class="alt"><span class="comment">//不过这是已经存在的数据的管理方式。新的Heap Descriptor </span><span>  </span></li>
<li><span class="comment">//可以自动的根据这个内容来构造。 </span><span>  </span></li>
<li class="alt"><span>_LIT (KText , </span><span class="string">&#8220;Test Text&#8221;</span><span>);   </span></li>
<li><span>TBufC&lt;10&gt;  CBuf = KText;   </span></li>
<li class="alt"><span>HBufC * Buf1 = CBuf.AllocL();   </span></li>
<li><span>CleanupStack::PushL(Buf1);   </span></li>
<li class="alt"><span class="comment">//例2、修改 </span><span>  </span></li>
<li><span class="comment">//下面是通过赋值方式改变其数据的方法 </span><span>  </span></li>
<li class="alt"><span>_LIT ( KText1 , </span><span class="string">&#8220;Text1&#8243;</span><span>);   </span></li>
<li><span>*Buf1 = KText1;   </span></li>
<li class="alt"><span class="comment">// 通过可修改指针来改变数据的方式 </span><span>  </span></li>
<li><span>TPtr Pointer = Buf1-&gt;Des();   </span></li>
<li class="alt"><span class="comment">//添加数据 </span><span>  </span></li>
<li><span>Pointer.Delete(Pointer.Length() - 2, 2);   </span></li>
<li class="alt"><span class="comment">//删除数据 </span><span>  </span></li>
<li><span>_LIT ( KNew, </span><span class="string">&#8220;New:&#8221;</span><span>);   </span></li>
<li class="alt"><span>Pointer.Append(KNew);   </span></li>
<li><span class="comment">//例3、重新申请内存 </span><span>  </span></li>
<li class="alt"><span>Buf1 = Buf1-&gt;ReAllocL(KText().Length() + KNew().Length());   </span></li>
<li><span>CleanupStack::PushL(Buf1);   </span></li>
<li class="alt"><span class="comment">//例4、释放内存 </span><span>  </span></li>
<li><span class="comment">//直接用delete </span><span>  </span></li>
<li class="alt"><span class="keyword">delete</span><span> Buf;   </span></li>
<li><span>Buf = NULL;   </span></li>
<li class="alt"><span class="comment">//如果在使用NewL、ReAllocL等异常函数后我们使用清除栈压入的话 </span><span>  </span></li>
<li><span class="comment">//那么我们也可以用清除栈来释放内存 </span><span>  </span></li>
<li class="alt"><span>CleanupStack::PopAndDestroy();   </span></li>
<li><span>Buf1 = NULL;  </span></li>
</ol>
</div>
<p align="left">注：关于以上用清除栈的方式，个人只是猜测，因为对Symbian的异常处理三部曲，至今仍没有很好的掌握，所以如果有什么误用还望指点。</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>HBufC* heapBuf = HBufC::NewL(KHelloWorld().Length()); *heapBuf = KHelloWorld(); </span><span class="keyword">delete</span><span> heapBuf;  </span></span></li>
</ol>
</div>
<p align="left">     在内存中的情况如下图所示：</p>
<p align="left">    HBufC通常在以下几种情况下使用：</p>
<ul>
<li> 在运行时从资源文件中加载字符串</li>
<li> 从用户界面中接收用户输入的字符串</li>
<li>从应用程序引擎中接收字符串，如contacts database中的名字</li>
</ul>
<p align="left">     对HBufC中的内容进行修改：</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>HBufC* heapBuf = HBufC::NewL(KHelloWorld().Length()); *heapBuf = KHelloWorld(); </span><span class="keyword">delete</span><span> heapBuf;  </span></span></li>
</ol>
</div>
<p align="left">4、  指针描述符</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span class="comment">//例1、用TBuf和TBufC构造出TPtrC对象 </span><span>  </span></span></li>
<li><span>_LIT(KText , </span><span class="string">&#8220;Test Code&#8221;</span><span>);   </span></li>
<li class="alt"><span>TBufC&lt;10&gt; Buf ( KText );   </span></li>
<li><span class="comment">//或者为 TBuf&lt;10&gt; Buf ( KText ); </span><span>  </span></li>
<li class="alt"><span class="comment">// Creation of TPtrC using Constructor </span><span>  </span></li>
<li><span>TPtrC  Ptr (Buf);   </span></li>
<li class="alt"><span class="comment">// Creation of TPtrC using Member Function </span><span>  </span></li>
<li><span>TPtrC     Ptr1;   </span></li>
<li class="alt"><span>Ptr1.Set(Buf);   </span></li>
<li><span class="comment">//例2、用TText*构造TPtrC </span><span>  </span></li>
<li class="alt"><span class="keyword">const</span><span> TText* text = _S(</span><span class="string">&#8220;Hello World\n&#8221;</span><span>);   </span></li>
<li><span>TPtrC ptr(text);   </span></li>
<li class="alt"><span class="comment">// 或者 </span><span>  </span></li>
<li><span>TPtrC Ptr2;   </span></li>
<li class="alt"><span>Ptr2.Set(text);   </span></li>
<li><span class="comment">//如果要存储TText的一部分数据，我们使用下列方法 </span><span>  </span></li>
<li class="alt"><span>TPtrC   ptr4(text, 5);   </span></li>
<li><span class="comment">//例3、从另一个TPtrC中构造TPtrC </span><span>  </span></li>
<li class="alt"><span class="keyword">const</span><span> TText * text1 = _S(</span><span class="string">&#8220;Hello World\n&#8221;</span><span>);   </span></li>
<li><span>TPtrC Ptr3(text1);   </span></li>
<li class="alt"><span class="comment">// 从一个TPtrC中获得另一个TPtrC </span><span>  </span></li>
<li><span>TPtrC p1(Ptr3);   </span></li>
<li class="alt"><span class="comment">// 或 </span><span>  </span></li>
<li><span>TPtrC p2;   </span></li>
<li class="alt"><span>p2.Set(Ptr3);  </span></li>
</ol>
</div>
<p align="left">以上是不可修改的TPtrC的构造，相对应的也有可修改的TPtr的构造，不过我们下面省略了用Set()函数的构造方法</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span> </span><span class="comment">//例1、通过TBufC,HBufC的Des()方法获取 </span><span>  </span></span></li>
<li><span>_LIT(KText, </span><span class="string">&#8220;Test Data&#8221;</span><span>);   </span></li>
<li class="alt"><span>TBufC&lt;10&gt; NBuf ( KText );   </span></li>
<li><span>TPtr Pointer = NBuf.Des();   </span></li>
<li class="alt"><span class="comment">//例2、通过指定内存区域和大小来生成 </span><span>  </span></li>
<li><span class="keyword">const</span><span> TText * Text = _S(</span><span class="string">&#8220;Test Second&#8221;</span><span>);   </span></li>
<li class="alt"><span>TPtr Pointer1((TText*)Text, 11, 12);   </span></li>
<li><span class="comment">//例3、 通过另一个TPtr对象来生成 </span><span>  </span></li>
<li class="alt"><span>TPtr Pointer2 ( Pointer );  </span></li>
</ol>
</div>
<p align="left">对于可修改的TPtr虽然前面用过，但是我们在这里在简单的添加两个例子加深下印象，并且说明指针修改的始终是它指向的描述符：</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span class="comment">//例1、改变已有TPtr数据的方式：赋值和Copy()方法 </span><span>  </span></span></li>
<li><span>_LIT(KText, </span><span class="string">&#8220;Test Data&#8221;</span><span>);   </span></li>
<li class="alt"><span>_LIT(K1, </span><span class="string">&#8220;Text1&#8243;</span><span>);   </span></li>
<li><span>_LIT(K2, </span><span class="string">&#8220;Text2&#8243;</span><span>);   </span></li>
<li class="alt"><span>TBufC&lt;10&gt; NBuf ( KText );</span><span class="comment">//NBuf内容为“Test Data” </span><span>  </span></li>
<li><span>TPtr Pointer = NBuf.Des(); </span><span class="comment">//Pointer指向NBuf的内容 </span><span>  </span></li>
<li class="alt"><span>Pointer = K1; </span><span class="comment">// NBuf内容为“Text1” </span><span>  </span></li>
<li><span>Pointer.Copy(K2); </span><span class="comment">// NBuf内容为“Text2” </span><span>  </span></li>
<li class="alt"><span class="comment">//例2、直接通过修改长度改变数据内容 </span><span>  </span></li>
<li><span>Pointer.SetLength(2); </span><span class="comment">// NBuf内容为&#8221;Te&#8221; 注：实际内存的内容应该没变 </span><span>  </span></li>
<li class="alt"><span class="keyword">const</span><span> unsigned </span><span class="datatypes">char</span><span> KBuffer[ ] = {0&#215;00, 0&#215;33, 0&#215;66, 0&#215;99, 0xbb, 0xff}; TPtrC8 bufferPtr( KBuffer, </span><span class="keyword">sizeof</span><span>(KBuffer)); iSocket.Write(bufferPtr, iStatus);  </span></li>
</ol>
</div>
<p align="left">在内存中如下所示：</p>
<p align="left"><a href="http://www.xiaojiayi.com/wp-content/uploads/2011/08/4.jpg"><img class="alignnone size-full wp-image-162" title="4" src="http://www.xiaojiayi.com/wp-content/uploads/2011/08/4.jpg" alt="" width="678" height="195" /></a></p>
<p align="left">TPtr的用法：</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>_LIT(KHelloWorld, </span><span class="string">&#8220;Hello World&#8221;</span><span>); </span><span class="keyword">const</span><span> TInt maxBuf = 32; TBufC&lt;maxBuf&gt; buf; buf = KHelloWorld; TPtr ptr = buf.Des(); ptr[7] = &#8217;a';  ptr[8] = &#8217;l';  ptr[9] = &#8217;e';  ptr[10] = &#8217;s'; CEikonEnv::Static()-&gt;InfoMsg(ptr); </span><span class="comment">// &#8221;Hello Wales&#8221;</span><span>  </span></span></li>
</ol>
</div>
<p align="left">5、  抽象描述符</p>
<p align="left">抽象描述符，没有什么好说的，正如前面所说，只用在函数的形参中，通常要强调参数是不可修改的，就用const TDesC&amp;表示，可修改的参数用TDesC&amp;表示。</p>
<ul>
<li>在函数参数中尽量使用基类</li>
<li>使用中性的描述符，一般情况下使用TDesC而不是TDesC8或者TDesC16</li>
<li>当描述符内容不应该改变时，使用const修饰符</li>
<li>经典用法：void SetText(const TDesC&amp; aText);    TPtrC Text() const;</li>
</ul>
<p align="left">描述符之间的转换</p>
<p align="left"><strong>不可修改向可修改描述符的转换</strong></p>
<p align="left">原则1：通过不可修改描述符类内的Des()函数，将不可修改的描述符转换成可修改的指针描述符</p>
<p align="left">示例1：TBufC转换成TPtr</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>_LIT(KText, </span><span class="string">&#8220;Test Data&#8221;</span><span>);   </span></span></li>
<li><span>TBufC&lt;10&gt; NBuf ( KText );   </span></li>
<li class="alt"><span>TPtr Pointer = NBuf.Des();  </span></li>
</ol>
</div>
<p align="left">示例2：HBufC转换成TPtr</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span>HBufC * Buf = HBufC::NewL(15);   </span></span></li>
<li><span>_LIT (KText , </span><span class="string">&#8220;Test Text&#8221;</span><span>);   </span></li>
<li class="alt"><span>*Buf = KText;   </span></li>
<li><span>TPtr Pointer = Buf-&gt;Des();  </span></li>
</ol>
</div>
<p align="left">原则2：通过TPtr的构造函数或Set()函数可以将TPtrC描述转换为可修改的指针描述符</p>
<p align="left">示例3：TPtrC到TPtr</p>
<div class="dp-highlighter">
<ol class="dp-cpp">
<li class="alt"><span><span class="keyword">const</span><span> TText * text1 = _S(</span><span class="string">&#8220;Hello World\n&#8221;</span><span>);   </span></span></li>
<li><span>TPtrC Ptr1(text1);   </span></li>
<li class="alt"><span>TPtrC Ptr2(Ptr1);   </span></li>
<li><span class="comment">//可以通过构造函数 </span><span>  </span></li>
<li class="alt"><span>TPtr Ptr3((TUint16 *)(Ptr1.Ptr()), Ptr1.Length());   </span></li>
<li><span class="comment">//也可以通过Set()函数 </span><span>  </span></li>
<li class="alt"><span>Ptr3.Set((TUint16 *)(Ptr1.Ptr()),Ptr1.Length(), Ptr1.Length());  </span></li>
</ol>
</div>
<p align="left">
]]></content:encoded>
			<wfw:commentRss>http://www.xiaojiayi.com/2011/08/01/symbian%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%ba%8c%ef%bc%88%e5%ad%97%e7%ac%a6%e4%b8%b2%ef%bc%89-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>symbian学习笔记一（基本数据类型及命名规范）</title>
		<link>http://www.xiaojiayi.com/2011/07/27/symbian%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%b8%80%ef%bc%88%e5%9f%ba%e6%9c%ac%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b%e5%8f%8a%e5%91%bd%e5%90%8d%e8%a7%84%e8%8c%83%ef%bc%89/</link>
		<comments>http://www.xiaojiayi.com/2011/07/27/symbian%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%b8%80%ef%bc%88%e5%9f%ba%e6%9c%ac%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b%e5%8f%8a%e5%91%bd%e5%90%8d%e8%a7%84%e8%8c%83%ef%bc%89/#comments</comments>
		<pubDate>Wed, 27 Jul 2011 03:16:17 +0000</pubDate>
		<dc:creator>njuxjy</dc:creator>
				<category><![CDATA[symbian]]></category>

		<guid isPermaLink="false">http://www.xiaojiayi.com/?p=126</guid>
		<description><![CDATA[本文内容非原创，属于网上资源的整理。 ======================================== 基本数据类型  在Symbian中，很多C++基本类型都被重新定义了，最好使用Symbian的，理由如下： 所有Symbian API都是用的Symbianc重定义的 将来Symbian OS由32位转为64位时，支持性更好 这本身就是Symbian C++ Coding Standards所要求的 1.  Integers     typedef signed int TInt;  C++中的signed int，32位，基本用法类似。     typedef unsigned int TUint;  一般用于计数器(Counter)或者标记(Flags)。     其他Int类型：TInt64， TInt32， TInt16，TInt8； 同时有一份TUint的版本。 2. Text  text类型在Symbian编程中基本不用，而一般采用描述符（descriptor）。TText默认是16位的。 3. Boolean      typedef int TBool;有两个枚举值：ETrue和EFalse。TBool变量最好不要直接和ETure和EFalse比较。如下： TBool flag = ETrue; if (flag)  // if (!flag) { flag = EFalse; [...]]]></description>
			<content:encoded><![CDATA[<p>本文内容非原创，属于网上资源的整理。</p>
<p>========================================</p>
<div align="left"><strong>基本数据类型</strong></div>
<div align="left"> 在Symbian中，很多C++基本类型都被重新定义了，最好使用Symbian的，理由如下：</div>
<ul type="disc">
<li>所有Symbian API都是用的Symbianc重定义的</li>
<li>将来Symbian OS<span style="color: #336699;">由32位转为64位时，支持性更好 </span></li>
<li>这本身就是Symbian C++ Coding Standards所要求的</li>
</ul>
<div align="left"><strong>1.  Integers</strong></div>
<div align="left">    typedef signed int TInt;  C++中的signed int，32位，基本用法类似。</div>
<div align="left">    typedef unsigned int TUint;  一般用于计数器(Counter)或者标记(Flags)。</div>
<div align="left">    其他Int类型：TInt64， TInt32， TInt16，TInt8； 同时有一份TUint的版本。</div>
<div align="left"><strong>2. Text</strong></div>
<div align="left"> text类型在Symbian编程<span style="color: #336699;">中基本不用，而一般</span>采用描述符（descriptor）。TText默认是16位的。</div>
<div align="left"><strong>3. Boolean </strong></div>
<div align="left">    typedef int TBool;有两个枚举值：ETrue和EFalse。TBool变量最好不要直接和ETure和EFalse比较。如下：</div>
<div align="left">TBool flag = ETrue;<br />
if (flag)  // if (!flag)<br />
{<br />
flag = EFalse;<br />
}</div>
<div align="left"><strong>4.  Floating Point</strong></div>
<div align="left">    对浮点数的支持视处理器而定，如果没有FPU，效率非常低，所以最好是不要用浮点数。如果一定要用，尽量转化为整数操作。<br />
typedef float TReal32;  typedef double TReal64; typedef double TReal;</div>
<div align="left"><strong>5. TAny</strong></div>
<div align="left">    typedef void TAny;</div>
<div align="left">    TAny一般只用作指针，其他情况下用void比较好。</div>
<div align="left">    TAny* MyFunction();     void MyOtherFn();</div>
<div align="left">    TAny* 在很多Symbian API中都用到了，如：</div>
<div align="left">    static TUint8* Copy( TAny* aTrg, const TAny* aSrc, TInt aLength);</div>
<div align="left"><strong>5. Enumerations</strong></div>
<div align="left">enum TState {EOff, Eon, EInit};</div>
<div align="left">Enumeration类型应该以T开头，而枚举值应该以E开头。</div>
<div align="left">TState  state = GetState();<br />
if (state == EOn)<br />
{<br />
//Do something here<br />
}</div>
<div align="left"><strong>命名规范</strong></div>
<div align="left">    <em>T类</em>：只包含值，而不包含指针以及外部的资源，在栈上分配空间。</div>
<div align="left">                TVersion osVersion = User::Version();</div>
<div align="left">    <em>C类</em>：所有需要分配内存的类都必须从CBase继承并且以C开头。</div>
<div align="left">class CExample : public CBase<br />
{<br />
private:<br />
CDesCArrayFlat* iArray;<br />
}</div>
<div align="left">CExample* example = new (ELeave) CExample;</div>
<div align="left">    <em>R类</em>：包含指向某个资源的handler。</div>
<div align="left">                RTimer timer;<br />
timer.CreateLocal();</div>
<div align="left">    <em>M类</em>：定义一个接口，一般只包含纯虚函数，不包含成员数据，减少类之间的依赖，用来接受回调消息。</div>
<div align="left">class MEikStatusPaneObserver<br />
{<br />
public:<br />
virtual void HandleStatusPaneSizeChange() = 0;<br />
}</div>
<div align="left">任何实现MEikStatusPaneObserver接口的类都必须实现HandleStatusPaneSizeChange()函数。</div>
<div align="left"><strong>1. 变量命名规范</strong></div>
<ul type="disc">
<li>    成员变量以“i”开头</li>
<li>    参数以“a”开头</li>
<li>    动态变量随便，以小写字母开头</li>
<li>    常量以“K”开头</li>
<li>    尽量不要使用全局变量，不能使用全局静态变量。</li>
</ul>
<div align="left"><strong>2. 函数命名规范</strong></div>
<ul type="disc">
<li>    函数以大写字母开头，如AddFileNameL();</li>
<li>    以D结尾表示deletion of an object</li>
<li>    以L结尾表示函数可能leave</li>
<li>    以C结尾表示一个item被放到cleanup stack</li>
</ul>
<div align="left"><strong>Casting</strong></div>
<div align="left">    Casting用于在类（classes）和类型（types）之间作转化，Symbian中仍然可以使用C中语法。</div>
<div align="left">    dynamic_cast：不支持，Symbian中没有RTTI。</div>
<div align="left">    static_cast：把一个基类转化为一个继承类。</div>
<div align="left">                   TInt intValue = 0xff;<br />
TUint8 byteValue = static_cast&lt;TUint8&gt;(intValue);</div>
<div align="left">    reinterpret_cast：把一个指针类型转化为另外一个指针类型，如integer转化为point类型或者相反。</div>
<div align="left">                   TUint32 fourBytes = 0;<br />
TUint8* bytePtr = reinterpret_cast&lt;TUint8*&gt; (&amp;fourBytes);<br />
bytePtr++;<br />
*bytePtr = 0xFF;</div>
<div align="left">    const_cast：移除一个类的const属性。</div>
<div align="left"></div>
]]></content:encoded>
			<wfw:commentRss>http://www.xiaojiayi.com/2011/07/27/symbian%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%b8%80%ef%bc%88%e5%9f%ba%e6%9c%ac%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b%e5%8f%8a%e5%91%bd%e5%90%8d%e8%a7%84%e8%8c%83%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>生活在别处</title>
		<link>http://www.xiaojiayi.com/2011/07/14/%e7%94%9f%e6%b4%bb%e5%9c%a8%e5%88%ab%e5%a4%84/</link>
		<comments>http://www.xiaojiayi.com/2011/07/14/%e7%94%9f%e6%b4%bb%e5%9c%a8%e5%88%ab%e5%a4%84/#comments</comments>
		<pubDate>Thu, 14 Jul 2011 15:59:39 +0000</pubDate>
		<dc:creator>njuxjy</dc:creator>
				<category><![CDATA[生活]]></category>

		<guid isPermaLink="false">http://www.xiaojiayi.com/?p=117</guid>
		<description><![CDATA[来上海已经有一个多月了。 很早以前有个日本作家来上海“放荡形骸”了一番，回岛国后写了本叫《魔都》的书，记录了那段时间在上海的各种腐败体验。于是现在上海不情不愿地被冠以了“魔都”的称号。相对于魔都上海，我们还有帝都北京、妖都广州。我居住过的另一座城市南京也有个叫魔都的称号，所以一般称南京为小魔都，上海为大魔都。而无锡又不情不愿地被称为“小上海”，所以我从无锡滚到南京，再从南京滚到上海，就是从小小魔都滚到小魔都再滚到大魔都的过程。 网上流传着一篇很长的叫《魔都生存指南》的东西。作为一个标准吃货的作者，花了百分之四十的篇幅介绍了上海的公厕、语言、建筑、交通、气候、治安、休闲、购物等方面，剩下百分之六十的文字都用来介绍各种边边脚脚的腐败去处。作为一名偏居魔都东部小镇的IT民工兼吃货，只能含泪将网页收下，放入“以后再看”的文件夹中。有个地方我倒是天天可以经过，可以去试试： 魔都生存指南：张江地铁站美食点评特别篇&#8211;好吃的芝士蛋糕和面包“毂屋”其实真不需要多介绍了网上对他家的芝士蛋糕好评太多了，中午的意面或者三明治套餐也非常棒。特别推荐袋包装的野生酵母面包，发的不是很蓬松特别好吃，下班顺便带一袋回去吧 魔都生存指南：张江地铁站美食点评特别篇&#8211;地道的台湾小炒“龙门客栈”算是地铁站里比较精致的一家饭店了，比费尼阁要好吃不知道多少，基本上在张江中餐也就百草的味道可以和他比一比了，但是价格就划算大多了。我特别推荐一个菜单上没有的&#8211;九层塔菜圃蛋 我住的那地方和生存指南没什么关系。周围有跟你同样的一大群人，和你揣同样的梦想，同样的早起，去同一个包子铺买肉包，挤同一辆公车，盯着同一个漂亮姑娘看，脸上都写着牛逼或装逼，流同样多的汗，进满是IT民工的企业，对着同样尺寸的显示屏，吃同样价格的便当，加同样时间的班。偶尔会坐地铁去趟城里或回趟家，偶尔错过了最末班公车跟人拼车打的或坐小黑车，偶尔去小饭馆腐败下，偶尔自己买三两小菜小试牛刀。这里不需要什么生存指南，生活在这里，就好像是你站在原地不动，人群也会带着你去买包子挤公交上班，而你如果稍不留神的话，会发现，咦，自己又满身臭汗地回到家了。人群会指着你一路向南的。 说到生活，其实我想说“生活在拉稀，而我在便秘”。用这两个吸引眼球的词语无他意，只是想说生活节奏有点快，我有些不适应，思维有些阻塞。也许原来在南京懒散惯了，享受惯了上班只要走五分钟的轻松，可以打一天酱油毫无愧疚感的惬意。其实现在这样真是好事，要学游泳还是要去深水区学，在儿童区打打闹闹是学不会的。王朔的小说《橡皮人》描述过这样一群在都市生活的年轻人，他们如同工艺品，“被高高在上的观赏者轮流捏拿玩弄，被生活的泥匠用压力捏成各种形态”。我想我是不会成为橡皮人的，要做就做弹簧人。 如果每个人都是在自己的那条船上漂，如果那些点点滴滴的小事那些说过的云飞雪落不经意却记得的话是海上的风，那么一个人不属于平静的情绪便是由风吹起的浪花了。如果浪涛的拍打让坐船的你左右摇摆翻江倒海，如果你架起双桨劈风斩浪，如果你足够幸运很快迎来风平浪静，你拍拍胸脯骄傲地说，也就这样嘛。这时候你转过身发现，自己早就不在原来的地方，那些风和那些景一去不复返。然后你笑了，站在船头高唱“两岸猿声啼不住，轻舟已过万重山”。唱完，然后你泪流满面。 一个人一生到底会有百分之多少的时间花在路上。去学院自习室的路上，去厕所的路上，去汇杰广场的路上，去张江高科地铁站的路上，去喜欢的姑娘楼下的路上，去火车站北广场的路上，去玉兰四期家乐福买烤鸡的路上，去孟猪家蹭饭的路上，去茶水间泡杯饮料的路上，去超市买柠檬的路上，去邮局拿家里寄过来的被子的路上。知道了这个比例，我估计自己会蛋疼菊紧发誓珍惜时间云云。可是人活着并不是目的而是个过程，在路上也是属于这个过程的一部分，而不仅仅是为了达到一个目的。身体在赶路，脑子不一定要跟着赶路。 我想成为什么样的人。人傻，钱多，很多很多的钱。和人讨论PS3, iPhone, iPad, iMac, Wii, 蓝光，背投，机械鼠标，概念鼠标，GFW，宽带山。穿大裤衩人字拖，读GReader南方周末上推特，去哪都扛个iPad N代。征婚时介绍：人傻，钱多，速来。 毕业之前我想我会一个人出去旅行一次。要去就去远一点的地方，问谁借个单反装下样子，抓个破一点的包，要是iPad 2已经出了，买了塞包里，再塞两件衣服。多走路，多看，多拍，多吃。想想就来感。 没想到米兰昆德拉30多年前就帮我拟好了文章的题目。拿来一用，倒也切合现在的生活。现在是生活在别处，我希望将来能够变成生活在别墅。等到风景都看透，也许会最后回去看看细水长流。 　　胸中那可爱的洪水猛兽们，拿早点醒过来好伐啦~ 　　njuxjy@2010.08]]></description>
			<content:encoded><![CDATA[<p>来上海已经有一个多月了。</p>
<ol>
<li>很早以前有个日本作家来上海“放荡形骸”了一番，回岛国后写了本叫《魔都》的书，记录了那段时间在上海的各种腐败体验。于是现在上海不情不愿地被冠以了“魔都”的称号。相对于魔都上海，我们还有帝都北京、妖都广州。我居住过的另一座城市南京也有个叫魔都的称号，所以一般称南京为小魔都，上海为大魔都。而无锡又不情不愿地被称为“小上海”，所以我从无锡滚到南京，再从南京滚到上海，就是从小小魔都滚到小魔都再滚到大魔都的过程。<br /> 
<li>网上流传着一篇很长的叫《魔都生存指南》的东西。作为一个标准吃货的作者，花了百分之四十的篇幅介绍了上海的公厕、语言、建筑、交通、气候、治安、休闲、购物等方面，剩下百分之六十的文字都用来介绍各种边边脚脚的腐败去处。作为一名偏居魔都东部小镇的IT民工兼吃货，只能含泪将网页收下，放入“以后再看”的文件夹中。有个地方我倒是天天可以经过，可以去试试：<br />
<blockquote>
<p>魔都生存指南：张江地铁站美食点评特别篇&#8211;好吃的芝士蛋糕和面包“毂屋”其实真不需要多介绍了网上对他家的芝士蛋糕好评太多了，中午的意面或者三明治套餐也非常棒。特别推荐袋包装的野生酵母面包，发的不是很蓬松特别好吃，下班顺便带一袋回去吧
<p>魔都生存指南：张江地铁站美食点评特别篇&#8211;地道的台湾小炒“龙门客栈”算是地铁站里比较精致的一家饭店了，比费尼阁要好吃不知道多少，基本上在张江中餐也就百草的味道可以和他比一比了，但是价格就划算大多了。我特别推荐一个菜单上没有的&#8211;九层塔菜圃蛋</p>
</blockquote>
<li>我住的那地方和生存指南没什么关系。周围有跟你同样的一大群人，和你揣同样的梦想，同样的早起，去同一个包子铺买肉包，挤同一辆公车，盯着同一个漂亮姑娘看，脸上都写着牛逼或装逼，流同样多的汗，进满是IT民工的企业，对着同样尺寸的显示屏，吃同样价格的便当，加同样时间的班。偶尔会坐地铁去趟城里或回趟家，偶尔错过了最末班公车跟人拼车打的或坐小黑车，偶尔去小饭馆腐败下，偶尔自己买三两小菜小试牛刀。这里不需要什么生存指南，生活在这里，就好像是你站在原地不动，人群也会带着你去买包子挤公交上班，而你如果稍不留神的话，会发现，咦，自己又满身臭汗地回到家了。人群会指着你一路向南的。<br /> 
<li>说到生活，其实我想说“生活在拉稀，而我在便秘”。用这两个吸引眼球的词语无他意，只是想说生活节奏有点快，我有些不适应，思维有些阻塞。也许原来在南京懒散惯了，享受惯了上班只要走五分钟的轻松，可以打一天酱油毫无愧疚感的惬意。其实现在这样真是好事，要学游泳还是要去深水区学，在儿童区打打闹闹是学不会的。王朔的小说《橡皮人》描述过这样一群在都市生活的年轻人，他们如同工艺品，“被高高在上的观赏者轮流捏拿玩弄，被生活的泥匠用压力捏成各种形态”。我想我是不会成为橡皮人的，要做就做弹簧人。<br /> 
<li>如果每个人都是在自己的那条船上漂，如果那些点点滴滴的小事那些说过的云飞雪落不经意却记得的话是海上的风，那么一个人不属于平静的情绪便是由风吹起的浪花了。如果浪涛的拍打让坐船的你左右摇摆翻江倒海，如果你架起双桨劈风斩浪，如果你足够幸运很快迎来风平浪静，你拍拍胸脯骄傲地说，也就这样嘛。这时候你转过身发现，自己早就不在原来的地方，那些风和那些景一去不复返。然后你笑了，站在船头高唱“两岸猿声啼不住，轻舟已过万重山”。唱完，然后你泪流满面。<br /> 
<li>一个人一生到底会有百分之多少的时间花在路上。去学院自习室的路上，去厕所的路上，去汇杰广场的路上，去张江高科地铁站的路上，去喜欢的姑娘楼下的路上，去火车站北广场的路上，去玉兰四期家乐福买烤鸡的路上，去孟猪家蹭饭的路上，去茶水间泡杯饮料的路上，去超市买柠檬的路上，去邮局拿家里寄过来的被子的路上。知道了这个比例，我估计自己会蛋疼菊紧发誓珍惜时间云云。可是人活着并不是目的而是个过程，在路上也是属于这个过程的一部分，而不仅仅是为了达到一个目的。身体在赶路，脑子不一定要跟着赶路。<br /> 
<li>我想成为什么样的人。人傻，钱多，很多很多的钱。和人讨论PS3, iPhone, iPad, iMac, Wii, 蓝光，背投，机械鼠标，概念鼠标，GFW，宽带山。穿大裤衩人字拖，读GReader南方周末上推特，去哪都扛个iPad N代。征婚时介绍：人傻，钱多，速来。<br /> 
<li>毕业之前我想我会一个人出去旅行一次。要去就去远一点的地方，问谁借个单反装下样子，抓个破一点的包，要是iPad 2已经出了，买了塞包里，再塞两件衣服。多走路，多看，多拍，多吃。想想就来感。<br /> 
<li>没想到米兰昆德拉30多年前就帮我拟好了文章的题目。拿来一用，倒也切合现在的生活。现在是生活在别处，我希望将来能够变成生活在别墅。等到风景都看透，也许会最后回去看看细水长流。</li>
</ol>
<p>　　胸中那可爱的洪水猛兽们，拿早点醒过来好伐啦~</p>
<p>　　<a href="mailto:njuxjy@2010.08">njuxjy@2010.08</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiaojiayi.com/2011/07/14/%e7%94%9f%e6%b4%bb%e5%9c%a8%e5%88%ab%e5%a4%84/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>电面准备</title>
		<link>http://www.xiaojiayi.com/2011/07/14/%e7%94%b5%e9%9d%a2%e5%87%86%e5%a4%87/</link>
		<comments>http://www.xiaojiayi.com/2011/07/14/%e7%94%b5%e9%9d%a2%e5%87%86%e5%a4%87/#comments</comments>
		<pubDate>Thu, 14 Jul 2011 15:53:12 +0000</pubDate>
		<dc:creator>njuxjy</dc:creator>
				<category><![CDATA[生活]]></category>

		<guid isPermaLink="false">http://www.xiaojiayi.com/?p=107</guid>
		<description><![CDATA[电面过很多次，无外乎问这么几块内容：英语自我介绍、英语介绍项目、项目相关、实习经历、技术问题。项目经历和实习经历说过无数遍了，不需要特别准备了，除非做更多的大项目，否则把现有的那些不起眼的小项目说得再熟也加不了多少分。技术问题面太广，且各公司重点都不一样，因此只能靠平时积累，不过关于设计模式的东西有的公司喜欢问，并且这玩意就那么点东西，所以这个可以准备下。所以下面写的东西我打算打印出来放身边，以便电面时参考。包括英文自我介绍、英文项目介绍和设计模式。 ==================================================================== 英文自我介绍My name is Xiaojiayi. I’m now a graduate student in my first year in Software Institute, Nanjing University for my master’s degree. My major is software engineering. I got my bachelor’s degree also in software institute, Nanjing University in July, 2009. I have strong interest in c++ now, and I wanna devote myself [...]]]></description>
			<content:encoded><![CDATA[<p>电面过很多次，无外乎问这么几块内容：英语自我介绍、英语介绍项目、项目相关、实习经历、技术问题。项目经历和实习经历说过无数遍了，不需要特别准备了，除非做更多的大项目，否则把现有的那些不起眼的小项目说得再熟也加不了多少分。技术问题面太广，且各公司重点都不一样，因此只能靠平时积累，不过关于设计模式的东西有的公司喜欢问，并且这玩意就那么点东西，所以这个可以准备下。所以下面写的东西我打算打印出来放身边，以便电面时参考。包括英文自我介绍、英文项目介绍和设计模式。</p>
<p>====================================================================</p>
<p><b>英文自我介绍<br /></b>My name is Xiaojiayi. I’m now a graduate student in my first year in Software Institute, Nanjing University for my master’s degree. My major is software engineering. I got my bachelor’s degree also in software institute, Nanjing University in July, 2009. I have strong interest in c++ now, and I wanna devote myself to the development of c++ applications. In my spare time, I like basketball, reading and blogging. Ok, that’s all.</p>
<p>&nbsp;</p>
<p><b>英文项目介绍<br /></b><b>1) Android Exam Review System<br /></b>I’ll say something about the Android exam review system. The system is designed for those who want to do tests on their mobile phones at any time and anywhere. The test type includes GRE, TOFEL, IELTS and so on. Function modules of the system include practice mode, test mode, error problem mode, and history analysis. I got familiar with the development of the Android machine man interaction application through this project. <b>2) Movie Tickets Booking System Based on Java Web<br /></b>I’ll say something about the Movie Tickets Booking System Based on Java Web. The project is completed on my own as my graduation project, which took me several months to finish it. It’s used for demo only without any commercial value. Function modules of the system include booking tickets online, browsing film information, back-stage management and so on. It is developed by Ajax, integrated with Struts framework and Hibernate framework. Through this project I got familiar with the developing process of J2EE applications.</p>
<p>&nbsp;</p>
<p><b>设计模式</b>
<p><i>1. </i><i>简单工厂模式</i>
<p>一个Simple Factory生产成品，而对客户端隐藏产品产生的细节。实作时定义一个产品介面，并透过特定静态方法来建立成品
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://www.xiaojiayi.com/wp-content/uploads/2011/07/clip_image002.jpg" width="499" height="184">
<p><i>2. </i><i>抽象工厂模式</i>
<p>将具体的Product封装在具体Factory实现中，而客户仍只要面对Factory与Product的抽象介面，避免依赖于具 体的Factory与Product，由于Factory封装了所必须的Product，所以要更换掉所有的元件，只要简单的抽换掉Factory就可以了，不用修改客户端的代码
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image004" border="0" alt="clip_image004" src="http://www.xiaojiayi.com/wp-content/uploads/2011/07/clip_image004.jpg" width="561" height="259">
<p>如果要更换所有的视感元件，就只要抽象掉具体的Factory就可以了，例如：
<p>CustomDialog windowsDialog =<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new CustomDialog(new WindowsWidgetFactory());<br />windowsDialog.showDialog();<br />CustomDialog macDialog =<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new CustomDialog(new MacWidgetFactory());<br />macDialog.showDialog();
<p>在CustomDialog类中保存IButton和ITextField两个引用，在其构造函数中调用setWidgetFactory函数：
<p>public void setWidgetFactory(IWidgetFactory widgetFactory) {<br />setButton(widgetFactory.getButton());<br />setTextField(widgetFactory.getTextField());<br />}
<p><i>3. </i><i>工厂方法模式</i>
<p>在一个抽象类中留下某个创建元件的抽象方法没有实现，其它与元件操作相关联的方法都先依赖于元件所定义的接口，而不是依赖于元件的实现，当成品中有一个或多个元件无法确定时，您先确定与这些元件的接口，然后用元件的抽象接口先完成其它的工作，元件的实现则推迟至实现元件接口的子类完成，一旦元件加入，即可完成您的成品。
<p>假设要完成一个文件编辑器，希望这个编辑器可以适用于所有类型的档案编辑，例如RTF、DOC、TXT等等，尽管这些文件有着不同的格式，先确定的是这些文件必然具备的一些接口，例如储存、开启、关闭等等，您用一个IDocument类型来进行操作，这么一来这个框架就无需考虑实 际的储存、开启等细节是如何进行的。
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://www.xiaojiayi.com/wp-content/uploads/2011/07/clip_image006.jpg" width="496" height="316"></p>
<pre>public void newDocument() { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document = createDocument(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.open();&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; public void saveDocument() { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(document != null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.save(); &nbsp;&nbsp;&nbsp;&nbsp; }</pre>
<p><i>4. </i><i>单件模式</i> </p>
<p>public class Singleton {<br />&nbsp;&nbsp;&nbsp; private static Singleton instance = new Singleton();<br />&nbsp;&nbsp;&nbsp; private Singleton() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // &#8230;.<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public static Singleton getInstance() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return instance;<br />&nbsp;&nbsp;&nbsp; }<br />} //可以避免多线程问题 </p>
<p><i>5. </i><i>组合模式</i> </p>
<p>将对象表示成树形结构来表示整体-部分的层次结构，使得用户对单个对象和组合对象的处理具有一致性。 </p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image008" border="0" alt="clip_image008" src="http://www.xiaojiayi.com/wp-content/uploads/2011/07/clip_image008.jpg" width="414" height="341"> </p>
<p><i>6. </i><i>装饰者模式</i> </p>
<p>动态地给一个对象增加一些额外的职责。 </p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image009" border="0" alt="clip_image009" src="http://www.xiaojiayi.com/wp-content/uploads/2011/07/clip_image009.jpg" width="449" height="254"> </p>
<p><b>public abstract class Decorator extends VisualComponent {</b><b><br />&nbsp;&nbsp;&nbsp; protected VisualComponent component;<br />&nbsp;&nbsp;&nbsp; public Decorator(VisualComponent component) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.component = component;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public void draw() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; component.draw();<br />&nbsp;&nbsp;&nbsp; }<br />}<br />public class ScrollDecorator extends Decorator {<br />&nbsp;&nbsp;&nbsp; public ScrollDecorator(VisualComponent component) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(component);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public void draw() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.draw();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scrollTo();<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public void scrollTo() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // &#8230;.<br />&nbsp;&nbsp;&nbsp; }<br />}</b> </p>
<p><b>ScrollDecorator scrollDecorator =</b><b> </b><b><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ScrollDecorator(new TextView());</b> </p>
<p><i>7. </i><i>策略模式</i> </p>
<p>定义一系列的算法，把它们一个个封装起来，并使它们可互相替换，使算法可以独立于使用它的客户而变化。 </p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image010" border="0" alt="clip_image010" src="http://www.xiaojiayi.com/wp-content/uploads/2011/07/clip_image010.jpg" width="471" height="160"></p>
<pre>public abstract class TextStrategy { &nbsp;&nbsp;&nbsp;&nbsp; protected String text;&nbsp;&nbsp;&nbsp;&nbsp; public TextStrategy(String text) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.text = text; &nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; public abstract String replace(); 
} </pre>
<pre>public class LinuxStrategy extends TextStrategy { &nbsp;&nbsp;&nbsp;&nbsp; public LinuxStrategy(String text) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(text); &nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; public String replace() { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; preOperation(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text = text.replaceAll("@r@n", "@n")); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; postOperation(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return text; &nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; private void preOperation() { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("LinuxStrategy preOperation"); &nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; private void postOperation() { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("LinuxStrategy postOperation"); &nbsp;&nbsp;&nbsp;&nbsp; } 
} </pre>
<pre>public class TextCharChange { &nbsp;&nbsp;&nbsp;&nbsp; public static void replace(TextStrategy strategy) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strategy.replace(); &nbsp;&nbsp;&nbsp;&nbsp; } 
}</pre>
<p><i>8. </i><i>命令模式</i> </p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image012" border="0" alt="clip_image012" src="http://www.xiaojiayi.com/wp-content/uploads/2011/07/clip_image012.gif" width="554" height="351"> </p>
<p>1. <b>public</b> <b>class</b> Invoker {&nbsp;&nbsp;
<p>2. <b>private</b> Command command;&nbsp;&nbsp;
<p>3. <b>public</b> <b>void</b> setOrder(Command command) {&nbsp;&nbsp;
<p>4. <b>this</b>.command = command;&nbsp;&nbsp;
<p>5.&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;
<p>6. <b>public</b> <b>void</b> ExecuteCommand() {&nbsp;&nbsp;
<p>7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; command.ExecuteCommand();&nbsp;&nbsp;
<p>8.&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;
<p>9. } </p>
<p>1. <b>public</b> <b>abstract</b> <b>class</b> Command {&nbsp;&nbsp;
<p>2. <b>protected</b> Receiver receiver;&nbsp;&nbsp;
<p>3. <b>public</b> Command(Receiver receiver){&nbsp;&nbsp;
<p>4. <b>this</b>.receiver = receiver;&nbsp;&nbsp;
<p>5.&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;
<p>6. <b>public</b> <b>abstract</b> <b>void</b> ExecuteCommand();&nbsp;&nbsp;
<p>7. }&nbsp;
<p>1. <b>public</b> <b>class</b> ConcreteCommand <b>extends</b> Command {&nbsp;&nbsp;
<p>2. <b>public</b> ConcreteCommand(Receiver receiver){&nbsp;&nbsp;
<p>3. <b>super</b>(receiver);&nbsp;&nbsp;
<p>4.&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;
<p>5. @Override </p>
<p>6. <b>public</b> <b>void</b> ExecuteCommand() {&nbsp;&nbsp;
<p>7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; receiver.Execute();&nbsp;&nbsp;
<p>8.&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;
<p>9. }&nbsp;
<p>1. <b>public</b> <b>class</b> Receiver {&nbsp;&nbsp;
<p>2. <b>public</b> <b>void</b> Execute(){&nbsp;&nbsp;
<p>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&#8220;Receiver excute!&#8221;);&nbsp;&nbsp;
<p>4.&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;
<p>5. }&nbsp;
<p>1. <b>public</b> <b>class</b> Client {&nbsp;&nbsp;
<p>2. <b>public</b> <b>static</b> <b>void</b> main(String[] args) {&nbsp;&nbsp;
<p>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Receiver r = <b>new</b> Receiver();&nbsp;&nbsp;
<p>4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Command c = <b>new</b> ConcreteCommand(r);&nbsp;&nbsp;&nbsp;
<p>5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Invoker i = <b>new</b> Invoker();&nbsp;&nbsp;
<p>6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i.setOrder(c);&nbsp;&nbsp;
<p>7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i.ExecuteCommand();&nbsp;&nbsp;
<p>8.&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;
<p>9. }&nbsp;
<p><i>9. </i><i>适配器模式</i> </p>
<p>将一个类的接口转换成客户希望的另外一个接口，使得原本由于接口不兼容而不能一起工作的类可以一起工作。 </p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image013" border="0" alt="clip_image013" src="http://www.xiaojiayi.com/wp-content/uploads/2011/07/clip_image013.gif" width="528" height="198"> </p>
<p><i>10. </i><i>Façade</i><i>模式</i> </p>
<p>为子系统中的一组接口提供一个一致的界面，定义了一个高层接口，此接口使得这个子系统更加容易使用 </p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image015" border="0" alt="clip_image015" src="http://www.xiaojiayi.com/wp-content/uploads/2011/07/clip_image015.jpg" width="454" height="347"> </p>
<p>Façade：为调用方法定义简单的调用接口 </p>
<p>Client：通过Façade接口调用提供某功能的内部类群 </p>
<p>Package：提供功能的模块或子系统 </p>
<p><i>11. </i><i>模板方法模式</i> </p>
<p>定义一个操作中的算法的骨架，而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 </p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image016" border="0" alt="clip_image016" src="http://www.xiaojiayi.com/wp-content/uploads/2011/07/clip_image016.jpg" width="416" height="255"></p>
<pre>public abstract class AbstractClass { &nbsp;&nbsp;&nbsp; public void templateMethod() { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // step by step template to solve something&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // implementor should follow those step&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; opStep1();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; opStep2();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; opStep3();&nbsp;&nbsp;&nbsp;&nbsp;     }&nbsp;&nbsp;&nbsp;&nbsp; public abstract void opStep1(); &nbsp;&nbsp;&nbsp; public abstract void opStep2(); &nbsp;&nbsp;&nbsp; public abstract void opStep3();
} </pre>
<pre>public class ConcreteClass extends AbstractClass { &nbsp;&nbsp;&nbsp; public abstract void opStep1() {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // implement the real operation&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; public abstract void opStep2() { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // implement the real operation &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; public abstract void opStep3() { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // implement the real operation &nbsp;&nbsp;&nbsp; } }</pre>
<p>对于一些程序而言，我们希望规定一些处理的步骤、流程或骨架，就像是上例中的step1到step3一样，至于流程中的step1到step3如何实现并不规定，而留给实现的人自行决定，这就是Template Method模式的目的</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiaojiayi.com/2011/07/14/%e7%94%b5%e9%9d%a2%e5%87%86%e5%a4%87/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>说点故事</title>
		<link>http://www.xiaojiayi.com/2011/07/14/%e8%af%b4%e7%82%b9%e6%95%85%e4%ba%8b/</link>
		<comments>http://www.xiaojiayi.com/2011/07/14/%e8%af%b4%e7%82%b9%e6%95%85%e4%ba%8b/#comments</comments>
		<pubDate>Thu, 14 Jul 2011 15:51:05 +0000</pubDate>
		<dc:creator>njuxjy</dc:creator>
				<category><![CDATA[生活]]></category>

		<guid isPermaLink="false">http://www.xiaojiayi.com/?p=96</guid>
		<description><![CDATA[元旦回去姐夫跟我聊起汪峰，说他原来是搞乐队的，名字叫鲍家街43号，是他大学的门牌号。然后我开玩笑说我以后也弄个乐队，叫汉口路22号。他一听乐了说那他的叫张家村40号，专搞乡村音乐。好吧，汉口路22号以后是肯定要写的，现在想说点在创业新村住那会儿的故事，应该是5幢12单元401。前几天在卓越上买书的时候这个地址刚被我从地址簿里面删除了，记得以前每次网购东西都特方便，快递员直接送到门口，我总是一边提着裤子，一边喊来了来了，然后签字画押感谢关门转身拆封一气呵成，一来二去，这个地址不可避免地让我留下了很深刻的印象，就像小区超市的营业员mm、生意可以不做牌不能不打的超市老板、脸部分辨率很低的韩国人、门口饭店的肥肠炒饭加两个蛋、周边的小吃摊、旁边中学每天喇叭里的广播体操眼保健操和熟女房东丰满的胸部一样，迄今记忆犹新。我想，这个地方这辈子是不会再去了，手机里房东的号码也删除了，这个人这辈子也不会再联系了。我想了下我这个博客更新速度如此慢的原因，可能是下面的几点：一、生活匆匆向前，虽然空闲发呆扯淡无聊的时间很多，但这些时间号称努力奋斗的我并没有打算用在停下来思考人生这件事上，而是原本打算用来多看两本专业书、多写两行代码、多积累一些装逼资本，然而落得两手空空的我不仅和自己的梦想渐行渐远，也没有工夫留下点思考的痕迹，总是急着去陷入下一个恶性循环里；二、目前居住条件所限，和同学蜗居在很小的房间内，连我看个毛片的私人空间也没有，更别说很注重隐私的我想写点隐私的东西了；三、滞后性，当时不写，喜欢拖一阵子再说，拖的时间长想想算了吧，也没啥热情了，等到以后想写的什么时发现经历了那么多事不知从何写起。今天同学跑回家过寒假去了，我一个人独占十几平米豪宅，私人空间和寂寞都回来了，晚上躺床上听歌，听得眼泪哗哗，心想，操！这不就是我在创业新村那会儿吗？只不过那会儿我听一会歌流一会眼泪以后还得爬起来捡起那本翻烂了的高数开始啃，现在可以在床上肆意翻滚，让寂寞在体内肆意翻滚，老子就不起来。我记得我是08年的4月份跟zt两人为了考研在那租的房，70多平米，二室一厅一厨一卫，每个月房租400。现在只能感慨乡下的房子太便宜了，同样是400，我在这里只能住10几平米，还是合租。我们两个用了一个礼拜配齐了所有的设备，包括碗、筷、铁锅、铲子、菜刀、电饭煲、电热水壶、打气筒、油盐酱醋葱蒜辣椒、床上用品等等等，把一个几乎什么都没的毛坯房整成像模像样可以住人的地方。这个地方离浦口大学骑车不过10分钟，我们隔三差五会去学校里转转，去学院里上上课。小区挺安静，有篮球场，超市饭店菜场报亭小吃都有，这里住着各种外地人，韩国人尤其多。是不是韩国人不用开口就能看出来。他们不管男的女的，都喜欢戴个帽子，弄副黑框眼镜，大冬天喜欢穿短裤拖鞋，头发肯定是长的，出现肯定是一群的，说话肯定是红萝卜青萝卜的。我经常在一家现在记不起名字的饭馆吃炒饭，那家饭馆和旁边的超市是连着的，是同一个老板开的，老板娘偶尔会穿着高跟鞋噔噔从身边走过，老板会在老板娘不在的时候和几个女员工打打小情骂骂小俏摸摸小手。很欣慰我喜欢的那个超市mm没有被摸过，或者没在店里摸过。我第一次见她是我第一次去超市里买废纸篓拖把，姑娘年纪与我相仿，淡妆，穿那种很俗的裤袜，牛仔裙，声音偏硬，但长的水灵，付钱时看了我几眼，我也看了她几眼，没说话。有时候我在隔壁吃午饭她蹦跶进来聊天，我吃一口炒饭，抬头瞄她两眼，有时候我感觉她也瞄我两眼，不过可能是错觉。我吃完就擦擦嘴回去看书，所以我和她说过的话不超过10句，多是这样的对话，“就拿这些”“一共23块钱”，“有蓝色笔芯么”“有，你要几支”。作为一个闷骚且单身的男性，对话是如此简洁，简洁得都让我蛋疼，我一蛋疼就想写诗给她。我还真写了首诗，不过是自己写着玩的，没啥内容，也全忘了，但我记得里面有“今夜”和“精液”两个蠢蠢欲动的词，代表当时对她的喜欢只是一种朦胧的考研中的男人的身体的一部分的寂寞而已。后来我再也没有见过她。zt的老婆基本每两个礼拜来这住几天，zt住的大房间，我一个人住一间小一点的。他们每次来都自己做饭吃，我有幸蹭了他们好多次饭，有时候把猴子及其夫人一起叫来吃饭，两对情侣加一光棍，倒也其乐融融。zt和夫人很会做菜，并且享受一起下厨的每一分钟。他们总是白天一起去图书馆看书，下午两三点坐公交去离江大桥不远的苏果买各种菜和各种调料，回来夫唱妇随做饭炒菜，有时候还会哼点小曲。他说他们云南做菜调料很讲究，从我的观察来看是放调料放的比这里多很多，换句话说是口味挺重的。云南人喜欢吃辣，自己家里会做点调味酱。据猴子说zt带的自己家做的酱很好吃。zt做菜不管原料多简单，哪怕只有土豆和肉丝，他给你捣鼓个很赞的土豆泥出来，再来点青椒，就又多了一道青椒炒土豆丝，弄点挂面，煎两鸡蛋，一顿中饭可以吃的很饱了。这些都他一个人弄的，我一般负责吃和洗碗。 在创业新村的日子可以分为两段，分水岭是09年1月10号这天，确切说是下午5点平静走出考场笑说要去找工作了的那一刻，后来阅卷中心没有给我这个机会，我丢盔弃甲几个月后又重新做回了学生，从乡下的学生做到了城里的学生，从每年捐一万六稍微上点课到无偿捐两万几乎没上课，当然这都是后话了。1月10号以前，过着折腾中求稳定的生活，1月10号以后，过着稳定中求折腾的生活。我现在记得最清楚的是暑假上文登考研的情景。我和zt每天6点就要起床，骑车15分钟到浦大后门，等那里6点55分的班车接送。第一个接的是我们，所以上车都有位子坐。由于大四出了我们院都搬去了鼓楼，所以这里要考研的只有我们院和三本的没几个人。大多上了车就开始打一会盹。车子沿途会经过好几个院校接人，后来上车的比我们还不幸，都站着，而且很挤。我和zt基本都坐最后排，好看看美女。现在还记得当时在车上以及在班上经常看到的一对情侣，女的长不错。zt跟我说，不知他们上冲刺班的时候会不会还是一起来一起走，我说那时候天冷，他们穿上了衣服就认不出来了。车子可能会在江大桥上堵一会车，这是常事，也是南京人的常识，过了江大桥，一路向东南方向的东南大学奔去，到那正好上课。上课地点是东大的礼堂，三层楼，听有幸坐一楼的同学说底下的空调打巨冷，我们迟到的都坐三楼，三楼没一点冷气，纯蒸桑拿。座位是电影院那种，记笔记只好弯着腰翘个腿本子放上面写，上午三个多小时，下午三个多小时。中午学校门口随便吃点盒饭，回去干坐着用本子猛扇。对于一个午后必睡午觉、颈椎极度敏感、讨厌出汗以后发粘的皮肤的人，一边竖中指一边使大脑真空状聊以自慰。当时反而希望一直出汗，好感觉像在蒸桑拿，用新一轮的汗液冲掉那种浑身黏黏的感觉。一开始的10天全是数学，基本每天做的事情就是往那一坐，开始抄老师幻灯片下的每一道题，一天7小时手从没停过，笔每两天要换一支，压根不想他在讲什么，抄下来再说，想也想不懂，因为那会数学书还没看过，抄这些只是为了以后复习的时候看看。实际上那个暑假拼死抄回来的一本多的笔记后来从来没有翻过。考研班全是shit，但他愿打你也愿挨，钱就这么赚，不用指望他们会像开源软件一样把他们的源代码公开。zt很猛，发了39度的烧还坚持一边记笔记一边思考，所以考虑到他后来的事还挺为他惋惜的。这段时间还去宁波和上海玩了两趟。虽然跟很多人比，我复习远谈不上认真二字，但两个月的闭关依然让我有窒息的感觉。这期间的唯一的出口也许就是每天23点以后校内上发发牢骚装装逼，看到别人回复我才感觉到自己和这个世界是连在一起的，而笔记本屏幕在那些个漆黑的夜里就像一个光明的出口，闷骚如我也需要通过这个出口用一串串0和1交换一些别人对我的关注，比如看毛概实在无聊时候发个“一边看《墓碑：中国六十年代大饥荒纪实》一边看毛概的感觉真爽，就像被人轮了还夸人技术好一样。”，那时候还没用twitter，只能当校内日志发，企图说些荤段子吸引别人跟我聊聊天，无奈很快被删帖了。又比如临考前两天发张这样的图壮壮胆 &#160; 无奈也被删帖了。比如跟人发誓说一定7点起床，出于道德约束这招还挺管用的。关于这段时间的一些体会，以前写过，会贴在文章最后。 我又开始拖了，09年的流水账以后再写，累了，打打睡了，附上《挑研之初体验》。 ====================================================================== 从 11号下午将专业课的卷子小心放进密封袋交给pp的监考mm开始，到现在已经打了整整4天酱油了。在第四天的半夜，想继前年寒假的那篇游记之后，第二次认 真地总结下一些日子。对于这段日子，我有过彷徨，有过崩溃，有过麻木，快乐也有，不多。一路的中指竖下来，最后自己也累了，老老实实地看书和崩溃，竟也活 着过来了。如今还敝帚自珍地将它分享，哎怎么说呢，大家多半是高考过的，明白这种感觉。这篇文章里，你不会看到关于某门课的复习攻略，不会看到具体复习方法指导；你可以看到的是，一个并不成功的考研er在讲述他并不牛逼的经历以及他从中获得的东西。我不知道该从何写起，我脑子里只有不停闪过的一些关键词，和一条时间推进的主线。那么，不妨就用基于时间顺序特性的意识流手法来完成它罢。============分割线一条================================首先要解释下什么叫考研。她包含两个部分，第一个是准备考试，第二个是考试。这与大学里的专业课考试有所不同，后者通常只包含第二个部分。正是由于当初对 第一部分过于乐观的估计，我迷糊地走上了考研这条路。考研考4门，政治100分，英语100分，数学150分，专业课150分。考研的动机。引用同学的话，没有办法才考研。也有同学认为这是一种理想。我并没有独立自主地做决定，我尊重了家长的意思。原有印象。在我脑中的一个牛逼的考研er的形象应该是这样的：每天6点半起床，背个书包拿个水杯，匆匆去食堂吃早饭，争取7点半前到教室开始看书，然后除 了吃饭时间一直看书至晚上10点半回宿舍再看一个小时书然后睡觉。于是我选择了报自己院，传说中只要一个月就能考上，我采纳了辅导员的意见，准备9月份开 学开始复习。考研难度递增的顺序是本校本系到本校跨系到外校本系到外校跨系。我作了最偷懒的选择。同学说你考自己院那是相当轻松，我现在的回答是，吃得苦 是一样多的，轻松只体现在考上的可能性上。总的历程。3月份做完决定，4月份和同学租房，到6月底为止每天打酱油比在宿舍还过得还醉生梦死，7月份有20天的政治和数学的强化班，熬过后8月回家玩了一个月，9月份开始看数学，月底回去玩了大半个月，真正认真看是从10月中旬开始。============分割线一条================================以下是一些关键词。关键词之一，“非智力因素的决定作用 ”。如同做其他所有事情一样，一个人的思维习惯在考研中的作用不容小觑。1.考研是体力活，不是技术活。它体现的是付出与收获的正比关系。我自己不是少数 极有天赋的声称能一个月搞定的人，因此我只有老老实实地看书。2.考研比较适合单细胞的人，他们做事容易投入和持久，而对于想法很多的人，很难专注地从事 长时间的系统工程，那就让自己的意志去发挥作用吧。3.在需要理解记忆的环节，如数学中的定理公式，政治的大题等，从小养成的记忆习惯是影响效率的重要因 素。从小我背课文都是要求一字不差的背下来，然后才能得到家长“已背”的签字，我在准备考研政治大题的时候觉得很吃力，我知道应该背层次而不是背逐个句 子，但我很难改正我的背书方法。这也是为什么有的人政治看个一遍就行，而我看下来觉得脑子里空的，尤其对于邓论部分需要大量记忆的东西。平时注重思维训 练，记忆先从整体上把握，其余的细枝末节，吹罢，写作文还不会么。4.性格因素。有人乐观，有人悲观。这决定了你会不会老想考不上怎么办，会不会因为谁谁 谁今天看了100页书而你只看了30页而懊恼不已，会不会因为今天去修车胎耽误了一小时而郁闷，会不会因为某天的计划没有完成而焦虑，会不会考前紧张得失 眠等等。5.自律能力。这决定了你今天下午是看三部电影还是做30道题，吃完午饭晚饭是直接跑教室还是先去机房上个百合校内，闹钟7点响是拔了电池板继续 睡还是揉着双眼去冲咖啡，心里翻江倒海的时候是抓起电话找人倾诉还是安静地在床上躺会，看到别人拿了牛offer在机房dota会不会仍然保持微笑。关键词之二,“慢就是快”。这句开车以及搞经济需要注意的话在考研上同样适用。我们不要企图“大跃进”。当初我片面追求速度的增长，忽视了质量和效益的提高，造成的结果是一遍李 永乐下来，该忘的全忘了，不该忘的也差不多了。第一遍做的时候囫囵吞枣，课后习题没做，这样一天下来虽然看着几十页心里挺有成就感，但记忆效果很不好。两 遍下来的效果跟慢慢地做一遍基本相当，花的时间要多好多。数学就是该做题做题做题，一条一条，必做细，必做透，然后才做多。关键词之三，“有挑战的目标”。将目标设定成需要尽全力才能达到，强迫自己用全力，并且达到后有更大的成就感。这一点体现在报名的时候可以报外校和外系。关键词之四，“奥卡姆剃刀”。这个原理大意是化简你的生活，能简则简。但是，贪婪的我始终没有勇敢地拿起这把剃刀来简化自己。我最大的心里障碍是拿得起，放不下。“我们试图占有一 切，而这往往把我们弄得精疲力竭。”长期以来我的思维习惯都是追求利益的最大化，比如每天总是为明天列下长长的to do list，唯恐漏掉一件，如若只列一两件，会觉得明天肯定会过得特空洞。这是TDL带来的负面效果，仿佛离开了TDL人就不会做事了，实际上抹杀了人的主 观能动性，把生活当程序来机械处理。比如放了一堆书在旁边作为明天的任务，同时还窃喜，明天看完就牛逼了。结果无一例外&#8211;看不完，累到死，心情很不好。 冗杂的任务会让你无法集中精力到手边的事情，旁边一坨没看的书压在心头滋味不好受。“何不把悲哀感觉假设是来自你虚构”。这些焦虑的产生并非你要实现的目 的本身带来的，是你人为造成的。用一天时间尝试下简化后的生活，恩，胃口好了，脑子也不短路了，吃嘛嘛香。关键词之五，“改革、发展与稳定”。稳定是改革与发展的基础和保证。所谓稳定，即在同一处看书，同一时刻吃饭睡觉起床，每天保证稳定的学习时间。我的考研生活过得很不稳定。一眼看过去， 一路的动荡和不安。我看过书的地方有6处，租房、软院自习室、机房、图书馆、教学楼、自己家里，没有哪处是坚持满一个礼拜的。期间我还跟随找工作的大军在 城乡间来回参加了若干次笔试和一次面试，拿了我的处女offer并拒之。由于没有长期占座，在期末临近时候在透不过气的软院自习室找座位。考研班的来回奔 波。就这样把部分能量花在了这些进程的切换上。我经历的考研和我理想中的差距很大。关键词之六，“拔掉你的网线”。以前有同学到快考试的时候会大喊“我再不玩魔兽世界啦”，然后把游戏删掉，当时暗笑他过两天自己肯定又装了。不过我在需要用电脑看课件的时候发现这是 有一定效果的。当我电脑插着网线时候，每隔几分钟不自觉地就会去双击火狐的图标，打开来看几张网页，或者点开电驴，看看速度怎么样，然后再看几张课件。然 后我拔网线试试，我发现自己每次有开网页的念头时，都会因为“懒得去插网线”这个可笑的念头而终止自己的行为。同样的例子在吃瓜子的时候也出现，眼睛盯着 屏幕看电影，手从袋子里一颗接一颗地捻起瓜子往嘴里送。也没什么特别的欲望非要吃瓜子，但就是吃完一颗接着一颗，吃得嘴皮子都要破了还不停，然后发誓说这 是最后一颗了，马上再不吃了，过五分钟手又去抓了吃。然后就把袋子对折一下放进抽屉里。结果自己就“懒得”打开抽屉去拿了。可能的原因是：人类潜意识里会 将做一件事的成本与其价值进行比较，然后作出更有利于自身需要的决定。对于那些本无所谓做与不做的事情，其价值稍微不及我们做它所需要的成本，于是我们就 “懒得”去做了。关键词之七,“写下要做的”。好处一是第二天比较省力，可以不去想过会要干什么。好处二是不会忘记要做的事。坏处是如果执行力差没完成，心情受影响，并且会让自己怀疑这样做到底有 没有价值。考前一个月我写下了当天要准备下英语作文的模板，当天没完成，第二天又写了一下，又没完成。最后我英语模板是在1月8号晚上弄好的，拖了一个 月。其实也就4个小时的工作量而已。============分割线一条================================考研，这个古老而神秘的字眼在我很小时就进入了我视野，伴随而来总有她神奇的令人“为伊消得人憔悴”的魔力。如今自己亲自揭开了她的面纱，一品其独特风味， 虽然不能用来装B，但也能自豪地说出“咱也是经历过考研的人了”这样的“豪言壮语”，人生不可避免地又完整了一些。。。絮絮叨叨讲了半天， 自己也累了，还好跑题跑得不算太远。理论上考研还没有结束，现在盖棺定论未免过早。因此我只能说些自己的经历和体会，至于怎样复习和准备，比我有发言权的 大有人在，我也不好意思献丑。我还是自己的风格，写不了高深莫测的东西，咱就说点实话，也算为自己留下点东西。njuxjy @ 09.01.15]]></description>
			<content:encoded><![CDATA[<p>元旦回去姐夫跟我聊起汪峰，说他原来是搞乐队的，名字叫鲍家街43号，是他大学的门牌号。然后我开玩笑说我以后也弄个乐队，叫汉口路22号。他一听乐了说那他的叫张家村40号，专搞乡村音乐。好吧，汉口路22号以后是肯定要写的，现在想说点在创业新村住那会儿的故事，应该是5幢12单元401。前几天在卓越上买书的时候这个地址刚被我从地址簿里面删除了，记得以前每次网购东西都特方便，快递员直接送到门口，我总是一边提着裤子，一边喊来了来了，然后签字画押感谢关门转身拆封一气呵成，一来二去，这个地址不可避免地让我留下了很深刻的印象，就像小区超市的营业员mm、生意可以不做牌不能不打的超市老板、脸部分辨率很低的韩国人、门口饭店的肥肠炒饭加两个蛋、周边的小吃摊、旁边中学每天喇叭里的广播体操眼保健操和熟女房东丰满的胸部一样，迄今记忆犹新。我想，这个地方这辈子是不会再去了，手机里房东的号码也删除了，这个人这辈子也不会再联系了。<br />我想了下我这个博客更新速度如此慢的原因，可能是下面的几点：一、生活匆匆向前，虽然空闲发呆扯淡无聊的时间很多，但这些时间号称努力奋斗的我并没有打算用在停下来思考人生这件事上，而是原本打算用来多看两本专业书、多写两行代码、多积累一些装逼资本，然而落得两手空空的我不仅和自己的梦想渐行渐远，也没有工夫留下点思考的痕迹，总是急着去陷入下一个恶性循环里；二、目前居住条件所限，和同学蜗居在很小的房间内，连我看个毛片的私人空间也没有，更别说很注重隐私的我想写点隐私的东西了；三、滞后性，当时不写，喜欢拖一阵子再说，拖的时间长想想算了吧，也没啥热情了，等到以后想写的什么时发现经历了那么多事不知从何写起。今天同学跑回家过寒假去了，我一个人独占十几平米豪宅，私人空间和寂寞都回来了，晚上躺床上听歌，听得眼泪哗哗，心想，操！这不就是我在创业新村那会儿吗？只不过那会儿我听一会歌流一会眼泪以后还得爬起来捡起那本翻烂了的高数开始啃，现在可以在床上肆意翻滚，让寂寞在体内肆意翻滚，老子就不起来。<br />我记得我是08年的4月份跟zt两人为了考研在那租的房，70多平米，二室一厅一厨一卫，每个月房租400。现在只能感慨乡下的房子太便宜了，同样是400，我在这里只能住10几平米，还是合租。我们两个用了一个礼拜配齐了所有的设备，包括碗、筷、铁锅、铲子、菜刀、电饭煲、电热水壶、打气筒、油盐酱醋葱蒜辣椒、床上用品等等等，把一个几乎什么都没的毛坯房整成像模像样可以住人的地方。这个地方离浦口大学骑车不过10分钟，我们隔三差五会去学校里转转，去学院里上上课。小区挺安静，有篮球场，超市饭店菜场报亭小吃都有，这里住着各种外地人，韩国人尤其多。是不是韩国人不用开口就能看出来。他们不管男的女的，都喜欢戴个帽子，弄副黑框眼镜，大冬天喜欢穿短裤拖鞋，头发肯定是长的，出现肯定是一群的，说话肯定是红萝卜青萝卜的。<br />我经常在一家现在记不起名字的饭馆吃炒饭，那家饭馆和旁边的超市是连着的，是同一个老板开的，老板娘偶尔会穿着高跟鞋噔噔从身边走过，老板会在老板娘不在的时候和几个女员工打打小情骂骂小俏摸摸小手。很欣慰我喜欢的那个超市mm没有被摸过，或者没在店里摸过。我第一次见她是我第一次去超市里买废纸篓拖把，姑娘年纪与我相仿，淡妆，穿那种很俗的裤袜，牛仔裙，声音偏硬，但长的水灵，付钱时看了我几眼，我也看了她几眼，没说话。有时候我在隔壁吃午饭她蹦跶进来聊天，我吃一口炒饭，抬头瞄她两眼，有时候我感觉她也瞄我两眼，不过可能是错觉。我吃完就擦擦嘴回去看书，所以我和她说过的话不超过10句，多是这样的对话，“就拿这些”“一共23块钱”，“有蓝色笔芯么”“有，你要几支”。作为一个闷骚且单身的男性，对话是如此简洁，简洁得都让我蛋疼，我一蛋疼就想写诗给她。我还真写了首诗，不过是自己写着玩的，没啥内容，也全忘了，但我记得里面有“今夜”和“精液”两个蠢蠢欲动的词，代表当时对她的喜欢只是一种朦胧的考研中的男人的身体的一部分的寂寞而已。后来我再也没有见过她。<br />zt的老婆基本每两个礼拜来这住几天，zt住的大房间，我一个人住一间小一点的。他们每次来都自己做饭吃，我有幸蹭了他们好多次饭，有时候把猴子及其夫人一起叫来吃饭，两对情侣加一光棍，倒也其乐融融。zt和夫人很会做菜，并且享受一起下厨的每一分钟。他们总是白天一起去图书馆看书，下午两三点坐公交去离江大桥不远的苏果买各种菜和各种调料，回来夫唱妇随做饭炒菜，有时候还会哼点小曲。他说他们云南做菜调料很讲究，从我的观察来看是放调料放的比这里多很多，换句话说是口味挺重的。云南人喜欢吃辣，自己家里会做点调味酱。据猴子说zt带的自己家做的酱很好吃。zt做菜不管原料多简单，哪怕只有土豆和肉丝，他给你捣鼓个很赞的土豆泥出来，再来点青椒，就又多了一道青椒炒土豆丝，弄点挂面，煎两鸡蛋，一顿中饭可以吃的很饱了。这些都他一个人弄的，我一般负责吃和洗碗。 <br />在创业新村的日子可以分为两段，分水岭是09年1月10号这天，确切说是下午5点平静走出考场笑说要去找工作了的那一刻，后来阅卷中心没有给我这个机会，我丢盔弃甲几个月后又重新做回了学生，从乡下的学生做到了城里的学生，从每年捐一万六稍微上点课到无偿捐两万几乎没上课，当然这都是后话了。1月10号以前，过着折腾中求稳定的生活，1月10号以后，过着稳定中求折腾的生活。我现在记得最清楚的是暑假上文登考研的情景。我和zt每天6点就要起床，骑车15分钟到浦大后门，等那里6点55分的班车接送。第一个接的是我们，所以上车都有位子坐。由于大四出了我们院都搬去了鼓楼，所以这里要考研的只有我们院和三本的没几个人。大多上了车就开始打一会盹。车子沿途会经过好几个院校接人，后来上车的比我们还不幸，都站着，而且很挤。我和zt基本都坐最后排，好看看美女。现在还记得当时在车上以及在班上经常看到的一对情侣，女的长不错。zt跟我说，不知他们上冲刺班的时候会不会还是一起来一起走，我说那时候天冷，他们穿上了衣服就认不出来了。车子可能会在江大桥上堵一会车，这是常事，也是南京人的常识，过了江大桥，一路向东南方向的东南大学奔去，到那正好上课。上课地点是东大的礼堂，三层楼，听有幸坐一楼的同学说底下的空调打巨冷，我们迟到的都坐三楼，三楼没一点冷气，纯蒸桑拿。座位是电影院那种，记笔记只好弯着腰翘个腿本子放上面写，上午三个多小时，下午三个多小时。中午学校门口随便吃点盒饭，回去干坐着用本子猛扇。对于一个午后必睡午觉、颈椎极度敏感、讨厌出汗以后发粘的皮肤的人，一边竖中指一边使大脑真空状聊以自慰。当时反而希望一直出汗，好感觉像在蒸桑拿，用新一轮的汗液冲掉那种浑身黏黏的感觉。一开始的10天全是数学，基本每天做的事情就是往那一坐，开始抄老师幻灯片下的每一道题，一天7小时手从没停过，笔每两天要换一支，压根不想他在讲什么，抄下来再说，想也想不懂，因为那会数学书还没看过，抄这些只是为了以后复习的时候看看。实际上那个暑假拼死抄回来的一本多的笔记后来从来没有翻过。考研班全是shit，但他愿打你也愿挨，钱就这么赚，不用指望他们会像开源软件一样把他们的源代码公开。zt很猛，发了39度的烧还坚持一边记笔记一边思考，所以考虑到他后来的事还挺为他惋惜的。这段时间还去宁波和上海玩了两趟。虽然跟很多人比，我复习远谈不上认真二字，但两个月的闭关依然让我有窒息的感觉。这期间的唯一的出口也许就是每天23点以后校内上发发牢骚装装逼，看到别人回复我才感觉到自己和这个世界是连在一起的，而笔记本屏幕在那些个漆黑的夜里就像一个光明的出口，闷骚如我也需要通过这个出口用一串串0和1交换一些别人对我的关注，比如看毛概实在无聊时候发个“一边看《墓碑：中国六十年代大饥荒纪实》一边看毛概的感觉真爽，就像被人轮了还夸人技术好一样。”，那时候还没用twitter，只能当校内日志发，企图说些荤段子吸引别人跟我聊聊天，无奈很快被删帖了。又比如临考前两天发张这样的图壮壮胆</p>
<p>&nbsp;<img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="1" border="0" alt="1" src="http://www.xiaojiayi.com/wp-content/uploads/2011/07/12.jpg" width="303" height="403"> </p>
<p>无奈也被删帖了。比如跟人发誓说一定7点起床，出于道德约束这招还挺管用的。关于这段时间的一些体会，以前写过，会贴在文章最后。 <br />我又开始拖了，09年的流水账以后再写，累了，打打睡了，附上《挑研之初体验》。</p>
<p>======================================================================</p>
<p>从 11号下午将专业课的卷子小心放进密封袋交给pp的监考mm开始，到现在已经打了整整4天酱油了。在第四天的半夜，想继前年寒假的那篇游记之后，第二次认 真地总结下一些日子。对于这段日子，我有过彷徨，有过崩溃，有过麻木，快乐也有，不多。一路的中指竖下来，最后自己也累了，老老实实地看书和崩溃，竟也活 着过来了。如今还敝帚自珍地将它分享，哎怎么说呢，大家多半是高考过的，明白这种感觉。<br />这篇文章里，你不会看到关于某门课的复习攻略，不会看到具体复习方法指导；你可以看到的是，一个并不成功的考研er在讲述他并不牛逼的经历以及他从中获得的东西。<br />我不知道该从何写起，我脑子里只有不停闪过的一些关键词，和一条时间推进的主线。那么，不妨就用基于时间顺序特性的意识流手法来完成它罢。<br />============分割线一条================================<br />首先要解释下什么叫考研。她包含两个部分，第一个是准备考试，第二个是考试。这与大学里的专业课考试有所不同，后者通常只包含第二个部分。正是由于当初对 第一部分过于乐观的估计，我迷糊地走上了考研这条路。考研考4门，政治100分，英语100分，数学150分，专业课150分。<br />考研的动机。引用同学的话，没有办法才考研。也有同学认为这是一种理想。我并没有独立自主地做决定，我尊重了家长的意思。<br />原有印象。在我脑中的一个牛逼的考研er的形象应该是这样的：每天6点半起床，背个书包拿个水杯，匆匆去食堂吃早饭，争取7点半前到教室开始看书，然后除 了吃饭时间一直看书至晚上10点半回宿舍再看一个小时书然后睡觉。于是我选择了报自己院，传说中只要一个月就能考上，我采纳了辅导员的意见，准备9月份开 学开始复习。考研难度递增的顺序是本校本系到本校跨系到外校本系到外校跨系。我作了最偷懒的选择。同学说你考自己院那是相当轻松，我现在的回答是，吃得苦 是一样多的，轻松只体现在考上的可能性上。<br />总的历程。3月份做完决定，4月份和同学租房，到6月底为止每天打酱油比在宿舍还过得还醉生梦死，7月份有20天的政治和数学的强化班，熬过后8月回家玩了一个月，9月份开始看数学，月底回去玩了大半个月，真正认真看是从10月中旬开始。<br />============分割线一条================================<br />以下是一些关键词。<br />关键词之一，“<strong>非智力因素的决定作用</strong> ”。如同做其他所有事情一样，一个人的思维习惯在考研中的作用不容小觑。1.考研是体力活，不是技术活。它体现的是付出与收获的正比关系。我自己不是少数 极有天赋的声称能一个月搞定的人，因此我只有老老实实地看书。2.考研比较适合单细胞的人，他们做事容易投入和持久，而对于想法很多的人，很难专注地从事 长时间的系统工程，那就让自己的意志去发挥作用吧。3.在需要理解记忆的环节，如数学中的定理公式，政治的大题等，从小养成的记忆习惯是影响效率的重要因 素。从小我背课文都是要求一字不差的背下来，然后才能得到家长“已背”的签字，我在准备考研政治大题的时候觉得很吃力，我知道应该背层次而不是背逐个句 子，但我很难改正我的背书方法。这也是为什么有的人政治看个一遍就行，而我看下来觉得脑子里空的，尤其对于邓论部分需要大量记忆的东西。平时注重思维训 练，记忆先从整体上把握，其余的细枝末节，吹罢，写作文还不会么。4.性格因素。有人乐观，有人悲观。这决定了你会不会老想考不上怎么办，会不会因为谁谁 谁今天看了100页书而你只看了30页而懊恼不已，会不会因为今天去修车胎耽误了一小时而郁闷，会不会因为某天的计划没有完成而焦虑，会不会考前紧张得失 眠等等。5.自律能力。这决定了你今天下午是看三部电影还是做30道题，吃完午饭晚饭是直接跑教室还是先去机房上个百合校内，闹钟7点响是拔了电池板继续 睡还是揉着双眼去冲咖啡，心里翻江倒海的时候是抓起电话找人倾诉还是安静地在床上躺会，看到别人拿了牛offer在机房dota会不会仍然保持微笑。<br />关键词之二,“<strong>慢就是快</strong>”。这句开车以及搞经济需要注意的话在考研上同样适用。我们不要企图“大跃进”。当初我片面追求速度的增长，忽视了质量和效益的提高，造成的结果是一遍李 永乐下来，该忘的全忘了，不该忘的也差不多了。第一遍做的时候囫囵吞枣，课后习题没做，这样一天下来虽然看着几十页心里挺有成就感，但记忆效果很不好。两 遍下来的效果跟慢慢地做一遍基本相当，花的时间要多好多。数学就是该做题做题做题，一条一条，必做细，必做透，然后才做多。<br />关键词之三，“<strong>有挑战的目标</strong>”。将目标设定成需要尽全力才能达到，强迫自己用全力，并且达到后有更大的成就感。这一点体现在报名的时候可以报外校和外系。<br />关键词之四，“<strong>奥卡姆剃刀</strong>”。这个原理大意是化简你的生活，能简则简。但是，贪婪的我始终没有勇敢地拿起这把剃刀来简化自己。我最大的心里障碍是拿得起，放不下。“我们试图占有一 切，而这往往把我们弄得精疲力竭。”长期以来我的思维习惯都是追求利益的最大化，比如每天总是为明天列下长长的to do list，唯恐漏掉一件，如若只列一两件，会觉得明天肯定会过得特空洞。这是TDL带来的负面效果，仿佛离开了TDL人就不会做事了，实际上抹杀了人的主 观能动性，把生活当程序来机械处理。比如放了一堆书在旁边作为明天的任务，同时还窃喜，明天看完就牛逼了。结果无一例外&#8211;看不完，累到死，心情很不好。 冗杂的任务会让你无法集中精力到手边的事情，旁边一坨没看的书压在心头滋味不好受。“何不把悲哀感觉假设是来自你虚构”。这些焦虑的产生并非你要实现的目 的本身带来的，是你人为造成的。用一天时间尝试下简化后的生活，恩，胃口好了，脑子也不短路了，吃嘛嘛香。<br />关键词之五，“<strong>改革、发展与稳定</strong>”。稳定是改革与发展的基础和保证。所谓稳定，即在同一处看书，同一时刻吃饭睡觉起床，每天保证稳定的学习时间。我的考研生活过得很不稳定。一眼看过去， 一路的动荡和不安。我看过书的地方有6处，租房、软院自习室、机房、图书馆、教学楼、自己家里，没有哪处是坚持满一个礼拜的。期间我还跟随找工作的大军在 城乡间来回参加了若干次笔试和一次面试，拿了我的处女offer并拒之。由于没有长期占座，在期末临近时候在透不过气的软院自习室找座位。考研班的来回奔 波。就这样把部分能量花在了这些进程的切换上。我经历的考研和我理想中的差距很大。<br />关键词之六，“<strong>拔掉你的网线</strong>”。以前有同学到快考试的时候会大喊“我再不玩魔兽世界啦”，然后把游戏删掉，当时暗笑他过两天自己肯定又装了。不过我在需要用电脑看课件的时候发现这是 有一定效果的。当我电脑插着网线时候，每隔几分钟不自觉地就会去双击火狐的图标，打开来看几张网页，或者点开电驴，看看速度怎么样，然后再看几张课件。然 后我拔网线试试，我发现自己每次有开网页的念头时，都会因为“懒得去插网线”这个可笑的念头而终止自己的行为。同样的例子在吃瓜子的时候也出现，眼睛盯着 屏幕看电影，手从袋子里一颗接一颗地捻起瓜子往嘴里送。也没什么特别的欲望非要吃瓜子，但就是吃完一颗接着一颗，吃得嘴皮子都要破了还不停，然后发誓说这 是最后一颗了，马上再不吃了，过五分钟手又去抓了吃。然后就把袋子对折一下放进抽屉里。结果自己就“懒得”打开抽屉去拿了。可能的原因是：人类潜意识里会 将做一件事的成本与其价值进行比较，然后作出更有利于自身需要的决定。对于那些本无所谓做与不做的事情，其价值稍微不及我们做它所需要的成本，于是我们就 “懒得”去做了。<br />关键词之七,“<strong>写下要做的</strong>”。好处一是第二天比较省力，可以不去想过会要干什么。好处二是不会忘记要做的事。坏处是如果执行力差没完成，心情受影响，并且会让自己怀疑这样做到底有 没有价值。考前一个月我写下了当天要准备下英语作文的模板，当天没完成，第二天又写了一下，又没完成。最后我英语模板是在1月8号晚上弄好的，拖了一个 月。其实也就4个小时的工作量而已。<br />============分割线一条================================<br />考研，这个古老而神秘的字眼在我很小时就进入了我视野，伴随而来总有她神奇的令人“为伊消得人憔悴”的魔力。如今自己亲自揭开了她的面纱，一品其独特风味， 虽然不能用来装B，但也能自豪地说出“咱也是经历过考研的人了”这样的“豪言壮语”，人生不可避免地又完整了一些。。。<br />絮絮叨叨讲了半天， 自己也累了，还好跑题跑得不算太远。理论上考研还没有结束，现在盖棺定论未免过早。因此我只能说些自己的经历和体会，至于怎样复习和准备，比我有发言权的 大有人在，我也不好意思献丑。我还是自己的风格，写不了高深莫测的东西，咱就说点实话，也算为自己留下点东西。<br />njuxjy @ 09.01.15</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiaojiayi.com/2011/07/14/%e8%af%b4%e7%82%b9%e6%95%85%e4%ba%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>句子们（08.某月.某日~09.12.07）</title>
		<link>http://www.xiaojiayi.com/2011/07/14/%e5%8f%a5%e5%ad%90%e4%bb%ac%ef%bc%8808-%e6%9f%90%e6%9c%88-%e6%9f%90%e6%97%a509-12-07%ef%bc%89/</link>
		<comments>http://www.xiaojiayi.com/2011/07/14/%e5%8f%a5%e5%ad%90%e4%bb%ac%ef%bc%8808-%e6%9f%90%e6%9c%88-%e6%9f%90%e6%97%a509-12-07%ef%bc%89/#comments</comments>
		<pubDate>Thu, 14 Jul 2011 15:47:49 +0000</pubDate>
		<dc:creator>njuxjy</dc:creator>
				<category><![CDATA[生活]]></category>

		<guid isPermaLink="false">http://www.xiaojiayi.com/?p=94</guid>
		<description><![CDATA[来源：互联网 上联： 空姐走光，是否有机可乘下联1：姨妈上岗，能否后门通融下联2：护士加班，早晚虚位以待 大爷，给妞笑一个 谜面：相亲。打一软件术语。谜底：面向对象 谜面：吻。猜一软件术语。谜底：接口 多年前我曾提案3月7日为少女节，理由是3月7日跟3月8日只差一日，少女和妇女也只差一日。 做为裆的干部,手先要深入裙中,撩解裙中,想裙中之所想,急裙中之所急 办事时深入浅出,要真抓湿干,遇湿俱进,玩枪姘勃。只有善解人衣,把握鸡遇,急鸡进取,坚持不泄 与裙中同进出共性福,才能最终掀起裙中性运动高潮,让裙中满意,让裆放心&#160; 看到如此雄壮的尾巴，终于明白女生为何爱养猫了 要固执地、一个劲地让自己出丑，直到习以为常&#8212;-萧伯纳 恐惧皆衍生于无知和不确定 甲：“听说经济学家总在说谎。你能否告诉我，如何判定他在说谎？” 　　乙：“经济学家大都比较诚实，很少掩饰。你只要注意他的嘴就行了，嘴一动，他就在说谎。” 有一天微软拼音被人打伤了，警察询问他事情的经过，微软拼音激动地说：当时搜狗拼音实在打得太快了…… 偷爸妈的安全套，打一歇后语 回答：装孙子 厕所墙上“向前一小步，文明一大步！”用英语怎么翻译？ 　　答: Fire in the hole 一群伟大的科学家死后在天堂里玩藏猫猫，轮到爱因斯坦抓人，他数到100睁开眼睛，看到所有人都藏起来了，只有牛顿还站在那里。爱因斯坦走过去说：“牛顿，我抓住你了。”牛顿：“不，你没有抓到牛顿。”爱因斯坦：“你不是牛顿你是谁？”牛顿：“你看我脚下是什么？”爱因斯坦低头看到牛顿站在一块长宽都是一米的正方形的地板砖上，不解。牛顿：“我脚下这是一平方米的方块，我站在上面就是牛顿/平方米，所以你抓住的不是牛顿，你抓住的是帕斯卡。” 是这样的张总：你在家里的电脑上按了CTRL+C，然后在公司的电脑上再按CTRL+V是肯定不行的。即使同一篇文章也不行。不不，多贵的电脑都不行。 “恋”是个很强悍的字。它的上半部取自“变态”的“变”，下半部取自“变态”的“态”。 I wanna 弄爆你 弄爆你 爆菊 眼睛蛇和大象约会，寒暄一番后说：“来就来吧，还牵这么大头猪，客气了。” 我已经把你们包围了~~~ 结婚就是从无妻徒刑改判有妻徒刑的过程 我喜欢一只动物并非取决于它的毛色、品种什么的，而是取决于佐料和火候。 从前有一只熊猫，它到一家饭店点了菜就开始吃，吃完之后掏出一把枪乱放几枪走了。饭店的老板就问它，你为什么要这样做？熊猫就说，你查一下字典。老板发现字典上写着: Panda:an animal,eats shoots and leaves. 焦点访谈认为：google，g代表g点，oo代表双乳和睾丸，l代表男性生殖器，e代表英文西化，念起来是“股沟”，它是彻底的低俗、反动、色情。 西游记告诉我们：凡是有后台的妖怪都被接走了，凡是没后台的都被一棒子打死了。 单位就像一棵爬满猴子的大树，向上看全是屁股，向下看全是笑脸，左右看全是耳目。 我是白领：今天领了薪水，交了房租水电，买了油米泡面，摸了口袋，感叹一声，这个月工资又白领了… 某日在丹佛机场的一班联合航空班机因故停飞，机场柜台人员必须协助大批该班机旅客转搭其它飞机。柜台前排满了办手续的人，这时有一位老兄从排队的人群里一路挤到柜台前，将机票甩在柜台上并说：“我一定得上这班飞机而且是头等舱！”服务的小姐很客气的回答：“先生，我很乐意替您服务，但我得先替这些排在你前面的人服务。”此时这位仁兄很不耐烦的说：“你知道我是谁吗？”只见那位柜台小姐从容的拿起麦克风广播道：“各位旅客请注意，23号柜台前有一位先生不知道自己是谁，如果有哪位旅客能帮他辨识身份的话，烦请到联合航空23号柜台，谢谢！”此时排在后面的旅客都忍不住笑了出来。(还没完………………..！)这位仁兄把脸一摆，瞪着那位小姐，并说：“Fuck you!”只见那位柜台小姐露出和气的微笑回答说：“那您也得先排队才行！” 在职场中就应该像柯南那样，有一种我走到哪就让别人死到哪的霸气 一老外想去故宫，不知道怎么走，找人问路，但把故宫、紫禁城两个词儿弄混了：“请问，紫宫怎么走？”第一个人瞪他一眼，没理他，第二个人说“你没病吧？”，第三个人用手一指：“你妈逼。走到头儿。” 据说，古书上记载：“丰润少年精液最滋补身子，可常驻容颜。” 某人欲拜师学武，至恒山某处，见门前牌匾大书“恒山派”，大为兴奋。近前细看，底下还有“出所”二字 傻老五意外瞧见老三撒尿，颠儿颠儿地跑回去对老四说：老四老三老二老大了 我做饭还行，基本上吃过的人活下来的都说好 唉，其实我也曾青春逼人，可惜现在青春没了，就剩这么个逼人了 [...]]]></description>
			<content:encoded><![CDATA[<p>来源：互联网</p>
<ol>
<li>上联： 空姐走光，是否有机可乘<br />下联1：姨妈上岗，能否后门通融<br />下联2：护士加班，早晚虚位以待
<li>大爷，给妞笑一个
<li>谜面：相亲。打一软件术语。谜底：面向对象
<li>谜面：吻。猜一软件术语。谜底：接口
<li>多年前我曾提案3月7日为少女节，理由是3月7日跟3月8日只差一日，少女和妇女也只差一日。
<li>做为裆的干部,手先要深入裙中,撩解裙中,想裙中之所想,急裙中之所急 办事时深入浅出,要真抓湿干,遇湿俱进,玩枪姘勃。只有善解人衣,把握鸡遇,急鸡进取,坚持不泄 与裙中同进出共性福,才能最终掀起裙中性运动高潮,让裙中满意,让裆放心&nbsp;
<li>看到如此雄壮的尾巴，终于明白女生为何爱养猫了
<li>要固执地、一个劲地让自己出丑，直到习以为常&#8212;-萧伯纳
<li>恐惧皆衍生于无知和不确定
<li>甲：“听说经济学家总在说谎。你能否告诉我，如何判定他在说谎？” 　　<br />乙：“经济学家大都比较诚实，很少掩饰。你只要注意他的嘴就行了，嘴一动，他就在说谎。”
<li>有一天微软拼音被人打伤了，警察询问他事情的经过，微软拼音激动地说：当时搜狗拼音实在打得太快了……
<li>偷爸妈的安全套，打一歇后语 回答：装孙子
<li>厕所墙上“向前一小步，文明一大步！”用英语怎么翻译？ 　　答: Fire in the hole
<li>一群伟大的科学家死后在天堂里玩藏猫猫，轮到爱因斯坦抓人，他数到100睁开眼睛，看到所有人都藏起来了，只有牛顿还站在那里。<br />爱因斯坦走过去说：“牛顿，我抓住你了。”<br />牛顿：“不，你没有抓到牛顿。”<br />爱因斯坦：“你不是牛顿你是谁？”<br />牛顿：“你看我脚下是什么？”<br />爱因斯坦低头看到牛顿站在一块长宽都是一米的正方形的地板砖上，不解。<br />牛顿：“我脚下这是一平方米的方块，我站在上面就是牛顿/平方米，所以你抓住的不是牛顿，你抓住的是帕斯卡。”
<li>是这样的张总：你在家里的电脑上按了CTRL+C，然后在公司的电脑上再按CTRL+V是肯定不行的。即使同一篇文章也不行。不不，多贵的电脑都不行。
<li>“恋”是个很强悍的字。它的上半部取自“变态”的“变”，下半部取自“变态”的“态”。
<li>I wanna 弄爆你 弄爆你 爆菊
<li>眼睛蛇和大象约会，寒暄一番后说：“来就来吧，还牵这么大头猪，客气了。”
<li>我已经把你们包围了~~~
<li>结婚就是从无妻徒刑改判有妻徒刑的过程
<li>我喜欢一只动物并非取决于它的毛色、品种什么的，而是取决于佐料和火候。
<li>从前有一只熊猫，它到一家饭店点了菜就开始吃，吃完之后掏出一把枪乱放几枪走了。饭店的老板就问它，你为什么要这样做？熊猫就说，你查一下字典。老板发现字典上写着: Panda:an animal,eats shoots and leaves.
<li>焦点访谈认为：google，g代表g点，oo代表双乳和睾丸，l代表男性生殖器，e代表英文西化，念起来是“股沟”，它是彻底的低俗、反动、色情。
<li>西游记告诉我们：凡是有后台的妖怪都被接走了，凡是没后台的都被一棒子打死了。
<li>单位就像一棵爬满猴子的大树，向上看全是屁股，向下看全是笑脸，左右看全是耳目。
<li>我是白领：今天领了薪水，交了房租水电，买了油米泡面，摸了口袋，感叹一声，这个月工资又白领了…
<li>某日在丹佛机场的一班联合航空班机因故停飞，<br />机场柜台人员必须协助大批该班机旅客转搭其它飞机。<br />柜台前排满了办手续的人，这时有一位老兄从排队的人群里一路挤到柜台前，<br />将机票甩在柜台上并说：“我一定得上这班飞机而且是头等舱！”<br />服务的小姐很客气的回答：“先生，我很乐意替您服务，但我得先替这些排在你前面的人服务。”<br />此时这位仁兄很不耐烦的说：“你知道我是谁吗？”<br />只见那位柜台小姐从容的拿起麦克风广播道：“各位旅客请注意，23号柜台前有一位先生不知道自己是谁，如果有哪位旅客能帮他辨识身份的话，烦请到联合航空23号柜台，谢谢！”<br />此时排在后面的旅客都忍不住笑了出来。<br />(还没完………………..！)<br />这位仁兄把脸一摆，瞪着那位小姐，并说：“Fuck you!”<br />只见那位柜台小姐露出和气的微笑回答说：“那您也得先排队才行！”
<li>在职场中就应该像柯南那样，有一种我走到哪就让别人死到哪的霸气
<li>一老外想去故宫，不知道怎么走，找人问路，但把故宫、紫禁城两个词儿弄混了：“请问，紫宫怎么走？”第一个人瞪他一眼，没理他，第二个人说“你没病吧？”，第三个人用手一指：“你妈逼。走到头儿。”
<li>据说，古书上记载：“丰润少年精液最滋补身子，可常驻容颜。”
<li>某人欲拜师学武，至恒山某处，见门前牌匾大书“恒山派”，大为兴奋。近前细看，底下还有“出所”二字
<li>傻老五意外瞧见老三撒尿，颠儿颠儿地跑回去对老四说：老四老三老二老大了
<li>我做饭还行，基本上吃过的人活下来的都说好
<li>唉，其实我也曾青春逼人，可惜现在青春没了，就剩这么个逼人了
<li>某哥们儿头天晚上跟女友房事过多，第二天早上起来感叹——囊中羞涩……
<li>臣对巨说：别看一样的面积，咱是三室两厅……
<li>早听说有句话叫“摸着石头过河”，可最近才知道，是有些人只负责摸石头，另一些人负责过河。
<li>“直升机不用来了，我骑自行车回去。”——看见一篇叫“人多的地方突然接了个手机，说句什么话能让大家都觉得你很有钱？”的东西。这是其中一句
<li>现在你骂我，是因为你还不了解我，等你以后了解了我，你一定会动手打我的。
<li>上了年纪最大的好处就是：年轻时得不到的东西，现在你不想要了。
<li>女人结婚有什么用？ &#8211; 有个鸟用。 男同性恋结婚有什么用？ &#8211; 有个屁用。男人为什么结婚，因为想通了。女人为什么结婚，因为想开了。
<li>体贴的男友—男生带着女友散步，路过餐馆。女友赞叹道：“真香啊！”囊中羞涩的男生很绅士地说：“如果你喜欢，我们再从饭馆门前走一次。”
<li>作为一个怪兽，我的愿望是至少消灭一个奥特曼。
<li>诸葛亮出山前也没带过兵啊，你们凭啥要我有工作经验。
<li>泡妞就像挂QQ，每天哄她2个小时，很快就可以太阳了。
<li>悟空，为师今夜想要，请速速变成女妖精
<li>某党高级干部因经济问题外逃，搞得上级很被动。未料几年后，此干部在外生活困顿，萌回国之意，遂托人问讯组织是否批准回国。肯定回复于法不容，否定回复有碍情理。组织接讯反复研究后回复：出国没有经组织审批，回国亦不需组织审批
<li>女：你有房么？男：没问题，我老舅有钱，他可以给我买房子。女：你有车么？男：没问题，这个我老舅也可以帮我买。女：你老舅的手机号是多少？
<li>谢天谢地谢亚龙<br />信神信鬼信兰成<br />横批：足篮打水
<li>村里二傻子老婆长得漂亮。毛主席逝世后，晚上安排社员守灵，支书每天都安排二傻子，他觉得面上很有光。有天别人讲，你夜夜守灵，回去看看你老婆在干嘛！二傻子回家一看支书正同他老婆睡觉。二傻子指着支书哭喊：狗日的，主席都逝世了，你还有心思睡觉，中央禁止一切娱乐活动！
<li>一女工家里房屋漏水，请假一天修房。次日，她托人捎假条给单位，领导一看，吓软双腿，假条写到：房事未完，流水太多，无法控制，特请假再搞一天。
<li>为什麽别人见我就说操？-因为你太能装B
<li>经验就是：当你累积到足够丰富的时候，你发现已经用不上它们了。
<li>《换位思考》黄山旅游不见猴子，管理员解释：都在洞里交配。游客抱怨：放些吃的啊，不就出来了。管理员：换成你，肯出来吗？
<li>周一早上上班在公司电梯里， 一哥们儿从包里掏出手机看时间，然后嘟囔了一句“我艹!” 大家目光都朝他看去，以为他迟到了。结果发现 他手里拿着一个空调遥控器&#8230;
<li>读书时一直暗恋她，但没勇气表白，更没胆量碰她。毕业后，她已经结婚了，老公跟我是同学。那天下午，她抱着娃娃在喂奶，我找了个很好的借口。我走到她面前，一把两手按住她的MIMI，然后跟她娃娃说，喊叔叔，不喊不给吃!
<li>绅士无非就是耐心的狼
<li>嘉宾：我当时都有去跳楼的想法了 鲁豫：那后来跳了么？
<li>美国总统奥巴马荣膺2009诺贝尔和平奖，古巴、越南、北韩、利比亚、伊朗、中国领导人向诺贝尔奖委员会发去了感谢电，均称“谢谢你们套牢了他，这下我放心了！”
<li>两个中药世家联姻,男姓龙,女姓陈。婚夜两人对联:男出上联:龙骨一根,退烧止痒又生津；女对下联:陈皮两片,化痰消肿还解渴;横批:一日见效。
<li>拥挤的北京银行，一女长时间占据取款机，不时打出一张张凭条。我挤在后面的长龙里，等得实在不耐烦，伸头看了一眼，发现屏幕显示“余额不足”，此女仍不停按“取款”钮，收集打出来的凭条。五分钟后，此女手拿厚厚一叠凭条，向洗手间方向走去…自水木社区
<li>“刘惜君，你唱得太好了，我一定要把你留在10强。但是我投给曾轶可，因为你这么<br />强，一定可以有机晋级的。”
<li>等余震的心情，就像初恋的少女等情人，既怕他不来，又怕他乱来
<li>当时我正在和女朋友一起查资料，突然蹦出一个窗口，很黄很暴力，我们赶快把灯给关<br />了。
<li>从前，有个小孩说，打死我也不睡觉。然后他被打死了。
<li>4年没见到老婆了，她去年给我生了个大胖小子……真想回家看看啊。
<li>我朋友的老婆怀孕了,我姓马,求孩子的名字
<li>上联：上海自来水来自海上<br />下联1：日照老年人年老照日<br />下联2：大波美人鱼人美波大<br />下联3：黄山落叶松叶落山黄<br />下联4：明天到操场操到天明 </li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.xiaojiayi.com/2011/07/14/%e5%8f%a5%e5%ad%90%e4%bb%ac%ef%bc%8808-%e6%9f%90%e6%9c%88-%e6%9f%90%e6%97%a509-12-07%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

