<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkYBSXYzeyp7ImA9WhRRFEk.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348</id><updated>2011-11-28T08:29:18.883+08:00</updated><category term="DCOM" /><category term="BASIC" /><category term="开源" /><category term="开发工具" /><category term="Microsoft" /><category term="wiki" /><category term="zim" /><category term="桥接" /><category term="Javascript" /><category term="C" /><category term="365key" /><category term="blogspot" /><category term="编程" /><category term="birdge" /><category term="FreeBSD" /><category term="Java" /><category term="IDE" /><category term="C++" /><category term="互联网" /><category term="blogger" /><category term="电信" /><category term="无线网卡" /><category term="中国电信" /><category term="wireless" /><category term="STL" /><category term="Linux" /><category term="汉语编程" /><category term="Eclipse" /><category term="骗局" /><category term="windows" /><category term="网站" /><category term="笔记" /><category term="中文" /><category term="classic templates" /><category term="BT" /><category term="汉化" /><category term="Borland" /><category term="微软" /><category term="VC" /><category term="自由软件" /><title>歪歪猪作坊</title><subtitle type="html">编程是一门手艺</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://yypig.blogspot.com/" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/yyp" /><feedburner:info uri="yyp" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;AkIBQXg5fyp7ImA9WhdQFEU.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-5660513316055045193</id><published>2011-08-16T17:55:00.001+08:00</published><updated>2011-08-16T17:55:50.627+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-16T17:55:50.627+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="编程" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Java SSL 客户端程序无法和服务器握手的解决办法</title><content type="html">很多HTTPS的网站的证书都有这样或者那样的问题，Google的网站我都见过证书有问题的，所以这些网站按照严格的标准是不应该被访问的，于是Java的SSL库当碰到这些网站时都会报错，具体体现在握手（Handshake）时，发了Client Hello，服务器回了Server Hello，SSL库发现证书有问题，马上回了Fatal: Unexpected Message，然后抛异常。解决的办法是：在运行时加上这个参数：&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: white; color: black; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;-Dsun.security.ssl.allowUnsafeRenegotiation=true。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="background-color: white; color: black; font-family: Arial,'Liberation Sans','DejaVu Sans',sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;参考资料：&lt;/span&gt;&lt;a href="http://stackoverflow.com/questions/2606873/sslexception-hellorequest-followed-by-an-unexpected-handshake-message"&gt;http://stackoverflow.com/questions/2606873/sslexception-hellorequest-followed-by-an-unexpected-handshake-message&lt;/a&gt;&lt;span class="Apple-style-span" style="background-color: white; color: black; font-family: Arial,'Liberation Sans','DejaVu Sans',sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 18px; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&amp;nbsp;&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-5660513316055045193?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/H1wGbmWLfKaORb7F64kOXMhygds/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/H1wGbmWLfKaORb7F64kOXMhygds/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/H1wGbmWLfKaORb7F64kOXMhygds/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/H1wGbmWLfKaORb7F64kOXMhygds/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/Kop2YotUk_I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/5660513316055045193/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=5660513316055045193" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/5660513316055045193?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/5660513316055045193?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/Kop2YotUk_I/java-ssl.html" title="Java SSL 客户端程序无法和服务器握手的解决办法" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://yypig.blogspot.com/2011/08/java-ssl.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQBRnsyfyp7ImA9Wx9QEEQ.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-8137462583826595411</id><published>2010-12-23T17:25:00.000+08:00</published><updated>2010-12-23T17:25:57.597+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-23T17:25:57.597+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="BT" /><title>在mldonkey中使用无tracker的种子文件（torrent）</title><content type="html">mldonkey是一个功能强大的能用于unix系列服务器的p2p下载工具。支持多协议（包括edonkey和bittorrent），支持web界面，cli界面等等。cli命令强大无比，基本可以实现所有的操作。可以建一个目录，只要把torrent文件放到这个目录下，它会定期去扫描这个目录，发现有新的torrent文件就增加到下载里面去。所以是服务器端下载的最好工具。&lt;br /&gt;
&lt;br /&gt;
但是mldoneky有个问题，一直不支持DHT，知道最新近在&lt;a href="http://repo.or.cz/w/mldonkey.git/shortlog/refs/heads/dev/dht"&gt;代码库&lt;/a&gt;里面才有了DHT的支持，虽然是支持DHT，但对于无tracker的torrent文件，还是判为非法文件，无法下载。想了一下，发现直接更改torrent文件，随便加一个比较常用的tracker进去就可以解决这个问题。直接修改文件要用到&lt;a href="http://forum.utorrent.com/viewtopic.php?pid=288182"&gt;BEncode Editor&lt;/a&gt;这个工具。&lt;br /&gt;
&lt;br /&gt;
另外mldoneky的最新版本在添加DHT支持时，代码对64位系统支持不好，Random.Int 函数后面的参数要求最大不能超过2^30-1，但是max_int确却是2^60-1次，所以bT_DHT.ml文件中，要将max_int替换成1073741823才能在64位系统下正常运行。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-8137462583826595411?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hdRt2HRBcC9j1wOkzQuqHBT_aDw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hdRt2HRBcC9j1wOkzQuqHBT_aDw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hdRt2HRBcC9j1wOkzQuqHBT_aDw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hdRt2HRBcC9j1wOkzQuqHBT_aDw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/kZjwyVFUnZw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/8137462583826595411/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=8137462583826595411" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/8137462583826595411?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/8137462583826595411?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/kZjwyVFUnZw/mldonkeytrackertorrent.html" title="在mldonkey中使用无tracker的种子文件（torrent）" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://yypig.blogspot.com/2010/12/mldonkeytrackertorrent.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ABSHs_fSp7ImA9WxBbEk4.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-8369230928350071925</id><published>2010-03-11T00:49:00.000+08:00</published><updated>2010-03-11T00:49:19.545+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-11T00:49:19.545+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="STL" /><category scheme="http://www.blogger.com/atom/ns#" term="VC" /><title>Visual C++ STL 相关编译错误的解决办法</title><content type="html">和所有的垄断企业一样，微软的做法经常是武断和专横的，一个困扰了我一个多月的问题解决了，结果竟是如此的不可思议。有一个库的binary是在VC 2005下编译的，如果用VC 2008编译例程link用VC 2005的库文件时程序会Crash，所以只能用回VC 2005编译例程。在用VC 2005编译例程的时候，link时出现了这样的错误：&lt;br /&gt;
&lt;br /&gt;
error LNK2001: unresolved external symbol "void __cdecl std::_Throw(class stdext::exception const &amp;amp;)" (?_Throw@std@@YAXABVexception@stdext@@@Z)&lt;br /&gt;
error LNK2001: unresolved external symbol "void (__cdecl* std::_Raise_handler)(class stdext::exception const &amp;amp;)" (?_Raise_handler@std@@3P6AXABVexception@stdext@@@ZA)&lt;br /&gt;
&lt;br /&gt;
在网上搜了大半天，没有任何头绪，把Windows SDK升级了也不能解决问题。忽然记起用VC 2008编译时是可以通过的，搜索stdext::exception时，发现网上有些地方贴出来的类似的出错的提示信息中显示的exception头文件中，stdext::exception定义所在的行数和VC 2005中exception头文件不符，才怀疑VC 2005到VC 2008的头文件有变化，结果发现，在VC 2005中，exception是放在std的namespace中，而VC 2008的exception是放在stdext的namespace中。但是这个库的Binary为什么是在VC 2005下编译，但是用的又是stdext::exception呢？突然想到微软经常会出SP1，SP2这些东西，下了VC 2005 SP1安装之后，编译通过。&lt;a href="http://blogs.msdn.com/vcblog/archive/2009/05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx"&gt;据说&lt;/a&gt;，VC 2010还会把一些类从std移入stdext，但是为什么要把类移来移去造成混乱呢，没有找到答案。&lt;br /&gt;
&lt;br /&gt;
所有高度依赖STL的VC程序都会有类似的问题，所以一般都会写明要升级到VC 2005 SP1：&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/v8/wiki/BuildingOnWindows"&gt;Google V8的编译说明&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dev.chromium.org/developers/how-tos/build-instructions-windows#TOC-Additional-free-downloads"&gt;Chromium的编译说明&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&amp;nbsp;其中提到的另外一种编译错误：&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="border-collapse: separate; color: black; font-family: Simsun; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;pre class="prettyprint" style="border-left: 3px solid rgb(204, 204, 204); font-size: 12px; margin-left: 2em; padding: 0.5em;"&gt;&lt;span class="pln" style="color: black;"&gt;LIBCMTD&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;lib&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;stdexcpt&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;obj&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;:&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; error LNK2005&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;:&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="str" style="color: #008800;"&gt;"public: virtual __thiscall std::exception::~exception(void)"&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(??&lt;/span&gt;&lt;span class="lit" style="color: #006666;"&gt;1exception@std@@UAE@XZ&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; already &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;defined&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;in&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; mksnapshot&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;obj
LIBCMTD&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;lib&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;stdexcpt&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;obj&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;:&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; error LNK2005&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;:&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="str" style="color: #008800;"&gt;"public: virtual char const * __thiscall std::exception::what(void)const "&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;(?&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;what@exception@std@@UBEPBDXZ&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;)&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; already &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;defined&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; &lt;/span&gt;&lt;span class="kwd" style="color: #000088;"&gt;in&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt; mksnapshot&lt;/span&gt;&lt;span class="pun" style="color: #666600;"&gt;.&lt;/span&gt;&lt;span class="pln" style="color: black;"&gt;obj&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-8369230928350071925?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HWvu-89n-XNGNeolrrImagzghi4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HWvu-89n-XNGNeolrrImagzghi4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HWvu-89n-XNGNeolrrImagzghi4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HWvu-89n-XNGNeolrrImagzghi4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/R0ycTr7jPt8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/8369230928350071925/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=8369230928350071925" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/8369230928350071925?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/8369230928350071925?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/R0ycTr7jPt8/visual-c-stl.html" title="Visual C++ STL 相关编译错误的解决办法" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://yypig.blogspot.com/2010/03/visual-c-stl.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQBSX06fCp7ImA9WxVaGEQ.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-4487637413502546210</id><published>2009-04-16T23:05:00.000+08:00</published><updated>2009-04-16T23:05:58.314+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-16T23:05:58.314+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="网站" /><title>.htaccess 与 Unix 换行符</title><content type="html">.htaccess是一个很好的工具，尤其对于静态网站。&lt;br /&gt;
&lt;br /&gt;
我的网站是全静态的，原来是把RSS放在了/rss/目录下，后来改成了直接放在根目录，但是又不想每次更新都要去同步两边的文件，所以想把原来/rss/下的RSS Feed重定向到根目录下的RSS Feed，我在.htaccess文件中写了这两句：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Redirect /rss.xml http://blog.yypig.net/rss.xml&lt;br /&gt;
Redirect /atom.xml http://blog.yypig.net/atom.xml&lt;br /&gt;
&lt;br /&gt;
但是一放到网站上，就出现了500 Internal Server Error，但是如果只有一行就可以了，百思不得其解，以为一个文件里面只能出现一个Redirect语句。后来看到了这个&lt;a href="http://archives.hwg.org/hwg-techniques/20020812191449.522.qmail@web12406.mail.yahoo.com"&gt;链接&lt;/a&gt;&amp;nbsp;，恍然大悟，原来只是换行符的问题，如果服务器是Unix的，一定要用Unix换行符，改了之后一切正常。&lt;br /&gt;
&lt;br /&gt;
.htaccess其实功能很强大，最近就通过它的URL Rewrite功能，把公司的动态网页的URL全部变成由目录和文件名组成的貌似静态网页的结构,以类似“服务.html”代替“index.php?cat=2&amp;amp;item=1”，据说这样对搜索引擎比较友好。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-4487637413502546210?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5QMM34ZKtV8fddcWjpdYxyP3Bbk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5QMM34ZKtV8fddcWjpdYxyP3Bbk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5QMM34ZKtV8fddcWjpdYxyP3Bbk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5QMM34ZKtV8fddcWjpdYxyP3Bbk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/kv8I3YaVlKk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/4487637413502546210/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=4487637413502546210" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/4487637413502546210?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/4487637413502546210?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/kv8I3YaVlKk/htaccess-unix.html" title=".htaccess 与 Unix 换行符" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://yypig.blogspot.com/2009/04/htaccess-unix.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYHQ3g5eyp7ImA9WxVUEkQ.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-7268805490359114778</id><published>2009-03-17T21:38:00.000+08:00</published><updated>2009-03-17T21:38:52.623+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-17T21:38:52.623+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="中文" /><category scheme="http://www.blogger.com/atom/ns#" term="zim" /><category scheme="http://www.blogger.com/atom/ns#" term="wiki" /><category scheme="http://www.blogger.com/atom/ns#" term="笔记" /><category scheme="http://www.blogger.com/atom/ns#" term="汉化" /><title>Zim Wiki 的中文乱码问题的解决办法</title><content type="html">&lt;a href="http://zim-wiki.org/"&gt;Zim&lt;/a&gt; 是一款桌面维基软件，可以当桌面笔记来用，&lt;a href="http://www.appinn.com/zim-wiki/"&gt;小众软件推荐的&lt;/a&gt;&amp;nbsp;，由于是用perl+gtk写成的，所以在Windwos下的安装非常麻烦，不过已经有人做了Windows的包，在&lt;a href="http://code.google.com/p/zimdesktopwiki-windows/"&gt;这里&lt;/a&gt;&amp;nbsp;。刚开始用，不知道好不好用。不过首先发现的问题是日期乱码，而且发现在它的release note里面明明写了加上了简体中文翻译，但是界面还是英文的，设置里面好像也没有办法改，正想把它扔了，不过有点不甘心，发扬了开源的DIY精神，终于找到办法了。&lt;br /&gt;
&lt;br /&gt;
在安装目录的bin下，有个zim文件，这是个perl脚本，也是Zim的主运行文件。在32至34行：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# i18n initialization&lt;br /&gt;
$Zim::CODESET = 'utf-8';&lt;br /&gt;
$Zim::LANG = '';&lt;br /&gt;
&lt;br /&gt;
把它改成：&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# i18n initialization&lt;br /&gt;
$Zim::CODESET = 'gbk';&lt;br /&gt;
$Zim::LANG = 'zh_CN';&lt;br /&gt;
&lt;br /&gt;
重新打开Zim，就是中文界面，而且日期不会乱码。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-7268805490359114778?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/o20dO_ggPAvlb1oEUSCof-yTw5o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o20dO_ggPAvlb1oEUSCof-yTw5o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/o20dO_ggPAvlb1oEUSCof-yTw5o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o20dO_ggPAvlb1oEUSCof-yTw5o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/zhz2EfW326Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/7268805490359114778/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=7268805490359114778" title="2 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/7268805490359114778?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/7268805490359114778?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/zhz2EfW326Y/zim-wiki.html" title="Zim Wiki 的中文乱码问题的解决办法" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://yypig.blogspot.com/2009/03/zim-wiki.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQFRX0yeSp7ImA9WxVSGEo.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-2457820960271323242</id><published>2009-01-14T01:15:00.002+08:00</published><updated>2009-01-14T02:45:14.391+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-14T02:45:14.391+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="birdge" /><category scheme="http://www.blogger.com/atom/ns#" term="桥接" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="无线网卡" /><category scheme="http://www.blogger.com/atom/ns#" term="wireless" /><title>Windows XP的无线桥接</title><content type="html">目前大部分的笔记本都是有两块网卡，一块是普通网卡，一块是无线网卡。一般有网口的地方会用普通网卡，通过网线连接上网，以获得较好的性能，没有网口的地方，会用无线上网。通常情况下，即使在同一个局域网里面，如果手工配置IP地址，必须为这两个不同的链接配置不同的IP地址，因为windows不允许为两个不同的适配器配置相同的IP地址。在特殊情况下，例如，使用电驴并在路由器上做了端口映射，于是需要在两种情况下都使用相同的IP地址，又不想每次都重新手工配置，这个时候可以用Windows自带的桥接模式来解决这个问题。&lt;br /&gt;&lt;br /&gt;在网络连接的文件夹中，选中“本地连接”和“无线网络连接”，击右键，选择“桥接”。这个时候将创建一个新的连接，叫“网络桥”（MAC Birdge Miniport)。这时候就可以手工为“网路桥”配置IP地址了。这样配置后，发现当接上网线时，上网是没有任何问题的，但是一旦拔开网线，改用无线上网，就上不去了，但是无线网卡显示的是连接上的状态。百思不得其解。Google了一下，发现了这两个连接：&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/windowsxp/using/networking/expert/crawford_02april22.mspx"&gt;Windows XP Home Networking: Building Network Bridges&lt;/a&gt;&lt;br /&gt;&lt;a href="http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q302348&amp;amp;ID=KB;EN-US;Q302348&amp;amp;"&gt;Bridge May Not Work With a Non-Promiscuous Mode Network Adapter&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;其中，提到了一个东西：“Promiscuous Mode”。原来，网卡工作在普通状态时，只接收属于自己的MAC地址的以太网包。只有当工作在“Promiscuous Mode”时，才不加限制地接收所有的以太网包。大部分的普通网卡都可以工作在“Promiscuous Mode”，可能为了安全起见，大部分的无线网卡都不能工作在“Promiscuous Mode”下。当Windows创建桥接模式时，实际上在系统里面创建了一个虚拟的新的网卡，这个新的网卡有自己的MAC地址，桥里面的所有网卡都以这个新的MAC地址发送以太网包，回送的以太网包自然也是发给这个新的MAC地址，由于普通网卡支持“Promiscuous Mode”，所以可以接收到不属于自己的新的MAC地址以太网包，所以通讯正常，无线网卡会抛弃掉所有不属于自己MAC地址的包，所以在桥接模式下收不到任何发回来的以太网包，自然就不能正常工作了。Windows XP提供了一个解决办法，叫ForceCompatibilityMode（强制兼容模式），在命令行（cmd）下，打入netsh bridge show a，可以看到已经桥接的各个网卡的编号和是否启用强制兼容模式，如果无线网卡显示“已停用”或者“未知”，应记住无线网卡的编号，并在命令行下打入：netsh bridge set a X e，其中X是无线网卡的编号，以启用强制兼容模式。&lt;br /&gt;&lt;br /&gt;这个兼容模式的原理是这样的，一旦某个网卡启用了这个模式，当从这个网口向外发送以太网包时，将改写以太网包，把源地址换成网卡自己的MAC地址，并记住这个转换，回复的以太网包的目标地址也是网卡的MAC地址，这样网卡就不会丢弃这个包，当这个收到这个回复包后，再根据原来的记忆，把目标地址换回原来的地址，和IP层的NAT的原理类似。&lt;br /&gt;&lt;br /&gt;通过这样设置以后，当拔掉网线，启用无线网络连接后，依然可以上网，并且IP地址不变，整个过程自动完成。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-2457820960271323242?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-7BGKSRyT3T1rI8KJ7MrD7_kGYM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-7BGKSRyT3T1rI8KJ7MrD7_kGYM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-7BGKSRyT3T1rI8KJ7MrD7_kGYM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-7BGKSRyT3T1rI8KJ7MrD7_kGYM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/WKX6I-clMdQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/2457820960271323242/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=2457820960271323242" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/2457820960271323242?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/2457820960271323242?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/WKX6I-clMdQ/windows-xp.html" title="Windows XP的无线桥接" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://yypig.blogspot.com/2009/01/windows-xp.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcEQ3k4eip7ImA9WxRSFEQ.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-8106774179175057977</id><published>2008-09-15T23:18:00.001+08:00</published><updated>2008-09-15T23:36:42.732+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-15T23:36:42.732+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="365key" /><category scheme="http://www.blogger.com/atom/ns#" term="Javascript" /><title>Google Chrome中如何使用365key提交网摘？</title><content type="html">365key自从被收购了之后，越做越糟糕，但是由于它的“将网摘共享到我的网站”上的功能做得比较能适合我的需要，所以一直在用它。它的右键收藏功能在Firefox 3.0之后就没办法使用，所以只能退而使用“书签”的方式提交网摘。“书签”方式就是把一段用于提交网摘的Javascript保存成书签，需要提交网摘时，选择相应书签，运行Javascript就OK了，兼容性比较好。当开始使用Google Chrome之后，也想用这种方法来提交网摘，但是发现有一个Bug：选中的文本无法作为摘要提交。原来的代码是这样的：&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style=" ;font-family:'Courier New';font-size:13px;"&gt;javascript:d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&amp;amp;u='+escape(d.location.href)+'&amp;amp;c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();&lt;/span&gt;&lt;/blockquote&gt;其中采用的两种获得选择文本的方法：document.getSelection()或者document.selection.createRange().text，在Google Chrome中都失效了。通过研究，发现在Google Chrome中，获得选择文本的方法为：window.getSeleciton()。所以将代码更改如下：&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style=" ;font-family:'Courier New';font-size:13px;"&gt;javascript:d=document;t=window.getSelection();void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&amp;amp;u='+escape(d.location.href)+'&amp;amp;c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();&lt;/span&gt;&lt;/blockquote&gt;结果测试一下可以了，需要的人可以把&lt;a href="javascript:d=document;t=window.getSelection();void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&amp;u='+escape(d.location.href)+'&amp;c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();" onclick="alert('拖动这个连接到浏览器链接栏或者右键点这个连接加到收藏夹中.'); return false;"&gt;&lt;b&gt;提交天天网摘(P)&lt;/b&gt;&lt;/a&gt;(弹出窗口方式)拖到书签栏。&lt;br /&gt;&lt;br /&gt;另外，提交网摘网页里面，分类已经在很久以前就不行了，估计也是Javascript的兼容问题，希望365Key可以改一改。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-8106774179175057977?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/aabHSVTi4SYy8O6hFGGOEn3QNAA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aabHSVTi4SYy8O6hFGGOEn3QNAA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/aabHSVTi4SYy8O6hFGGOEn3QNAA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aabHSVTi4SYy8O6hFGGOEn3QNAA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/RCFdVazSpmk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/8106774179175057977/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=8106774179175057977" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/8106774179175057977?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/8106774179175057977?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/RCFdVazSpmk/google-chrome365key.html" title="Google Chrome中如何使用365key提交网摘？" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://yypig.blogspot.com/2008/09/google-chrome365key.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYAQnY4fCp7ImA9WxRSFEQ.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-2341657368549609315</id><published>2008-08-09T00:17:00.016+08:00</published><updated>2008-09-15T23:39:03.834+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-15T23:39:03.834+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="blogger" /><category scheme="http://www.blogger.com/atom/ns#" term="Javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="blogspot" /><category scheme="http://www.blogger.com/atom/ns#" term="classic templates" /><title>在Blogger的经典模板（Classic Templates）中添加分类（Labels）列表</title><content type="html">我的&lt;a href="http://blog.yypig.net/"&gt;另外一个Blog&lt;/a&gt;，是用Blogger的FTP功能发布的，只能使用Classic Templates，常规是不能列出分类（Labels）列表的，不象用Blogspot发布的，可以用新的Layout，用“分类”控件实现。&lt;br /&gt;&lt;br /&gt;参考了著名的Blogspot Hacker &lt;a href="http://phydeaux3.blogspot.com/"&gt;phydeaux3&lt;/a&gt; 的文章《&lt;a href="http://phydeaux3.blogspot.com/2007/05/automatic-list-of-labels-for-classic.html"&gt;Automatic List of Labels for Blogger Classic Templates / FTP&lt;/a&gt;》。摸索出了适合中文的方法，介绍如下。&lt;br /&gt;&lt;br /&gt;首先是如何列出所有的Labels。Blogger所提供的一个叫“metafeed”的功能可以实现这个，地址是：&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;blockquote style="font-family: courier new;"&gt;http://www.blogger.com/feeds/USERID/blogs/BLOGID&lt;/blockquote&gt;&lt;br /&gt;其中，USERID和BLOGID，可以在Blogger的控制面板中查到，所有对于用户级别的设置的链接中，可以看到USERID，所有关于特定Blog的设置的链接，都可以找到BLOGID。这个地址支持标准的GData的接口，所以可以通过在后面添加参数实现其他功能。这个地址其实是个Feed，所以原来的格式是atom。Javascript处理XML比较困难，所以要把它转化成Javascript比较容易处理的JSON格式，而且选用GData的json-in-script的方式，以便把它嵌入到网页中作为Javascript运行。所以可以采用：&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;blockquote style="font-family: courier new;"&gt;http://www.blogger.com/feeds/USERID/blogs/BLOGID?alt=json-in-script&amp;amp;callback=listLabels&lt;/blockquote&gt;&lt;br /&gt;其中listLabels是回调函数，参数就是JSON描述的对象，通过在回调函数中对JSON对象的处理，就可以列出所有的Labels。由于www.blogger.com在G～F～W外面，回传的东西里面都是Labels，一旦Labels包括某些关键字，后果可想而知，好在Google的大部分服务都提供https，所以最终采用的链接是：&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;https://www.blogger.com/feeds/USERID/blogs/BLOGID?alt=json-in-script&amp;amp;callback=listLabels&lt;/span&gt;&lt;/blockquote&gt;列出所有的Labels还是不够，关键要解决每个Label所对应的链接是什么。对于全部是英文或者数字的Label，链接就是http://BLOGURL/Labels/后面加Label名称再加上html扩展名，但是一旦Label包含有中文就不是这样了，假如全部是中文，Label名称要进行base64编码，假如Label包括中文和英文或数字，那么Label名称里面的英文保持原文，每个中文要转为“=XX=YY=ZZ”，其中，XXYYZZ为16进制表示的中文字的Unicode编码。在参考了&lt;a href="http://www.webtoolkit.info/javascript-base64.html"&gt;这个连接&lt;/a&gt;里面的Base64 Javascript实现后，最终的脚本为：&lt;br /&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;//&amp;lt;![CDATA[&lt;br /&gt;var Base64 = {&lt;br /&gt;&lt;br /&gt;    // private property&lt;br /&gt;    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",&lt;br /&gt;&lt;br /&gt;    // public method for encoding&lt;br /&gt;    encode : function (input) {&lt;br /&gt;        var output = "";&lt;br /&gt;        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;&lt;br /&gt;        var i = 0;&lt;br /&gt;        var go = false;&lt;br /&gt;        /* 判断是否包括数字和字母 */&lt;br /&gt;        if (input.match(/[A-Za-z0-9\+\/\=]/g)){&lt;br /&gt;            go = true;&lt;br /&gt;        }&lt;br /&gt;        input = Base64._utf8_encode(input);&lt;br /&gt;&lt;br /&gt;        while (i &amp;lt; input.length) {&lt;br /&gt;            /* 如果包括数字和字母，按特殊方式处理，否则用base64编码 */&lt;br /&gt;            if (go){&lt;br /&gt;                chr1 = input.charCodeAt(i++);&lt;br /&gt;                if (chr1&amp;lt;127){&lt;br /&gt;                    output = output +input.charAt(i-1);&lt;br /&gt;                    continue;&lt;br /&gt;                }&lt;br /&gt;                output = output + '=' + chr1.toString(16).toUpperCase();&lt;br /&gt;                continue;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            chr1 = input.charCodeAt(i++);&lt;br /&gt;            chr2 = input.charCodeAt(i++);&lt;br /&gt;            chr3 = input.charCodeAt(i++);&lt;br /&gt;&lt;br /&gt;            enc1 = chr1 &amp;gt;&amp;gt; 2;&lt;br /&gt;            enc2 = ((chr1 &amp;amp; 3) &amp;lt;&amp;lt; 4) | (chr2 &amp;gt;&amp;gt; 4);&lt;br /&gt;            enc3 = ((chr2 &amp;amp; 15) &amp;lt;&amp;lt; 2) | (chr3 &amp;gt;&amp;gt; 6);&lt;br /&gt;            enc4 = chr3 &amp;amp; 63;&lt;br /&gt;&lt;br /&gt;            if (isNaN(chr2)) {&lt;br /&gt;                enc3 = enc4 = 64;&lt;br /&gt;            } else if (isNaN(chr3)) {&lt;br /&gt;                enc4 = 64;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            output = output +&lt;br /&gt;            this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +&lt;br /&gt;            this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;        /* 将结果中的斜杠替换成两个下划线 */&lt;br /&gt;        output = output.replace(/\//g,"__");&lt;br /&gt;        return output;&lt;br /&gt;    },&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    // private method for UTF-8 encoding&lt;br /&gt;    _utf8_encode : function (string) {&lt;br /&gt;        string = string.replace(/\r\n/g,"\n");&lt;br /&gt;        var utftext = "";&lt;br /&gt;&lt;br /&gt;        for (var n = 0; n &amp;lt; string.length; n++) {&lt;br /&gt;&lt;br /&gt;            var c = string.charCodeAt(n);&lt;br /&gt;&lt;br /&gt;            if (c &amp;lt; 128) {&lt;br /&gt;                utftext += String.fromCharCode(c);&lt;br /&gt;            }&lt;br /&gt;            else if((c &amp;gt; 127) &amp;amp;&amp;amp; (c &amp;lt; 2048)) {&lt;br /&gt;                utftext += String.fromCharCode((c &amp;gt;&amp;gt; 6) | 192);&lt;br /&gt;                utftext += String.fromCharCode((c &amp;amp; 63) | 128);&lt;br /&gt;            }&lt;br /&gt;            else {&lt;br /&gt;                utftext += String.fromCharCode((c &amp;gt;&amp;gt; 12) | 224);&lt;br /&gt;                utftext += String.fromCharCode(((c &amp;gt;&amp;gt; 6) &amp;amp; 63) | 128);&lt;br /&gt;                utftext += String.fromCharCode((c &amp;amp; 63) | 128);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return utftext;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;function listLabels(root){&lt;br /&gt;    var baseURL = 'http://blog.yypig.net/labels/';&lt;br /&gt;    var baseHeading = "Labels";&lt;br /&gt;    var isFTP = true;&lt;br /&gt;    var entry = root.entry;&lt;br /&gt;    var category = entry.category;&lt;br /&gt;    labelSort = new Array();&lt;br /&gt;    for(p in category){&lt;br /&gt;        labelSort[labelSort.length] = [category[p].term];&lt;br /&gt;    }&lt;br /&gt;    //labelSort.sort();&lt;br /&gt;    for (var r=0; r &lt; labelSort.length; r++){&lt;br /&gt;        document.write('&amp;lt;a href="'+baseURL+Base64.encode(labelSort[r]+'')+'.html" &amp;gt;');&lt;br /&gt;        document.write(labelSort[r]+'');&lt;br /&gt;        document.write('&amp;lt;/a&amp;gt;, ');&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//]]&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="https://www.blogger.com/feeds/USERID/blogs/BLOGID?alt=json-in-script&amp;amp;callback=listLabels" &amp;gt;&amp;lt;/script&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-2341657368549609315?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hLZ6UhXPQQQ_a0jYy4apFvW7YIs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hLZ6UhXPQQQ_a0jYy4apFvW7YIs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hLZ6UhXPQQQ_a0jYy4apFvW7YIs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hLZ6UhXPQQQ_a0jYy4apFvW7YIs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/GY3quIywkno" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/2341657368549609315/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=2341657368549609315" title="1 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/2341657368549609315?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/2341657368549609315?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/GY3quIywkno/bloggerclassic-templateslabels.html" title="在Blogger的经典模板（Classic Templates）中添加分类（Labels）列表" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://yypig.blogspot.com/2008/08/bloggerclassic-templateslabels.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEESH8-eSp7ImA9WxRRFUo.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-3585894127703122042</id><published>2008-05-03T22:37:00.003+08:00</published><updated>2008-09-28T12:36:49.151+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-28T12:36:49.151+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="BASIC" /><title>纪念一下</title><content type="html">据说，今天是BASIC语言诞生的日子：&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;上世纪50年代，Dartmouth 大学的数学家 John G. Kemeny 和 Thomas E. Kurtz觉得当时的 Fortran、Algol 太复杂，所以在 1956 年开始着手开发易于使用的语言。&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;于 1964年5月1日凌晨4点在 GE-225 主机成功运行第一个 BASIC 程序。从此 BASIC 迅速风靡。两位 BASIC 之父后来又成立公司开发了 True BASIC。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;   &lt;img alt="" src="http://www.wired.com/images/article/full/2008/05/kemeny_and_kurtz_250px.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;值得一提的是，Kemeny 后来成为了 Dartmouth 大学的校长，并在 1972 年实行男女同校制（该校两百多年来都是 all-male）。&lt;/blockquote&gt;&lt;br /&gt;我的第一门语言也是APPLE II上的BASIC语言。当年在潮州金山中学的电脑室里面学习的，是兴趣小组，感谢杜舒加老师，是他引导我进入了这个领域，每天都是下午放学以后，我们就到电脑室上机，杜老师会一直陪伴我们到六点钟才关机房回家。他还制作了一个十章的练习题，从易到难，从最简单的打印星型图案，到最难的需要用到事件驱动的模拟加油站汽车加油，中间还有八皇后问题，四色问题等等经典题目，帮助我们走入了编程的领域。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-3585894127703122042?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CVJGWhwyx1M61mje6TbWwEOgoJo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CVJGWhwyx1M61mje6TbWwEOgoJo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CVJGWhwyx1M61mje6TbWwEOgoJo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CVJGWhwyx1M61mje6TbWwEOgoJo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/1UhZWWo-NgA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/3585894127703122042/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=3585894127703122042" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/3585894127703122042?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/3585894127703122042?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/1UhZWWo-NgA/blog-post.html" title="纪念一下" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://yypig.blogspot.com/2008/05/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08CRH8zeSp7ImA9WB9QE04.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-506893688380729999</id><published>2007-10-17T18:57:00.000+08:00</published><updated>2007-10-26T01:04:25.181+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-10-26T01:04:25.181+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="汉语编程" /><category scheme="http://www.blogger.com/atom/ns#" term="骗局" /><title>忽悠，接着忽悠</title><content type="html">第一次看到&lt;a href="http://www.dywt.com.cn/"&gt;汉语编程&lt;/a&gt;就是感觉到是忽悠，因为任何一个写过程序的人都肯定会说，汉语编程有何意义？程序语言本质上不是人说的语言，是code（代码）而不是language，所以何必分英语汉语，就像有没有汉语数学这个概念？sin(x)非要写成正弦（甲）？但是后来看到了他们“做”出来的IDE，还有点佩服这帮人，以为是一帮理想主义者，为了推行这个理念，竟然不辞辛苦地开发出一个IDE出来。今天看了徽剑的&lt;a href="http://blog.sina.com.cn/s/blog_49332a8301000dl8.html"&gt;这篇文章&lt;/a&gt;，才知道又是一个大忽悠。不过也不得不佩服他们的“智慧”，选了一个大家都不怎么熟悉的Forth语言来改，IDE也是拿开源的改出来的。不过在这片神奇的土地上，还有什么不可能的事情呢？&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Update：2007/10/26&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;仔细重新看了徽剑的文章，发现原来汉语编程也分&lt;/span&gt;&lt;a style="color: rgb(255, 0, 0); font-weight: bold;" href="http://www.hybcw.com/"&gt;骗子&lt;/a&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;和&lt;/span&gt;&lt;a style="color: rgb(255, 0, 0); font-weight: bold;" href="http://www.dywt.com.cn"&gt;理想主义者&lt;/a&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;，我之前看到的其实是易语言的IDE，感觉做得不错，如果真的是理想主义者自己的辛苦开发出来的，还是要致以崇高敬意，毕竟也是辛苦劳动的成果。但是，我还是不赞同汉语编程。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;相关链接：&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a id="articleTitle"&gt;&lt;/a&gt;&lt;a href="http://blog.sina.com.cn/s/blog_49332a8301000dl8.html"&gt;汉语编程-汉芯之后的中国软件界大骗局&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a&gt;&lt;/a&gt;&lt;a href="http://bbs.tiexue.net/post2_2286499_1.html"&gt;［原创］＂沈语言＂的本质－－最新内幕！！！！&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a&gt;&lt;/a&gt;&lt;a href="http://www.xycq.net/forum/thread-152078-1-1.html"&gt;&lt;span class="bold"&gt;汉语编程与win32forth关系研究&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a&gt;&lt;br /&gt;&lt;/a&gt;&lt;a id="articleTitle"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-506893688380729999?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/W1n9LWaCUDVkWMLPM1ZmLzXCozY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/W1n9LWaCUDVkWMLPM1ZmLzXCozY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/W1n9LWaCUDVkWMLPM1ZmLzXCozY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/W1n9LWaCUDVkWMLPM1ZmLzXCozY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/U9YnoNtHcg4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/506893688380729999/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=506893688380729999" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/506893688380729999?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/506893688380729999?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/U9YnoNtHcg4/blog-post.html" title="忽悠，接着忽悠" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://yypig.blogspot.com/2007/10/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEMRnk-fSp7ImA9WB5XEk8.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-2554137435374826235</id><published>2007-07-12T15:49:00.000+08:00</published><updated>2007-07-12T16:24:47.755+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-07-12T16:24:47.755+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="电信" /><category scheme="http://www.blogger.com/atom/ns#" term="中国电信" /><category scheme="http://www.blogger.com/atom/ns#" term="互联网" /><title>中国电信DNS骑劫的严重后果</title><content type="html">反垃圾邮件的一个比较通用的做法是使用“实时黑名单”- RBL（Realtime Blackhole List），由一些比较著名的组织提供，列出了全世界主要的垃圾邮件发送地的IP地址，每次当邮件服务器收到一封邮件时，将发送地的IP地址向RBL查询，就知道是否为垃圾邮件了。&lt;br /&gt;&lt;br /&gt;其主要原理是基于DNS查询，比如&lt;a href="http://anti-spam.org.cn/"&gt;中国反垃圾邮件联盟&lt;/a&gt;的一个RBL是cbl.anti-spam.org.cn，邮件服务器如果想判断某个IP，如a.b.c.d是否给他收录，就拿着d.c.b.a.cbl.anti-spam.org.cn做一次域名查询，如果可以返回IP地址（一般是127.0.0.4之类的），就说明是垃圾邮件发源地，如果返回Host Not Found，就说明不是。这在正常情况下是很好的一个方法，既可以是集中式服务，又通过域名服务，把服务分布到各地的DNS服务器上，不会造成主服务器过载。当然，不要忘记，我们有中国电信。&lt;br /&gt;&lt;br /&gt;中国电信为了推广告，在什么“极速星空”、骑劫http协议之外，还骑劫了DNS，如果你在浏览器输入了一个不存在的DNS，正常情况本来是会显示无法找到服务器，原因是正常的DNS服务器会返回Host Not Found的信息，但是，电信的不会，它会给你返回一个它的广告服务器的地址，这样就会在浏览器显示出一个充满电信广告的“你访问的页面不存在”的网站。&lt;br /&gt;&lt;br /&gt;所以，如果邮件服务器使用的是电信的DNS服务器，“实时黑名单”功能马上就傻眼了，因为所有的IP都不会返回Host Not Found，所有的邮件发送地都是垃圾邮件了。&lt;br /&gt;&lt;br /&gt;还好，米国的雷锋给我们提供了&lt;a href="http://www.opendns.com/"&gt;OpenDNS &lt;/a&gt;一个非常好的DNS服务，只要把DNS服务器设成：&lt;br /&gt;&lt;ul style="margin: 0pt 0pt 5px 15px;"&gt;&lt;li&gt;&lt;b&gt;208.67.222.222&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;208.67.220.220&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;就可以摆脱电信的DNS魔爪了。当然，哪天电信把它给和谐了也不一定，或者干脆一不做二不休，直接在网络层改DNS的内容，那我们也没办法了，移民吧。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-2554137435374826235?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uyzM4gpq8w9qN_1keCPuk-gMqH4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uyzM4gpq8w9qN_1keCPuk-gMqH4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uyzM4gpq8w9qN_1keCPuk-gMqH4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uyzM4gpq8w9qN_1keCPuk-gMqH4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/D9kwafntJfM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/2554137435374826235/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=2554137435374826235" title="1 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/2554137435374826235?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/2554137435374826235?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/D9kwafntJfM/dns.html" title="中国电信DNS骑劫的严重后果" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://yypig.blogspot.com/2007/07/dns.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQEQH84cSp7ImA9WB5TFE8.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-2730083419478815023</id><published>2007-05-29T15:32:00.000+08:00</published><updated>2007-05-29T15:38:21.139+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-05-29T15:38:21.139+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="DCOM" /><category scheme="http://www.blogger.com/atom/ns#" term="微软" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft" /><title>DCOM迷航（二）</title><content type="html">如何使DCOM的服务器可以回调客户端的函数。在尝试了若干人指出的若干方法之后，发现只有&lt;a href="http://www.cipstc.com/bbs/htm_data/7/0602/1216.html"&gt;一种&lt;/a&gt;可以。就是在服务器和客户端创建两个用户名和密码相同的用户，服务器的DCOM指定用这个用户运行，客户端起码要是Power Users，就可以顺利回调。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-2730083419478815023?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/M73mZyI8cLmu5uTMlZzX2QvubEQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/M73mZyI8cLmu5uTMlZzX2QvubEQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/M73mZyI8cLmu5uTMlZzX2QvubEQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/M73mZyI8cLmu5uTMlZzX2QvubEQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/1nq_GX1Jvo0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/2730083419478815023/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=2730083419478815023" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/2730083419478815023?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/2730083419478815023?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/1nq_GX1Jvo0/dcom_29.html" title="DCOM迷航（二）" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://yypig.blogspot.com/2007/05/dcom_29.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYHSH0ycSp7ImA9WBFaGU8.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-7255168705364498163</id><published>2007-05-23T20:00:00.000+08:00</published><updated>2007-05-23T20:08:59.399+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-05-23T20:08:59.399+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IDE" /><category scheme="http://www.blogger.com/atom/ns#" term="开发工具" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><category scheme="http://www.blogger.com/atom/ns#" term="Borland" /><title>Turbo C++ Explorer 不支持ATL</title><content type="html">在编译一个OPC的例子的时候，发现Turbo C++ Explorer不支持ATL。根据&lt;a href="http://qc.borland.com/wc/qcmain.aspx?rc=43673"&gt;Borland的说法&lt;/a&gt;，其实在BDS 2006的时候已经移除了ATL的支持。不知道为什么？BCB 4.0 到 6.0是支持的。&lt;br /&gt;&lt;br /&gt;如果在编译的时候报告找不到vcla1.h，说明你的程序用了ATL。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-7255168705364498163?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hmyl-q0i7sapqkV0QGa5ZhZdULI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hmyl-q0i7sapqkV0QGa5ZhZdULI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hmyl-q0i7sapqkV0QGa5ZhZdULI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hmyl-q0i7sapqkV0QGa5ZhZdULI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/7MJPjtzdwqA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/7255168705364498163/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=7255168705364498163" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/7255168705364498163?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/7255168705364498163?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/7MJPjtzdwqA/turbo-c-explorer-atl.html" title="Turbo C++ Explorer 不支持ATL" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://yypig.blogspot.com/2007/05/turbo-c-explorer-atl.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIFQXw7fCp7ImA9WB5TFE8.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-7045681934924099779</id><published>2007-05-21T03:24:00.000+08:00</published><updated>2007-05-29T15:41:50.204+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-05-29T15:41:50.204+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="DCOM" /><category scheme="http://www.blogger.com/atom/ns#" term="微软" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft" /><title>DCOM迷航（一）</title><content type="html">为了玩&lt;a href="http://www.opcfoundation.org/"&gt;OPC&lt;/a&gt;，必须在机器上让DCOM跑起来。使用dcomcnfg这个工具配置DCOM时，发现一选择“COM+应用程序”这个组就会出现一个错误，查看事件查看器，发现了这样一个错误信息：&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;运行时环境检测到其内部状态存在不一致。这说明进程中存在潜在的不稳定性，可能是由于 COM+ 应用程序中运行自定义组件、COM+&lt;br /&gt;应用程序使用的组件或其他因素引起的。Error in&lt;br /&gt;d:\qxp_slp\com\com1x\src\comsvcs\txprop\dtcinfo.cpp(158), hr = 8000ffff:&lt;br /&gt;TransactionManager-&gt;GetWhereaboutsSize&lt;br /&gt;有关更多信息，请参阅在 &lt;a href="http://go.microsoft.com/fwlink/events.asp"&gt;http://go.microsoft.com/fwlink/events.asp&lt;/a&gt;&lt;br /&gt;的帮助和支持中心。&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;一头雾水。不过微软的出错信息就是天书，否则要个那么大型的MSDN做什么？还好，有Google，搜了一下“qxp_slp”，发现了微软自己的&lt;a href="http://support.microsoft.com/kb/909444/zh-cn"&gt;一篇文章&lt;/a&gt;。大概是说，安装了一个微软的补丁MS05-051后，%windir%\registration目录的权限会出现问题，会导致COM+出现很多问题，其中一个会提示上面这个信息。按照微软的指示，更改了权限后，发现结果还是一样。“COM+应用程序”照样出错。后来醒目一点，把事件查看器里面的打叉的记录一条一条调出来看，发现了一个问题：&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;正在运行 MS DTC 服务的帐户无效。 如果使用 Microsoft Management Console (MMC)&lt;br /&gt;中的“服务”管理单元更改了服务帐户信息，就会发生这种情况。 MS DTC 服务将继续启动。请确认使用“组件服务管理器”更新了 MS DTC 服务帐户信息。&lt;br /&gt;有关更多信息，请参阅在 &lt;a href="http://go.microsoft.com/fwlink/events.asp"&gt;http://go.microsoft.com/fwlink/events.asp&lt;/a&gt;&lt;br /&gt;的帮助和支持中心。 &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;发现这条出错信息之后，才会不断地出现第一条出错信息，看了这是罪魁祸首。同样的，不知道它在说什么。还好，又google了一下，又在微软那里查到了&lt;a href="http://support.microsoft.com/?scid=kb%3Ben-us%3B903944&amp;x=16&amp;amp;y=6"&gt;解决办法&lt;/a&gt;。在强行为MS&lt;br /&gt;DTC服务创建了NT AUTHORITY\NetworkService登录用户后，一切正常。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-7045681934924099779?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Spy0kYwUAb-XUIB_7_mgcD50Kb4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Spy0kYwUAb-XUIB_7_mgcD50Kb4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Spy0kYwUAb-XUIB_7_mgcD50Kb4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Spy0kYwUAb-XUIB_7_mgcD50Kb4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/pGgvtSeqX2U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/7045681934924099779/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=7045681934924099779" title="1 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/7045681934924099779?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/7045681934924099779?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/pGgvtSeqX2U/dcom.html" title="DCOM迷航（一）" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://yypig.blogspot.com/2007/05/dcom.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYDRXk5cCp7ImA9WBFaFE8.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-3860735366904648392</id><published>2007-05-18T00:39:00.000+08:00</published><updated>2007-05-18T01:49:34.728+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-05-18T01:49:34.728+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IDE" /><category scheme="http://www.blogger.com/atom/ns#" term="开发工具" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><category scheme="http://www.blogger.com/atom/ns#" term="Borland" /><title>Borland回来了</title><content type="html">其实是CodeGear带着原Borland的IDE回来了。CodeGear是Borland没卖成IDE之后，把IDE分拆出来成立的新公司。说Borland回来是因为Borland这个名字太响了，是程序员们的Heavenly Jerusalem。在猛禽那里看到《&lt;a href="http://blog.csdn.net/raptor/archive/2007/05/15/1609484.aspx"&gt;在TCX中使用SQLite3&lt;/a&gt;》，才知道CodeGear重新启用了Borland的Turbo商标，推出了Turbo系列的开发工具，其中有我最喜欢的Turbo C++ Builder 2006，分Professional和Explorer两个版本，Explorer是免费的，除了不能使用第三方VCL控件外，没有什么限制，基本和C++ Builder 2006一样。我还特地看了一下它的License，发现可以用于商业软件开发。我毫不犹豫地下了一个试用，装了一大堆.Net的支持，终于看到了熟悉而陌生的界面了。把一个7年前用C++ Builder 4.0做的多线程+数据库+串口通讯的程序放进去编译，发现大概需要改动一两处代码，主要是一些定义的小改动，程序基本就可以编译通过并跑起来，简直太棒了，就象一个多年不见的感情很好的情人又回到身边一样，往事又历历在目。&lt;br /&gt;&lt;br /&gt;当年第一个C的开发环境就是Turbo C 2.0，后来用了Turbo Pascal 5.5和6.0，再后来是Turbo C++ 3.0。Delphi 1.0 16位版让我在Windows 3.1上见识了Visual的开发。当然，之后为了工作需要，开始使用Power Builder 5.0和6.0，再后来又因为需要开发多线程应用，使用了C++ Builder 4.0，感受到了VCL的魅力，BCB虽然用了Pascal写成的VCL库，影响了它的编译速度，但也继承了Delphi的稳定性，对于Windows的线程也做了很好的封装，而且可以直接调用Windows的API，所以当时写成的程序是可以在Windows NT上连续不间断运行几个月不当机的。以至于后来还是工作需要，使用VC++ 6.0的时候，我大骂了一声：“这也敢称自己Visual”。后来由于Borland的犹豫不决，好多人离它而去了。而且开源运动蓬勃发展，自己的工作也转向了Unix领域，就开始用vi和gcc了。对于Windows下的本地开发，一直也有关注，但始终找不到一个好的方案，受开源影响，始终很想找一个免费的开发方案。Cygwin和MinGW的效率太差，而且没有好的窗体库和它们配合，用MinGW编译wxWidgets简直是恶梦。微软的免费VC++ Express 2005实在太差。所以，CodeGear的免费工具来得实在太及时了。而且从CodeGear最近的动作来看，Borland IDE的复兴开始了，一个接着一个的惊喜，从Delphi For PHP，到宣布要推出Delphi For Ruby on Rails。我决定重投Borland的怀抱，毕竟一个免费的强健的可视化开发工具太吸引人了。&lt;br /&gt;&lt;br /&gt;相关链接：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://gordonliwei.spaces.live.com/blog/cns!CCE1F10BD8108687!1357.entry"&gt;CodeGear 宣佈PHP RAD開發工具 : Delphi For PHP&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gordonliwei.spaces.live.com/blog/cns!CCE1F10BD8108687!1552.entry"&gt;CodeGear的RoR開發工具終於開始露出神秘的面貌&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-3860735366904648392?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/m04Sk1ePZ3NHtBf0kYQ8ECuAlsE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/m04Sk1ePZ3NHtBf0kYQ8ECuAlsE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/m04Sk1ePZ3NHtBf0kYQ8ECuAlsE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/m04Sk1ePZ3NHtBf0kYQ8ECuAlsE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/Lag72GEolks" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/3860735366904648392/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=3860735366904648392" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/3860735366904648392?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/3860735366904648392?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/Lag72GEolks/borland.html" title="Borland回来了" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://yypig.blogspot.com/2007/05/borland.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMMRXs7fyp7ImA9WB5TFE8.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-3136309605220353348</id><published>2007-05-16T17:12:00.000+08:00</published><updated>2007-05-29T15:41:24.507+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-05-29T15:41:24.507+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="开源" /><category scheme="http://www.blogger.com/atom/ns#" term="FreeBSD" /><category scheme="http://www.blogger.com/atom/ns#" term="自由软件" /><category scheme="http://www.blogger.com/atom/ns#" term="Linux" /><category scheme="http://www.blogger.com/atom/ns#" term="微软" /><title>谁说自由软件运动已死</title><content type="html">今天好多网站上都在说“&lt;a href="http://linux.solidot.org/article.pl?sid=07/05/15/0130244&amp;from=rss"&gt;微软主管声称自由软件运动已死&lt;/a&gt;”（&lt;a href="http://www.bangkokpost.com/090507_Database/09May2007_data05.php"&gt;英文&lt;/a&gt;）：&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;前IBM员工现微软首席平台战略主管，微软Linux实验室负责人Bill Hilf狂言宣称要&lt;a href="http://www.bangkokpost.com/090507_Database/09May2007_data05.php"&gt;剥开围绕在开源软件周围的神话&lt;/a&gt;。“自由软件运动正走向死亡，Linux在2007年不再存在，你看就连Linus都有一个工作。”Linux&lt;br /&gt;kernel是由全职雇员维护的，拥有优先认股权。大部分人在IBM，Oracle，RedHat等商业公司工作。这意味着什么？这说明Linux在&lt;br /&gt;2007年不再存在（我觉得他疯了）。世界上没有什么免费软件运动。如果说Linux代表了爱，和平和和谐，这是错误的，再说一遍没有自由软件运动，这都是商业行为。是由大的商业公司如IBM和小的商业公司如Ubuntu组成的。Hilf表示微软对开源感兴趣也是出于商业原因，不是什么伟大的利他性、爱或是营销手段。&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;微软又在做它的FUD（Fear, Uncerntainty and Doubt）战略了。这次采用的是偷梁换柱的手法。首先，Linux不是开源的全部，作为开源操作系统，FreeBSD早就解决了源代码和Unix专利的授权问题。Linux其实应该叫GNU-Linux，除了核心之外，其余的部分，从编译器到系统库（GLIBC）大量采用&lt;a href="http://www.gnu.org"&gt;GNU&lt;/a&gt;的东西。GNU是GNU is Not Unix的缩写，是Richard Stallman在多年前，看不惯大公司垄断操作系统而建立的项目，所有的东西几乎都是从头写起，全部开源，而且都是基于GPL，目的就是为了这些源代码不至于给某些公司封闭起来，而是大家可以共享所有人的成果，真正的人人为我，我为人人。所以GNU才是开源运动的发源地。开源运动的结果是推动了信息产业的快速向前发展。问问现在多少人在用GCC就可以了。所以，即使Linux商业化了，我们仍然有其他选择，可以用FreeBSD，可以用各种其他的开源操作系统，GNU甚至有自己的内核叫Hurd。更何况在众多Linux的商业发行版之外，还有一个完全遵循GNU方式的发行版&lt;a href="www.debian.org"&gt;Debian&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;其次，Linus Torvalds也不是开源运动的领袖。真正的领袖是Richard Stallman。他，总是“风尘仆仆，行囊相随，四处布道。他带着一台笔记本电脑，但这不是他个人的，而是属于自由软件基金（FSF）。其实，Richard Stallman 从来就没有拥有过一台自己的计算机。也从来只用自由软件（当然他从来没有用过Windows）。而且，他也没有自己的汽车、电视和房产。这位46岁的单身汉节俭地居住在一间租来的房子里。已有15年了，没有领取过一个月的正式工资。因为他的工作就是使软件获得自由。”&lt;br /&gt;&lt;br /&gt;所以，微软应该去看看Sourceforge和Freshmeat上有多少开源项目，有多少人在使用开源项目，再来说自由软件有没有死。&lt;br /&gt;&lt;br /&gt;从我自己的例子再来说明，自由软件运动为什么不会死。微软曾经有一段时间免费提供VC++ Express 2005下载，我庆幸了很久，微软也终于肯把编译器免费提供了。实际上发现我错了，微软花了一年时间也没解决“&lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=132651&amp;amp;SiteID=1"&gt;updating intellisense... &lt;/a&gt;”的问题，最后问题解决了，却发现最终解决问题的补丁没法下载，一定要订阅MSDN才可以拿到。这就是Richard Stallman说的不“自由”，要么我选择不用微软的产品，要么就要忍受这种非常不公平的待遇。相反，我在一个项目里面用了开源的产品，结果发现它在处理中文时候有问题，我马上浏览源代码，很快就发现了问题所在，我一方面将修改发给了项目的开发团队，他们承诺会在下一个版本纠正，另外一方面，我自己修改了源代码，更正错误，我的软件马上就可以正常工作了，所以这样才是使用软件的“自由”。&lt;br /&gt;&lt;br /&gt;我相信微软还是可以继续强大很久，我也承认微软产品的易用程度、功能、普及程度远远高于自由软件。但是自由软件运动不会死，而且会继续扮演着非常重要的角色，而且将会有更多的人参与到里面来。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-3136309605220353348?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/nOEpLXkbfk7LsMtEzqFVT7wZQWs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nOEpLXkbfk7LsMtEzqFVT7wZQWs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/nOEpLXkbfk7LsMtEzqFVT7wZQWs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/nOEpLXkbfk7LsMtEzqFVT7wZQWs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/s6lrkXRb_YI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/3136309605220353348/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=3136309605220353348" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/3136309605220353348?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/3136309605220353348?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/s6lrkXRb_YI/blog-post.html" title="谁说自由软件运动已死" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://yypig.blogspot.com/2007/05/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYNQXc8eip7ImA9WBFaFE8.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-797656823947290166</id><published>2007-04-15T15:02:00.000+08:00</published><updated>2007-05-18T01:49:50.972+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-05-18T01:49:50.972+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="IDE" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse" /><title>升级Eclipse要注意的问题</title><content type="html">将Eclipse 3.1升级到3.2.2，用回原来的Workspace，运行SWT的应用程序时，会出现下列的错误：&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;color:#ff0000;"&gt;Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-win32-3236 in java.library.path&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;如果是升级到3.2，会出现：&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;color:#ff0000;"&gt;Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-win32-3232 in java.library.path&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;这两个错误原来在独立运行SWT应用程序时，支持SWT运行的dll找不到时才会出现，为什么在Eclipse里面也会出现这两个错误，原来在Eclipse运行SWT应用程序时，使用到的dll是放在Workspace下的.metadata\.plugins\org.eclipse.pde.ui\xxxx.swt中，由于用的是原来的Workspace，所以这个目录下的dll还是旧版本3.1的，但程序使用的jar的库是3.2.2的，运行时找不到正确版本的Dll就会出错。所以升级完Eclipse，记住要替换这个目录下的dll，原来的SWT应用程序才能在Eclipse下正常运行。RCP程序更麻烦，为了兼容3.1的模式，一旦判断使用的是旧版本的Workspace，会在Eclipse所在的盘的根目录下创建target/eclipse目录把3.1的所有RCP支撑库全部放在这里，运行也会出错，目前还找不到解决的办法。&lt;br /&gt;&lt;br /&gt;所以升级Eclipse，最好重新创建新的Workspace，再把原来Workspace的程序的source拷贝过去，会少很多问题。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-797656823947290166?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Fi3Cb56YMtRw0MjWFZ5FAYonGGY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Fi3Cb56YMtRw0MjWFZ5FAYonGGY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Fi3Cb56YMtRw0MjWFZ5FAYonGGY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Fi3Cb56YMtRw0MjWFZ5FAYonGGY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/UikKvcnO0Og" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/797656823947290166/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=797656823947290166" title="1 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/797656823947290166?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/797656823947290166?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/UikKvcnO0Og/eclipse.html" title="升级Eclipse要注意的问题" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://yypig.blogspot.com/2007/04/eclipse.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQNRn8zeyp7ImA9WBFWFUQ.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-4280181046067878621</id><published>2007-04-03T17:36:00.000+08:00</published><updated>2007-04-03T17:59:57.183+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-04-03T17:59:57.183+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="FreeBSD" /><title>拥抱FreeBSD</title><content type="html">&lt;a href="http://www.gseeker.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Gseeker&lt;/span&gt;&lt;/a&gt;报道了《&lt;a href="http://www.gseeker.com/50226711/c20ccceieyoutubebloggere_85694.php"&gt;全美前20大网站的停机时间：&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;YouTube&lt;/span&gt;及Blogger最长&lt;/a&gt;》，其中最好的是Yahoo!，全年的停机时间为0。Yahoo!使用了什么操作系统：FreeBSD。&lt;br /&gt;&lt;br /&gt;根据“&lt;a href="http://www.xucx.com/blog/post/dinglei.html"&gt;我志愿，我成就&lt;/a&gt;”的丁磊同学的&lt;a href="http://www.rainbow6.cn/article.asp?id=362"&gt;说法&lt;/a&gt;，&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Hotmail&lt;/span&gt;其实也是运行在FreeBSD上，但是&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Hotmail&lt;/span&gt;是我用过的最不稳定的邮件系统。难道好东西一到了微软的手上就玩完了？确实是这样，但是错不在FreeBSD，而是微软把&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Hotmail&lt;/span&gt;从FreeBSD上迁移到了Windows 2000：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/technet/interopmigration/case/hotmail/hotapp.mspx"&gt;Appendices for Migrating Microsoft Hotmail from FreeBSD to Microsoft Windows 2000 Technical Case Study&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theregister.co.uk/2002/11/21/ms_paper_touts_unix/"&gt;MS paper touts Unix in Hotmail's Win2k switch&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;连苹果的Mac OS X也是基于FreeBSD的，所以，我们有什么理由不拥抱FreeBSD呢？&lt;/p&gt;&lt;p&gt;相关链接：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://royal.pingdom.com/?p=116" rel="bookmark"&gt;Downtime in 2007 for the 20 most popular websites&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ictp.trieste.it/~cfonda/sudan/OSs/references/freeBSD/Yahoo_and_FreeBSD.html"&gt;Yahoo! and FreeBSD&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.aka.org.cn/Magazine/Aka3/other-yahoo.html"&gt;Yahoo! and FreeBSD（中文翻译）&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-4280181046067878621?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cAKhFj7qw2lLu9d07-qO33wwcNg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cAKhFj7qw2lLu9d07-qO33wwcNg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cAKhFj7qw2lLu9d07-qO33wwcNg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cAKhFj7qw2lLu9d07-qO33wwcNg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/Sev94mpF8ug" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/4280181046067878621/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=4280181046067878621" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/4280181046067878621?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/4280181046067878621?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/Sev94mpF8ug/freebsd.html" title="拥抱FreeBSD" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://yypig.blogspot.com/2007/04/freebsd.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04ASHYzeip7ImA9WBFWFU8.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-525347072685854316</id><published>2007-04-02T22:58:00.000+08:00</published><updated>2007-04-02T22:59:09.882+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-04-02T22:59:09.882+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="编程" /><category scheme="http://www.blogger.com/atom/ns#" term="C" /><title>offsetof原来是个很简单的宏</title><content type="html">看一些人的source的时候，发现他们使用offsetof 求某个结构体的特定成员在结构体里面的偏移量。原来以为很复杂，在/usr/include/linux/hfs_sysdep.h找到它的定义：&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;color:#3333ff;"&gt;#define offsetof(TYPE, MEMB) ((size_t) &amp;((TYPE *)0)-&gt;MEMB)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;太巧妙了！！！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-525347072685854316?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/oyw6IL_imwZ7PBOcEefZPuHQZTM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oyw6IL_imwZ7PBOcEefZPuHQZTM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/oyw6IL_imwZ7PBOcEefZPuHQZTM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oyw6IL_imwZ7PBOcEefZPuHQZTM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/UeLfWKa1XJs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/525347072685854316/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=525347072685854316" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/525347072685854316?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/525347072685854316?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/UeLfWKa1XJs/offsetof.html" title="offsetof原来是个很简单的宏" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://yypig.blogspot.com/2007/04/offsetof.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08HRnc9fCp7ImA9WBFWFU8.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-7355172615014529317</id><published>2004-12-19T06:49:00.000+08:00</published><updated>2007-04-02T22:57:17.964+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-04-02T22:57:17.964+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="编程" /><category scheme="http://www.blogger.com/atom/ns#" term="C" /><title>结构体最后的长度为0或者1的数组</title><content type="html">&lt;p&gt;在Linux系统里，/usr/include/linux/if_pppox.h里面有这样一个结构：&lt;br /&gt;&lt;span style="font-family:Courier New;color:#000000;"&gt;&lt;span style="color:#3333ff;"&gt;struct pppoe_tag {&lt;br /&gt;__u16 tag_type;&lt;br /&gt;__u16 tag_len;&lt;br /&gt;char tag_data[0];&lt;br /&gt;} __attribute ((packed));&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;最后一个成员为可变长的数组，对于TLV（Type-Length-Value）形式的结构，或者其他需要变长度的结构体，用这种方式定义最好。使用起来非常方便，创建时，malloc一段结构体大小加上可变长数据长度的空间给它，可变长部分可按数组的方式访问，释放时，直接把整个结构体free掉就可以了。例子如下：&lt;br /&gt;&lt;span style="font-family:Courier New;color:#3333ff;"&gt;struct pppoe_tag *sample_tag;&lt;br /&gt;__u16 sample_tag_len = 10;&lt;br /&gt;sample_tag = (struct pppoe_tag *)malloc(sizeof(struct pppoe_tag)+sizeof(char)*sample_tag_len);&lt;br /&gt;sample_tag-&amp;gt;tag_type = 0xffff;&lt;br /&gt;sample_tag-&amp;gt;tag_len = sample_tag_len;&lt;br /&gt;sample_tag-&amp;gt;tag_data[0]=....&lt;br /&gt;...&lt;br /&gt;&lt;/span&gt;释放时，&lt;br /&gt;&lt;span style="font-family:Courier New;color:#3333ff;"&gt;free(sample_tag)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;是否可以用 char *tag_data 代替呢？其实它和 char *tag_data 是有很大的区别，为了说明这个问题，我写了以下的程序：&lt;br /&gt;例1：test_size.c&lt;br /&gt;&lt;span style="font-family:Courier New;color:#3333ff;"&gt;10 struct tag1&lt;br /&gt;20 {&lt;br /&gt;30 int a;&lt;br /&gt;40 int b;&lt;br /&gt;50 }__attribute ((packed));&lt;br /&gt;60&lt;br /&gt;70 struct tag2&lt;br /&gt;80 {&lt;br /&gt;90 int a;&lt;br /&gt;100 int b;&lt;br /&gt;110 char *c;&lt;br /&gt;120 }__attribute ((packed));&lt;br /&gt;130&lt;br /&gt;140 struct tag3&lt;br /&gt;150 {&lt;br /&gt;160 int a;&lt;br /&gt;170 int b;&lt;br /&gt;180 char c[0];&lt;br /&gt;190 }__attribute ((packed));&lt;br /&gt;200&lt;br /&gt;210 struct tag4&lt;br /&gt;220 {&lt;br /&gt;230 int a;&lt;br /&gt;240 int b;&lt;br /&gt;250 char c[1];&lt;br /&gt;260 }__attribute ((packed));&lt;br /&gt;270&lt;br /&gt;280 int main()&lt;br /&gt;290 {&lt;br /&gt;300 struct tag2 l_tag2;&lt;br /&gt;310 struct tag3 l_tag3;&lt;br /&gt;320 struct tag4 l_tag4;&lt;br /&gt;330&lt;br /&gt;340 memset(&amp;l_tag2,0,sizeof(struct tag2));&lt;br /&gt;350 memset(&amp;l_tag3,0,sizeof(struct tag3));&lt;br /&gt;360 memset(&amp;l_tag4,0,sizeof(struct tag4));&lt;br /&gt;370&lt;br /&gt;380 printf("size of tag1 = %d\n",sizeof(struct tag1));&lt;br /&gt;390 printf("size of tag2 = %d\n",sizeof(struct tag2));&lt;br /&gt;400 printf("size of tag3 = %d\n",sizeof(struct tag3));&lt;br /&gt;410&lt;br /&gt;420 printf("l_tag2 = %p,&amp;l_tag2.c = %p,l_tag2.c = %p\n",&amp;amp;amp;amp;amp;l_tag2,&amp;l_tag2.c,l_tag2.c);&lt;br /&gt;430 printf("l_tag3 = %p,l_tag3.c = %p\n",&amp;amp;l_tag3,l_tag3.c);&lt;br /&gt;440 printf("l_tag4 = %p,l_tag4.c = %p\n",&amp;amp;l_tag4,l_tag4.c);&lt;br /&gt;450 exit(0);&lt;br /&gt;460 }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;__attribute ((packed)) 是为了强制不进行4字节对齐，这样比较容易说明问题。&lt;br /&gt;程序的运行结果如下：&lt;br /&gt;&lt;span style="font-family:Courier New;color:#3333ff;"&gt;size of tag1 = 8&lt;br /&gt;size of tag2 = 12&lt;br /&gt;size of tag3 = 8&lt;br /&gt;size of tag4 = 9&lt;br /&gt;l_tag2 = 0xbffffad0,&amp;l_tag2.c = 0xbffffad8,l_tag2.c = (nil)&lt;br /&gt;l_tag3 = 0xbffffac8,l_tag3.c = 0xbffffad0&lt;br /&gt;l_tag4 = 0xbffffabc,l_tag4.c = 0xbffffac4&lt;/span&gt;&lt;/p&gt;&lt;p&gt;从上面程序和运行结果可以看出：tag1本身包括两个32位整数，所以占了8个字节的空间。tag2包括了两个32位的整数，外加一个char *的指针，所以占了12个字节。tag3才是真正看出char c[0]和char *c的区别，char c[0]中的c并不是指针，是一个偏移量，这个偏移量指向的是a、b后面紧接着的空间，所以它其实并不占用任何空间。tag4更加补充说明了这一点。所以，上面的struct pppoe_tag的最后一个成员如果用char *tag_data定义，除了会占用多4个字节的指针变量外，用起来会比较不方便：方法一，创建时，可以首先为struct pppoe_tag分配一块内存，再为tag_data分配内存，这样在释放时，要首先释放tag_data占用的内存，再释放pppoe_tag占用的内存；方法二，创建时，直接为struct pppoe_tag分配一块struct pppoe_tag大小加上tag_data的内存，从例一的420行可以看出，tag_data的内容要进行初始化，要让tag_data指向strct pppoe_tag后面的内存。&lt;br /&gt;&lt;span style="font-family:Courier New;color:#3333ff;"&gt;struct pppoe_tag {&lt;br /&gt;__u16 tag_type;&lt;br /&gt;__u16 tag_len;&lt;br /&gt;char *tag_data;&lt;br /&gt;} __attribute ((packed));&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;color:#3333ff;"&gt;struct pppoe_tag *sample_tag;&lt;br /&gt;__u16 sample_tag_len = 10;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;方法一：&lt;br /&gt;&lt;span style="font-family:Courier New;color:#3333ff;"&gt;sample_tag = (struct pppoe_tag *)malloc(sizeof(struct pppoe_tag));&lt;br /&gt;sample_tag-&amp;gt;tag_len = sample_tag_len;&lt;br /&gt;sample_tag-&amp;gt;tag_data = malloc(sizeof(char)*sample_tag_len);&lt;br /&gt;sample_tag-&amp;gt;tag_data[0]=...&lt;br /&gt;&lt;/span&gt;释放时：&lt;br /&gt;&lt;span style="font-family:Courier New;color:#3333ff;"&gt;free(sample_tag-&amp;gt;tag_data);&lt;br /&gt;free(sample_tag);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;方法二：&lt;br /&gt;&lt;span style="font-family:Courier New;color:#3333ff;"&gt;sample_tag = (struct pppoe_tag *)malloc(sizeof(struct pppoe_tag)+sizeof(char)*sample_tag_len);&lt;br /&gt;sample_tag-&amp;gt;tag_len = sample_tag_len;&lt;br /&gt;sample_tag-&amp;gt;tag_data = ((char *)sample_tag)+sizeof(struct pppoe_tag);&lt;br /&gt;sample_tag-&amp;gt;tag_data[0]=...&lt;br /&gt;&lt;/span&gt;释放时：&lt;br /&gt;&lt;span style="font-family:Courier New;color:#3333ff;"&gt;free(sample_tag);&lt;br /&gt;&lt;/span&gt;所以无论使用那种方法，都没有char tag_data[0]这样的定义来得方便。&lt;/p&gt;&lt;p&gt;讲了这么多，其实本质上涉及到的是一个C语言里面的数组和指针的区别问题。char a[1]里面的a和char *b的b相同吗？《Programming Abstractions in C》（Roberts, E. S.，机械工业出版社，2004.6）82页里面说：“arr is defined to be identical to &amp;arr[0]”。也就是说，char a[1]里面的a实际是一个常量，等于&amp;amp;a[0]。而char *b是有一个实实在在的指针变量b存在。所以，a=b是不允许的，而b=a是允许的。两种变量都支持下标式的访问，那么对于a[0]和b[0]本质上是否有区别？我们可以通过一个例子来说明。&lt;/p&gt;&lt;p&gt;例二：&lt;br /&gt;&lt;span style="font-family:Courier New;color:#3333ff;"&gt;10 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;20 #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;30&lt;br /&gt;40 int main()&lt;br /&gt;50 {&lt;br /&gt;60 char a[10];&lt;br /&gt;70 char *b;&lt;br /&gt;80&lt;br /&gt;90 a[2]=0xfe;&lt;br /&gt;100 b[2]=0xfe;&lt;br /&gt;110 exit(0);&lt;br /&gt;120 }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;编译后，用objdump可以看到它的汇编：&lt;br /&gt;&lt;span style="font-family:Courier New;color:#3333ff;"&gt;080483f0 &amp;lt;main&amp;gt;:&lt;br /&gt;80483f0: 55 push %ebp&lt;br /&gt;80483f1: 89 e5 mov %esp,%ebp&lt;br /&gt;80483f3: 83 ec 18 sub $0x18,%esp&lt;br /&gt;80483f6: c6 45 f6 fe movb $0xfe,0xfffffff6(%ebp) ;直接将0xfe写入&amp;a[0]+2&lt;br /&gt;80483fa: 8b 45 f0 mov 0xfffffff0(%ebp),%eax ;先取出b的内容&lt;br /&gt;80483fd: 83 c0 02 add $0x2,%eax ;加上2的偏移量&lt;br /&gt;8048400: c6 00 fe movb $0xfe,(%eax) ;间接寻址，写入%eax所指向的地址&lt;br /&gt;8048403: 83 c4 f4 add $0xfffffff4,%esp&lt;br /&gt;8048406: 6a 00 push $0x0&lt;br /&gt;8048408: e8 f3 fe ff ff call 8048300 &amp;lt;_init+0x68&amp;gt;&lt;br /&gt;804840d: 83 c4 10 add $0x10,%esp&lt;br /&gt;8048410: c9 leave&lt;br /&gt;8048411: c3 ret&lt;br /&gt;8048412: 8d b4 26 00 00 00 00 lea 0x0(%esi,1),%esi&lt;br /&gt;8048419: 8d bc 27 00 00 00 00 lea 0x0(%edi,1),%edi&lt;/span&gt;&lt;/p&gt;&lt;p&gt;可以看出，a[2]＝0xfe是直接寻址，直接将0xfe写入&amp;a[0]+2的地址，而b[2]=0xfe是间接寻址，先将b的内容（地址）拿出来，加2，再0xfe写入计算出来的地址。所以a[0]和b[0]本质上是不同的。但当数组作为参数时，和指针就没有区别了。&lt;br /&gt;&lt;span style="font-family:Courier New;color:#3333ff;"&gt;int do1(char a[],int len);&lt;br /&gt;int do2(char *a,int len);&lt;br /&gt;&lt;/span&gt;这两个函数中的a并无任何区别。都是实实在在存在的指针变量。&lt;/p&gt;&lt;p&gt;顺便再说一下，对于struct pppoe_tag的最后一个成员的定义是char tag_data[0]，某些编译器不支持长度为0的数组的定义，在这种情况下，只能将它定义成char tag_data[1]，使用方法相同。 &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-7355172615014529317?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pASSq44nhiqCj2Rg29Mdjt7E5cM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pASSq44nhiqCj2Rg29Mdjt7E5cM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pASSq44nhiqCj2Rg29Mdjt7E5cM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pASSq44nhiqCj2Rg29Mdjt7E5cM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/tyANvKWrC1o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/7355172615014529317/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=7355172615014529317" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/7355172615014529317?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/7355172615014529317?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/tyANvKWrC1o/01.html" title="结构体最后的长度为0或者1的数组" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://yypig.blogspot.com/2004/12/01.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEAQH8zcCp7ImA9WBFWFU8.&quot;"><id>tag:blogger.com,1999:blog-3866023674142722348.post-342370556009446683</id><published>2004-09-24T06:08:00.000+08:00</published><updated>2007-04-02T22:37:21.188+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-04-02T22:37:21.188+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="FreeBSD" /><title>FreeBSD Java SDK一个需要注意的地方</title><content type="html">在FreeBSD 4.x 和 5.x 上用Linux兼容模式运行jdk时，会出现这样一个警告：&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;Java HotSpot(TM) Client VM warning: Can't detect initial thread stack location&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;不知道会有什么问题，总之觉得不是很好，在Google上查了一下，有人说要重编Kernel，有人给出了我认为是正确的解决办法：Java出现这个警告的主要原因是找不相应的进程的信息。因为是Linux兼容模式，Linux下的/proc实际上给映射到了FreeBSD下的/compat/linux/proc目录下，这实际上也是一种文件系统，在FreeBSD下称为linprocfs，默认的时候并没有给mount起来。所以在运行Java前一定要先把/compat/linux/proc给mount起来。具体做法如下：&lt;br /&gt;&lt;br /&gt;1、在/etc/fstab 中添加一行：&lt;br /&gt;linprocfs /compat/linux/proc linprocfs rw 0 0&lt;br /&gt;&lt;br /&gt;2、打入命令：&lt;br /&gt;mount /compat/linux/proc/&lt;br /&gt;&lt;br /&gt;再运行Java就不会有原来的错误信息了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3866023674142722348-342370556009446683?l=yypig.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kCNioQzbwoj68olYDVCV2emlcbY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kCNioQzbwoj68olYDVCV2emlcbY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/kCNioQzbwoj68olYDVCV2emlcbY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kCNioQzbwoj68olYDVCV2emlcbY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/yyp/~4/s6ztq_u-CB8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://yypig.blogspot.com/feeds/342370556009446683/comments/default" title="帖子评论" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=3866023674142722348&amp;postID=342370556009446683" title="0 条评论" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/342370556009446683?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3866023674142722348/posts/default/342370556009446683?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/yyp/~3/s6ztq_u-CB8/freebsd-java-sdk.html" title="FreeBSD Java SDK一个需要注意的地方" /><author><name>Kevin</name><uri>http://www.blogger.com/profile/14711467167463076551</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://yypig.blogspot.com/2007/04/freebsd-java-sdk.html</feedburner:origLink></entry></feed>

