<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>dudu powered</title>
    <description>左手Python,右手Java;埋藏Data</description>
    <link>http://devsharp.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>New SubProject TPDA </title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/177700" style="color:red;">http://devsharp.javaeye.com/blog/177700</a>&nbsp;
          发表时间: 2008年03月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Xspider2的前期已经完成,目前的版本是0.1.1b可以实现</p><p>&nbsp;</p><p><span style="font-size: small">Single page的抓取; 页面深度的返回与存储</span></p><p>&nbsp;</p><p>现在打算在X2的基础上增加一个页面深度及路径的算法,这个算法我称之为TPDA,按照GNU风格的解释</p><p>&nbsp;</p><p><span style="font-size: small"><span style="font-size: medium">TPDA: The Page/Point Depth Algorithm.</span></span></p><p>&nbsp;</p><p>争取实现:</p><ul><li>页面深度和路径</li><li>无分词文本空间高频词语提取</li></ul><ul><li>路径最优算法</li></ul>核心算法可能采取JAVA去描述,Python来实现架构,有机会的话最好实践把Perl
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/177700#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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>Sun, 30 Mar 2008 00:09:31 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/177700</link>
        <guid>http://devsharp.javaeye.com/blog/177700</guid>
      </item>
      <item>
        <title>Zend 学习笔记</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/174758" style="color:red;">http://devsharp.javaeye.com/blog/174758</a>&nbsp;
          发表时间: 2008年03月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>这一周是忙碌的,高压的.<br />终于在昨天下班前完成了leader交给我的练手项目,公司是用Zend框架开发的,但是之前leader考虑到我对php不是很熟悉,就让我先去做一个爬虫的项目(Python),这个project完成之后,几乎没有时间再来学习php了,好在我的好友Bluker及时加盟公司，在他的帮助下，我渐渐的对Zend/php有了点感觉.<br /><br />项目很简单,实现一个投票的前台功能,后台已经开发好了,基本的lib也做好了.我与要做的就是完成一个front的voteController,和voteView以及扩展Common_Vote。<br /><img src="http://lh4.google.com/myctrls/R-RyaiOJ3FI/AAAAAAAAAFg/N-eBVMy9ym8/Common%20Vote.png" height="230" alt="" width="300" /> <br /><br />基本上,通过这个项目使我对MVC加深了认识,也使我对OO有了新的看法,高度的封装初期让我很不舒服.</p><p>&nbsp;</p><p><span style="font-size: x-small">学了不少小的东西,比如在Zend_DB_Table中操作Rowset对象的FetchAll方法,可选的三个参数:</span></p><p><span style="font-size: x-small; font-family: courier new,courier">$order 索引排序;</span></p><p><span style="font-size: x-small; font-family: courier new,courier">$count 返回几行row数据;</span></p><p><span style="font-size: x-small; font-family: courier new,courier">$offset偏移值,即从第几行数据开始读取返回;</span></p><p><span style="font-size: x-small; font-family: courier new,courier">$where 查询语句;</span></p><p><span style="font-size: x-small; font-family: courier new,courier">$rowset=Zend_DB_Table_Object::fetchAll($where,<strong><span style="color: #ff0000">$order</span></strong>,$count,$offset),<em><span style="color: #ff0000">$order是必须有的.</span></em></span></p><p>&nbsp;</p><p>&nbsp;</p><p><strong><span style="color: #ff0000"><span style="font-family: courier new,courier">foreach($dinstanceObject as $key=&gt;$value)</span> </span></strong>php中的这个键/值数组概念很象Python中的字典,而它的数字序列数组和Python中的list和C中的Array是一样的。</p><p>这里牵扯到一个小的问题,在 php中如下两个数组是不一样的:</p><p>$arr1=('0'=&gt;'a','1'=&gt;'b','2'=&gt;'c');</p><p>$arr2=('a','b','c');</p><p>前者$arr1是一个键值数组,后者是一个数字序列数组.不过我在ZendStudio中用dump()的时候 确实一样的...</p><p>对于$arr1这样的数组,php提供了一种遍历Key/Value的方法,foreach.</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>现在正在研究最后的表现技术.</p><p>&nbsp;</p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/174758#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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>Sat, 22 Mar 2008 11:03:05 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/174758</link>
        <guid>http://devsharp.javaeye.com/blog/174758</guid>
      </item>
      <item>
        <title>微软精巧500键鼠入手,贺访问量过1100</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/172376" style="color:red;">http://devsharp.javaeye.com/blog/172376</a>&nbsp;
          发表时间: 2008年03月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          哇哈哈,访问量过1100了!今天去买了一套Microsoft Wired Desktop 500,感觉好不错 很有手感.<img src="/images/smiles/icon_biggrin.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/172376#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 16 Mar 2008 18:49:42 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/172376</link>
        <guid>http://devsharp.javaeye.com/blog/172376</guid>
      </item>
      <item>
        <title>起点小说下载工具 代码汇</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/171568" style="color:red;">http://devsharp.javaeye.com/blog/171568</a>&nbsp;
          发表时间: 2008年03月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          起点现在的双域名分别是不同的页面架构技术:<br />cmfu是原来老的ASP,对于公开章节,起点采用的是js调用一个txt,相对原来直接页面显示,确实是一个明智的选择(对抓取的来说也方便:p).<br />qidian采用的是新的.Net技术,这个里面就需要采用正则去匹配了.<br /><br />结合上一篇文章我的小程序,这里将社区内相关的代码全部show一下.<br />首先是我的:<br /><pre name="code" class="python">
#!/usr/bin/python
#filename:simpleCMFU
import re
import urllib

def alaynsis_id(url_given):
    name=url_given[-11:-1]+url_given[-1]
    return name
    

def read(url_given):
    html=urllib.urlopen(url_given)
    page=html.read()
    html.close()
    #rex = r'http:\/\/files\.qidian\.com\/\[a-zA-Z]{6}[0-9]\/d{6}\/\d{6}\.txt'
    rex = r'http://files.qidian.com/author[0-9]/\d{6}/\d{7}.txt'
    #http://files.qidian.com/author3/172602/4451850.txt
    url_down=test(page,rex)
    url=url_down[0]
    #print rex
    return url

def read2(url,name):
    html=urllib.urlopen(url)
    page=html.read()
    html.close()
    page=page[15:len(page)]
    fl=file(name,'w')
    fl.write(page)
    fl.close()
    return 'ok'

def test(html,rex):
    #r = re.compile(rex)
    matchs = re.findall(rex,html,re.DOTALL)
    return matchs

def run():
    url=raw_input('please send address you wanted:')
    url_tmp=read(url)
    name=alaynsis_id(url_tmp)
    read2(url_tmp,name)

if __name__ == '__main__':
    print 'this program is just for download text from qidian.com by duducai@msn.com\please visit http://duducai.javaeye.com \n'
    run()

</pre><br /><br />其次是社区Ben Luo的大作,走的是sina读书频道:<br /><pre name="code" class="python">
#####################
#html2txt.py
#####################

from formatter import AbstractFormatter, NullWriter
from htmllib import HTMLParser

def _(str, in_encoder="gbk", out_encoder="utf8"):
    return unicode(str, in_encoder).encode(out_encoder)


class myWriter(NullWriter):
    def __init__(self):
        NullWriter.__init__(self)
        self._bodyText = []

    def send_flowing_data(self, str):
        self._bodyText.append(str)

    def _get_bodyText(self):
        return '\n'.join(self._bodyText)

    bodyText = property(_get_bodyText, None, None, 'plain text from body')

class myHTMLParser(HTMLParser):
    def do_meta(self, attrs):
        self.metas = attrs

def convertFile(filename):
    mywriter = myWriter()
    absformatter = AbstractFormatter(mywriter)
    parser = myHTMLParser(absformatter)
    parser.feed(open(filename).read())
    return ( _(parser.title), parser.formatter.writer.bodyText )

import os
import os.path

OUTPUTDIR = "./txt"
INPUTDIR = "."
if __name__ == "__main__":
    if not os.path.exists(OUTPUTDIR):
        os.mkdir(OUTPUTDIR)

    for file in os.listdir(INPUTDIR):
        if file[-4:] == '.htm' or file[-5:] == '.html':
            print "Coverting", file,
            outfilename = os.path.splitext(file)[0]
            a, text = convertFile(file)
            outfilename = outfilename + '.txt'
            outfullname = os.path.join(OUTPUTDIR, outfilename)
            open(outfullname, "wt").write(text)
            print "Done!"

</pre><br /><br /><pre name="code" class="python">
################################
#pickupcontent.py
################################

# -*- coding: utf-8 -*-

import sys
import glob
import os
import re

sys.argv[1:] = [item for arg in sys.argv[1:] for item in glob.glob(arg)]
startstr = u"^八十".encode("gb2312") # article title
endstr = u"^\[返回".encode("gb2312") #
tmp_start = re.compile(startstr)
tmp_end = re.compile(endstr)
for infile in sys.argv[1:]:
   # print infile
    f = open(infile,'r')
    #print f
    lines = f.readlines()
    fout = ''
    for index, line in enumerate(lines):
        if tmp_start.match(line):
            kstart = index
        if tmp_end.match(line):
            kend = index
            break

    f.close()
    fout = fout.join(lines[kstart:kend])
    tmp = open('tmp','w')
    tmp.write(fout)
    tmp.close()
    os.remove(infile)
    os.rename('tmp',infile)

</pre><br /><br />最后是BIGZHU的:<br /><pre name="code" class="python">
#@+leo-ver=4-thin-encoding=gb2312,.
#@+node:BIGZHU.20070731160918:@thin d:/bigzhu/python/python_project/get_cmfu.py
#@+at
#@nonl
# 起点小说爬虫
#@-at
#@@c
#@@language python
#@+others
#@+node:BIGZHU.20070731161308:import
import httplib,urllib2,urllib,cookielib,re,threading
import os
#@nonl
#@-node:BIGZHU.20070731161308:import
#@+node:BIGZHU.20070731160928:getCookie
def getCookie():
    cj = cookielib.CookieJar()#建立Cookie实例
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))#建立opener与Cookie关联
    return opener
#@-node:BIGZHU.20070731160928:getCookie
#@-others
#@&lt;&lt;getBookIdList>>
#@+node:BIGZHU.20070731160918.1:&lt;&lt;getBookIdList>>
def getBookIdList(urlList):

    BookIdList = []
    for i in urlList:
        url=i
        #print url
        request = urllib2.urlopen(url)
        cmfu = request.read()
        #cmfuURL = re.findall("&lt;a href='showbook.asp\?bl_id=\d{1 ,}'",cmfu)
        #BookIdListTemp = [re.sub("&lt;a href='showbook.asp\?bl_id=",'',k) for k in cmfuURL]
        #BookIdListTemp = [re.sub("'",'',k) for k in BookIdListTemp]
        #起点的代码太不规范了,想一个更广泛性的匹配正则表达式
        """
        cmfuURL = re.findall("showbook.asp\?bl_id=\d{1,}",cmfu)
        BookIdListTemp = [re.sub("showbook.asp\?bl_id=",'',k) for k in cmfuURL]
        """
        #更大众化一些
        cmfuURL = re.findall("bl_id=\d{1,}",cmfu)
        BookIdListTemp = [re.sub("bl_id=",'',k) for k in cmfuURL]
        #BookIdListTemp = [ re.sub("'",'',k) for k in BookIdListTemp]
        bookCount = len(BookIdList)
        for listTemp in BookIdListTemp:
            #检查该bookid是否在BookIdList中已有
            if listTemp in BookIdList:
                pass
            else:
                BookIdList.extend([listTemp])#加进去
        print "取得书本数目:%i"%(len(BookIdList)-bookCount)
    print "合计取得下载书本:%i"%len(BookIdList)
    return BookIdList

#@-node:BIGZHU.20070731160918.1:&lt;&lt;getBookIdList>>
#@nl
#@&lt;&lt;getBookName>>
#@+node:BIGZHU.20070731164705:&lt;&lt;getBookName>>
def getBookName(opener,bookId=''):
    if bookId == '':
        print "传入BookIdList是空的"
    bookURL = 'http://www.cmfu.com/readbook.asp?bl_id=%s'%bookId
    request = urllib2.Request(bookURL)
    bookPage = opener.open(request).read()
    opener.close()
    bookname =  re.findall('bookname=\S{1,}',bookPage)

    bookname = [re.sub("bookname=",'',k) for k in bookname]
    bookname = [re.sub('"','',k) for k in bookname][0]

    return bookname

#@-node:BIGZHU.20070731164705:&lt;&lt;getBookName>>
#@nl
#@&lt;&lt;getTextFile>>
#@+node: BIGZHU.20070731171721:&lt;&lt;getTextFile>>
def getTextFile(opener,bookId):
        bookName = getBookName(opener,bookId)
        #判断文件是否已经存在
        if os.path.isfile(os.getcwd()+"\\起点\\%s.txt"%bookName):
            print "%s 已经存在"%bookName
        else:
            url = 'http://download.cmfu.com/pda/%s.txt'%bookId
            try:
                bookData = opener.open(url).read()
            except :
                print "2 %s"%bookName
                try:
                    bookData = opener.open(url).read()
                except :
                    print "last try %s"%bookName
                    try:
                        bookData = opener.open(url).read()
                    except :
                        print "end  try %s"%bookName

            opener.close()

            f=open(os.getcwd()+"\\起点\\%s.txt"%bookName,"wb")
            f.write(bookData)
            f.close()
            print 'get book %s 完毕'%bookName
#@-node:BIGZHU.20070731171721:&lt;&lt;getTextFile>>
#@nl
#@&lt;&lt;class runGetFile>>
#@+node:BIGZHU.20070801172939:&lt;&lt;class runGetFile>>
class runGetFile(threading.Thread):
    def __init__(self,bookId):
        threading.Thread.__init__(self)
        self.bookId = bookId
        #self.opener = opener
    def run(self):
        opener = getCookie()
        getTextFile(opener,self.bookId)
#@nonl
#@-node: BIGZHU.20070801172939:&lt;&lt;class runGetFile>>
#@nl
#@&lt;&lt;class ProcessURL>>
#@+node:BIGZHU.20070802171013:&lt;&lt;class ProcessURL>>
class ProcessURL:
    """对新输入url,save 到ini中
    对已有url,忽视
    每次使用,自动读取ini的url,提供使用"""
    def __init__(self):
        pass
    #@    &lt;&lt;saveURL>>
    #@+node:BIGZHU.20070802171013.1:&lt;&lt;saveURL>>
    def saveURL(self,urlList=[]):
        '''存储新的url到URL.ini中'''


        try:
            f=open(os.getcwd()+"\\起点\\URL.ini","wb")#追加内容
        except IOError:
            print "文件打开错误"
            #格式化成字符串
        s_urlList = ";".join(urlList)
        f.write(s_urlList)
        f.close()
    #@-node:BIGZHU.20070802171013.1:&lt;&lt;saveURL>>
    #@nl
    #@    &lt;&lt;getURLIni>>
    #@+node:BIGZHU.20070802171013.2:&lt;&lt;getURLIni>>
    def getURLIni(self):
        """读取 URL.ini中的url
        返回一个URL list"""
         #判断目录是否存在
        if os.path.exists (os.getcwd()+"\\起点"):
            pass
        else:
            print "创建目录 \起点"
            os.mkdir("起点")

        iniData=''
        if os.path.isfile(os.getcwd ()+"\\起点\\URL.ini"):
            f=open(os.getcwd()+"\\起点\\URL.ini","rb")
            iniData = f.read()
            f.close()
        else:
            print "URL.txt不存在,创建之"
            f=open(os.getcwd()+"\\起点\\URL.ini","wb")
            #iniData = f.read()
            f.close()
        return iniData.split(";")#格式化成list
    #@-node:BIGZHU.20070802171013.2: &lt;&lt;getURLIni>>
    #@nl




#@-node:BIGZHU.20070802171013:&lt;&lt;class ProcessURL>>
#@nl
#@&lt;&lt;main>>
#@+node:BIGZHU.20070731164705.1:&lt;&lt;main>>
if __name__ == '__main__':
    opener = getCookie()
    #urlList =["http://www.cmfu.com/index.asp"," http://www.cmfu.com/listbookqb.asp?pageid=2007-8-1%2012:26&status=down","http://www.cmfu.com/listbookqb.asp?pageid=2007-7-31%2023:03&status=down ","http://www.cmfu.com/index_wxxx.asp"]
    #存放和读取url
    urlType = ProcessURL()
    urlList = urlType.getURLIni()
    saveIni = 0 # 标识是否有url 更新
    while True:
        url = raw_input("要截取的起点的某个页面:  ")
        if url=='':
            break
        if url in urlList:
            print "%s 已有,忽视之"%url
        else:
            urlList.extend([url])
            print "%s 是新的,添加之"%url
            saveIni =1
    #url = 'http://www.cmfu.com/index.asp'


    bookIdList=getBookIdList(urlList)


    for i in bookIdList:
        thread = runGetFile(i)
        thread.start()
    #存储到ini中
    if saveIni == 1:
        urlType.saveURL(urlList)
#@-node:BIGZHU.20070731164705.1:&lt;&lt;main>>
#@nl
#@nonl
#@-node:BIGZHU.20070731160918:@thin d:/bigzhu/python/python_project/get_cmfu.py
#@-leo

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/171568#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 15 Mar 2008 09:29:41 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/171568</link>
        <guid>http://devsharp.javaeye.com/blog/171568</guid>
      </item>
      <item>
        <title>发布一个简单的起点阅读下载工具</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/170682" style="color:red;">http://devsharp.javaeye.com/blog/170682</a>&nbsp;
          发表时间: 2008年03月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          使用方法:<br />进入程序目录,输入123.exe 按照提示 输入需要的章节url,程序即会自动下载该章节的text文本存储到程序目录下,以章节id为名.<br /><br />由于源代码很简单,就不献丑了,欢迎各位和我多多赐教,我也会完善后续版本.<br />经兜兜提醒发现,原来起点改版了,新的网站采用.net架构,目前程序只能分析cmfu.com即asp的老版本架构起点页面,这个问题我会在下一个版本解决
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/170682#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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Mar 2008 23:32:09 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/170682</link>
        <guid>http://devsharp.javaeye.com/blog/170682</guid>
      </item>
      <item>
        <title>Python数据库连接池DBUtils</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/170262" style="color:red;">http://devsharp.javaeye.com/blog/170262</a>&nbsp;
          发表时间: 2008年03月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          DBUtils 是一套允许线程化 Python 程序可以安全和有效的访问数据库的模块。DBUtils已经作为 Webware for Python 一部分用来结合 PyGreSQL 访问 PostgreSQL 数据库，当然他也可以用在其他Python应用程序中来访问 DB-API 2 兼容的数据库接口。<br /><br />模块<br />DBUtils实际上是一个包含两个子模块的Python包，一个用于连接DB-API 2模块，另一个用于连接典型的PyGreSQL模块。<br /><br />全局的DB-API 2变量 <br />SteadyDB.py 用于稳定数据库连接 <br />PooledDB.py 连接池 <br />PersistentDB.py 维持持续的数据库连接 <br />SimplePooledDB.py 简单连接池 <br />典型的 PyGreSQL 变量 <br />SteadyPg.py 稳定PyGreSQL连接 <br />PooledPg.py PyGreSQL连接池 <br />PersistentPg.py 维持持续的PyGreSQL连接 <br />SimplePooledPg.py 简单的PyGreSQL连接池 <br /><br />对标准DB-API 2模块的依赖如下图所示：<br /><br /> <br />对典型的PyGreSQL模块依赖如下图所示：<br /><br /> <br />下载<br />你可以从 Webware 的网站下载最新版本：<br /><br />http://www.webwareforpython.org/downloads/DBUtils/<br />也可以从Python Package Index来下载：<br /><br />http://www.python.org/pypi/DBUtils/<br />安装<br />安装为顶层模块<br />如果你打算在除了Webware之外的程序中使用，推荐安装为顶层模块:<br /><br />python setup.py install<br />安装为Webware的子模块(插件)<br />如果你只是打算在Webware中使用，则可以按照如下安装:<br /><br />python setup.py install --install-lib=/path/to/Webware<br />替换 /path/to/Webware 为Webware安装的根路径。你还需要运行Webware的安装程序来同时包含DBUtils的文档:<br /><br />cd path/to/Webware<br />python install.py<br />要求<br />DBUtils需要Python2.2或更高的版本。而典型的PyGreSQL则需要PyGreSQL3.4版本或更高。而DB-API 相关的则需要 DB-API 2 版本或更高的数据库接口模块。<br /><br />功能<br />这一节的主要例子面向DB-API 2，但是也适用于典型的PyGreSQL模块。<br /><br />SimplePooledDB<br />DBUtils.SimplePooledDB 是一个非常简单的数据库连接池实现。他比完善的 PooledDB 模块缺少很多功能。 DBUtils.SimplePooledDB 本质上类似于 MiscUtils.DBPool 这个Webware的组成部分。你可以把它看作一种演示程序。<br /><br />SteadyDB<br />DBUtils.SteadyDB 是一个模块实现了"强硬"的数据库连接，基于DB-API 2建立的原始连接。一个"强硬"的连接意味着在连接关闭之后，或者使用次数操作限制时会重新连接。<br /><br />一个典型的例子是数据库重启时，而你的程序仍然在运行并需要访问数据库，或者当你的程序连接了一个防火墙后面的远程数据库，而防火墙重启时丢失了状态时。<br /><br />一般来说你不需要直接使用 SteadyDB 它只是给接下来的两个模块提供基本服务， PersistentDB 和 PooledDB 。<br /><br />PersistentDB<br />DBUtils.PersistentDB 实现了强硬的、线程安全的、顽固的数据库连接，使用DB-API 2模块。如下图展示了使用 PersistentDB 时的连接层步骤：<br /><br /> <br />当一个线程首次打开一个数据库连接时，一个连接会打开并仅供这个线程使用。当线程关闭连接时，连接仍然持续打开供这个线程下次请求时使用这个已经打开的连接。连接在线程死亡时自动关闭。<br /><br />简单的来说 PersistentDB 尝试重用数据库连接来提高线程化程序的数据库访问性能，并且他确保连接不会被线程之间共享。<br /><br />因此， PersistentDB 可以在底层DB-API模块并非线程安全的时候同样工作的很好，并且他会在其他线程改变数据库会话或者使用多语句事务时同样避免问题的发生。<br /><br />PooledDB<br />DBUtils.PooledDB 实现了一个强硬的、线程安全的、有缓存的、可复用的数据库连接，使用任何DB-API 2模块。如下图展示了使用 PooledDB 时的工作流程：<br /><br /> <br />如图所示 PooledDB 可以在不同线程之间共享打开的数据库连接。这在你连接并指定 maxshared 参数，并且底层的DB-API 2接口是线程安全才可以，但是你仍然可以使用专用数据库连接而不在线程之间共享连接。除了共享连接以外，还可以设立一个至少 mincached 的连接池，并且最多允许使用 maxcached 个连接，这可以同时用于专用和共享连接池。当一个线程关闭了一个非共享连接，则会返还到空闲连接池中等待下次使用。<br /><br />如果底层DB-API模块是非线程安全的，线程锁会确保使用 PooledDB 是线程安全的。所以你并不需要为此担心，但是你在使用专用连接来改变数据库会话或执行多命令事务时必须小心。<br /><br />该选择哪一个？<br />PersistentDB 和 PooledDB 都是为了重用数据库连接来提高性能，并保持数据库的稳定性。<br /><br />所以选择何种模块，可以参考上面的解释。 PersistentDB 将会保持一定数量的连接供频繁使用。在这种情况下你总是保持固定数量的连接。如果你的程序频繁的启动和关闭线程，最好使用 PooledDB 。后面将会提到更好的调整，尤其在使用线程安全的DB-API 2模块时。<br /><br />当然，这两个模块的接口是很相似的，你可以方便的在他们之间转换，并查看哪个更好一些。<br /><br />使用方法<br />所有模块的使用方法都很相似，但是在初始化 "Pooled" 和 "Persistent" 时还有有些不同，尤其是DB-API和PyGreSQL之间。<br /><br />这里只讲解 PersistentDB 和更复杂的 PooledDB 模块。其他模块的细节请参与其文档。使用Python解释器控制台，你可以显示 PooledDB 的文档，如下:<br /><br />help(PooledDB)<br />PersistentDB<br />为了使用 PersistentDB 你首先需要通过创建 PersistentDB 的实例来设置一个特定数据库连接的生成器，床底如下参数：<br /><br />creator: 可以使用任意返回 DB-API 2 连接对象的函数活 DB-API 2 兼容的数据库模块。 <br />maxusage: 一个连接最大允许复用次数(缺省为 0 或 False 意味着无限制的重用)，当达到限制时，将会重新连接数据库 <br />setsession: 一个可选的SQL命令列表可以用于准备会话，如 ["set datestyle to german", ...] <br />creator 函数或生成 DB-API 2 连接的函数，可以接受这里的附加参数，比如主机名、数据库、用户名、密码等等。你也可以选择传递给 creator 的其他参数，并允许提供失败重连和负载均衡。 <br />举个例子，如果你正在使用 pgdb 作为数据库模块并想要连接本机数据库 mydb ，允许重用1000次:<br /><br />import pgdb # import used DB-API 2 module<br />from DBUtils.PersistentDB import PersistentDB<br />persist = PersistentDB(pgdb, 1000, database='mydb')<br />按照如上设置完成了连接生成器之后，你可以按照如下来请求一个连接:<br /><br />db = persist.connection()<br />你可以使用这些连接就像使用原始的DB-API 2连接一样。实际上你得到的是一个通过``SteadyDB``得到的强硬的连接，基于DB-API 2。<br /><br />关闭一个强硬的连接使用 db.close() ，这在内部实际上被忽略掉了，并且供下次使用。在线程关闭时，也会自动关闭数据库连接。你可以改变这个行为通过 persist._closeable 为 True 。<br /><br />PooledDB<br />为了使用 PooledDB 模块，你首先需要通过创建 PooledDB 来设置数据库连接池，传递如下参数：<br /><br />creator: 可以生成 DB-API 2 连接的任何函数或 DB-API 2 兼容的数据库连接模块。 <br />mincached : 启动时开启的空连接数量(缺省值 0 意味着开始时不创建连接) <br />maxcached: 连接池使用的最多连接数量(缺省值 0 代表不限制连接池大小) <br />maxshared: 最大允许的共享连接数量(缺省值 0 代表所有连接都是专用的)如果达到了最大数量，被请求为共享的连接将会被共享使用。 <br />maxconnections: 最大允许连接数量(缺省值 0 代表不限制) <br />blocking: 设置在达到最大数量时的行为(缺省值 0 或 False 代表返回一个错误；其他代表阻塞直到连接数减少) <br />maxusage: 单个连接的最大允许复用次数(缺省值 0 或 False 代表不限制的复用)。当达到最大数值时，连接会自动重新连接(关闭和重新打开) <br />setsession: 一个可选的SQL命令列表用于准备每个会话，如 ["set datestyle to german", ...] <br />creator 函数或可以生成连接的函数可以接受这里传入的其他参数，例如主机名、数据库、用户名、密码等。你还可以选择传入creator函数的其他参数，允许失败重连和负载均衡。 <br />举个例子，如果你正在使用 pgdb 作为DB-API模块，并希望连接池中至少有5个连接到数据库 mydb<br /><br />import pgdb # import used DB-API 2 module<br />from DBUtils.PooledDB import PooledDB<br />pool = PooledDB(pgdb, 5, database='mydb')<br />一旦设置好了连接池，你就可以按照如下请求一个连接:<br /><br />db = pool.connection()<br />你可以使用这些连接有如原始的DB-API 2一样。而实际使用的是``SteadyDB``版本的强硬连接。<br /><br />请注意连接可以与其他线程共享，只要你设置 maxshared 参数为非零，并且DB-API 2模块也允许。如果你想要使用专用连接则使用:<br /><br />db = pool.connection(0)<br />如果你不再需要这个连接了，则可以返回给连接池使用 db.close() 。你也可以使用相同的方法获取另一个连接。<br /><br />警告： 在一个多线程环境，不要使用下面的方法:<br /><br />pool.connection().cursor().execute(...)<br />这将会导致过早的释放连接以供复用，而且如果是非线程安全还会出错。确保连接对象在你的使用过程中是一直存在的，例如:<br /><br />db = pool.connection()<br />cur = db.cursor()<br />cur.execute(...)<br />res = cur.fetchone()<br />cur.close() # or del cur<br />db.close() # or del db<br />在Webware中使用<br />如果你正在 Webware for Python 的 servlets 中使用DBUtils来存取数据库，你要确保数据库连接生成器只被应用启动一次，而不是每个servlet启动时都创建一个。为了达到这个目的，你可以在模块或类的初始化代码中添加这些代码，或者使用 __init__.py 中的 contextInitialize() 函数。<br /><br />目录 Examples 是DBUtils发行包的一部分，包含了一个使用示例数据库的Webware的例子，用来跟踪演讲会的出席者(这个例子的主意来自Andrew Kuchling的 "The Python DB-API")。<br /><br />例子的正文可以通过创建配置文件 Configs/Database.config 来配置，改变例子 Examples/DBUtilsExample.py 的缺省参数。这种方式可以设置一个专用数据库的用户名和密码，你也可以选择底层的数据库模块。如果设置了 maxcached ，则例子会使用 "Pooled" 模块，否则会使用 "Persistent" 模块。<br /><br />注意<br />如果你正在使用一个流行的ORM SQLObject 或 SQLAlchemy ，你并不需要使用DBUtiils，因为他已经内含连接池了。 SQLObject 2 (SQL-API) 事实上还从DBUtils这里借用了连接池分层的代码。<br /><br />未来功能<br />一些未来会使用的方法：<br /><br />一个连接最大被使用的次数，或一个连接最大活动时间。 <br />创建模块 MonitorDB 和 MonitorPg 运行在单独的线程中，监控连接池中各个共享连接的状态。如果检测到一个损坏的连接，则会自动恢复这个连接。这在很多网站中是很实用的，因为晚上往往要重启数据库服务器。如果不使用监控线程，则用户要等到第二天早上才可以使用。正是因为如此，检测损坏的连接并自动恢复是很有用的。使用了监控线程之后，间断时间在晚上，而且很短。监控线程同样可以配置连接生成器的线程池，并且确保用户到达之前完成。 <br />可选的日志，记录损坏的连接和最大限制。 <br />错误报告与回馈<br />请将错误报告、补丁、回馈直接发送给作者(使用下面给出的邮件地址)。<br /><br />如果有Webware相关的问题，可以到邮件列表讨论 Webware for Python mailing list 。<br /><br />链接<br />一些相关软件的链接：<br /><br />DBUtils <br />Python <br />Webware for Python 框架 <br />Python DB-API 2 <br />PostgreSQL 数据库 <br />PyGreSQL 接口 <br />SQLObject ORM <br />SQLAlchemy ORM <br />作者列表<br />作者: Christoph Zwerschke &lt;cito@online.de> <br />贡献: DBUtils收到了如下朋友的帮助和建议 Ian Bicking, Chuck Esterbrook (Webware for Python), Dan Green (DBTools), Jay Love, Michael Palmer, Tom Schwaller, Geoffrey Talvola, Warren Smith (DbConnectionPool) and Ezio Vernacotola. <br />翻译: gashero &lt;harry.python@gmail.com>
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/170262#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 11 Mar 2008 17:31:14 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/170262</link>
        <guid>http://devsharp.javaeye.com/blog/170262</guid>
      </item>
      <item>
        <title>线程与进程</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/170093" style="color:red;">http://devsharp.javaeye.com/blog/170093</a>&nbsp;
          发表时间: 2008年03月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          线程（thread, 台湾称 执行绪）是"进程"中某个单一顺序的控制流。也被称为轻量进程（lightweight processes）。计算机科学术语，指运行中的程序的调度单位。 <br /><br />      线程是进程中的实体，一个进程可以拥有多个线程，一个线程必须有一个父进程。线程不拥有系统资源，只有运行必须的一些数据结构；它与父进程的其它线程共享该进程所拥有的全部资源。线程可以创建和撤消线程，从而实现程序的并发执行。一般，线程具有就绪、阻塞和运行三种基本状态。 <br /><br />      在多中央处理器的系统里，不同线程可以同时在不同的中央处理器上运行，甚至当它们属于同一个进程时也是如此。大多数支持多处理器的操作系统都提供编程接口来让进程可以控制自己的线程与各处理器之间的关联度（affinity）。<br /><br />      有时候，线程也称作轻量级进程。就象进程一样，线程在程序中是独立的、并发的执行路径，每个线程有它自己的堆栈、自己的程序计数器和自己的局部变量。但是，与分隔的进程相比，进程中的线程之间的隔离程度要小。它们共享内存、文件句柄和其它每个进程应有的状态。 <br /><br />      进程可以支持多个线程，它们看似同时执行，但互相之间并不同步。一个进程中的多个线程共享相同的内存地址空间，这就意味着它们可以访问相同的变量和对象，而且它们从同一堆中分配对象。尽管这让线程之间共享信息变得更容易，但您必须小心，确保它们不会妨碍同一进程里的其它线程。 <br /><br />      Java 线程工具和 API 看似简单。但是，编写有效使用线程的复杂程序并不十分容易。因为有多个线程共存在相同的内存空间中并共享相同的变量，所以您必须小心，确保您的线程不会互相干扰。 <br /><br />一、线程的概念  <br /><br />　　一般来说,我们把正在计算机中执行的程序叫做"进程"(Process) ,而不将其称为程序(Program)。所谓"线程"(Thread),是"进程"中某个单一顺序的控制流。<br />  <br />新兴的操作系统,如Mac,Windows NT,Windows 95等,大多采用多线程的概念,把线程视为基本执行单位。线程也是Java中的相当重要的组成部分之一。  <br /><br />　　甚至最简单的Applet也是由多个线程来完成的。在Java中,任何一个Applet的paint()和update()方法都是由AWT(Abstract Window Toolkit)绘图与事件处理线程调用的,而Applet 主要的里程碑方法——init(),start(),stop()和destory()  ——是由执行该Applet的应用调用的。  <br /><br />　　单线程的概念没有什么新的地方,真正有趣的是在一个程序中同时使用多个线程来完成不同的任务。某些地方用轻量进程(Lightweig ht Process)来代替线程,线程与真正进程的相似性在于它们都是单一顺序控制流。然而线程被认为轻量是由于它运行于整个程序的上下文内,能使用整个程序共有的资源和程序环境。  <br /><br />　　作为单一顺序控制流,在运行的程序内线程必须拥有一些资源作为必要的开销。例如,必须有执行堆栈和程序计数器。在线程内执行的代码只在它的上下文中起作用,因此某些地方用"执行上下文"来代替"线程"。  <br /><br />二、线程属性  <br /><br />　　为了正确有效地使用线程,必须理解线程的各个方面并了解Java 实时系统。必须知道如何提供线程体、线程的生命周期、实时系统如 何调度线程、线程组、什么是幽灵线程(Demo nThread)。  <br /><br />　　(1)线程体  <br />　　所有的操作都发生在线程体中,在Java中线程体是从Thread类继承的run()方法,或实现Runnable接口的类中的run()方法。当线程产生并初始化后,实时系统调用它的run()方法。run()方法内的代码实现所产生线程的行为,它是线程的主要部分。  <br /><br />　　(2)线程状态  <br />　　附图表示了线程在它的生命周期内的任何时刻所能处的状态以及引起状态改变的方法。这图并不是完整的有限状态图,但基本概括了线程中比较感兴趣和普遍的方面。以下讨论有关线程生命周期以此为据。  <br /><br /><br />　　●新线程态(New Thread)  <br />　　产生一个Thread对象就生成一个新线程。当线程处于"新线程"状态时,仅仅是一个空线程对象,它还没有分配到系统资源。因此只能启动或终止它。任何其他操作都会引发异常。 <br /> <br />　　●可运行态(Runnable)  <br />　　start()方法产生运行线程所必须的资源,调度线程执行,并且调用线程的run()方法。在这时线程处于可运行态。该状态不称为运行态是因为这时的线程并不总是一直占用处理机。特别是对于只有一个处理机的PC而言,任何时刻只能有一个处于可运行态的线程占用处理 机。Java通过调度来实现多线程对处理机的共享。  <br /><br />　　●非运行态(Not Runnable)  <br />　　当以下事件发生时,线程进入非运行态。  <br />　　①suspend()方法被调用;  <br />　　②sleep()方法被调用;  <br />　　③线程使用wait()来等待条件变量;  <br />　　④线程处于I/O等待。  <br /><br />　　●死亡态(Dead)  <br />　　当run()方法返回,或别的线程调用stop()方法,线程进入死亡态 。通常Applet使用它的stop()方法来终止它产生的所有线程。  <br /><br />　　(3)线程优先级  <br />　　虽然我们说线程是并发运行的。然而事实常常并非如此。正如前面谈到的,当系统中只有一个CPU时,以某种顺序在单CPU情况下执行多线程被称为调度(scheduling)。Java采用的是一种简单、固定的调度法,即固定优先级调度。这种算法是根据处于可运行态线程的相对优先级来实行调度。当线程产生时,它继承原线程的优先级。在需要时可对优先级进行修改。在任何时刻,如果有多条线程等待运行,系统选择优先级最高的可运行线程运行。只有当它停止、自动放弃、或由于某种原因成为非运行态低优先级的线程才能运行。如果两个线程具有相同的优先级,它们将被交替地运行。  <br /><br />　　Java实时系统的线程调度算法还是强制性的,在任何时刻,如果一个比其他线程优先级都高的线程的状态变为可运行态,实时系统将选择该线程来运行。  <br /><br />　　(4)幽灵线程  <br />　　任何一个Java线程都能成为幽灵线程。它是作为运行于同一个进程内的对象和线程的服务提供者。例如,HotJava浏览器有一个称为" 后台图片阅读器"的幽灵线程,它为需要图片的对象和线程从文件系统或网络读入图片。  <br /><br />　　幽灵线程是应用中典型的独立线程。它为同一应用中的其他对象和线程提供服务。幽灵线程的run()方法一般都是无限循环,等待服务请求。  <br /><br />　　(5)线程组  <br />　　每个Java线程都是某个线程组的成员。线程组提供一种机制,使得多个线程集于一个对象内,能对它们实行整体操作。譬如,你能用一个方法调用来启动或挂起组内的所有线程。Java线程组由ThreadGroup类实现。<br />  <br />　　当线程产生时,可以指定线程组或由实时系统将其放入某个缺省的线程组内。线程只能属于一个线程组,并且当线程产生后不能改变它所属的线程组。  <br /><br />三、多线程程序  <br /><br />　　对于多线程的好处这就不多说了。但是,它同样也带来了某些新的麻烦。只要在设计程序时特别小心留意,克服这些麻烦并不算太困难。  <br /><br />　　(1)同步线程  <br />　　许多线程在执行中必须考虑与其他线程之间共享数据或协调执行状态。这就需要同步机制。在Java中每个对象都有一把锁与之对应。但Java不提供单独的lock和unlock操作。它由高层的结构隐式实现, 来保证操作的对应。(然而,我们注意到Java虚拟机提供单独的monito renter和monitorexit指令来实现lock和unlo  <br />ck操作。)  <br /><br />      synchronized语句计算一个对象引用,试图对该对象完成锁操作, 并且在完成锁操作前停止处理。当锁操作完成synchronized语句体得到执行。当语句体执行完毕(无论正常或异常),解锁操作自动完成。作为面向对象的语言,synchronized经常与方法连用。一种比较好的办法是,如果某个变量由一个线程赋值并由别的线程引用或赋值,那么所有对该变量的访问都必须在某个synchromized语句或synchronized方法内。  <br /><br />　　现在假设一种情况：线程1与线程2都要访问某个数据区,并且要求线程1的访问先于线程2, 则这时仅用synchronized是不能解决问题的。这在Unix或Windows NT中可用Simaphore来实现。而Java并不提供。在Java中提供的是wait()和notify()机制。使用如下:  <br /><br />　　synchronized method-1(…){ call by thread 1.  <br />　　∥access data area;  <br />　　available=true;  <br />　　notify()  <br />　　}  <br />　　synchronized method-2(…){∥call by thread 2.  <br />　　while(!available)  <br />　　try{  <br />　　wait();∥wait for notify().  <br />　　}catch (Interrupted Exception e){  <br />　　}  <br />　　∥access data area  <br />　　}  <br />　　其中available是类成员变量,置初值为false。  <br /><br />　　如果在method-2中检查available为假,则调用wait()。wait()的作用是使线程2进入非运行态,并且解锁。在这种情况下,method-1可以被线程1调用。当执行notify()后。线程2由非运行态转变为可运行态。当method-1调用返回后。线程2可重新对该对象加锁,加锁成功后执行wait()返回后的指令。这种机制也能适用于其他更复杂的情况。  <br /><br />　　(2)死锁  <br />　　如果程序中有几个竞争资源的并发线程,那么保证均衡是很重要的。系统均衡是指每个线程在执行过程中都能充分访问有限的资源。系统中没有饿死和死锁的线程。Java并不提供对死锁的检测机制。对大多数的Java程序员来说防止死锁是一种较好的选择。最简单的防止死锁的方法是对竞争的资源引入序号,如果一个线程需要几个资源,那么它必须先得到小序号的资源,再申请大序号的资源。  <br /><br />四、线程和进程的比较<br /><br /><br />  　进程是资源分配的基本单位。所有与该进程有关的资源，都被记录在进程控制块PCB中。以表示该进程拥有这些资源或正在使用它们。<br />    另外，进程也是抢占处理机的调度单位，它拥有一个完整的虚拟地址空间。<br /><br />    与进程相对应，线程与资源分配无关，它属于某一个进程，并与进程内的其他线程一起共享进程的资源。<br />　  当进程发生调度时，不同的进程拥有不同的虚拟地址空间，而同一进程内的不同线程共享同一地址空间。<br /><br />　  线程只由相关堆栈（系统栈或用户栈）寄存器和线程控制表TCB组成。寄存器可被用来存储线程内的局部变量，但不能存储其他线程的相关变量。<br /><br />　  发生进程切换与发生线程切换时相比较，进程切换时涉及到有关资源指针的保存以及地址空间的变化等问题；线程切换时，由于同不进程内的线程共享资源和地址 空间，将不涉及资源信息的保存和地址变化问题，从而减少了操作系统的开销时间。而且，进程的调度与切换都是由操作系统内核完成，而线程则既可由操作系统内 核完成，也可由用户程序进行。<br /><br /><img src="http://www.itisedu.com/manage/Upload/image/200639175134137.gif" /><br /><br />      图1　多线程与进程之间的关系<br /><br />五、线程的适用范围<br /><br />　  　典型的应用<br /><br />　1.服务器中的文件管理或通信控制<br /><br />　2.前后台处理<br /><br />　3.异步处理<br /><br /><img src="http://www.itisedu.com/manage/Upload/image/200639175342760.gif" /><br /><br /><br />六、线程的执行特性<br /><br />      一个线程必须处于如下四种可能的状态之一：<br /><br />      初始态：一个线程调用了new方法之后，并在调用start方法之前的所处状态。在初始态中，可以调用start和stop方法。 <br /><br />      Runnable：一旦线程调用了start 方法，线程就转到Runnable 状态，注意，如果线程处于Runnable状态，它也有可能不在运行，这是因为还有优先级和调度问题。 <br /><br />      阻塞/ NonRunnable：线程处于阻塞/NonRunnable状态，这是由两种可能性造成的：要么是因挂起而暂停的，要么是由于某些原因而阻塞的，例如包括等待IO请求的完成。 退出：线程转到退出状态，这有两种可能性，要么是run方法执行结束，要么是调用了stop方法。 <br /><br />      最后一个概念就是线程的优先级，线程可以设定优先级，高优先级的线程可以安排在低优先级线程之前完成。一个应用程序可以通过使用线程中的方法setPriority(int)，来设置线程的优先级大小。 <br /><br />      线程有5种基本操作：<br /><br />　派生：线程在进程内派生出来，它即可由进程派生，也可由线程派生。<br />　阻塞（Block）：如果一个线程在执行过程中需要等待某个事件发生，则被阻塞。<br />　激活（unblock）：如果阻塞线程的事件发生，则该线程被激活并进入就绪队列。<br />　调度（schedule）：选择一个就绪线程进入执行状态。<br />　结束（Finish）：如果一个线程执行结束，它的寄存器上下文以及堆栈内容等将被释放。<br /><br /><br /><img src="http://www.itisedu.com/manage/Upload/image/200639175353990.gif" /><br /><br />      图2 线程的状态与操作<br />      线程的另一个执行特性是同步。线程中所使用的同步控制机制与进程中所使用的同步控制机制相同。<br /><br />七、线程的分类<br /><br />      线程有两个基本类型：<br /><br />    　用户级线程：管理过程全部由用户程序完成，操作系统内核心只对进程进行管理。<br /><br />    　系统级线程（核心级线程）：由操作系统内核进行管理。操作系统内核给应用程序提供相应的系统调用和应用程序接口API，以使用户程序可以创建、执行、撤消线程。<br /><br />附：线程举例<br /><br />      1. SUN Solaris 2.3<br /><br />      Solaris支持内核线程、轻权进程和用户线程。一个进程可有大量用户线程；大量用户线程复用少量的轻权进程，轻权进程与内核线程一一对应。 <br />      用户级线程在调用核心服务时（如文件读写），需要“捆绑(bound)”在一个LWP上。永久捆绑（一个LWP固定被一个用户级线程占用，该LWP移到LWP池之外）和临时捆绑（从LWP池中临时分配一个未被占用的LWP）。<br />      在调用系统服务时，如果所有LWP已被其他用户级线程所占用（捆绑），则该线程阻塞直到有可用的LWP。<br />      如果LWP执行系统线程时阻塞（如read()调用），则当前捆绑在LWP上的用户级线程也阻塞。<br /> <br /><img src="http://www.itisedu.com/manage/Upload/image/20063917547737.gif" />                                     <br />      图3  用户线程、轻权进程和核心线程的关系<br /><br /> ¨        有关的C库函数<br />        /* 创建用户级线程             */<br />    int thr_create(void *stack_base, size_t stack_size,<br />    void *(*start_routine)(void *), void *arg, long flags,<br />    thread_t *new_thread_id);  <br />  其中flags包括：THR_BOUND（永久捆绑）, THR_NEW_LWP（创建新LWP放入LWP池），若两者同时指定则创建两个新LWP，一个永久捆绑而另一个放入LWP池。<br /> ²        有关的系统调用<br />   /* 在当前进程中创建LWP     */<br />  int _lwp_create(ucontext_t *contextp, unsigned long flags,<br /><br />  lwpid_t *new_lwp_id);<br />  /* 构造LWP上下文          */<br />  void _lwp_makecontext(ucontext_t *ucp,<br />   void (*start_routine)( void *), void *arg,<br />  void *private, caddr_t stack_base, size_t stack_size);<br />  /* 注意：没有进行“捆绑”操作的系统调用 */<br /><br />    2. Windows NT<br />      NT线程的上下文包括：寄存器、核心栈、线程环境块和用户栈。<br />      NT线程状态<br />   (1) 就绪状态：进程已获得除处理机外的所需资源，等待执行。<br />   (2) 备用状态：特定处理器的执行对象，系统中每个处理器上只能有一个处于备用状态的线程。<br />   (3) 运行状态：完成描述表切换，线程进入运行状态，直到内核抢先、时间片用完、线程终止或进行等待状态。<br />   (4) 等待状态：线程等待对象句柄，以同步它的执行。等待结束时，根据优先级进入运行、就绪状态。<br />   (5) 转换状态：线程在准备执行而其内核堆栈处于外存时，线程进入转换状态；当其内核堆栈调回内存，线程进入就绪状态。<br />   (6) 终止状态：线程执行完就进入终止状态；如执行体有一指向线程对象的指针，可将线程对象重新初始化，并再次使用。<br /><br /><br />                 <br /><img src="http://www.itisedu.com/manage/Upload/image/200639175419984.gif" /><br />      图4  Windows NT的线程状态<br />   <br />   <br />      NT线程的有关API<br />    <br />      CreateThread()函数在调用进程的地址空间上创建一个线程，以执行指定的函数；返回值为所创建线程的句柄。<br />      ExitThread()函数用于结束本线程。<br />      SuspendThread()函数用于挂起指定的线程。<br />      ResumeThread()函数递减指定线程的挂起计数，挂起计数为0时，线程恢复执行。
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/170093#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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, 11 Mar 2008 11:11:03 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/170093</link>
        <guid>http://devsharp.javaeye.com/blog/170093</guid>
      </item>
      <item>
        <title>Java转换UTC时间:2008-02-13T14:15:44.000Z 怪异的时间格式</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/170001" style="color:red;">http://devsharp.javaeye.com/blog/170001</a>&nbsp;
          发表时间: 2008年03月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          近日,把玩Google Pisaca API的时候发现返回一个这样的时间格式:<br />2008-02-13T14:15:44.000Z ,问人未果.<br />窃以为T,z应该是和时区有关,经过google果然这个就是传说中的UTC 通用标准时以z来标识<br />其它的时区显示的时间与通用协调时间不同，因此例如你能使用太平洋标准时间2007-12-25T06:00:00:000-8:00来显示2007年12月25日的早上6：00(它比UTC时间滞后8小时)。<br /><br />这个没法使用，得转换下.<br /><pre name="code" class="java">public class TimeZoneTest 
{ 
        public static void main (String args[]) 
        { 
                try 
                { 
                        String ts = "2007-10-23T17:15:44.000Z"; 
                        System.out.println("ts = " + ts); 
                        ts = ts.replace("Z", " UTC"); 
                        System.out.println("ts = " + ts); 
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");

                         Date dt = sdf.parse(ts); 


                         TimeZone tz = sdf.getTimeZone(); 
                         Calendar c = sdf.getCalendar(); 
                         System.out.println("Display name: " + 
tz.getDisplayName()); 
                         System.out.println(getString(c)); 
                } 
                catch(ParseException pe) 
                { 
                        System.out.println("Error offset: " + pe.getErrorOffset()); 
                        pe.printStackTrace(); 
                } 
        } 


        private static String getString(Calendar c) 
        { 
                StringBuffer result = new StringBuffer(); 
                result.append(c.get(Calendar.YEAR)); 
                result.append("-"); 
                result.append((c.get(Calendar.MONTH) + 1)); 
                result.append("-"); 
                result.append(c.get(Calendar.DAY_OF_MONTH)); 
                result.append(" "); 
                result.append(c.get(Calendar.HOUR_OF_DAY)); 
                result.append(":"); 
                result.append(c.get(Calendar.MINUTE)); 
                result.append(":"); 
                result.append(c.get(Calendar.SECOND)); 
                return result.toString(); 
        } 



} 
  </pre><br /> <br />运行结果:<br /><pre name="code" class="java">ts = 2007-10-23T17:15:44.000Z 
ts = 2007-10-23T17:15:44.000 UTC 
Display name: Coordinated Universal Time 
2007-10-23 17:15:44 </pre>
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/170001#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 10 Mar 2008 23:10:39 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/170001</link>
        <guid>http://devsharp.javaeye.com/blog/170001</guid>
      </item>
      <item>
        <title>Python环境编码与MySQL中文编码操作</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/169934" style="color:red;">http://devsharp.javaeye.com/blog/169934</a>&nbsp;
          发表时间: 2008年03月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          经过30个小时的coding,终于解决了编码问题.现在把过程和体会记录下来:P&lt;/br><br />MySQL 数据库方面:&lt;/br><br />数据库的创建支持UTF8: <br /><span style="color: red"><strong>CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;</strong></span><br />很多时候,默认的会选择COLLATE utf8_general_ci,这个对中文支持不好.我就是错在这里了。<br />Python 编码方面:<br />1指定文件编码是必须的:<pre name="code" class="python">#-*-coding:utf-8-*-</pre>&lt;/br><br />2某些环境下可以使用这个:&lt;/br><br /><pre name="code" class="python">reload(sys);sys.setdefaultencoding('utf-8')</pre>&lt;/br><br />3python的字符串分为"unicode"和"str"&lt;/br><br />-1  str      是指带有编码的字符串<br />-2  unicode  是指不带有编码的字符串<br />这两个概念的相互转换是这样进行的：<br />str ------>   unicode --------> str<br />   decode             encode<br />   解码                    编码<br /><br />举个最简单的例子：<br /><br /><pre name="code" class="python"><div class="quote_title">引用</div><div class="quote_div">>>> a = '中'
>>> a
'\xd6\xd0'

>>> b = u'中'
>>> b</div>u'\u4e2d' [color=red]<strong>即保存'中'的gbk值做为b</strong></pre>&lt;/br><br />根据上面的描述，b应该是不进行编码的a的值（反正a就是b带有gbk编码的值）<br />于是，我们可以得到<br />>>> a.decode( 'gbk' )<br />u'\u4e2d'<br /><br />同样也可以得到<br />>>> b.encode( 'gbk' )<br />'\xd6\xd0'<br /><br />所以一般的<br /><pre name="code" class="python">xxx.decode('gbk').encode('utf-8')</pre><br />4.MySQLdb操作&lt;/br><br /><pre name="code" class="python">conn=MySQLdb.connect(host,usr,pwd,db,charset='utf8')</pre><br /><br />&lt;/br><br />PHP读取操作:&lt;/br><br /><pre name="code" class="php">&lt;?php
$conn=mysql_connect($hostname='127.0.0.1',$username='root',$password='');
mysql_select_db('text');
mysql_query("set names 'utf8'");
$sql='select text from text where id = 1';
$result=mysql_query($sql,$conn);
while ($row = mysql_fetch_assoc($result)){
 print $row['text'];
}
?></pre><br /><br />更多可以参考:<br />http://www.blogjava.net/vulcan/articles/160978.html<br />http://www.yuanma.org/data/2006/0907/article_1476.htm
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/169934#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 10 Mar 2008 17:54:59 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/169934</link>
        <guid>http://devsharp.javaeye.com/blog/169934</guid>
      </item>
      <item>
        <title>代码第十次错误</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/169592" style="color:red;">http://devsharp.javaeye.com/blog/169592</a>&nbsp;
          发表时间: 2008年03月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          娘你的,代码又错了.<br />fk,mysqldb<br />fk,utf8<br />fk,mysql<br /><br />to be continued!
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/169592#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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, 10 Mar 2008 01:24:31 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/169592</link>
        <guid>http://devsharp.javaeye.com/blog/169592</guid>
      </item>
      <item>
        <title>发布自已写的一个简单的爬虫项目xspider2</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/169268" style="color:red;">http://devsharp.javaeye.com/blog/169268</a>&nbsp;
          发表时间: 2008年03月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这个项目主要是分析一个页面的深度链接值,然后进行相应的抓取.目前已经完成了<strong>单页面抓取操作方法的封装</strong><pre name="code" class="python">(import graspContent.py)</pre>以及<strong>MySQL数据库连接</strong><pre name="code" class="python">(import link_db.py)</pre>.<br /><br />Python操作MySQL的库是MySQLdb:<br /><pre name="code" class="java">MySQLdb is the Python DB API-2.0 interface. _mysql is a low-level API similiar to the MySQL C API. ZMySQLDA is a Database Adapter for Zope2.</pre><br />在<a href="http://sourceforge.net/projects/mysql-python" target="_blank">这里</a>可以找到更多信息和下载.<br /><br />高效的协议分析可以参考<a href="http://curl.haxx.se/" target="_blank">curl</a>,<a href="http://curl.haxx.se/" target="_blank">PyCurl</a>是其一个python封装.<br /><br />项目放置在<img src="http://code.google.com/hosting/images/code_sm.png" />上,采用MIT协议分发.如果有兴趣加入,可以发邮件至myctrls@gmail.com和我联系.<br />项目地址<a href="http://code.ibd.ac.cn" target="_blank">http://code.ibd.ac.cn</a><br />SVN checkout:<a href="https://xspider2.googlecode.com/svn/trunk/" target="_blank">https://xspider2.googlecode.com/svn/trunk/</a> <br /><br />最后感谢很多在我学习和实践python道路上帮忙的很多朋友们.<br />附图是xspider2的结构图.
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/169268#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 08 Mar 2008 00:28:00 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/169268</link>
        <guid>http://devsharp.javaeye.com/blog/169268</guid>
      </item>
      <item>
        <title>唉,转正延期了</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/167069" style="color:red;">http://devsharp.javaeye.com/blog/167069</a>&nbsp;
          发表时间: 2008年03月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          唉,娘你的...
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/167069#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 03 Mar 2008 20:53:34 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/167069</link>
        <guid>http://devsharp.javaeye.com/blog/167069</guid>
      </item>
      <item>
        <title>吼吼 偶也双屏了~~</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/161469" style="color:red;">http://devsharp.javaeye.com/blog/161469</a>&nbsp;
          发表时间: 2008年02月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Dell 22'双屏显示
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/161469#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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 05 Feb 2008 00:36:37 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/161469</link>
        <guid>http://devsharp.javaeye.com/blog/161469</guid>
      </item>
      <item>
        <title>入梦初醒</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/160063" style="color:red;">http://devsharp.javaeye.com/blog/160063</a>&nbsp;
          发表时间: 2008年01月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近长沙遭遇了传说中50年不遇的雪灾,这个城市完全被雪淹没了.工作快一个月了,每天忙忙碌碌的,早起贪黑,似乎充实了不少,可是收获了什么呢?似乎已经快要麻木的习惯这样朝九晚五和两点一线的生活了,在颠簸的公交车上,经常混混的睡去.突然间,我可悲的发现自己丧失了那股冲劲,一个20岁的小伙本该朝气蓬勃,而我却这样的萎靡.曾几何时自己是多么梦想着这样It人的生活,enjoy coding! enjoy reading! 最近在坛子里发现离我一路之隔的写字楼里的一位朋友月薪是6-7K,心里便有了一点不平衡,虽然他们告诉我&quot;Mirror，不要急,你还年轻&quot;可是似乎我却很还是在意这个.......还是当初那个一心学东西的自己么?!我又可悲的突然发现自己除了现在会做的事情以外,几乎啥都不会!</p><p>我的梦想,我的目标,我的诺言 就这样被自己抛弃了?</p><p>方向既然已经明确.就应该坚定不移的走下去,就像昨天自己在风雪中走过湘江大桥!</p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/160063#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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, 29 Jan 2008 10:49:08 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/160063</link>
        <guid>http://devsharp.javaeye.com/blog/160063</guid>
      </item>
      <item>
        <title>a little lost</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/157136" style="color:red;">http://devsharp.javaeye.com/blog/157136</a>&nbsp;
          发表时间: 2008年01月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div> 不爽!</div>
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/157136#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Jan 2008 09:22:46 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/157136</link>
        <guid>http://devsharp.javaeye.com/blog/157136</guid>
      </item>
      <item>
        <title>工作杂记(ii)</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/157137" style="color:red;">http://devsharp.javaeye.com/blog/157137</a>&nbsp;
          发表时间: 2008年01月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>以前总是满足自己做出点小东西来,实现功能就可以了,觉得很cool。也没有想过扩展,二次开发这些问题.现在随着工作的不断深入,发现确实需要好好学习下软件工程的知识了,Design Patterns,UML这些都是需要掌握的.</p> <p><a href="http://byfiles.storage.msn.com/y1prvpgQBUS6lqYP1yOABkiXZMd0QfWe5-KaRMd1s0z0OB61P25YDYnpwTRqsjOiOapgMqdKffV2GY?PARTNER=WRITER"><img src="http://byfiles.storage.msn.com/y1prvpgQBUS6lqQ7PTNHSKl7fW9GeWGBWNHdrIRakwYjpsYcHMcfU_CZT6h_rkginldwXcFsCcSwSc?PARTNER=WRITER" border="0" height="105" alt="uml" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" width="140" /></a>自己做软件和做产品级应用确实不同啊,又是一次挑战:)</p> <p><a href="http://byfiles.storage.msn.com/y1prvpgQBUS6lp2GayR7CQUodaD7Ifxt8NGW7CTjf2AiC74BORv2_18k_9WOEpyOf0APHtibN-2x2Y?PARTNER=WRITER"><img src="http://byfiles.storage.msn.com/y1prvpgQBUS6lqkKqNUCDGEvHvmKz9psmGyCqA6QZRwIIGFeJxUrpnQykzy66NfO-qU_t8SYf0xkIQ?PARTNER=WRITER" border="0" height="140" alt="head first" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" width="140" /></a></p>
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/157137#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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>Wed, 02 Jan 2008 16:08:08 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/157137</link>
        <guid>http://devsharp.javaeye.com/blog/157137</guid>
      </item>
      <item>
        <title>工作杂记</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/157138" style="color:red;">http://devsharp.javaeye.com/blog/157138</a>&nbsp;
          发表时间: 2008年01月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天接到一个任务,实现一个Spider,来方便团队的资讯和内容编辑人员,提高团队的开发效率.说实话,这个东西经常看见别人提起,但是实际动手发现一个问题是,简单的功能好做但是普遍的适应性就很差:比如可以在Sina体育版的新闻实现我的需求可是在时政版就不行-_-!</p> <p>还有一些专题带了Video的,这个就得做一大堆的条件预判断,OMG,网易和Sohu偶还没有考虑呢!</p> <p>不过我也发现Google的爬虫也是Python的，呵呵,貌似做的好的爬虫至少需要考虑</p> <p>1.频繁的小文件读取</p> <p>2.网站的普遍适应性(采集的命中率)</p> <p>3.高可靠性</p> <p>暂时就这么多了,经过昨天12小时的coding大概除了一个单页面的alpha版本,效率还有待提高啊:)</p> <div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1f11c614-05fe-4b38-a2dd-69a91dbb1e63" style="margin: 0px; padding: 0px; display: inline">Technorati 标签: <a href="http://technorati.com/tags/Python" rel="tag">Python</a>,<a href="http://technorati.com/tags/Spider" rel="tag">Spider</a></div>
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/157138#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jan 2008 15:35:50 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/157138</link>
        <guid>http://devsharp.javaeye.com/blog/157138</guid>
      </item>
      <item>
        <title>明天要开工了</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/157139" style="color:red;">http://devsharp.javaeye.com/blog/157139</a>&nbsp;
          发表时间: 2007年12月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>明天要开工了.一段新的生活开始了！祝愿自己可以把握机会,勤快点,努力点.</p> <p>PHP和MySQL Web开发<a href="http://exs.mail.qq.com/cgi-bin/downloadfilepart?svrid=33&amp;fid=196608de9b4203e82210367b6a4171de123a3fdc8c45a20c&amp;fn=PHP和MySQL中文版(第三版).pdf " target="_blank">下载</a>,虽然自己有这本书,可是还是留个电子版的标记吧.</p> <div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f7be1266-2e61-4c9f-8e85-a60f209d9906" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati 标签: <a href="http://technorati.com/tags/PHP" rel="tag">PHP</a>,<a href="http://technorati.com/tags/ebook" rel="tag">ebook</a></div>
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/157139#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 30 Dec 2007 16:09:01 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/157139</link>
        <guid>http://devsharp.javaeye.com/blog/157139</guid>
      </item>
      <item>
        <title>使用Eclipse PDT+WAMP开发PHP----PHP学习笔记</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/157140" style="color:red;">http://devsharp.javaeye.com/blog/157140</a>&nbsp;
          发表时间: 2007年12月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>说起PHP的开发环境,可能很多人会首推Zend Studio和Editplus这两个确实不错,不过我不是很喜欢Zend那种Swing界面,同样是JAVA写的Eclipse就很不错,当然Eclipse用的是SWT,本来就是可以取代Swing的界面解决方案:)Eclipse本来是用来开发Java的，不过现在的IDE都朝着多元化发展,Eclipse已经可以支持C++ PHP Ruby等语言了.在Eclipse的官方网站<a href="http://www.eclipse.org">www.eclipse.org</a>的download里面就可以找到这些相关语言的开发环境。当然对PHP而言，可以直接访问<a href="http://www.eclipse.org/pdt/" target="_blank">PDT项目首页</a> 更具自己的需要来下载相关的插件包.</p><p>不过由于Zend引擎的存在,PDT本身并不是很理想的开发环境,我们可以使用由Zend公司支持的包含了Zend Debuger的Eclipse版本,个人比较喜欢All in One的.这里给个连接<a href="http://www.zend.com/pdt#all_in_one">http://www.zend.com/pdt#all_in_one</a></p><p>还有就是PHP的开发调试环境WAMP，当然你也可以分别去Mysql和PHP以及APACHE的官方下载他们各自的安装包，然后自己设置.WAMP的下载地址<a href="http://www.wampserver.com/en/download.php" title="http://www.wampserver.com/en/download.php">http://www.wampserver.com/en/download.php</a>.</p><p><a href="http://byfiles.storage.msn.com/y1prvpgQBUS6lretlHtvhSTFXBwBLiLImYAbaMtflKLezLEMjwdzyqesOgMge0KwicK6p88yA9GOIY?PARTNER=WRITER"><img src="http://byfiles.storage.msn.com/y1prvpgQBUS6lob8kmJQvRZQudZ8bWQqlzyUL2eTVIqLRwVRWrVyhhK3-sqfiRdTd9i5QN9xDzg_MQ?PARTNER=WRITER" border="0" height="237" alt="BB6QT0FT23J7OLOKL~OE3VJ" width="166" /></a> <a href="http://byfiles.storage.msn.com/y1prvpgQBUS6loWdfYtbe-EFHM4rU1hb-udtXOC9MuR6WkdEEXCDdjVkOVdW039M14mWkkaD0oMvjU?PARTNER=WRITER"><img src="http://byfiles.storage.msn.com/y1prvpgQBUS6lomx86yUK8AcRM-kvSXen_RnOIWlbjSFRvV9c5KhRU3T51unU6e_rTDv10QTXG3Weg?PARTNER=WRITER" border="0" height="232" alt="image" style="border: 0px" width="366" /></a>这是我下载的版本.</p><p>安装完毕以后,为方便你的测试,需要在你的WAMP控制面板里面Apache选项里面添加一个新的Alias,根据提示将地址指向你的Eclipse workspace下面的项目文件夹.</p><p>同时在php.ini里面添加Zend debuger,在任意空白的地方添加:</p><p><em>zend_extension_ts = &quot;F:\eclipse\plugins\org.zend.php.debug.debugger.win32.x86_5.2.6.v20070507\resources\php5\ZendDebugger.dll&quot;</em></p><p>重启Apache,就可以使用Eclipse-&gt;Debug中的PHP Web Page方式调试你的项目了。 </p><p><a href="http://byfiles.storage.msn.com/y1prvpgQBUS6loHnlGaHmpnai5Ob5V99PTvvp2uh7iNOL9Ec_TDnP7yB9a44ybGur7GeK7fuvSjMEo?PARTNER=WRITER"><img src="http://byfiles.storage.msn.com/y1prvpgQBUS6lpy7jWNyp2d4-ecBotnJiHRUV_NTEWr3NPCwHk9cmuHSBCRKq88CPVVB-vKhzYjr_M?PARTNER=WRITER" border="0" height="72" alt="eclipse_home_header" style="border: 0px" width="135" /></a> <a href="http://byfiles.storage.msn.com/y1prvpgQBUS6lombnId2hmxfgi4PMFHXh0EupRNe4vwYdeoCB278uozHbvOH9_GyOyWwxANjMVs5IU?PARTNER=WRITER"><img src="http://byfiles.storage.msn.com/y1prvpgQBUS6lp0SLqkCOTbPMARbLnaxxujQVIFvJmEjKooQIUQsuL3RR-wHVc_4CK9WFxw-x2kivY?PARTNER=WRITER" border="0" height="67" alt="O8N$4D%F~6J_F3O`5ADETZO" style="border: 0px" width="183" /></a> </p><div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:6ff297e5-05c5-414c-a8ec-c6feb8153fd2" style="display: inline; margin: 0px; padding: 0px">Technorati 标签: <a href="http://technorati.com/tags/PHP" rel="tag">PHP</a>,<a href="http://technorati.com/tags/Eclipse" rel="tag">Eclipse</a>,<a href="http://technorati.com/tags/WAMP" rel="tag">WAMP</a></div>
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/157140#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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 29 Dec 2007 20:23:07 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/157140</link>
        <guid>http://devsharp.javaeye.com/blog/157140</guid>
      </item>
      <item>
        <title>$this-&gt;$a与$this-&gt;a----PHP学习笔记</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/157141" style="color:red;">http://devsharp.javaeye.com/blog/157141</a>&nbsp;
          发表时间: 2007年12月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天在阅读<a href="http://php.chinaunix.net/manual/zh/" target="_blank">PHP Manual</a>的&quot;对象&quot;这一部分的时候,发现评论中的一个例子很不理解,代码如下</p><pre><span style="color: #0000ff">&lt;?</span>php
<a href="http://www.php.net/class" style="color: #0000ff">class</a> c
{
    <a href="http://www.php.net/var" style="color: #0000ff">var</a> $a = <a href="http://www.php.net/array" style="color: #ffa500">array</a>('<span style="color: #8b0000">a</span>'=&gt;'<span style="color: #8b0000">aa</span>','<span style="color: #8b0000">b</span>'=&gt;'<span style="color: #8b0000">ab</span>');
    <a href="http://www.php.net/var" style="color: #0000ff">var</a> $b = '<span style="color: #8b0000">c</span>';
    <a href="http://www.php.net/function" style="color: #0000ff">function</a> show()
    {
        <a href="http://www.php.net/echo" style="color: #0000ff">echo</a> $this-&gt;a['<span style="color: #8b0000">a</span>']; <span style="color: #008000">// -&gt; 1st</span>
        <a href="http://www.php.net/echo" style="color: #0000ff">echo</a> $this-&gt;a['<span style="color: #8b0000">b</span>']; <span style="color: #008000">// outputs 'ab'</span>
        $a = '<span style="color: #8b0000">a</span>';
        $b = '<span style="color: #8b0000">b</span>';
        <a href="http://www.php.net/echo" style="color: #0000ff">echo</a> <a href="http://www.php.net/ob_start" style="color: #ffa500">ob_start</a>($this-&gt;$a[97]);     
        <a href="http://www.php.net/echo" style="color: #0000ff">echo</a> <a href="http://www.php.net/var_dump" style="color: #ffa500">var_dump</a>($this-&gt;a[$a]);
        <a href="http://www.php.net/echo" style="color: #0000ff">echo</a> $this-&gt;a[$a];
        <a href="http://www.php.net/echo" style="color: #0000ff">echo</a> $this-&gt;$a[$a];<span style="color: #008000">// [] 1st, not what I expected</span>
        <a href="http://www.php.net/echo" style="color: #0000ff">echo</a> $this-&gt;$a[$b];
        <span style="color: #008000">//echo  $this -&gt; $a; // does NOT output 'ab'</span>
        $this_a =&amp; $this-&gt;$a; <span style="color: #008000">// work-around</span>
        <a href="http://www.php.net/echo" style="color: #0000ff">echo</a> $this_a[$a]; <span style="color: #008000">// no question</span>
        <a href="http://www.php.net/echo" style="color: #0000ff">echo</a> $this_a[$b];
        $a_arr = <a href="http://www.php.net/array" style="color: #ffa500">array</a>('<span style="color: #8b0000">a</span>'=&gt;'<span style="color: #8b0000">b</span>');
        <a href="http://www.php.net/echo" style="color: #0000ff">echo</a> $this-&gt;$a_arr[$a]; <span style="color: #008000">// [] 1st =&gt; outputs 'c'</span>
    }
}
$c = new c();
$c-&gt;show();
<span style="color: #0000ff">?&gt;</span></pre><pre>在这里的$this-&gt;$a和$this-&gt;a是一样的，而调用var_dump()却发现$this-&gt;$a['a']和$this-&gt;a['a']是不一样的，这个问题很奇怪.</pre><pre>于是我Google的一位朋友讨论了以后,终于发现一个问题:</pre><pre>$this-&gt;$a['a']实际上PHP解析的时候是认为$this-&gt;{$a['a']},这里的$a实际上就是'a'一个单字符字符串,那么就变成了$this-&gt;a['a'],</pre><pre>这里的['a']就变成了字符串'a'的序列索引(index of string 'a')，而我们知道字符串的索引要求是一个integer，所以这里PHP将['a']进行</pre><pre>类型转换成了0!因此就变成了:</pre><pre>$this-&gt;$a['a']-----&gt;&gt; $this-&gt;a['a']-----&gt;&gt;$this-&gt;a[0]-----&gt;$this-&gt;a </pre><pre>这也解释了为什么$this-&gt;$a===$this-&gt;a；同时我们也可以发现无论$a[x]这里的x是什么,他的结果都是一样的,都是一个数组!</pre><pre>这里就出现了和手册里关于操作符的要求相矛盾的理解了,不知道算不算是一个Bug。我们把这个问题已经提交给官方了:)</pre><pre><a href="http://byfiles.storage.msn.com/y1prvpgQBUS6lp1ZaNRqi4oF179tUPEAVmumrbw34elmIrkK5ne9It86vNJq6_CmRld3_LlX52Fsuo?PARTNER=WRITER"><img src="http://byfiles.storage.msn.com/y1prvpgQBUS6lpyVeO5Glf3XvRwXPzT7b1BrKIhqD6ky4s57qBTAkHvKgkACZKGeHs-UPRANU86iGo?PARTNER=WRITER" border="0" height="64" alt="php_snow" style="border: 0px" width="120" /></a> </pre><div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d13ba4df-ab7f-4df8-bc6f-afc5dbafdf4f" style="display: inline; margin: 0px; padding: 0px">Technorati 标签: <a href="http://technorati.com/tags/PHP" rel="tag">PHP</a>,<a href="http://technorati.com/tags/%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0" rel="tag">学习笔记</a></div>
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/157141#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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>Sat, 29 Dec 2007 19:27:00 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/157141</link>
        <guid>http://devsharp.javaeye.com/blog/157141</guid>
      </item>
      <item>
        <title>2008</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/157142" style="color:red;">http://devsharp.javaeye.com/blog/157142</a>&nbsp;
          发表时间: 2007年12月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>和群里的朋友讨论完一个问题以后，发现时间已经是12月29日了,另一位网友说了句"2008再见"，才想起原来很多公司今天开始放假了，大家再次见面的时候就是2008年了----奥运年。这才发现，2007年就这样快要结束了。一个人向来，这一年真是......竟然找不到一个词语来概括这一年的风风雨雨。</p> <p>细细的回想，记得这么几件事情对自己来说，影响颇大。</p> <p><strong>离开</strong>,这样一个决定或许改变了我今后的一生，离开的原因无论自己怎么告诉自己，但是不能回避的是冲动和一丝后悔。当时间倒流至那一天，或许我还会是这个决定----因为我知道这样的结果已经没有办法挽回了，既然结局注定，为什么不能从容的离开?或许从容不是我期望的，当把时间一点一点分散到每天的时候，我可能有无数个机会去挽回，但是，我采取的是放任的态度，“可能发生的就一定会发生”这个道理我明白，可是我还是选择了一种与其说是顺其自然不如说是放纵的态度。留给自己的是伤感?是后悔?是压力?似乎现在大多时候是麻木的，只有偶尔一个人静静的时候才会有那么一丝心灵的颤动。</p> <p><strong>面对</strong>，离开的压力伴随着时间再慢慢消失的时候，我似乎应该学会去面对。可是，我只会放纵，沉溺在自己的白色幻想里，最终在很多人的有意或者无意帮助下，我才可以回来正视自己。</p> <p><strong>寻找</strong>，生活的压力让我去寻找生存的依靠，我知道时不我待，可是我总想准备好了再出发。忙忙碌碌，寻觅，白眼，讽刺，挖苦，压力这些一直都有。寻找或许一直在进行中......</p> <p><strong>准备</strong>,抓住每一个机会,生活是需要奋斗的!</p> <p>视野,今年最大的收获就是结识了很多技术上的朋友，也在Linux C Python等领域小有研究.</p> <p><a href="http://by1.storage.msn.com/y1pYlcRcDLBMPvQupfY4IRnbFFOX6qYmYAikQ1iCnLQaMwqtQLzvww6KC_MkcAe88EsyC0j7P-O0c6QSY7KlCuOacZdhAk6EXcQ?PARTNER=WRITER"><img src="http://by1.storage.msn.com/y1pYlcRcDLBMPvM_zs4WclL7r88tEUvXVeZ5UvHJwMBJSuLysKSNwnX1SD14uuFJzt41wv5jraiaEh77g7apGVoTE5AkkwzwJh1?PARTNER=WRITER" border="0" height="111" alt="images os" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" width="128" /></a> </p> <p>希望，这是我给2008留de关键词!</p>
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/157142#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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 28 Dec 2007 18:16:29 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/157142</link>
        <guid>http://devsharp.javaeye.com/blog/157142</guid>
      </item>
      <item>
        <title>高度与角度</title>
        <author>Jarymin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devsharp.javaeye.com">Jarymin</a>&nbsp;
          链接：<a href="http://devsharp.javaeye.com/blog/157143" style="color:red;">http://devsharp.javaeye.com/blog/157143</a>&nbsp;
          发表时间: 2007年12月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div><strong>很多年以前,很喜欢做个博学的人,因为小时候一个同学知道的很多,据说看了大百科全书的。因此,我也看了很多杂七杂八的书,后来进入专业了,也是涉及了很多的领域,比如Linux,Mac,Web,WinForm...以至于到后来自己都不知道去研究什么,哪里才是自己的方向,就这样浑浑噩噩的,浪费了很多的光阴,&quot;看似懂很多，稍一深入,就不知道了&quot;和一位很年轻的MVP聊天的时候，我问他怎么选择自己的方向呢?他告诉我当年他是没有的选择,所以才走了这样的道路!而我呢?选择有时候很艰难,我问他很多问题Why this not other,他告诉我,因为<span style="color: #f2f2f2">我站的高度还不够,我又问他,怎么才能迅速达到那样的高度,答曰:&quot;很多事情是需要自己经历的,别人告诉你的那种拔苗助长,是没有意义的&quot;。</span></strong></div>
<div><strong><span style="color: #f2f2f2">鲁迅说的很好:&quot;世上本没有路,走的人多了,也就有了路&quot;当我在考虑方向的时候,应该向前走下去&mdash;&mdash;权而后知轻重。</span></strong></div>
<div> </div>
<div><strong><span style="color: #f2f2f2">最近开始学习PHP了,这对于自己是一个全新的领域,在这里借鉴Python的经验,我获得了一个独特的视角----Script 的魅力!HTML对自己还是有点挑战的,难道C/JAVA写多了,这样的解释型语言就没法接受了?-_-! 捧着一本&quot;圣经&quot;参照着&quot;手册&quot;一点一滴的学习中... </span></strong></div>
<div> </div>
<div><strong><span style="color: #f2f2f2">.Net俱乐部腐败照:)</span></strong></div>
<div><a href="http://byfiles.storage.live.com/y1prvpgQBUS6lrMsYPquNxZ2c8R_oMtxmUj6waR90fkV7yKSNrAKCDzr9ivbRDvlowrblcMzO3fYoY" target="_blank"><img src="http://byfiles.storage.live.com/y1prvpgQBUS6lrMsYPquNxZ2c8R_oMtxmUj6waR90fkV7yKSNrAKCDzr9ivbRDvlowrblcMzO3fYoY" height="200" alt="DSC_3826" width="300" /></a><a href="http://byfiles.storage.live.com/y1prvpgQBUS6lozUHN6TmgdDEE_3ol3Zg0THj2Ah8jYZ2Bq0QEDD13NtNDVBqPKciG83u2cPPRWmm4" target="_blank"><img src="http://byfiles.storage.live.com/y1prvpgQBUS6lozUHN6TmgdDEE_3ol3Zg0THj2Ah8jYZ2Bq0QEDD13NtNDVBqPKciG83u2cPPRWmm4" height="200" alt="DSC_3934" width="300" /></a></div>
          <br/>
          <span style="color:red;">
            <a href="http://devsharp.javaeye.com/blog/157143#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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>Thu, 27 Dec 2007 18:32:04 +0800</pubDate>
        <link>http://devsharp.javaeye.com/blog/157143</link>
        <guid>http://devsharp.javaeye.com/blog/157143</guid>
      </item>
  </channel>
</rss>