<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[jacky_chen's blog--陈龙的个人博客]]></title> 
<description><![CDATA[在自己的天空下，写点什么。]]></description>
<link>http://www.chenlong.jx.cn</link>
<language>zh-cn</language>
<generator>www.emlog.net</generator>

<item>
	<title>乐极生悲</title>
	<link>http://www.chenlong.jx.cn/?post=50</link>
	<description><![CDATA[<p>
	&nbsp;&nbsp;&nbsp;&nbsp;从低谷到高潮然后再到低谷再到半中间，突然想起了乐极生悲这个词，哈哈。从大悲大喜，又从大喜到大悲，很像《爱2》里面张伟&ldquo;被&rdquo;逃婚那段。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;现在脑子都有点混乱了，幸好最近事也不是特别多，不然，脑细胞会很惨。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;还是把正事放在六级上好了，就一个多星期了，速度抱抱佛脚也是必须的。考完六级就是期末考了，XXXX，虽然&ldquo;被&rdquo;考试那么多次了，但是每次考前都感觉过不了，哈哈。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;还是老老实实的静下心吧，感觉这一上午，经历确实很多，现在不想回味了。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;找回生活的主线吧，过完这一个学期，下个学期，就会开始忙乎了。淡定，加油。</p>]]></description>
	<pubDate>Tue, 06 Dec 2011 20:49:56 +0000</pubDate>
	<author>jacky_chen</author>
	<guid>http://www.chenlong.jx.cn/?post=50</guid>

</item>
<item>
	<title>简单的日子</title>
	<link>http://www.chenlong.jx.cn/?post=49</link>
	<description><![CDATA[<p>
	&nbsp;&nbsp;&nbsp;&nbsp;似乎好久没有写东西了，都荒废了。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;不知不觉，毕业都一年多了。马上又要开始研究生的生活了，可谓一步接一步，似乎都在按自己计划着的走，可似乎自己也无法改变。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;天天过着两点一线的生活，或者是说三点一线吧。这段时间，电玩，似乎成了生活中的一个点，嘿嘿。虽然不是天天去，但频率也蛮高的。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;前几天看了偶尔看到了猫的一篇日志，他记了他的生活流水账，感觉很大不一样了哇。高中的同学们都过着很职业化的生活了，而我呢？天天混着日子过，难道是象牙塔里面的生活太好了？这一年，上班的一年，却是和读书没多大的区别。小柳上次回来还跟我讲，你不就比读书的时候多了一个包，看你穿的样子，没啥变化。然后我说，哥老了。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;偶尔也喜欢怀旧，会在想，去年这个时候，我在做什么呢？前年这个时候呢？去年还不是在上班，只不过去年可能还是半新半旧的油条，今年，就已经是老油条了。前年呢？还在憧憬着美好的未来，快乐的聊着QQ。然后呢，还是走入平淡，因为能列出自己的想法，然后最后做选择的人，肯定是经过深思熟虑了。只能一步一步，脚踏实地的走。第一次考研的失败，让我工作了一年。第二次考研成功了，是不是也算努力过，就成功了，哈哈。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;最近在写一套CMS，或者是文章管理系统吧。最直接的催化剂就是上次一个简单的站，我用了讯时文章管理系统。然后，我很惊奇的发现，原来，这四年，我的变化那么大：大一的时候，觉得讯时很牛了，调用简单，功能基本上都有。到现在我又觉得，怎么会有这样的产品咯，感觉很不入流啊。代码混乱，不管是生成的代码，还是调用的代码，还是系统本身的代码。然后，最新的4.5版，我一用，就发现了它两个BUG，我XXXXXX了，最后还是自己动手改的。具体的情况，我写在OSCHINA的博文上。咳。。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;再者，最主要的其实还是自己也想写写。因为，这一年做的东西，都是离市场比较远的，但是自己又不想混日子。总感觉，写代码都写了两三年了，不想仍了，毕竟现在还要也还想靠着这个玩意吃饭。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;简单介绍一下的话，现在整个框架，基本上搭建好了，模版基本上实现了。框架采用的是(弱)MVC的结构（声明，我不知道是不是有弱MVC这么一个说法），没有ORM，有MODEL层，Model-&gt;update，这样调用。搭建这个之类，我倒是看了几个PHP的框架，如：cakephp，yii，CodeIgniter等，只是看了看，运行了一下，没有深入去研究，看了看它们的一些实现。框架主要还是参考了PHPCMS的，模版引擎也是参考了PHPCMS的，但是都有大的修改。比如说，增加了AJAX调用数据，AJAX分页等等。我没有使用过PHPCMS做过站，或者是说，以前要用的话，我还是用asp.net和asp相对较多，我算一个半调子的PHPER吧。毕竟上班的时候，是跟PHP没关系的，用的.net。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;先慢慢的做着吧，胖子说读研的时候一起来做，我说好啊，哥一个人写着也累累的。等能放到网上了，先放到网上，嘿嘿。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;胡扯了这么久了，不想写了。看看小说和火评去，还别说，哥看小说大看了两个多月了，不过现在没感觉了，看不看无所谓了。火影的话，看了有大半年了，从第一集开始看动画，后来看动漫，突然发现爱好又多了两个，哈哈。</p>]]></description>
	<pubDate>Fri, 26 Aug 2011 08:56:07 +0000</pubDate>
	<author>jacky_chen</author>
	<guid>http://www.chenlong.jx.cn/?post=49</guid>

</item>
<item>
	<title>获取窗口句柄（VC）的几种方法</title>
	<link>http://www.chenlong.jx.cn/?post=48</link>
	<description><![CDATA[<p>
	在VC++编程中常需获取控件或窗体句柄，下面总结了几种方法，还希望大家能多多补充。</p>
<p>
	1、自身窗口句柄可用AfxGetMainWnd获取。 <br />
	2、系统中其他APP的窗口句柄可用FindWindow获取(用SPY帮一下忙).<br />
	&nbsp;&nbsp;&nbsp; HWND hBtnClose; <br />
	&nbsp;&nbsp;&nbsp; HWND hWnd=::FindWindow(NULL,&quot;腾讯QQ系统广播&quot;); <br />
	&nbsp;&nbsp; if(hWnd) <br />
	&nbsp; { <br />
	&nbsp;&nbsp;&nbsp; hBtnClose=GetDlgItem(hWnd,2); <br />
	&nbsp;&nbsp;&nbsp; if(hBtnClose) <br />
	&nbsp;&nbsp;&nbsp; PostMessage(hBtnClose,BM_CLICK,NULL,NULL); <br />
	&nbsp; }</p>
<p>
	3、通过指针获取窗口句柄<br />
	&nbsp;&nbsp; HWND hwnd = pwnd-&gt;m_hwnd; //得到它的HWND<br />
	4、当我们想得到一个窗口对象（CWnd的派生对象）指针的句柄（HWND）时，</p>
<p>
	&nbsp;&nbsp;&nbsp; 最安全的方法是使用GetSafeHwnd()函数；<br />
	5、HWND GetDlgltem(HWND hDlg,int nlDDlgltem);<br />
	6、通过控件ID号获取。<br />
	&nbsp;&nbsp;&nbsp; CListCtrl*&nbsp;&nbsp;&nbsp;&nbsp; pleftList&nbsp;&nbsp; =&nbsp;&nbsp; (CListCtrl*&nbsp;&nbsp; )GetDlgItem(IDC_LIST1);</p>]]></description>
	<pubDate>Tue, 22 Feb 2011 14:02:00 +0000</pubDate>
	<author>jacky_chen</author>
	<guid>http://www.chenlong.jx.cn/?post=48</guid>

</item>
<item>
	<title>大型网站架构演变和知识体系</title>
	<link>http://www.chenlong.jx.cn/?post=47</link>
	<description><![CDATA[<p>
	涉及到很多运维的东西，最终目标就是如 Google 一样的<strong><em>进入大型分布式应用时代和廉价服务器群梦想时代。</em></strong></p>
<p>
	这篇文章看似和SEO没有关系，但其实关系很大；没兴趣的看看前四步，有兴趣的争取全文看完。</p>
<p>
	看了 Gaoge 发的北美PPC<a href="http://semwatch.org/2010/01/sem-autobidding-tools" rel="bookmark" title="Permanent Link to SEM 自动化管理工具大起底"><font color="#2970a6"> 自动化管理工具大起底</font></a>，越来越觉得差距之大，SEO 和 PPC 本是同源，但却不同待遇，引用二八理论&ldquo;SEO 驱动了80%的流量，但只获得了20%的营销预算&rdquo;，其余的资金都流进了 PPC，而基于搜索网络的 PPC 也是搜索引擎最赚钱的部分；SEO 一旦做大，就不光是前端方面的问题，所以好好看看本文。</p>
<p>
	不过有点不公道的是：SEO 自动化工具一旦应用，就成了黑帽SEO，是违法的；而 PPC 自动化工具一旦应用成功，鲜花掌声不断。</p>
<p>
	毕竟还是商业的 Google。</p>
<p>
	<strong><span style="font-family: 宋体"><span style="font-size: 14pt"><span style="font-family: 宋体">架构演变第一步：物理分离</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">和数据库</span></span></span></strong><span style="font-family: 宋体">最开始，由于某些想法，于是在互联网上搭建了一个网站，这个时候甚至有可能主机都是租借的，但由于这篇文章我们只关注架构的演变历程，因此就假设这个时候</span> <span style="font-family: 宋体">已经是托管了一台主机，并且有一定的带宽了，这个时候由于网站具备了一定的特色，吸引了 部分人访问，逐渐你发现系统的压力越来越高，响应速度越来越慢，而这个时候比较明显的是数据库和应用互相影响，应用出问题了，数据库也很容易出现问题，而 数据库出问题的时候，应用也容易出问题，于是进入了第一步演变阶段：将应用和数据库从物理上分离，变成了两台机器，这个时候技术上没有什么新的要求，但你 发现确实起到效果了，系统又恢复到以前的响应速度了，并且支撑住了更高的流量，并且不会因为数据库和应用形成互相的影响。</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal">
	<span lang="EN-US"><v:shapetype coordsize="21600,21600" filled="f" id="_x0000_t75" o:preferrelative="t" o:spt="75" path="m@4@5l@4@11@9@11@9@5xe" stroked="f"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path gradientshapeok="t" o:connecttype="rect" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><v:shape id="_x0000_i1025" o:ole="" style="width: 144.75pt; height: 73.5pt" type="#_x0000_t75"><v:imagedata mce_src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image001.emz" o:title="" src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image001.emz"></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img alt="" height="99" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/1.PNG" width="195" /><br />
	&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">这一步架构演变对技术上的知识体系基本没有要求。</span><span lang="EN-US"><br />
	&lt;!--[if !supportLineBreakNewLine]--&gt;<br />
	&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal">
	<strong><span style="font-family: 宋体"><span style="font-size: 14pt">架构演变第二步：增加页面缓存</span></span></strong></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">好景不长，随着访问的人越来越多，你发现响应速度又开始变慢了，查找原因，发现是访问数据库的操作太多，导致数据连接竞争激烈，所以响应变慢，但数据库连</span> <span style="font-family: 宋体">接又不能开太多，否则数据库机器压力会很高，因此考虑采用缓存机制来减少数据库连接资源的竞争和对数据库读的压力，这个时候首先也许会选择采用</span><span lang="EN-US">squid </span><span style="font-family: 宋体">等类似的机制来将系统中相对静态的页面（例如一两天才会有更新的页面）进行缓存（当然，也可以采用将页面静态化的方案），这样程序上可以不做修改，就能够</span> <span style="font-family: 宋体">很好的减少对</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">的压力以及减少数据库连接资源的竞争，</span><span lang="EN-US">OK</span><span style="font-family: 宋体">，于是开始采用</span><span lang="EN-US">squid</span><span style="font-family: 宋体">来做相对静态的页面的缓存。</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal">
	<span lang="EN-US"><v:shape id="_x0000_i1026" o:ole="" style="width: 144.75pt; height: 116.25pt" type="#_x0000_t75"><v:imagedata mce_src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image003.emz" o:title="" src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image003.emz"></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img alt="" height="156" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/2.PNG" width="195" /><br />
	&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">前端页面缓存技术，例如</span><span lang="EN-US">squid</span><span style="font-family: 宋体">，如想用好的话还得深入掌握下</span><span lang="EN-US">squid</span><span style="font-family: 宋体">的实现方式以及缓存的失效算法等。</span></p>
<p class="MsoNormal">
	&nbsp;</p>
<p class="MsoNormal">
	<strong><span style="font-family: 宋体"><span style="font-size: 14pt">架构演变第三步：增加页面片段缓存</span></span></strong></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">增加了</span><span lang="EN-US">squid</span><span style="font-family: 宋体">做缓存后，整体系统的速度确实是提升了，</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">的压力也开始下降了，但随着访问量的增加，发现系统又开始变的有些慢了，在尝</span> <span style="font-family: 宋体">到了</span><span lang="EN-US">squid</span><span style="font-family: 宋体">之类的动态缓存带来的好处后，开始想能不能让现在那些动态页面里相对静态的部分也缓存起来呢，因此考虑采用类似</span><span lang="EN-US">ESI</span><span style="font-family: 宋体">之类的页面片段缓存策略，</span><span lang="EN-US">OK</span><span style="font-family: 宋体">，于是开始采用</span><span lang="EN-US">ESI</span><span style="font-family: 宋体">来做动态页面中相对静态的片段部分的缓存。</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal">
	<span lang="EN-US"><v:shape id="_x0000_i1027" o:ole="" style="width: 252pt; height: 175.5pt" type="#_x0000_t75"><v:imagedata mce_src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image005.emz" o:title="" src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image005.emz"></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img alt="" height="235" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/3.PNG" width="337" /><br />
	&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">页面片段缓存技术，例如</span><span lang="EN-US">ESI</span><span style="font-family: 宋体">等，想用好的话同样需要掌握</span><span lang="EN-US">ESI</span><span style="font-family: 宋体">的实现方式等；</span></p>
<p class="MsoNormal">
	&nbsp;</p>
<p class="MsoNormal">
	<strong><span style="font-family: 宋体"><span style="font-size: 14pt">架构演变第四步：数据缓存</span></span></strong></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">在采用</span><span lang="EN-US">ESI</span><span style="font-family: 宋体">之类的技术再次提高了系统的缓存效果后，系统的压力确实进一步降低了，但同样，随着访问量的增加，系统还是开始变慢，经过查找，可能会发现系</span> <span style="font-family: 宋体">统中存在一些重复获取数据信息的地方，像获取用户信息等，这个时候开始考虑是不是可以将这些数据信息也缓存起来呢，于是将这些数据缓存到本地内存，改变完毕后，完全符合预期，系统的响应速度又恢复了，数据库的压力也再度降低了不少。</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal">
	<span lang="EN-US"><v:shape id="_x0000_i1028" o:ole="" style="width: 255pt; height: 192.75pt" type="#_x0000_t75"><v:imagedata mce_src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image007.emz" o:title="" src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image007.emz"></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img alt="" height="258" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/4.PNG" width="341" /><br />
	&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">缓存技术，包括像</span><span lang="EN-US">Map</span><span style="font-family: 宋体">数据结构、缓存算法、所选用的框架本身的实现机制等。</span></p>
<p class="MsoNormal">
	&nbsp;</p>
<p class="MsoNormal">
	<strong><span style="font-family: 宋体"><span style="font-size: 14pt"><span style="font-family: 宋体">架构演变第五步：</span> <span style="font-family: 宋体">增加</span><span lang="EN-US">webserver</span></span></span></strong></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">好景不长，发现随着系统访问量的再度增加，</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">机器的压力在高峰期会上升到比较高，这个时候开始考虑增加一台</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">，这也是为了同时解决可用性的问题，避免单台的</span><span lang="EN-US">webserver down</span><span style="font-family: 宋体">机的话就没法使用了，在做了这些考虑后，决定增加一台</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">，增加一台</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">时，会碰到一些问题，典型的有：</span><span lang="EN-US"><br />
	1</span><span style="font-family: 宋体">、如何让访问分配到这两台机器上，这个时候通常会考虑的方案是</span><span lang="EN-US">Apache</span><span style="font-family: 宋体">自带的负载均衡方案，或</span><span lang="EN-US">LVS</span><span style="font-family: 宋体">这类的软件负载均衡方案；</span><span lang="EN-US"><br />
	2</span><span style="font-family: 宋体">、如何保持状态信息的同步，例如用户</span><span lang="EN-US">session</span><span style="font-family: 宋体">等，这个时候会考虑的方案有写入数据库、写入存储、</span><span lang="EN-US">cookie</span><span style="font-family: 宋体">或同步</span><span lang="EN-US">session</span><span style="font-family: 宋体">信息等机制等；</span><span lang="EN-US"><br />
	3</span><span style="font-family: 宋体">、如何保持数据缓存信息的同步，例如之前缓存的用户数据等，这个时候通常会考虑的机制有缓存同步或分布式缓存；</span><span lang="EN-US"><br />
	4</span><span style="font-family: 宋体">、如何让上传文件这些类似的功能继续正常，这个时候通常会考虑的机制是使用共享文件系统或存储等；</span><span lang="EN-US"><br />
	</span><span style="font-family: 宋体">在解决了这些问题后，终于是把</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">增加为了两台，系统终于是又恢复到了以往的速度。</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal">
	<span lang="EN-US"><v:shape id="_x0000_i1029" o:ole="" style="width: 255pt; height: 192.75pt" type="#_x0000_t75"><v:imagedata mce_src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image009.emz" o:title="" src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image009.emz"></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img alt="" height="244" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/5.PNG" width="341" /><br />
	&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">负载均衡技术（包括但不限于硬件负载均衡、软件负载均衡、负载算法、</span><span lang="EN-US">linux</span><span style="font-family: 宋体">转发协议、所选用的技术的实现细节等）、主备技术（包括但不限于</span><span lang="EN-US">ARP</span><span style="font-family: 宋体">欺骗、</span><span lang="EN-US">linux heart-beat</span><span style="font-family: 宋体">等）、状态信息或缓存同步技术（包括但不限于</span><span lang="EN-US">Cookie</span><span style="font-family: 宋体">技术、</span><span lang="EN-US">UDP</span><span style="font-family: 宋体">协议、状态信息广播、所选用的缓存同步技术的实现细节等）、共享文件技术（包括但不限于</span><span lang="EN-US">NFS</span><span style="font-family: 宋体">等）、存储技术（包括但不限于存储设备等）。</span></p>
<p class="MsoNormal">
	&nbsp;</p>
<p class="MsoNormal">
	<strong><span style="font-family: 宋体"><span style="font-size: 14pt">架构演变第六步：分库</span></span></strong></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">享受了一段时间的系统访问量高速增长的幸福后，发现系统又开始变慢了，这次又是什么状况呢，经过查找，发现数据库写入、更新的这些操作的部分数据库连接的</span> <span style="font-family: 宋体">资源竞争非常激烈，导致了系统变慢，这下怎么办呢，此时可选的方案有数据库集群和分库策 略，集群方面像有些数据库支持的并不是很好，因此分库会成为比较普遍的策略，分库也就意味着要对原有程序进行修改，一通修改实现分库后，不错，目标达到 了，系统恢复甚至速度比以前还快了。</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal">
	<span lang="EN-US"><v:shape id="_x0000_i1030" o:ole="" style="width: 255pt; height: 192.75pt" type="#_x0000_t75"><v:imagedata mce_src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image011.emz" o:title="" src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image011.emz"></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img alt="" height="243" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/6.PNG" width="341" /><br />
	&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">这一步更多的是需要从业务上做合理的划分，以实现分库，具体技术细节上没有其他的要求；</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">但同时随着数据量的增大和分库的进行，在数据库的设计、调优以及维护上需要做的更好，因此对这些方面的技术还是提出了很高的要求的。</span></p>
<p class="MsoNormal">
	&nbsp;</p>
<p class="MsoNormal">
	<strong><span style="font-family: 宋体"><span style="font-size: 14pt"><span style="font-family: 宋体">架构演变第七步：分表、</span><span lang="EN-US">DAL</span><span style="font-family: 宋体">和分布式缓存</span></span></span></strong><span lang="EN-US"><br />
	</span><span style="font-family: 宋体">随着系统的不断运行，数据量开始大幅度增长，这个时候发现分库后查询仍然会有些慢，于是按照分库的思想开始做分表的工作，当然，这不可避免的会需要对程序</span> <span style="font-family: 宋体">进行一些修改，也许在这个时候就会发现应用自己要关心分库分表的规则等，还是有些复杂的，于是萌生能否增加一个通用的框架来实现分库分表的数据访问，这个在</span><span lang="EN-US">ebay</span><span style="font-family: 宋体">的架构中对应的就是</span><span lang="EN-US">DAL</span><span style="font-family: 宋体">，这个演变的过程相对而言需要花费较长的时间，当然，也有可能这个通用的框架会等到分表做完后才开始做，同时，在这个阶段可</span> <span style="font-family: 宋体">能会发现之前的缓存同步方案出现问题，因为数据量太大，导致现在不太可能将缓存存在本地，然后同步的方式，需要采用分布式缓存方案了，于是，又是一通考察和折磨，终于是将大量的数据缓存转移到分布式缓存上了。</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal">
	<span lang="EN-US"><v:shape id="_x0000_i1031" o:ole="" style="width: 255.75pt; height: 328.5pt" type="#_x0000_t75"><v:imagedata mce_src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image013.emz" o:title="" src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image013.emz"></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img alt="" height="439" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/7.PNG" width="342" /><br />
	&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">分表更多的同样是业务上的划分，技术上涉及到的会有动态</span><span lang="EN-US">hash</span><span style="font-family: 宋体">算法、</span><span lang="EN-US">consistent hash</span><span style="font-family: 宋体">算法等；</span></p>
<p class="MsoNormal">
	<span lang="EN-US">DAL</span><span style="font-family: 宋体">涉及到比较多的复杂技术，例如数据库连接的管理（超时、异常）、数据库操作的控制（超时、异常）、分库分表规则的封装等；</span></p>
<p class="MsoNormal">
	&nbsp;</p>
<p class="MsoNormal">
	<strong><span style="font-family: 宋体"><span style="font-size: 14pt"><span style="font-family: 宋体">架构演变第八步：增加更多的</span><span lang="EN-US">webserver</span></span></span></strong></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">在做完分库分表这些工作后，数据库上的压力已经降到比较低了，又开始过着每天看着访问量暴增的幸福生活了，突然有一天，发现系统的访问又开始有变慢的趋势</span> <span style="font-family: 宋体">了，这个时候首先查看数据库，压力一切正常，之后查看</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">，发现</span><span lang="EN-US">apache</span><span style="font-family: 宋体">阻塞了很多的请求，而应用服务器对每个请求也是比较快的，看来</span> <span style="font-family: 宋体">是请求数太高导致需要排队等待，响应速度变慢，这还好办，一般来说，这个时候也会有些钱了，于是添加一些</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">服务器，在这个添加</span><span lang="EN-US"> webserver</span><span style="font-family: 宋体">服务器的过程，有可能会出现几种挑战：</span><span lang="EN-US"><br />
	1</span><span style="font-family: 宋体">、</span><span lang="EN-US">Apache</span><span style="font-family: 宋体">的软负载或</span><span lang="EN-US">LVS</span><span style="font-family: 宋体">软负载等无法承担巨大的</span><span lang="EN-US">web</span><span style="font-family: 宋体">访问量（请求连接数、网络流量等）的调度了，这个时候如果经费允许的话，会采取的方案是购</span> <span style="font-family: 宋体">买硬件负载，例如</span><span lang="EN-US">F5</span><span style="font-family: 宋体">、</span><span lang="EN-US">Netsclar</span><span style="font-family: 宋体">、</span><span lang="EN-US">Athelon</span><span style="font-family: 宋体">之类的，如经费不允许的话，会采取的方案是将应用从逻辑上做一定的分类，然后分散到不同的软负载集群中；</span><span lang="EN-US"><br />
	2</span><span style="font-family: 宋体">、原有的一些状态信息同步、文件共享等方案可能会出现瓶颈，需要进行改进，也许这个时候会根据情况编写符合网站业务需求的分布式文件系统等；</span><span lang="EN-US"><br />
	</span><span style="font-family: 宋体">在做完这些工作后，开始进入一个看似完美的无限伸缩的时代，当网站流量增加时，应对的解决方案就是不断的添加</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">。</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal">
	<span lang="EN-US"><v:shape id="_x0000_i1032" o:ole="" style="width: 348.75pt; height: 330pt" type="#_x0000_t75"><v:imagedata mce_src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image015.emz" o:title="" src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image015.emz"></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img alt="" height="441" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/8.PNG" width="466" /><br />
	&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">到了这一步，随着机器数的不断增长、数据量的不断增长和对系统可用性的要求越来越高，这个时候要求对所采用的技术都要有更为深入的理解，并需要根据网站的需求来做更加定制性质的产品。</span></p>
<p class="MsoNormal">
	&nbsp;</p>
<p class="MsoNormal">
	<strong><span style="font-family: 宋体"><span style="font-size: 14pt">架构演变第九步：数据读写分离和廉价存储方案</span></span></strong></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">突然有一天，发现这个完美的时代也要结束了，数据库的噩梦又一次出现在眼前了，由于添加的</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">太多了，导致数据库连接的资源还是不够用，而这个时候又已经分库分表了，开始分析数据库的压力状况，可能会发现数据库的读写比很高，这个时候通常会想到数据读写分离的方案，当然，这个方案要实现并不</span> <span style="font-family: 宋体">容易，另外，可能会发现一些数据存储在数据库上有些浪费，或者说过于占用数据库资源，因此在这个阶段可能会形成的架构演变是实现数据读写分离，同时编写一些更为廉价的存储方案，例如</span><span lang="EN-US">BigTable</span><span style="font-family: 宋体">这种。</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal">
	<span lang="EN-US"><v:shape id="_x0000_i1033" o:ole="" style="width: 415.5pt; height: 297.75pt" type="#_x0000_t75"><v:imagedata mce_src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image017.emz" o:title="" src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image017.emz"></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img alt="" height="398" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/9.PNG" width="555" /><br />
	&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">数据读写分离要求对数据库的复制、</span><span lang="EN-US">standby</span><span style="font-family: 宋体">等策略有深入的掌握和理解，同时会要求具备自行实现的技术；</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">廉价存储方案要求对</span><span lang="EN-US">OS</span><span style="font-family: 宋体">的文件存储有深入的掌握和理解，同时要求对采用的语言在文件这块的实现有深入的掌握。</span></p>
<p class="MsoNormal">
	&nbsp;</p>
<p class="MsoNormal">
	<strong><span style="font-family: 宋体"><span style="font-size: 14pt">架构演变第十步：进入大型分布式应用时代和廉价服务器群梦想时代</span></span></strong></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">经过上面这个漫长而痛苦的过程，终于是再度迎来了完美的时代，不断的增加</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">就可以支撑越来越高的访问量了，对于大型网站而言，人气的重要毋</span> <span style="font-family: 宋体">庸置疑，随着人气的越来越高，各种各样的功能需求也开始爆发性的增长，这个时候突然发现，原来部署在</span><span lang="EN-US">webserver</span><span style="font-family: 宋体">上的那个</span><span lang="EN-US">web</span><span style="font-family: 宋体">应用已经非常庞大</span> <span style="font-family: 宋体">了，当多个团队都开始对其进行改动时，可真是相当的不方便，复用性也相当糟糕，基本是每个团队都做了或多或少重复的事情，而且部署和维护也是相当的麻烦，</span> <span style="font-family: 宋体">因为庞大的应用包在</span><span lang="EN-US">N</span><span style="font-family: 宋体">台机器上复制、启动都需要耗费不少的时间，出问题的时候也不是很好查，另外一个更糟糕的状况是很有可能会出现某个应用上的</span><span lang="EN-US">bug</span><span style="font-family: 宋体">就导</span> <span style="font-family: 宋体">致了全站都不可用，还有其他的像调优不好操作（因为机器上部署的应用什么都要做，根本就无法进行针对性的调优）等因素，根据这样的分析，开始痛下决心，将</span> <span style="font-family: 宋体">系统根据职责进行拆分，于是一个大型的分布式应用就诞生了，通常，这个步骤需要耗费相当长的时间，因为会碰到很多的挑战：</span><span lang="EN-US"><br />
	1</span><span style="font-family: 宋体">、拆成分布式后需要提供一个高性能、稳定的通信框架，并且需要支持多种不同的通信和远程调用方式；</span><span lang="EN-US"><br />
	2</span><span style="font-family: 宋体">、将一个庞大的应用拆分需要耗费很长的时间，需要进行业务的整理和系统依赖关系的控制等；</span><span lang="EN-US"><br />
	3</span><span style="font-family: 宋体">、如何运维（依赖管理、运行状况管理、错误追踪、调优、监控和报警等）好这个庞大的分布式应用。</span><span lang="EN-US"><br />
	</span><span style="font-family: 宋体">经过这一步，差不多系统的架构进入相对稳定的阶段，同时也能开始采用大量的廉价机器来支撑着巨大的访问量和数据量，结合这套架构以及这么多次演变过程吸取的经验来采用其他各种各样的方法来支撑着越来越高的访问量。</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">看看这一步完成后系统的图示：</span></p>
<p class="MsoNormal">
	<span lang="EN-US"><v:shape id="_x0000_i1034" o:ole="" style="width: 414.75pt; height: 322.5pt" type="#_x0000_t75"><v:imagedata mce_src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image019.emz" o:title="" src="file:///C:\DOCUME~1\bixuan\LOCALS~1\Temp\msohtml1\01\clip_image019.emz"></v:imagedata></v:shape>&lt;!--[if !vml]--&gt;<img alt="" height="431" src="http://www.blogjava.net/images/blogjava_net/bluedavy/arch/10.PNG" width="554" /><br />
	&lt;!--[endif]--&gt;</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">这一步涉及到了这些知识体系：</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">这一步涉及的知识体系非常的多，要求对通信、远程调用、消息机制等有深入的理解和掌握，要求的都是从理论、硬件级、操作系统级以及所采用的语言的实现都有清楚的理解。</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">运维这块涉及的知识体系也非常的多，多数情况下需要掌握分布式并行计算、报表、监控技术以及规则策略等等。</span></p>
<p class="MsoNormal">
	<span style="font-family: 宋体">说起来确实不怎么费力，整个网站架构的经典演变过程都和上面比较的类似，当然，每步采取的方案，演变的步骤有可能有不同，另外，由于网站的业务不同，会有不同的专业技术的需求，这篇</span><span lang="EN-US">blog</span><span style="font-family: 宋体">更多的是从架构的角度来讲解演变的过程，当然，其中还有很多的技术也未在此提及，像数据库集群、数据挖掘、搜索等，但在真实的演变过程中还会借助像提升硬件配置、网络环境、改造操作系统、</span><span lang="EN-US">CDN</span><span style="font-family: 宋体">镜像等来支撑更大的流量，因此在真实的发展过程中还会有很多的不同，另外一个大型网站要做到的远远不仅仅上面这些，还有像安全、运维、运营、服务、存储等，要做好一个大型的网站真的很不容易，写这篇文章更多的是希望能够引出更多大型网站架构演变的介绍，</span><span lang="EN-US"> <img alt=":)" class="wp-smiley" src="http://www.dengshaowei.com/wp-includes/images/smilies/icon_smile.gif" /> </span><span style="font-family: 宋体">。</span></p>]]></description>
	<pubDate>Mon, 13 Dec 2010 11:47:08 +0000</pubDate>
	<author>jacky_chen</author>
	<guid>http://www.chenlong.jx.cn/?post=47</guid>

</item>
<item>
	<title>迷糊了。。又。。</title>
	<link>http://www.chenlong.jx.cn/?post=46</link>
	<description><![CDATA[<p>
	&nbsp;&nbsp;&nbsp;&nbsp;昨天中午和华一起吃的饭，在回来的路上，在车上，我问他，说：春天花园在哪？他直接来一句：离这里（当时在昌江广场附近）比较远，想到那边买房子了？</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;我一听就愣了，只不过是想问问那地方在哪，上次晚上从新区回来，坐王老师的车，他说他家在那里，我就问问而已。不过，确实是，那边的房子，华告诉说，已经从前几年的1K多，到现在的3K多了。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;想想啊，确实不小了，该考虑房子，车子的事了。华和刘倒是想我留在景德镇，嘿嘿，多个人嘛，还说决定了留下，就买套房子。我真是服他们了，以为买房子跟租房样的啊，想有就能有的啊。再说，以现在的经济水平，一个月都买不起一平，还杂混啊。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;这次考研考上了柳博的研了，还能在景德镇多混几年；没考上的话，估计再混个一年的样子，就出去了。大学的同学，大部分在深圳，虽然现在他们的工资不高，但是，潜力很大。像我现在这样，完全就是陶院的临时工，服的。如果在学校有了编制什么的，就和刘一样，这又是另外一回事了。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;该整理整理思绪了，该认认真真的把基础打牢了；一年后出去，能在深圳拿到7--8K不？这是个很大的问题。个人觉得，如果在沿海城市没有混好，估计两三年之后，就没法混了，养不活自己了。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;这两年会过得很舒服，无忧无虑。如果没有把握好这两年，也许，以后会死得很惨。在这样一个大环境是混，小环境无压力的条件下，应该自己去做点什么，去学点什么。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;前几天跟固远聊了下，他说他现在虽然在计算机相关的公司，但是，也是混，从技术上等讲，早就落伍了。而我比他好一点，自己在学，尽量不落伍。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;前方是哪呢？不晓得。真的是不晓得。虽有好的想法，却是那么遥远。当房子车子这样的压力压来的时候，我们真的是很难呼吸。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;现在就是希望自己学习的方向不要错，否则的话，真的就是白白浪费两年。</p>]]></description>
	<pubDate>Wed, 08 Dec 2010 16:58:50 +0000</pubDate>
	<author>jacky_chen</author>
	<guid>http://www.chenlong.jx.cn/?post=46</guid>

</item>
<item>
	<title>关于下一步学习的一些思考？</title>
	<link>http://www.chenlong.jx.cn/?post=45</link>
	<description><![CDATA[<p>
	&nbsp;&nbsp;&nbsp;&nbsp;最近自己在学python，感觉真的是发现自己底子不够实；当然，不是说python学不进或者是其它，只是，像这样的动态语言，可以完美的和C/C++结合，难道就不该好好的学学C语言了么？</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;从我个人讲，不怎么想学C++；但是，C语言，真的是得好好的学学，培养一下兴趣。否则的话，要真正的学好python这样的语言，或者是说其它语言（指深入学习），就会很困难。如果只是最基本的话，一个星期，上手一门计算机语言，应该不是问题，但问题是：深入呢？</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;好多时候，都看到网上有什么，高效PHP开发要注意什么什么的，比如说，同样的条件下&#39;比&quot;，解析得更快或者是等等等等；现在有个问题就是，这些&ldquo;高效&rdquo;，从哪里来的？我一直都觉得，PHP&ldquo;骨灰&rdquo;级，专家级的人物，对C语言，应该是了解比较透彻了（当然，还有其它的很多方面）。因为PHP就是C写出来的，不知根知底的话，谈不上骨灰级和专家级。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;前两天，我纠结了一下一个问题：要不要用web.py去写个什么东西？这两天还是没有写，因为自己写demo的时候，就已经操作了数据库，有增删改的一些功能，觉得这就够了。问题是，要怎么去深入了解web.py。看它的代码，我现在很纠结，因为我对Python也不是很了解，才学没多久。对Python的源码就更纠结了，更是看得头疼，因为C语言底子不牢。所以，决定两手抓。C语言重新开始学，web.py的框架继续看。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;总听到有人说要转行之类的，我就在想，只不过是到了一定的年龄，不以写代码为主了而已。可以转行做管理等等，再者，我觉得，做技术总监之类的，也挺好的。如果到了27，28，还像21，22那样的coding肯定是不行的。觉得，到了27，28的时候，应该是有东西拿得出手，善于去架构，去设计，去优化，而不是coding。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;不是有好多人喜欢打击 北大青鸟 出来的同志吗。个人觉得，就是底子的问题，27，28还是没有技术的coding，有什么用。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;解决方案，通过讨论，基本上是可以得出来的；而技术方案却不见得。</p>]]></description>
	<pubDate>Tue, 30 Nov 2010 15:55:53 +0000</pubDate>
	<author>jacky_chen</author>
	<guid>http://www.chenlong.jx.cn/?post=45</guid>

</item>
<item>
	<title>终于配置好了web.py</title>
	<link>http://www.chenlong.jx.cn/?post=44</link>
	<description><![CDATA[<p>
	&nbsp;&nbsp;&nbsp; 浮躁，定势思维。。。</p>
<p>
	&nbsp;&nbsp;&nbsp; 这是这几天在工作上，或者是说在程序上的最好的解释。。</p>
<p>
	&nbsp;&nbsp;&nbsp; 这几天一直在折腾python的web开发，同时在win下和linux下弄，都没弄好。到了昨晚，终于有点眉目了，今天上午一过来，基本上就弄好了。</p>
<p>
	&nbsp;&nbsp;&nbsp; 先说说定势思维吧：ASP等容易配置，asp.net也难不到哪去，PHP的话，在IIS，也成功的配置成fastcgi运行，在apache里面也配置成功了，jsp的开发环境也在apache配置成功过。可是，这次的web.py在lighttpd里面的配置让我很纠结。</p>
<p>
	&nbsp;&nbsp;&nbsp; 一开始，在IIS和apache下，运行python脚本，配置好了，没有问题。可是，要用python做WEB开发的话，肯定是要先熟悉一个框架。我选择的是web.py。然后，在lighttpd下面的话，很是纠结了。出了一大把一大把的错误。不是权限问题，就是对linux不是太熟；要么就是莫名其妙的报错，差点让我都没信心了。我以为，也会像php一样的配置，但是，web.py本身就是一个轻量级的WEB服务器，要以fastcgi的形式，整合到lighttpd里面去。由于这个思维的定势，一直没搞明白，一直都算是在瞎折腾，网上的一些配置，也没认真细致的去看。此时，就会浮躁了。明显在fastcgi的时候，lighttpd.conf里面有一段了，有一个PHP配置的DEMO，我也没有认真的看，直接把web.py的加上去，导致一次又一次的报错。后来，静心的看了下，原来这里面已经有了，加上去后，又是权限不足，它还不是明显的提醒，还是一个劲的显示lighttpd成功运行，但是不绑定端口，那就更访问不了了。然后又得查看日志，找出里面的错误。。我都要疯掉了。。。找到之后，网上说是权限问题，可是code.py已经给了权限了，原来是socket文件夹，要有权限，我真服的。。</p>
<p>
	&nbsp;&nbsp;&nbsp; 还有个让人纠结的问题，我的lighttpd怎么执行restart的时候，会显示端口已经绑定啊，，每次都要kill掉之后，重新start或restart；以前都不会啊，难道我又哪里配置出错了啊。。。。。网上也没有找到解决的方法。。。liunx啊，咳。。纠结。。。真的是不太适合那些非开发人员。。。</p>
<p>
	&nbsp;&nbsp; 昨天弄了下数据导入的一个问题，从AC导入到MSSQL里面。已经实现了用程序去读，去写，可是效率极其低下，几十万的数据，弄了两天多。然后，我就改成用opendatasource的方法实现，可是，没有容错性。AC里面的数据导入到MSSQL里面，是很容易出错的，字段限制不严格等等，都是问题。而opendatasource方法的话，直接在MSSQL里面执行，似乎，不太好中间操作。。想过一些办法：比如说，先读那些容易出问题的字段（这里主要指datetime字段），保存成nvarchar类型的，然后再做一个容错处理，最后在导入的时候，排除掉那些有错误的，这样的话，相当于读了两次，而且，似乎也会有点纠结。。其它的办法正在想。。如谁有好的办法，请指教。。</p>
<p>
	&nbsp;&nbsp; 还有，原来MSSQL的存储过程里面，是不能够加－1的，，汗死。。只能加0，＋1，比如说，select xx=xx+(-1) from xxx，那么，xx还是加1，而不是－1。。晕死。。。</p>
<p>
	&nbsp;&nbsp; 上面就写了最近遇到的一些问题，，希望对大家有帮助。。</p>
<p>
	总结下web.py在lighttpd下面的配置：</p>
<p>
	1。安装和下载python和web.py和lighttpd这个就不说了，可以apt-get（我用的ubuntu），也可以下载源自己编译。</p>
<p>
	2。web.py的官方网站上有code.py，注意格式，python是强缩进的。写好后，运行python code.py，就可以在http://127.0.0.1:8080访问了，如果达到了这步，就成功一小部分了。</p>
<p>
	付code.py：</p>
<p>
	#!/usr/bin/env python<br />
	<br />
	import web<br />
	urls = (<br />
	&nbsp;&nbsp;&nbsp; &#39;/(.*)&#39;,&#39;index&#39;<br />
	)<br />
	<br />
	app = web.application(urls, globals())<br />
	<br />
	class index:<br />
	<br />
	&nbsp;&nbsp;&nbsp; def GET(self, name=None):<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if not name:<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; name = &#39;world&#39;<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return &#39;Hello, &#39; + name + &#39;!&#39;<br />
	<br />
	<br />
	if __name__ == &quot;__main__&quot;:<br />
	&nbsp;&nbsp;&nbsp; app.run()</p>
<p>
	3。配置lighttpd。</p>
<p>
	server.modules&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = (<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;mod_rewrite&quot;,<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;mod_setenv&quot;,<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;mod_secdownload&quot;,<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;mod_access&quot;,<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;mod_auth&quot;,<br />
	#&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;mod_httptls&quot;,<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;mod_status&quot;,<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;mod_expire&quot;,<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;mod_simple_vhost&quot;,<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;mod_redirect&quot;,<br />
	#&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;mod_evhost&quot;,<br />
	#&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;mod_localizer&quot;,<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;mod_fastcgi&quot;,<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;mod_cgi&quot;,<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;mod_compress&quot;,<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;mod_userdir&quot;,<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;mod_ssi&quot;,<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &quot;mod_accesslog&quot; )</p>
<p>
	fastcgi.server&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = ( <br />
	&nbsp;&nbsp;&nbsp; #&quot;.php&quot; =&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (( &quot;host&quot; =&gt; &quot;127.0.0.1&quot;, &quot;port&quot; =&gt; 1026, &quot;broken-scriptfilename&quot; =&gt; &quot;enable&quot;, &quot;allow-x-send-file&quot; =&gt; &quot;enable&quot; ) ),<br />
	&nbsp;&nbsp;&nbsp; #&quot;/prefix.fcgi&quot; =&gt; (( &quot;host&quot; =&gt; &quot;127.0.0.1&quot;, &quot;port&quot; =&gt; 1026, &quot;check-local&quot; =&gt; &quot;disable&quot;, &quot;broken-scriptfilename&quot; =&gt; &quot;enable&quot; ))<br />
	&nbsp;&nbsp;&nbsp; &quot;/code&quot; =&gt;((&quot;socket&quot; =&gt; &quot;/tmp/fastcgi.socket&quot;,&quot;bin-path&quot; =&gt; &quot;/var/www/pyweb/code.py&quot;,&quot;max-procs&quot; =&gt; 10,&quot;bin-environment&quot; =&gt;(&quot;REAL_SCRIPT_NAME&quot; =&gt; &quot;&quot;),&quot;check-local&quot; =&gt; &quot;disable&quot;))&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; )</p>
<p>
	这些是我的配置文件的一部分，其它部分默认就可，当然server-root这些，就自己配置了。fastcgi.server里面已经有了，只需要把&quot;/code&quot;=&gt;这段加上去就行了。注意，socket文件夹，一定要有写的属性，没有的话，可以用：sudo chmod 777 /xxx 来给权限，code.py也一样。</p>]]></description>
	<pubDate>Wed, 24 Nov 2010 09:43:08 +0000</pubDate>
	<author>jacky_chen</author>
	<guid>http://www.chenlong.jx.cn/?post=44</guid>

</item>
<item>
	<title>开始玩liunx啦</title>
	<link>http://www.chenlong.jx.cn/?post=42</link>
	<description><![CDATA[<p>
	&nbsp;&nbsp;&nbsp; 这两天装了个LIUNX系统玩玩，感觉挺好的，这次装的是Ubuntu10.04。以前没用过这系统，用的是RedHat的。为什么装这个呢，因为，它支持硬盘安装，就是WUBI安装啦；当然，还有一点就是，找的时候，发现这个挺新的，就用这个了，哈哈。</p>
<p>
	&nbsp;&nbsp;&nbsp; 前段时间在win下面编译PHP源码弄得我好纠结，现在在LINUX下面编译，真的是好简单。sudo下来之后，直接./configure，然后make就OK。以前在win下面的时候，老是出问题，明明是按照那些个教程来的，不是有乱码就是少这个那个的，真不爽。</p>
<p>
	&nbsp;&nbsp;&nbsp; 发现PYTHON在LINUX下面也挺爽的，PHP就不用多说了，（L）AMP配置起来也很简单。</p>
<p>
	&nbsp;&nbsp;&nbsp; 也许是自己的战略变了，哈哈。。。要多玩玩LINUX了，以前近似乎是把这块给忽略了。</p>
<p>
	&nbsp;&nbsp;&nbsp; 加油。。。。</p>
<p>
	&nbsp;&nbsp;&nbsp; PS一下：这篇日志就是在Ubuntu里面写的，用的所FF浏览器。感觉挺好的，除了这个输入法用的有点不爽之外（本人用二笔输入法，得去找个去，嘿嘿。）。</p>]]></description>
	<pubDate>Tue, 09 Nov 2010 06:08:25 +0000</pubDate>
	<author>jacky_chen</author>
	<guid>http://www.chenlong.jx.cn/?post=42</guid>

</item>
<item>
	<title>搞定TP带参分页</title>
	<link>http://www.chenlong.jx.cn/?post=40</link>
	<description><![CDATA[<p>
	thinkphp是什么就不用多说了，一个轻量级的PHP MVC框架；前几天搞搞这个东西，做了个相册，发现，它的分页很让我纠结，特别是带参分页。</p>
<p>
	按照它的手册来吧，没多大效果；后来，直接看它的分页类，也不是很复杂。搞明白了它的原理，只不过就是将$where数组中的参数，分离，以GET的方式，传递到分页类中，然后再将这些参数又组合到查询语句中，实现带参分页。然后，才发现，在$where数组中传递的，和表单中的name值要一致，才能这样做。否则的话，传递过来，到了下一页，是收不到的。</p>
<p>
	还有一个问题，$where数组中，是可以再有数组的，好比有$p=array(&#39;eq&#39;,$kid)，这个变量$p再添加到$where中的话，直接按手册上的来分离参数，似乎也没效果。解决这个问题时，又写了个函数，判断是不是数组，然后再分离，相当于一个递归。</p>
<p>
	还有个问题就是，分页连接的时候，会自动加上本页的操作名，就是说，本来是/Index/Pager/的话，分页后，会变成/Index/Pager/Pager，这也让我纠结，不知道原因在哪里。</p>
<p>
	最后呢，还是没有按照手册上的方法弄好。想了想，不就是把参数传递过去嘛，需要那么纠结嘛。改装了一下它的show()函数，去掉了URL参数过滤这个功能，直接就是分页，比如说，页面是/Index/Pager，那么，使用ushow(&quot;/Index/Pager&quot;)（改装后的），得到的就是/Index/Pager/&amp;p=2，很明显p=2就是第二页。这个也可以用于不带参的分页。实际上，我就是觉得它这个分页有点纠结，在还没有写到带参分页的时候，我就改装了这个函数，正好，这里用上了。然后呢，就是把需要的参数在Action里面组装一下，传递到前台，到前台哪里呢，肯定是javascript里面。然后再将这个参数，添加到分页后的&lt;a&gt;标签里面；部分代码：</p>
<p>
	$show = $Page-&gt;ushow(__URL__.&quot;/&quot;.$_REQUEST[C(VAR_ACTION)].&quot;/&quot;);（调用组装后的分页函数，实际上，就是将它封装好的，又打开，自己处理。）</p>
<p>
	$output=&quot;/KID/&quot;.$kid.&quot;/spbegintime/&quot;.$p[&quot;spbegintime&quot;].&quot;/spendtime/&quot;.$p[&quot;spendtime&quot;].&quot;/spname/&quot;.$p[&quot;spname&quot;];（Action里面，组装分页参数；也可以用&amp;来区分参数。）</p>
<p>
	$this-&gt;assign(&#39;outpager&#39;,$output);绑定页面变量。</p>
<p>
	&nbsp;$(&quot;#pager a&quot;).click(function(){<br />
	&nbsp;&nbsp;var i=$(&quot;#pager a&quot;).index(this);<br />
	&nbsp;&nbsp;$(&quot;#pager a&quot;).eq(i).attr(&quot;href&quot;,$(&quot;#pager a&quot;).eq(i).attr(&quot;href&quot;)+&quot;{$outpager}&quot;);<br />
	&nbsp;});前台修改连接地址，将参数加进来。</p>
<p>
	最近TP出2.1了，还没去看，嘿嘿。感觉吧，有时候用这样的框架，会不习惯，似乎就是少了一种感觉。用JQ也一样，有时候就习惯性的$(&quot;form&quot;).submit();而其实页面中就一两处用到了JS，都没把JQ加载进来；我都在想，会不会使用JQ，让我把普通JS给忘了？这也许就是JQ的目标之一吧，哈哈。当然，作为开发者的话，不能只局限于一个框架，一种语言。</p>
<p>
	最近上班改ccmall.cn也纠结，常常就是本地改好了，上传到服务器上，就没用了；没办法，服务器我没权限修改，我得将改好的往上传，上面的人再修改服务器上的。咳。。</p>
<p>
	有时候在想，像ccmall.cn这样的大型B2B，B2C网站，做成功了，每天至少是要经受上万IP，数十万次PV的，像这样一个课题，弄到实际运用中去，会不会有问题？毕竟大学里面的课题和实际运用的项目，差距是非常大的。还有，项目中，将大量的，本来最基本的html标签，封装成那么复杂的服务端控件，生成大量的ViewState，然后修改的时候，就N麻烦。有必要么？在修改的过程中，经常就发现，有时候，花大力气写的一个服务端控件，就一个地方用到了，要实现的功能，完全可以几句很基本的JS和简单的HTML标签搞定。咳。。</p>
<p>
	看了看一些PHP项目，觉得还是那种简单明了，简洁，不臃肿。。微软就喜欢把别人当傻瓜，什么都封装好。（这里仅仅指asp.net）。当然了，也不是说asp.net一无是处哈，只是觉得，好多人都没有正确的运用asp.net就是。其实，.net的强类型，编译型，以及泛型，Ado.net等都是非常不错的，还有后来推出的asp.net MVC，包括.net3.0之后推出来的一些新特性，像SQL CLR，这样重逻辑的数据库操作，还是挺实用的。</p>
<p>
	啰嗦了好多，只是好久没写了，嘿嘿。以上某些观点只是个人的一些见解哈，如果你不认同，大可不必上劲哈，欢迎拍砖。</p>]]></description>
	<pubDate>Wed, 27 Oct 2010 09:49:14 +0000</pubDate>
	<author>jacky_chen</author>
	<guid>http://www.chenlong.jx.cn/?post=40</guid>

</item>
<item>
	<title>日记。。</title>
	<link>http://www.chenlong.jx.cn/?post=38</link>
	<description><![CDATA[<p>
	&nbsp;&nbsp;&nbsp;&nbsp;最近一室友他女朋友和他闹分手，他是我们寝室最早谈恋爱的，和他GF在一起近三年了。大学四年，三年在一起，不能不说很不容易。从他表情的痛苦，和最近的落寞，明显看得出来他确实是很累了。说不定他们真分了的话，我室友又得出走，然后就不再回这个城市了，因为没有留下来的意义了。在这里的同学又要少了一个了，本来就没几个人了。咳。。。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;他有跟我聊，说不知道女人到底怎么想的。当然，我们局外人，都是往好的方向看。明明说了做朋友，却会和他一起出去吃饭局，而且是以他GF的身份。我们以为，他GF只是现在不想原谅他，也不想真正的分手。可是，他又抱怨天天不理他GF天天不理他，等等等，搞得他好纠结。。。。。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;也许，他GF只是不习惯从两个人一下子变成一个人吧。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;换了号码也一个月了吧，汗。。似乎这半年换了两个号码。。黎刚刚在飞信上了加了我，小聊了一下。以前前后桌啊，，聊得挺多的以前。。。突然聊到，天天无聊，没事干，太安逸了。黎问我，天天很忙吗？似乎，要做的话，我天天有的事做；只是自己少了年轻人的活力似乎有点；累了就想打打牌，玩玩游戏，陪陪慧，就这么简单了。。。搞得华对我很有&ldquo;意见&rdquo;，，也没办法，，他的事没做好，两边都有原因。。当然，不可否认的是，我确实有点松懈。。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;关于这样前途啊，人生的话题，现在不想再去想。累。。。现在缺少动力。。。家里人要我考研，明年元月这次，估计是难产。。根本就没复习。。我似乎有了某人在某个时间段的想法：先把工作做好一下，再花半年时间复习考研。想都是这样的想，但是，当我们觉得，现在的日子过得安逸的时候，就不会去想太多。只有当没办法了，然后再去拼命努力。人不就是这样的么？两年，至少，签的这两年，肯定不会很累。可是，两年后呢？太多变化了。2012来了，谁知道呢。。哈哈。。。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;那天晚上，华说，想留在这个城市，就准备去买套房子，这东西不会掉价。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;那天下午，跟小杨聊天，我说，如果没有房子的压力，我们可以活得很轻松，至少现在，至少在可见的未来。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;以前某天，跟某人说，出去至少要6K，但还买不到一个平米。</p>
<p>
	&nbsp;&nbsp;&nbsp;&nbsp;在这个浮华的社会的背后，出生在计划经济时代，生长在市场经济的我们，有多少未完成的梦，有多少想做的事，总会被欲质流咂得粉碎。而我们，只能去撑起自己的这片天空！</p>]]></description>
	<pubDate>Tue, 21 Sep 2010 09:47:15 +0000</pubDate>
	<author>jacky_chen</author>
	<guid>http://www.chenlong.jx.cn/?post=38</guid>

</item></channel>
</rss>
