<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>wdx04的博客</title>
<link>http://blogger.org.cn/blog/blog.asp?name=wdx04</link>
<description>wdx04的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[PowerBuilder库文件(PBL)源代码提取工具]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=wdx04&amp;id=47563</link>
<author>wdx04</author>
<pubDate>2009/11/23 10:40:54</pubDate>
<description><![CDATA[<p>本工具用于从PowerBuilder的库文件中批量提取Window/UserObject/DataWindow或其它对象的源代码，以纯文本文件的方式输出。目前支持PowerBuilder版本4.0-11.5、以ANSI或Unicode编码的PBL文件，文件格式信息来源于以下网站：</p>
<p><a class="reference external" href="http://www.dwox.com/PBL_File_Format.txt">http://www.dwox.com/PBL_File_Format.txt</a></p>
<p>使用方法：将extract.exe置于含有PBL文件的目录或上级目录，用Windows命令行界面(cmd.exe)进入该目录，并运行以下命令之一：</p>
<blockquote>
extract -d  提取DataWindow源代码<br/>
extract -w  提取Window和UserObject源代码<br/>
extract -a  提取所有源代码(含Function, Menu, Structure, Application等)</blockquote>
<p>本工具将为在当前目录及其各级子目录中发现的每个PBL文件分别建立子目录以放置提取的文件，例如，PBL文件名为test.pbl时，本工具将在该PBL所在目录下建立子目录test。</p>
<p>本工具包含源代码和Visual C++ 2008 Express工程，要求较新版本的Boost Libraries方能通过编译。</p>
<p>下载地址：<a href="http://pickup.mofile.com/0820916406323835">http://pickup.mofile.com/0820916406323835</a></p>
<p>注意：文件名为extract.rar，用某些浏览器(如Opera)下载后扩展名可能不对，需要自行修改为rar。</p>]]></description>
</item><item>
<title><![CDATA[用Python自动化操作Visual SourceSafe版本数据库]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=wdx04&amp;id=41245</link>
<author>wdx04</author>
<pubDate>2008/11/18 20:11:36</pubDate>
<description><![CDATA[
<P>最近需要编写一个向VSS服务器自动查找本地Checkout的文件、并且自动Checkin的工具。研究了一下它的API，写下来供参考。</P>
<P>预备工具<BR>&nbsp; Python 版本2.3以上(<A href="http://www.python.org/">www.python.org</A>)<BR>&nbsp; ctypes 版本1.0以上(Python 2.5以上自带)<BR>&nbsp; comtypes最新版(comtypes.sf.net)</P>
<P>第一步，创建VSS Database对象<BR>&nbsp;from comtypes.client import CreateObject<BR>&nbsp;vssDb = CreateObject(u"SourceSafe.0")<BR>所有字符串必须使用Unicode字符集，否则可能出现Win32内存访问异常(下同)。</P>
<P>第二步，打开VSS连接<BR>&nbsp;vssDb.Open(ur'C:\Program Files\Microsoft Visual Studio\VSS\srcsafe.ini', u'username', u'password')<BR>第1个参数是srcsafe.ini的完整路径，后两个是用户名和密码。</P>
<P>第三步，定位VSS数据库中的项<BR>&nbsp;item = vssDb.VSSItem(u'$/', False)<BR>第1个参数是该项的完整路径(以$/开头)，可以指向项目(目录)或文件。第2个参数是指明该项是否已被删除，默认值为False可以省略。</P>
<P>第四步，操作目录项(SubProjects)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加文件：item.Add(ur'C:\Local_File.txt', u'comments')<BR>&nbsp;创建子目录：item.NewSubproject(u"project_name", u'comments')<BR>&nbsp;取子项: item.Items()[u'child_name'] child_name为子项名称<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 删除目录: item.Deleted = True<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 恢复删除: item.Deleted = False<BR>&nbsp;永久删除: item.Destroy()<BR>&nbsp;获取所有文件版本(非递归)：item.Get(u'local_directory')&nbsp; 参数local_directory指定把文件存放在哪个本地目录</P>
<P>第五步，操作文件项<BR>&nbsp;签出(Check out): item.Checkout()<BR>&nbsp;签入(Check in): item.Checkin(u'comments')<BR>&nbsp;撤销签出(Undo Check out): item.UndoCheckout()<BR>&nbsp;判断是否已被签出: item.IsCheckedOut (返回值 0:无人Checkout, 1:其他人Checkout, 2:自己Checkout了这个文件)<BR>&nbsp;判断是否被更改: item.IsDifferent()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 删除: item.Deleted = True<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 恢复删除: item.Deleted = False<BR>&nbsp;永久删除: item.Destroy()<BR>&nbsp;判断是否已被删除：item.Deleted<BR>&nbsp;获取版本：item.Get() (仅当该文件在本地不存在或只读时有效)</P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[C++字符串处理: 使用Boost Libraries（一）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=wdx04&amp;id=25885</link>
<author>wdx04</author>
<pubDate>2007/7/1 13:18:43</pubDate>
<description><![CDATA[
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; mso-bidi-font-size: 10.0pt"><FONT face="Times New Roman">C++</FONT></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字符串处理</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; mso-bidi-font-size: 10.0pt"><FONT face="Times New Roman">: </FONT></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; mso-bidi-font-size: 10.0pt"><FONT face="Times New Roman">Boost Libraries</FONT></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（一）</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="FONT-SIZE: 16pt; mso-bidi-font-size: 10.0pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=2></FONT></o:p></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=2>大多数C++应用程序都在一定程度上需要处理字符串。C++标准库通过basic_string、<BR>basic_stringstream类模版及在algorithm头文件中定义的一系列算法提供了对基本字符串操作的支<BR>持。但是，还有一些常用的字符串算法例如大小写转换、子串替换、分割、除去首尾空格、与数值<BR>类型转换和格式化，C++标准库并没有提供直接的实现。因此，作为C++标准库后备的Boost <BR>Libraries提供了很多字符串和文本处理库，不仅实现了前面提到的字符串算法，而且含有高级的正<BR>则表达式和语法分析库。</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=2>Boost Libraries包括以下几个通用字符串库：<BR>lexical_cast 最简单的一个库，用于处理字符串与其它数据类型的转换<BR>regex 最早的C++正则表达式库，经过多年发展已经很成熟<BR>tokenizer(1.25.0加入) 把字符串分割为一组记号(token)<BR>format(1.29.0加入) 提供类似C标准库函数printf的数据格式化操作<BR>spirit(1.30.0加入) 强大的语法分析器产生器，用C++语言直接表达EBNF语法<BR>string_algo(1.32.0加入) 包含大量的常用字符串算法<BR>xpressive(1.34.0加入) 和regex一样是正则表达式库，速度更快，挤进Boost全靠实力</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=2>Boost Libraries的用法很简单：从Boost官方网站（<A href="http://www.boost.org/">http://www.boost.org</A>）把整个发行版本下载到本<BR>地并解压缩到任意本地目录（建议解压缩到硬盘某个分区的根目录下），并且将该目录加入到C++<BR>编译器的Include目录列表中即可。Boost中大多数库完全由头文件组成(扩展名为hpp)，不需要编<BR>译就可以使用。少数库如regex需要用Boost的项目管理工具bjam预先编译才能使用。</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=2><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blogger.org.cn/blog/uploadfile/200771132127992.JPG" border=0></FONT></o:p></SPAN></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><SPAN lang=EN-US><o:p><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=2>(图：在VC6中设置Boost包含目录)</FONT></o:p></SPAN></o:p></SPAN></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><SPAN lang=EN-US><o:p><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=2></FONT></o:p></SPAN></o:p></SPAN></o:p></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><SPAN lang=EN-US><o:p><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=2>下面逐一解释这些库的用法。</FONT></o:p></SPAN></o:p></SPAN></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><SPAN lang=EN-US><o:p><SPAN lang=EN-US><o:p></o:p></SPAN></o:p></SPAN></o:p></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=4><STRONG>Boost. Conversion/lexical_cast</STRONG></FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=2>很多时候我们需要把数值表示为字符串的形式，或者反过来，把以字符串表示的数字转换为通常的<BR>数值类型。标准C库和标准C++库提供了一些方法来做这个操作，但是要么就不够灵活和安全<BR>(itoa/atoi函数族)，要么就显得比较繁琐(stringstream)。<BR>Boost. Conversion/lexical_cast就是为简化这个操作而设计的，它的公共接口声明为:<BR>namespace boost<BR>{<BR>&nbsp;&nbsp;&nbsp; class bad_lexical_cast;<BR>&nbsp;&nbsp;&nbsp; template&lt;typename Target, typename Source&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Target lexical_cast(Source arg);<BR>}<BR>这里包含1个异常类bad_lexical_cast和1个模版函数lexical_cast。<BR>lexical_cast函数借助C++的stringstream，把类型为Source的字符串或数值转换为Target类型的数<BR>值或字符串。其中模版参数Source可以省略(因为编译器会根据arg的类型自动推知Source类型)。<BR>当arg不能正确转换为Target类型时，lexical_cast会抛出bad_lexical_cast异常。<BR>例子：<BR>&nbsp;string valid_int = "1234";<BR>&nbsp;string valid_float = "23.786";<BR>&nbsp;string invalid_float = "7c.82w";<BR>&nbsp;int rint = 1234;<BR>&nbsp;double rdouble = 86253.45;<BR>&nbsp;// string to int<BR>&nbsp;int i = boost::lexical_cast&lt;int, string&gt;(valid_int);<BR>&nbsp;cout &lt;&lt; "valid_int = " &lt;&lt; i &lt;&lt; endl;<BR>&nbsp;// string to float<BR>&nbsp;float f = boost::lexical_cast&lt;float&gt;(valid_float);<BR>&nbsp;cout &lt;&lt; "valid_float = " &lt;&lt; f &lt;&lt;endl;<BR>&nbsp;// invalid string to float<BR>&nbsp;try<BR>&nbsp;{<BR>&nbsp;&nbsp;f = boost::lexical_cast&lt;float&gt;(invalid_float);<BR>&nbsp;}<BR>&nbsp;catch(boost::bad_lexical_cast&amp; ex)<BR>&nbsp;{<BR>&nbsp;&nbsp;cout &lt;&lt; ex.what() &lt;&lt; endl;<BR>&nbsp;}<BR>&nbsp;// int to string<BR>&nbsp;string s = boost::lexical_cast&lt;string&gt;(rint);<BR>&nbsp;cout &lt;&lt; "rint = " &lt;&lt; s &lt;&lt; endl;<BR>&nbsp;// double to stirng<BR>&nbsp;s = boost::lexical_cast&lt;string&gt;(rdouble);<BR>&nbsp;cout &lt;&lt;"rdouble = " &lt;&lt; s &lt;&lt; endl;<BR>运行结果：<BR>valid_int = 1234<BR>valid_float = 23.786<BR>bad lexical cast: source type value could not be interpreted as target<BR>rint = 1234<BR>rdouble = 86253.4<BR>完整例子参见示例工程的lexical_cast项目。<BR>值得一提的是，由于Visual C++ 6.0编译器的bug，不能通过using &lt;命名空间&gt;::&lt;符号名&gt;的方式引<BR>用命名空间中的单个符号。所以只能通过<BR>&nbsp;&nbsp;&nbsp; using namespace boost;<BR>声明使用boost命名空间中所有的符号，或者像上例那样直接用带命名空间的完整名称。</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=4><STRONG>Boost.Tokenizer</STRONG></FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=2>Boost.Tokenizer库提供了一种灵活易用的方式把字符序列分解为一系列记号。例如，下面的程序可<BR>以把一个英语句子分解为一系列单词：<BR>// simple_example_1.cpp<BR>#include&lt;iostream&gt;<BR>#include&lt;boost/tokenizer.hpp&gt;<BR>#include&lt;string&gt;</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=2>int main(){<BR>&nbsp;&nbsp; using namespace std;<BR>&nbsp;&nbsp; using namespace boost;<BR>&nbsp;&nbsp; string s = "This is,&nbsp; a test";<BR>&nbsp;&nbsp; tokenizer&lt;&gt; tok(s);<BR>&nbsp;&nbsp; for(tokenizer&lt;&gt;::iterator beg=tok.begin(); beg!=tok.end();++beg){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; *beg &lt;&lt; "\n";<BR>&nbsp;&nbsp; }<BR>}<BR>可以看出，这个库的核心就是tokenizer模版类，在构造tokenizer时传递一个源字符串作为<BR>参数，然后就可以通过迭代器取得分解出来的每一个记号，这个过程和遍历任何一个STL容器<BR>一样简单。<BR>通过设置tokenizer的模版参数可以指定分解字符串的规则：<BR>&nbsp; template &lt;<BR>&nbsp;class TokenizerFunc = char_delimiters_separator&lt;char&gt;, <BR>&nbsp;class Iterator = std::string::const_iterator,<BR>&nbsp;class Type = std::string<BR>&nbsp; &gt;<BR>&nbsp; class tokenizer;<BR>第一个参数TokenizerFunc是一个观念(concept)类型，指定如何区分记号的边界。<BR>第二个参数Iterator是字符串迭代器的类型，与被分隔的字符串类型有关。<BR>第三个参数Type是结果类型，也就是产生的每一个记号的类型，一般用std::string就可以了。<BR>Boost.Tokenizer库包含3种TokenizerFunc模型，分别适用于不同的情况。<BR><STRONG>char_separator</STRONG>是默认的分隔器，以一组特定的字符来分隔记号，它的构造函数为：<BR>explicit char_separator(const Char* dropped_delims,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const Char* kept_delims = "",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; empty_token_policy empty_tokens = drop_empty_tokens)<BR>dropped_delims和kept_delims是两个以0结尾的字符数组，这两个数组中的每个字符都是一个<BR>记号的终结符。不同的是，dropped_delims中的终结符本身被丢弃，而kept_delims中的字符本<BR>身作为一个单独的记号被保留下来。<BR>empty_tokens指示是否保留长度为0的记号。它有两个可选值boost::keep_empty_tokens表示要<BR>保留空记号，而默认的boost::drop_empty_tokens表示丢弃空记号。<BR>例子：<BR>&nbsp;&nbsp;&nbsp; std::string str = ";;Hello|world||-foo--bar;yow;baz|";<BR>&nbsp;&nbsp;&nbsp; typedef boost::tokenizer&lt;boost::char_separator&lt;char&gt; &gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tokenizer;<BR>&nbsp;&nbsp;&nbsp; boost::char_separator&lt;char&gt; sep("-;", "|", boost::keep_empty_tokens);<BR>&nbsp;&nbsp;&nbsp; tokenizer tokens(str, sep);<BR>&nbsp;&nbsp;&nbsp; for (tokenizer::iterator tok_iter = tokens.begin();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tok_iter != tokens.end(); ++tok_iter)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; "&lt;" &lt;&lt; *tok_iter &lt;&lt; "&gt; ";<BR>结果为<BR>&nbsp;&nbsp; &lt;&gt; &lt;&gt; &lt;Hello&gt; &lt;|&gt; &lt;world&gt; &lt;|&gt; &lt;&gt; &lt;|&gt; &lt;&gt; &lt;foo&gt; &lt;&gt; &lt;bar&gt; &lt;yow&gt; &lt;baz&gt; &lt;|&gt; &lt;&gt;<BR><STRONG>offset_separator</STRONG>主要用于解析长度和格式都固定的字符串，像电话号码或时间日期等。<BR>它的构造函数为：<BR>template&lt;typename Iter&gt;<BR>offset_separator(Iter begin,Iter end,bool bwrapoffsets = true, bool breturnpartiallast <BR>= true)<BR>参数意义：<BR>begin, end: 指向一个整数容器offsets开始和末尾的迭代器。其中每个元素表示一个字段的字符<BR>数。<BR>bwrapoffsets: 如果字符串长度大于offsets容器中所有字段长度的和，是重复否用offsets继续<BR>解析字符串。<BR>breturnpartiallast: 当字符串解析到末尾时剩余的部分长度小于字段长度，是保留还是丢弃这个<BR>部分。<BR>例子：<BR>&nbsp;&nbsp; typedef offset_separator separator_type;<BR>&nbsp;&nbsp; typedef tokenizer&lt;separator_type&gt; tokenizer_type;<BR>&nbsp;&nbsp; int offsets[] = { 3, 3, 4 };<BR>&nbsp;&nbsp; separator_type sep(offsets, offsets + 3);<BR>&nbsp;&nbsp; string s = "1234443627";<BR>&nbsp;&nbsp; tokenizer_type tok(s, sep);<BR>遍历iterator将得到”123”(长度3),”444”(长度3)和”3627”(长度4)三个字符串<BR><STRONG>escaped_list_separator</STRONG>解析包含转义符、分隔符和引号的字符串，可以看作CSV的强化版本。<BR>explicit escaped_list_separator(Char e = '\\', Char c = ',',Char q = '\"')<BR>explicit escaped_list_separator(string_type e, string_type c, string_type q)<BR>e为单个转义字符或包含多个转已字符的串。转义符后跟引号表示银号，转义符后跟n表示换行，<BR>连续两个转义符表示作为普通字符的转义符本身。<BR>c为记号分隔符。<BR>q为引号，两个引号中间出现的分隔符作为普通字符处理。<BR>例子：<BR>&nbsp;&nbsp; typedef escaped_list_separator&lt;char&gt; separator_type;<BR>&nbsp;&nbsp; typedef tokenizer&lt;separator_type&gt; tokenizer_type;<BR>&nbsp;&nbsp; string s = "field 1,\"field 2\",\"field,\\\"3\"";<BR>&nbsp;&nbsp; separator_type sep('\\', ',', '"');<BR>&nbsp;&nbsp; tokenizer_type tok(s, sep);<BR>遍历iterator将得到&lt;field 1&gt; &lt;field 2&gt; &lt;field,”3&gt;三个字符串(不包括&lt;&gt;)<BR>完整例子参见示例工程的tokenizer项目，在该项目中 #include &lt;boost/tokenizer.hpp&gt; 包含指<BR>令没有写在stdafx.h中被预编译，而是直接写在.cpp源代码中，因为Visual C++ 6.0编译器对<BR>预编译头的处理有严重bug，很容易就出现致命的1001内部编译器错误。所以，如果要在实际项<BR>目中应用Boost Libraries，一定不要用Visual C++ 6.0自带的编译器，要么挂Intel C++ <BR>Compiler 6.0以上版本，要么就用Visual C++ 7.1(2003)以上版本。</FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=2>&nbsp;</FONT></o:p></SPAN></P><PRE><SPAN style="FONT-SIZE: 10pt; mso-bidi-font-size: 12.0pt"><FONT face=宋体><SPAN lang=EN-US>例子工程文件：</SPAN></FONT></SPAN></PRE>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=2>&nbsp;<IMG src="http://blogger.org.cn/blog/images/file/zip.gif" border=0><A href="http://blogger.org.cn/blog/uploadfile/200771132042236.RAR" target=_blank>boost_test.rar</A></FONT></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=2></FONT></o:p></SPAN>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[KeyFC汉化组内部文件泄密事件：窃密者的强盗逻辑]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=wdx04&amp;id=17243</link>
<author>wdx04</author>
<pubDate>2006/8/6 10:25:26</pubDate>
<description><![CDATA[<P>2006年8月4日下午，Key Fans Club(简称KeyFC)汉化组刚刚制作完成的一份CLANNAD简体中文第三版内部文件，被一注册ID为“匿名”的会员以不明手段获取并将其内容公布于KeyFC论坛。这一突发事件引起KeyFC汉化组极大的震惊，汉化组负责人梦想残光霞当即决定推迟原定于2006年8月6日发布的CLANNAD简体中文第三版，并开始追查该“匿名”会员上述行为的手段和目的。8月4日当天，“匿名”会员供认，他是通过KeyFC论坛系统的file.asp取得内部文件的，但同时辨称他得知该文件的ID纯属巧合。此后“匿名”及其众多马甲帮闲与KeyFC汉化组就“匿名”有无过错、该不该对KeyFC汉化组作出道歉等问题展开激烈争论。本人(论坛注册ID为wdx04)于2006年8月5日下午参与了这场争论，但很显然，当时一百余字的两个帖子不足以表明我对此次事件前因后果的全部看法，故拟此文，并附上KeyFC论坛上的一些主要的争论原贴，一则用以回击“匿名”等人的种种诡辩(偷窃已是可耻，诡辩尤其可恶)，二则希望大家从这里认清“匿名”及其帮闲的丑恶面目，并给予他们道德上的谴责。<BR>争论的中心问题是：“匿名”的获取并公开汉化组内部文件是不是偷窃行为？对此“匿名”及其帮闲先后提出了两种说法：<BR>1、“匿名”本来是想通过file.asp下载另一个文件，但是不小心打错了文件ID，刚好是这份内部文件的ID，这只是巧合，算不得偷窃。<BR>本人认为：以目前公开的情况，尚不足以判定“匿名”的最初动机，这就给某些人“是错拿，不是偷”的诡辩留下了余地。的确，在一个公共环境中，偶尔错拿别人物件的情况是有的，并不见得是偷窃。但是别忘了，区分错拿和偷窃，有一个重要的条件：如果是错拿，则必然在第一时间告知物件的合法主人，消除误会，并物归原主，如果是这样，相信原主也不会认为这是偷窃；而偷窃者则会将其据为己有，使之成为自己谋取私利的工具。在现实中，原本只是错拿别人物件，却抵挡不住利益的诱惑，走上犯罪道路的，不在少数，我们应当引以为戒。这次“匿名”一系列行为，“错拿”的对象虽不是金银珠玉，但他在已经知道错拿的情况下，不仅不立即通知汉化组，并销毁已下载到本地的文件副本，反而把文件内容公开出来，显示自己“先知”，欺世盗名，其偷窃事实已是具体而微。而某位tczzya，在没有任何证据的情况下，污蔑本人“并不是每个人都像你一样只会偷的”，这便是地地道道的流氓行为！<BR>2、KeyFC论坛的file.asp并没有对文件的存取权限作任何限制，而这份内部文件本身又没有加密或注明保密，因此它就是公开的，文件内容的泄漏，应归咎于上传者的疏忽，“匿名”并没有错。<BR>本人认为：从“非偷论”发展到“可偷论”，“匿名”们的无耻又进了一大步。本人在论坛上的两个帖子，就是针对这一诡辩。再进一步说，如果偷窃者没有错，错在物件的主人保护不当，照此逻辑，杀人者也没有错，错都在被杀的人没保护好自己？如果“匿名”及其帮闲真的认为理应如此，恐怕他们早就被人杀了！这也难怪tczzya要惊惶失措，又拿出前一种说法当救命稻草，丑态毕露。</P>
<P>本人的总结到此为止，下面请大家都来看看“匿名”及其帮闲的“精彩”表演：</P>
<P>KeyFC上的原贴及相关回复<BR>(admin是“匿名”在事发前一天注册的马甲)</P>
<P>[公告]CLANNAD简体中文第三版的发布无限期推迟<BR>梦想残光霞 2006-8-4 17:06:18<BR>首先请大家看这篇帖子。<BR><A href="http://www.keyfc.net/bbs/disp.asp?titleid=18033">http://www.keyfc.net/bbs/disp.asp?titleid=18033</A><BR>这篇帖子的出现令我们很惊讶，也很气愤。<BR>我不知道他是通过什么渠道拿到内部资料的。<BR>但这并不重要。<BR>我们不能原谅的是这种无端泄露内部资料的丑恶行为。<BR>现在CLANNAD第三版本已进入紧张的收尾工作。<BR>这张图片也是今天凌晨一点多hino熬夜赶出来的。<BR>我本人也因为时差原因与hino一起熬到了5点多。<BR>没想到这么快就被外鬼泄漏出去了。<BR>经查核，发帖人“匿名”系论坛会员“rrp”的马甲。</P>
<P>为了彻底整治这种歪风，我在此宣布汉化组暂停一切工作。<BR>原定后天发布的CLANNAD简体中文第三版将无限期推迟。<BR>其他一切汉化项目也将顺次推迟。<BR>至于什么时候恢复工作，等这位发帖的大人给我们个合理的解释，或是我们高兴起来再说吧。</P>
<P>Miliardo 2006-8-4 17:43:01<BR>虽然我个人没什么在意的……但是总觉得让人感觉是迁怒于人。<BR>老残消消气先……<BR>如果是组内成员倒是可以这样处理……<BR>但是是外人的话不是有些把气往别人身上出的感觉么……让大家负担一个人的过错么-v-<BR>他发出来了，也不是所有会员的责任，不是等待汉化的所有人的责任，也没有对所有人进行责问和报复的必要。<BR>再说不是内部的人也不对你们的东西负有保密的义务啊……<BR>PS……以后注意保密吧……<BR>真的是这么要紧的机密应该用处理机密的方法处理。</P>
<P>admin 2006-8-4 17:56:19<BR>说明5点<BR>1.我没有任何黑客行为，是你们自己太不小心没，<BR>今天上午我重新下载以前的某物时本来要输入<BR><A href="http://www.keyfc.net/bbs/file.asp?id=9667">http://www.keyfc.net/bbs/file.asp?id=9667</A><BR>结果不小心输成<BR><A href="http://www.keyfc.net/bbs/file.asp?id=9676">http://www.keyfc.net/bbs/file.asp?id=9676</A> (当时这文件存在）<BR>以至于看到这张图片<BR>2.要杀要剐应只针对我一个，迁怒其他人就不是我的不对了吧<BR>3.rrp并非马甲，是我室友，是它推荐我来逛逛的<BR>4.对不起<BR>5.Partie pour toujours&nbsp; </P>
<P>liknight 2006-8-4 17:58:32<BR>(引用Miliardo前面的发言)<BR>米粒啊，这不叫泄愤，而是用人民战争的海洋淹没肇事者，如若他是不在乎大多数人因此受害的话，那就怎么办了他都行了<BR>从政治基础上讲，论坛不是众议院，该办了哪个人的时候就是要辣手办，而自我总结吸取教训什么的自然不是台面上应该看到的</P>
<P>粘土火星 2006-8-4 18:00:21<BR>(引用Miliardo前面的发言)<BR>我知道阁下的隐私，到处乱说的话，你告不告我侵犯你隐私权？</P>
<P>Miliardo 2006-8-4 18:05:23<BR>这有法律保护么？<BR>此外，汉化组的各位有把这个当作机密，加以足够的保密措施么？<BR>如果说一个人泄漏了你的隐私，你就要把所有可能对你隐私感兴趣的人全部干掉么？</P>
<P>liknight 2006-8-4 18:05:38<BR>我不觉得事情这样就算解决了哦<BR>楼上几位，你家钥匙不小心丢了，然后被贼拣了去偷你家的东西<BR>难得各位只是自责不该这么不小心，而完全不会想到去报案吗？</P>
<P>Miliardo 2006-8-4 18:07:38<BR>(引用liknight 在2006-8-4 18:05:38的发言)<BR>报案当然要……<BR>但是就可以把所有可能是贼的人，仰慕你家某物的人全部做掉么？</P>
<P>liknight 2006-8-4 18:09:01<BR>(引用Miliardo在2006-8-4 18:07:38的发言)<BR>有，宪法在国土内有效，合同法在合同领域内有效，厂规在厂里有效<BR>汉化组有自己的规矩，即使不对你说，犯了我们照样按照自己的规矩办<BR>因为也没有法规规定我们的规矩必须公开<BR>何况是这种基本的道德问题<BR>如果那位仁兄不认为是基本道德的话，那么就我想砍你就砍你也没什么好说 </P>
<P>watashia 2006-8-4 18:09:04<BR>不管这件事的结果怎么样。<BR>KFC必须再次整风了。现在实在是太乱太乱了。根本没个样子了。<BR>上帝也应该赶快下狠心整了 XDDDD<BR>--------------------------------------------------------------------------------<BR>另外，看到了没关系。但是私自公开出来，那就得承担责任。如果你不小心看到了某个人没出版的样书，自己私自公开了。别人一样可以告你侵权。这是基本的为人处世的准则啊</P>
<P>liknight 2006-8-4 18:10:40<BR>(引用Miliardo在2006-8-4 18:07:38的发言)<BR>我有权利宣布，我家的东西所有人都不许看，因为我怀疑被贼盯上了</P>
<P>Miliardo 2006-8-4 18:14:30<BR>也就是说，各位的规矩是一人犯罪，株连全人类这样的么……<BR>以下内容仅允许 liknight 浏览：<BR>----------------------------------------<BR>您被禁止浏览此处内容<BR>----------------------------------------</P>
<P>watashia 2006-8-4 18:15:46<BR>另外，看到了没关系。但是私自公开出来，那就得承担责任。<BR>如果你不小心看到了某个人没出版的样书，自己私自公开了。别人一样可以告你侵权。这是基本的为人处世的准则啊</P>
<P>liknight 2006-8-4 18:16:17<BR>我怎么能知道拿走我钥匙的是不是贼<BR>何况还把我家的地址公布于众<BR>这种情况下，不把锁换了之前，所有东西都进保险柜不拿出来，很正常吧</P>
<P>admin 2006-8-4 18:16:32<BR>(引用liknight在2006-8-4 18:05:38的发言)<BR>你说的太严重了吧，本来我没资格在这说话<BR>但是，你把9800把钥匙放在一个柜子里不加锁的话难免有人拿错<BR>拿错钥匙向公众申明我拿错钥匙了这有错吗？</P>
<P>windwave 2006-8-4 18:17:41<BR>只觉得有点可笑.<BR>当然汉化组自己的东西怎么做决定都不是外人能干涉的.<BR>不过这种做法实在是囧.<BR>又不是查不到人，连肇事人都出来了好好沟通后按规定处置掉不就OK了，何必还发这脾气把其他无辜人的希望抹灭掉.<BR>嘛，不过等了这么久的人也不在乎多等个几月半载的.正好最近耳朵萌的汉化也要出，暑假就玩那也不错.</P>
<P>粘土火星 2006-8-4 18:19:13<BR>(引用admin　在2006-8-4 18:16:32的发言)<BR>阁下的名字真好，下次记得起一个administrator的……可能更有诚意<BR>TO 楼上，如果阁下觉得小日本给我们的道歉够诚意的话，也可以这样理解这个人的道歉帖子</P>
<P>liknight 2006-8-4 18:19:50<BR>(引用admin　在2006-8-4 18:16:32的发言)<BR>难免拿错了人家的钥匙<BR>就能去喊着“我拿到谁谁谁家的钥匙了”吗？<BR>那自然要看好家里的东西防贼了</P>
<P>Miliardo 2006-8-4 18:20:18<BR>(引用liknight在2006-8-4 18:16:17的发言)<BR>那么性质就是两回事了……<BR>个人认为说明方式就不大应该是这样吧……<BR>……反正我也是全通过的了……并不是特别关心汉化组的进度。</P>
<P>watashia 2006-8-4 18:20:42<BR>(引用admin　在2006-8-4 18:16:32的发言)<BR>这个是著作权的问题，用著作权来打比方比较好理解。<BR>你不小心看到了没问题。<BR>但是，不小心发出来了就是侵权行为。<BR>你不小心看到别人准备发表的文章，然后私自提前发表。别人能不告你侵权吗？</P>
<P>粘土火星 2006-8-4 18:24:47<BR>KFC没那么高级内联啊，当然这件事情汉化组本身确实有工作失误。<BR>这段时间大家也会好好整理一下状态的。<BR>TO 米粒<BR>话说拿到秘密也不能这么一个公开法吧。这完全打乱汉化组的正常安排了……事实上泄密之外的东西很多也都在计划和实行，现在这个事件一出来十分打击人的信心的……</P>
<P>另外这位孩子的认错态度是一个什么嘴脸，希望大家看清-v-b…… </P>
<P>liknight 2006-8-4 18:25:49<BR>各位只需明确一件事：<BR>再有这种行为出现，就会出现类似处理，所以“关心汉化工程的人”就请不要效仿。<BR>至于就是来捣乱的，或者通过任何手段透露不改你透露的东西来显派的，杀也是没商量的——不认为那是KFC需要他存在的人</P>
<P>匿名的马甲2 2006-8-4 18:27:39<BR>[以下引用梦想残光霞在2006-8-4 18:15:06的发言：<BR>1 废话。所有的文件编号都是顺次存在的，随便也能挑出来。<BR>&nbsp; 文件上传后刚过半天就被偶然撞出来，鬼才会信。<BR>2 废话。要整治的不是你一个人，是整个论坛的风气。<BR>3 废话。你现在就穿着马甲，说话还有什么说服力。<BR>4 废话。把最该说的话放在最后有什么说服力。<BR>5 废话。鸟语。 ]<BR>1 请不要把现在很多纯真善良的人骂成鬼，例如第XX楼。如果您实在想说说我用黑客手段获得文件的话我也没意见<BR>2 不过您的整治就是让大家多流几个月的口水吗<BR>3 再用马甲的原因是用“匿名”这给帐号时有人对我电脑进行攻击，造成堵塞发不上去，应该是你们可以看到IP的的人干的吧。<BR>4 我是向无辜受牵连者说的，不是向您<BR>5 不懂就算了</P>
<P>liknight 2006-8-4 18:29:36<BR>(引用匿名的马甲2在2006-8-4 18:27:39的发言)<BR>各位只需明确一件事：<BR>再有这种行为出现，就会出现类似处理，所以“关心汉化工程的人”就请不要效仿。<BR>至于就是来捣乱的，或者通过任何手段透露不改你透露的东西来显派的，杀也是没商量的——不认为那是KFC需要他存在的人 </P>
<P>粘土火星 2006-8-4 18:39:47<BR>(引用匿名的马甲2在2006-8-4 18:27:39的发言)<BR>1 你不是鬼便是渣了<BR>2 除了汉化组内部整顿以外，更主要还包括渣<BR>3 没人无聊到这种程度，KFC时常发不出贴，人类都清楚。<BR>4 无私的行为不是什么时候都好，更何况阁下发布的时候没有站在汉化组的角度，你还有什么话可说？</P>
<P>粘土火星 2006-8-4 18:56:39<BR>[引用windwave在2006-8-4 18:49:19的发言<BR>好吧。<BR>我现在想知道的是。<BR>整治的具体对象，具体措施和具体手段。<BR>汉化这么长时间以来，也就这次出现了一例泄露公布案。这需要整的又是什么“风”。<BR>自然汉化组也可以不公布就是。]<BR>不是都有同学不适应这里的空气觉得缺氧发告别贴么……<BR>不光是汉化组的问题，这里现在水得实在不成样子相信大家都能看见。<BR>翻翻贴时常见到就只有一堆~~~~~这样符号的贴，删都删不过来……<BR>谁也不想把KFC变成云中漫步那样的纯小众站吧= =<BR>因为现在时段，论坛和工作联系紧密，所以整顿不得不牵连到论坛了……<BR>希望KFC3.0可以脱胎换骨……好像扯远了………………</P>
<P>watashia 2006-8-4 18:57:33<BR>整风早就想搞了。本部现在水贴横溢，只不过大家都很忙，没有时间来做罢了。<BR>这次事件只不过是一个导火线而已，更进一步加强需要整风的认识而已。<BR>整风不是针对汉化的内容，针对的是整个KFC的风气。<BR>再次重申。<BR>如果你只是不小心看到了，那没有问题，是我们自己的责任而已。<BR>但是你不小心私自公布出来了，那就是你的责任了。汉化组有权要求你公开诚恳地道歉<BR>何况事情的真相是不是确实如你所说，我们还需要再进一步继续调查确定。</P>
<P>tczzya 2006-8-4 19:29:55<BR>我们看到的是：<BR>一个马甲，“无意间”（不能排除是有意）找到了一份并没有标明“x月x日前绝密”的文件，处于和大家分享的目的（不能排除包括炫耀的目的），跟大家分享了，两个半小时后，帖子被锁，被锁前的两个半小时中，一共有7个人回贴，又过了一个小时，本楼楼主（站在本论坛领导金字塔顶端的人）发了本贴，2个小时后，回贴数超过110（目前），看贴人无数。<BR>楼主宣称：“我们不能原谅的是这种无端泄露内部资料的丑恶行为”，并要因此大开杀界。<BR>请问，如果真的是怕泄密的话，删了不就行了？最多在杀id，封ip。<BR>举个不恰当的例子：<BR>某女的裸照不甚被别人拾到，并公开在某女家门口。拾到者被抓，某女站在人群中，拿着自己的裸照喊：“这个人xxxxxx，我们不能容忍这种xxxx的人，看，这个就是证据。对这个人，我要枪毙，而且对所有不合规矩（规矩贴在她家厨房里面）的人，都要枪毙”……<BR>让我想起了明星们的炒做……不炒的话，怎么火呢……</P>
<P>tczzya 2006-8-4 19:32:34<BR>上面的例子有些仓促，如果不是裸照，而是“裸体艺术照”呢……如果拾到者仅仅是用照片来表扬某女的美丽呢……</P>
<P>watashia 2006-8-4 19:36:09<BR>知道不恰当就不要举出来丢人了。 </P>
<P>tczzya 2006-8-4 19:38:17<BR>反正也等了5个月了，不差再等5个月……5个月，lz的气该消了吧……</P>
<P>粘土火星 2006-8-4 19:43:36<BR>这好像只是你看到的哎，别把你的眼睛装到大家身上看裸女<BR>我觉得KFC的竹子们很少有明星架子<BR>这让我想起了一些“批评家”专门写批评别人的文章来炒自己，举个挺恰当的例子，前段时间不是有人写文章骂刘翔没文化来着，语气之狠毒丝毫不亚于不恰当的例子呢</P>
<P>tczzya 2006-8-4 19:49:00<BR>那大家看到的是什么？等待了5个月（过期5个月）之后的本图难道不是给大家的强心剂么？你既然不是大家，你怎么知道大家不是这么想呢？<BR>至少，我很高兴看到这张图片 </P>
<P>tczzya 2006-8-4 19:54:50<BR>17点的时候还在吃饭的人路过……<BR>貌似没见到哪个大游戏因为游戏里的一张图片被泄露而“无限延期”的……<BR>某：那是因为那些公司是靠游戏赚钱，而kfc是无私的，所以可以“无限延期”，至于kfcer们的热情打击也就打击了，反正大家也都习惯了……<BR>偶：话虽然是这样，但，人的心要是总被打击，会冷的。<BR>某：那可能只是你的心冷，不是“大众”的哦~<BR>偶：……</P>
<P>匿名 2006-8-5 12:42:03<BR>对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起<BR>对不起，我不该把9667打成9676<BR>对不起，我不该满足他人的好奇心把那张图放出 </P>
<P>tczzya 2006-8-5 12:43:06<BR>[以下引用匿名在2006-8-5 12:37:56的发言：<BR>我都坦白了N次了，你们到底让我如何？<BR>写一千字的检讨？]<BR>1000字！我帮你数~~~</P>
<P>匿名 2006-8-5 12:43:53<BR>(一整版“对不起”)</P>
<P>tczzya 2006-8-5 12:46:24<BR>(引用匿名在2006-8-5 12:42:03的发言)<BR>才300多字……算了，领会精神吧……<BR>要是他们说你没有诚意怎么办？</P>
<P>tczzya 2006-8-5 12:48:26<BR>[以下引用匿名在2006-8-5 12:43:53的发言]<BR>为了不让服务器挂掉，我就不引用了……<BR>这次字数是够了，诚心呢？拿出来给大家看看，偶吃饭去先~</P>
<P>匿名 2006-8-5 12:48:38<BR>那就封IP吧<BR>动态IP<BR>60*255个IP段全封了</P>
<P>Prz 2006-8-5 12:51:13<BR>小兄弟说得好象全世界的匿名代理服务器都在你的掌握之中....听起来有几分像以前这里的某人...<BR>真是，正常的人各有各的正常法，嚣张的人怎么看都是一样的嚣张啊 -v-</P>
<P>匿名 2006-8-5 12:53:56<BR>(引用Prz在2006-8-5 12:51:13的发言)<BR>不是代理服务器，是电信的动态IP</P>
<P>匿名 2006-8-5 12:56:38<BR>是啊，不吵了，我把自己给踢出KFC吧<BR>用户名：大家知道<BR>密码：tenet<BR>马甲的密码：kid1412</P>
<P>憶星 2006-8-5 13:13:38<BR>2006年8月5日(星期六) 13:07 <BR>Key Fans Club - The 1527th Day <BR>在线人数/注册用户数：198/12685，最新注册用户：匿名の抄蛋</P>
<P>全部匿名出來道歉，恐怕可以開百層大樓<BR>誰稀罕你那SB IP和密碼，拜托你就少申請幾個ID少在這裡展示自己的SB魅力和智商上限了</P>
<P>tczzya 2006-8-5 13:20:52<BR>(引用憶星在2006-8-5 13:13:38的发言)<BR>骂，用力骂，认为能解决问题就骂！</P>
<P>碇 2006-8-5 13:38:14<BR>其实。。别搞错了<BR>有些事不是诚恳的道歉就能解决的，虽说现在连诚恳的道歉也没有。<BR>本来就不是为了报复什么。<BR>而是车库可能被贼盯上，确保完全安全前不敢停车。。<BR>而且整顿本来就该整顿了。<BR>你不如先解释下为什么会记得别人的文件的ID，又正巧打错？<BR>既然用了ID为什么要下载改名重新上传？<BR>那些MJ是怎么回事？（不承认可以理解为帮手）</P>
<P>tczzya 2006-8-5 14:37:50<BR>进度……第三版既然马上将要出，那张图片也就迟早会让人看到的，这件事只不过是提前了2~3天而已，后果并不会像你说的那么严重，要说真正打乱计划的，恐怕是本lz所做的决定吧。<BR>我承认，如果我是当事人，我也会非常的气愤，但至少我能保持理智，没有必要因为这件事而对全局产生不利的影响，这件事可大可小，“上兵伐谋,其次伐交,其次伐兵,其下攻城”，本lz所做的只能算是下策了。<BR>当然，lz还有另一个意思，整风，所以本件事仅仅是个道火锁而已，故意把自己的伤口弄大，以权利剥夺大家的利益，获得大家的支持，再借此攻击对手的方法……不是名君所为啊……</P>
<P>Prz 2006-8-5 14:39:15<BR>楼上的似乎有点倒因为果了....</P>
<P>liknight 2006-8-5 14:40:43<BR>没办法，楼上的楼上清高嘛</P>
<P>tczzya 2006-8-5 14:45:33&nbsp; <BR>说我清高也好，低俗也好，我只是说了某些人不想提起的东西而已。</P>
<P>tczzya 2006-8-5 14:52:56<BR>我会想尽一切办法将事态控制住，而不是扩大 </P>
<P>liknight 2006-8-5 14:58:40<BR>(引用tczzya在2006-8-5 14:45:33的发言)<BR>是吗，那么我就提提好了<BR>第一，此人的行为使得工作组内部资料提前泄密，而且是在工作组只有两人拥有和上传服务器的情况下。在原因不明之前，首先要察明究竟是何种原因引起。说到底汉化组是KFC的汉化组，而不是独立其外的组织。<BR>第二，做此决定，结果上是推迟，而不是终结汉化计划，无限期推迟也是“推迟”。汉化组做汉化本来是为了让公众“玩到”游戏，并没有义务让所有人“在空闲的时候玩到”。汉化计划本来就是个长期工作，我们会“尽量”让大家在适当的时候玩到作品，但即然有了突发事件，发布推迟也是在工程计划可容许范围内。<BR>第三，汉化组的负责人，所需负责和领导的是汉化组成员，而作品一旦发布，在中国的网络社会下就会四处流传，而不是单单成为KFC成员的东西。故此，明“君”只需对臣民负责，而老残的“臣民”只有可怜巴巴的几个汉化组成员罢了。KFC其他组织是合作者，而从其他人那里我们是一点好处也得不到的。对于汉化组内部觉得有必要实行的措施，不必将会造成什么外部影响纳入考虑范围。<BR>第四，就外部来讲，这次的措施就是杀鸡儆猴。汉化组不是政治实体，规矩什么的都没有明确过，既然这次有了突发事件，自然就以此事为标准制定规矩。这个规矩的内部措施不必告知外部，而外部措施就是“再有此行为，将以本次同样措施处理”。<BR>满意否。</P>
<P>=====================<BR>主题分割线<BR>=====================</P>
<P>我的最后一贴</P>
<P>匿名 2006-8-5 13:25:19&nbsp; </P>
<P>很多人要求我写道歉信，也有很多人在QQ上要我顽抗到底<BR>不管怎样，我明白这件事确实是我不对<BR>我曾经也是某GBA汉化组的成员，明白汉化的辛苦,也厌恶某类不断催稿的人<BR>这次事件真的很对不起<BR>但是，我想问的是用<A href="http://www.keyfc.net/bbs/file.asp?id">www.keyfc.net/bbs/file.asp?id</A>=文件ID,得到那份图片<BR>到底是我的过失还是上传者的过失？<BR>我把那张图片贴在网上，无非是让一些FANS高兴高兴<BR>但是，那个压缩文件里并没有类似 "机密" "某日正式公开" 的字眼<BR>上传文件9691<BR>还有放在<A href="http://www.keyfc.net/bbs/file.asp">www.keyfc.net/bbs/file.asp</A>里没加密的文件难道不是KFC的公共文件吗？<BR>不是注册就有资格访问的文件吗？何来机密之说？<BR>但是，我知道梦想残光霞生气也是应该的。<BR>彻夜完成的东西没有亲手发布，直接看到众多FANS的欢呼声<BR>是很对不起汉化组成员的劳动成果的<BR>但是现在我只能说“对不起”了<BR>我求求您继续按计划发布第三版，行吗？<BR>永别了，各位网友。</P>
<P>wdx04 2006-8-5 15:38:13<BR>这位“匿名”先生不明摆着是来闹事的嘛。在学校读书也好，在工作也好，别人的抽屉别人的包裹，没有上锁你就可以乱翻乱动，没有上锁就可以当是你的东西？看来你身边的人，都得好好注意防盗了。</P>
<P>tczzya 2006-8-5 16:00:44<BR>[以下引用wdx04在2006-8-5 15:38:13的发言：<BR>这位“匿名”先生不明摆着是来闹事的嘛。在学校读书也好，在工作也好，别人的抽屉别人的包裹，没有上锁你就可以乱翻乱动，没有上锁就可以当是你的东西？看来你身边的人，都得好好注意防盗了。 ]<BR>翻错包了，错把别人的卫生巾拿出来了，用公告批评么？</P>
<P>wdx04 2006-8-5 16:06:53<BR>[以下引用tczzya在2006-8-5 15:59:22的发言：<BR>翻错包了，错把别人的卫生巾拿出来了，用公告批评么？ ]<BR>今天你偷卫生巾，明天就说不准你要偷什么了。<BR>偷没上锁的东西就不算偷，这是及其严重的道德败坏，必须受到严厉谴责。 </P>
<P>tczzya 2006-8-5 16:13:55<BR>[下引用wdx04在2006-8-5 16:06:53的发言：<BR>今天你偷卫生巾，明天就说不准你要偷什么了。<BR>偷没上锁的东西就不算偷，这是及其严重的道德败坏，必须受到严厉谴责。 ]<BR>是错拿，不是偷，不要老用你的浑浊的眼光来看别人，并不是每个人都像你一样只会偷的……<BR>试问，这个论坛里谁没错拿/错用过别人的东西呢？都是偷么？</P>
<P>liknight 2006-8-5 16:18:17<BR>wdx04等诸位，非常抱歉让你们这里受人言语攻击<BR>不过为了不再无谓地挑起新的是非，看我的面子，恳请诸位现在开始无视ID为tczzya之人的挑衅吧，此人已经自己承认是闹事来的了<BR>谢谢诸位了<BR>如果此人对诸位以其他方式加以骚扰的话，敬请告知，管理层会加以处理。<BR></P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[C++ 正则表达式测速]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=wdx04&amp;id=16663</link>
<author>wdx04</author>
<pubDate>2006/7/15 21:17:55</pubDate>
<description><![CDATA[
<P>正则表达式是十分强大的软件工具，我在日常工作中用得很多，但都是在Python中用，有时觉得Python内置的sre速度不够快，想看知道在C++中使用正则表达式是否效率更高，因此作了这个测试。</P>
<P>测试一：在一个1.15MB的Java源程序文件中统计形如"new MessageBox(...);"的代码片断出现次数(159次)，重复执行100次，计算所用时间。<BR><BR>测试使用的正则表达式： new MessageBox\([^;]*?\);<BR>测试二：文本同上，增加正则表达式的复杂度，重复20次。<br>测试使用的正则表达式： /\\* ?!.*?\\*/|// ?![^\\n]*|new MessageBox\\([^;]*?\\);|[a-z]+! </P>
<P>测试结果如下：</P>
<P>
<TABLE>
<THEAD>
<TR>
<TD width=140>编译器</TD>
<TD width=160>正则表达式库</TD>
<TD width=80>时间一</TD>
<TD width=80>时间二</TD></TR></THEAD>
<TBODY>
<TR>
<TD>Visual C++ 6.0</TD>
<TD>Regex++ v3</TD>
<TD>2.64s</TD>
<TD>3.13s</TD></TR>
<TR>
<TD>Visual C++ 7.1</TD>
<TD>Regex++ v4</TD>
<TD>1.36s</TD>
<TD>2.54s</TD></TR>
<TR>
<TD>Intel C++ 8.1</TD>
<TD>Regex++ v4</TD>
<TD>0.51s</TD>
<TD>1.57s</TD></TR>
<TR>
<TD>Visual C++ 7.1</TD>
<TD>Xpressive Dynamic</TD>
<TD>0.30s</TD>
<TD>4.84s</TD></TR>
<TR>
<TD>Intel C++ 8.1</TD>
<TD>Xpressive Dynamic</TD>
<TD>0.18s</TD>
<TD>3.13s</TD></TR>
<TR>
<TD>Visual C++ 7.1</TD>
<TD>Xpressive Static</TD>
<TD>0.18s</TD>
<TD>1.98s</TD></TR>
<TR>
<TD>Intel C++ 8.1</TD>
<TD>Xpressive Static</TD>
<TD>0.14s</TD>
<TD>0.99s</TD></TR>
<TR>
<TR>
<TD>Visual C++ 7.1</TD>
<TD>Greta 2.64</TD>
<TD>2.15s</TD>
<TD>2.69s</TD></TR>
<TR>
<TD>Intel C++ 8.1</TD>
<TD>Greta 2.64</TD>
<TD>1.85s</TD>
<TD>2.46</TD></TR>
<TR>
<TD>Visual C++ 6.0</TD>
<TD>PCRE 4.4</TD>
<TD>0.63s</TD>
<TD>2.94s</TD></TR>
<TR>
<TR>
<TD>Visual C++ 6.0</TD>
<TD>TRE 0.74</TD>
<TD>6.97s</TD>
<TD>ERROR</TD></TR>
<TR>
<TD>Visual C++ 7.1</TD>
<TD>PCRE 6.4</TD>
<TD>0.66s</TD>
<TD>3.15s</TD></TR>
<TR>
<TD>Intel C++ 8.1</TD>
<TD>PCRE 6.4</TD>
<TD>0.53s</TD>
<TD>2.64s</TD></TR>
<TR>
<TD>Visual C++ 7.1</TD>
<TD>Oniguruma 2.56</TD>
<TD>0.39s</TD>
<TD>3.15s</TD></TR>
<TR>
<TD>Intel C++ 8.1</TD>
<TD>Oniguruma 2.56</TD>
<TD>0.30s</TD>
<TD>3.29s</TD></TR>
<TR>
<TD>Visual C# 7.1</TD>
<TD>.net Framework 1.1</TD>
<TD>0.52s</TD>
<TD>5.80s</TD></TR>
<TR>
<TD>Java 1.4.2</TD>
<TD>Standard Library</TD>
<TD>1.10s</TD>
<TD>8.83s</TD></TR>
<TR>
<TD>Java 1.4.2</TD>
<TD>JRegex 1.2</TD>
<TD>2.87s</TD>
<TD>5.22s</TD></TR>
<TR>
<TD>Python 2.4.2</TD>
<TD>Standard Library</TD>
<TD>0.59s</TD>
<TD>2.57s</TD></TR></TBODY></TABLE></P>
<P>下载源代码：<IMG src="images/file/zip.gif" border=0><A href="uploadfile/2006715221110258.RAR" target=_blank>Regex_Test.rar</A></P>]]></description>
</item><item>
<title><![CDATA[VMJP战斗存档锁定工具]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=wdx04&amp;id=14284</link>
<author>wdx04</author>
<pubDate>2006/5/11 18:06:46</pubDate>
<description><![CDATA[<P>众所周知，VM系列战斗中的存档正常情况下只能读取一次，读取之后会被程序删除（无效化），这样防止了玩家用S/L大法作弊，保证了游戏的挑战性。但另一方面，这项设定使得我们难以对某一特定局面作深入的分析，比较各种变化的优劣。本程序就是为解决这个问题而设计的。使用它，您可以无限次地读取战斗存档。</P>
<P><BR><IMG src="http://blogger.org.cn/blog/images/file/zip.gif" border=0><A href="http://blogger.org.cn/blog/uploadfile/200651118820397.RAR" target=_blank>VMJPLock.rar</A></P>
<P><BR>使用方法：<BR>(1)启动本程序，勾选“锁定VMJP存档”<BR>(2)不要关闭本程序，启动VMJP，读取一个战斗中的进度档后，该进度档只是暂时被无效化，退出并重新启动VMJP，就可以反复读取。<BR>本软件目前只支持在Windows&nbsp;2000/XP/2003上运行的VMJ资料片《富岳幻游记》，不支持Windows&nbsp;98/Me和VMJ原版。<BR>本软件是自由软件。您可以自由的使用它，但作者不承担任何运行该软件所带来的风险和意外损失。</P>]]></description>
</item><item>
<title><![CDATA[文件分割工具 SplitFile]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=wdx04&amp;id=13804</link>
<author>wdx04</author>
<pubDate>2006/4/25 12:45:44</pubDate>
<description><![CDATA[
<P>这是一个分割文件和合并分割块的小工具软件。<BR>本软件支持分割4GB以上的文件，但每个分块不能大于2GB。<BR>本软件最大的特色就是分割方式极其灵活，详见下面的截图：</P>
<P><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blogger.org.cn/blog/uploadfile/20064251377657.JPG" border=0></P>
<P><IMG src="http://blogger.org.cn/blog/images/file/zip.gif" border=0><A href="http://blogger.org.cn/blog/uploadfile/2006425124646477.RAR" target=_blank>SplitFile.rar</A></P>
<P>目前版本中有3个子功能未实现，即“完成后删除原文件”、“低硬盘空间模式”和“生成用于合并的批处理文件”。<BR>压缩包中有全部源代码和已编译的可执行文件。<BR>源代码可以用VC6+WTL3.1或者VC7.1+WTL7.x编译。<BR>如果用WTL3.1，需要用WTL31Fix文件夹下的两个头文件替换WTL3.1的原始版本。</P>
<P>[注意1]文件的首字节为第0字节，末字节为(文件长度-1)字节，限定分割范围时需要注意这一点，默认分割范围是整个文件。</P>
<P>[注意2]开始分割前一定要先生成摘要，观察数据是否正常。</P>
<P>[注意3]本软件完全免费。虽然作者本人在日常工作中多次使用并未发现数据错误，但没有进行严格的测试，因此使用它仍有一定的危险性。你可以选择信任它，但作者不对由于使用此软件可能造成的损害承担任何责任。<BR>如发现Bug请在此留言，谢谢。</P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[窗口隐藏工具 WinHide]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=wdx04&amp;id=13553</link>
<author>wdx04</author>
<pubDate>2006/4/17 18:17:37</pubDate>
<description><![CDATA[
<P><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blogger.org.cn/blog/uploadfile/2006417182824680.JPG" border=0></P>
<P>这是一个隐藏屏幕上任意窗口的小工具。<BR>原理：<BR>&nbsp; Windows中每一个窗口(Window)都和一个唯一的整数联系在一起，这个整数就称作窗口的句柄(Handle)。如果知道某个窗口的句柄，就可以对它进行各种操作。Windows也提供了几个API函数，可以通过窗口的标题和类名来查找窗口的句柄。<BR>使用步骤：<BR>1、在Window Name栏输入窗口的标题，在Window Class栏输入窗口类名。这里窗口标题和类名都是选填的，如果不知道可以留空，窗口标题和类名都可以用*和?作为通配符。<BR>&nbsp; 点击Find/Set，被找到的第一个窗口的句柄覆盖到Window Handle栏中<BR>&nbsp; 点击Find/Add，被找到的第一个窗口的句柄添加到Window Handle栏中，和原有的窗口句柄以“;”号分隔，这样可以同时隐藏多个窗口。<BR>2、如果Window Handle栏中有窗口句柄，就可以使用Show/Hide按钮或快捷键进行隐藏。<BR>&nbsp; Win+A 隐藏WinHide本身<BR>&nbsp; Win+Z 隐藏需要隐藏的窗口<BR>&nbsp; 这里Win指键盘上的“视窗”键，一般在Ctrl、Alt键附近。<BR>使用举例：<BR>&nbsp; 有一个类名未知的窗口，标题为“未定标题 - 记事本”，想要隐藏它。<BR>&nbsp; 在Window Title栏输入通配符“未*”，点击 Find/Set，Window Handle栏填入了十六进制数值2f077c，这就是窗口的句柄。同时Window Title栏和Window Class栏分别填入了完整的窗口名和类名，可知记事本的类名为"Notepad"，以后就可以通过类名来查找它了。现在点击 Show/Hide，记事本不见了！再按键盘快捷键 Win+Z，记事本又回来了！<BR></P>
<P><IMG src="http://blogger.org.cn/blog/images/file/zip.gif" border=0><A href="http://blogger.org.cn/blog/uploadfile/2006417182417247.RAR" target=_blank>WinHide.rar</A></P>
<P>源代码可使用Visual C++ 6.0和WTL 3.1以上版本编译。</P>]]></description>
</item><item>
<title><![CDATA[文件加锁工具 Easy File Lock]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=wdx04&amp;id=13453</link>
<author>wdx04</author>
<pubDate>2006/4/13 18:27:18</pubDate>
<description><![CDATA[
<P>一个简单的小工具，它以只读共享的方式打开指定的文件，使得其它程序无法删除或更改该文件。</P>
<P>Lock a file : 弹出一个打开文件对话框，可以选择一个文件将其加锁。成功后文件名将被加入下面的列表框中。</P>
<P>Unlock Selected : 解锁列表框中当前选中的文件。</P>
<P>Unlock All : 解锁所有的文件。</P>
<P>v2.0 新功能(2007.06)</P>
<P>·在锁定文件列表上双击文件名可直接解锁并且打开该文件<BR>·记忆最近锁定的文件<BR>·窗口最小化为系统托盘图标<BR>·用于局域网内多人共用(例如以独占方式打开Word,Excel等文档)同一个文件的情况，每个指定时间尝试锁定一次，直到锁定成功或者超过设定的时间<BR></P>
<P>下载：<A><IMG src="http://blogger.org.cn/blog/images/file/zip.gif" border=0></A><A href="http://blogger.org.cn/blog/uploadfile/200772135932418.RAR" target=_blank>FileLock2.rar</A></P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[英雄传说5 海之槛歌 免CD补丁]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=wdx04&amp;id=13414</link>
<author>wdx04</author>
<pubDate>2006/4/12 18:04:16</pubDate>
<description><![CDATA[<P>很简单的补丁，修补ED5_WIN.EXE，只支持正版的简体中文ED5。</P>
<P><A><IMG src="http://blogger.org.cn/blog/images/file/zip.gif" border=0></A><A href="http://blogger.org.cn/blog/uploadfile/200641218518438.RAR" target=_blank>ED5_NoCD.rar</A></P>
<P>使用本补丁后,ED5主程序将不能识别音乐CD.如果想在游戏时听WAVE音乐,可以把音乐CD中的所有WAV文件(ED5_WIN\WAVE\*.WAV)复制到你的ED5安装文件夹下的Wave子文件夹中(该文件夹中原本只有 Ed5wv003.wav 一个文件).</P>
<P>&nbsp;</P>]]></description>
</item><item>
<title><![CDATA[在Spring MVC中绑定集合类型]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=wdx04&amp;id=13377</link>
<author>wdx04</author>
<pubDate>2006/4/11 17:57:24</pubDate>
<description><![CDATA[<P>最近学习Spring，很纳闷Spring MVC Framework如何处理表单提交，尤其是表单中有一个多行的数据表格的时候。毕竟Spring没有提供如Struts那样的html和nested标签库，使我们能够很容易地绑定ActionForm中的字段和JSP页面中的表单控件。今天终于找到了一个解决方案。</P>
<P>下面这段JSP代码是HTML表单中的一个table，其中form为表单对象；programs是一个List类型的集合，元素为Program类型的JavaBean。Program中的mark字段是可以在JSP页面中更改的，我的目的是，在提交表单时，request中的值能够自动更新到表单对象中。</P>
<P>　&nbsp;&nbsp;&nbsp; &lt;tbody&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:forEach var="program" items="${form.programs}" varStatus="loopStatus"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;spring:bind path="form.programs[${loopStatus.index}]"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;c:out value="${status.value.progId}"/&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;c:out value="${status.value.progName}"/&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;c:out value="${status.value.progVer}"/&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;c:out value="${status.value.progLvl}"/&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;c:out value="${status.value.gameCnt}"/&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;c:out value="${status.value.winCnt}"/&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;c:out value="${status.value.loseCnt}"/&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;c:out value="${status.value.drawCnt}"/&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;input type="text" name="${status.expression}.mark" value="${status.value.mark}" size="5" maxlength="5"/&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/spring:bind&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/c:forEach&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;&lt;td colspan="9" align="center"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" value="提交"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;&lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tbody&gt;</P>
<P>这里有几个比较关键的地方：<BR>(1) &lt;c:forEach&gt;中的 varStatus 属性，定义了 varStatus 才能取到迭代器的当前索引。<BR>(2) &lt;spring:bind&gt;中的 path 属性，通过 path="form.programs[${loopStatus.index}] 才能正确地绑定到一个Program元素。<BR>(3) &lt;input&gt;中的 name 属性，这里 ${status.expression} 的值是形如 "programs[0]" 的字符串，方括号中的索引为bind时设定的 loopStatus.index ；加上后面的 ".mark"，就能形成完整的名称。这样，在提交表单时，Spring就能通过分析名称，把该字段的值填充到form中了。<BR></P>
<P>&nbsp;</P>]]></description>
</item>
</channel>
</rss>