<?xml version="1.0" encoding="gb2312"?>

<rss version="2.0">
    <channel>
    <title>永远自由的心</title>
    <link>http://xiao_jiang.blog.tianya.cn/</link>
    <description>just me like
    </description>

    <item>
      <title><![CDATA[应该严厉打击论文抄袭和一稿多投]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2007-4-1星期日(Sunday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=9093035&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>NND，今天是4.1。
下了二篇论文一看，真是无语，几乎一模一样，愚人啊！
列举如下：

下了二篇论文一看，真是无语，几乎一模一样，愚人啊！
列举如下：

下了二篇论文一看，真是无语，几乎一模一样，愚人啊！
列举如下：

1、文章名：作引导设备的DOC 闪存设计
   发表刊物和投稿日期：计算机工程。2004.6.2
   作者：刘朝苹1，杜 皎2，冯登国2
   1.中国科学技术大学研究生院，北京 100740；2. 信息安全国家重点试验室

1、文章名：M -SYSTEM DOC 闪存盘的原理和开发应用
   发表刊物和投稿日期：小型微型计算机系统。2004.6.22
   作者：杜　皎1, 2, 荆继武1, 李国辉2
   1(中国科学院研究生院信息安全国家重点实验室, 北京100039)
  2(国防科学技术大学五院, 湖南长沙410073)

  TMD，这些贱人，整天就是浪费国家的金钱，学术腐败。
  有没有专门举报这些论文做假的网站，把这些sb全部列个表出来，让这些人见见太阳，这些老板们也不知道干吗的，一个个教授博导院士也只是如此而已，垃圾！]]></description>
	  <comments>2007-4-1 17:03:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=9093035&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[OpenVPN-linux]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2006-1-19星期四(Thursday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3884108&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>简介 OpenVPN<BR><BR>OpenVPN 是一个基于 OpenSSL 库的应用层 VPN 实现。和传统 VPN 相比，它的优点是简单易用。详细信息可以参考 http://www.openvpn.net。<BR><BR><BR><BR>这里简单介绍一下基于 CA ，采用数字证书认证，可以划分多个网段的 OpenVPN 配置方法。<BR><BR><BR><BR>Note 1: VNN 和 OpenVPN 很像。<BR><BR>Note 2: 这个东西对于突破国内网络封锁，保护通信自由很有意义，值得大力推广。<BR><BR>安装 OpenVPN<BR><BR>Linux 下的安装<BR><BR>首先，Kernel 必须支持 TUN/TAP 设备。在 2.6.x 内核中，对应的 Kernel 选项是 “Universal TUN/TAP device driver support”。<BR><BR>确认 Kernel 支持 TUN/TAP 后，可以下载 OpenVPN 编译并安装。这一步很 easy，不多说了。<BR><BR>Windows 下的安装<BR><BR>从 http://www.openvpn.se 下载安装包安装，这里的安装包带一个 Client GUI 工具，很好用。<BR><BR>配置 OpenVPN<BR><BR>配置 OpenVPN Server<BR><BR>只说明在 Linux 下的配置。Windows 类似。创建 /etc/vpn/server.conf，内容如下：<BR>port 1494<BR>proto udp<BR>dev tun<BR>ca ca.crt<BR>cert server.crt<BR>key server.key<BR>dh dh1024.pem<BR><BR>server 10.1.0.0 255.255.255.0<BR><BR>push "route 10.1.0.0 255.255.255.0"<BR>push "route 10.1.1.0 255.255.255.0"<BR><BR>client-config-dir /etc/vpn/ccd<BR>route 10.1.1.0 255.255.255.0<BR><BR>client-to-client<BR><BR>keepalive 10 120<BR><BR>user nobody<BR>group nobody<BR><BR>persist-key<BR>persist-tun<BR><BR>log-append openvpn.log<BR>verb 3<BR><BR><BR><BR>其中 ca.crt, server.key,server.crt 可以用以前贴出的 ca 工具创建，dh1024.pem 用 OpenVPN 自带的工具创建。<BR><BR><BR><BR>这个配置文件创建了两个网段：10.1.0.* 和 10.1.1.*，VPN 服务器将从这两个网段中给 Client 分配 IP 地址。VPN Server 自身 IP 将是 10.0.0.1。<BR><BR>“client-config-dir”指明 Client 的专有配置文件目录。在这个目录下可以针对特定用户建立配置文件。例如，要为用户 abc 指定一个 IP 地址（如10.1.1.5）而不是让 VPN Server 自动分配，可以在配置目录/etc/vpn/ccd下建立一个 abc 文件，内容如下：<BR><BR>ifconfig-push 10.1.1.5 10.1.1.6<BR><BR><BR><BR>那么 VPN Server 就会自动给 abc 用户分配 10.1.1.5 这个地址。注意第一个IP地址 的最后一个数字（这里是 5）必须是 4*n + 1 的数。<BR><BR><BR>问题是，VPN Server 怎么知道哪个用户是 abc 呢？它是 Client 数字证书中的 Common Name 域来判断的。就是说，在连接协商时如果 Client 端数字证书的 Common Name 是 abc，那么 VPN Server 就找配置目录下 abc 这个文件。<BR><BR><BR>配置 OpenVPN Client<BR><BR>在 Client 机器上 OpenVPN 安装目录的 config 目录下建立如下 client.ovpn 文件：<BR><BR><BR>client<BR>dev tun<BR>proto udp<BR>remote vpn_server_ip 1494<BR><BR>ca ca.crt<BR>cryptoapicert "SUBJ: abc"<BR><BR>nobind<BR>persist-key<BR>persist-tun<BR>verb 2<BR><BR><BR><BR><BR>修改 remote 一行填上对应 VPN Server 的 IP 和 端口。ca.crt 和服务端 ca.crt 一样，必须把这个 ca.crt 也放在 config 目录下。<BR><BR><BR><BR>关键是 cryptoapicert "SUBJ: abc" 这行。这一行指定客户端的数字证书从 Windows 证书 Store 里取。在 IE 的“选项 -> 内容 -> 证书”页面能看到你的个人数字证书。SUBJ:abc 指明选择证书主题中含有 abc 的证书。客户端数字证书也可以用以前贴的 ca 工具生成，如果要给用户 abc 签发数字证书，只用指明 Common Name 是 abc 即可，然后把生成的 abc.p12 传给 abc 用户并告诉导入口令。abc 导入这个数字证书后，VPN Client 就可以工作了。<BR><BR><BR><BR>启动 OpenVPN<BR><BR>服务端启动<BR><BR>在 /etc/vpn 目录下，执行：<BR><BR>openvpn --daemon --config server.conf<BR><BR><BR><BR>客户端启动<BR><BR>OpenVPN 带一个 GUI 小工具，会装在系统托盘里。点菜单里的 connect 即可。<BR><BR>常见问题<BR><BR>无法得到 IP 地址<BR><BR>通常是因为 DH CP Client 服务没有启动。在服务管理里启动即可。]]></description>
	  <comments>2006-1-19 10:36:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3884108&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[OpenVPN]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2006-1-19星期四(Thursday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3884075&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>OpenVPN（http://openvpn.net/）是一套全功能的 SSL VPN解决方案，能够包含多种配置和多种条件的应用，包括远程访问、站对站虚拟私网、WiFi安全，以及负载均衡、容错性好的企业级远程访问方案。 OpenVPN使用标准的SSL/TLS协议实现了OSI的第2,3层安全扩展，支持基于数字证书、智能卡、双向认证的可靠验证，使用应用到VPN虚拟界面上的防火墙策略允许用户和组的访问控制。不过，OpenVPN不是面向Web应用的代理，因此不能通过一个浏览器来操作。OpenVPN在多种操作系统上均有实现，能够运行于Linux, Windows 2000/XP and higher, OpenBSD, FreeBSD, NetBSD, Mac OS X, 以及Solaris。使用OpenVPN，可以做到以下的事情：<BR><BR>    * 在单个UDP或者TCP端口上建立以太网虚拟网卡，或者建立任何IP子网的隧道；<BR>    * 使用单个或者多个机器配置为可扩展的、负载均衡的VPN服务器，能够处理上千个动态的VPN客户端连接；<BR>    * 使用OpenSSL库的所有加密、验证和证书等特性来保护在互联网上建立的思友网络通讯；<BR>    * 使用OpenSSL库的所有密钥、键长以及HMAC采样(用于数据的完整性检查)；<BR>    * 可以使用基于静态密钥的常规加密，也可以使用基于证书的公钥加密；<BR>    * 可以使用静态的、预先分享的或者基于TLS的动态密钥交换；<BR>    * 可以使用实时的链路加密和流量整形来管理链路带宽；<BR>    * 可以支持包括DH CP和拨入客户端在内的动态端点建立隧道；<BR>    * 不需要复杂的防火墙规则即可隧道穿越面向连接的防火墙；<BR>    * 可以在NAT之上建立隧道网络；<BR>    * 可以使用虚拟tap设备建立安全的以太网桥；<BR>    * 在Windows或者Mac OS X上可以用GUI窗口进行控制。<BR><BR> OpenVPN 的安装和配置都是比较容易的。当然，正所谓会者不难，难者不会，我们先不管其他的细节，先搭建起来，再慢慢琢磨和体会。以Windows为例。两台PC，一台作为VPN服务器，一台作为VPN客户端。都下载安装同一软件安装包：openvpn-2.0-install.exe，在http://openvpn.net/download.html可以下载。安装的过程中，会跳出对话框，提示在安装虚拟网卡设备，安装完毕之后，可以看到多了一个网络设备叫做“TAP-Win32 Adaptor V8”，平时当服务器或者客户端未启动时，它处于断开状态。可以在安装路径下看到目录：<BR><BR>    * bin<BR>    * config<BR>    * driver<BR>    * easy-rsa<BR>    * log<BR>    * sample-config<BR><BR>在sample-config下有三个配置文件，client.ovpn, server.ovpn, sample.ovpn，直接使用这几个文件就可以初步搭建VPN起来。不过，配置文件里面指定了几个文件，需要准备一下。<BR><BR>准备数字证书<BR><BR>这几个文件都可以用附带的 openssl 程序和easy-rsa下面的一些批处理文件自己创建。（openssl 是一个PKI公钥体系的软件包，它能够做很多相关的工作，它也是一个开源的软件，可以去网站http://openssl.org/了解更多的信息。）我们就用它来产生这些文件，包括服务器需要的：ca.crt, server.crt, server.key, dh1024.pem，客户端需要的：ca.crt, server.crt, server.key。其中ca.crt是一样的，是CA的数字证书，可以在服务器上产生好之后复制过去。步骤如下：<BR><BR>   1. 进入命令行窗口，到目录easy-rsa下;<BR>   2. 运行 init_config.bat，它会生成 vars.bat 和 openssl.cnf，根据自己的需要，修改这两个文件，也可以不作修改；<BR>   3. 运行vars.bat，将某些值设置到环境变量中；<BR>   4. 建立目录keys，并将 index.txt.start 和 serial.start 复制到该目录中，分别改名为 index.txt和serial。这两个文件是openssl的CA功能签发数字证书的时候需要的；<BR>   5. 运行 build-dh.bat，将生成dh1024.pem；<BR>   6. 运行build-ca.bat，根据提示逐一输入数字证书所需要的字段，最后将生成CA的私钥和自签发证书；<BR>   7. 运行build-key.bat server，并逐一填写数字证书需要的各个字段，最后将签发生成server.crt, server.key；<BR>   8. 同样，可以生成client.crt和client.key。需要注意，其中填写字段Common Name时，server和client最好填写成一样的，例如vpn。这是OpenVPN文档说明里要求的。<BR><BR>启动VPN服务器<BR><BR>注意配置文件的协议和服务器监听的端口：<BR><BR>    * port 1194<BR>    * proto udp<BR><BR>将dh1024.pem， ca.crt，server.crt，server.key复制到sample-config下，运行 openvpn --config server.ovpn，即可启动OpenVPN的服务器，并且能够看到那个处于断开状态的虚拟网卡已经处于联机状态。并且通过 ipconfig 可以看到，本地多了一个IP为：10.8.0.1/255.255.255.252。<BR><BR>启动VPN客户端<BR><BR>将dh1024.pem, ca.crt, client.crt, client.key复制到客户机的sample-config目录下，注意修改 client.ovpn里面的几个地方：<BR><BR>    * proto udp                                需要和服务器一致，要么都是udp，要么都是tcp；<BR>    * remote 192.168.1.11 1194        指定VPN服务器的IP地址和端口；<BR><BR>运行 openvpn --config client.ovpn，即可启动OpenVPN的客户端，并且可以看到那个处于断开状态的虚拟网卡已经处于联机状态。通过 ipconfig 可以看到，本地多了一个IP为：10.8.0.6/255.255.255.252。并且可以尝试 ping 10.8.0.1 访问 VPN服务器。<BR><BR>性能测试<BR><BR>通过用 FlashFXP 访问 VPN服务器上的FTP服务器，并尝试传输一个较大的文件，我们可以测试出传输速率是1.8MBps，也就是说OpenVPN这时候的传输速率大约在15Mbps左右。考虑到中间的打包、编解码等工作，这个性能应该说还是相当不错了。]]></description>
	  <comments>2006-1-19 10:32:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3884075&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[Z一样的生活]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2006-1-18星期三(Wednesday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3875518&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>流浪bj已经一段时间了,感觉还是比较浮躁．<BR>有点象找love，两者需要互相认同，缺一不可．<BR>快过年了，心也疲惫了，该回家了．<BR>waiting　alone！<BR>]]></description>
	  <comments>2006-1-18 13:22:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3875518&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[冬天的烦恼]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2005-12-24星期六(Saturday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3615245&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>黎明前的黑暗!早点过去<BR>虽然已经冬至了,但天气却好象暖和了;各种笔试题目真是麻烦!!!]]></description>
	  <comments>2005-12-24 16:27:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3615245&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[~@!#$%^^*()]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2005-12-7星期三(Wednesday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3437326&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>结束了，答辩完之后的感觉就象是一根绷紧了很久的弦突然松弛下了，还没找到这段时间应有的节奏。还有一大堆乱七八糟的事情没弄完，心里觉得空荡荡的，不知做些什么为好。<BR>古人说“白驹过隙”，应该就是在事情完成后的感受吧；两年多的时间逝去了，自己又得到了些什么？内心一直在思考这个问题。多认识了一些人，多了解了一些事情，如此而已？有的人或许值得认识，有些人或许不必认识，还有的人应该认识后就忘却；事情大概也是如此。<BR>即将到来的本命年又会是怎样？我不期望万事大吉，能够平常即好，只有等到那时才知晓了。<BR>]]></description>
	  <comments>2005-12-7 13:40:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3437326&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[岁末来临]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2005-11-24星期四(Thursday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3306627&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>下午闲聊，听同学说他们后天就答辩了，想想自己应该也快了（主要是boss太忙没时间），不过最晚10号左右应该也ok了。突然想到学生的生涯应该快over了，汗，能在学校里面舒服地呆着的日子不多，过一天少一天了；以后的生活可能会截然不同，一直都认为在学校的日子呆腻了，说不定以后会怀念这段时光。<BR>十余载寒窗，不惊宠辱，不患得失；<BR>始知天下之大，学问之深！<BR>]]></description>
	  <comments>2005-11-24 20:22:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3306627&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[C之诡谲 3]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2005-11-21星期一(Monday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3269993&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>3.const和volatile在类型声明中的位置 <BR>在这里我只说const，volatile是一样的【注12】！ <BR>注12：顾名思义，volatile修饰的量就是很容易变化，不稳定的量，它可能被其它线程，操作系统，硬件等等在未知的时间改变，所以它被存储在内存中，每次取用它的时候都只能在内存中去读取，它不能被编译器优化放在内部寄存器中。 <BR>类型声明中const用来修饰一个常量，我们一般这样使用：const在前面 <BR>const int；//int是const <BR>const char*;//char是const <BR>char* const;//*（指针）是const <BR>const char* const;//char和*都是const <BR>对初学者，const char*;和 char* const;是容易混淆的。这需要时间的历练让你习惯它。上面的声明有一个对等的写法：const在后面 <BR>int const；//int是const <BR>char const*;//char是const <BR>char* const;//*（指针）是const <BR>char const* const;//char和*都是const <BR>第一次你可能不会习惯，但新事物如果是好的，我们为什么要拒绝它呢？：）const在后面有两个好处： <BR>A．  const所修饰的类型是正好在它前面的那一个。如果这个好处还不能让你动心的话，那请看下一个！ <BR>B．  我们很多时候会用到typedef的类型别名定义。比如typedef char* p char，如果用const来修饰的话，当const在前面的时候，就是const pchar，你会以为它就是const char* ，但是你错了，它的真实含义是char * const 。是不是让你大吃一惊！但如果你采用const在后面的写法，意义就怎么也不会变，不信你试试！不过，在真实项目中的命名一致性更重要。你应该在两种情况下都能适应，并能自如的转换，公司习惯，商业利润不论在什么时候都应该优先考虑！不过在开始一个新项目的时候，你可以考虑优先使用const在后面的习惯用法。 <BR>四．参数可变的函数 <BR>C语言中有一种很奇怪的参数“…”，它主要用在引数（argument）个数不定的函数中，最常见的就是printf函数。 <BR>printf(“Enjoy yourself everyday!\n”); <BR>printf(“The value is %d!\n”, value); <BR>…… <BR>你想过它是怎么实现的吗？ <BR>1.     printf为什么叫printf？ <BR>不管是看什么，我总是一个喜欢刨根问底的人，对事物的源有一种特殊的癖好，一段典故，一个成语，一句行话，我最喜欢的就是找到它的来历，和当时的意境，一个外文翻译过来的术语，最低要求我会尽力去找到它原本的外文术语。特别是一个字的命名来历，我一向是非常在意的，中国有句古话：“名不正，则言不顺。”printf中的f就是format的意思，即按格式打印【注13】 <BR>注13：其实还有很多函数，很多变量，很多命名在各种语言中都是非常讲究的，你如果细心观察追溯，一定有很多乐趣和满足，比如哈希表为什么叫hashtable而不叫hashlist？在C++的SGI STL实现中有一个专门用于递增的函数iota（不是itoa），为什么叫这个奇怪的名字，你想过吗？看文章我不喜欢意犹未尽，己所不欲，勿施于人，所以我把这两个答案告诉你： <BR>（1）table与list做为表讲的区别： <BR>table: <BR>-------|--------------------|------- <BR>item1 |   kadkglasgaldfgl | jkdsfh <BR>-------|--------------------|------- <BR>item2 |   kjdszhahlka   | xcvz <BR>-------|--------------------|------- <BR>list: <BR>**** <BR>*** <BR>******* <BR>***** <BR>That's the difference！ <BR>如果你还是不明白，可以去看一下hash是如何实现的！ <BR>（2）The name iota is taken from the programming language APL. <BR>而APL语言主要是做数学计算的，在数学中有很多公式会借用希腊字母，希腊字母表中有这样一个字母，大写为Ι，小写为ι，它的英文拼写正好是iota，这个字母在θ(theta)和κ(kappa)之间！ <BR>你可以看看http://www.wikipedia.org/wiki/APL_programming_language <BR>下面有一段是这样的: <BR>APL is renowned for using a set of non-ASCII symbols that are an extension of traditional arithmetic and algebraic notation. These cryptic symbols, some have joked, make it possible to construct an entire air traffic control system in two lines of code. Because of its condensed nature and non-standard character s, APL has sometimes been termed a "write-only language", and reading an APL program can feel like decoding an alien tongue. Because of the unusual characte r-set, many programmers used special APL keyboards in the production of APL code. Nowadays there are various ways to write APL code using only ASCII characters. <BR>在C++中有函数重载（overload）可以用来区别不同函数参数的调用，但它还是不能表示任意数量的函数参数。在标准C语言中定义了一个头文件<stdarg.h>专门用来对付可变参数列表，它包含了一组宏 ，和一个va_list的typedef声明。一个典型实现如下<BR>【注14】： <BR>typedef char* va_list; <BR>#define va_start(list) list = (char*)&va_alist <BR>#define va_end(list) <BR>#define va_arg(list, mode)\ <BR>  ((mode*) (list += sizeof(mode)))[-1] <BR>注14：你可以查看C99标准7.15节获得详细而权威的说明。也可以参考Andrew Konig的《C陷阱与缺陷》的附录A。 <BR>ANSI C还提供了vprintf函数，它和对应的printf函数行为方式上完全相同，只不过用va_list替换了格式字符串后的参数序列。至于它是如何实现的，你在认真读完《The C Programming Language》后，我相信你一定可以do it yourself！使用这些工具，我们就可以实现自己的可变参数函数，比如实现一个系统化的错误处理函数error。它和printf函数的使用差不多。只不过将stream重新定向到stderr。在这里我借鉴了《C陷阱与缺陷》的附录A的例子。 <BR>实现如下： <BR>#include <stdio.h> <BR>#include <stdarg.h> <BR>void error(char* format, …) <BR>{ <BR>    va_list ap; <BR>    va_start(ap, format); <BR>    fprintf(stderr, “error: “); <BR>    vfprintf(stderr, format, ap); <BR>    va_end(ap); <BR>    fprintf(stderr, “\n”); <BR>    exit(1); <BR>} <BR>你还可以自己实现printf： <BR>#include <stdarg.h> <BR>int printf(char* format, …) <BR>{ <BR>    va_list ap; <BR>    va_start(ap, format); <BR>    int n = vprintf(format, ap); <BR>    va_end(ap); <BR>    return n; <BR>} <BR>我还专门找到了VC7.1的头文件<stdarg.h>看了一下，发现各个宏的具体实现还是有区别的，跟很多预处理（preprocessor）相关。其中va_list就不一定是char*的别名。 <BR>typedef struct { <BR>    char *a0;     /* pointer to first homed integer argument */ <BR>    int offset;   /* byte offset of next parameter */ <BR>} va_list; <BR>其它的定义类似。 <BR>经常在Windows进行系统编程的人一定知道函数调用有好几种不同的形式，比如__stdcall，__pascal，__cdecl。在Windows下_stdcall，__pascal是一样的，所以我只说一下__stdcall和__cdecl的区别。 <BR>（1）__stdcall表示调用端负责被调用函数引数的压栈和出栈。函数参数个数一定的函数都是这种调用形式。 <BR>例如：int fun(char c, double d)，我们在main函数中调用它，这个函数就只管本身函数体的运行，参数怎么来的，怎么去的，它一概不管。自然有main负责。不过，不同的编译器的实现可能将参数从右向左压栈，也可能从左向右压栈，这个顺序我们是不能加于利用的【注15】。 <BR>注15：你可以在Herb Sutter的《More Exceptional C++》中的条款20：An Unmanaged Pointer Problem, Part 1:Parameter Evaluation找到相关的细节论述。 <BR>（2）__cdecl表示被调用函数自身负责函数引数的压栈和出栈。参数参数可变的函数采用的是这种调用形式。 为什么这种函数要采用不同于前面的调用形式呢？那是因为__stdcall调用形式对它没有作用，调用端根本就无法知道被调用函数的引数个数，它怎么可能正确工作？所以这种调用方式是必须的，不过由于参数参数可变的函数本身不多，所以用的地方比较少。 <BR>对于这两种方式，你可以编制一些简单的程序，如何反汇编，在汇编代码下面你就可以看到实际的区别，很好理解的！ <BR>重载函数有很多匹配（match）规则调用。参数为“…”的函数是匹配最低的，这一点在Andrei Alexandrescu的惊才绝艳之作《Modern C++ Design》中就有用到，参看Page34-35，2.7“编译期间侦测可转换性和继承性”。 <BR>后记：C语言的细节肯定不会只有这么多，但是这几个出现的比较频繁，而且在C语言中也是很重要的几个语言特征。如果把这几个细节彻底弄清楚了，C语言本身的神秘就不会太多了。C语言本身就像一把异常锋利的剪刀，你可以用它做出非常精致优雅的艺术品，也可以剪出一些乱七八糟的废纸片。能够将一件武器用到出神入化那是需要时间的，需要多长时间？不多，请你拿出一万个小时来，英国Exter大学心理学教授麦克.侯威专门研究神童和天才，他的结论很有意思：“一般人以为天才是自然而生、流畅而不受阻的闪亮才华，其实，天才也必须耗费至少十年光阴来学习他们的特殊技能，绝无例外。要成为专家，需要拥有顽固的个性和坚持的能力……每一行的专业人士，都投注大量心血，培养自己的专业才能。” <BR>推荐两本书：K&R的《The C Programming language》，Second Edition。Andr的《C陷阱与缺陷》。本文从中引用了好几个例子，一本高段程序员的经验之谈。但是对纯粹的初学者不太合适，如果你有一点程序设计的基础知识，花一个月的时间好好看看这两本书，C语言本身就不用再花更多的精力了。 吴桐写于2003.5.26 <BR>]]></description>
	  <comments>2005-11-21 10:48:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3269993&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[C之诡谲2]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2005-11-21星期一(Monday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3269971&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>二．数组。 <BR>在C语言中，对于数组你只需要理解三件事。 <BR>1．C语言中有且只有一维数组。 <BR>所谓的n维数组只是一个称呼，一种方便的记法，都是使用一维数组来仿真的。C语言中数组的元素可以是任何类型的东西，特别的是数组作为元素也可以。所以int a[3][4][5]就应该这样理解：a是一个拥有3个元素的数组，其中每个元素是一个拥有4个元素的数组，进一步其中每个元素是拥有5个整数元素的数组。是不是很简单！数组a的内存模型你应该很容易就想出来了，不是吗？：） <BR>2．数组的元素个数，必须作为整数常量在编译阶段就求出来。 <BR>int i; <BR>int a;//不合法，编译不会通过。 <BR>也许有人会奇怪char str[] = “test”;没有指定元素个数为什么也能通过，因为编译器可以根据后面的初始化字符串在编译阶段求出来，不信你试试这个：int a[];编译器无法推断，所以会判错说“array size missing in a”之类的信息。不过在最新的C99标准中实现了变长数组【注6】 <BR>注6：如果你是一个好奇心很强烈的人，就像我一样，那么可以查看C99标准6.7.5.2。3．对于数组，可以获得数组第一个（即下标为0）元素的地址（也就是指针），从数组名获得。<BR>比如int a[5]; int* p = a;这里p就得到了数组元素a[0]的地址。其余对于数组的各种操作，其实都是对于指针的相应操作。比如a[3]其实就是*(a+3)的简单写法，由于*(a+3)==*(3+a)，所以在某些程序的代码中你会看到类似3[a]的这种奇怪表达式，现在你知道了，它就是a[3]的别名。还有一种奇怪的表达式类似a[-1]，现在你也明白了，它就是*(a-1)【注7】。 <BR>注7：你肯定是一个很负责任的人，而且也知道自己到底在干什么。你难道不是吗？：）所以你一定也知道，做一件事是要付出成本的，当然也应该获得多于成本的回报。 <BR>我很喜欢经济学，经济学的一个基础就是做什么事情都是要花成本的，即使你什么事情也不做。时间成本，金钱成本，机会成本，健康成本……可以这样说，经济学的根本目的就是用最小的成本获得最大的回报。 <BR>所以我们在自己的程序中最好避免这种邪恶的写法，不要让自己一时的智力过剩带来以后自己和他人长时间的痛苦。用韦小宝的一句话来说：“赔本的生意老子是不干的！”但是对邪恶的了解是非常必要的，这样当我们真正遇到邪恶的时候，可以免受它对心灵的困扰！ <BR>对于指向同一个数组不同元素的指针，它们可以做减法，比如int* p = q+i;p-q的结果就是这两个指针之间的元素个数。i可以是负数。但是请记住：对指向不同的数组元素的指针，这样的做法是无用而且邪恶的！ <BR>对于所谓的n维数组，比如int a[2][3];你可以得到数组第一个元素的地址a和它的大小。*(a+0)（也即a[0]或者*a）就是第一个元素，它又是一个数组int[3]，继续取得它的第一个元素，*(*(a+0)+0)（也即a[0][0]或者*(*a)），也即第一个整数（第一行第一列的第一个整数）。如果采用这种表达式，就非常的笨拙，所以a[0][0]记法上的简便就非常的有用了！简单明了！ <BR>对于数组，你只能取用在数组有效范围内的元素和元素地址，不过最后一个元素的下一个元素的地址是个例外。它可以被用来方便数组的各种计算，特别是比较运算。但显然，它所指向的内容是不能拿来使用和改变的！ <BR>关于数组本身大概就这么多，下面简要说一下数组和指针的关系。它们的关系非常暧昧，有时候可以交替使用。比如 int main(int args, char* argv[])中，其实参数列表中的char* argv[]就是char* * argv的另一种写法。因为在C语言中，一个数组是不能作为函数引数（argument）【注8 】直接传递的。因为那样非常的损失效率，而这点违背了C语言设计时的基本理念——作为一门高效的系统设计语言。 <BR>注8：这里我没有使用函数实参这个大陆术语，而是运用了台湾术语，它们都是argument这个英文术语的翻译，但在很多地方中文的实参用的并不恰当，非常的勉强，而引数表示被引用的数，很形象，也很好理解。很快你就可以像我一样适应引数而不是实参。dereferance，也就是*运算符操作。我也用的是提领，而不是解引用。我认为你一定智勇双全：既有宽容的智慧，也有面对新事物的勇气！你不愿意承认吗？：）所以在函数参数列表（parameter list）中的数组形式的参数声明，只是为了方便程序员的阅读！比如上面的char* argv[]就可以很容易的想到是对一个char*字符串数组进行操作，其实质是传递的char*字符串数组的首元素的地址（指针）。其它的元素当然可以由这个指针的加法间接提领（dereferance）【参考注8】得到！从而也就间接得到了整个数组。<BR>但是数组和指针还是有区别的，比如在一个文件中有下面的定义： <BR>char myname[] = “wuaihua”; <BR>而在另一个文件中有下列声明： <BR>extern char* myname; <BR>它们互相是并不认识的，尽管你的本义是这样希望的。它们对内存空间的使用方式不同【注9】。 <BR>对于char myname[] = “wuaihua”如下 <BR>myname <BR>w <BR>u <BR>a <BR>i <BR>h <BR>u <BR>a <BR>\0 <BR>对于char* myname；如下表 <BR>myname <BR>\|/ <BR>w <BR>u <BR>a <BR>i <BR>h <BR>u <BR>a <BR>\0 <BR>注9：可以参考Andrew Konig的《C陷阱与缺陷》4.5节。 <BR>改变的方法就是使它们一致就可以了。 <BR>char myname[] = “wuaihua”; <BR>extern char myname[]; <BR>或者 <BR>char* myname = “wuaihua”;//C++中最好换成const char* myname = “wuaihua”。 <BR>extern char* myname; <BR>三．类型的识别。 <BR>基本类型的识别非常简单： <BR>int a;//a的类型是a <BR>char* p;//p的类型是char* <BR>…… <BR>那么请你看看下面几个： <BR>int* (*a[5])(int, char*);           //＃1 <BR>void (*b[10]) (void (*)());         //＃2 <BR>doube(*)() (*pa)[9];             //＃3 <BR>如果你是第一次看到这种类型声明的时候，我想肯定跟我的感觉一样，就如晴天霹雳，五雷轰顶，头昏目眩，一头张牙舞爪的狰狞怪兽扑面而来。不要紧（Take it easy）！我们慢慢来收拾这几个面目可憎的纸老虎！ <BR>1．C语言中函数声明和数组声明。 <BR>函数声明一般是这样int fun(int,double);对应函数指针（pointer to function）的声明是这样： <BR>int (*pf)(int,double)，你必须习惯。可以这样使用： <BR>pf = &fun;//赋值（assignment）操作 <BR>(*pf)(5, 8.9);//函数调用操作 <BR>也请注意，C语言本身提供了一种简写方式如下： <BR>pf = fun;// 赋值（assignment）操作 <BR>pf(5, 8.9);// 函数调用操作 <BR>不过我本人不是很喜欢这种简写，它对初学者带来了比较多的迷惑。 <BR>数组声明一般是这样int a[5];对于数组指针（pointer to array）的声明是这样： <BR>int (*pa)[5]; 你也必须习惯。可以这样使用： <BR>pa = &a;// 赋值（assignment）操作 <BR>int i = (*pa)[2]//将a[2]赋值给i； <BR>2.有了上面的基础，我们就可以对付开头的三只纸老虎了!：） <BR>这个时候你需要复习一下各种运算符的优先顺序和结合顺序了，顺便找本书看看就够了。<BR>＃1：int* (*a[5])(int, char*); <BR>首先看到标识符名a，“[]”优先级大于“*”，a与“[5]”先结合。所以a是一个数组，这个数组有5个元素，每一个元素都是一个指针，指针指向“(int, char*)”，对，指向一个函数，函数参数是“int, char*”，返回值是“int*”。完毕，我们干掉了第一个纸老虎。：） <BR>＃2：void (*b[10]) (void (*)()); <BR>b是一个数组，这个数组有10个元素，每一个元素都是一个指针，指针指向一个函数，函数参数是“void (*)()”【注10】，返回值是“void”。完毕！ <BR>注10：这个参数又是一个指针，指向一个函数，函数参数为空，返回值是“void”。 <BR>＃3. doube(*)() (*pa)[9];   <BR>pa是一个指针，指针指向一个数组，这个数组有9个元素，每一个元素都是“doube(*)()”【也即一个指针，指向一个函数，函数参数为空，返回值是“double”】。 <BR>现在是不是觉得要认识它们是易如反掌，工欲善其事，必先利其器！我们对这种表达方式熟悉之后，就可以用“typedef”来简化这种类型声明。 <BR>＃1：int* (*a[5])(int, char*); <BR>typedef int* (*PF)(int, char*);//PF是一个类型别名【注11】。 <BR>PF a[5];//跟int* (*a[5])(int, char*);的效果一样！ <BR>注11：很多初学者只知道typedef char* pchar；但是对于typedef的其它用法不太了解。Stephen Blaha对typedef用法做过一个总结：“建立一个类型别名的方法很简单，在传统的变量声明表达式里用类型名替代变量名，然后把关键字typedef加在该语句的开头”。可以参看《程序员》杂志2001.3期《C++高手技巧20招》。 <BR>＃2：void (*b[10]) (void (*)()); <BR>typedef void (*pfv)(); <BR>typedef void (*pf_taking_pfv)(pfv); <BR>pf_taking_pfv b[10]; //跟void (*b[10]) (void (*)());的效果一样！ <BR>]]></description>
	  <comments>2005-11-21 10:46:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3269971&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[C之诡谲——来源:·哈工大紫丁香 bbs.hit.edu.cn·[FR]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2005-11-21星期一(Monday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3269896&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>C++的前世是C，而且C所留下的神秘以及精简在C++中是青出于蓝而胜于蓝！C所带给人的困惑以及灵活太多，即使一个有几年经验的高段C程序员仍然有可能在C语言的小水沟里翻船。不过其实C语言真的不难，下面我想指出C语言中最神秘而又诡谲多变的四个地方，它们也继续在C++语言中变幻莫测。 <BR>指针，数组，类型的识别，参数可变的函数。 <BR>一．指针。 <BR>它的本质是地址的类型。在许多语言中根本就没有这个概念。但是它却正是C灵活，高效，在面向过程的时代所向披靡的原因所在。因为C的内存模型基本上对应了现在von Neumann（冯·诺伊曼）计算机的机器模型，很好的达到了对机器的映射。不过有些人似乎永远也不能理解指针【注1】。 <BR>注1：Joel Spolsky就是这样认为的，他认为对指针的理解是一种aptitude，不是通过训练就可以达到的。http://www.joelonsoftware.com/printerFriendly/articles/fog0000000073.html指针可以指向值、数组、函数，当然它也可以作为值使用。<BR>看下面的几个例子： <BR>int* p;//p是一个指针，指向一个整数 <BR>int** p;//p是一个指针，它指向第二个指针，然后指向一个整数 <BR>int (*pa)[3];//pa是一个指针，指向一个拥有3个整数的数组 <BR>int (*pf)();//pf是一个指向函数的指针，这个函数返回一个整数 <BR>后面第四节我会详细讲解标识符（identifier）类型的识别。 <BR>1.指针本身的类型是什么？ <BR>先看下面的例子：int a;//a的类型是什么？ <BR>对，把a去掉就可以了。因此上面的4个声明语句中的指针本身的类型为： <BR>int* <BR>int** <BR>int (*)[3] <BR>int (*)() <BR>它们都是复合类型，也就是类型与类型结合而成的类型。意义分别如下： <BR>point to int（指向一个整数的指针） <BR>pointer to pointer to int（指向一个指向整数的指针的指针） <BR>pointer to array of 3 ints（指向一个拥有三个整数的数组的指针） <BR>pointer to function of parameter is void and return value is int （指向一个函数的指针，这个函数参数为空，返回值为整数） <BR>2.指针所指物的类型是什么？ <BR>很简单，指针本身的类型去掉 “*”号就可以了，分别如下： <BR>int <BR>int* <BR>int ()[3] <BR>int ()() <BR>3和4有点怪，不是吗？请擦亮你的眼睛，在那个用来把“*”号包住的“()”是多余的，所以： <BR>int ()[3]就是int [3]（一个拥有三个整数的数组） <BR>int ()()就是int ()（一个函数，参数为空，返回值为整数）【注2】 <BR>注2：一个小小的提醒，第二个“()”是一个运算符，名字叫函数调用运算符（function call operator）。 <BR>3.指针的算术运算。 <BR>请再次记住：指针不是一个简单的类型，它是一个和指针所指物的类型复合的类型。因此，它的算术运算与之（指针所指物的类型）密切相关。 <BR>int a[8]; <BR>int* p = a; <BR>int* q = p + 3; <BR>p++; <BR>指针的加减并不是指针本身的二进制表示加减，要记住，指针是一个元素的地址，它每加一次，就指向下一个元素。所以： <BR>int* q = p + 3;//q指向从p开始的第三个整数。 <BR>p++;//p指向下一个整数。 <BR>double* pd; <BR>……//某些计算之后 <BR>double* pother = pd – 2;//pother指向从pd倒数第二个double数。 <BR>4.指针本身的大小。 <BR>在一个现代典型的32位机器上【注3】，机器的内存模型大概是这样的，想象一下，内存空间就像一个连续的房间群。每一个房间的大小是一个字节（一般是二进制8位）。有些东西大小是一个字节（比如char），一个房间就把它给安置了；但有些东西大小是几个字节（比如double就是8个字节，int就是4个字节，我说的是典型的32位），所以它就需要几个房间才能安置。 <BR>注3：什么叫32位？就是机器CPU一次处理的数据宽度是32位，机器的寄存器容量是32位，机器的数据，内存地址总线是32位。当然还有一些细节，但大致就是这样。16位，64位，128位可以以此类推。 <BR>这些房间都应该有编号（也就是地址），32位的机器内存地址空间当然也是32位，所以房间的每一个编号都用32位的二进制数来编码【注4】。请记住指针也可以作为值使用，作为值的时候，它也必须被安置在房间中（存储在内存中），那么指向一个值的指针需要一个地址大小来存储，即32位，4个字节，4个房间来存储。 <BR>注4：在我们平常用到的32位机器上，绝少有将32位真实内存地址空间全用完的（232 ＝ 4G），即使是服务器也不例外。现代的操作系统一般会实现32位的虚拟地址空间，这样可以方便运用程序的编制。关于虚拟地址（线性地址）和真实地址的区别以及实现，可以参考《Linux源代码情景分析》的第二章存储管理，在互联网上关于这个主题的文章汗牛充栋，你也可以google一下。但请注意，在C++中指向对象成员的指针（pointer to member data or member function）的大小不一定是4个字节。为此我专门编制了一些程序，发现在我的两个编译器（VC7.1.3088和Dev-C++4.9.7.0）上，指向对象成员的指针的大小没有定值，但都是4的倍数。不同的编译器还有不同的值。对于一般的普通类（class），指向对象成员的指针大小一般为4，但在引入多重虚拟继承以及虚拟函数的时候，指向对象成员的指针会增大，不论是指向成员数据，还是成员函数。【注5】。 <BR>注5：在Andrei Alexandrescu的《Modern C++ Design》的5.13节Page124中提到，成员函数指针实际上是带标记的（tagged）unions，它们可以对付多重虚拟继承以及虚拟函数，书上说成员函数指针大小是16，但我的实践告诉我这个结果不对，而且具体编译器实现也不同。一直很想看看GCC的源代码，但由于旁骛太多，而且心不静，本身难度也比较高（这个倒是不害怕^_^），只有留待以后了。 <BR>还有一点，对一个类的static member来说，指向它的指针只是普通的函数指针，不是pointer to class member，所以它的大小是4。 <BR>5.指针运算符&和* <BR>它们是一对相反的操作，&取得一个东西的地址（也就是指针），*得到一个地址里放的东西。这个东西可以是值（对象）、函数、数组、类成员（class member）。其实很简单，房间里面居住着一个人，&操作只能针对人，取得房间号码；*操作只能针对房间，取得房间里的人。参照指针本身的类型以及指针所指物的类型很好理解。 <BR>小结：其实你只要真正理解了1，2，就相当于掌握了指针的牛鼻子。后面的就不难了，指针的各种变化和C语言中其它普通类型的变化都差不多(比如各种转型)。 <BR>  <BR><BR>]]></description>
	  <comments>2005-11-21 10:37:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3269896&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[噩梦]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2005-11-16星期三(Wednesday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3221151&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>如果要让一个人筋疲力尽，紧张不安，如果要让一个人入地狱，<BR>那么就让他去修改学位论文的格式；<BR><BR>有生以来做过最可恶的事情莫过于此了，终于体会到WORD的“博大精深”！<BR>折腾人啊，不过知道最近一个月还有多少这种事情，但愿没有了！！！]]></description>
	  <comments>2005-11-16 8:54:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3221151&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[屋漏偏遭连夜雨]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2005-11-14星期一(Monday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3200591&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>终于体会到古人的感受了，看过一部《大雨成灾》，淅淅沥沥的小雨也是个麻烦事情。<BR>PS：怀念BJ的天气，虽然干燥点。]]></description>
	  <comments>2005-11-14 8:36:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3200591&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[黎明前的黑暗]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2005-11-13星期日(Sunday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3194737&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>...........................<BR>改论文的后果=视力急剧下降+心力疲惫+紧张+...+<BR>烦！几乎没有什么时间，好不容易可以去MS笔试的机会也浪费了，顺便看看XX，sigh！<BR> 过完这个月就ok了，：）]]></description>
	  <comments>2005-11-13 16:27:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3194737&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[wait along]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2005-11-4星期五(Friday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3108167&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>等待ing！还要等一阵子，不知道是多久。<BR>觉得有很多事情要去做，不知从何处下手；论文在wait，面试也在wait...<BR>正好抽空充电吧。<BR>PS：今天终于申请到学校的mail了，sigh]]></description>
	  <comments>2005-11-4 16:16:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3108167&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[垃圾软件]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2005-10-30星期日(Sunday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3062349&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>靠，今天真郁闷。中了蠕虫病毒，搞得重装了一次。<BR>最可恨的是那些人渣公司和畜生程序员，3721，中文上网，yisou等垃圾软件<BR>极度鄙视之！！！<BR>现在发现删除这种流氓最好是在安全模式下，很easy的干掉<BR>PS：新汉化世纪也是个无耻的站点，里面的软件基本上都包含着那种垃圾软件]]></description>
	  <comments>2005-10-30 20:02:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3062349&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[Google搜索技术]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2005-10-27星期四(Thursday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3037046&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>    Google将其成功部分地归功于公司所发明的独有运算机制，令其搜索引擎可以在极短时间内对数以百万计的网络用户的搜索请求提供答案。<BR>　　上周三，Google副总裁Urs Hoelzle在Eclipse会议上的一番发言，令与会者有机会了解Google的搜索技术是如何产生以及该技术现在是如何运作的。<BR>　　Hoelzle对与会者说，要发明Google的技术，开发者必须抛弃过去大型数据库所使用技术的思维定势。由于一天里面所有搜索请求的内容都是不可预计的，因此手头上就必须拥有100亿左右的网页数据，这是确实是很大的挑战。<BR>　　Hoelzle出示了一系列早期Google硬件数据中心的照片。1997年拍的照片中是两台破旧的台式电脑。1999年，是数台Intel服务器，机器后面露出一堆乱七八糟的数据线。2000年的数据中心内，摆放的是1000台排列整齐的双处理器服务器。<BR>　　Hoelzle表示，“底层的硬件价格十分低廉，但却完成了许多工作。”同时，使用如此多的服务器，可靠性是Google关心的另一重点。Hoelzle表示，“Google使用自动控制的机制进行运作。否则，工程师们需要为重启服务器而疲于奔命。”<BR>　　为了抵抗不可抗力带来的影响，Google搭建了Google文件系统，该系统与Google的搜索运算系统紧密结合，并且对服务器故障有很高的承受能力。<BR>　　Google的所有操作均基于一系列的大容量文件，这些文件被拆分为六十四(ft,居然说有six four敏感数字只能用大写了)M大小的数据包，分布在多个“数据包服务器”中。文件的描述、数据包的数目和数据包的位置等资料都存放在中央服务器中。每一个6 4M的数据包都会在另外两个服务器上备份，三份拷贝的路径亦存放在中央服务器中。<BR>　　由于所有的文件都存放在Red Hat Linux服务器中，Google以很低的成本就保证了服务的可靠性。中央服务器会定时向数据包服务器发出脉冲信号，确定数据包服务器是否在正常运作。如果没有收到应答信号，又或者应答信号中显示某台数据包服务器的数据受到损害，中央服务器会从其他数据包服务器上取出数据包修复受损的服务器。这一工作通常在一分钟内则可以完成。<BR>　　Hoelzle指出，只有三台服务器上的拷贝同时受损，才会对Google的服务有所影响。这时候，就需要用一段长时间去收集互联网的数据以重建受损文件。<BR>　　Google会对Web Crawler收集到的网页进行索引， Web Crawler亦会对这些网页的作出描述。Hoelzle表示，建立网页的索引是很艰巨的一项工作，需要数百台计算机运算数天。同时，索引必须经常地更新。<BR>　　为了高速地对索引进行检索，Google将其分成许多称为“碎片”的小块，分布在不同的服务器中，以便进行并行搜索。每一台服务器都搜索出一部分结果，然后再整合在一起成为完整的答案。<BR>　　Hoelzle表示，Google的文件系统、索引技术及商用服务器的网格令每一次搜索的平均时间四分之一秒。而文件系统的定时脉冲信号机制，则给予Google很高的可靠性和可用性。<BR>　　同时，当Google的服务器分析搜索请求的时候，会将该搜索请求拆分，然后再从数据库中找出令大部分用户满意的结果，这一过程称为“map reduction”。Hoelzle表示，“Google曾经在一次大型维护意外事故中失去了2000台map reduction服务器中的1800台。”但由于系统的负载均衡机制，将未完成的搜索任务合理分配，Google仍然能完成所有的搜索请求。<BR>　　Hoelzle指出，“这一机制使我们能很快从故障中复原，并不影响我们的服务。”<BR>]]></description>
	  <comments>2005-10-27 20:14:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3037046&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[10.25]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2005-10-25星期二(Tuesday)阴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3013947&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>论文终于差不多了，老板却出差了。<BR>还不知道到时候得怎么改啊，麻烦！<BR>突然觉得什么都不想干了，必须得找点新动力。]]></description>
	  <comments>2005-10-25 10:42:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=3013947&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[寒冷]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2005-10-15星期六(Saturday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=2930282&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>忙活了一两天终于把琐事搞完了，以后这样的事情还要更多，麻烦。<BR>天气也越来越冷了，论文也必须赶快完成。<BR>]]></description>
	  <comments>2005-10-15 20:05:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=2930282&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[悠然而逝的2周]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2005-10-12星期三(Wednesday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=2899913&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>终于回到学校恢复正常的生活了，在北京奔波了十几天后，一切又重归平静，把这段时间的经历稍微记录一下。<BR>我当时也不知道有什么原因去北京，看看同学或者找工作，自己也说不清，也许两者兼顾吧。<BR>那几位老熟人看上去都没什么改变，性格还是那样没什么改变。老牛，sailor，黑子...。一到西站牛和黑子居然两个人在站台迎接我，感动ing！<BR>面了四家公司，正好是不同的类型，A、B、C和D分别是洋鬼子、假洋鬼子、民企和国企类型的。<BR>也就体会了四种不一样的风格。<BR>从interview经历的时间顺序来说是B、A、D和C。<BR>在B公司做的题目居然和我应聘的职位没什么大的联系，ft！而且当时下火车不久，感觉一切很糟糕，不太爽，在这里B公司把你当做正常人看待。<BR>A公司的位置不太好找，躲在居民区中。A公司的气氛我很欣赏，饮料随便喝，很自由和人性化的那种氛围。面试我的是个老外，看名片应该是北欧那边的，交流起来还可以，至少能听懂70percent；然后上机写了一道程序题，有点小错误，那哥们很有意思，说也许是他们公司的程序问题；不过面试的流程很多，至少还要去一次。最后和管hr的mm聊了聊，都是从hr的角度提的问题，如怎样吸引优秀的人才(好象说我吗？汗！)。感觉在这里A公司把你当做人才来看待。<BR>D公司和C公司是同一天面的，上午在D公司，下午在C公司。<BR>D是一家研究所改制的公司，政府关系不错，项目挺多的，而且方向也和我比较合适；一位-总和一位博士和我面谈，感觉交流的还行，对我的态度相当不错。D把人当作优秀的人才看待，有点受宠若惊！<BR>C！！！在那一下午居然连杯水都不给，考一大堆题目，居然还有翻译，faint！面试我的是个湖北小子(现在更讨厌湖北人了)，问的问题巨sb，而且认为你就是个过来要饭的，从人格上就轻视你，也许这是谈判的策略吧，让你感觉自己确实无足轻重。C和A的公司文化有着天壤之别。<BR>PS：10.1收到两份祝福，她居然也留言祝我生日快乐，没想到。早已习惯了独自在旅途奔波的生活，不知什么时候该停止。<BR>]]></description>
	  <comments>2005-10-12 10:26:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=2899913&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[独立之思想]]></title>
	  <author>萧xjiang516</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2005-9-24星期六(Saturday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=2765399&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>最近看了看李敖的节目，一个所谓的“自由主义者”，虽然在演讲中有些做show的味道，但他的思想无疑是独立的，能言别人所不能言，谈别人所不敢谈。<BR>感觉国内的种种场合，就像一潭死水，需要有新鲜的事物注入，如老李的带来的异样的风格。<BR><BR>还有最近比较流行的文章：<BR>清华梦的粉碎—写给清华大学的退学申请  http://spaces.msn.com/members/shredderyin/<BR>无疑对中国的学术界提出了很大的异议，看后感觉很汗颜，自己所做的工作何尝又不是如此。<BR>但大多数人还是无疑会跟随着潮流而动，毕竟.........]]></description>
	  <comments>2005-9-24 20:45:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=209612&amp;PostID=2765399&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

  </channel>
</rss>
