<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Open Experience</title>
    <description>CodeDesign&amp;Aiyo&amp;Pic&amp;Tracer</description>
    <link>http://openexperience.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>作程序员的体会</title>
        <author>dongin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openexperience.javaeye.com">dongin</a>&nbsp;
          链接：<a href="http://openexperience.javaeye.com/blog/159805" style="color:red;">http://openexperience.javaeye.com/blog/159805</a>&nbsp;
          发表时间: 2008年01月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          刚毕业不久，简单说说自己作程序员的一些体会，自己的一些经验。 <br />     <br />    说到经验，个人认为在软件行业，经验包含使用经验和学习经验。使用经验就是指使用过什么，会使用什么。而学习经验则是指在学习使用一个东西过程中自己总结出来的一套方法。举个例子：简单的你在开发时遇到一个棘手的问题，你通过使用某种已存在工具或方法解决了这个问题，这时你获得的是使用工具。而如果你继续去探究为什么这个工具或方法能够解决问题以及是如何解决问题的，在这个探索过程中，你得到的就是学习经验。在软件行业，这两种经验都是很重要的。但相对而言，我个人认为学习经验更重要一些，使用经验可能只能帮助我们解决一个问题，而学习经验却可以帮助我们解决一类问题，并且可能还会得出自己解决问题的创造性方法。软件业日新月异，锻炼这种学习经验就显得更重要了。<br /><br />    作为程序员，想要提高自己，就要认真的做到以下几点：<br /><br />    1.<strong>动手去编程</strong>：程序员的编程工作就是利用机器语言去实现人类的思想。所以我们自己有什么想法就一定要去动手，而不要停留在说的阶段。有些问题只有在动手的时候才会发现，有些经验只有在动手是才能体会到。经常动手会给你带来很多意想不到的东西。<br /><br />    2.<strong>动脑去思考</strong>：这点也非常重要，这也是获得学习经验最好的途径。如果一个程序员不去动脑思考，那就是个真正的体力劳动者。这样继续下去的话，你就会觉得自己的工作没有创造性，乏味。慢慢就会失去兴趣了。保持动脑的习惯，让自己的工作更有创造性。<br /><br />    3.<strong>良好的编程风格</strong>：这一点可能很多人都不注意，但是好的编程风格会在项目中给你带来很多好处，经历多了你可能就会体验到的。<br /><br />    4.<strong>制定自己的学习计划</strong>：软件的技术五花八门，所以一定要制定自己的学习计划，一步步有目标的来学习这些技术，才不至于在技术中迷失。另外，学习语言要关注语言的本身，而不要一味的去关注语言的库和一些工具。<br /><br />    5.<strong>不断总结</strong>：要经常进行总结，提炼自己的经验，更别人共享自己的经验。在编程过程中保持软件工程的思想，这样会是你的代码更优雅。碰到问题时要学会怎样去寻找问题、分析问题、然后是解决问题，最后进行问题的总结。我们要对解决这个问题的过程进行总结，而不是结果。<br /><br />    6.<strong>多关注软件新动态</strong>：平时多看看论坛，多了解软件的动态，多和同行交流。和同行交流会给你带来惊喜，你也会成长得更快。<br /><br />    7.<strong>团队合作</strong>：任何一个在项目中的人对于项目来说都是不可或缺的。你在项目中的任何行为都会影响到项目，所以要协调团队，给团队带来更多的贡献。两外，在团队中，我们要把团队的知识进行共享，这样团队的所有人都会迅速的成长。举个例子：在公司我们提倡如果碰到一个棘手的问题，我们就会让一个人来解决这个问题，到最后当他问题解决的时候，我们团队就会有个小讨论，先让解决问题的人传授一下是怎样解决的，同时其他同学就会不停的去问自己不懂的地方。这样问题被解决的同时，大家都学到了知识。而更重要的是在这个过程中会激发那个解决问题的人不断去探索。从而得到我们需要的学习经验。<br /><br />    8.<strong>方式自己</strong>：要把自己置于一种轻松自由的编程环境中，放松自己的大脑。在编程的同时要经常抬抬头看看前方的路。保持清醒的大脑是最有效率的。<br /><br />    以上都是自己一些不成熟的看法，希望对同行有些帮助。随着自己不断成长，经验越来越多，想法也会变得更成熟的。
          <br/>
          <span style="color:red;">
            <a href="http://openexperience.javaeye.com/blog/159805#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 27 Jan 2008 23:28:08 +0800</pubDate>
        <link>http://openexperience.javaeye.com/blog/159805</link>
        <guid>http://openexperience.javaeye.com/blog/159805</guid>
      </item>
      <item>
        <title>django 验证码</title>
        <author>dongin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openexperience.javaeye.com">dongin</a>&nbsp;
          链接：<a href="http://openexperience.javaeye.com/blog/157549" style="color:red;">http://openexperience.javaeye.com/blog/157549</a>&nbsp;
          发表时间: 2008年01月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  在项目中用到验证码，懒得去找，自己随便写了一个：</p><p>views.py:</p><p>&nbsp;</p><pre name="code" class="python">def get_check_code_image(request,image='media/images/checkcode.gif'):
    import Image, ImageDraw, ImageFont, random
    im = Image.open(image)
    draw = ImageDraw.Draw(im)
    mp = md5.new()
    mp_src = mp.update(str(datetime.now()))
    mp_src = mp.hexdigest()
    rand_str = mp_src[0:4]   
    draw.text((10,10), rand_str[0], font=ImageFont.truetype(&quot;ARIAL.TTF&quot;, random.randrange(25,50)))
    draw.text((48,10), rand_str[1], font=ImageFont.truetype(&quot;ARIAL.TTF&quot;, random.randrange(25,50)))
    draw.text((85,10), rand_str[2], font=ImageFont.truetype(&quot;ARIAL.TTF&quot;, random.randrange(25,50)))
    draw.text((120,10), rand_str[3], font=ImageFont.truetype(&quot;ARIAL.TTF&quot;, random.randrange(25,50)))
    del draw
    request.session['checkcode'] = rand_str
    buf = cStringIO.StringIO()
    im.save(buf, 'gif')
    return HttpResponse(buf.getvalue(),'image/gif')</pre><p>urls.py:</p><pre name="code" class="python">from django.conf.urls.defaults import *

urlpatterns = patterns('tracer_server.apps.user.views',
    # Uncomment this for admin:
    # (r'^admin/', include('django.contrib.admin.urls')),
    
    (r'^get_check_code_image/$', 'get_check_code_image'),

)</pre>&nbsp;template:<p>&nbsp;</p><pre name="code" class="xml">&lt;img onclick=&quot;this.setAttribute('src','/user/get_check_code_image/?nocache='+Math.random());&quot; src=&quot;/user/get_check_code_image/&quot; alt=&quot;CheckCode&quot;/&gt;</pre>&nbsp;
          <br/>
          <span style="color:red;">
            <a href="http://openexperience.javaeye.com/blog/157549#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 Jan 2008 10:34:32 +0800</pubDate>
        <link>http://openexperience.javaeye.com/blog/157549</link>
        <guid>http://openexperience.javaeye.com/blog/157549</guid>
      </item>
      <item>
        <title>2007年总结</title>
        <author>dongin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openexperience.javaeye.com">dongin</a>&nbsp;
          链接：<a href="http://openexperience.javaeye.com/blog/152110" style="color:red;">http://openexperience.javaeye.com/blog/152110</a>&nbsp;
          发表时间: 2008年01月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  2007年对自己来说是令人难忘的，喜怒哀乐构成了这一年主旋律。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  今年最大的事就是完成了从学生到员工的转变，从一个&lsquo;围成&rsquo;中跳入了另一个&lsquo;围成&rsquo;。虽然2006就出来实习了，但是那个时候还是一个学生，一切事情都有同事帮着。随着转为正式员工，自己感觉自己的责任更重了，开始规划起自己的人生路程。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 对公司的感觉一直很好，公司能够为我们提供不错的平台来发展自己，而且那种自由的开放式的工作环境是让人很是舒服。同时之间融洽的关系，老板就跟朋友一样，这一切都是值得回忆的。在一个IT企业，这种压力最小化模式让我感觉自己工作还是相当轻松的，而且还有大量的空闲时间可以来学习自己喜欢的东西，所以感觉自己还是很幸运的。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  通过一年的努力和同事师兄们的帮助，自己已经得到了很大的提高，最让自己满意的是自己处理问题的能力有了大大的提高，碰到问题不再想以前一样不知从何入手了，这个要感谢自己项目组那些曾经一起奋斗的兄弟姐妹们，他们给了我很大的帮助，也感谢公司给我研究新的东西的机会，正是这种机会锻炼了我处理问题的能力，现在对棘手问题都可以比较妥善处理了。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  在2007年，个人感觉自己的学习态度还是值得赞赏的，虽然还没有达到自己的预期，但是已经有很好的开始了。自己的对知识还是很渴望的，但是有时还是有点懒，希望明年能够在这点有所改变。自己时刻保持的危机感让自己的自制能力变得更强，但是有些时候还是太自信了，有点吹虚自己的感觉。而且有个让自己都很憎恶的公式&lsquo;说的大于做的&rsquo;，虽然这个自己已经在慢慢改，可是还是没有摆脱这个公式，我坚信明年这个时候这个公式对我来说就不成立了。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  这一年最值得回忆就是那个曾经的女孩，自己也感受到了爱情的力量。那段时间自己是最幸福的，自己只能用心来珍藏那段美好。自己也算是个比较有主见的，但是她却让我改变了不少，也许一些习惯自己还会一直延续下去，而且还会经常为她祈福，希望她越来越幸福，希望她能够知道只要她幸福我就会幸福，因为我心里一直有她。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 最后说说今年的打算吧，通过一年的锻炼自己已经能够处理不少事情了，但是还的继续提高。在技术上希望自己能实现自己的既定目标，在广度很深度上都要有所提高，要做到真正的精通。在项目管理上继续像同事们多学习，争取自己可以独立带领自己的团队来出色的完成项目。在英语方面自己要有所提高，不要放弃公司给的学习英语的机会。通过这一年，自己对自己已经有所了解，也对自己的未来有所规划，但是还不成熟，有时甚至还很模糊，很矛盾，明年要改变这种状态。最后就是每天一定要坚持看书来充实自己，来提高自己。
          <br/>
          <span style="color:red;">
            <a href="http://openexperience.javaeye.com/blog/152110#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jan 2008 00:59:23 +0800</pubDate>
        <link>http://openexperience.javaeye.com/blog/152110</link>
        <guid>http://openexperience.javaeye.com/blog/152110</guid>
      </item>
      <item>
        <title>初步接触pentaho</title>
        <author>dongin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openexperience.javaeye.com">dongin</a>&nbsp;
          链接：<a href="http://openexperience.javaeye.com/blog/151558" style="color:red;">http://openexperience.javaeye.com/blog/151558</a>&nbsp;
          发表时间: 2007年12月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 最近有个项目要一些生成报表的功能，技术老总要用pentaho，以前同事也接触过pentaho，但是总体印象不太好。经过两个星期的研究，对pentaho有点初步的认识。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 从总体来讲pentaho还是很强大的，而且是开源的，所以不用花钱也能用。pentaho的文档还算比较多，但是就跟其他的开源项目一样，文档不够细致。一开始的时候我都不知道哪个文档对应哪部分，所以只好每个文档大概看了下，然后自己归档。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;  由于在工作中只涉及到pentaho JFreeReport的报表功能，所以就谈谈自己对这部分的感受。开始的时候自己试验性的做了些报表，感觉文档还是不错的，完全可以根据文档写些简单的报表，但是随着项目的深入发现这块的文档太少了，大部分文档都集中在大体的介绍上，对细节的介绍基本没怎么看见，自己只能看pentaho给的demo来了解一些东西的做法，实在是郁闷了我一阵子。而且在pentaho给的很多工具中有不少bug，对于新手很不利，最后为了达到效果，自己只好用好多工具导来导去来实现一些东西。最郁闷的是在项目过程中我用到subreport，结果发现在生成报表的时候那个subreport有时候可以显示有时候却又不能显示，调试了半天都没把这个问题解决，从个人的角度来看认为是pentaho的一个bug，pentaho的版本是（1.6.0.GA.863），如果谁知道怎么解决，希望告知，最后只好放弃这种做法而用其他的复杂的方法，郁闷。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 对pentaho的了解还不全面，就写些大体的东西，细节还在慢慢的探索之中，欢迎讨论，继续研究去了。
          <br/>
          <span style="color:red;">
            <a href="http://openexperience.javaeye.com/blog/151558#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 28 Dec 2007 17:07:09 +0800</pubDate>
        <link>http://openexperience.javaeye.com/blog/151558</link>
        <guid>http://openexperience.javaeye.com/blog/151558</guid>
      </item>
      <item>
        <title>python利用PIL产生验证码图片</title>
        <author>dongin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openexperience.javaeye.com">dongin</a>&nbsp;
          链接：<a href="http://openexperience.javaeye.com/blog/145972" style="color:red;">http://openexperience.javaeye.com/blog/145972</a>&nbsp;
          发表时间: 2007年12月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 利用PIL来将处理图片，并将字符串跟图片合到一起来产生验证码图片，简单的代码如下：</font></p>
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-py">
    <li class="alt"><span><span class="keyword">def</span><span>&nbsp;make_image(image='test.jpg'): &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">import</span><span>&nbsp;Image,&nbsp;ImageDraw,&nbsp;ImageFont,&nbsp;</span><span class="commonlibs">md5</span><span>,&nbsp;</span><span class="commonlibs">datetime</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;im&nbsp;=&nbsp;Image.</span><span class="builtins">open</span><span>(image) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;font&nbsp;=&nbsp;ImageFont.truetype(&quot;arial.ttf&quot;,&nbsp;30) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;draw&nbsp;=&nbsp;ImageDraw.Draw(im) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;mp&nbsp;=&nbsp;</span><span class="commonlibs">md5</span><span>.</span><span class="commonlibs">new</span><span>() &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;mp_src&nbsp;=&nbsp;mp.</span><span class="builtins">update</span><span>(</span><span class="builtins">str</span><span>(</span><span class="commonlibs">datetime</span><span>.</span><span class="commonlibs">datetime</span><span>.now())) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;mp_src&nbsp;=&nbsp;mp.hexdigest() &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;rand_str&nbsp;=&nbsp;mp_src[0:6]&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;draw.text((10,5),&nbsp;rand_str,&nbsp;font=font) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">del</span><span>&nbsp;draw &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;im.save(&quot;yzm.jpg&quot;) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">if</span><span>&nbsp;</span><span class="builtins">__name__</span><span>&nbsp;==&nbsp;'</span><span class="builtins">__main__</span><span>': &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;make_image() &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>ImageFont.truetype()的第一个参数arial.ttf 可以改成其他的truetype字体，第二个参数30为字体的大小，这个程序只是简单的生成验证码图片，比较复杂的可以看看PIL。</p>
          <br/>
          <span style="color:red;">
            <a href="http://openexperience.javaeye.com/blog/145972#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 04 Dec 2007 18:48:09 +0800</pubDate>
        <link>http://openexperience.javaeye.com/blog/145972</link>
        <guid>http://openexperience.javaeye.com/blog/145972</guid>
      </item>
      <item>
        <title>统计python代码量</title>
        <author>dongin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openexperience.javaeye.com">dongin</a>&nbsp;
          链接：<a href="http://openexperience.javaeye.com/blog/145970" style="color:red;">http://openexperience.javaeye.com/blog/145970</a>&nbsp;
          发表时间: 2007年12月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天闲着没事，花了一点时间写了一个程序来统计一个目录或多个目录下python文件的代码总行数、注释总行数、空行总行数、真正代码总行数。具体代码如下:</p>
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-py">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;CalculateCode(): &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">def</span><span>&nbsp;</span><span class="magicmethods">__init__</span><span>(</span><span class="builtins">self</span><span>): &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="builtins">self</span><span>.total_count&nbsp;=&nbsp;0 &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="builtins">self</span><span>.code_count&nbsp;=&nbsp;0 &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="builtins">self</span><span>.comment_count&nbsp;=&nbsp;0 &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="builtins">self</span><span>.blank_count&nbsp;=&nbsp;0 &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">def</span><span>&nbsp;calculate_file(</span><span class="builtins">self</span><span>,&nbsp;filename): &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="builtins">file</span><span>&nbsp;=&nbsp;</span><span class="builtins">open</span><span>(filename,&nbsp;'r') &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lines&nbsp;=&nbsp;</span><span class="builtins">file</span><span>.</span><span class="builtins">readlines</span><span>() &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line_count&nbsp;=&nbsp;0 &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line_len&nbsp;=&nbsp;</span><span class="builtins">len</span><span>(lines) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="builtins">self</span><span>.total_count&nbsp;+=&nbsp;line_len &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;line_count&nbsp;&lt;&nbsp;line_len: &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line_without_space&nbsp;=&nbsp;lines[line_count].strip() &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;</span><span class="keyword">not</span><span>&nbsp;line_without_space: &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="builtins">self</span><span>.blank_count&nbsp;+=&nbsp;1 &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line_count&nbsp;+=&nbsp;1 &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">elif</span><span>&nbsp;line_without_space.startswith('</span><span class="comment">#'): </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="builtins">self</span><span>.comment_count&nbsp;+=&nbsp;1 &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line_count&nbsp;+=&nbsp;1 &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">elif</span><span>&nbsp;line_without_space.startswith(&quot;</span><span class="string">'''&quot;): </span>&nbsp; </li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.comment_count&nbsp;+=&nbsp;1 </span>&nbsp;</span> </li>
    <li class=""><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line_count&nbsp;+=&nbsp;1 </span>&nbsp;</span> </li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;line_without_space.endswith(&quot;'''</span><span>&quot;): &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;line_count&nbsp;&lt;&nbsp;line_len: &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comment_line&nbsp;=&nbsp;lines[line_count].strip() &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="builtins">self</span><span>.comment_count&nbsp;+=&nbsp;1 &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line_count&nbsp;+=&nbsp;1 &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;comment_line.endswith(&quot;'''&quot;): &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>: &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="builtins">self</span><span>.code_count&nbsp;+=&nbsp;1 &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line_count&nbsp;+=&nbsp;1 &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">def</span><span>&nbsp;calculate_directory(</span><span class="builtins">self</span><span>,&nbsp;directory): &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">import</span><span>&nbsp;</span><span class="commonlibs">os</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;</span><span class="commonlibs">os</span><span>.path.isfile(directory): &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;</span><span class="commonlibs">os</span><span>.path.splitext(directory)[1]&nbsp;==&nbsp;'.py': &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="builtins">self</span><span>.calculate_file(directory) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>: &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">raise</span><span>&nbsp;</span><span class="exceptions">Exception</span><span>('The&nbsp;</span><span class="builtins">file</span><span>&nbsp;must&nbsp;be&nbsp;a&nbsp;python&nbsp;</span><span class="builtins">file</span><span>') &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">elif</span><span>&nbsp;</span><span class="commonlibs">os</span><span>.path.isdir(directory): &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;path&nbsp;</span><span class="keyword">in</span><span>&nbsp;</span><span class="commonlibs">os</span><span>.listdir(directory): &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;</span><span class="commonlibs">os</span><span>.path.isdir(directory+'\\'+path): &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="builtins">self</span><span>.calculate_directory(directory+'\\'+path) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">elif</span><span>&nbsp;</span><span class="commonlibs">os</span><span>.path.splitext(path)[1]&nbsp;==&nbsp;'.py': &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="builtins">self</span><span>.calculate_file(directory+'\\'+path) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>: &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">pass</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>: &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">raise</span><span>&nbsp;</span><span class="exceptions">Exception</span><span>('No&nbsp;this&nbsp;directory&nbsp;</span><span class="keyword">or</span><span>&nbsp;</span><span class="builtins">file</span><span>!') &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">def</span><span>&nbsp;calculate_directories(</span><span class="builtins">self</span><span>,&nbsp;directories): &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;directory&nbsp;</span><span class="keyword">in</span><span>&nbsp;directories: &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="builtins">self</span><span>.calculate_directory(directory) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">def</span><span>&nbsp;show_result(</span><span class="builtins">self</span><span>): &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">print</span><span>&nbsp;'total_count:&nbsp;%d\ncode_count:&nbsp;%d\ncomment_count:&nbsp;%d\nblank_count:&nbsp;%d\n'&nbsp;\ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%(</span><span class="builtins">self</span><span>.total_count,</span><span class="builtins">self</span><span>.code_count,</span><span class="builtins">self</span><span>.comment_count,</span><span class="builtins">self</span><span>.blank_count)&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">if</span><span>&nbsp;</span><span class="builtins">__name__</span><span>&nbsp;==&nbsp;'</span><span class="builtins">__main__</span><span>': &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">import</span><span>&nbsp;</span><span class="commonlibs">sys</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;</span><span class="builtins">len</span><span>(</span><span class="commonlibs">sys</span><span>.argv)&nbsp;&gt;&nbsp;1: &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path_list&nbsp;=&nbsp;</span><span class="commonlibs">sys</span><span>.argv[1:] &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calculate_code&nbsp;=&nbsp;CalculateCode() &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calculate_code.calculate_directories(path_list) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calculate_code.show_result() &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>: &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">print</span><span>&nbsp;'Please&nbsp;use&nbsp;command&nbsp;like&nbsp;this:\n&quot;python&nbsp;calculatecode.py&nbsp;directory1&nbsp;directory2&nbsp;...&quot;'&nbsp;&nbsp;</span> </li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://openexperience.javaeye.com/blog/145970#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 04 Dec 2007 18:33:44 +0800</pubDate>
        <link>http://openexperience.javaeye.com/blog/145970</link>
        <guid>http://openexperience.javaeye.com/blog/145970</guid>
      </item>
      <item>
        <title>一个简单的python socket编程</title>
        <author>dongin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openexperience.javaeye.com">dongin</a>&nbsp;
          链接：<a href="http://openexperience.javaeye.com/blog/145701" style="color:red;">http://openexperience.javaeye.com/blog/145701</a>&nbsp;
          发表时间: 2007年12月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          python 编写server的步骤：<br />
<ol>
    <li>
    <p>第一步是创建socket对象。调用socket构造函数。如：<br />
    <br />
    socket = socket.socket( family, type )<br />
    <br />
    family参数代表地址家族，可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址，AF_UNIX家族用于同一台机器上的进程间通信。<br />
    type参数代表套接字类型，可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。</p>
    </li>
    <li>
    <p>第二步是将socket绑定到指定地址。这是通过socket对象的bind方法来实现的：<br />
    <br />
    socket.bind( address ) <br />
    <br />
    <br />
    <br />
    由AF_INET所创建的套接字，address地址必须是一个双元素元组，格式是(host,port)。host代表主机，port代表端口号。如果端口号正在使用、主机名不正确或端口已被保留，bind方法将引发socket.error异常。</p>
    </li>
    <li>
    <p>第三步是使用socket套接字的listen方法接收连接请求。</p>
    <p>socket.listen( backlog )</p>
    <p>backlog指定最多允许多少个客户连接到服务器。它的值至少为1。收到连接请求后，这些请求需要排队，如果队列满，就拒绝请求。</p>
    </li>
    <li>
    <p>第四步是服务器套接字通过socket的accept方法等待客户请求一个连接。<br />
    <br />
    connection, address = socket.accept()<br />
    <br />
    调 用accept方法时，socket会时入&ldquo;waiting&rdquo;状态。客户请求连接时，方法建立连接并返回服务器。accept方法返回一个含有两个元素的 元组(connection,address)。第一个元素connection是新的socket对象，服务器必须通过它与客户通信；第二个元素 address是客户的Internet地址。</p>
    </li>
    <li>第五步是处理阶段，服务器和客户端通过send和recv方法通信(传输 数据)。服务器调用send，并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。服务器使用recv方法从客户接收信息。调用recv 时，服务器必须指定一个整数，它对应于可通过本次方法调用来接收的最大数据量。recv方法在接收数据时会进入&ldquo;blocked&rdquo;状态，最后返回一个字符 串，用它表示收到的数据。如果发送的数据量超过了recv所允许的，数据会被截短。多余的数据将缓冲于接收端。以后调用recv时，多余的数据会从缓冲区 删除(以及自上次调用recv以来，客户可能发送的其它任何数据)。</li>
    <li>传输结束，服务器调用socket的close方法关闭连接。</li>
</ol>
python编写client的步骤：<br />
<ol>
    <li>创建一个socket以连接服务器：socket = socket.socket( family, type )</li>
    <li>
    <p>使用socket的connect方法连接服务器。对于AF_INET家族,连接格式如下：</p>
    <p>socket.connect( (host,port) )</p>
    <p>host代表服务器主机名或IP，port代表服务器进程所绑定的端口号。如连接成功，客户就可通过套接字与服务器通信，如果连接失败，会引发socket.error异常。</p>
    </li>
    <li>处理阶段，客户和服务器将通过send方法和recv方法通信。</li>
    <li>传输结束，客户通过调用socket的close方法关闭连接。</li>
</ol>
下面给个简单的例子：<br />
<br />
server.py <br />
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-py" start="1">
    <li class="alt"><span><span class="keyword">if</span><span>&nbsp;</span><span class="builtins">__name__</span><span>&nbsp;==&nbsp;'</span><span class="builtins">__main__</span><span>':&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">import</span><span>&nbsp;</span><span class="commonlibs">socket</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;sock&nbsp;=&nbsp;<span class="commonlibs">socket</span><span>.</span><span class="commonlibs">socket</span><span>(</span><span class="commonlibs">socket</span><span>.AF_INET,&nbsp;</span><span class="commonlibs">socket</span><span>.SOCK_STREAM)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;sock.bind(('localhost',&nbsp;8001))&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;sock.listen(5)&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">while</span><span>&nbsp;</span><span class="builtins">True</span><span>:&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection,address&nbsp;=&nbsp;sock.accept()&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>:&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.settimeout(5)&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf&nbsp;=&nbsp;connection.recv(1024)&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;buf&nbsp;==&nbsp;'1':&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.send('welcome&nbsp;to&nbsp;server!')&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.send('please&nbsp;go&nbsp;out!')&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">except</span><span>&nbsp;</span><span class="commonlibs">socket</span><span>.timeout:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">print</span><span>&nbsp;'</span><span class="commonlibs">time</span><span>&nbsp;out'&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection.<span class="builtins">close</span><span>()&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
client.py<br />
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-py" start="1">
    <li class="alt"><span><span class="keyword">if</span><span>&nbsp;</span><span class="builtins">__name__</span><span>&nbsp;==&nbsp;'</span><span class="builtins">__main__</span><span>':&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">import</span><span>&nbsp;</span><span class="commonlibs">socket</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;sock&nbsp;=&nbsp;<span class="commonlibs">socket</span><span>.</span><span class="commonlibs">socket</span><span>(</span><span class="commonlibs">socket</span><span>.AF_INET,&nbsp;</span><span class="commonlibs">socket</span><span>.SOCK_STREAM)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;sock.connect(('localhost',&nbsp;8001))&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">import</span><span>&nbsp;</span><span class="commonlibs">time</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="commonlibs">time</span><span>.sleep(2)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;sock.send('1')&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">print</span><span>&nbsp;sock.recv(1024)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;sock.<span class="builtins">close</span><span>()&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
在终端运行server.py，然后运行clien.py，会在终端打印&ldquo;welcome  to server!&quot;。如果更改client.py的sock.send('1')为其它值在终端会打印&rdquo;please go out!&ldquo;，更改time.sleep(2)为大于5的数值， 服务器将会超时。
          <br/>
          <span style="color:red;">
            <a href="http://openexperience.javaeye.com/blog/145701#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 03 Dec 2007 21:57:27 +0800</pubDate>
        <link>http://openexperience.javaeye.com/blog/145701</link>
        <guid>http://openexperience.javaeye.com/blog/145701</guid>
      </item>
      <item>
        <title>开机隐藏cmd运行程序</title>
        <author>dongin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openexperience.javaeye.com">dongin</a>&nbsp;
          链接：<a href="http://openexperience.javaeye.com/blog/145622" style="color:red;">http://openexperience.javaeye.com/blog/145622</a>&nbsp;
          发表时间: 2007年12月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 如果有个程序运行的时候不想让它显示cmd界面，比如我正在做的一个网吧项目就需要这样。下面举个小例子来测试一下：<br />
先建一个python文件test.py，代码如下：<br />
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<ol class="dp-py" start="1">
    <li class="alt"><span><span class="keyword">if</span><span>&nbsp;</span><span class="builtins">__name__</span><span>&nbsp;==&nbsp;&quot;</span><span class="builtins">__main__</span><span>&quot;:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">import</span><span>&nbsp;</span><span class="commonlibs">time</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">while</span><span>&nbsp;</span><span class="builtins">True</span><span>:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="builtins">file</span><span>&nbsp;=&nbsp;</span><span class="builtins">open</span><span>('test.txt',&nbsp;'a')&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="builtins">file</span><span>.</span><span class="builtins">write</span><span>('run&nbsp;</span><span class="keyword">in</span><span>&nbsp;background\n')&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="builtins">file</span><span>.</span><span class="builtins">close</span><span>()&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="commonlibs">time</span><span>.sleep(1)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">print</span><span>&nbsp;&quot;it's&nbsp;running...&quot;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
接着写个批处理文件(test.bat），内容如下：<br />
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<ol class="dp-py" start="1">
    <li class="alt"><span><span>python&nbsp;test.py&nbsp;&nbsp;</span></span></li>
</ol>
</div>
如果运行这个批处理文件，可以看见在cmd中一直打印&quot;it's running...&quot;，<br />
最后关键部分就是写一个test.vbs文件，内容如下:<br />
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<ol class="dp-py" start="1">
    <li class="alt"><span><span>Set&nbsp;ws&nbsp;=&nbsp;CreateObject(&quot;Wscript.Shell&quot;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>ws.run&nbsp;&quot;<span class="commonlibs">cmd</span><span>&nbsp;/c&nbsp;test.bat&quot;,vbhide&nbsp;&nbsp;</span></span></li>
</ol>
</div>
双击test.vbs后test.py就会在后台执行而部显示cmd，可以从test.txt或进程中看出test.py正在运行。最后要做的就是把test.vbs拖到 windows的&lsquo;&rsquo;启动&ldquo;力即可。
          <br/>
          <span style="color:red;">
            <a href="http://openexperience.javaeye.com/blog/145622#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 03 Dec 2007 16:14:02 +0800</pubDate>
        <link>http://openexperience.javaeye.com/blog/145622</link>
        <guid>http://openexperience.javaeye.com/blog/145622</guid>
      </item>
      <item>
        <title>计算python代码和db运行时间的middleware</title>
        <author>dongin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openexperience.javaeye.com">dongin</a>&nbsp;
          链接：<a href="http://openexperience.javaeye.com/blog/145611" style="color:red;">http://openexperience.javaeye.com/blog/145611</a>&nbsp;
          发表时间: 2007年12月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          如果一个网页访问速度较慢或并发量较少时，我们需要我定位时间都花在哪里，下面是一个middleware来计算python代码和数据库运行时间：<br />
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<ol class="dp-py" start="1">
    <li class="alt"><span><span class="keyword">from</span><span>&nbsp;</span><span class="commonlibs">datetime</span><span>&nbsp;</span><span class="keyword">import</span><span>&nbsp;</span><span class="commonlibs">datetime</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;</span><span class="commonlibs">os</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;</span><span class="commonlibs">time</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">from</span><span>&nbsp;django.conf&nbsp;</span><span class="keyword">import</span><span>&nbsp;settings&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">from</span><span>&nbsp;django.db&nbsp;</span><span class="keyword">import</span><span>&nbsp;connection&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">from</span><span>&nbsp;django.template&nbsp;</span><span class="keyword">import</span><span>&nbsp;Template,&nbsp;Context&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;TimeMiddleware(</span><span class="keyword">object</span><span>):&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;process_request(</span><span class="builtins">self</span><span>,&nbsp;request):&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.META['page_render_start']&nbsp;=&nbsp;<span class="commonlibs">time</span><span>.</span><span class="commonlibs">time</span><span>()&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;None&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;process_response(</span><span class="builtins">self</span><span>,&nbsp;request,&nbsp;response):&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;=&nbsp;Template(<span class="string">'''</span> </span>{{&nbsp;stat&nbsp;}}<span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
    </span></span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'''</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stat_fmt&nbsp;=&nbsp;'Total:&nbsp;%.2f,&nbsp;Python:&nbsp;%.2f,&nbsp;DB:&nbsp;%.2f,&nbsp;Queries:&nbsp;%d'&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delta&nbsp;=&nbsp;<span class="commonlibs">datetime</span><span>.now()&nbsp;-&nbsp;</span><span class="commonlibs">datetime</span><span>.fromtimestamp(request.META.</span><span class="builtins">get</span><span>('page_render_start'))&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;=&nbsp;delta.seconds&nbsp;+&nbsp;delta.microseconds&nbsp;/&nbsp;1000000.0&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;=&nbsp;0&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;query&nbsp;</span><span class="keyword">in</span><span>&nbsp;connection.queries:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db&nbsp;+=&nbsp;<span class="builtins">float</span><span>(query['</span><span class="commonlibs">time</span><span>'])&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="commonlibs">stat</span><span>&nbsp;=&nbsp;stat_fmt&nbsp;%&nbsp;(total,&nbsp;total&nbsp;-&nbsp;db,&nbsp;db,&nbsp;</span><span class="builtins">len</span><span>(connection.queries))&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">print</span><span>&nbsp;</span><span class="commonlibs">stat</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;response&nbsp;&nbsp;</span></span></li>
</ol>
</div>
讲上面代码放入一个python文件，然后在项目的settings中注册这个middleware，你就可以知道消耗时间的地方。
          <br/>
          <span style="color:red;">
            <a href="http://openexperience.javaeye.com/blog/145611#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 03 Dec 2007 15:19:04 +0800</pubDate>
        <link>http://openexperience.javaeye.com/blog/145611</link>
        <guid>http://openexperience.javaeye.com/blog/145611</guid>
      </item>
      <item>
        <title>用django signals来同步数据</title>
        <author>dongin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openexperience.javaeye.com">dongin</a>&nbsp;
          链接：<a href="http://openexperience.javaeye.com/blog/145568" style="color:red;">http://openexperience.javaeye.com/blog/145568</a>&nbsp;
          发表时间: 2007年12月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  django signals 通过：<br />
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<ol class="dp-py" start="1">
    <li class="alt"><span><span class="keyword">from</span><span>&nbsp;django.db.models&nbsp;</span><span class="keyword">import</span><span>&nbsp;signals&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">from</span><span>&nbsp;django.dispatch&nbsp;</span><span class="keyword">import</span><span>&nbsp;dispatcher&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>dispatcher.send(<span class="commonlibs">signal</span><span>=signals.post_save,&nbsp;sender=</span><span class="builtins">self</span><span>.__class__,&nbsp;instance=</span><span class="builtins">self</span><span>)&nbsp;&nbsp;</span></span></li>
</ol>
</div>
来定义你需要抛出的signals的地方和类型，django自己本身支持8个signals：<code>class_prepared，</code><code>pre_init，</code><code>post_init，</code><code>pre_save</code>，<code>post_save</code>，<code>pre_delete，</code><code>post_delete，</code><code>post_syncdb。然后通过：<br />
</code>
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<ol class="dp-py" start="1">
    <li class="alt"><span><span class="keyword">from</span><span>&nbsp;django.contrib.auth&nbsp;</span><span class="keyword">import</span><span>&nbsp;models&nbsp;as&nbsp;auth_app&nbsp;&nbsp;</span></span></li>
    <li class=""><span>dispatcher.connect(create_superuser,&nbsp;sender=auth_app,&nbsp;<span class="commonlibs">signal</span><span>=signals.post_save)&nbsp;&nbsp;</span></span></li>
</ol>
</div>
来捕获你想要的signals，这里是auth_app 的signals.post_save，当捕获到这个signals时调用create_superuser函数,这个函数可以获得抛出signals的对象实例（instance）,但是我发现，这个实例的属性是可以得到的，但是却不具备数据库关系。就是通过这个实例并不能得到外键对象的属性。例如: 我们有对象A和B, B是A的外键，利用signals我们获得了A的实例a，但是通过a我们并不能获得B的的属性。下面讲一个我在项目中的应用：<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 曾经写过一个对网站的优化（django），在测试过程中发现数据库的连接数太大，有些是代码的原因，有些在代码级别不好改，所以就准备为这些连接写一个 缓存。基本思想是，从数据库取出来的queryset通过memcached缓存，以后的连接就直接到缓存去取，如果缓存中没有就到数据库中去取，然后缓 存起来。这过程中会涉及到一个问题，就是怎样保证数据库和缓存中数据的同步，在这里我用的是<a href="http://code.djangoproject.com/wiki/Signals">django signals</a>。<br />
&nbsp;&nbsp;&nbsp; &nbsp; singals可以通过：
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<ol class="dp-py" start="1">
    <li class="alt"><span><span>dispatcher.connect(exe_signals,&nbsp;</span><span class="commonlibs">signal</span><span>=signals.post_save)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>dispatcher.connect(exe_signals,&nbsp;<span class="commonlibs">signal</span><span>=signals.post_delete)&nbsp;&nbsp;</span></span></li>
</ol>
</div>
来捕获数据库的变动，然后执行exe_signals函数来处理缓存,将缓存中变动的部分从缓存中清除出去，从而达到数据的同步。这样只要有个好的清除算法，我们就不用来设置缓存的过期时间，因为缓存中的数据永远是最新的。<br />
          <br/>
          <span style="color:red;">
            <a href="http://openexperience.javaeye.com/blog/145568#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 03 Dec 2007 12:18:37 +0800</pubDate>
        <link>http://openexperience.javaeye.com/blog/145568</link>
        <guid>http://openexperience.javaeye.com/blog/145568</guid>
      </item>
      <item>
        <title>django自定义model</title>
        <author>dongin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openexperience.javaeye.com">dongin</a>&nbsp;
          链接：<a href="http://openexperience.javaeye.com/blog/145562" style="color:red;">http://openexperience.javaeye.com/blog/145562</a>&nbsp;
          发表时间: 2007年12月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 前不久在一个项目中遇到了一个问题，客户要求把django的admin后台的某些field变成文本编辑框，也就是把文本编辑器集成到admin后台， 开始在网上查了一下，发现大部分人都是重写了admin后台，但是从我的项目来看，要是这样做的话工作量很大，而且都是些重复的工作。看了一下 django关于field那块的源码，发现django的所有field都是继承一个Filed基类，然后自己定义不同field的功能，同时包括在 admin后台的显示。所以就有了自己定义field的想法，给项目节省了不少时间。具体如下：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  在项目中下加了个python包，包名叫mymodels（自己起名），这个包下包含__init__.py 和forms.py两个文件，文件内容如下：<br />
<br />
__init__.py：<br />
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<ol class="dp-py" start="1">
    <li class="alt"><span><span class="keyword">from</span><span>&nbsp;django.db&nbsp;</span><span class="keyword">import</span><span>&nbsp;models&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;forms&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;RichTextField(models.TextField):&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;get_internal_type(</span><span class="builtins">self</span><span>):&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;&quot;TextField&quot;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;get_manipulator_field_objs(</span><span class="builtins">self</span><span>):&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;[forms.RichTextField]&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
forms.py：<br />
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<ol class="dp-py" start="1">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;django.forms&nbsp;as&nbsp;djangoforms&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;RichTextField(djangoforms.LargeTextField):&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;render(</span><span class="builtins">self</span><span>,data):&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;djangoforms.LargeTextField.render(</span><span class="builtins">self</span><span>,data)&nbsp;+&nbsp;</span><span class="string">&quot;&quot;&quot;</span>&nbsp;</span></li>
    <li class=""><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<script></script></span>&nbsp;</span></li>
    <li class="alt"><span><span class="string">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<script></span> </span></li>
    <li class=""><span><span class="string">            window.onload=function(){</span> </span></li>
    <li class="alt"><span><span class="string">                var sBasePath="/media/FCKeditor/";</span> </span></li>
    <li class=""><span><span class="string">                var oFCKeditor=new FCKeditor("%s",500,400,"Pic","500");</span> </span></li>
    <li class="alt"><span><span class="string">                oFCKeditor.BasePath=sBasePath;oFCKeditor.ReplaceTextarea();</span> </span></li>
    <li class=""><span><span class="string">                                }</span> </span></li>
    <li class="alt"><span><span class="string">        </script>&quot;&quot;&quot;</span><span>&nbsp;%&nbsp;</span><span class="builtins">self</span><span>.field_name&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
这里我用的FCKeditor文本编辑器。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  这样你只要在apps中的model中这样定义field：rich_text = mymodels.RichTextField() ，在admin后台这个field就会是继承有文本编辑器的文本编辑域，非常方便。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 同时要注意，我这里写发会带来一个问题，如果一个model中包含多个这样的域，FCKeditor就会被加载多次，所以那段初始化FCKeditor的js代码可以写在别的地方来解决这个问题。至于放哪，自己想想吧。
          <br/>
          <span style="color:red;">
            <a href="http://openexperience.javaeye.com/blog/145562#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 03 Dec 2007 11:59:33 +0800</pubDate>
        <link>http://openexperience.javaeye.com/blog/145562</link>
        <guid>http://openexperience.javaeye.com/blog/145562</guid>
      </item>
      <item>
        <title>表头排序速度的测试</title>
        <author>dongin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://openexperience.javaeye.com">dongin</a>&nbsp;
          链接：<a href="http://openexperience.javaeye.com/blog/145547" style="color:red;">http://openexperience.javaeye.com/blog/145547</a>&nbsp;
          发表时间: 2007年12月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div align="left">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 今天在项目中用到了表头排序，最先用的是jQuery的插件，发现在数据量比较大时，速度还是比较慢 ，所以又找了其他几个网上用得比较多的，同时对他们的处理大数据量时的速度进行了简单的测试，测试结果如下：<br />
<ul>
    <li>http://webfx.eae.net/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 后面用sortable table表示</li>
    <li>http://tablesorter.com/docs/&nbsp;&nbsp;&nbsp; 后面用jquery sort table 表示</li>
    <li>http://www.kryogenix.org/code/browser/sorttable/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 后面用sort table表示</li>
</ul>
测试数据都是1000行，时间为ms（毫秒），第一次开浏览器的排序时间：<br />
<table cellspacing="1" border="1" align="" height="107" summary="" cellpadding="1" width="655">
    <tbody>
        <tr>
            <td>&nbsp;</td>
            <td>sortable table</td>
            <td>jquery sort table</td>
            <td>sort table</td>
        </tr>
        <tr>
            <td>1列</td>
            <td>721</td>
            <td>1143</td>
            <td>904</td>
        </tr>
        <tr>
            <td>2列</td>
            <td>902</td>
            <td>1589</td>
            <td>1750</td>
        </tr>
        <tr>
            <td>4列</td>
            <td>1136</td>
            <td>1881</td>
            <td>2308</td>
        </tr>
        <tr>
            <td>8列</td>
            <td>1409</td>
            <td>2387</td>
            <td>2465</td>
        </tr>
    </tbody>
</table>
<br />
以上测试都是简单进行了一下测试，结果可能有差别，但是从整体来看，sortable table的速度还是比其他两个的速度快不少，<br />
所以我们在项目采用了sortable table ，在实际的应用中效果还是很不错的。由于测试代码比较多，所以在这里就不贴上了。<br />
</div>
          <br/>
          <span style="color:red;">
            <a href="http://openexperience.javaeye.com/blog/145547#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 03 Dec 2007 11:17:08 +0800</pubDate>
        <link>http://openexperience.javaeye.com/blog/145547</link>
        <guid>http://openexperience.javaeye.com/blog/145547</guid>
      </item>
  </channel>
</rss>