<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>jinheking</title>
    <description></description>
    <link>http://jinheking.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>D语言库tango下载,编译和设置教程(ZT)</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/209877" style="color:red;">http://jinheking.javaeye.com/blog/209877</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本文以Tango　0.99.5 , DMD 1.027为例。<br /><br />下载D语言库tango<br /><br />    下载网址：<br />        svn下载网址：<br />        http://svn.dsource.org/projects/tango/trunk/<br />    <br />    用svn客户端工具导出到　dmd\tango　目录。<br />    dmd\tango　目录在哪里？确认下面文件存在：<br />引用:<br />    dmd\bin\dmd.exe<br />    dmd\tango\tango\core\Version.d<br />不要下载zip包，或者其他安装包，要自己学会目录设置及sc.ini的设置．<br />    <br /><br /><br />编译D语言库tango<br /><br />    http://www.dsource.org/projects/tango/wiki/TopicBuildingTango<br /><br />    在windows下这样编译：<br />    1 运行tango\lib\build-dmd.bat<br />    编译出：    tango-base-dmd.lib<br /><br />    2 运行tango\lib\build-tango.bat<br />    编译出tango-user-dmd.lib<br /><br />    3 运行tango\lib\build-win32.bat<br />    编译出tango-win32-dmd.lib<br /><br />设置sc.ini<br /><br />    http://www.dsource.org/projects/tango/wiki/WindowsInstall<br /><br />    dmd\bin\sc.ini的内容：<br />引用:<br />    [Version]<br />        version=7.51 Build 020<br /><br />        [Environment]<br />        LIB="%@P%\..\tango\lib;%@P%\..\..\dm\lib"<br />        DFLAGS="-I%@P%\..\tango;%@P%\..\src\other" -version=Tango -defaultlib=tango-base-dmd.lib -L+tango-user-dmd.lib<br />        LINKCMD=%@P%\..\..\dm\bin\link.exe<br />注：DFLAGS中的src\other下是D语言中文社区 http://bbs.d-programming-language-china.org/　收集或所写的模块。<br />    DFLAGS中把常用的库都加到 -L+ 后面，这样在写程序里就省略类似这样的指令了： program(lib, "dwin.lib")<br />    下面是比较全的一个DFLAGS配置：<br />引用:<br />    DFLAGS="-I%@P%\..\tango;%@P%\..\src\other;" -version=Tango  -defaultlib=tango-base-dmd.lib -L+tango-user-dmd.lib+dfl.lib+dwin.lib+pcre.lib+gtkd.lib+htmlayout.lib+flowerd.lib+dwt.lib+advapi32.lib+comctl32.lib+comdlg32.lib+gdi32.lib+gdiplus.lib+glu32.lib+kernel32.lib+msimg32.lib+ole32.lib+oleacc.lib+oleaut32.lib+olepro32.lib+opengl32.lib+user32.lib+usp10.lib+uxtheme.lib<br />这里有一个重要技巧，建立一个 dmd\src\other目录，把绝大数D库代码都放到这里，然后在DFLAGS指定这个目录就行了．<br />    <br />编译你的第一个tango程序<br /><br />    打开D语言编辑器 SciTE4D, 如果你还没有安装SciTE4D, 请到这里下载：<br />    http://scite4d.d-programming-language-china.org<br />    <br />    在SciTE4D里按Ctrl+N新建一个文档，把下面代码保存为test.d．<br />    注意不能新建一个文本文档，改后缀为D，这样文件编码通常是GBK, 而D语言编程一般是用UTF-8, 这在D语言编辑器SciTE4D的使用说明里已经强调过了．
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/209877#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 30 Jun 2008 17:57:59 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/209877</link>
        <guid>http://jinheking.javaeye.com/blog/209877</guid>
      </item>
      <item>
        <title>py2exe越来越爽了</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/165057" style="color:red;">http://jinheking.javaeye.com/blog/165057</a>&nbsp;
          发表时间: 2008年02月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          新版本已经可以打包为一个文件了，以前都是一堆dll, pyd的。具体的变化其实只有一个地方。就是options里增加bundle_files项，值为1表示pyd和dll文件会被打包到exe文件中，且不能从文件系统中加载python模块；值为2表示pyd和dll文件会被打包到exe文件中，但是可以从文件系统中加载python模块。另外setup中使用zipfile=None可以不生成library.zip。<br /> <br />例如原来的：<br /><pre name="code" class="java">
from distutils.core import setup
import py2exe
includes = ["encodings", "encodings.*"]
options = {"py2exe":
            {   "compressed": 1,
                "optimize": 2,
                "includes": includes,                
            }
          }
setup(   
    version = "0.1.0",
    description = "search panda",
    name = "search panda",    
    options = options,    
    windows=[{"script": "search.py", "icon_resources": [(1, "search.ico")] }],      
    )
只需要改为：
from distutils.core import setup
import py2exe
includes = ["encodings", "encodings.*"]
options = {"py2exe":
            {   "compressed": 1,
                "optimize": 2,
                "includes": includes,
                "bundle_files": 1
            }
          }
setup(   
    version = "0.1.0",
    description = "search panda",
    name = "search panda",
    options = options,
    zipfile=None,
    windows=[{"script": "search.py", "icon_resources": [(1, "search.ico")] }],  
    
    )
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/165057#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><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 26 Feb 2008 12:57:36 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/165057</link>
        <guid>http://jinheking.javaeye.com/blog/165057</guid>
      </item>
      <item>
        <title>Python 操作 EXCEL  2(ZT)</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/164201" style="color:red;">http://jinheking.javaeye.com/blog/164201</a>&nbsp;
          发表时间: 2008年02月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          17:22http://www.cnblogs.com/Jedimaster/archive/2007/02/28/660209.html<br />朋友的家人做生意，每日从各地分店处收集报表，然后回去汇总。由于不想用那种复杂的管理软件，就叫他写一个小工具。于是他找到了我，让我想想办法。<br /><br />　　Python是个令人惊奇的工具，而不仅仅是一种语言。对比老牌的Perl，看似Python不是那么的精通 —— 对比Perl超快的文本处理速度和广泛应用于Cgi程序的编写历史，以及目前大红大紫的Ruby在Web开发上的病毒式蔓延，而比起静态语言比如C\C++，虚拟机Java和C#来说，速度又成了问题。但是Python的实力可不容小视，NASA都用Python可不是吹的，况且，Python的学习难度比Perl小多了，刚学时让我找到了以前QBASIC的感觉。<br />　　<br />　　此程序具体要求如下：每日产生副表若干（如副表文件）。程序先核对附表的日期和销售点。如果销售点不同日期相同，便把不同副表的相同产品号的 “销售数量”栏相加，填入总表“销售数量”栏。将副表的“总利润”栏相加填入总表的“总利润”栏。其他副表信息复制到总表（备注除外,由用户自行处理）。表头的样式如下：<br /><br /><br /><br />　　啊哈，很简单的表头。其中需要操作的是“销售数量”和“总利润”，也就是把相同时间的报表相加。但是这样有个严重问题！ <br /><br />必须要求，相同报表的产品名称、货号的顺序不能出错，各地要绝对统一，否则全部这样照样拷贝就会出错！<br /><br />　　让我们分析一下思路：时间是关键。时间决定了哪些报表需要分门别类，生成哪一天的统计总表。数据结构上，用什么呢？简单的list？不行，我尝试过。应该使用map容器，把日期作为key，储存的Value是个列表。程序先扫描所有的Excel文件获取日期，然后把相同日期报表的COM文档接口储存起来，实现了分门别类。最后遍历这个map容器，计算，生成每日的统计总表。代码如下，经过测试正常。<br /><br /><br />1import os;<br />2import sys;<br />3import time;<br />4import datetime;<br />5#请先安装对应着你自己的Python版本的PythonWin32<br />6import win32com.client;<br />7<br />8<br />9mapper = {};<br />10<br />11app = win32com.client.Dispatch("Excel.Application");<br />12PipeOut = os.popen("dir *.xls /B");<br />13FileList = PipeOut.readlines();<br />14PipeOut = os.popen("cd");<br />15CurDic = PipeOut.readline();<br />16CurDic = CurDic[:-1] + "\\";#去处末尾的\n<br />17print "当前工作目录为"+CurDic;<br />18<br />19    #读取每个文件的时间和储存相应的COM接口<br />20<br />21for filename in FileList:<br />22     filename = CurDic+filename[:-1];<br />23    print filename;<br />24     Doc = app.Workbooks.Open(filename);<br />25     Sheet = Doc.Sheets(1);<br />26     Time = Sheet.Cells(2,5);<br />27    print type(Time);<br />28     TimeKey = str(Time);<br />29    print TimeKey;<br />30    if mapper.has_key(TimeKey):<br />31         mapper[TimeKey].append(Sheet);<br />32    else :<br />33         mapper[TimeKey] = [];<br />34         mapper[TimeKey].append(Sheet);<br />35    #print mapper;<br />36<br />37<br />38    #生成新的统计总表<br />39    <br />40    #开始处理mapper 每次从一个自表中读取2x20个数据，然后和总表相加<br />41print "-------------------------------------";<br />42Protetype = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];<br />43a = 0;<br />44b = 0;<br />45c = 0;<br />46<br />47for k,v in mapper.items():<br />48    print "//////////////////////////////////"<br />49     a+=1;<br />50     Count = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];<br />51     Benefit = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];<br />52     Name = [u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u"",u""];<br />53    #print Count;<br />54    #print Benefit;<br />55        #Total = app.Workbooks.Open(CurDic+"Template\\TotalTemplate.xls");<br />56    print "How manu Sheets in this List ? ",len(v);<br />57    for sht in v:<br />58         b+=1;<br />59         _Count = sht.Range("C4:C23").Value;<br />60         _Benefit = sht.Range("F4:F23").Value;<br />61         _Name = sht.Range("B4:B23").Value;<br />62        #print _Count;<br />63        #print _Benefit;<br />64        assert(len(_Count) == len(_Benefit));<br />65        for i in range(0,len(_Count)):<br />66             c+=1;<br />67             Count[i] = _Count[i][0] + Count[i];<br />68             Benefit[i] = _Benefit[i][0] + Benefit[i];<br />69             Name[i] = _Name[i][0];<br />70        #以上作为储存总表项的数据<br />71     Total = app.Workbooks.Open(CurDic+"Template\\TotalTemplate.xls");<br />72     TotalSheet = Total.Sheets(1);<br />73     _Time = k[:k.find(" ")];<br />74     _Time = _Time.replace("/","-");<br />75    print _Time;<br />76    print Count;<br />77    print Benefit;<br />78        #TotalSheet.Cells(2,2).Value = _Time;<br />79    for i in range(0,len(Count)):<br />80         TotalSheet.Cells(4+i,3).Value = Count[i];#填充数量<br />81         TotalSheet.Cells(4+i,6).Value = Benefit[i];#填充利润<br />82         TotalSheet.Cells(4+i,2).Value = Name[i];#填充货物名称<br />83<br />84    #保存总表<br />85     Total.SaveAs(CurDic+_Time+"统计总表.xls");<br />86    del Count,Benefit;<br />87print "++++++++++++++++++++++++++++"<br />88print a,b,c;<br />89app.Quit();<br />90app = None;<br />91<br />　　使用方法，先安装Python 2.4和PythonWin For 2.4。然后把这个脚本拷贝到分表的文件夹下，然后运行（调试），自动生成与日期相关的总表。效果图如下：<br /><br />最终解决思路的提示：其实这种方法只能在规模比较小的时候，因为这种脱离于总系统的处理效率实在非常低，而且Excel二进制文件，空表的占用就达15k，在未来有大量业务数据处理的话将是无法忍受的噩梦。所以，我建议这位商务人士分析一下他所使用的处理系统，用便宜的网络线路构建从各地中心服务器系统，使用XML作为数据交换得媒介，在自己的服务器上您只需要使用简单的SQL处理过程就可以了，而且数据的可靠度比平面Excel文档高得多。<br /><br />数据在这里下载，为了保险起见请不要使用中文的文件夹目录。<br /><br /><br /><br />**************************************************************************************************<br /><br /><br /><br />如何使用python取得excel的数据呢？<br />这两天看了点python，这两天不怎么忙突然想如果用python来读取会如何？（这些天一直使用java来读取excel），多说那就是浪费时间了，废话少说，始めましょう：#导入该模块import win32com.client#指定是应用程序是Excel.Application并得到cel.Application")对象<br />xlsApp = win32com.client.Dispatch("Excel.Application")#得到Workbooks<br />xlsBook   = xlsApp.Workbooks.Open("c:\\test\\a.xls")#得到SheetName的Sheet对象<br />xlsSheet = xlsBook.Sheets("SheetName")#得到有数据的行，这里要注意UsedRange的使用，不使用它也可以但是你会得到所有的整个sheet的单元格了，不是我们需要的。#这里浪费了我很多时间，由于此前我并没写过类似宏的东东。rs = xlsSheet.UsedRange.Rows#最后当然类似读数组那样把它读取出来，具体如何使用我想就看个人什么用途以及喜好了。这里只是打印出来看看for r in rs:      print r打印内容类似如下((1.0, u'20040207', u'1'),)<br />((2.0, 20040207.0, u'1'),)这样就把excel的数据读取出来了。
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/164201#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/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>Fri, 22 Feb 2008 13:53:44 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/164201</link>
        <guid>http://jinheking.javaeye.com/blog/164201</guid>
      </item>
      <item>
        <title>用gettext实现i18n多语言界面     转载自http://www.3snews.net/?</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/164086" style="color:red;">http://jinheking.javaeye.com/blog/164086</a>&nbsp;
          发表时间: 2008年02月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          想在开启程序界面的时候,中文系统就出现中文,英文系统就出现英文吗?呵呵,gettext就可以实现.<br /><br />    过去非常向往那种风格: 选了语言,就可以用什么语言显示.以前玩anjuta的时候总是有个gettext错误,弄得我每次新建工程的时候第一件事就是关掉gettext,而且搞的好像非常神秘似的,今天才知道就是这个gettext有这种能力.<br /><br />   其实说起来也没什么神秘的,gettext也就是建立一个语言对应文件,必要的时候去文件中查找某国语言,然后以那种形式读出,替代原来的字符罢了.<br /><br />    用Python玩个简单的例子吧!其实C++什么的都有相关程序,只不过C++写起来太麻烦了,而且C++的库在Windows上是一大堆,需要下载好些依赖的dll和exe,Python才两个py文件就可以.<br /><br />    Python的i18n工具的存放位置在Python24\Tools\i18n目录下,一共两个msgfmt.py和pygettext.py两个文件.<br /><br />    现在我们先来制作语言对应文件.<br /><br />    运行pygettext.py会生成一个messages.pot,注意,这不是个ppt模板,是一个po文件模板.拷贝一个,改名为gb.po,其实随便改成什么都好,只要扩展名为po(其实pot也可以),用记事本打开,里面的内容如下:<br /><br />    # SOME DEscrīptIVE TITLE.<br />    # Copyright (C) YEAR ORGANIZATION<br />    # FIRST AUTHOR &lt;EMAIL@ADDRESS>, YEAR.<br />    #<br />    msgid ""<br />    msgstr ""<br />    "Project-Id-Version: PACKAGE VERSION\n"<br />    "POT-Creation-Date: 2006-11-04 11:47+中国标准时间\n"<br />    "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"<br />    "Last-Translator: FULL NAME &lt;EMAIL@ADDRESS>\n"<br />    "Language-Team: LANGUAGE &lt;LL@li.org>\n"<br />    "MIME-Version: 1.0\n"<br />    "Content-Type: text/plain; charset=CHARSET\n"<br />    "Content-Transfer-Encoding: ENCODING\n"<br />    "Generated-By: pygettext.py 1.5\n"<br /><br />    把"Content-Type: text/plain; charset=CHARSET\n"改成<br />    "Content-Type: text/plain; charset=gb2312\n"<br />    <br />    把"Content-Transfer-Encoding: ENCODING\n"改成<br />    "Content-Transfer-Encoding: cp936\n"<br /><br />    当然,这要看自己的情况了.gb2312是文件字符集,如果是utf8,则用utf8代替.<br /><br />    然后在文件后面添加msgid,msgstr对,比如添加完是这样:<br /><br />    # SOME DEscrīptIVE TITLE.<br />    # Copyright (C) YEAR ORGANIZATION<br />    # FIRST AUTHOR &lt;EMAIL@ADDRESS>, YEAR.<br />    #<br />    msgid ""<br />    msgstr ""<br />    "Project-Id-Version: PACKAGE VERSION\n"<br />    "POT-Creation-Date: 2006-11-04 09:59+中国标准时间\n"<br />    "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"<br />    "Last-Translator: FULL NAME &lt;EMAIL@ADDRESS>\n"<br />    "Language-Team: LANGUAGE &lt;LL@li.org>\n"<br />    "MIME-Version: 1.0\n"<br />    "Content-Type: text/plain; charset=gb2312\n"<br />    "Content-Transfer-Encoding: cp936\n"<br />    "Generated-By: pygettext.py 1.5\n"<br /><br />    msgid "Open"<br />    msgstr "打开"<br /><br />    msgid "Edit"<br />    msgstr "编辑"<br /><br />    msgid "Delete"<br />    msgstr "删除"<br /><br />    msgid "Export"<br />    msgstr "导出"<br /><br />    注意,第一个出现的msgid,msgstr对是文件头中的内容,不要动,否则会出问题.<br /><br />    好了,退出,运行dos命令:<br />    msgfmt.py gb.po<br /><br />    生成一个gb.mo文件,这就是语言翻译库文件.<br /><br />    写个程序运行下:<br />    import gettext<br />    cat = gettext.GNUTranslations(open("gb.mo"))<br />    _ = cat.gettext<br />    print _("Open")<br />    print _("Hello")<br /><br />    输出:<br />    打开<br />    Hello<br /><br />    可以看到,定义过的英文被翻译成了中文,其他的没有定义,也就还是英文输出.
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/164086#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/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>Fri, 22 Feb 2008 09:32:29 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/164086</link>
        <guid>http://jinheking.javaeye.com/blog/164086</guid>
      </item>
      <item>
        <title>[技术]Use Python As a tool </title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/163655" style="color:red;">http://jinheking.javaeye.com/blog/163655</a>&nbsp;
          发表时间: 2008年02月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          玩Python的日子也不算短了，正儿八经的东西也没见作出来一个。不过有什么关系呢，脚本语言么，给自己带来方便才是真的。<br /><br />Python除了作为可以编写程序之外，利用它的强大函数库，用交互模式来快速的完成一些小任务，也是不错的选择。<br /><br />1、转换big5文件为utf-8<br /><br /><br />上次下载了一个电影字幕，big5编码的，看着是乱码。所以用Python转了一下：<br /><br />    >>> src = open("1.srt").read()<br />    >>> dest = unicode(src, "big-5").encode("utf-8")<br />    >>> open("2.srt", "w").write(dest)<br /><br />2、查看quoted编码。<br /><br /><br />有人问RescoViewer_v4%5b1%5d.30.3%bc%f2%cc%e5%d6%d0%ce%c4%b0%e6这个是什么意思？<br /><br />用Python看看吧：<br /><br />    >>> import urllib<br />    >>> print urllib.unquote("RescoViewer_v4%5b1%5d.30.3%bc%f2%cc%e5%d6%d0%ce%c4%b0%e6")<br />    RescoViewer_v4[1].30.3简体中文版<br /><br />3、为文件加上HTML段落标记<br /><br />用FireFox写文章就是要自己一段一段的分段比较不爽(我不爱用FCKEditor)。用Python试试吧：<br /><br />    >>> lines  = open("test.txt").readlines()<br />    >>> fp = open("output.txt", "w")<br />    >>> for line in lines:<br />    ...     fp.write("&lt;p>%s&lt;/p>" % line)<br />    ...<br />    >>> fp.close()<br /><br />4、把CSV格式的文件转换成TAB排版格式<br /><br />    >>> lines = open("aaa.csv").readlines()<br />    >>> fp = open("output.txt", "w")<br />    >>> for line in lines:<br />    ...  	fp.write('\t'.join(line.split(',')))<br />    >>> fp.close()
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/163655#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/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>Wed, 20 Feb 2008 16:05:27 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/163655</link>
        <guid>http://jinheking.javaeye.com/blog/163655</guid>
      </item>
      <item>
        <title>python中的编码问题</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/163639" style="color:red;">http://jinheking.javaeye.com/blog/163639</a>&nbsp;
          发表时间: 2008年02月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          python 中的字符集设定问题<br />python默认的编码是ascii，为改变默认编码，在文件的第一行，或者紧挨"#!"所在行的后面添加 <br /># -*- coding: codetype -*- <br />codetype 可以是已经识别的一种，中文下，可以是 gbk,gb2312,gb18030,big5，需要相应的库支持 <br /><br />显示问题<br />ss="python问题"<br />str(ss)<br />'python\xce\xca\xcc\xe2'<br />repr(ss)<br />"'python\\xce\\xca\\xcc\\xe2'"<br />后者表示ss的存储格式<br />print ss<br />则会将ss解码，输出“python问题”<br /><br /><br />python 中的编码转码问题<br />print str.decode.__doc__ <br />S.decode([encoding[,errors]]) -> object<br /><br />Decodes S using the codec registered for encoding. encoding defaults<br />to the default encoding. errors may be given to set a different error<br />handling scheme. Default is 'strict' meaning that encoding errors raise<br />a UnicodeDecodeError. Other possible values are 'ignore' and 'replace'<br />as well as any other name registerd with codecs.register_error that is<br />able to handle UnicodeDecodeErrors.<br /><br />按照指定的编码类型给字符串解码，解码后的编码为默认编码 <br />errors指定处理错误的行为 <br />如果出错了，不需要报告，设定errors ="ignore" <br />默认报告任何错误 <br />errors = 'strict' , Raise UnicodeError (or a subclass); this is the default. <br />errors="replace" ,错误的编码用"?"替换 <br /><br />print str.encode.__doc__ <br />S.encode([encoding[,errors]]) -> object<br /><br />Encodes S using the codec registered for encoding. encoding defaults<br />to the default encoding. errors may be given to set a different error<br />handling scheme. Default is 'strict' meaning that encoding errors raise<br />a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and<br />'xmlcharrefreplace' as well as any other name registered with<br />codecs.register_error that is able to handle UnicodeEncodeErrors.<br /><br />...<br /><br />errors ='xmlcharrefreplace' ,使用XML的字符引用 (only for encoding). <br />errors = 'backslashreplace' Replace with backslashed escape sequences (only for encoding). <br /><br />将一个串从gb2312转成'utf8'<br />ss.decode("gb2312"，"ignore").encode("utf-8")<br /><br /><br />print unicode.__doc__<br />unicode(string [, encoding[, errors]]) -> object<br /><br />Create a new Unicode object from the given encoded string.<br />encoding defaults to the current default string encoding.<br />errors can be 'strict', 'replace' or 'ignore' and defaults to 'strict'.
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/163639#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Feb 2008 15:16:42 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/163639</link>
        <guid>http://jinheking.javaeye.com/blog/163639</guid>
      </item>
      <item>
        <title>在Python中结合doctest和Epydoc产生敏捷文档的一种方法(ZT)</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/163278" style="color:red;">http://jinheking.javaeye.com/blog/163278</a>&nbsp;
          发表时间: 2008年02月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          　　摘要：Python是一种敏捷开发项目经常采用的语言。本文介绍了在Python敏捷项目中结合类似epydoc文档系统，使在doctest单元测试同时能够产生同步的最新文档，比如常用的功能说明文档等，在敏捷开发中常被称作敏捷文档。 <br />　　关键词：Python；敏捷开发；敏捷文档；doctest；单元测试；执行文档；epydoc <br />　　中图分类号：TP311文献标识码：A文章编号：1009-3044(2007)04-11058-02 <br />　　 <br />　　1 引言 <br />　　在敏捷开发中单元测试是不可或缺的环节，单元测试除了保证了代码的质量外，在测试驱动开发中，测试更被改变地位，成为驱动开发主导的地位，每个功能的增加都必须写响应的单元测试以明确功能增加的目的性，形成的“测试-编码-重整”开发循环是敏捷开发的重要内容。 <br />　　众所周知，撰写文档是软件开发的重要部分。在测试驱动开发，程序员在单元测试中留下了大量的功能说明和功能使用代码，这些正是软件功能说明文档的素材，在python中利用doctest框架写出的单元测试更符合说明文档的需要，所以结合doctest和文档系统（epydoc）我们否找到一种方法：利用单位测试的注释和代码直接形成规格化的 <br />　　功能说明文档。 <br />　　 <br />　　2 doctest <br />　　2.1 doctest介绍 <br />　　在Python中doctest就是把程序中的docstring作为范例来运行的一个框架。 <br />　　docstring可以由普通部分和执行部分组成，普通部分等同于原来的文字说明，执行部分由'>>>'（python shell提示符）或'...'提示符区分。程序员可以通过手工编写可预测的执行部分，也可以通过拷贝复制python交互式shell中的输入和输出简单的形成执行部分，doctest搜寻存在与各个模块，类和函数中的docstring,把每个可执行部分当成一次范例运行，再把实际运行值和期望值的对照作为一次运行结果。 <br />　　2.2 doctest：单元测试的新框架 <br />　　doctest常常用来完成三方面任务：保持文档与代码的同步；实现回归测试；可执行文档。这样就给测试框架多的Python又增加了一个不错的选择，对比其他测试框架（如unittest；py.test等）doctest具备了如下一些特点： <br />　　(1)无需安装，从python 2.1版本开始被纳入标准库； <br />　　(2)没有调用接口，使用方便，只需复制粘贴python shell中交互输入输出； <br />　　(3)通过命令行参数可灵活控制测试的执行； <br />　　(4)能很好地保持文档和代码的同步； <br />　　(5)测试用例也独立存在与代码分离的文件中，它们可以包含特殊的边界测试用例等； <br />　　(6)利用增强选项可增强输出文本匹配能力，比如ellipses选项，使地址，浮点数等可变输出得到正确匹配； <br />　　(7)利用_test_变量，灵活选择测试用的docstring。 <br />　　利用doctest实现单元测试时，程序员独立创建只包含docstring的无函数体的测试函数实现测试单元，然后在docstring中编写测试说明和测试代码，它们是包含被测试目标的一些运行范例和期望的结果，利用doctest运行这些测试单元。 <br />　　我们约定在一个被测试模块中包含的所有测试单元列表称为：testlist；而模块中被测试目标所有测试单元的列表称为testmap。 <br />　　 <br />　　3 方法：结合单元测试doctest和epydoc开发敏捷文档 <br />　　epydoc是Python中一个功能强大的文档系统，结合类似epydoc这样的文档系统，使基于doctest的单元测试能够产生和代码同步的最新文档，这种文档不仅展示了代码中包含的所多个模块、类、方法、函数、变量，更重要的是，它还能提供许多程序功能的“动态的”使用范例。 <br />　　3.1 方法步骤 <br />　　我们下面将模拟doctest的单元测试过程，在docstring加入epydoc链接，最后用epydoc输出文档。 <br />　　(1)我们准备了要进行单元测试的模块P，包含一个类C; <br />　　(2)我们开始给模块P中的C.M1方法写单元测试。 <br />　　方法是：在Python的交互窗口中运行C.M1的测试代码，然后复制&粘贴刚才的输入和输出到一个新的Python模块文件中(testlist_P)，命名单元测试函数为test_M1，例子如下： <br />　　def test_M1(): <br />　　""" <br />　　对M1测试行为的简短描述 <br />　　被测试目标： <br />　　- L{P.C.M1} <br />　　testlist_P模块的main部分如下： <br />　　if _name_ == "_main_": <br />　　import doctest <br />　　doctest.testmod() <br />　　这是doctest在单元测试中典型的运行方式。实际运行测试时，我们只需在命令行方式下输入“python testfile_P.py”。 <br />　　(3)现在，我们给方法C.M1补充初步的实现代码。在M1的docstring中，我们还增加一个Test Map的链接： <br />　　def M1(self): <br />　　""" <br />　　M1的描述 <br />　　Test map: <br />　　- L{testmap_P.testmap_C_M1} <br />　　""" <br />　　(4)利用程序自动生成我们需要的模块P的Test Map，命名为testmap_P.py，其中C.M1的Test map内容(即所有测试到C.M1的测试单元列表)如下： <br />　　def testmap_C_M1(): <br />　　""" <br />　　Testmap for L{P.C.M1}: <br />　　- L{testlist_P.test_M1} <br />　　""" <br />　　(5)调用epydoc输出文档： <br />　　epydoc -o P_docs P.py testlist_P.py testmap_P.py <br />　　输出的文档在P_docs目录下，由于都是HTML格式文件，我们只需把它们移到web服务器文档目录下来就能发布出在线文档。 <br />　　当我们点击testlist_P模块链接，我们会看到模块P的testlist： <br />　　Module P_docs.testlist_P <br />    当我们点击方法C.M1的docstring中的testmap链接，我们可以看到C.M1的testmap： <br />　　Testmap for P.C.M1: <br />　　* testlist_P.test_M1 <br />　　为C.M2重复步骤2-5 <br />　　(6)假设我们在单元测试方法M2时，同时也对M1测试，那么M2的测试函数test_M2可能是： <br />　　def test_M2(): <br />　　""" <br />　　对M2测试行为的简短描述 <br />　　被测试目标 <br />　　- L{P.C.M1} <br />　　- L{P.C.M2} <br />　　>>> from P import C <br />　　>>> c = C() <br />　　>>> rc = c.M1() <br />　　>>> print rc <br />　　True <br />　　>>> rc = c.M2() <br />　　>>> print rc <br />　　True <br />　　""" <br />　　在“被测试目标”中，我们把两个函数都列出来了 <br />　　(7)在方法M2的docstring中添加testmap链接： <br />　　def M2(self): <br />　　""" <br />　　M2的描述 <br />　　Test map: <br />　　- L{testmap_P.testmap_C_M2} <br />　　""" <br />　　(8)利用程序重新生成模块的testmap，结果保存在testmap_P中，现在，C.M1的testmap将包含两个函数：test_M1，test_M2，而C.M2的testmap则包含test_M2: <br />　　def testmap_C_M1(): <br />　　""" <br />　　Testmap for L{P.C.M1}: <br />　　- L{testlist_P.test_M1} <br />　　- L{testlist_P.test_M2} <br />　　""" <br />　　def testmap_C_M2(): <br />　　""" <br />　　Testmap for L{P.C.M2}: <br />　　- L{testlist_P.test_M2} <br />　　""" <br />　　(9)运行epydoc输出文档： <br />　　epydoc -o P_docs P.py testlist_P.py testmap_P.py <br />　　我们点击testlist_P链接将看到： <br />　　Module P_docs.testlist_P <br />　　点击方法C.M1的docstring中的testmap链接: <br />　　testmap_C_M1() <br />　　Testmap for P.C.M1: <br />　　* testlist_P.test_M1 <br />　　* testlist_P.test_M2 <br />　　(10)重复步骤2-5把每个单元测试添加到testlist_P模块中 <br />　　 <br />　　4 结束语 <br />　　我们可以发现doctest、epydoc的结合使得产生功能说明文档变得非常方便，同时也非常强大。这里敏捷文档或许还被称作"literate testing"被看的见的测试或"executable documentation"可执行的文档，但不管如何称呼，名字看来是不重要的，重要的是我们得到一种方法：我们通过单元测试docstring中的代码的方式，文档化模块的功能，没有比这更敏捷的方法了。 <br />　　参考文献： <br />　　[1]Robert C·Martin. 敏捷软件开发——原则、模式与实践[M]. 清华大学出版社，2006. <br />　　[2]Python Library Reference. http://docs.python.org/lib/module-doctest.html. <br />　　[3]Epydoc Homepage. http://epydoc.sourceforge.net/. <br />　　本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/163278#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/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>Tue, 19 Feb 2008 11:11:16 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/163278</link>
        <guid>http://jinheking.javaeye.com/blog/163278</guid>
      </item>
      <item>
        <title>python读取其它格式文件的模块</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/163270" style="color:red;">http://jinheking.javaeye.com/blog/163270</a>&nbsp;
          发表时间: 2008年02月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          python读取excel文件数据的方法。一种方法是先把xls文件转换为csv格式文件，然后用csv模块（自带）解释，一种是用xlrd模块（需下载安装）来直接读取文件信息。该模块的网址为： <br />http://www.lexicon.net/sjmachin/xlrd.htm <br />例子为： <br /><pre name="code" class="java">
Quick start: 

import xlrd 
book = xlrd.open_workbook("myfile.xls") 
print "The number of worksheets is", book.nsheets 
print "Worksheet name(s):", book.sheet_names() 
sh = book.sheet_by_index(0) 
print sh.name, sh.nrows, sh.ncols 
print "Cell D30 is", sh.cell_value(rowx=29, colx=3) 
for rx in range(sh.nrows): 
print sh.row(rx) 
# Refer to docs for more details. 
# Feedback on API is welcomed. 
</pre><br />压缩包中的DOC目录带有使用文档及例程。 <br /><br /><br />python解释CSV格式的文件，标准python自有csv模块，在Python Library Reference的第9节有介绍，或者从以下网址可得到一些例子： <br />http://www.object-craft.com.au/projects/csv/ <br /><br /><br />python读取PDF文件的模块pyPdf： <br />http://pybrary.net/pyPdf/ <br />带软件包及介绍，例子。
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/163270#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/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, 19 Feb 2008 10:41:34 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/163270</link>
        <guid>http://jinheking.javaeye.com/blog/163270</guid>
      </item>
      <item>
        <title>Python通过HTTP协议定期抓取文件(ZT)</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/163256" style="color:red;">http://jinheking.javaeye.com/blog/163256</a>&nbsp;
          发表时间: 2008年02月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">
#!usr/bin/python

import urllib2,time;
class ErrorHandler(urllib2.HTTPDefaultErrorHandler):
    def http_error_default(self, req, fp, code, msg, headers):
        result = urllib2.HTTPError(req.get_full_url(), code, msg, headers, fp)
        result.status = code
        return result

URL='http://www.ibm.com/developerworks/js/ajax1.js'
req=urllib2.Request(URL)
mgr=urllib2.build_opener(ErrorHandler())

while True:
    ns=mgr.open(req)
    if(ns.headers.has_key('last-modified')):
        modified=ns.headers.get('last-modified')
    if(ns.code==304):
        print '''
          ==============================
              NOT MODIFIED
          ==============================
        '''
    elif(ns.code==200):
        print ns.read()
    else:
        print 'there is an error';
        
    if(not locals().has_key('modified')):
        modified=time.time();
    req.add_header('If-Modified-Since',modified)
    time.sleep(10)
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/163256#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 19 Feb 2008 10:13:37 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/163256</link>
        <guid>http://jinheking.javaeye.com/blog/163256</guid>
      </item>
      <item>
        <title>python 读取excel(ZT)</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/163250" style="color:red;">http://jinheking.javaeye.com/blog/163250</a>&nbsp;
          发表时间: 2008年02月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">

import win32com.client
import os
import time

class Excel:
     def __init__(self, filename=None, configuration = None):
  
         self.xApp = win32com.client.Dispatch(' Excel.Application ')
         self.Config = configuration
        
         #start info.  
         #reading configuation file    
         print "Setting standard font: %s" % self.Config['FONT'] 
         self.xApp.StandardFont = self.Config['FONT']
        
         print "Setting standard size: %s" % str(TextSize)     
         self.xApp.StandardFontSize = TextSize

         #check configuration file        
         if os.path.exists( self.Config['DATAPATH'] ) :
             pass
         else:
             print "Error: The given data path doesn't exist" 
             self.close()
         
         # name of report
         if filename:
             self.Filename = filename
             try:
                 self.xBook = self.xApp.Workbooks.Open(filename)
             except:
                 print "Error: Open file %s failed" % filename 
         else:
                           
             self.xBook = self.xApp.Workbooks.Add()
             reportname = self.Config['PROJECT']+ '_R'+ self.Config['VERSION'] + '_' + time.strftime("%Y%m%d") + '_IssueReport'
             self.Filename = os.path.join( self.Config['PATH'], reportname)
             Name = self.Filename + '.xls'
      
           # if the file exists, rename new file as format oldname(number) 
             try:
                 if os.path.exists ( Name ):
                     number = 2
                    
                     # test new name
                     while 1:                             
                         Name = self.Filename + "(" + str(number) + ").xls"                        
                         if os.path.exists ( Name ):
                             number += 1     
                             continue
                         else :
                             break
                    
                     self.Filename = self.Filename + "(" + str(number) + ").xls"   
                     print "Given name has been used, rename new report to %s" % self.Filename 
                 else:
                     self.Filename += '.xls'
                    
                 print "Report name: %s" % self.Filename   
                 self.xBook.SaveAs( self.Filename )
                 print "Report file was created"
             except:
                 print "Error: creating file failed"

  
     def save(self, newfilename=None):
        
         print "Saving report to %s" % self.Config['PATH']
         if newfilename:
             self.Filename = newfilename
             self.xBook.SaveAs(newfilename)
         else:
             self.xBook.Save()
         print "Report saved"

  
     def close(self):
         self.xBook.Close(SaveChanges=0)
         # close error msg 
         del self.xApp

     def show(self):
         print "Show generated report"
         self.xApp.Visible = 1
    
     def delSheet(self, sheet):
         sht = self.xBook.Worksheets(sheet) 
        
         try:
             sht.Delete()
             print "sheet %s is deleted" % sheet
         except:
             print "Error: Delete sheet %s failed" % sheet

     def hide(self): 
         self.xApp.Visible = 0

     # get value from cell
     def getCell(self,sheet, row, col):
         "Get value of one cell"
         sht = self.xBook.Worksheets(sheet)
         return sht.Cells (row, col).Value


     # set value for cell
     def setCell(self, sheet,   row, col, value=None, formula=None):
        
         sht = self.xBook.Worksheets(sheet)
         if formula :
                 sht.Cells(row, col).Formula = formula
         else:
                 sht.Cells(row, col).Value = value


     # return tuple
     def getRange(self, sheet, row1, col1, row2, col2):
         "return a 2d array ( i.e. tuple of tuples)"
         sht = self.xBook.Worksheets(sheet)
         return sht.Range(sht.Cells(row1, col1), sht.Cells(row2, col2)).Value

  
  
     # set tuple   for range
     def setRange(self, sheet, topRow, leftCol, data): 
         '''
         set range data from a tuple
         '''      
         if type( data ) == types.TupleType:
            
             bottomRow = topRow + len(data) - 1
             rightCol = leftCol + len(data[0]) - 1 
             length = len(data)
         else:
             bottomRow = topRow 
             rightCol = leftCol
             length = 1
         sht = self.xBook.Worksheets(sheet)
        
         if( length > MaxAccept):     
             times = length/MaxAccept;
             i = 0;    
             # Multiple * MaxAccept data
             while( i &lt; times ):
                
                 sht.Range(
                 sht.Cells (topRow + i*MaxAccept, leftCol), 
                 sht.Cells(topRow + (i+1)*MaxAccept - 1, rightCol)
                 ).Value = data[i*MaxAccept: (i+1)*MaxAccept]
                
                 i += 1
                 
             # additional data besides Multiple MaxAccept
             sht.Range(
                 sht.Cells(topRow + times * MaxAccept, leftCol), 
                 sht.Cells(bottomRow, rightCol)
                 ).Value = data[times * MaxAccept:] 
                
            
         else:
             sht.Range(
                 sht.Cells(topRow, leftCol), 
                 sht.Cells(bottomRow, rightCol)
                 ).Value = data
                


     # rename a work sheet
     def setSheetName(self, sheet, name):
         '''
         Rename a sheet
         '''
         sht = self.xBook.Worksheets(sheet)
        
         #logging    
         print "Rename sheet %s to %s" % ( sheet , name )
         sht.Name = name 

</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/163250#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/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>Tue, 19 Feb 2008 10:09:14 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/163250</link>
        <guid>http://jinheking.javaeye.com/blog/163250</guid>
      </item>
      <item>
        <title>GNU/Linux下pgadmin3-1.2.0 安装</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/127583" style="color:red;">http://jinheking.javaeye.com/blog/127583</a>&nbsp;
          发表时间: 2007年09月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          GNU/Linux下pgadmin3-1.2.0 安装<br />『分享·告诉好友』□ 来源：    更新时间：1969-12-31作者 ：Robin_Kin (王亮）<br /><br />现下载了最新的 wxGTK-2.5.4.tar.bz2 （我机器上装的是 GTK )<br /><br />然后按照指导<br /><br />./configure --with-gtk --enable-gtk2 \<br />--enable-unicode --disable-shared --enable-debug --enable-mimetype=no<br />make<br />sudo make install<br /><br /># Install wxWindows STC (Styled Text Control).<br />cd contrib/src/stc<br />make<br />sudo make install<br /><br /><br />装好 wxWidget后，下载了最新的 pgadmin3-1.2.0.tar.gz<br /><br />./configure --enable-static --enable-debug<br />make all<br />sudo make install <br /><br /><br />就装好了，可以看到 GTK 风格的 GUI界面了，真是好东西 ：）<br /><br /><br />（阅读次数：）
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/127583#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/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>Thu, 27 Sep 2007 13:53:40 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/127583</link>
        <guid>http://jinheking.javaeye.com/blog/127583</guid>
      </item>
      <item>
        <title>DLang策略模式</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/125889" style="color:red;">http://jinheking.javaeye.com/blog/125889</a>&nbsp;
          发表时间: 2007年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          class Strategy; <br />本程序是学习《Head First Design Pattern》做得程序，思想属于Head First 网址http://www.headfirstlabs.com/ <br />策略模式Strategy<br />设计原则：<br />1.找出应用中可能需要变化之处，把它们独立出来，不要和那些不需要变化的代码混在一起。<br />    把会变化的部分取出并“封装”起来，让其他部分不会受到影响。<br />2.针对接口编程，而不是针对实现编程。<br />3.多用组合少用继承<br /><br />策略模式Strategy 定义了算法族，分别封装起来，让它们之间可以<br />互相替换，此模式让算法的变化独立于使用算法的客户。 <br /><br />Authors:<br />Caoqi <br /><br />Version:<br />0.001 <br /><br />Date:<br />September 21, 2007 <br /><br />See Also:<br />野鸭子类(Duck) <br /><br />See Also:<br />模型鸭子类(Duck) <br /><br /><br />void main(char[][] args); <br /><br /><br />主程序 <br /><br />Example:<br /><br />  <br /><br /><br /><pre name="code" class="java">import std.stdio;
  import strategy.FlyBehavior;
  import strategy.FlyWithWings;
  import strategy.QuackBehavior;
  import strategy.Quack;
  import strategy.MuteQuack;
  import strategy.Squeak;
  import strategy.Duck;
  import strategy.MallardDuck;

   public void main(char args[][]) {
              Duck mallard = new MallardDuck();
              mallard.performQuack();
              mallard.performFly();
   }</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/125889#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 21 Sep 2007 11:34:38 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/125889</link>
        <guid>http://jinheking.javaeye.com/blog/125889</guid>
      </item>
      <item>
        <title>加强版Hello World</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/76103" style="color:red;">http://jinheking.javaeye.com/blog/76103</a>&nbsp;
          发表时间: 2007年04月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我<span style="color: red">临摹</span>的一个 hello world。 <br />大家看了以后不要说我无聊，临摹的是： <br />http://packages.debian.org/unstable/devel/hello <br /><br />getopt.d<br /><pre name="code" class="java">/**
 * Copyright (c) 2004
 * Juanjo Alvarez Martinez &lt;juanjux@yahoo.es>
 * Copyright (c) 2007 only Version:0.5
 * jinheking &lt;jinheking@gmail.com>
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.  Author makes no representations about
 * the suitability of this software for any purpose. It is provided
 * "as is" without express or implied warranty.
 */

 /* Based (copied of) on the Python language getopt implementation. It implements
  * a POSIX-alike getopt, that is, it stops parsing the options as soon as it
  * find a non-option argument, and removes the options it parses from args[][] so the 
  * application is left with all the nonoption arguments in args. If you don't want to use
  * short options or long options just change the argument for "null".
  *
  * Version: 0.5
  *
  * Changes:
  *
  * 0.1 Initial release
  * 0.2 Lot's of bugfixing, "posixification" and improvements thanks to Jonathan Leffler
  * 0.3 More posix'ation (handling of ':' at start of shortargs meaning "don't handle 
  *     missing argument errors").
  * 0.4 A fix and using writef/writefln instead of printf for the debug and the tests
  * 0.5 A fix and using dmd 1.014.  Fixed by jinheking [jinheking@gmail.com]
  */


/++++++++++++++++++++++++
  + Our function.
  + Example:
 +
 + ------------------------------------------------------
 +  import getopt;
 +  import std.stdio;
 +  void main(char[][] args) {
 +   args = args[1..args.length];
 +   getopt_t[] usedoptions;
 +
 +  char[] shortoptions = "hvtn?";
 +   char[][5] longoptions;
 +   int iLen=0;
 +   int idxop = -1;
 +   longoptions[][++idxop] = "help";
 +   longoptions[][++idxop] = "version";
 +		longoptions[][++idxop] = "traditional";
 +		longoptions[][++idxop] = "next-generation";
 +
 +   try
 +   {
 +       GetOpt getopt  =new  GetOpt();
 +       usedoptions=getopt.getopt(args, shortoptions, longoptions);
 +   } catch(GetOptException e){
 +       writefln("Error in passed options: ", e.msg);
 +       return 1;
 +   }

 +   foreach(getopt_t item; usedoptions){
 +
 +       if (item.option == "-h" || item.option == "--help" || item.option == "-?")
 +       {
 +           writefln("``Hello World!'' is a greeting program which wrote by jinheking.\n",

 +                       "\n",
 +
 +                       "Usage: hello [OPTIONS]\n",

 +                       "       -h, --help             display this message then exit.\n",
                        
 +                       "       -?,                    display this message then exit.\n",

 +                       "       -v, --version          display version information then exit.\n",

 +                       "\n",

 +                      "       -t, --traditional      output a greeting message with traditional format.\n",

 +                       "       -n, --next-generation  output a greeting message with next-generation format.\n",

 +                      "\n",

 +                       "Report bugs to &lt;jinheking@gmail.com>\n");
 +       }
 +       else if (item.option == "-v" || item.option == "--version"){
 +           char[] output = item.value;
 +           writefln("Hello World - jinheking's hello world. 0.01 version\n");
           
 +       }
 +       else if (item.option == "-t" || item.option == "--traditional"){
 +            char[] output = item.value;
 +           writefln("Hello, World\n");
 +       }
 +       else if (item.option == "-n" || item.option == "--next-generation"){
 +           char[] output = item.value;
 +           writefln("+---------------+\n",

 +                       "| Hello, world! |\n",

 +                       "+---------------+\n");
 +       }
 +       iLen++;
 +   }
    
 +   if(iLen==0){ 
 +			writefln("Mr. Watson. Come Here. I need you."); 
 +		} 		
 +}
 +  -------------------------------------------------------------------------
 +/

//TODO: GNU getopt, object oriented interface

module getopt;

private import std.string;
private import std.array;
private import std.stdio;

enum GetOptError
{
    NoOption = 1,
    ArgRequired,
    ArgNotRequired
}

class GetOptException : Exception
{
    public GetOptError errtype;
    char[] option;
    this(char[] msg, GetOptError errtype, char[] option)
    {
        this.errtype = errtype;
        this.option = option;
        super(msg);
    }
}

struct getopt_t
{
    char[] option;
    char[] value;
}
class GetOpt{
	/*this(inout char[][] args, char[] shortopts, char[][] longopts){
		getopt(args,shortopts,longopts);
	}*/
	getopt_t[] getopt(inout char[][] args, char[] shortopts, char[][] longopts)
	{
	    char[] currentarg;
	    getopt_t save;
	    getopt_t[] retlist;
	    int retlistsize = 0;
	    bool handleerrors = 1;
	
	    if (shortopts.length > 0)
	        if (shortopts[0] == ':')
	            // Let the app handle the missing argument errors
	            handleerrors = 0;
	
	    if (longopts.length > 0)
	        if (longopts[0] == "=")
	            handleerrors = 0;
	
	    while (args.length > 0 && args[0][0] == '-' && args[0] != "-")
	    {
	        if (args[0] == null)
	        {
	            args = args[1..args.length];
	            continue;
	        }
	        if (args[0] == "--")
	        {
	            args = args[1..args.length];
	            break;
	        }
	
	        currentarg = args[0];
	        args = args[1..args.length];
	        if (currentarg[0..2] == "--")
	        {
	            currentarg = currentarg[2..currentarg.length];
	            save = do_longs(longopts, currentarg, args, handleerrors);
	            retlist.length = ++retlistsize;
	            retlist[retlistsize - 1].option = save.option;
	            retlist[retlistsize - 1].value  = save.value;
	            debug(getopt)
	            {
	                writefln("LongOpt: ", save.option);
	                writefln("Value: ", save.value == "" ? "No value" : save.value);
	            }
	        }
	        else
	        {
	            currentarg = currentarg[1..currentarg.length];
	            getopt_t[] savelist;
	                
	            savelist = do_shorts(shortopts, currentarg, args, handleerrors);
	            foreach(getopt_t it; savelist) {
	                retlist.length = ++retlistsize;
	                retlist[retlistsize - 1].option = it.option;
	                retlist[retlistsize - 1].value  = it.value;
	                debug(getopt)
	                {
	                    writefln("ShortOpt: ", it.option);
	                    writefln("Value: ", it.value);
	                    writefln();
	                }
	            }
	        }
	    }
	    return retlist;
	}
	
	getopt_t do_longs(char[][] longopts, char[]str, inout char[][]args, bool handleerrors)
	{
	    getopt_t ret;
	    char[] optarg, errormsg;
	
	    int i = find(str, '=');
	    if(i != -1)
	    {
	        // Take the argument and strip the argument part from the option
	        optarg = str[i+1..str.length];
	        str = str[0..i];
	    }
	    if(long_has_args(str, longopts))
	    {   
	        if(optarg.length == 0) //No "=", so it's an option after an space
	        {
	            if(args.length == 0)
	            {
	                if(handleerrors)
	                {
	                    errormsg = std.string.format("option --", str, " requires argument");
	                    throw new GetOptException(errormsg, GetOptError.ArgRequired, str);
	                }
	                else optarg = "";
	            }
	            else
	            {
	                if(find(args[0], '-') == 0)
	                {
	                    if(handleerrors)
	                    {
	                        errormsg = std.string.format("option --",str," requires argument");
	                        throw new GetOptException(errormsg, GetOptError.ArgRequired, str);
	                    }
	                    else
	                        optarg = "";
	                }
	                else
	                {
	                    optarg = args[0];
	                    args = args[1..args.length];
	                }
	            }
	        }
	    }
	    else if(optarg.length > 0 && handleerrors)
	    {
	            errormsg = std.string.format("option --",str," must not have an argument (\"",optarg,"\" supplied)");
	            throw new GetOptException(errormsg, GetOptError.ArgNotRequired, str);
	    }
	    ret.option = "--"~str;
	    ret.value = optarg.length > 0 ? optarg : "";
	    return ret;
	}
	
	bool long_has_args(char[]option, char[][]longoptions)
	{
	    int pos;
	    bool hasopt;
	    char[] origoption;
	
	    foreach(char[] currentarg; longoptions) 
	    {
	        if(currentarg == null)continue;
	
	        hasopt = 0;
	        if( (pos = find(currentarg, '=')) != -1 )
	        {
	            origoption = currentarg[0..currentarg.length-1];
	            hasopt = 1;
	        }
	        else
	        {
	            origoption = currentarg;
	            hasopt = 0;
	        }
	
	        if(option != origoption)
	            continue;
	        else
	            return hasopt;
	    }
	    
	    char[] errormsg = std.string.format("option --",option," not recognized");
	    throw new GetOptException(errormsg, GetOptError.NoOption, option);
	}
	
	getopt_t[] do_shorts(char[] shortopts, char[]str, inout char[][]args, bool handleerrors)
	{
	    getopt_t ret;
	    getopt_t[] retlist;
	    int retlistsize = 0;
	    char[] optarg, errormsg;
	    char opt;
	
	    while(str.length > 0)
	    {
	        opt = str[0];
	        str = str[1..str.length];
	        if(short_has_args(opt,shortopts))
	        {
	            if(str.length == 0)
	            {
	                if(args.length == 0)
	                {
	                    if(handleerrors)
	                    {
	                        errormsg = std.string.format("option -",opt," requires argument");
	                        throw new GetOptException(errormsg, GetOptError.ArgRequired, str);
	                    }
	                    else optarg = "";
	                }
	                else
	                {
	                    if(find(args[0], '-') == 0)
	                    {
	                        if(handleerrors)
	                        {
	                            errormsg = std.string.format("option -",opt," requires argument");
	                            throw new GetOptException(errormsg, GetOptError.ArgRequired, str);
	                        }
	                        else
	                        {
	                            optarg = "";
	                        }
	                    }
	                    else
	                    {
	                        optarg = args[0];
	                        args = args[1..args.length];
	                    }
	                }
	            }
	            else
	            {
	                optarg = str;
	                str = "";
	            }
	        }
	        else
	        {
	            optarg = "";
	        }
	        retlist.length = ++retlistsize;
	        ret.option = std.string.format("-", opt);
	        ret.value = optarg.length > 0 ? optarg : "";
	        retlist[retlistsize - 1] = ret;
	    }
	    return retlist;
	}
	
	bool short_has_args(char option, char[]shortoptions)
	{
	    //for(int i=0;i&lt;shortoptions.length;i++)
	    foreach(int i, char c; shortoptions)
	    {
	        if(option == c)
	        {
	            try 
	            {
	                if(shortoptions[i+1] == ':')
	                    return 1;
	                else
	                    return 0;
	            } catch(ArrayBoundsError) {
	                return 0;
	            }
	        }
	    }
	    char[] stroption = std.string.format(option);
	    char[] errormsg = std.string.format("option -",stroption," not recognized");
	    throw new GetOptException(errormsg, GetOptError.NoOption, stroption);
	}
}
unittest
{
    int idx = -1;
    int idx2 = -1;
    debug(getopt) writefln("getopt.getopt.unittest");
    
    char[][] longoptions;
    longoptions.length = 5;
    longoptions[++idx2] = "test1";
    longoptions[++idx2] = "test2=";
    longoptions[++idx2] = "test10";
    longoptions[++idx2] = "test20=";
    longoptions[++idx2] = "test30";
    
    char[] shortoptions = "ab:c:d";
    char[][] args;
    args.length = 10;
    args[++idx] = "--test1";
    args[++idx] = "-a";
    args[++idx] = "--test2";
    args[++idx] = "param2";
    args[++idx] = "-bparamb";
    args[++idx] = "--test10";
    args[++idx] = "--test20=param20";
    args[++idx] = "-adc";
    args[++idx] = "paramc";
    args[++idx] = "nonoptionargument";
    debug(getopt) 
        writefln("Args: --test1 -a --test2 param2 -bparamb --test10 --test20=param20 -adc paramc nonoptionargument");

    getopt_t[] usedoptions;
    usedoptions = getopt(args, shortoptions, longoptions);
    bool hastest1, hasa, hastest2, hastest2param, hasb, hasbparam, hastest10;
    bool hastest20, hastest20param, hasc, hascparam, hasnooption;
    foreach(getopt_t item; usedoptions)
    {
        if (item.option == "--test1") 
            hastest1 = 1;
        else if (item.option == "-a")
            hasa = 1;
        else if (item.option == "--test2") {
            hastest2 = 1;
            if (item.value == "param2")
                hastest2param = 1;
        }
        else if (item.option == "-b") {
            hasb = 1;
            if (item.value == "paramb") 
                hasbparam = 1;
        } 
        else if (item.option == "--test10")
            hastest10 = 1;
        else if (item.option == "--test20") {
            hastest20 = 1;
            if (item.value == "param20")
                hastest20param = 1;
        }
        else if (item.option == "-c") {
            hasc = 1;
            if (item.value == "paramc")
                hascparam = 1;
        }
    }

    assert(hastest1);
    assert(hasa);
    assert(hastest2);
    assert(hastest2param);
    assert(hasb);
    assert(hasbparam);
    assert(hastest10);
    assert(hastest20);
    assert(hastest20param);
    assert(hasc);
    assert(hascparam);
    assert(args[0] == "nonoptionargument");

    debug(getopt) writefln("getopt.unittest passed ok");
}

</pre><br /><br /><br />hello.d<br /><pre name="code" class="java">
import getopt;
import std.stdio;
void main(char[][] args) {
    args = args[1..args.length];
    getopt_t[] usedoptions;

    /*foreach(char[] argv;args) 
    {
        writefln("File: ", argv);
    }
   */
    char[] shortoptions = "hvtn?";
    char[][5] longoptions;
    int iLen=0;
    int idxop = -1;
    longoptions[][++idxop] = "help";
    longoptions[][++idxop] = "version";
		longoptions[][++idxop] = "traditional";
		longoptions[][++idxop] = "next-generation";

    try
    {
        GetOpt getopt  =new  GetOpt();
        usedoptions=getopt.getopt(args, shortoptions, longoptions);
    } catch(GetOptException e)
    {
        writefln("Error in passed options: ", e.msg);
        return 1;
    }

    foreach(getopt_t item; usedoptions){

        if (item.option == "-h" || item.option == "--help" || item.option == "-?")
        {
            writefln("``Hello World!'' is a greeting program which wrote by jinheking.\n",

                        "\n",

                        "Usage: hello [OPTIONS]\n",

                        "       -h, --help             display this message then exit.\n",
                        
                        "       -?,                    display this message then exit.\n",

                        "       -v, --version          display version information then exit.\n",

                        "\n",

                        "       -t, --traditional      output a greeting message with traditional format.\n",

                        "       -n, --next-generation  output a greeting message with next-generation format.\n",

                        "\n",

                        "Report bugs to &lt;jinheking@gmail.com>\n");
        }
        else if (item.option == "-v" || item.option == "--version"){
            char[] output = item.value;
            writefln("Hello World - jinheking's hello world. 0.01 version\n");
           
        }
        else if (item.option == "-t" || item.option == "--traditional"){
            char[] output = item.value;
            writefln("Hello, World\n");
        }
        else if (item.option == "-n" || item.option == "--next-generation"){
            char[] output = item.value;
            writefln("+---------------+\n",

                        "| Hello, world! |\n",

                        "+---------------+\n");
        }
        iLen++;
    }
    
    if(iLen==0){ 
			writefln("Mr. Watson. Come Here. I need you.");
			} 		
}</pre><br /><br />dmd hello.d getopt.d -D
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/76103#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 29 Apr 2007 14:33:09 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/76103</link>
        <guid>http://jinheking.javaeye.com/blog/76103</guid>
      </item>
      <item>
        <title>设计模式：模板模式（包含abstract class的使用方法）</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/72191" style="color:red;">http://jinheking.javaeye.com/blog/72191</a>&nbsp;
          发表时间: 2007年04月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          CaffeineBeverage.d<br /><pre name="code" class="java">module CaffeineBeverage;
import  std.stdio;
/**
  *这个程序程序是为了测试templete模式使用
  *
  */
public abstract class CaffineBeverage{
	void prepareRecipe(){
		boilWater();	///烧水
		brew();	///浸制
		pourInCup();	///倒水
		addCondiments();	///加调味品
	}
	void boilWater(){
		writefln("Boiling water.");
	}
	abstract void brew();
	abstract void addCondiments();
	void pourInCup(){
		writefln("Pouring into cup.");
	}	
}

public class Tea : CaffineBeverage{
	void brew(){
		writefln("Steeping the tea.");
	}
	void addCondiments(){
		writefln("Adding Lemon.");
	}
}
public class Coffee : CaffineBeverage{
	void brew(){
		writefln("Dripping Coffee through filter.");
	}
	void addCondiments(){
		writefln("Adding Sugar and Milk.");
	}
}
</pre><br /><br />runCaffeineBeverage.d<br /><pre name="code" class="java">import CaffeineBeverage;
int main(char[][] args){
	Coffee coffee=new Coffee();
	coffee.prepareRecipe();
	Tea tea=new Tea();
	tea.prepareRecipe();
	return 1;
}
</pre><br />dmd runCaffeineBeverage.d CaffineBeverage.D -I
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/72191#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 18 Apr 2007 14:04:41 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/72191</link>
        <guid>http://jinheking.javaeye.com/blog/72191</guid>
      </item>
      <item>
        <title>设计模式：Command</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/70274" style="color:red;">http://jinheking.javaeye.com/blog/70274</a>&nbsp;
          发表时间: 2007年04月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          现在学习《Head First Design Pattern》,现在正看到第六章 the Command Pattern<br />我把书中的简单命令模式用D重写了一下，目的是大家共通学习！<br /><pre name="code" class="java">import std.stdio;

/**
* 本程序是学习《Head First Design Pattern》做得程序，思想属于Head First
* 网址&lt;a href="http://www.headfirstlabs.com/">http://www.headfirstlabs.com/&lt;/a>
* Authors:  Caoqi
* version: 0.001
* Date: April 15, 2007
*/
void SimpleCommand(){}


/**
* 命令的接口
*/
public interface Command {
        void execute();
}
/**
* 不执行命令的实现
*/
class NoCommand:Command{
        void execute() {}
}
/**
*
* 电灯类
*/
class Light {
        //String strMessage="";
        char[] strMessage="";
        /**
        * Params: strMessage = 消息
        *
        */
        this(char[] strMessage){
                this.strMessage=strMessage;
        }
        /**
        *  当电灯打开时进行显示
        */
        void on(){
                char[] str=this.strMessage;
                str~="  on";
                writefln(str);
        }
        /**
        * 当电灯关闭的时候显示
        */
        void off(){
                char[] str=this.strMessage;
                str~="  off";
                writefln(str);

        }
}
/**
* 开灯类
*/
class LightOnCommand:Command{
        Light light;
        this(Light light){
                this.light=light;
        }
        /**
        * 运行
        */
        void execute() {
                light.on();
        }

}

/**
* 开灯类
*/
class LightOffCommand:Command{
        Light light;
        this(Light light){
                this.light=light;
        }
        /**
        * 运行
        */
        void execute() {
                light.off();
        }

}

/**
* 简单远程控制类
*/
class SimpleRemoteControl {
        Command slot;///命令变量
        this() {
                // TODO Auto-generated constructor stub

        }
        /**
        * 设置要职行的命令
        * Params: command = 要执行的命令
        *
        */
        void setCommand(Command command){
                slot=command;
        }
        /**
        * 执行命令
        */
        void buttonWasPressed(){
                slot.execute();
                //return 1;
        }
}


/**
* 主程序
*/
/++++++++++++++++++++++++

  + Our function.

  + Example:

  + --------------------------

  +  import std.stdio;

  +
  +   void main(char[][] args) {
  +              SimpleRemoteControl remote=new SimpleRemoteControl();
  +              Light light=new Light("Light");
  +              LightOnCommand lightOn=new LightOnCommand(light);

  +              remote.setCommand(lightOn);
  +              remote.buttonWasPressed();
  + }

  + --------------------------

  +/
void main(char[][] args) {
        SimpleRemoteControl remote=new SimpleRemoteControl();
        Light light=new Light("Light");
        LightOnCommand lightOn=new LightOnCommand(light);


        remote.setCommand(lightOn);
        remote.buttonWasPressed();

        LightOffCommand lightOff=new LightOffCommand(light);
        remote.setCommand(lightOff);
        doStuff(&remote.buttonWasPressed);///此处练习delegate

}

void doStuff(void delegate() d) {
     d() ;
}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/70274#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 12 Apr 2007 14:38:48 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/70274</link>
        <guid>http://jinheking.javaeye.com/blog/70274</guid>
      </item>
      <item>
        <title>EMC小有难度的笔试，撰写仅有一行的语句的函数（ZT）</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/68282" style="color:red;">http://jinheking.javaeye.com/blog/68282</a>&nbsp;
          发表时间: 2007年04月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          函数原形已经给出：int p(int i, int N);<br />功能：调用该函数，打印如下格式的输出，例p(1, 7);<br />1<br />2<br />3<br />4<br />5<br />6<br />7<br />6<br />5<br />4<br />3<br />2<br />1<br />即每行一个数字。（注意：N只打印一次）<br />要求：<br />函数中唯一能够调用的函数就是printf。<br />只使用一条语句，如果你真的不能用一条语句，每增加一条语句扣1分。<br />不准使用如下的关键字：typedef, enum, do, while, for, switch, case, break, continue, goto, <br />until, if,  ..具体很多我也忘了，反正能用的不多。<br />不能使用逗号表达式和？：表达式。<br />标准：（总分10分）<br />1. 每多一条语句扣1分，即每多一个；就扣1分<br />2. 每使用一次if或？：扣2分 <br />3. 每使用一次for,while, swith各扣4分<br />大体上就是如上的要求了。<br /><br /><br />D语言实现如下：<br /><pre name="code" class="java">import std.stdio;
int p( int i, int N ){
    return ( N && printf( "%d\n", i ) && p( i+1, N-1 ) && ( N != 1 && printf( "%d\n", i ) ) ) + 1;
}
void main(char[][] args){
	p(1,17);
}</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/68282#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Apr 2007 11:27:09 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/68282</link>
        <guid>http://jinheking.javaeye.com/blog/68282</guid>
      </item>
      <item>
        <title>String类0.021版</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/68037" style="color:red;">http://jinheking.javaeye.com/blog/68037</a>&nbsp;
          发表时间: 2007年04月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">//module jdk2d.lang;

import std.stdio;
import std.string;

/**
* The &lt;code>String&lt;/code> class represents character strings. All
* string literals in D programs, such as &lt;code>String str=new String("abc");&lt;/code>,
* &lt;br />&lt;code>str="Hello world";&lt;/code>
* are implemented as instances of this class.&lt;br />
* final wchar[] value; The value is the String's value.&lt;br />
* final int offset;    The offset is the first index of the storage that is used.&lt;br />
* final int count;     The count is the number of characters in the String.	&lt;br />
* Authors:  Caoqi
* version: 0.021
* Date: April 5, 2007
* History: March 30,2007 V0.01
* License: BSD
* See_Also:
       My blog, &lt;a href=" http://jinheking.javaeye.com/"> http://jinheking.javaeye.com/&lt;/a>
      
* &lt;p>
*/




/// Documentation for String
public class  String{
	private:
		final wchar[] value; ///The value is the String's value.
		final int offset;    ///The offset is the first index of the storage that is used.
		final int count;     ///The count is the number of characters in the String.
		
	public:	
		/**
		 * Initializes a newly created {@code String} object so that it represents
		 * an empty character sequence.  Note that use of this constructor is
		 * unnecessary since Strings are immutable.
		 */
		this(){
			this.offset = 0;
			this.count = 0;
			this.value = null;
		}
		/**		
		* Params:wc = The initial value of the string
    * Return:
    *        String
    * &lt;code>String str=new String("abc");&lt;/code>&lt;br />
		* &lt;code>str="abcd";&lt;/code>
		*/
		String opAssign(wchar[] wc) {			
			this.offset = 0;
			this.count = wc.length;
			this.value = wc.dup;
			return this;
    }
		
		/**
		* &lt;code>s1>s2&lt;/code>
		* Params: s = The initial value of the string
    * Return: int
		*/
		int opCmp(String s){
			return std.string.cmp(cast(char[])this.value, cast(char[])s.value);
		}
		/*
     * Allocates a new {@code String} so that it represents the sequence of
     * characters currently contained in the character array argument. The
     * contents of the character array are copied; subsequent modification of
     * the character array does not affect the newly created string.
     *
     * Param:  value =  The initial value of the string
     */
    public this(wchar[] value) {
			int size = value.length;
			this.offset = 0;
			this.count = size;
			this.value = value;
    }
	
		/**
     * Returns the length of this string.
     * The length is equal to the number of &lt;a href="Character.html#unicode">Unicode
     * code units&lt;/a> in the string.
     *
     * Return:  The length of the sequence of characters represented by this
     *          object.
     */
    public int length() {
        return this.value.length;
    }

    /**
     * Returns &lt;tt>true&lt;/tt> if, and only if, {@link #length()} is &lt;tt>0&lt;/tt>.
     *
     * Return &lt;tt>true&lt;/tt> if {@link #length()} is &lt;tt>0&lt;/tt>, otherwise
     * &lt;tt>false&lt;/tt>
     */
    public bool isEmpty() {
				return count == 0;
    }
		/**
     * Returns the index within this string of the first occurrence of the
     * specified substring. The integer returned is the smallest value
     * &lt;i>k&lt;/i> such that:
     * &lt;blockquote>&lt;pre>
     * this.startsWith(str, &lt;i>k&lt;/i>)
     * &lt;/pre>&lt;/blockquote>
     * is &lt;code>true&lt;/code>.
     *
     * Params:   str =  any String.
     * Return:  if the string argument occurs as a substring within this
     *          object, then the index of the first character of the first
     *          such substring is returned; if it does not occur as a
     *          substring, &lt;code>-1&lt;/code> is returned.
     */

    public int indexOf(String str) {
			return indexOf(str, 0);
    }
    /**
     * Returns the index within this string of the first occurrence of the
     * specified substring. The integer returned is the smallest value
     * &lt;i>k&lt;/i> such that:
     * &lt;blockquote>&lt;pre>
     * this.startsWith(str, &lt;i>k&lt;/i>)
     * &lt;/pre>&lt;/blockquote>
     * is &lt;code>true&lt;/code>.
     *
     * Params:   str =  any String.
     * Return:  if the string argument occurs as a substring within this
     *          object, then the index of the first character of the first
     *          such substring is returned; if it does not occur as a
     *          substring, &lt;code>-1&lt;/code> is returned.
     */
    public int indexOf(wchar[] str) {
			return indexOf(str, 0);
    }

    /**
     * Returns the index within this string of the first occurrence of the
     * specified substring, starting at the specified index.  The integer
     * returned is the smallest value &lt;tt>k&lt;/tt> for which:
     * &lt;blockquote>&lt;pre>
     *     k &gt;= Math.min(fromIndex, this.length()) && this.startsWith(str, k)
     * &lt;/pre>&lt;/blockquote>
     * If no such value of &lt;i>k&lt;/i> exists, then -1 is returned.
     *
     * Param:   str    =     the substring for which to search.
     * Param:   fromIndex  = the index from which to start the search.
     * Return:  the index within this string of the first occurrence of the
     *          specified substring, starting at the specified index.
     */
    public int indexOf(String str, int fromIndex) {
        return indexOf(value, offset, count,
                       str.value, str.offset, str.count, fromIndex);
    }
     /**
     * Returns the index within this string of the first occurrence of the
     * specified substring, starting at the specified index.  The integer
     * returned is the smallest value &lt;tt>k&lt;/tt> for which:
     * &lt;blockquote>&lt;pre>
     *     k &gt;= Math.min(fromIndex, this.length()) && this.startsWith(str, k)
     * &lt;/pre>&lt;/blockquote>
     * If no such value of &lt;i>k&lt;/i> exists, then -1 is returned.
     *
     * Param:   str    =     the substring for which to search.
     * Param:   fromIndex  = the index from which to start the search.
     * Return:  the index within this string of the first occurrence of the
     *          specified substring, starting at the specified index.
     */
    public int indexOf(wchar[] wstr, int fromIndex) {
    	  String str=new String(wstr);
        return indexOf(value, offset, count,
                       str.value, str.offset, str.count, fromIndex);
    }

    /**
     * Code shared by String and StringBuffer to do searches. The
     * source is the character array being searched, and the target
     * is the string being searched for.
     *
     * Params:   source =      the characters being searched.
     * Params:   sourceOffset= offset of the source string.
     * Params:   sourceCount=  count of the source string.
     * Params:   target   =    the characters being searched for.
     * Params:   targetOffset =offset of the target string.
     * Params:   targetCount = count of the target string.
     * Params:   fromIndex  =  the index to begin searching from.
     * Return:  the index within this string of the first occurrence of the
     *          specified substring, starting at the specified index.
     */
    static int indexOf(wchar[] source, int sourceOffset, int sourceCount,
                       wchar[] target, int targetOffset, int targetCount,
                       int fromIndex) {
			if (fromIndex >= sourceCount) {
		            return (targetCount == 0 ? sourceCount : -1);
			}
		    	if (fromIndex &lt; 0) {
		    	    fromIndex = 0;
		    	}
			if (targetCount == 0) {
			    return fromIndex;
			}
		
		        wchar first  = target[targetOffset];
		        int max = sourceOffset + (sourceCount - targetCount);
		
		        for (int i = sourceOffset + fromIndex; i &lt;= max; i++) {
		            /* Look for first character. */
		            if (source[i] != first) {
		            		i++;
		                while (i &lt;= max && source[i] != first){
		                	i++;
		                }
		            }
		
		            /* Found first character, now look at the rest of v2 */
		            if (i &lt;= max) {
		                int j = i + 1;
		                int end = j + targetCount - 1;
		                for (int k = targetOffset + 1; j &lt; end && (source[j] == target[k]);j++){
		                	 k++;
		                }

		                if (j == end) {
		                    /* Found whole string. */
		                    return i - sourceOffset;
		                }
		            }
		        }
		        return -1;
		    }
	/**
	* Return:The String's value
	*/
	char[] toString(){
		return cast(char[])std.utf.toUTF8(this.value);
	}
}
/++++++++++++++++++++++++
  + Our function.
  + Example:
  + --------------------------
  +  import std.stdio;
  +
  +  void foo()
  +  {
  +      String str=new String("Hi,jdk2d String,I need you!") ;
  +      writefln(str);  /* print the string */
  +      str="Next,I calculate the str's length"
  +      writefln(str);  /* print the string */
  +      printf("%d\n",str.length());
  +  }
  + --------------------------
  +/
public static void  main() {     
   String str = new String("The quick brown fox jumped over the lazy dog.");
   String s1 = new String("abc");
   s1="abc";
   String s2=new String("ab");
   
   writef("s1=");   
   writefln(s1);
   writef("s2=");   
   writefln(s2);
   
   if(s1>s2)
   	printf("s1>s2=%.*s\n","true");
   else
   	printf("s1>s2=%.*s\n","false");
   String s3=new String("ab");
   String s4=new String("abc");
   
   writef("s3=");   
   writefln(s3);
   writef("s4=");   
   writefln(s4);
   if(s3>s4)
   	printf("s3>s4=%.*s\n","true");
   else
   	printf("s3>s4=%.*s\n","false");
      
   printf("%d\n",str.indexOf("z"));
   printf("%d\n",str.isEmpty());
   
   //String s5="s5";
}</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/68037#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/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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 04 Apr 2007 18:42:35 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/68037</link>
        <guid>http://jinheking.javaeye.com/blog/68037</guid>
      </item>
      <item>
        <title>String类实现s1&gt;s2的比较</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/68019" style="color:red;">http://jinheking.javaeye.com/blog/68019</a>&nbsp;
          发表时间: 2007年04月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">/**
		* &lt;code>s1>s2&lt;/code>
		* @param  String s
    *         The initial value of the string
    * @return bool
		*/
		int opCmp(String s){
			return std.string.cmp(cast(char[])this.value, cast(char[])s.value);
		}</pre><br /><br />下面是测试<br /><pre name="code" class="java">public static void  main() {     
   String str = new String("The quick brown fox jumped over the lazy dog.");
   String s1 = new String("abc");
   s1="abc";
   String s2=new String("ab");
   
   writef("s1=");   
   writefln(s1);
   writef("s2=");   
   writefln(s2);
   
   if(s1>s2)
   	printf("s1>s2=%.*s\n","true");
   else
   	printf("s1>s2=%.*s\n","false");
   String s3=new String("ab");
   String s4=new String("abc");
   
   writef("s3=");   
   writefln(s3);
   writef("s4=");   
   writefln(s4);
   if(s3>s4)
   	printf("s3>s4=%.*s\n","true");
   else
   	printf("s3>s4=%.*s\n","false");
      
   printf("%d\n",str.indexOf("z"));
   printf("%d\n",str.isEmpty());
}</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/68019#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/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>Wed, 04 Apr 2007 17:58:30 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/68019</link>
        <guid>http://jinheking.javaeye.com/blog/68019</guid>
      </item>
      <item>
        <title>Dlang每日学习心得 ,Interface</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/67976" style="color:red;">http://jinheking.javaeye.com/blog/67976</a>&nbsp;
          发表时间: 2007年04月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">import std.stdio;
interface I { abstract void f(); }
class X : I { void f() {writefln("Hello Interfac"c); } }
void main() {
	I i = new X;
	X x = cast(X)(i);
	x.f(); 	
}</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/67976#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/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 04 Apr 2007 16:52:47 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/67976</link>
        <guid>http://jinheking.javaeye.com/blog/67976</guid>
      </item>
      <item>
        <title>Dlang每日学习心得</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/67526" style="color:red;">http://jinheking.javaeye.com/blog/67526</a>&nbsp;
          发表时间: 2007年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          抽象类<br /><pre name="code" class="java">abstract class ab_class { //定义抽象类
	void test1();
	void test2();
}

class imp : ab_class {//实现抽象类，相当于java的implements
	void test1() { printf("test1\n"); }
	void test2() { printf("test2\n"); }
}

int main(){
	ab_class a = new imp;
	a.test1();	//	
}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/67526#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/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>Tue, 03 Apr 2007 09:07:59 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/67526</link>
        <guid>http://jinheking.javaeye.com/blog/67526</guid>
      </item>
      <item>
        <title>String 类String str=</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/67405" style="color:red;">http://jinheking.javaeye.com/blog/67405</a>&nbsp;
          发表时间: 2007年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">String opAssign(wchar[] value) {			
			int size = value.length;
			offset = 0;
			count = size;
			value = value;
			return this;
    }</pre><br /><br />终于找到了正确的写法<br />public static void  main() {     <br />   String s1 = new String("abc");<br />   s1="abc";<br />   writefln(s1);   <br />   }<br /><br /><br />好高兴呀！
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/67405#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/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>Mon, 02 Apr 2007 17:08:56 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/67405</link>
        <guid>http://jinheking.javaeye.com/blog/67405</guid>
      </item>
      <item>
        <title>String类实现toString方法</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/67382" style="color:red;">http://jinheking.javaeye.com/blog/67382</a>&nbsp;
          发表时间: 2007年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">char[] toString(){
		return cast(char[])std.utf.toUTF8(this.value);
	}</pre><br /><br />使用方法<br />String s1 = new String("abc");<br />      <br />   writefln(s1); <br /><br />今天研究了一下dstring，了解到在D语言里面只有struct里面有opCall<br />而Class是没有这个方法的，所以String str="abc";看来没法实现了<br />就算有，实现的方法也是String str=String("abc");所以这个方法实现也就没有什么意义了
          <br/>
          <span style="color:red;">
            <a href="http://jinheking.javaeye.com/blog/67382#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/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, 02 Apr 2007 16:01:15 +0800</pubDate>
        <link>http://jinheking.javaeye.com/blog/67382</link>
        <guid>http://jinheking.javaeye.com/blog/67382</guid>
      </item>
      <item>
        <title>仿照JDK的String类作的D的String 类</title>
        <author>jinheking</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinheking.javaeye.com">jinheking</a>&nbsp;
          链接：<a href="http://jinheking.javaeye.com/blog/66716" style="color:red;">http://jinheking.javaeye.com/blog/66716</a>&nbsp;
          发表时间: 2007年03月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">[code]</font></p>
<p><font face="Arial">//module jdk2d.lang;</font></p>
<p><font face="Arial">import std.stdio;<br />
/*<br />
* The &lt;code&gt;String&lt;/code&gt; class represents character strings. All<br />
* string literals in D programs, such as &lt;code&gt;&quot;abc&quot;&lt;/code&gt;, are<br />
* implemented as instances of this class.<br />
* @author&nbsp; Caoqi<br />
* @version 0.001, 07/03/30<br />
* @since&nbsp;&nbsp; JDK2D 0.01<br />
* &lt;p&gt;<br />
*/</font></p>
<p><font face="Arial">public class&nbsp; String{<br />
&nbsp;&nbsp;private final wchar[] value;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;/** The offset is the first index of the storage that is used. */<br />
&nbsp;&nbsp;private final int offset;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;/** The count is the number of characters in the String. */<br />
&nbsp;&nbsp;private final int count;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;/*<br />
&nbsp;&nbsp; * Initializes a newly created {@code String} object so that it represents<br />
&nbsp;&nbsp; * an empty character sequence.&nbsp; Note that use of this constructor is<br />
&nbsp;&nbsp; * unnecessary since Strings are immutable.<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;this(){<br />
&nbsp;&nbsp;&nbsp;this.offset = 0;<br />
&nbsp;&nbsp;&nbsp;this.count = 0;<br />
&nbsp;&nbsp;&nbsp;this.value = new wchar[0];<br />
&nbsp;&nbsp;}</font></p>
<p><font face="Arial">&nbsp;&nbsp;/*<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Allocates a new {@code String} so that it represents the sequence of<br />
&nbsp;&nbsp;&nbsp;&nbsp; * characters currently contained in the character array argument. The<br />
&nbsp;&nbsp;&nbsp;&nbsp; * contents of the character array are copied; subsequent modification of<br />
&nbsp;&nbsp;&nbsp;&nbsp; * the character array does not affect the newly created string.<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp; value<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The initial value of the string<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public this(wchar[] value) {<br />
&nbsp;&nbsp;&nbsp;int size = value.length;<br />
&nbsp;&nbsp;&nbsp;this.offset = 0;<br />
&nbsp;&nbsp;&nbsp;this.count = size;<br />
&nbsp;&nbsp;&nbsp;this.value = value;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Returns the length of this string.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * The length is equal to the number of &lt;a href=&quot;Character.html#unicode&quot;&gt;Unicode<br />
&nbsp;&nbsp;&nbsp;&nbsp; * code units&lt;/a&gt; in the string.<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return&nbsp; the length of the sequence of characters represented by this<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; object.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public int length() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return count;<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Returns &lt;tt&gt;true&lt;/tt&gt; if, and only if, {@link #length()} is &lt;tt&gt;0&lt;/tt&gt;.<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return &lt;tt&gt;true&lt;/tt&gt; if {@link #length()} is &lt;tt&gt;0&lt;/tt&gt;, otherwise<br />
&nbsp;&nbsp;&nbsp;&nbsp; * &lt;tt&gt;false&lt;/tt&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @since JDK2D 0.01<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public bool isEmpty() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return count == 0;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Returns the index within this string of the first occurrence of the<br />
&nbsp;&nbsp;&nbsp;&nbsp; * specified substring. The integer returned is the smallest value<br />
&nbsp;&nbsp;&nbsp;&nbsp; * &lt;i&gt;k&lt;/i&gt; such that:<br />
&nbsp;&nbsp;&nbsp;&nbsp; * &lt;blockquote&gt;&lt;pre&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; * this.startsWith(str, &lt;i&gt;k&lt;/i&gt;)<br />
&nbsp;&nbsp;&nbsp;&nbsp; * &lt;/pre&gt;&lt;/blockquote&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; * is &lt;code&gt;true&lt;/code&gt;.<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp; str&nbsp;&nbsp; any string.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return&nbsp; if the string argument occurs as a substring within this<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; object, then the index of the first character of the first<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; such substring is returned; if it does not occur as a<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; substring, &lt;code&gt;-1&lt;/code&gt; is returned.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; public int indexOf(String str) {<br />
&nbsp;&nbsp;&nbsp;return indexOf(str, 0);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public int indexOf(wchar[] str) {<br />
&nbsp;&nbsp;&nbsp;return indexOf(str, 0);<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Returns the index within this string of the first occurrence of the<br />
&nbsp;&nbsp;&nbsp;&nbsp; * specified substring, starting at the specified index.&nbsp; The integer<br />
&nbsp;&nbsp;&nbsp;&nbsp; * returned is the smallest value &lt;tt&gt;k&lt;/tt&gt; for which:<br />
&nbsp;&nbsp;&nbsp;&nbsp; * &lt;blockquote&gt;&lt;pre&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp; k &amp;gt;= Math.min(fromIndex, this.length()) &amp;&amp; this.startsWith(str, k)<br />
&nbsp;&nbsp;&nbsp;&nbsp; * &lt;/pre&gt;&lt;/blockquote&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; * If no such value of &lt;i&gt;k&lt;/i&gt; exists, then -1 is returned.<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp; str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the substring for which to search.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp; fromIndex&nbsp;&nbsp; the index from which to start the search.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return&nbsp; the index within this string of the first occurrence of the<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; specified substring, starting at the specified index.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public int indexOf(String str, int fromIndex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return indexOf(value, offset, count,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str.value, str.offset, str.count, fromIndex);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public int indexOf(wchar[] wstr, int fromIndex) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; String str=new String(wstr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return indexOf(value, offset, count,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str.value, str.offset, str.count, fromIndex);<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Code shared by String and StringBuffer to do searches. The<br />
&nbsp;&nbsp;&nbsp;&nbsp; * source is the character array being searched, and the target<br />
&nbsp;&nbsp;&nbsp;&nbsp; * is the string being searched for.<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp; source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the characters being searched.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp; sourceOffset offset of the source string.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp; sourceCount&nbsp; count of the source string.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp; target&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the characters being searched for.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp; targetOffset offset of the target string.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp; targetCount&nbsp; count of the target string.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param&nbsp;&nbsp; fromIndex&nbsp;&nbsp;&nbsp; the index to begin searching from.<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; static int indexOf(wchar[] source, int sourceOffset, int sourceCount,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wchar[] target, int targetOffset, int targetCount,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int fromIndex) {<br />
&nbsp;&nbsp;&nbsp;if (fromIndex &gt;= sourceCount) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (targetCount == 0 ? sourceCount : -1);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if (fromIndex &lt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; fromIndex = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<br />
&nbsp;&nbsp;&nbsp;if (targetCount == 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return fromIndex;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wchar first&nbsp; = target[targetOffset];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int max = sourceOffset + (sourceCount - targetCount);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = sourceOffset + fromIndex; i &lt;= max; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Look for first character. */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (source[i] != first) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;i++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (i &lt;= max &amp;&amp; source[i] != first){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;i++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Found first character, now look at the rest of v2 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i &lt;= max) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j = i + 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int end = j + targetCount - 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int k = targetOffset + 1; j &lt; end &amp;&amp; (source[j] == target[k]);j++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; k++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (j == end) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Found whole string. */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return i - sourceOffset;<br />