Rise的自留地

记录生活中的点滴,分享编程技术和游戏开发经验。

0%

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
// Module Name: Ping.c
//
// Code by Rise
//
// Command Line Options/Parameters:
//        Ping [host] [packet-size]
//
//        host        String name of host to ping
//        packet-size    Integer size of packet to send (smaller than 1024 bytes)
//
//#pragma pack(1)

#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>

#define IP_RECORD_ROUTE 0x7
//
// IP header structure
//
typedef struct _iphdr
{
    unsigned int    h_len:4;        // Length of the header
    unsigned int    version:4;        // Version of IP
    unsigned char     tos;            // Type of service
    unsigned short    total_len;        // Total length of the packet
    unsigned short    ident;            // Unique identifier
    unsigned short    frag_and_flags;    // Flags
    unsigned short    ttl;            // Time to live
    unsigned short    proto;            // Protocol (TCP, UDP, etc.)
    unsigned short    checksum;        // IP checksum
    
    unsigned int        sourceIP;
    unsigned int        destIP;
}IpHeader;

#define ICMP_ECHO        8
#define ICMP_ECHOREPLY    0
#define ICMP_MIN        8    // Minimun 8-byte ICMP packet (header)

//
// ICMP header structure
//
typedef struct _icmphdr
{
    BYTE        i_type;
    BYTE        i_code;        // Type sub code
    USHORT    i_cksum;
    USHORT    i_id;
    USHORT    i_seq;
    // This is not the standard header, but we reserve space for time
    ULONG timestamp;
}IcmpHeader;

//
// IP option header – use with socket option IP_OPTIONS
//
typedef struct _ipoptionhdr
{
    unsigned char    code;        // Option type
    unsigned char    len;        // Length of option hdr
    unsigned char    prt;        // Offset into options
    unsigned long    addr[9];    // List of IP addrs
}IpOptionHeader;
#define DEF_PACKET_SIZE 32        // Default packet size
#define MAX_PACKET        1024    // Max ICMP packet size
#define MAX_IP_HDR_SIZE    60        // Max IP header size w/options

BOOL    bRecordRoute;
int        datasize;
char*    lpdest;

//
// Function: usage
//
// Description:
//        Print usage information
//
void usage(char* progname)
{
    printf(usage: ping -r <host> [data size]\n);
    printf(    -r        record route\n);
    printf(    host    remote machine to Ping\n);
    printf(    datasize    can be up to 1 KB\n);
    ExitProcess(-1);
}

//
// Function: FillICMPData
//
// Description:
//        Helper function to fill in various fields for our ICMP request
//
void FillICMPData(char* icmp_data, int datasize)
{
    IcmpHeader*    icmp_hdr = NULL;
    char*        datapart = NULL;
    
    icmp_hdr = (IcmpHeader*)icmp_data;
    icmp_hdr->i_type = ICMP_ECHO;        // Request an ICMP echo
    icmp_hdr->i_code = 0;
    icmp_hdr->i_id = (USHORT)GetCurrentProcessId();
    icmp_hdr->i_cksum = 0;
    icmp_hdr->i_seq = 0;
    
    datapart = icmp_data + sizeof(IcmpHeader);
    //
    // Place some junk in the buffer
    //
    memset(datapart, E, datasize - sizeof(IcmpHeader));
}

//
// Function: checksum
//
// Description:
//        This funcion calculates the 16-bit one’s complement sum
//        of the supplied buffer (ICMP)header
//
USHORT checksum(USHORT* buffer, int size)
{
    unsigned long cksum = 0 ;
    
    while(size > 1)
    {
        cksum += buffer++;
        size -= sizeof(USHORT);
    }
    if(size)
    {
        cksum += (UCHAR)buffer;
    }
    cksum = (cksum>>16)+(cksum&0xffff);
    cksum += (cksum>>16);
    return (USHORT)(~cksum);
}

//
// Function: DecodeIPOptions
//
// Description:
//        If the IP option header is present. find the IP options
//        within the IP header and print the record route option
//        values
//
void DecodeIPOptions(charbuf,int bytes)
{
    IpOptionHeader* ipopt = NULL;
    IN_ADDR    inaddr;
    int     i;
    HOSTENT host = NULL;
    
    ipopt = (IpOptionHeader)(buf + 20);
    
    printf(RR:    );
    for(i=0;i<(ipopt->prt/4)-1;i++)
    {
        inaddr.S_un.S_addr = ipopt->addr[i];
        if(i != 0 )
            printf(    );
        host = gethostbyaddr((char*)&inaddr.S_un.S_addr, sizeof(inaddr.S_un.S_addr), AF_INET);
        if(host)
            printf((%-15s) %s\n, inet_ntoa(inaddr), host->h_name);
        else
            printf((%-15s)\n, inet_ntoa(inaddr));
    }
    return;
}

//
// Function: DecodeICMPHeader
//
// Description:
//        The response is an IP packet. We must decode the IP header to locate the ICMP data.
//
void DecodeICMPHeader(char* buf, int bytes, struct sockaddr_in from)
{
    IpHeader    iphdr = NULL;
    IcmpHeader*    icmphdr = NULL;
    unsigned short iphdrlen;
    DWORD        tick;
    static int    icmpcount = 0;
    
    iphdr = (IpHeader*)buf;
    // Number of 32-bit words * 4 = bytes
    iphdrlen = iphdr->h_len * 4;
    tick = GetTickCount();
    
    if((iphdrlen == MAX_IP_HDR_SIZE)&&(!icmpcount))
        DecodeIPOptions(buf,bytes);
    if(bytes < iphdrlen + ICMP_MIN)
    {
        printf(Too Few bytes from %s\n,inet_ntoa(from->sin_addr));
    }
    icmphdr = (IcmpHeader*)(buf + iphdrlen);
    
    if(icmphdr->i_type != ICMP_ECHOREPLY)
    {
        printf(nonecho type %d recvd\n, icmphdr->i_type);
        return;
    }
    // Make sure this is an ICMP reply to something we sent!
    //
    if(icmphdr->i_id != (USHORT)GetCurrentProcessId())
    {
        printf(someone elses packet!\n);
        return;
    }
    printf(%d bytes from %s:, bytes, inet_ntoa(from->sin_addr));
    printf( icmp->seq = %d., icmphdr->i_seq);
    printf( time: %d ms, tick-icmphdr->timestamp);
    printf(“\n);
    
    icmpcount++;
    return;
}

void ValidateArgs(int argc, char argv)
{
    int i;
    bRecordRoute = FALSE;
    lpdest = NULL;
    datasize = DEF_PACKET_SIZE;
    
    for(i = 1; i < argc; i++)
    {
        if((argv[i][0] == -)||(argv[i][0] == /))
        {
            switch(tolower(argv[i][1]))
            {
                case r:        // Record route option
                    bRecordRoute = TRUE;
                    break;
                default:
                    usage(argv[0]);
                    break;
            }
        }
        else if(isdigit(argv[i][0]))
            datasize = atoi(argv[i]);
        else
            lpdest = argv[i];
    }
}

//
// Function: main
//
// Description
//        Set up the ICMP raw socket, and create the ICMP header. Add
//        the appropriate IP ooption header, and start sending ICMP
//        echo requests to the endpoint. For each send and receive.
//        we set a timeout value so that we don’t wait forever for a
//        response in case the endpoint is not responding. When we
//        receive a packet. decode it.
//
int main(int argc, char argv)
{
    WSADATA    wsaData;
    SOCKET    sockRaw = INVALID_SOCKET;
    struct sockaddr_in dest, from;
    int        bread, fromlen = sizeof(from), timeout = 1000, ret;
    char    icmp_data = NULL, recvbuf = NULL;
    unsigned int addr = 0;
    USHORT    seq_no = 0;
    struct hostent hp = NULL;
    IpOptionHeader ipopt;
    
    if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        printf(WSAStartup() failed: %d\n, GetLastError());
        return -1;
    }
    ValidateArgs(argc,argv);
    sockRaw = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED);
    if(sockRaw == INVALID_SOCKET)
    {
        printf(WSASocket() failed: %d\n, WSAGetLastError());
        return -1;
    }
    if(bRecordRoute)
    {
        // Setup the IP option header to go out on every ICMP packet
        //
        ZeroMemory(&ipopt, sizeof(ipopt));
        ipopt.code = IP_RECORD_ROUTE;    // Record route option
        ipopt.prt  = 4;                    // Point to the first addr offset
        ipopt.len  = 39;                // Length of option header
        
        ret = setsockopt(sockRaw, IPPROTO_IP, IP_OPTIONS, (char)&ipopt, sizeof(ipopt));
        if(ret == SOCKET_ERROR)
        {
            printf(setsockopt(IP_OPTIONs) failed: %d\n,WSAGetLastError());
        }
    }
    // Set the send/recv timeout values
    //
    bread = setsockopt(sockRaw, SOL_SOCKET, SO_RCVTIMEO, (char)&timeout, sizeof(timeout));
    if(bread == SOCKET_ERROR)
    {
        printf(setsockopt(SO_RCVTIME0)failed: %d\n, WSAGetLastError());
        return -1;
    }
    timeout = 1000;
    bread = setsockopt(sockRaw, SOL_SOCKET, SO_SNDTIMEO, (char)&timeout, sizeof(timeout));
    if(bread == SOCKET_ERROR)
    {
        printf(setsockopt(SO_SNDTIME0) failed: %d\n, WSAGetLastError());
        return -1;
    }
    memset(&dest, 0, sizeof(dest));
    //
    // Resolve the endpoint`s name if necessary
    //
    dest.sin_family = AF_INET;
    if((dest.sin_addr.s_addr = inet_addr(lpdest)) == INADDR_NONE)
    {
        if((hp = gethostbyname(lpdest)) != NULL)
        {
            memcpy(&(dest.sin_addr), hp->h_addr, hp->h_length);
            dest.sin_family = hp->h_addrtype;
            printf(dest.sin_addr = %s\n, inet_ntoa(dest.sin_addr));
        }
        else
        {
            printf(gethostbyname() failed: %d\n,WSAGetLastError());
            return -1;
        }
    }
    
    //
    // Create the ICMP packet
    //
    datasize += sizeof(IcmpHeader);
    icmp_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PACKET);
    recvbuf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PACKET);
    if(!icmp_data)
    {
        printf(HeapAlloc() failed: %d\n,GetLastError());
        return -1;
    }
    memset(icmp_data, 0, MAX_PACKET);
    FillICMPData(icmp_data, datasize);
    //
    // Start sending/receiving ICMP packets
    //
    while(1)
    {
        static int nCount = 0;
        int bwrote;
        
        if(nCount++ ==4)
            break;
        ((IcmpHeader*)icmp_data)->i_cksum = 0;
        ((IcmpHeader*)icmp_data)->timestamp = GetTickCount();
        ((IcmpHeader*)icmp_data)->i_seq = seq_no++;
        ((IcmpHeader*)icmp_data)->i_cksum = checksum((USHORT*)icmp_data, datasize, 0, (struct sockaddr*)&dest, sizeof(dest));
        
        bwrote = sendto(sockRaw, icmp_data, datasize, 0, (struct sockaddr*)&dest, sizeof(dest));
        if(bwrote == SOCKET_ERROR)
        {
            if(WSAGetLastError() == WSAETIMEDOUT)
            {
                printf(timed out\n);
                continue;
            }
            printf(recvfrom() failed: %d\n, WSAGetLastError());
            return -1;
        }
        if(bwrote < datasize)
        {
            printf(Wrote %d bytes\n, bwrote);
        }
        bread = recvfrom(sockRaw, recvbuf, MAX_PACKET, 0, (struct sockaddr*)&from, &fromlen);
        if(bread == SOCKET_ERROR)
        {
            if(WSAGetLastError() == WSAETIMEDOUT)
            {
                printf(timed out\n);
                continue;
            }
            printf(recvfrom() failed: %d\n, WSAGetLastError());
        }
        DecodeICMPHeader(recvbuf, bread, &from);
        
        Sleep(1000);
    }
    
    //Cleanup
    //
    if(sockRaw != INVALID_SOCKET)
        closesocket(sockRaw);
    HeapFree(GetProcessHeap(), 0, recvbuf);
    HeapFree(GetProcessHeap(), 0, icmp_data);
    
    WSACleanup();
    return 0;
}

打开/inc/Dv_ClsOther.asp 找到:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
If IsSqlDataBase = 0 Then
  If not IsObject(Application(Dvbbs.CacheName & "_TextAdservices")) Then
   Set XmlAds=Application(Dvbbs.CacheName & "_TextAdservices").cloneNode(True)
  Else
    Set XmlAds=Server.CreateObject("Msxml2.FreeThreadedDOMDocument" & MsxmlVersion )
    XmlAds.appendChild(XmlAds.createElement("xml"))
    XmlAds.documentElement.appendChild(XmlAds.createNode(1,"text","")).text="<iframe src="""&Dvbbs_Server_Url&"dvbbs/DvDefaultTextAd.asp"" height=""23"" width=""100%"" marginwidth=""0"" marginheight=""0"" hspace=""0"" vspace=""0"" frameborder=""0"" scrolling=""no""></iframe>"
  End If
 Else
   Set XmlAds=Server.CreateObject("Msxml2.FreeThreadedDOMDocument" & MsxmlVersion)
   XmlAds.appendChild(XmlAds.createElement("xml"))
 End If

这段,把变成红色的这一行注释掉. 在清除服务器缓存,就行了.

i32 智能更新程序包不能用于更新 Symantec AntiVirus 企业版 8.0、9.0 或 10.0 服务器 或 Norton AntiVirus 企业版 7.6服务器,但是可用于更新企业版客户端。x86 智能更新程序包可用于更新企业版客户端和服务器。 i32更新包可用于以下版本:

1,512K ADSL是什么意思? 512K=512Kbps=512K bits/s=64K bytes/s 我想这个换算应该没什么问题。

2,64K bytes/s意味着什么?

  这个64K的真正含义是“个人用户所能独享的最大下载带宽”   那么这又是什么意思呢,不知道现在有没有人注意过电信ADSL安装的申请表,上面的带宽项目写的是都是“不高于512K”,“不高于8M”等等,也就是说我们在正常的情况下可以拥有最多不超过64K的专有带宽。   注意是“不高于”,那么也就是说很多时候我们的专有带宽可能小于64K,那有又是为什么呢?   事实上,中国电信的ADSL是运行在ATM上面,ATM到chinanet边缘路由器带宽是155M,每一个边缘路由器可以连接3000用户,如果这些用户同时上网,那么每个用户其实只有50k bit/s的带宽,也就是7K bytes/s,加上路由器衰减,那么最终可能只有普通modem的速度了。   当然以上只是假想的情况,毕竟3000人同时连在一台边缘路由器上面几乎是不可能的,电信也不会让路由器满负荷连接而使得速度下降如此之巨。   但是,64K是最高专有带宽是毋庸置疑的。

   前两天,网上传出《网络行业协会点名十大流氓软件》的消息,其中包括cnnic的中文上网插件,还有3721的上网助手、地址栏搜索及网络实名插件,说实在话,我以前很反感3721的上网助手,因为去年我中过一次这个“3721病毒”,差点没让我重装系统,不过这次我觉得把3721再评进去,实在有点冤,不过话说回来,3721也不是什么好鸟,呵呵。

   至于cnnic,确实是无耻到极点,且不说整天打着个中国互联网信息中心的招牌,到处招摇撞骗,整天为它的.cn域名做广告,整天找一堆枪手四处散发文章,今天说这个什么.cn域名卖了100万美圆,那个什么卖了20万,这个玉米虫,那个玉米农的。简直就是恶心!

   我一般是不会主动去安装什么插件的,前段时间,我在donews里发现一个软件,好象是什么qq聊天机器人的玩意,我就给下载装上了,没想到这小子还带几个伴,其中就有CNNIC中文上网插件,还有什么ebay的,其他的我都一一卸载了,惟独就是CNNIC这个,怎么卸都卸不掉,每次都提示我卸载成功,结果每次都还在,最后实在没办法,找找google看看,没想到搜到的还真不少,看来被强奸的人还真不少。其中有人介绍用3721的上网助手能卸载,一试真还弄好了。然后我把这个3721上网助手卸载掉,打开ie,呵呵,乖乖,3721也在我的浏览器上装了网络实名,呵呵,算了,这次就不跟他计较了,毕竟人家帮了一次忙,索性把3721网络实名也卸掉了,不过还好,轻松搞定。

   现在继续说说CNNIC,cnnic到底是个什么玩意呢?看看cnnic的介绍吧!

    中国互联网络信息中心(China Internet Network Information Center,简称CNNIC)是经国务院主管部门批准,于1997年6月3日组建的管理和服务机构,行使国家互联网络信息中心的职责。

    CNNIC在业务上接受信息产业部领导,在行政上接受中国科学院领导。中国科学院计算机网络信息中心承担CNNIC的运行和管理工作。由国内知名专家、各大互联网络单位代表组成的CNNIC工作委员会,对CNNIC的建设、运行和管理进行监督和评定。

    作为中国信息社会基础设施的建设者和运行者,中国互联网络信息中心(CNNIC)以“为我国互联网络用户提供服务,促进我国互联网络健康、有序发展”为宗旨,负责管理维护中国互联网地址系统,引领中国互联网地址行业发展,权威发布中国互联网统计信息,代表中国参与国际互联网社群。

大家注意到这段话没?“为我国互联网络用户提供服务,促进我国互联网络健康、有序发展”,不知道CNNIC的人说这些话的时候,会不会心虚呢?不知道是为了网络用户提供服务,还是想强奸广大网络用户,不知道是为了促进网络健康发展,还是为了肆意传播病毒,危害网络健康。很早以前.cn域名是面向所有中国公民开放的,后来不知道什么原因,cnnic取消了个人域名的注册权,并且删除了很多个人注册的域名,这和现在大肆的宣扬“玉米虫”完全自相矛盾,不过想想,也不完全是,目的到是很明确——钱!往死里挣钱。哎…

   最后我还发现在一个有意思的事,在百度里输入“3721 CNNIC”出现了很多关于3721和cnnic之间的故事文章,呵呵,同时看看最下面的相关搜索:

相关搜索 cnnic 卸载cnnic cnnic是什么 如何卸载cnnic cnnic cdn 
如何删除cnnic cnnic 报告 cnnic 删除 怎样删除cnnic 更多相关搜索… 
 
   看来cnnic真是过街老鼠,呵呵!  最后我借用一下《天下无贼》中黎叔的话,对那些搞流氓插件的人,尤其要对cnnic说:“我最讨厌你们这些做流氓插件的,一点技术含量都没有!”

这是真实发生的事情,凤凰卫视进行了实况直播(也不知道我们NB烘烘的央视死哪  去了)
:(一个年青的日本女子问) “昨天我家中被贼偷了,有人说是中国人干的,你对这件事怎么看?”

答:南桔北枳:中国有句古话叫做“桔生淮南则为桔,桔生淮北则为枳”。中华民族 是知书达理的民族,人民勤劳、善良,在华夏大地创造出了璀璨的中华文明,贵国 的先民早在唐朝就曾经拜揭过中华帝国,学习过礼仪和文化。但我想在经历了几千 年的洗礼以后,贵国在礼仪上已经遗忘了许多,以至于生长于礼仪之帮的中国人 民,来到贵国就有可能迷失本心。我记得战国时晏子出使楚国,曾经说齐国人可以 在故园安居乐业,而到楚国却成为盗贼,原因仅在于民风问题。因此我建议贵国的 政府应该致力于民众道德礼仪的培养,只有环境好了,才可以杜绝偷盗,才可以从 根本上防止贵国人民忘记礼仪廉耻。
> >
> >
> > (一日本老头问) “我们很多日本人认为南京大屠杀根本没有发生过,你对这件事 怎么看”
> >
答:掩耳盗铃:这个问题其实很简单,首先您的逻辑是错误的。历史是事实,是不 能改变的,不是贵国人民,无论多少认为没有发生就没有发生。历史就是历史,是 已经发生的事情,任何掩耳盗铃的企图都是徒然的。如果我说大多数的中国人都认为日本其实是中华民族的后裔,日本民族起源于我过秦王朝一个方士携三千童男童女东海寻访仙山的事件,我想贵国政府、贵国人民,和您本人也会觉得这是一件非常荒谬的事情。当然我作为中国总理,也觉得这件事情不能接受,因为在心理上我不能容忍中华民族的后裔数典忘祖。
> >
> >
]:(一自称日本渔民的年轻人问)“我来自长崎,我们那的水受到了很大的污染, 这是由与跟中国靠得比较近的缘故,你对这件事怎么看”
> > 答:疑邻偷斧:您来自长崎,我感到非常的遗憾,为了您失去的亲人,为了遇难死 去的长崎居民,为了那些在二战中受到法西斯迫害的民众而哀悼。战争是残酷的, 是军国主义者用来满足贪欲的工具,作为爱好和平的人民一份子,我们都应当加以 警觉。我在国内的时候也听我国的一些渔民反应过,现在东海打鱼越来越少,他们 把原因归为贵国对海水的污染,开始的时候我不知道是何地,今天您的提醒使我明 了――原来是长崎。当时我就对那些渔民说,你们这种想法是错误并且愚蠢的,不仔细的反思自己的行为,而将原因归结为外在的原因,是在推卸责任,是非常卑劣和无耻的。古时我国有个预言故事叫做“疑邻偷浮”,非常有教育意义,我希望您能在闲暇期间仔细通读,如果有所启发,找到了自己内心的斧头,我们再交流看法。
> >
> > ]:(一观众提问)“台湾人民都不想回归中国,为何你们霸权欺压?”
> >
答:居心叵测:这是一个老生常谈的话题,我感觉回答起来很容易。讲一个简单的 例子,从前有个母亲含辛茹苦大半辈子,总算将自己的子女养育成人,她感到很欣慰,感觉可以松口气,歇一歇。于是对子女说!“来,回到母亲怀抱来,给妈妈捶 捶背.“然而这个不肖子,却吃惯了软饭,有奶就是娘,回头就不认这个曾经养育过他而今已经骨瘦如柴的母亲,反而对这星星和太阳大喊妈妈,想喝可乐,想要烧饼。那此时母亲应该如何?回答当然是给他一把掌。所谓国有国法,家有家规,无规矩不成方圆,任何事情都有它的规则和限度,台湾问题就是母亲和儿子之间的争吵,别人无权干涉。我国历来都主张和平解决台湾问题,从来都没有出现过霸权欺压的事情,反而总是有一些居心叵测的邻国,以民主、自由等等名义来强奸包括台湾同胞在内的中华民族的自主选择和决定权,这才叫霸权欺压。
> >
> >
> > 类似的话层出不穷。我想这样的座谈是很刁钻的,安排日本普通民众和朱总理会谈,问很多尖锐的问题来试探中国政府对反 日的决心,以一国的总理的身份当然不便当场和这些人搞僵,否则有失风度.不当场给他们清醒的警钟,日本的反华势力又会嚣张,并由此进一步鼓动或迷惑其他人,他们会说:“你们看,中国总理都不敢当面指责我们日本军人当年的行为,这就充分说明南京大屠杀纯粹是中国政府的 谎言”并且这些民众的来源又很值得怀疑
> >
> > 但是朱总理的回答是很见水平的。他是我们的好总理。在回答“你们中国人何时才会停止反复要求我们日本人就战争问题向中国道歉?”这个问题时朱总理毫不妥 协,说道: “日本从未在正式的文件中向中国人民道歉,而不是我们反复要求日本人道歉。中 国人民是不会忘记历史的,因为忘记历史就意味这背叛。”
> >
> > 整个实况转播都很压抑,总理一个人受到众多充满敌意的提问。一直到一个日本年轻女性提问气氛才有所缓和,这位女士提问“总理最喜欢的歌是什么,能不能给我们演唱?”
> > 总理说:“我最喜欢的是国歌,如果我唱你们都得起立。”
> > 当然没有人起立,总理也没演唱。

   只有懒惰的程序员才会去编写那些可以最终代替自己工作的自动化工具,才不会成天为了实现相似的功能去编写大段大段冗余重复的代码 - 这种代码往往是软件后期维护和重构的天敌。通常来说,由于惰性的驱使所产生出来的工具和程序将最终极大的提高生产开发的速度。

  当然,对于一个程序员来说,光光具备懒惰这个要素还是不够的。在享受懒惰之前,他必须以最大的热情和最高的效率去研究解放自己的途径,比如:找到最有助于开发的工具,最能体现“一次编写,多次复用”精神的代码架构的设计。只有在这些必要的工作之后,才可能真正享受轻松编程的乐趣。

  所以“懒”的精髓用一句老话来描述,那就是磨刀不误砍柴功。如果你不想办法磨亮手中的柴刀,就算一天二十四小时都在砍柴,效果也不如拿把锋利的斧头一天只砍一小时。

  从这个角度来说,Google给员工的20%自由时间是完全发挥了“懒”的能动力。为了更好的享受偷懒的乐趣,员工会更加具有创造力的去高效完成自己的任务。

  夸张一点来说,懒惰才是人类进步的原动力。

   这一点似乎比懒更让人不能接受。在解释这里所说的笨的具体含义之前,我们先看看一个聪明人(或者说认为自己足够聪明)会做什么:

  1) 停止学习新的东西
  2) 不愿意用批判的眼光去审视自己的工作

  第1点将使我们很难去接受或者主动的去研究一项新的技术 - 即使新技术能带给他更多工作上的便利。第2点会使我们无法清晰的分析自身工作的问题所在,要对其进行改进或者重构就更加困难。

  从这两点来考虑,作为一个程序员太自以为是不见得是件好事情。由于对自身的过于自信,往往无法客观的看待自己和自己的工作。相反的,笨一点(确切的说,谦逊一点)有时候倒有助于开发的顺利进行。举例来说,当程序出现bug的时候,最好尽早承认问题是出在自己编写的代码上面而不是在于编译器(当然除非是字节高低位编码方式之类的问题,这种问题编译器会是错误的根源之一)。如果你太自负的认为自己的程序没有问题而去猜测可能是编译器或者其他的什么外部因素出问题的话,那么十有八九你会在调试过程中走上一长段的弯路。

  程序员应该笨一些的更为关键的原因在于,当需要思考问题的最佳解决方案的时候,往往要求我们首先要跳出思维定式。你对系统了解的越多,积累了越多的经验,就越难走出已有的局限,可以尝试的范围就越小。相反的,对于一个什么也不懂的门外汉来说,因为没有任何失败的记忆和潜规则的约束,也就没有什么是“不可能”的,这样的大脑所能迸发出来的在专业人士看起来愚不可及的想法往往正是解决问题所需要的关键点所在。

  可能很多程序员都会有类似的经历,在面对别人(尤其是其他部门)对于一个bug的描述的时候,必须把自己摆在一个普通用户而不是程序开发者的角度来分析问题,否则的话可能你永远都想象不到这种错误也会发生。越能让自己变得“笨”起来,越能很快的定位到问题所在。我们先看看这么一段关于web开发问题的程序员和客服人员的对话:

  “从昨天开始我们的用户就看不到我们站点上的Logo了。”
  “他试过重启浏览器么?”
  “是的。”
  “他试过重启电脑么?”
  “是的。”
  “他清空过浏览器Cache么?”
  “是的。”
  “他的浏览器版本是IE6么?”
  “是的。”
  “他确信是真的看不到Logo了么?”
  “是的。”
  “他是在电脑显示器屏幕上看我们的站点么?”
  “什么?”
  “比如说,它可能是打印出来看不到?”
  “不。他是在显示器上看的。”
  “除了站点Logo之外,他是不是其他的图片都看不到?”
  “什么?哦。我再问问他。”

  从这段对话来说,估计用户实际上是禁止了浏览器显示图片的功能(或者他儿子干的)。不管怎么样,如果你不是用这种傻瓜式的思维方式去寻找答案的话,可能怎么也找不到问题的根源。  很多时候,问题发现者对于问题的描述往往是非常片面的,并且加上了主观推测的成分在里面。如果你不能透过这些主观的描述去发现问题的实际表象,或者说根本就是你自己根据程序员的经验逻辑来判断问题所在的话,十有八九会在歧途上越走越远。

  对于白痴级的问题,只有用白痴的行为方式才能得到答案。

  即便同样是程序员,但对于你的程序并不熟悉,也会经常有这样的疑问:“为什么我调用你的代码出错了?”这种问题的答案,很多时候是因为他们的调用方式不对,或者调用了错误的库文件,或者库文件的版本使用不当,或者根本就没有联接到库文件上。当你想让同事帮你检查一下程序中的一个莫名其妙的bug的时候,一般来说希望他对你的系统了解的越少越好,只有这样他才会问一些你自己认为绝对不可能出问题的“笨”问题。

  所以“笨”的精髓在于你如何去思考问题:不要假设些什么,把自己假设的太完美或者把别人假设的很聪明都会使你忽视一些很浅显的事实。思考的前提必须是完整的事实表象,思考的过程必须是抛弃成见的问题跟踪。在发现事实之前作太多的主观思考和臆断,倒不如把自己当作白痴一样来行动更好。

  当然,不思考的一个极端是不分情况都直接去做,另一个极端是完全脱离事实,用思想办事。一个优秀的程序员应该做好权衡。10次决定里面的1次错误决定不是致命的;只做5次正确的决定而另外5次没有任何决定才更糟糕。

  最后是一个蜈蚣的故事。蜈蚣本来用自己的几百只脚走路走的很快很好,但他从来没有花时间去想过为什么。直到有一天,一只臭虫问他:“你是怎么管理好你的几百只脚的?你不觉得这是件很困难的事情吗?”臭虫问完之后就走了。只剩下蜈蚣坐在地上,不停的思考这个问题,却一直想不出个究竟。从此以后,这只蜈蚣再也没办法好好的走路了。

导读:为了配合11月7日Visual Studio 2005和SQL Server 2005的推出,微软发布了.Net Framework 2.0的最终正式版,同时发布的还有.NET Framework 2.0 SDK。据微软称,.NET Framework 2.0 RC“改进了应用程序的可伸缩性、性能、存储、调度和ClickOnce升级,支持多种基于APS.NET 2.0的浏览器和设备”。