2009年7月2日星期四

20年嵌入式领域开发经验精华(慢慢看,新人会发现提高很快)(转)

来源:www.armjishu.com
作者:jesse
转载请注明出处

      我写这篇文章的目的,是用本人20年的嵌入式经验来告诉大家,没有明确的目标,成功将无从谈起。做任何事的第一步必须明确目标。

    与日常生活中的大多数事务一样,设计一个嵌入式产品的过程也必须从确定目标开始,对生产的产品进行明确定义。对产品进行定义主要是对产品是什么和能有什么功能进行描述,其次是在我们的整个开发过程中,应该要撰写一些开发文档,大概的框架的如下:

1)产品需求文档:描述产品的特性
2)功能需求文档:描述产品必须具备的功能
3)工程说明文档:描述系统实现的方法和满足需求的手段
4)硬件说明文档:对有关硬件进行描述
5)软件或固件说明文档:描述特定处理器下设计微程序以及固件的方法
6)测试说明文档:描述必须测试的项目和验证系统正常运行的方法

1.需求定义

    需求定义用来描述产品的基本功能,对于公司来说,需求一般由该公司的市场销售部门或该公司的主要客户来制定;而对小公司或爱好者(就像armjishu.com里的爱好者一样),技术人员可以自己负责定义需求,并撰写成文档。

通常需求定义是围绕以下几个因素而来:

1)系统的用途(定义需要系统实现的各种功能)

2)实际输入输出是何种方式实现的(为元器件的选型做参考)

3)系统是否需要操作界面(涉及软件层操作系统的选型)

    其实对小型的嵌入式产品来说,定义需求是非常关键的,因为需求清楚了,就可以避免后续开发过程中出现的诸如随机存储器(RAM)容量不足或所选的CPU速度不能满足处理的需要等一系列问题。

----------------------------------------------------------------------------------------------------------
下面举个简单的实际例子,供大家来参考:

系统描述:用于从化温泉的水泵换水系统
电源输入:使用来自于变压器的9V~12V直流电
水泵功率:375W
1)使用单相交流电机,由机械电气进行控制
2)如果温泉池处于低水位,则输入开关闭合信号,以禁止水泵继续运行
3)用户可以自由设置水泵运行或关闭的时间长度
4)除了自动设置控制外,还需要提供一种人工装置来允许维护人员灵活控制水泵进行维修
5)水泵开启/关闭/人工干预的时间可以30分钟为单位,在30分钟到23小时的范围内进行调节
6)显示设备可以指示水泵的开关状态,剩余时间,以及水泵是否处于人工干预模式
7)具备监视低水位的功能,并显示在屏幕上

    如果需要商用,那么除了上面给出的功能要求外,其设计文档中还要包括电磁干扰(EMI)和电磁兼容性(EMC)认证、安全认证以及使用环境(包括环境温度、湿度、盐雾腐蚀等)等方面的需求。

实际上,以上的需求确定之后,接下来就是要考虑选择一款合适的CPU来满足和实现系统的功能,那么我们就要将上述7点用户能够理解的需求转化成我们专业领域的需求,转化如下,大家可以参考一下:

a.处理或更新输入输出信号的速率究竟需要多快?
解释:目前嵌入式处理器的主频一般都在几十兆到几百兆不等,单片机的主频一般是几十兆,ARM处理器可以到几百兆;我们主要看这个产品是否需要对大量数据 进行处理,或是否需要对缓冲区进行频繁操作,是否有类似的占用CPU资料的工作要做,这就决定我们要选择一款合适的处理器来让该产品得到最佳的性能。

b.是否可使用单片集成电路(专用IC)或FPGA来完成数据处理?
解释:如果可以的话,就不一定要选择处理器来做,用这些专业芯片就能替代

c.系统是否有大量的用户输入输出操作(如对开关和显示设备进行频繁操作)?
解释:如果有的话,要在处理器选型的时候考虑这些因素,选择一款能够满足以上要求的CPU

d.系统与其他外部设备之间需要使用何种接口?
解释:这也是需要评估处理器的一个关键问题,选择具备这些接口功能的处理器会方便于我们的电路设计以及软件编程

e.设计完成后是否有可能需要进行改动,或在设计过程中系统需求是否可能出现变化?我们的设计是否能适应系统需求的变化?
解释:要避免选择的处理器刚好满足当前要求,这样当以后事务要求逐渐提高,处理器性能如果还有一定空间的话,那么就可以重用目前的产品;第二个就是要选择 不会即将停产的芯片,很多处理器用得很广乏,可以借鉴的资料也很多,但是很可能这款芯片已经在市场上流行很长时间了,芯片厂商已经推出更新换代的替代品 了,如果你选择了这款芯片,很可能1,2年后就买不到这款处理器芯片了,导致不得不重新选择新的处理器,重新设计产品,这样的既耗费时间,金钱,更消耗人 力,延误市场的战机。
----------------------------------------------------------------------------------------------------------

2.处理器的选择

1.1.需要使用的I/O管脚数量

  多数处理器都是使用内存和外部管脚来控制输入输出设备的,通常处理器都会有内置ROM和RAM的,如果内置的内存就已经满足需要,那么处理器就可以节省产 生引用外部存储器信号的引脚,这样处理器可为输入输出提供较多的设备管脚(某些处理器支持外部RAM或ROM的使用,但对外部存储器进行访问时,处理器一 般需要占用8条到10条I/O管脚)。

  还有,有些处理器带有专用的内部定时时钟,这类时钟也需要使用一个端口管脚来实现某些定时功能;某些处理器中还具有漏极输出和高电流输出能力,可以方便的直接驱动继电器或电磁铁线圈,而不再需要额外驱动硬件的支持。

  当对处理器I/O管脚进行计数时,我们一定要把使用处理器内部功能(如串行接口和定时器等)时限制使用的某些管脚考虑在内。

1.2.需要使用的接口数量
 
  嵌入式处理器的主要功能是与应用环境中的硬件进行交互操作,这不仅需要外部硬件对接口具有实时处理能力,而且还要求处理器必须以足够快的速度对接口数据进行有效处理。

  举例来说,AT91RM9200是ATMEL公司出品的一款工业级ARM9微处理器,它基于ARM920T核心,处理速度可达200MIPS,同时处理器 内部配置了USB、Ethernet 、支持RS485的红外串口、IIC、SPI、SSC等输出接口,其目的是更方便的利用这些接口开发出嵌入式产品。

  需要注意的是,由于许多处理器具有的局限性没有在处理器技术资料中给予足够的说明,因此一定要仔细阅读处理器的指标说明。例如,在阅读资料的过程中发现, 该资料可能会说明其串行接口可以在最高波特率下工作,但仔细研究该处理器的指标数据时,可能会发现并非该串口接口的所有操作模式都可以在最大波特率下运 行。

  深入了解并明确接口要求的方法:可以自己动手编写一些程序来对接口进行实际测试,以确认某种处理器是否可以满足应用的要求;因为,确认某个处理器是否可以满足接口要求并非是一件简单的任务。

1.3.需要使用的内存容量

  决定内存容量的大小是嵌入式产品设计过程中的一个基本步骤,如果对所需内存容量估计过高,那么我们就有可能会选择成本较高的解决方案;反之,如果低估了所需内存容量,就有可能因系统需要重新设计而导致项目不能按时完工。

  a.RAM和ROM的区别:存储器分为随机存储器(RAM)和只读存储器(ROM)两种。其中ROM通常用来固化存储一些生产厂家写入的程序或数据,用于 启动电脑和控制电脑的工作方式。而RAM则用来存取各种动态的输入输出数据、中间计算结果以及与外部存储器交换的数据和暂存数据。设备断电后,RAM中存 储的数据就会丢失。

  b.随即存储器(RAM)的选择:RAM容量的预测是比较直观的,我们只需把所有变量数目与所有内部缓冲区的容量以及先入先出(FIFO)队列长度和堆栈长度直接相加,就能得到所需RAM容量的总数。
    如果所需内存容量超出这类处理器的寻址范围,那么只能通过增加外部RAM来满足需求;然而,增加外部RAM的同时将会占用一定数量的I/O管脚来对扩展内存进行寻址,这种扩展往往会影响到处理器来实现应用的初衷。
    需要注意的一个问题是,某些微处理器限制RAM的使用,这种限制的目的是为了借用部分内存存储器作为内部寄存器组使用。除了以上因素外,所使用的开发语言也对所需RAM容量有一定的影响,某些效率较低的编译程序可能会占用大量宝贵的RAM空间。

  c.只读存储器(ROM)的选择:系统所需ROM的大小应该是系统程序代码与所有基于ROM的数据表容量之和。预测所需ROM空间容量比较困难的部分是预测程序代码的长度,解决这类问题的方法只能是随着经验的逐步积累来提高预测精度。
    然而,最重要的并不是精确计算程序的代码长度,而是要清楚地估算代码长度的上限。根据经验,如果80%的ROM空间被代码占用的话,那么就太拥挤了,除非能确保系统需求不会有任何变化,否则至少要为可能发生的变化保留足够的备用ROM空间。
    在多数情况下,我们可以试着在ROM中写入一部分程序代码,以便观察代码占用空间的情况,对于带有内部ROM的微处理器系统来说,系统程序都只能占用有限的程序存储器空间。

  d.经验之谈:ROM与RAM使用情况相类似,程序代码长度与所选用的开发语言有关。举例来说,使用汇编语言编制的程序要比使用C语言编制的程序占用少得多的空间。
    对于追求低成本的小型系统来说,一般不提倡使用高级程序设计语言;这是因为虽然高级语言在使用、调试以及维护方面来的比较容易,但同时这类语言需要占用更多的内存空间和大量的处理器时钟周期。
    如果开发语言选择不当,其后果可能是把一个简单、低成本的单片机系统变为一个需要使用配置若干兆字节RAM空间的64位嵌入式处理器系统。

1.4.需要使用的中断数量

  中断的主要用途是向中央处理器通报当前发生的某类特殊事件,这类事件包括诸如定时器超时事件、硬件引发的事件等。

  需要强调的是,多数系统设计师经常过多地使用中断功能,实际上,中断的主要作用只是中断现行程序的执行,中断最适用于必须要求中央处理器立即提供服务的事件。

  在需要设计和使用中断的情况下,一定要首先确认实际需要的中断数量,然后必须考虑到系统内部占用的中断资源,如果需要使用的中断资源超出了处理器可以接收的中断数量,我们就应借助于某些特殊手段来减少所需中断信号的数量。

1.5.实时处理方面的考虑
 
  实时处理是一个涉及范围很广的题目,其主要内容与系统的处理速度有密切联系,实时事件是嵌入式微处理器需要关注的主要任务。

  例如:处理器跟串口进行通信时,通常通过上层软件(为了保证实时性,进行任务切换的时间足够短),然后再占用处理器去执行从串口拿数据的任务,并且要保证 处理器的速率比串口速率快,那么处理器可以以最快的速度反应并处理串口的相关的任务,这样就可以达到最大的实时性;

  另一方面,如果处理器本身就内置了串口控制器、或DMA、或LCD的控制器等,那么它就可以保证直接使用这些处理器内置的接口去控制串口、液晶屏等对象,以达到最大的实时性能。

1.6.该厂商是否提供好的开发工具和环境

    选择一款新的处理器,很可能就要使用一个新的开发工具和开发环境,包括软件的编译环境等;对于开发日程安排比较紧张的项目来说,开发人员往往无法抽出专门的时间来研究,熟悉新的开发工具,从而也无法全面掌握开发工具的使用技巧。

  并且,有的开发工具价格也比较昂贵,而且很可能只能从制造商那里购买,还有仿真工具也是需要付费的,这些对我们在选择一款处理器的时候,是都应该考虑进去的成本因素。

1.7.处理器速度方面的考虑

  主要考虑几个细节问题:
  1)处理器速度与处理器时钟之间的关系

      例:单片机8031为例,由该处理器可以适应12MHz频率的输入时钟,因此就可以认为它是一个速度为12MHz的处理器了吗?不是,实际上,由于该处理 器内部逻辑电路执行每条指令需要多种不同频率的时钟脉冲,因此该处理器内部时钟电路要对输入的12MHz时钟12分频处理;最终为处理器提供的只是 1MHz主频。
   
      有的时候,80MHz主频的处理器(80MHz输入时钟,80MHz执行速度)要比200MHz主频的处理器(200MHz输入时钟,50MHz执行速度)执行速度要快得多。

  2)处理器指令系统

      如果不需要执行复杂数学运算的应用,那么RISC指令集的处理器要快;如果执行比较复杂的操作,则CISC指令集的处理器速度要更快。

  3)芯片结构体系

      现在有的芯片是将多个不同功能的核封装到一个芯片IC中,定制某种特定的功能,比如DSP,其中包括用于实现数字解码、乘法运算的硬件乘法器和移相器等; 然而,这类处理器也由其自身局限,往往在执行某些普通操作之前必须要使用额外的指令来把RAM中的数据放入内部寄存器,相比之下,一般处理器只允许对 RAM中的数据进行直接访问。

1.8.只读存储器(ROM)的选择

  多数工程项目在其开发阶段一般使用可擦写可编程只读存储器(EPROM)或快速存储器(Flash Memory);这类可擦写可重复写入存储器的主要优点是可多次使用。一旦产品研制完毕,就可以用一次写入设备(OTP)来取代EPROM存储器,一次性 写入器件的外观与封装几乎与EPROM完全一样,惟一不同之处就是其表面没有擦出窗口,并且价格要比EPROM低很多。

  但是,另外一种情况,如果该产品今后需要升级固件,或在线编程,那么我们还是应该选择可擦写可编程的存储器。

  还有一种是非易失的存储器,例如制造一台电视机,就有可能需要该设备具有记忆上次观看最后一个频道的功能,即使在切断电源后,该频道信息也不会丢失。

总结:所以,根据不同的产品选择不同的存储器也是一门很讲究的学问。

1.9.电源的要求
 
  在某些设计中方案中,电源根本不存在问题,对电源唯一的要求就是可以为电路正常供电;实际上,选择电源主要要考虑三个方面的问题:

  1)要注意设计方案中是否对电源的供电方式有所限制,例如,是否像大多数家用电器那样需要使用屋内墙上的电源插座供电,或是是使用USB接口供电

  2)看系统是否需要使用电池供电方式,如果这样,我们就要考虑选择那种对驱动电流要求不高的处理器,然后再为其选择合适的电池。

  3)休眠电流:许多微处理器都支持低功率运行模式,在这种模式下,系统的CPU处理器将处于休眠状态,同时所有外部设备的电源供电都被暂时切断,以便减少 系统的电能消耗;某些微处理器在这种方式下需要的维持电流极小,但也有一些微处理器在这种方式下并不能节省多少功率;不管怎样,我们都要对系统在节点模式 下的工作时间有一个估测,以便对具体情况选择使用的电池。

总之,无论哪种情况,我们都要对系统需要的供电总功率做到心中有数。


1.10.设备工作环境的要求

  环境要求主要内容是考虑温度,湿度等;如果系统必须在温度范围较大的环境下运行,诸如用于军事设备或汽车的控制系统,那么处理器可选择的范围就要小得多;

  并且由于大范围温度变化的设备通常比较昂贵,因此在设计过程中就不能再根据一般工业级器件的价格来制定预算。

1.11.使用周期成本
 
  如果我们的产品是mp3,在一般情况下,可以不必考虑在用户现场对mp3程序进行修改的问题,也不用为是否可以得到设备备件而着急,这是因为mp3是一种消费产品;

  换句话说,如果我们的产品是价值几万块的工业设备并且需要常年不断地运行,那么我们在产品设计过程中就必须从长计议了:

  a.首先,我们需要选择一种处理器或存储体系结构都可以升级的器件
  b.考虑到程序升级的可能,我们还要选择较大容量的内存
  c.最后要注意的则是所选处理器是否可以长期供货,这一点的重要性远远大于处理器的价格

  除了上面的考虑之外,使用周期成本也是在设计之初要考虑的因素。总的来说,生产的部件越多,则可以接受的前期开发成本也就越大。如果产品是mp3,我们可能会选择一个低价微处理器,同时投入一大笔钱来开发控制mp3的软件。

  但如果我们的产品是价格昂贵的工业用设备,那么在产品的使用期内,该设备的销售量将只有几百台,毫无疑问,开发这种产品最重要的就是降低开发成本(降低开 发成本而不是硬件成本!!!);除此之外,工业产品的成本也不像家用电器或消费电子产品那么敏感。综上所述,开发工业产品当然要选择一种便于进行开发并且 有助于缩短开发过程的处理器。

1.12.处理器相关资料是否丰富

    如果该款处理器在市场上已经用得很广了,那么我们可以获取更多的相关资料,观察人家的产品是如何使用处理器的,也能在网络上找到不少的相关的设计资料以及相关技术主题,这样就进一步降低了技术门槛,确保了使用该处理器做产品可行性,减低了风险;
 
    反之,如果是厂商全新推出的处理器,因为市场上还没有可以借鉴的产品,我们就只能从全英文的芯片手册开始阅读,了解这款芯片,这样开发周期不仅变长,而且不可预知的风险也很大。

3.开发成本的预测和估计

  大多数项目或产品都有专人负责预测整个过程的开发成本,对于任何项目来说,其开发成本主要包括人力和材料开销。

  预测开发成本在很大程度上需要根据经验,这也是为什么大型公司一般指定有经验的高级工程师来完成这一任务的原因,除了人力和材料的开销之外,总结下来,还有以下的开销:

  1)人力成本(开发人员、管理人员、销售人员、其他行政等辅助人员)的开销

  2)材料(硬件物料和损耗,有时候需要投几次PCB版才把产品稳定下来)的开销

  3)开发系统和开发工具软件的开销

  4)硬件工具的开销(例如示波器、仿真器等)

  对于整个项目来说,上述的开销将直接可能导致产品成本增加,其中人力成本最为关键,尤其是在中国,呵呵


4.产品开发设计文档(需要包括硬件和软件两个方面)

4.1 硬件文档撰写思路

    1)首先是需求定义或产品规格:

      如果这些是产品最终目标的话,那么产品对硬件和软件的要求就是技术方案的最终目标;对硬件和软件的要求是从定义用户界面和系统功能开始的。

  2)其次,根据需求,系统整体定义文档中给出硬件接口的具体定义:

      定义硬件最有效的方法是从需求开始描述,由于硬件必须支持系统定义的所有功能,因此硬件定义是与系统说明不可分割的;
      例如,我们设计一个定时器(事先需求说明定时器不能与个人电脑连接,故无法使用CRT显示时间),我们只有两种选择:一种是使用发光二极管(LED),另 一种是使用液晶显示器件(LCD);尽管LCD的显示效果比较好,但考虑到定时器要常年位于户外,并且早期LCD显示器不能在低温下工作,最终还是选择 LED设备(这整个过程描述了我们硬件选型时的一个思路,这个是密切跟需求挂钩的)

    3)一旦完成了系统整体说明文档,就开始进行系统设计:

      首先要对硬件说明的内容进行细化,包括添加能让工程师理解的设计意图,以及软件工程师围绕硬件进行程序设计时需要使用的硬件信息等。
      完成硬件电路板说明文档后,我们还要在该文档中增加一个用来描述系统的原始要求的前言部分,包括说明方案的设计思路和方法,除此之外,还要附上软件工程师用来对硬件进行控制所需的各类信息,这类信息主要包括如下内容(软件工程所需信息):
      -----内存和I/O端口地址(如果需要,还可以提供内存映射图)
      -----可用内存容量
      -----状态寄存器每一位的定义
      -----每个端口管脚的用途
      -----外部设备的驱动方法(例如,说明输入定时器电路的时钟频率等)
      -----其他有管软件人员设计程序需要了解的信息

      对于比较复杂的系统来说,硬件文档中经常使用两个独立的部分来进行说明;其第一部分用来描述硬件指标和工作原理,第二部分则主要为软件人员提供程序设计需要的信息。


4.2 软件文档撰写思路

      1) 软件文档与硬件文档的组织方法类似,软件要求文档的主要内容则是定义软件要实现的功能;一种是在简单项目设计过程中,软件定义也可以只对一种电路板使用的 软件给予描述;对较复杂的项目来说,由于参与这种项目的软件人员分别负责设计驱动不同硬件部分的代码(同一电路板),因此每个软件人员可能会为自己的设计 代码指定不同的定义,这类软件说明需要提供下列的内容:

      -----论述包括需求定义、工程指标、硬件参数等实施项目需要的内容
      -----说明软件之间、处理器之间或处理器与其内部器件之间使用的通信协议:其内容应包括对缓冲区接口机制、命令/应答协议、信号控制等协议的具体说明。
      -----借助流程图、伪代码或者其他可能的方法来描述软件的实现方法和过程

      2) 软件与硬件所考虑的不同之处(此经验方便技术总监或其他相关管理者参考,因为无论是多高深的技术管理者,要么是硬件出身,要么是软件出身,要么就是非技术出身)

      a. 软件的灵活性远远大于硬件,要让软件人员搞清楚某个软件的内部格式是非常困难的任务,解决的办法:详细定义其他程序员需要了解的编程接口具体内容,以及其他工程人员在实施开发项目过程中需要使用的技术细节信息。

      b. 软件工程师只有在收到硬件说明文档后,才有可能知道如何对系统硬件进行操作;而硬件人员一般不需要了解软件程序的技术细节。

      c. 由于软件易于更改,因此程序内容经常会按销售人员提供的要求发生变更,在某些情况下,软件文档的内容无法及时反映程序的最新变化。

      d. 软件经常是工程项目最后完成的部分,因此其文档也经常因时间不够而欠缺完整。实际上,软件文档是否详细、完整,在某种程度上是与公司或客户的要求有关的。例如,军事或国家工程一般要求开发商就其所有软件实现的功能提供全面详细的文档

      e. 有个潜规则,对软件的要求越复杂,则需求的正确可能性就越小,这个是经验之谈了,我们需要把准需求这个准绳来做文章,而不是陷入个人主义以及对软件要求而凭空发挥自己不切实际的想象。

      f. 我们可以先硬件设计,接着围绕该硬件编制软件。虽然实际系统的实现过程可能是软硬件并行开发,但软件人员基本上也是围绕着已经实现的硬件来进行程序设计的;对于更为复杂的系统来说,开发过程可能会出现重复。

      例如,某个项目的硬件工程师和软件工程师可能会坐下来开会,共同决定使用哪种硬件来实现某种功能;软件人员可能提出需要为数据缓冲区口冲内存容量,也可能要求提供某种外部设备接口,以便充分利用现成接口程序提供的各种驱动代码。

      总的来说,必须在提高软件开发效率与硬件系统的复杂性与成本之间进行权衡.

5.嵌入式高手对技术的理解(含辛茹苦这么多年的精华体验)

  有很多人认为:嵌入式系统性能的核心因素是软件功能,其实,如果按照这种逻辑,系统设计中存在的问题就应由软件人员来负责;其实这个观点实际上反映了设计 嵌入式产品时如何考虑划分硬件和软件各自应实现的功能,也就是这个功能是软件实现,还是考虑用硬件来实现(硬件实现:需要购买处理该功能的硬件芯片,从而 增加成本;软件实现:无需增加硬件成本,但会占用处理器以及内存的资源)。

  例如:我们在这里设计的基于ARM的mp3嵌入式产品,我们可以使用专业的解码芯片来负责mp3音乐文件的解码和播放功能,也可以使用另一种方法来解码 mp3语音文件,让ARM处理器利用软件控制寄存器来驱动耳机或音响,处理器通过对mp3语音文件解码之后再将解码后的数据流按照一定协议格式送给音频输 出的硬件接口进行播放。

  优点:这种方案在硬件方面节省了一个器件,降低了成本,并且该功能还方便调试(因为是软件实现的)。

  缺点:从另一个角度来看,虽然节省了一块语音解码芯片,但同时要在三个方面增加成本。
        首先,要在程序中增加语音协议解码的代码;
        其次,可能要把增加ROM来存放语音解码的协议,这样可以增加速度;
        最后,运行该程序将占用处理器的时间和资源。

  其实,话又说回来,对于本案例来说,上述成本的节约并不会引发任何问题,包括驱动程序增加也只需少量的,我们讨论这个mp3产品的案例的目的在于说明如何对软件硬件的功能进行合理划分。

  总的来说,交给软件实现的功能越多,则产品的成本就越低,当然这就要处理器必须有足够的处理速度和内存空间来实现设计指定的功能;常言说得好,天下没有免 费的午餐;把功能分配给软件来实现,会增加软件的复杂性、开发时间、以及程序的调试时间;然而,随着处理器的处理能力的不断提高,可以预见,越来越多的功 能将会由软件来实现。

  虽然在软件中实现各种功能会增加开发成本,但如果把功能移植到硬件中实现,则会增加产品的成本,这类开销是在构造每个系统组件时不可避免的。在低成本设计 方案中,增加任何额外的硬件都会对产品成本产生显著的影响,因此软硬件功能划分就是一个决定产品成本的大问题。在诸如大众消费产品这一类对成本非常敏感的 设计方案中,一般都会把无法通过软件实现的功能排除在外的。

完整的全文:http://www.armjishu.com/bbs/viewtopic.php?id=1312

2009年7月1日星期三

IT精英,必须掌握的命令行

一,ping   

  它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用 的原理是这样的:网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以 确定目标主机的存在,可以初步判断目标主机的操作系统等。下面就来看看它的一些常用的操作。先看看帮助吧,在DOS窗口中键入:ping /? 回车,。所示的帮助画面。在此,我们只掌握一些基本的很有用的参数就可以了(下同)。   

  -t 表示将不间断向目标IP发送数据包,直到我们强迫其停止。试想,如果你使用100M的宽带接入,而目标IP是56K的小猫,那么要不了多久,目标IP就因为承受不了这么多的数据而掉线,呵呵,一次攻击就这么简单的实现了。   

  -l 定义发送数据包的大小,默认为32字节,我们利用它可以最大定义到65500字节。结合上面介绍的-t参数一起使用,会有更好的效果哦。   

  -n 定义向目标IP发送数据包的次数,默认为3次。如果网络速度比较慢,3次对我们来说也浪费了不少时间,因为现在我们的目的仅仅是判断目标IP是否存在,那么就定义为一次吧。   

  说明一下,如果-t 参数和 -n参数一起使用,ping命令就以放在后面的参数为标准,比如"ping IP -t -n 3",虽然使用了-t参数,但并不是一直ping下去,而是只ping 3次。另外,ping命令不一定非得ping IP,也可以直接ping主机域名,这样就可以得到主机的IP。   

  下面我们举个例子来说明一下具体用法。   

  这里time=2表示从发出数据包到接受到返回数据包所用的时间是2秒,从这里可以判断网络连接速度的大小 。从TTL的返回值可以初步判断被ping主机的操作系统,之所以说"初步判断"是因为这个值是可以修改的。这里TTL=32表示操作系统可能是 win98。

  (小知识:如果TTL=128,则表示目标主机可能是Win2000;如果TTL=250,则目标主机可能是Unix)

  至于利用ping命令可以快速查找局域网故障,可以快速搜索最快的QQ服务器,可以对别人进行ping攻击……这些就靠大家自己发挥了。   

二,nbtstat   

  该命令使用TCP/IP上的NetBIOS显示协议统计和当前TCP/IP连接,使用这个命令你可以得到远程主机的NETBIOS信息,比如用户名、所属的工作组、网卡的MAC地址等。在此我们就有必要了解几个基本的参数。   

  -a 使用这个参数,只要你知道了远程主机的机器名称,就可以得到它的NETBIOS信息(下同)。   

  -A 这个参数也可以得到远程主机的NETBIOS信息,但需要你知道它的IP。

  -n 列出本地机器的NETBIOS信息。   

  当得到了对方的IP或者机器名的时候,就可以使用nbtstat命令来进一步得到对方的信息了,这又增加了我们入侵的保险系数。   

三,netstat

  这是一个用来查看网络状态的命令,操作简便功能强大。   

  -a 查看本地机器的所有开放端口,可以有效发现和预防木马,可以知道机器所开的服务等信息,如图4。   

  这里可以看出本地机器开放有FTP服务、Telnet服务、邮件服务、WEB服务等。用法:netstat -a IP。

  -r 列出当前的路由信息,告诉我们本地机器的网关、子网掩码等信息。用法:netstat -r IP。
四,tracert

  跟踪路由信息,使用此命令可以查出数据从本地机器传输到目标主机所经过的所有途径,这对我们了解网络布局和结构很有帮助。如图5。   

  这里说明数据从本地机器传输到192.168.0.1的机器上,中间没有经过任何中转,说明这两台机器是在同一段局域网内。用法:tracert IP。   

五,net   

  这个命令是网络命令中最重要的一个,必须透彻掌握它的每一个子命令的用法,因为它的功能实在是太强大了,这简直就是 微软为我们提供的最好的入侵工具。首先让我们来看一看它都有那些子命令,键入net /?回车如图6。

  在这里,我们重点掌握几个入侵常用的子命令。   

  net view   

  使用此命令查看远程主机的所以共享资源。命令格式为net view \IP。  

  net use

  把远程主机的某个共享资源影射为本地盘符,图形界面方便使用,呵呵。命令格式为net use x: \IP\sharename。上面一个表示把192.168.0.5IP的共享名为magic的目录影射为本地的Z盘。下面表示和192.168.0.7 建立IPC$连接(net use \IP\IPC$ "password" /user:"name"),   

  建立了IPC$连接后,呵呵,就可以上传文件了:copy nc.exe \192.168.0.7\admin$,表示把本地目录下的nc.exe传到远程主机,结合后面要介绍到的其他DOS命令就可以实现入侵了。   

  net start

  使用它来启动远程主机上的服务。当你和远程主机建立连接后,如果发现它的什么服务没有启动,而你又想利用此服务怎么办?就使用这个命令来启动吧。用法:net start servername,如图9,成功启动了telnet服务。   

  net stop

  入侵后发现远程主机的某个服务碍手碍脚,怎么办?利用这个命令停掉就ok了,用法和net start同。   

  net user

  查看和帐户有关的情况,包括新建帐户、删除帐户、查看特定帐户、激活帐户、帐户禁用等。这对我们入侵是很有利的,最重要的,它为我们克隆帐户提供了前提。键入不带参数的net user,可以查看所有用户,包括已经禁用的。下面分别讲解。

  1,net user abcd 1234 /add,新建一个用户名为abcd,密码为1234的帐户,默认为user组成员。

  2,net user abcd /del,将用户名为abcd的用户删除。

  3,net user abcd /active:no,将用户名为abcd的用户禁用。

  4,net user abcd /active:yes,激活用户名为abcd的用户。

  5,net user abcd,查看用户名为abcd的用户的情况  

  net localgroup

  查看所有和用户组有关的信息和进行相关操作。键入不带参数的net localgroup即列出当前所有的用户组。在入侵过程中,我们一般利用它来把某个帐户提升为administrator组帐户,这样我们利用这个帐户 就可以控制整个远程主机了。用法:net localgroup groupname username /add。   

  现在我们把刚才新建的用户abcd加到administrator组里去了,这时候abcd用户已经是超级管理员了,呵呵,你可以再使用net user abcd来查看他的状态,和图10进行比较就可以看出来。但这样太明显了,网管一看用户情况就能漏出破绽,所以这种方法只能对付菜鸟网管,但我们还得知 道。现在的手段都是利用其他工具和手段克隆一个让网管看不出来的超级管理员,这是后话。有兴趣的朋友可以参照《黑客防线》第30期上的《由浅入深解析隆帐 户》一文。   

  net time

  这个命令可以查看远程主机当前的时间。如果你的目标只是进入到远程主机里面,那么也许就用不到这个命令了。但简单的入侵成功了,难道只是看看吗?我们 需要进一步渗透。这就连远程主机当前的时间都需要知道,因为利用时间和其他手段(后面会讲到)可以实现某个命令和程序的定时启动,为我们进一步入侵打好基 础。用法:net time \IP。   

六,at

这个命令的作用是安排在特定日期或时间执行某个特定的命令和程序(知道net time的重要了吧?)。当我们知道了远程主机的当前时间,就可以利用此命令让其在以后的某个时间(比如2分钟后)执行某个程序和命令。用法:at time command \computer。   

  表示在6点55分时,让名称为a-01的计算机开启telnet服务(这里net start telnet即为开启telnet服务的命令)。   
七,ftp   

  大家对这个命令应该比较熟悉了吧?网络上开放的ftp的主机很多,其中很大一部分是匿名的,也就是说任何人都可以登陆上去。现在如果你扫到了一台开放 ftp服务的主机(一般都是开了21端口的机器),如果你还不会使用ftp的命令怎么办?下面就给出基本的ftp命令使用方法。

  首先在命令行键入ftp回车,出现ftp的提示符,这时候可以键入"help"来查看帮助(任何DOS命令都可以使用此方法查看其帮助)。   

  大家可能看到了,这么多命令该怎么用?其实也用不到那么多,掌握几个基本的就够了。   

  首先是登陆过程,这就要用到open了,直接在ftp的提示符下输入"open 主机IP ftp端口"回车即可,一般端口默认都是21,可以不写。接着就是输入合法的用户名和密码进行登陆了,这里以匿名ftp为例介绍。   

  用户名和密码都是ftp,密码是不显示的。当提示**** logged in时,就说明登陆成功。这里因为是匿名登陆,所以用户显示为Anonymous。   

  接下来就要介绍具体命令的使用方法了。   

  dir 跟DOS命令一样,用于查看服务器的文件,直接敲上dir回车,就可以看到此ftp服务器上的文件。

  cd 进入某个文件夹。

  get 下载文件到本地机器。

  put 上传文件到远程服务器。这就要看远程ftp服务器是否给了你可写的权限了,如果可以,呵呵,该怎么 利用就不多说了,大家就自由发挥去吧。

  delete 删除远程ftp服务器上的文件。这也必须保证你有可写的权限。

  bye 退出当前连接。

  quit 同上。
  

八,telnet

  功能强大的远程登陆命令,几乎所有的入侵者都喜欢用它,屡试不爽。为什么?它操作简单,如同使用自己的机器一样,只要你熟悉DOS命令,在成功以 administrator身份连接了远程机器后,就可以用它来干你想干的一切了。下面介绍一下使用方法,首先键入telnet回车,再键入help查看 其帮助信息。   

  然后在提示符下键入open IP回车,这时就出现了登陆窗口,让你输入合法的用户名和密码,这里输入任何密码都是不显示的。   

  当输入用户名和密码都正确后就成功建立了telnet连接,这时候你就在远程主机上具有了和此用户一样的权限,利用DOS命令就可以实现你想干的事情了。这里我使用的超级管理员权限登陆的。  

  到这里为止,网络DOS命令的介绍就告一段落了,这里介绍的目的只是给菜鸟网管一个印象,让其知道熟悉和掌握网络DOS命令的重要性。其实和网络有关 的DOS命令还远不止这些,这里只是抛砖引玉,希望能对广大菜鸟网管有所帮助。学好DOS对当好网管有很大的帮助,特别的熟练掌握了一些网络的DOS命 令。

  另外大家应该清楚,任何人要想进入系统,必须得有一个合法的用户名和密码(输入法漏洞差不多绝迹了吧),哪怕你拿到帐户的只有一个很小的权限,你也可 以利用它来达到最后的目的。所以坚决消灭空口令,给自己的帐户加上一个强壮的密码,是最好的防御弱口令入侵的方法。

  最后,由衷的说一句,培养良好的安全意识才是最重要的。

=========================================
开始→运行→命令集锦
winver---------检查Windows版本
wmimgmt.msc----打开windows管理体系结构(WMI)
wupdmgr--------windows更新程序
wscript--------windows脚本宿主设置
write----------写字板
winmsd---------系统信息
wiaacmgr-------扫描仪和照相机向导
winchat--------XP自带局域网聊天

mem.exe--------显示内存使用情况
Msconfig.exe---系统配置实用程序
mplayer2-------简易widnows media player
mspaint--------画图板
mstsc----------远程桌面连接
mplayer2-------媒体播放机
magnify--------放大镜实用程序
mmc------------打开控制台
mobsync--------同步命令

dxdiag---------检查DirectX信息
drwtsn32------ 系统医生
devmgmt.msc--- 设备管理器
dfrg.msc-------磁盘碎片整理程序
diskmgmt.msc---磁盘管理实用程序
dcomcnfg-------打开系统组件服务
ddeshare-------打开DDE共享设置
dvdplay--------DVD播放器

net stop messenger-----停止信使服务
net start messenger----开始信使服务
notepad--------打开记事本
nslookup-------网络管理的工具向导
ntbackup-------系统备份和还原
narrator-------屏幕"讲述人"
ntmsmgr.msc----移动存储管理器
ntmsoprq.msc---移动存储管理员操作请求
netstat -an----(TC)命令检查接口

syncapp--------创建一个公文包
sysedit--------系统配置编辑器
sigverif-------文件签名验证程序
sndrec32-------录音机
shrpubw--------创建共享文件夹
secpol.msc-----本地安全策略
syskey---------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码
services.msc---本地服务设置
Sndvol32-------音量控制程序
sfc.exe--------系统文件检查器
sfc /scannow---windows文件保护

tsshutdn-------60秒倒计时关机命令
tourstart------xp简介(安装完成后出现的漫游xp程序)
taskmgr--------任务管理器

eventvwr-------事件查看器
eudcedit-------造字程序
explorer-------打开资源管理器


packager-------对象包装程序
perfmon.msc----计算机性能监测程序
progman--------程序管理器

regedit.exe----注册表
rsop.msc-------组策略结果集
regedt32-------注册表编辑器
rononce -p ----15秒关机
regsvr32 /u *.dll----停止dll文件运行
regsvr32 /u zipfldr.dll------取消ZIP支持

cmd.exe--------CMD命令提示符
chkdsk.exe-----Chkdsk磁盘检查
certmgr.msc----证书管理实用程序
calc-----------启动计算器
charmap--------启动字符映射表
cliconfg-------SQL SERVER 客户端网络实用程序
Clipbrd--------剪贴板查看器
conf-----------启动netmeeting
compmgmt.msc---计算机管理
cleanmgr-------垃圾整理
ciadv.msc------索引服务程序

osk------------打开屏幕键盘
odbcad32-------ODBC数据源管理器
oobe/msoobe /a----检查XP是否激活
lusrmgr.msc----本机用户和组
logoff---------注销命令


iexpress-------木马捆绑工具,系统自带

Nslookup-------IP地址侦测器

fsmgmt.msc-----共享文件夹管理器

utilman--------辅助工具管理器

gpedit.msc-----组策略

2009年6月29日星期一

[转]最�的.Net下的委托入门讲解

作者:TomMax (笑望人生)    出处:csdn

主  题: “.net百题问答的活动”--许多人问过的--《 C#委托及事件 》

所属论坛: .NET技术 C#


有许多人问的,.Net中的委托以及事件处理。我拿简单的例子说明一下,是现实中的例子:

比如说一个公司(场景),你是老板,手下有两个员工,小张和小王。

你命令小王,如果小张玩游戏,则小王扣去小张500元钱。

这就是现实中的委托。


实际上,在写程序中,程序员就是老板,小张和小王就是两个对象。小张玩游戏是一个方法,小张还有一个游戏事件,他玩游戏激发这个事件。而小王就是事件处理对象,他负责把小张的钱扣除500。

所以,委托有如下几个要素:

1 激发事件的对象--就是小张

2 处理对象事件的对象--就是小王

3 定义委托,就是你让小王监视小张。

如果这三个要素都满足的话,则你就写出了一个完整事件的处理。


下面有个例子:在vs.net2003 C#控制台应用程序编辑运行成功:

using System;

namespace CSharpConsole
{

    public class 场景
    {
        [STAThread]
        public static void Main(string[] args)
        {
            Console.WriteLine("场景开始了....");

            // 生成小王

            小王 w = new 小王();

            // 生成小账

            小张 z = new 小张();

            // 指定监视

            z.PlayGame += new PlayGameHandler(w.扣钱);

            // 开始玩游戏

            z.玩游戏();

            console.writeline("场景结束...");

            Console.ReadLine();

        }

    }

    // 负责扣钱的人

    public class 小王
    {

        public 小王()
        {

            Console.WriteLine("生成小王...");

        }

        public void 扣钱(object sender, EventArgs e)
        {

            Console.WriteLine("小王:好小子,上班时间胆敢玩游戏...");

            Console.WriteLine("小王:看看你小子有多少钱...");

            小张 f = (小张)sender;

            Console.WriteLine("小张的钱: " + f.钱.ToString());

            Console.WriteLine("开始扣钱......");

            System.Threading.Thread.Sleep(500);

            f.钱 = f.钱 - 500;

            Console.WriteLine("扣完了....现在小张还剩下:" + f.钱.ToString());

        }

    }

    // 如果玩游戏,则引发事件

    public class 小张
    {

        // 先定义一个事件,这个事件表示“小张”在玩游戏。

        public event PlayGameHandler PlayGame;

        // 保存小张钱的变量

        private int m_Money;

        public 小张()
        {

            Console.WriteLine("生成小张....");

            m_Money = 1000; // 构造函数,初始化小张的钱。

        }

        public int 钱 // 此属性可以操作小张的钱。
        {

            get
            {

                return m_Money;

            }

            set
            {

                m_Money = value;

            }

        }

        public void 玩游戏()
        {

            Console.WriteLine("小张开始玩游戏了.....");

            Console.WriteLine("小张:CS好玩,哈哈哈! 我玩.....");

            System.Threading.Thread.Sleep(500);

            System.EventArgs e = new EventArgs();

            OnPlayGame(e);

        }

        protected virtual void OnPlayGame(EventArgs e)
        {

            if (PlayGame != null)
            {

                PlayGame(this, e);

            }

        }

    }

    // 定义委托处理程序

    public delegate void PlayGameHandler(object sender, System.EventArgs e);

}

2009年6月16日星期二

互联网的成本:不要低估背后的隐性成本(转)

摘自:http://www.chinaz.com/Webmaster/Club/0612O3162009.html


我经常遇到一些其他行业的人跃跃欲试的想做个网站挣钱,在他们眼中做网站成本很低,但是很挣钱,即使不能挣钱上市也可以骗骗VC弄点钱花。也不时的 听说某某找人投了几十万要做网站,拉几个弟兄,豪言壮语几年做到盈利,几年上市IPO,反正总之是告诉你这是他妈的万里挑一的发财好机会,错过这个村就没 这个店了,结果是钱花光了,没几个人注册,最终剩下几台破电脑和一堆鸡肋的页面。

传统行业的人在进入互联网行业之前总是过于轻视了一个网站的成本,他们只看到了一些显性的成本,却低估了背后的隐性成本,所以最终他们会发现花几百 万可以在南京路上开个日进斗金的店面而到了网络上也许连1万都赚不了,殊不知盈利的要素其一在于收入增长,其二在于成本控制,一个例子 是:Craiglist员工不足30人,去年成本约为1000万美元,但是去年营收却接近1亿美元[盈利9000万美元],Digg有70多名员工,去年 成本约为1400万美元,营收却只有850万美元[亏损中]。两者公司价值相差很大。我们今天不说收入,只说成本。

他们到底低估了哪些成本?以下几点是根据我自己亲身经历或遇到而总结的,每一条我都可以找出若干个例子来证明,所以基本上可以说是有普遍性。

1、人员开支

没人怎么做开发,没人怎么去运营,没人谁去做销售?人员开支会在网站成本中占据相当的比重,这点他们都可以看到,毕竟也是在传统行业有过成功经历的人,不可能没有这眼光,但是他们眼中的人员就是:程序员、美工、运营,略懂一些的会再找个策划,完事。

2、硬件支出

硬件支出这块基本上他们会严重低估的,因为很多人如果不是这个行业的话是不了解一个网站的原理的,在他们眼中一台服务器最多再加个独享带宽就可以解决所有问题了,所以就会出现例如"10M独享能不能做成个youtube这样的站点?"的问题了。

3、开发成本

非常严重的被低估,在他们看来花个几万块钱把需求提的尽善尽美来外包做出一个站点然后就可以一劳永逸的解决问题了,可是哪家优秀的网站会是靠外包做 的呢?即使是出钱养一个UI(不对,他们会说是美工)和几个程序员来自己做,也是想当然的认为这就没问题了,认准一个网站就给我照着它抄吧,但是抄到最后 总发现还是有问题。当然有问题了,一个完整的开发流程需要多少个角色,需要多长的周期?瀑布模型?哦不,他们会觉得有了程序员就可以搞定一切问题的。

4、推广与运营

这块基本上他们是看不到的,因为他们会根据自己的体验作出判断,他们对于一个网站的认知只在于那一个浏览器窗口和页面,却没有看到这背后的东西。所 以我在文章开头说的昨天看到的那个行业网站很恐怖(只能用这个词来形容了),基本上把整个阿里巴巴给完全抄过来了,哦,还抄了淘宝的一部分。后来我问朋友 有多少人在运营这个站点?答曰不到10个,没有推广与市场预算。我……

他们看不到这些成本,所以他们觉得挺多的几百万就轻飘飘的砸进去却连个响声都听不见,这种例子实在是太多,尤其是在民间资本过于发达的浙江,从某种 程度上来说是阿里巴巴的成功误导了这群人,更应该说是成功以后的阿里巴巴误导了这群人,马云更应该把那个家庭作坊式的管理混乱的那个拿到钱后四处扩张惨败 而归最后缩回杭州的阿里巴巴讲给他们听听,而不是让他们觉得找十八个人租两件民房捣鼓一个站点就可以再整出个1688来。

我越来越觉得以后是不会有纯正的互联网公司了,互联网早晚会和传统行业完全融合在一起,成为一种工具。到那时,理性的人们也不会去冲动的去有出点钱 折腾个网站去上市的想法了,这个行业还是很年轻,互联网的一代还没有成为这个社会中掌握财富的中间力量,这种情况在未来的几十年中应该会逐渐的消失。

这也算是我们这个年代的一个特色吧。

2009年6月15日星期一

生活常识积累!

 个案1:
  有一妇女手提包被偷,里面有手机、银行卡、钱包等。 20分钟后,她打通了老公的电话,告诉自己被偷的事。老公惊呼:"啊,我刚才收到你的短信,问咱家银行卡的密码,我立马就回了!"他们赶到银行时,被告知里面所有的钱都已被提走。小偷通过用偷来的手机发送短信给 "亲爱的老公" 而获取了密码,然后在短短20分钟内把钱取走了。
  提醒:不要在手机通讯录中暴露自己与联系人的关系,忌用 "家电" 、" 老公"、"爸妈"等称呼。一律用名字,字越少越安全。
  个案2:
  有三位自驾游的朋友不慎连人带车跌落一百五十公尺深的山谷,受困四日三夜后,才获救。其间,他们曾多次想以手机向外求救。无奈一只被摔坏,一只没电了,一只收讯不良。他们还多次移动位置以寻找较佳的收发信号地,但都不成功。如果这三位人士平常就知道112专线,紧急时刻也能知道如何用那只收讯不良的手机拨出112专线,相信他们可以很快获救。
  提醒:
  全国各地通用的112专线,在手机打开后即使没有接收信号,甚至电力极为微弱,任何厂牌的手机在任何地点皆可拨通。拨出112后,马上会进入语音说明如下∶这里是行动电话112紧急救难专线,如果您要报案,请拨0,我们将会为您转接警察局;如果您需要救助,请拨9,我们将会为您转接消防局。中文讲完后,会以英文重述一遍。此时只要拨0或9,一定会有人接听。以三位人士所处的情况,或登山迷途或遭遇其它困境时,应拨9,将可获得及时的救助。
  个案3:
  有个留学生喜欢吃速食杯面,后来,这位留学生因身体不适去医院看病,医生发现他的胃壁附着一层蜡!原来,杯面的容器里包含一种可食用的蜡!各位下次吃杯面的时候摸摸看杯壁是不是觉得滑滑的,那就是了。而长时间的食用杯面,将造成我们的肝脏无法分解这种食用蜡。最后,这位留学生不得不寻求手术治疗以移除这层蜡,不幸去世。
  提醒:
  吃泡面的时候,尽量把面拿出来,另外用碗来泡食,不要用碗面、杯面所附的容器直接冲开水食用。哪怕是出差,也要带上一只大茶缸泡面用。为了自己的身体,不要偷懒啊
  个案4:
  一件很可怕的事:有一天,一个 21岁男生戴着隐形眼镜去参加一个烤肉野聚会!就在他开始以木炭生火之后的几分钟,他突然大叫一声,然后很痛苦的跳来跳去,在地上打滚……全场的人都吓呆了,没人知道究竟发生了什么事?大家赶紧送他到医院,医生检查后遗憾地说,他的眼睛失明了!
  提醒:
  参加野外烧烤或任何有可能接触到火源的时候,请不要戴隐形眼镜!因为隐形眼镜是用塑胶制成的,过热的温度会熔化我们眼中的隐形眼镜!
  个案5:
  苏西跌倒了,雪丽看到苏西跌倒就立刻问了苏西"三个问题"。她见苏西无法回答这三个问题,就立即打120电话求救。虽然当时苏西的血压正常,看起来也没有中风的样子。但因为雪丽有"三个问题"的认知常识,坚持把苏西送到医院救治,使苏西很快康复而没有留下后遗症。
  提醒:
  有时候中风的征兆很难辨识,常因为中风患者旁边的人没有适时发现,延误救治而使患者脑部受损。我们要问患者的三个问题是:要求病患展示笑容;要求病患两只手都举起来;要求病患说出一句简单的话。如果病患无法做到这三点,周围的人就应该立即打120救护电话,并且告诉随车的救护人员这是中风的征兆。如果我们能够广泛传递并且应用这种询问方式,测试中风征兆,就可以迅速诊断治疗中风患者,最大限度地避免患者脑部受损。
  (1)建行一同志转述: 今天经过一栋大楼门口,门口有一提款机。有一个老伯,一直看着我走过他身边,突然叫住我,他说他不识字,拿一张银行卡要我帮他在大楼门口的自动提款机取钱。我回答我无法帮你取,叫警卫帮你。结果,他就回答我说不用了,继续找其他路人帮他取钱。朋友们要记住---取款机可是有摄影机耶。万一他说我抢劫或是偷他的提款卡,甚至他的卡片是偷来的,帮他领钱会在提款机留下影像,绝对会让你百口莫辩!我会警惕 ! 是因为已有同事上当,目前仍官司缠身。显然这是诈骗集团在找替身了! 请立即传出去~~~ 骗案真是层出不穷,一不小心就会踏入陷阱,真是令人防不胜防!提醒各位朋友在外多小心!
  (2)芍药居一业主,家中突然断电,看到窗户外别人家里都有电,就出门查看自家电表箱,打开门就被刀子顶着了?D?D持刀入室抢劫....提醒大家如果家里突然断电,不要贸然就开门查看,有猫眼的多观察一会门外动静,没猫眼的也隔着门静听一段时间,没有异常响动再开门 .
  (3)各位女同胞们注意了!这是最新骗局女同胞请注意男同胞请叫自己的朋友注意 :新出的情况,女性朋友要特别注意啦:一位上班的小姐在下班回家的路上看到一个小孩子一直哭,很可怜 ,然后就过去问那小朋友怎么了.小朋友就跟那个小姐说:" 我迷路了,可以请你带我回家吗?"然后拿一张纸条给她看, 说那是他家地址.然后她就笨笨的带小孩子去了.一般人都有同情心,然后带到那个所谓小孩子的家里以后,她一按铃,门铃像是有高压电,就失去知觉了.醒来就被脱光光在一间空屋里,身边什么都没有了,她甚至连犯人长啥样子都没看见.所以,现在人犯案都是利用同情心啊,如果遇到类似这种的,千万别带他去,要带就带他到派出所去好了,走丢的小孩放到派出所一定没错啦,请通知身边所有女性,为了广大女士的安全,看完后麻烦给转发给所有人....
  (4)今天遇到讨饭新招,大家注意提防了~~
  今天在家休息,有人按门铃,开门一看,是个50来岁的老妇女,手里拿了2包喜糖,我还以为是邻居来分喜糖的,结果一开口,听得出不是本地人,她说什么这2包糖给我们的,图个喜气,要换一点钱给她,后面还说了一大堆不知道什么,我也没听清楚,感觉就是不对,吓的马上关门,晕!这年头,还有这么讨钱的...
  (5)大家注意了!到自动取款机取钱时一定要倍加小心!!!!!
  昨晚在金海里的工行自动取款机取钱时,后面来了个老妇女,问我能不能取钱,还说什么取款机有个键可能坏了,旁边不知什么时候来了个小女孩,一直想往我身边挤,我也没在意,小孩子淘气嘛,可是过分的是她竟然把手朝出钞口放,准备拿我的钱了,我感觉不对劲了,立即把她推到一边,等着把钱取出来。之后我想了一下,她们俩给我设了个套:老妇女负责和我瞎聊,吸引我的注意力,小女孩趁我不注意时抢走我的钱!如果我不防备的话,钱说不定就被抢走了,这样的话,我就进套了:(一:我立即去追小女孩,去追回我的钱,可是谁又会相信一个小女孩能抢我一个大人的钱呢?更可怕的是站在我后面的老妇女将会取光我卡中所有的钱,因为我的卡还在取款机里面;二:我不立即去追小女孩,等拿到卡再追,到那时小女孩就无影无踪了,钱也就没了啊:(她们真的很"聪明",很可耻的!!!)
  (6)我父母都退休在家。昨天上午,来一陌生中年人,说自己摩托车油开没了,加油站太远,摩托车又太重推不动,所以想问我父母要一个可乐瓶去买汽油,刚开口就说实在不行就出2、3元买一个空瓶好了。我母亲就拿了个空瓶给他,别说他还真从口袋里掏出钱来,不过是几张百元大钞,还让我父母找钱。我母亲顿生警觉,说算了,不过是一个空瓶而已。他非要把100元钱破开买下来,只不过还是那张百元大钞。好在我母亲尚未龙钟,也不是那种爱贪小便宜的人. 女性朋友一定要认真看完,注意自我安全啊,现在万恶的社会....朋友发给我一篇报道,现转给各位看看 ,出门在外,千万小心,小心千万....
  (7)一对新婚夫妇到巴黎度蜜月。在巴黎,妻子在一间时尚服装店试衣服 ,身为丈夫就在试衣间外等候。但等候多时却不见妻子走出来 ,紧张的丈夫要求店员帮忙到里头查看 ,却意外发现试衣间空无一人。丈夫以为妻子开玩笑作弄人 ,要他紧张.于是回到酒店等她回来。几小时后却不见妻子的踪影,才知事态严重。丈夫赶忙报警 ,并到巴黎所有服装店和医院询问妻子下落。三星期过去了,妻子犹如从人间蒸发,音讯全无,伤心的丈夫只能收拾包袱回到老家。由于无法从绝望中振作,丈夫无心工作,一直独自生活 ,决定把自己放逐,流浪到各地方。几年后 ,他心血来潮到巴厘岛,在一破旧的屋子参观一畸形秀 ( freak show ) 。他见到一脏生锈的铁笼里,有一女人四肢全无,身躯,包括脸部,犹如破布般残破 ,充满疤痕。她在地上扭曲着 ,并发出有如野兽般的XXXXX声。突然间男人惊恐地发出尖叫声。他从那毫无人样的女人脸上见到,他再熟悉不过,属于他新婚不久就告失踪的妻子脸上的红色胎记。
  (8)另一版本则发生在上海。几年前一女通知公安她的表妹在上海市集购物时无故失踪,可是遍寻不着 ,直到五年后一友人撞见这表妹在泰国曼谷街道上行乞。XXX的是她不知何故没了双手双脚,身子被铁链绑在灯柱旁。
  (9)最近有人告诉我,他的朋友在晚上听到门口有婴儿在哭,不过当时已很晚了而且她认为这件事很奇怪,于是她打电话给JC。JC告诉她∶「无论如何,绝对不要开门。」这位女士表示那声音听起来象是婴儿爬到窗户附近哭,她担心婴儿会爬到街上,被车子碾过。JC告诉她∶我们已派人前往,无论如何不能开门。警方认为这是一个连续杀人犯,利用婴儿哭声的录音带,诱使女性以为有人在外面遗弃婴儿,她们出门察看。虽然尚未证实此事,但是警方已接到许多女性打电话来说,他们晚上独自在家时,听到门外有婴儿的哭声,请将这个消息传给其他人,不要因为听到婴儿的哭声而开门。

2009年6月9日星期二

解读 QQWry.Data ――IP地址库文件数据(转)


摘自:http://bbs.phpchina.com/viewthread.php?tid=83509

按项目计划,最近要实现用户IP地址到所在地址区域的转换,这里不仅只是解读出地区文字,还需要对应原有的地区数据;所以要把地区代码(机构组织码)与IP地址建立对应关系。我选择纯真版IP地址库来建立对应关系表。

从网上下载了最新的 QQWry.Data 库文件,首先碰到的一个问题是解析这个文件。根据网上的资料(LuamaQQ作者写的日志),根据自己的摸索,总结出了此文件的内容结构,以及解读方式。

一、文件结构
文件主要分三个结构
1、文件头,8个字节;
2、数据记录区,不定长度;
3、索引区,长度为 7 的整数倍;

二、文件头
文件头的8个字节分两部分,每个部分4个字节,分别指定了索引区的开始地址和结束地址。所以可以通过两个地址的差值 除 7 后 加 1 可以计算出总的记录数。

二、记录区
记录区的数据需要通过索引区的数据来获得各个数据的起始位置;本区数据记录了IP地址的结束地址和地区字符串;所有地区字符串都以 0x00 为结束。

三、索引区
检索IP对应的地区,关键就是找到IP起始地址对应的索引内容。一个IP索引数据包含7个字节,前4个字节是IP地址起始值,后3个字节是对应的IP数据 记录在文件内的偏移地址;IP数据记录中,前 4 个字节是IP结束地址;紧跟的数据有两种模式: 0x01 模式 和 0x02 模式。

0x01模式,即在IP数据的第5个字节是 0x01,则在后面的 3 个字节是国家地区数据的偏移地址;国家地区数据包括国家和地区这两个字符串。即
---------------------------------------------------------------
4字节 |  3字节 重定向 0x NN NN NN -> 国家地区数据的文件偏移地址
---------------------------------------------------------------

0x02模式,即在IP数据的第5个字节是 0x02,则在后面的 3 个字节是国家数据的偏移地址,地区数据是再往后的字符串,以 0x00 截至。即
-----------------------------------------------------------------------------
4字节 | 3字节 重定向 0x NN NN NN -> 国家数据的文件偏移地址 | 地区字符串 | 0x00
-----------------------------------------------------------------------------

对于 0x01 模式所得到的 国家地区数据中,它可能又带有一个重定向结构,即
--------------------------------------
国家字符串 | 0x00 | 地区字符串 | 0x00
--------------------------------------

-------------------------------------------------------------------------
国家字符串 | 0x00 | 0x02 | 3字节 0x NN NN NN -> 地区字符串的文件偏移地址
-------------------------------------------------------------------------

对于前一种情况,比较简单,直接读出两个字符串数据就可以了;对于后一种情况,需要再次重定向到地区字符串的偏移地址,然后读取到 0x00 为字符串结尾。

对于这种采取地址映射实际字符串值的方式,主要作用是避免重复记录字符串值。在整个IP地址库文件中,有太多相同字符串记录了,采用 3 字节的映射地址要比重复记录字符串值节省太多空间了。

这里附上PHP版的解读代码:

<?php

function bin2ip($bin)

{

    
$ip '';

    
$bd str_split($bin1);

    for(
$i 4$i 0$i--){

        
$ip .= "." sprintf("%03d"implode(''unpack('s'$bd[$i-1] . chr(0))));

    }

    return 
substr($ip1);

}



//--------------------------------------------------



$f fopen('QQWry.Dat''r');



$c fread($f4);

$d fread($f4);



$index_begin implode(''unpack('L'$c));

$index_end   implode(''unpack('L'$d));

if(
$index_begin 0$index_begin += pow(232);

if(
$index_end   0$index_end   += pow(232);



$ip_num = ($index_end $index_begin) / 1;



echo 
"index begin at: $index_begin\n";

echo 
"index end   at: $index_end\n";

echo 
"ip data count : $ip_num\n";



$output '';



for(
$i 0$i $ip_num$i++){



    
//文件指针指到每个IP数据文件的索引取得索引数据(7字节)上

    
fseek($f$i $index_begin);

    
$ip4 fread($f4);                //IP起始地址

    
if(strlen($ip4) < 4) exit('data file error');



    
$ip3 fread($f3);                //IP记录偏移地址

    
if(strlen($ip3) < 3) exit('data file error');



    
$dataseek implode(''unpack('L'$ip3 chr(0)));

    if(
$dataseek 0$index_ip_record += pow(232);



    
//指向记录区 $dataseek 位置查找记录

    
fseek($f$dataseek);

    
$ipdata fread($f4);                //IP结束地址

    
if(strlen($ipdata) < 4) exit('data file error');

    

    
$area '';

    
$country '';



    
//读一个标记位

    
$flag fread($f1);

    if(
$flag == chr(1)){                //国家名偏移标记位    模式一 0x01

        
$area1seek fread($f3);

        if(
strlen($area1seek) < 3) exit('data file error');

        
$area1seek implode(''unpack('L'$area1seek chr(0)));

        
fseek($f$area1seek);



        
$flag fread($f1);            //可能又是标记位

        

        

    
}

    if(
$flag == chr(2)){                //国家地区 重定向

        
$area1seek fread($f3);

        if(
strlen($area1seek) < 3) exit('data file error');

        
$area1seek implode(''unpack('L'$area1seek chr(0)));



        
$flag fread($f1);

        if(
$flag == chr(2)){

            
$area2seek fread($f3);

            
$area2seek implode(''unpack('L'$area2seek chr(0)));

            
fseek($f$area2seek);

        }else{

            
fseek($f, -1SEEK_CUR);

        }

        while((
$c fread($f1)) != chr(0)) $area .= $c;

        

        
fseek($f$area1seek);

        while((
$c fread($f1)) != chr(0)) $country .= $c

    }else{

        
fseek($f, -1SEEK_CUR);

        while((
$c fread($f1)) != chr(0)) $country .= $c



        
$flag fread($f1);        //如果地区是重定向的

        
if($flag == chr(2)){

            
$area2seek fread($f3);

            
$area2seek implode(''unpack('L'$area2seek chr(0)));

            
fseek($f$area2seek);

        }else{

            
fseek($f, -1SEEK_CUR);

        }



        while((
$c fread($f1)) != chr(0)) $area .= $c;

    }

    
$adata trim($country) . trim($area); //$country是国家字符串 , $area 是地区字符串



}





fclose($f);

?>

复制代码
完整的代码地址 http://www.terry39.com/uploads/p ... lation_php_code.rar

八条佛曰 66句震撼人心的禅语

八条佛曰

1、佛曰:忘记并不等于从未存在,一切自在来源于选择,而不是刻意。不如放手,放下的越多,越觉得拥有的更多。


2、佛曰:命由己造,相由心生,世间万物皆是化相,心不动,万物皆不动,心不变,万物皆不变。


3、佛曰:坐亦禅,行亦禅,一花一世界,一叶一如来,春来花自青,秋至叶飘零,无穷般若心自在,语默动静体自然。


4、佛曰:笑着面对,不去埋怨。悠然,随心,随性,随缘。注定让一生改变的,只在百年后,那一朵花开的时间。


5、佛曰:刹那便是永恒(若人生了悟如佛,无悲无喜无梦无幻,无爱无恨四大皆空,生与死又有何区别。不能了,不能悟,不能舍,不能弃,参不透,舍不得。)


6、佛曰:不可说,不可说,一说即是错。


7、佛曰:一念愚即般若绝,一念智即般若生。


8、佛曰:菩提本无树,明镜亦非台。本来无一物,何处惹尘埃。

 

 

66句震撼人心的禅语 

1. 人之所以痛苦,在于追求错误的东西。
2. 如果你不给自己烦恼,别人也永远不可能给你烦恼。因为你自己的内心,你放不下。
3. 你永远要感谢给你逆境的众生。
4. 你永远要宽恕众生,不论他有多坏,甚至他伤害过你,你一定要放下,才能得到真正的快乐。
5. 当你快乐时,你要想这快乐不是永恒的。当你痛苦时,你要想这痛苦也不是永恒的。
6. 今日的执著,会造成明日的后悔。
7. 你可以拥有爱,但不要执著,因为分离是必然的。
8. 不要浪费你的生命在你一定会后悔的地方上。
9. 你什么时候放下,什么时候就没有烦恼。
10. 每一种创伤,都是一种成熟。
11. 狂妄的人有救,自卑的人没有救,认识自己,降伏自己,改变自己,才能改变别人。
12. 你不要一直不满人家,你应该一直检讨自己才对。不满人家,是苦了你自己。
13. 一个人如果不能从内心去原谅别人,那他就永远不会心安理得。
14. 心中装满着自己的看法与想法的人,永远听不见别人的心声。
15. 毁灭人只要一句话,培植一个人却要千句话,请你多口下留情。
16. 根本不必回头去看咒骂你的人是谁?如果有一条疯狗咬你一口,难道你也要趴下去反咬他一口吗?
17. 永远不要浪费你的一分一秒,去想任何你不喜欢的人。
18. 请你用慈悲心和温和的态度,把你的不满与委屈说出来,别人就容易接受。
19. 同样的瓶子,你为什么要装毒药呢?同样的心里,你为什么要充满着烦恼呢?
20. 得不到的东西,我们会一直以为他是美好的,那是因为你对他了解太少,没有时间与他相处在一起。当有一天,你深入了解后,你会发现原不是你想像中的那么美好。
21. 活着一天,就是有福气,就该珍惜。当我哭泣我没有鞋子穿的时候,我发现有人却没有脚。
22. 多一分心力去注意别人,就少一分心力反省自己,你懂吗?
23. 憎恨别人对自己是一种很大的损失。
24. 每一个人都拥有生命,但并非每个人都懂得生命,乃至于珍惜生命。不了解生命的人,生命对他来说,是一种惩罚。
25. 情执是苦恼的原因,放下情执,你才能得到自在
26. 不要太肯定自己的看法,这样子比较少后悔。
27. 当你对自己诚实的时候,世界上没有人能够欺骗得了你。
28. 用伤害别人的手段来掩饰自己缺点的人,是可耻的。
29. 默默的关怀与祝福别人,那是一种无形的布施。
30. 不要刻意去猜测他人的想法,如果你没有智慧与经验的正确判断,通常都会有错误的。
31. 要了解一个人,只需要看他的出发点与目的地是否相同,就可以知道他是否真心的。
32. 人生的真理,只是藏在平淡无味之中。
33. 不洗澡的人,硬擦香水是不会香的。名声与尊贵,是来自于真才实学的。有德自然香。

34. 时间总会过去的,让时间流走你的烦恼吧!
35. 你硬要把单纯的事情看得很严重,那样子你会很痛苦。
36. 永远扭曲别人善意的人,无药可救。
37. 说一句谎话,要编造十句谎话来弥补,何苦呢?
38. 白白的过一天,无所事事,就像犯了窃盗罪一样
39. 广结众缘,就是不要去伤害任何一个人。
40. 沉默是毁谤最好的答覆。
41. 对人恭敬,就是在庄严你自己。
42. 拥有一颗无私的爱心,便拥有了一切。
43. 来是偶然的,走是必然的。所以你必须,随缘不变,不变随缘。
44. 慈悲是你最好的武器。
45. 只要面对现实,你才能超越现实。
46. 良心是每一个人最公正的审判官,你骗得了别人,却永远骗不了你自己的良心。
47. 不懂得自爱的人,是没有能力去爱别人的。
48. 有时候我们要冷静问问自已,我们在追求什么?我们活着为了什么?
49. 不要因为小小的争执,远离了你至亲的好友,也不要因为小小的怨恨,忘记了别人的大恩。
50. 感谢上苍我所拥有的,感谢上苍我所没有的。
51. 凡是能站在别人的角度为他人着想,这个就是慈悲。
52. 说话不要有攻击性,不要有杀伤力,不夸已能,不扬人恶,自然能化敌为友。
53. 诚实的面对你内心的矛盾和污点,不要欺骗你自己。
54. 因果不曾亏欠过我们什么,所以请不要抱怨。
55. 大多数的人一辈子只做了三件事;自欺、欺人、被人欺。
56. 心是最大的骗子,别人能骗你一时,而它却会骗你一辈子
57. 只要自觉心安,东西南北都好。如有一人未度,切莫自己逃了。
58. 当你手中抓住一件东西不放时,你只能拥有这件东西,如果你肯放手,你就有机会选择别的。人的心若死执自己的观念,不肯放下,那么他的智慧也只能达到某种程度而已
59. 如果你能够平平安安的渡过一天,那就是一种福气了。多少人在今天已经见不到明天的太阳,多少人在今天已经成了残废,多少人在今天已经失去了自由,多少人在今天已经家破人亡。
60. 你有你的生命观,我有我的生命观,我不干涉你。只要我能,我就感化你。如果不能,那我就认命。
61. 你希望掌握永恒,那你必须控制现在。
62. 恶口永远不要出自于我们的口中,不管他有多坏,有多恶。你愈骂他,你的心就被污染了,你要想,他就是你的善知识。
63. 别人可以违背因果,别人可以害我们,打我们,毁谤我们。可是我们不能因此而憎恨别人,为什么?我们一定要保有一颗完整的本性和一颗清净的心。
64. 如果一个人没有苦难的感受,就不容易对他人给予同情。你要学救苦救难的精神,就得先受苦受难。
65. 世界原本就不是属于你,因此你用不着抛弃,要抛弃的是一切的执著。万物皆为我所用,但非我所属。
66. 虽然我们不能改变周遭的世界,我们就只好改变自己,用慈悲心和智慧心来面对这一切