注意,目前WLBS又称NLB
文章来源:ZDNet China 开发者 http://www.builder.com.cn/developer 2000年08月18日
当应用程序和Web站点要迎合不断增长的流量的需求的时候,你甚至会想把CPU从一台服务器上卸到另一台上去。不久以前,你还只能通过选择 Round Robin DNS和昂贵的硬件来分担系统的负载。但是现在,Windows NT Load Balancing Service (WLBS) for Microsoft Enterprise Edition Server 4.0就可以帮助你分散服务器上的TCP/IP通信量。这个分布服务使你可以通过添加(Web)服务器来应付站点增长的负载,如图A所示。

图A: WLBS允许你建立多于32台主机的 Web Farm。
为了提高性能,WLBS服务提供了实时容错功能,以便在维护时增加和卸去服务器。如果你计划在担负关键任务的Web应用程序中增加更强的功能和更好的可靠性,那么上面所说的这些特性结合起来,就构成了必不可少的一项服务。
WLBS是什么?
WLBS是一个网络服务,用来管理不同服务器之间的TCP/IP通信。WLBS不是一个漂亮的伪应用分配器,用来分担服务器CPU的负载,它更加适合被描述为一项以网络通信量为依据的更灵活的动态负载平衡服务。最为常用的一种负载分担技术就是Round Robin DNS(RRDNS)。在RRDNS技术中,请求仅仅被简单的循环发送到不同的服务器上。所以,当这些服务器中的一台崩溃了,请求仍然会发送给这台机器。而WLBS判断主机服务器是否工作以及是否可以接受请求,从而克服了这一弱点,如果上述情况出现,WLBS就把网络通信传送到另一台服务器上,从而避免了失误。
术语
在我们着手研究WLBS的细节之前,先定义一些术语。首先,一个集群(Cluster)表示一组共同担负处理同一任务的服务器。Web farm是集群的一种,它是共同负责Web页面服务一个Web服务器集群。集群中的每一台服务器称为主机。最后,集中(Convergence)表示一台主机连入或者离开了一个集群。
如何把集群结合起来
结束了术语的定义,我们开始了解WLBS如何提供把集群结合起来的网络通道。WLBS的主要担负网络接口卡(NIC)和服务器应用程序之间的传递信息的功能。图B解释了网络服务层和主机服务器应用程序之间的联系。

图B: WLBS在你的TCP/IP应用程序的底层提供了可编程的网络服务。
送到集群的虚拟IP地址的TCP/IP信息经过WLBS的解释,转发到真正主机的网卡上。这种通信方式使服务应用程序和底层的集群能够无缝的衔接,无须应用程序处理底层网络的任何特殊事务。
在设计和开发你的应用程序的时候,要时刻在脑海中记住这一基本结构。在本文后面我们会提到,这对于设计ASP应用程序和管理预计的负载增长有巨大的影响。WLBS可以提高集群的性能,但是不会提升你的应用程序的性能。
WLBS的好处
如果你需要一个可伸缩的、具有容错能力的NT服务器结构,WLBS可以说相当符合要求。这项服务可以使你添加应用程序的速度如同添加硬件一样快。规模的扩大并非是唯一的好处;WLBS还可以保证集群中各节点之间的冗余度。当你的某一台服务器表现异常或失灵的时候,这项特性是非常方便的。如图C所示, WLBS可以判断主机是否正在接受请求,并自动将请求送给正常的主机。

图C: WLBS仍然允许你的Web应用程序访问信息存储设备。
除了启动和关闭WLBS的功能,你还可以在运行时随时改变对节点通信的配置。例如,如果希望将某个特定节点的负载从50%提高到70%,你可以在运行时更改WLBS的设置,新的负载分配安排会立刻实现。
对于静态内容来说,这已经足够好了,但是对于ASP应用程序来说又如何呢?WLBS是否支持会话变量呢?当然。WLBS完全支持维护直接的、建立在用户会话和可能由此产生的ASP会话之上的客户机-服务器连接。还有,WLBS支持SMTP、代理服务器、流式媒体、安全套接层(SSL)、FTP、 TFTP和NetBIOS over TCP/IP。
WLBS的原理
WLBS就如同一个交通警察,管理着来访的TCP/IP通信和它可以获得的集群中的NIC驱动器。为了跟踪集群中的哪些节点可以工作,以及这些节点能够处理多少负载,WLBS在集群的主机之间进行信息的多点交换。通过检查每个节点的负载等级,WLBS调整和重新分发负载的分配。WLBS不需要特殊的硬件就可以运行,也无需集群中的硬件完全相同。异类的设备在WLBS的配合下可以无缝的工作。实际上,你甚至可以在WLBS上运行不同版本的服务应用程序;但是要记住,你必须负责管理自己的代码,使它们能够适合这些不同版本的最大公共部分。
比如,你的ASP应用Web Farm可以同时在IIS 3.0和IIS 4.0上运行,但是放在你的Web Farm中的Web页面必须在各个服务器上都是相同的,并且与最低的版本兼容。
此外要说明,WLBS不在节点间复制数据。你必须使用自己的开发工具或者使用数据管理工具,比如Microsoft Content Replication Service来完成这些工作。
WLBS是否保存状态?
WLBS能够映射来访的TCP连接与主机之间的连接,因此它完全支持ASP会话。这项特性称为Affinity,是由WLBS缺省支持的。你的 ASP应用程序能够访问MTS组件、数据库连接或者其它任何本机ASP应用程序支持的功能。这很大程度上是因为WLBS仅仅简单的把TCP/IP包转发到主机的信息服务器上(IIS)。但是要注意WLBS在底层上改变了ASP应用程序中变量的作用域。ASP的对象同处理它们的IIS相联系。如果在你的集群中有两个Web服务器,那么你就会拥有两个无法互相通信的应用程序对象。
WLBS与Microsoft Cluster Server的不同
比较微软的两个不同的集群解决方案,让我们来弄清WLBS和微软集群服务器(MSCS)的不同之处。WLBS用于控制、寻径和按比例配置交给主机服务器应用程序的TCP/IP通信量,而MSCS提供双机错误恢复能力,但是仅使用一个服务器处理来访的请求。MSCS通常用于需要冗余数据存储单元的应用,比如SQL Sever数据库或者Microsoft Exchange Servers。图D表明了MSCS如何将第二个服务器用作防备主服务器崩溃的备份。

图D: WLBS与MSCS系统工作,用来提升性能和容错能力。
集成Microsoft Queuing Server
为了在你的关键任务的应用程序中得到最佳可伸缩性、容错性和可靠性的结合,可以结合使用WLBS、MSCS和微软队列服务器(MSQS)。MSQS 提供了基于缓存的操作,使你能够将事务处理排队。通常可以利用MSQS将瞬时的和尖峰时的处理转移到其它的业务处理机上。这并不仅仅局限于减轻Web服务器的负载,它还可以提供其它层的冗余以确保你的任务得以处理。其原理是MSQS中的所有节点都监听队列中的请求。举例来说,假设有一项事务请求进入了处理队列,如图E所示。如果头一个查询的用户失败的话,第二个或者第三个查询客户仍然可以处理请求。

图E: WLBS与MSQS合作提高可靠性。
WLBS的需求和一般配置
WLBS的设计要求其工作在Windows NT企业服务器版4.0上,并且要求在每一台服务器上都装有TCP/IP协议。加载时,WLBS需要1MB存储空间,并使用500KB到4MB内存。 WLBS能够在仅有一个NIC卡的情况下运行,但是为了优化效率,应该使用两个NIC。如果你使用两个NIC卡,第一个NIC专门用于集群通信,第二个用于处理非集群通信。如果你使用的是Cisco路由器或者单NIC卡,可能会遇到进一步的配置细节问题。请参考WLBS的Readme.txt文件和安装指导,以获得更多的关于配置WLBS的指导信息和建议。
安装WLBS
由于WLBS属于虚拟网络管理器,你应该像安装常规的网络适配器一样在系统上安装它。打开控制面板,双击Network图标,在适配器项中添加一个适配器。此后要完成一系列的基于当前机器设置的网络配置。在这篇文章中我们不能谈及设置中可能遇到的所有情况,所以如果你在配置WLBS时遇到了困难,请与你的网管联系。配置WLBS的结果是添加了一个虚拟的NIC和一个相应的IP地址。这一虚拟IP地址即为集群的虚拟IP地址。
一旦配置好了WLBS NIC驱动程序,就可以在两个地方检查你的集群是否能够在各个节点上进行操作,以及节点是否能够加入集群。第一个检查的地方是System Event Viewer。如果WLBS已经在独立的节点上成功加载,事件察看器就会显示一条消息,说明开始启动集群模式。如图F所示。

图F:事件查看器显示WLBS已经在独立的节点上成功启动。
如果单独的节点加入集群的话,事件察看器也会显示一项成功事件。这项事件显示一条消息,如图G所示,并且会立即指示单独的节点被成功加载了。

图G:单独节点集中到集群中,事件查看器显示了这一信息。
现在,运行命令行命令以便察看WLBS的状态。在命令行提示符下,键入WLBS Query来返回集群的集中状态。可以用WLBS /?命令来获取完整的命令行参数的列表。
配置你的Web站点
一旦WLBS开始运行,接下来就要配置Web站点,以便在各个节点上处理访问新设的集群IP地址的请求。打开Internet Service Manager,选择一个已经建立的站点(或者创建一个新的站点),用鼠标右键点击已存的站点,选择Properties项。然后选择Web site面板,并从下拉列表中选取新设的集群IP地址,如图H所示。这时,你的IIS服务器就会认为这个IP地址仅仅与自己相关联,而不会察觉到WLBS重新了分配集群的通信量。

图H:利用Internet Service Manager处理来自WLBS IP地址的请求。
控制WLBS集群
管理WLBS时的你所拥有的等级是WLBS的一个突出的特点。WLBS提供了设置端口规则的能力,这样就可以接受或者拒绝网络的请求,它还提供了向一台服务器转发通信、提交定制的负载平衡分配百分比以及设置远程控制的能力。你可以通过从命令行界面运行WLBS Setup命令来调出设置窗口,或者在控制面板的网络设置界面找到适配器面板,然后点击Properties按钮,如图I所示。

图I:安装WLBS如同添加一个网络适配器。
如图J所示,WLBS的设置面板包括三个部分:集群参数、主机参数以及端口规范。集群参数用于设置整个集群。必须填写集群的主IP地址、子网掩码和完整的Internet名称。主IP地址就是安装时分配给WLBS虚拟NIC的IP地址。

图J: WLBS的配置允许你设置集群参数、主机参数和端口参数。
主机参数允许用户分别设置集群中的特定主机。可以设优先级ID、主机的初始化状态、用于接收非集群通信的专用IP地址和主机的子网掩码信息。优先级 ID用于决定哪一台主机负责管理集群的通信。数字越低表示优先级越高。如果优先级为1的主机离开了集群,优先级次高的主机将接替其工作。
端口规范使用户可以为集群配置特定的端口规范。用户可以为端口指定接受或者拒绝的协议范围和类型,还可以提交定制的过滤规则和负载平衡标准。如果正在编写需要使用会话变量的ASP应用程序,你必须设置Affinity to single选项。
这项设置允许WLBS总是把通信转交给最早处理同一客户请求的服务器。如果选择了多服务器,你可以选择是让所有服务器均摊负载还是分别指定各个服务器所负工作的百分比。
|
特别注意:ASP 对象(Application、Session、Request、Response、Server和Context)与处理请求的Web相关联。虽然 WLBS支持用户的Session对象,但是对于Application对象并不友好。这是由于Application对象是特定于本地机的,你的 Application变量不能真正的在Web farm上共享。这也许会严重的影响你的ASP结构。在讨论将Web farm的移植策略的时候,要与你的网管仔细研究,以便确定这会如何应影响你的应用程序。 |
一旦你完成了或者改动了WLBS配置,这些改动就存储在注册表中。如果希望它们立即生效,你必须通过从命令行运行WLBS Reload命令来激活这些改动。
WLBS提供了控制集群所有行为的控制参数。如果你希望所作的改动立即生效,必须通过在命令行中运行WLBS Reload命令来激活修改的配置。
WLBS <command> [<cluster>[:<host>] [<remote options>]]
我们不会详述所有的WLBS参数,不过表A中列出了配置Web farm时常用的命令。
表A:用于管理Web farm的命令行参数
|
命令 |
描述 |
|
Start |
启动集群或主机 |
|
Stop |
关闭集群或主机 |
|
DrainStop |
截至到集群或者主机已经接受的请求为止,拒绝所有新的请求。保持当前的用户的连接,直到它们离开集群或主机为止 |
|
Query |
显示当前集群的状态 |
|
Drain <port> | all |
防止新的通信进入端口。当前用户在离开集群或主机前不受影响。 |
|
Disable <port> | all |
立即关闭指定的端口。 |
|
Reload |
从注册表中调入WLBS设置。 |
|
Help |
显示WLBS帮助。 |
例如,假设一个定制的DLL需要更新,并且你希望关闭Web服务器以便维护。为了尽量减小对用户的影响,可以使用DrainStop命令来避免新的通信进入关闭的服务器。
WLBS Drainstop YourClusterName:3
另一个有趣的地方是如果你决定更改集群的控制,可以不必重新启动服务器而调入集群的设置。因为WLBS的设置存储在注册表中,并且WLBS驱动程序已经初始化完毕,你可以通过运行WLBS Reload命令来使新的设置生效。这通常会花费10到20秒的时间来让集群广播新的负载配置。
这个界面的有一个缺陷,其选项不能根据当前的参数进行初始化。例如,假设你存储了端口的设置,然后关闭并重新打开了设置程序,现有的端口设置会显示在设置窗口右下角的多行文本框中,但是所有的端口选项都在它们的缺省选择上。
如图J所示,对行文本框中的端口设置表示WLBS将起始和终止端口设为80、使用两种协议和多服务器、处理40%的集群负载。但是,所有的端口规范的选择项都设在它们的缺省值上。
WLBS与Convoy的集成
也可以从微软Convoy获得集群能力。Convoy Cluster Software和WLBS基本上是同一个产品,它们被集成在了一起。二者之间的唯一不同是启动后WLBS的缺省设置值是为了迎合ASP应用程序的需求。这两个服务可以同时在同一集群中运行。例如,你可以运行一个由八台服务器组成的集群:其中四台主机运行Convoy,而另外四台运行WLBS。
结束
WLBS提供了一个可编程的TCP/IP分配者,使你能够提升静态和动态Web网站和ASP应用程序的性能。WLBS提供了对本地和远程的集群、主机以及节点的控制,同时提升了容错能力和可靠性的等级。回想一下,虽然WLBS支持Session对象,但是Application对象的作用域受限于本地的IIS主机。因此,在你的应用程序中,需要共享整个跨会话用户信息的变量在各台Web主机并不一致。在使用WLBS时,你也许必须重新设计应用程序来弥补Application对象的这一不足。总的来说,你会发现WLBS提供了一个简洁的方式,来帮助用户提升Web应用程序的可伸缩性与可靠性。
你可以从下面的Microsoft NT Server站点下载WLBS
www.microsoft.com/ntserver
记住你必须对每台服务器都有合法的Windows NT Enterprise Edition Server 4.0许可。
2月9日,Google中国正式推出Google文件( Google Docs & Spreadsheets )中文版。可以用来多人在线协作编辑文档和电子表格。
网址在 http://docs.google.com/ 需要gmail帐户登陆

通过简单几次click, 我创建了一个在线文档 http://docs.google.com/View?docid=dcgxxtrr_0f3kvv5

虽然有丰富的编辑和导入导出和历史版本功能, 但论文字功能,google文档当然比不上office, 但是他可以多人在网上在线编辑和浏览文档,相比大家书写word文档然后用邮件传来传去,这的确算是一个很"颠覆"的东西,个人觉得这是一些团队创建维护和共享文档的非常好的办法。从协作方面而言,它类似于wiki ,但是又有些和wiki不一样的特点 :
- wiki 主要用于建立一个大而全或者针对某个领域的一些列文档, google 文件一般只针对某个主题。
- wiki 一般互联网上每个人都可以修改和浏览,但是google文件可以进行相关的权限控制。
- 为了防止恶意或者错误的修改。wiki一般都提供版本历史功能,可以自由回退到某个版本。google文件也有这个功能, 但是这个功能对于google文件虽然很重要,但是没有wiki那么严重.
- wiki 需要大量用户才能不断丰富和发展,但是google文件哪怕是个人使用,也可以享受到随时随地修改的便利,更别说便于团队维护修改了。
- google文件的相关搜索功能很强。
感觉互联网在不断地改变我们的生活,星期六和朋友聊天,感慨互联网从来没有像今天这么紧密过:每天,我们都要用它和人联络,用google查资料,在网上看小说看视频听音乐买东西。相信这种文档协作的方式,今后也会深深影响我们工作的习惯。
附:Google(谷歌)文件中文版上线 — 在线同步规划您的生活、工作
(ZT) http://dotnet.e800.com.cn/articles/2007/11/1167639695398732513_1.html
说起软件系统的层次结构,众说纷纭。不过,许多人都认为传统的C/S结构是两层结构——数据库服务器是一层,客户端应用程序是一层。从这一点来说,B/S结构可认为是三层结构——数据库服务器层、WEB应用服务器层和客户端浏览器一层。
但由于B/S结构的应用,开发者主要精力都集中在WEB应用服务器层,因此对这一层又进行了划分。在Duwamish 7.0中,提供了SystemFramework、Common、DataAccess、BusinessRules、BusinessFacade和web六个项目,每个项目都可认为是一层。但现在更流行的划分是三层数据访问层(Data Access Layer)、商务逻辑层(Business Logic Layer)和表现层(Representation Layer)。数据访问层直接访问和操作数据库,商务逻辑层调用数据访问层,表现层调用商务逻辑层。
表现层有的也叫用户接口层(User Interface Layer),意思是与用户直接进行交互的。在B/S开发中,表现层也有人叫做web层的。
在。Net PetShop 4.0中,有二十个左右的项目。这些项目有些直接是以层次的名称命名的,例如BLL;有些是以层次的名称作为后缀来命名的,如SQLProfileDAL、SQLServerDAL、OracleProfileDAL和OracleDAL等;有些项目包含了一些接口,以I为前缀;有些项目使用工厂模式,以Factory为后缀。不过总体上,还可以将其划分为三层结构。
比较Duwamish7.0与PetShop 4.0,后者项目众多,但使用工具生成的代码很少。而Duwamish7.0中的Common和DataAccess中的文件主要都是使用代码生成器产生的。当数据库的表结构更改后,使用代码生成器产生的代码通常要重新产生,因次如果对这两个项目中的代码做了手工的改动,在重新生成代码时,改动的代码将会丢失。而且Duwamish7.0对数据库的支持不容易扩充,如果想把数据库移到Oracle中,要改很多的代码。但在PetShop 4.0中,只是更改配置文件web.config.
|
|
|
|
ZT : http://www.moon-soft.com/doc/51773.htm |
|
对比.NET PetShop和Duwamish来探讨Ado.NET的数据库编程模式
概述
Ado.NET为我们提供了强大的数据库开发能力,它内置的多个对象为我们的数据库编程提供了不同的选择。但是在允许我们灵活选用的同时,许多初学者也很迷惑,我到底是应该使用DataReader还是应该使用DataAdapter?我只想读取一小部分数据,难道我一定要Fill满整个DataSet吗?为什么DataReader不能和RecordSet一样提供一个数据更新的方法?DataSet到底有什么好处?
在本文中,我将对.NET PetShop的数据库编程模式和Duwamish的数据库编程模式进行一些简单的分析和对比。如果您也有以上疑问的话,相信在读完本文之后,就可以根据具体的需要来制定一个最适合您应用的数据库编程模式。
目录
- .NET PetShop和Duwamish简单介绍
- 结构简述
- Duwamish数据访问剖析
- .NET PetShop数据访问剖析
- 分析总结
.NET PetShop和Duwamish简单介绍
相信大家一定听说过有名的"宠物店大战",没错,本文的主角之一就是获胜方.NET PetShop,微软号称以27倍的速度和1/4的代码量遥遥领先于基于J2EE的PetStore宠物商店。虽然SUN也曾对此抱怨过不满,指责此"大战"有水分,不过无论如何,.NET PetShop绝对是一个经典的.NET实例教程,至少为我们提供了一条赶超J2EE的“捷径” :),它的下载地址是:http://www.gotdotnet.com/team/compare 
.NET PetShop宠物网上商店首页
而Duwamish则是一个外表简单,内部却极其复杂的一个网上书店的.NET完整应用范例,作为一个微软官方的Sample,它同时提供了C#和VB.NET两种语言版本,并且还附上了大量详尽的中文资料,如果打印出来,实在是居家旅行,临睡入厕必备之物。什么?您没听说过?呵呵,如果您装了Visual Studio .NET的话,它就在您的硬盘上静静的躺着呢,不过还没有被安装,您可以在您的VS.NET 的Enterprise Samples目录下找到并安装它,例如:C:\Program Files\Microsoft Visual Studio .NET\Enterprise Samples\Duwamish 7.0 CS。 
Duwamish网上电子书店首页
结构简述
两家商店都采用了n层应用结构(毫无疑问,n层结构的应用架构应该绝对是您开发.NET应用的首选,哪怕您只想做一个网页计数器),不同的是,PetShop采用的是最常见的三层应用结构,分别为表示层,中间层和数据层。而Duwamish则采用的是一个四层应用结构,并使用不同的项目分隔开,分别为表示层,业务外观层,业务规则层和数据层。至于这两种结构分别有什么优点和缺点,以及为什么要这么分层,我们不进行详细讨论,因为本文的重点不在于此。我们主要分析的是他们的数据库编程的模式。
Duwamish数据访问剖析
首先,我们来看看Duwamish书店,它采用的是DataAdapter和DataSet配合的数据存储模式,所不同的是,它对DataSet进行子类化扩展作为数据载体,也就是采用定制的DataSet来进行层间的数据传输,下面是一个定制的DataSet示例:
public class BookData : DataSet
{
public BookData()
{
//
// Create the tables in the dataset
//
BuildDataTables();
}
private void BuildDataTables()
{
//
// Create the Books table
//
DataTable table = new DataTable(BOOKS_TABLE);
DataColumnCollection columns = table.Columns;
columns.Add(PKID_FIELD, typeof(System.Int32));
columns.Add(TYPE_ID_FIELD, typeof(System.Int32));
columns.Add(PUBLISHER_ID_FIELD, typeof(System.Int32));
columns.Add(PUBLICATION_YEAR_FIELD, typeof(System.Int16));
columns.Add(ISBN_FIELD, typeof(System.String));
columns.Add(IMAGE_FILE_SPEC_FIELD, typeof(System.String));
columns.Add(TITLE_FIELD, typeof(System.String));
columns.Add(DESCRIPTION_FIELD, typeof(System.String));
columns.Add(UNIT_PRICE_FIELD, typeof(System.Decimal));
columns.Add(UNIT_COST_FIELD, typeof(System.Decimal));
columns.Add(ITEM_TYPE_FIELD, typeof(System.String));
columns.Add(PUBLISHER_NAME_FIELD, typeof(System.String));
this.Tables.Add(table);
}
………
}
我们可以看到它有一个BuildDataTables方法,并且在构造函数中调用,这样,定制的Books表就和这个DataSet捆绑在一起了,省得以后还要进行Column Mapping,这真是个好主意,我怎么就没有想到呢? :)
解决了数据结构,接下来看看数据层的代码实现,在Duwamish中,数据层中有5个类,分别是Books,Categories,Customers和Orders,每个类分别只负责有关数据的存取。下面是其中一个类的示例代码:
private SqlDataAdapter dsCommand;
public BookData GetBookById(int bookId)
{
return FillBookData("GetBookById", "@BookId", bookId.ToString());
}
private BookData FillBookData(String commandText, String paramName, String paramValue)
{
if (dsCommand == null )
{
throw new System.ObjectDisposedException( GetType().FullName );
}
BookData data = new BookData();
SqlCommand command = dsCommand.SelectCommand;
command.CommandText = commandText;
command.CommandType = CommandType.StoredProcedure; // use stored proc for perf
SqlParameter param = new SqlParameter(paramName, SqlDbType.NVarChar, 255);
param.Value = paramValue;
command.Parameters.Add(param);
dsCommand.Fill(data);
return data;
}
这里就是数据层的代码了,我们在这里可以看到Duwamish采用了DataAdapter来将数据填充到定制的DataSet中,然后返回该DataSet。我感到很奇怪的是在数据存取层中竟然可以看到GetBookById这样具体的数据存取方法,虽然最后还是有一个抽象出来的FillBookData方法,但是上面还有三层啊,底层都做到这份上了,那上层都做些什么呢?答案是数据检查,上层基本上都在做一些很严密的数据合法性校验(当然也会包括一些比较复杂的事务逻辑,但是并不多),示例代码如下:
public CustomerData GetCustomerByEmail(String emailAddress, String password)
{
//
// Check preconditions
//
ApplicationAssert.CheckCondition(emailAddress != String.Empty, "Email address is required",
ApplicationAssert.LineNumber);
ApplicationAssert.CheckCondition(password != String.Empty, "Password is required",
ApplicationAssert.LineNumber);
//
// Get the customer dataSet
//
CustomerData dataSet;
using (DataAccess.Customers customersDataAccess = new DataAccess.Customers())
{
dataSet = customersDataAccess.LoadCustomerByEmail(emailAddress);
}
//
// Verify the customer's password
//
DataRowCollection rows = dataSet.Tables[CustomerData.CUSTOMERS_TABLE].Rows;
if ( ( rows.Count == 1 ) && rows[0][CustomerData.PASSWORD_FIELD].Equals(password) )
{
return dataSet;
}
else
{
return null;
}
}
在这个方法中,真正进行数据存取的实际上只有
dataSet = customersDataAccess.LoadCustomerByEmail(emailAddress);
这么一句,是直接调用的数据层。其它都是在进行合法性校验,我们可以感悟到,进行一个真正的企业级开发需要考虑的系统健壮性有多么重要。
.NET PetShop数据访问剖析
OK,Duwamish看完了,下面我们来看看PetShop的数据访问机制。
PetShop只有一个项目,它采用的分层办法是将中间层和数据层都写成cs文件放在Components目录里,其中数据层就是一个名为Database的类,它封装了所有对数据库的底层操作。下面是示例代码段:
public void RunProc(string procName, out SqlDataReader dataReader)
{
SqlCommand cmd = CreateCommand(procName, null);
dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
}
我们看到了一个跟Duwamish截然不同的另一种数据访问方式,它将所有的数据访问方法抽象出来做成一个RunProc方法,至于返回数据呢,呵呵,它有点偷懒,直接返回一个DataReader给你,你自己去读吧。还记得Duwamish采用的层间数据传输载体是什么吗?对了,是DataSet,它被数据层填充后返回给了中间层。但是这里,数据层和传输层的数据传输载体变成了DataReader,实际上,还不能称它为数据载体,因为数据还没开始读呢,在这里,DataReader的作用和指针有点类似,也许我们应该称它为“数据引用”:)
接着往下看,DataReader被怎么“处理”的:
public ProductResults[] GetList(string catid, int currentPage, int pageSize, ref int numResults)
{
numResults = 0;
int index=0;
SqlDataReader reader = GetList(catid);
ProductResults[] results = new ProductResults[pageSize];
// now loop through the list and pull out items of the specified page
int start = (int)((currentPage - 1) * pageSize);
if (start <= 0) start = 1;
// skip
for (int i = 0; i < start - 1; i++) {
if (reader.Read()) numResults++;
}
if (start > 1) reader.Read();
// read the data we are interested in
while (reader.Read()) {
if (index < pageSize) {
results[index] = new ProductResults();
results[index].productid = reader.GetString(0);
results[index].name = reader.GetString(1);
index++;
}
numResults++;
}
reader.Close();
// see if need to redim array
if (index == pageSize)
return results;
else {
// not a full page, redim array
ProductResults[] results2 = new ProductResults[index];
Array.Copy(results, results2, index);
return results2;
}
}
注意到currentPage和pageSize了吗?原来在这里就进行了数据分页,只返回满足需要的最少的数据量,而不是象我们很多喜欢偷懒的人一样,简单的将整个DataTable一股脑的绑定到DataGrid,造成大量的数据冗余。
在这里,数据被真正的读出来,并且被手动填充到一个自定义的对象数组中,我们来看看这个数组的定义:
public class ProductResults
{
private string m_productid;
private string m_name;
// product props
public string productid {
get { return m_productid; }
set { m_productid = value; }
}
public string name {
get { return m_name; }
set { m_name = value; }
}
}
非常之简单,不过我有点奇怪为什么不使用struct呢?是不是.NET中struct和class的性能差距已经可以忽略不计了?
分析总结
通过观察这两个商店的具体实现,我们得到了两个不同的数据访问模式,Duwamish采用的是以DataSet为核心,因为DataSet提供了这方面大量的相关方法,所以整个应用的数据传输,数据格式定义,数据校验都围绕着DataSet来进行,整个架构定义非常清晰和严谨,但是却显得有些庞大。PetShop在整个程序中没有采用一个DataSet,程序非常的简洁,轻灵,但是没有Duwamish那么强的健壮性。这两个程序是Microsoft公司不同的小组写出来的代码,所以有着不同风格。不过都应该能代表.NET的标准模式。看到这里,你应该对文章开头提出的那些疑问有一个比较形象的认识了吧。
另外,请再次注意,PetShop在打开数据连接之后,并没有马上读取数据,而是将DataReader传递给另外的对象来执行数据读的操作,然后才关闭连接。这样,数据连接的时间加长了,而数据库连接是一项非常宝贵的服务器资源,相比之下,Dawamish在连接数据库之后马上进行填充,然后迅速释放掉数据库连接的方式更加有利于大量用户的并发访问。
再一点,上文的程序中没有提到更新操作,PetShop采用的是使用Command对象执行单个存储过程的方式来进行更新操作,是属于一种在线即时数据更新模式。而Dawamish采用的是DataAdapter的Update方法,将DataSet的改变一次性的提交到数据库中,属于离线数据更新模式。这种模式的好处是可以一次性更新大批量数据,减少数据库的连接次数。缺点是如果数据库在改动非常频繁的情况下需要实时的跟踪数据变化就不合适了。需要根据具体的情况采用具体的数据更新办法。
总的来说,如果您只需要快速的读取数据并显示出来,推荐您采用DataReader,如果您需要对数据进行大量的修改,还有大量并发访问的可能,而且不需要实时的跟踪数据库的变化,推荐您使用DataSet。当然,这两种情况有点极端了,实际的应用环境也许有着很复杂的条件,具体需要您自己审时度势,综合采用,不过我个人还是比较喜欢PetShop那种轻灵的风格 :) |
作者Blog:http://blog.csdn.net/wangyihust/
对于Microsoft .net PetShop程序中的购物车和订单处理模块,文中主要分析两种技术的应用:
1. Profile技术在PetShop程序中用于三处:
1) 购物车ShoppingCart -下面的例子围绕购物车流程进行
2) 收藏WishList
3) 用户信息AccountInfo
注册新用户 NewUser.aspx :使用的是CreateUserWizard 控件,基于MemberShip机制,在数据库MSPetShop4Services的表aspnet_Users中创建用户
修改用户注册信息 UserProfile.aspx: 基于Profile技术,在数据库MSPetShop4Profile的表Profiles和Account中创建用户信息
2. 异步消息处理技术运用于订单处理
4.1 Web.config配置
Profile可以利用数据库存储关于用户的个性化信息,有点象session对象,但session对象是有生存期的,在生存期后,session对象自动失效了。而profile不同,除非显式移除它。要实现profile功能,必须先在web.config中进行定义。
在web.congfig中,将会定义一些属性/值,分别存贮将要保存的变量和值,比如language属性,定义其值是string类型,如此类推。而<group>标签,则是将一些相同或类似功能的变量值放在一起。
程序中使用方法:Profile.language = ddlLanguage.SelectedItem.Value;
<profile automaticSaveEnabled="false" defaultProvider="ShoppingCartProvider">
<providers>
<add name="ShoppingCartProvider" connectionStringName="SQLProfileConnString" type="PetShop.Profile.PetShopProfileProvider" applicationName=".NET Pet Shop 4.0"/>
<add name="WishListProvider" connectionStringName="SQLProfileConnString" type="PetShop.Profile.PetShopProfileProvider" applicationName=".NET Pet Shop 4.0"/>
<add name="AccountInfoProvider" connectionStringName="SQLProfileConnString" type="PetShop.Profile.PetShopProfileProvider" applicationName=".NET Pet Shop 4.0"/>
</providers>
<properties>
<add name="ShoppingCart" type="PetShop.BLL.Cart" allowAnonymous="true" provider="ShoppingCartProvider"/>
<add name="WishList" type="PetShop.BLL.Cart" allowAnonymous="true" provider="WishListProvider"/>
<add name="AccountInfo" type="PetShop.Model.AddressInfo" allowAnonymous="false" provider="AccountInfoProvider"/>
</properties>
</profile>
4.2 购物车程序流程-Profile技术
1. 点击“加入购物车”: http://localhost:2327/Web/ShoppingCart.aspx?addItem=EST-34
2. ShoppingCart.aspx文件处理:在init方法之前处理
protected void Page_PreInit(object sender, EventArgs e) {
if (!IsPostBack) {
string itemId = Request.QueryString["addItem"];
if (!string.IsNullOrEmpty(itemId)) {
Profile.ShoppingCart.Add(itemId); //注意ShoppingCart的类型是PetShop.BLL.Cart
//Save 方法将修改后的配置文件属性值写入到数据源,如ShoppingCart属性已经改变
Profile.Save();
// Redirect to prevent duplictations in the cart if user hits "Refresh"
//防止刷新造成 多次提交
Response.Redirect("~/ShoppingCart.aspx", true); //将客户端重定向到新的 URL。指定新的 URL 并指定当前页的执行是否应终止。
}
}
3. PetShop.BLL.Cart类
// Dictionary: key/value
private Dictionary<string, CartItemInfo> cartItems = new Dictionary<string, CartItemInfo>();
/// <summary>
/// Add an item to the cart.
/// When ItemId to be added has already existed, this method will update the quantity instead.
/// </summary>
/// <param name="itemId">Item Id of item to add</param>
public void Add(string itemId) {
CartItemInfo cartItem;
//获取与指定的键相关联的值TryGetValue(TKey key,out TValue value)
if (!cartItems.TryGetValue(itemId, out cartItem)) {
Item item = new Item();
ItemInfo data = item.GetItem(itemId);
if (data != null) {
CartItemInfo newItem = new CartItemInfo(itemId, data.ProductName, 1, (decimal)data.Price, data.Name, data.CategoryId, data.ProductId);
cartItems.Add(itemId, newItem);
}
}
else
cartItem.Quantity++;
}
4. 更新Profile
//Save 方法将修改后的配置文件属性值写入到数据源,如ShoppingCart属性已经改变
Profile.Save();
如何更新:
根据配置中的ShoppingCartProvider类型 PetShop.Profile.PetShopProfileProvider。
ASP.NET 配置文件提供对用户特定属性的持久性存储和检索。配置文件属性值和信息按照由 ProfileProvider 实现确定的方式存储在数据源中。
每个用户配置文件在数据库的 Profiles 表中进行唯一标识。该表包含配置文件信息,如应用程序名称和上次活动日期。
CREATE TABLE Profiles
(
UniqueID AutoIncrement NOT NULL PRIMARY KEY,
Username Text (255) NOT NULL,
ApplicationName Text (255) NOT NULL,
IsAnonymous YesNo,
LastActivityDate DateTime,
LastUpdatedDate DateTime,
CONSTRAINT PKProfiles UNIQUE (Username, ApplicationName)
)
5. PetShop.Profile. PetShopProfileProvider类, 继承自ProfileProvider
// 创建 PetShop.SQLProfileDAL.PetShopProfileProvider类-数据库操作
private static readonly IPetShopProfileProvider dal
= DataAccess.CreatePetShopProfileProvider();
/// <summary>
/// 设置指定的属性设置组的值
/// </summary>
public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection collection) {
string username = (string)context["UserName"];
CheckUserName(username);
bool isAuthenticated = (bool)context["IsAuthenticated"];
int uniqueID = dal.GetUniqueID(username, isAuthenticated, false, ApplicationName);
if(uniqueID == 0)
uniqueID = dal.CreateProfileForUser(username, isAuthenticated, ApplicationName);
foreach(SettingsPropertyValue pv in collection) {
if(pv.PropertyValue != null) {
switch(pv.Property.Name) {
case PROFILE_SHOPPINGCART: //ShoppingCart
SetCartItems(uniqueID, (Cart)pv.PropertyValue, true);
break;
case PROFILE_WISHLIST:
SetCartItems(uniqueID, (Cart)pv.PropertyValue, false);
break;
case PROFILE_ACCOUNT:
if(isAuthenticated)
SetAccountInfo(uniqueID, (AddressInfo)pv.PropertyValue);
break;
default:
throw new ApplicationException(ERR_INVALID_PARAMETER + " name.");
}
}
}
UpdateActivityDates(username, false);
}
// Update cart
private static void SetCartItems(int uniqueID, Cart cart, bool isShoppingCart) {
dal.SetCartItems(uniqueID, cart.CartItems, isShoppingCart);
}
6. PetShop.SQLProfileDAL. PetShopProfileProvider类
使用事务:包含两个sql动作,先删除,再插入
/// <summary>
/// Update shopping cart for current user
/// </summary>
/// <param name="uniqueID">User id</param>
/// <param name="cartItems">Collection of shopping cart items</param>
/// <param name="isShoppingCart">Shopping cart flag</param>
public void SetCartItems(int uniqueID, ICollection<CartItemInfo> cartItems, bool isShoppingCart) {
string sqlDelete = "DELETE FROM Cart WHERE UniqueID = @UniqueID AND IsShoppingCart = @IsShoppingCart;";
SqlParameter[] parms1 = {
new SqlParameter("@UniqueID", SqlDbType.Int),
new SqlParameter("@IsShoppingCart", SqlDbType.Bit)};
parms1[0].Value = uniqueID;
parms1[1].Value = isShoppingCart;
if (cartItems.Count > 0) {
// update cart using SqlTransaction
string sqlInsert = "INSERT INTO Cart (UniqueID, ItemId, Name, Type, Price, CategoryId, ProductId, IsShoppingCart, Quantity) VALUES (@UniqueID, @ItemId, @Name, @Type, @Price, @CategoryId, @ProductId, @IsShoppingCart, @Quantity);";
SqlParameter[] parms2 = {
new SqlParameter("@UniqueID", SqlDbType.Int),
new SqlParameter("@IsShoppingCart", SqlDbType.Bit),
new SqlParameter("@ItemId", SqlDbType.VarChar, 10),
new SqlParameter("@Name", SqlDbType.VarChar, 80),
new SqlParameter("@Type", SqlDbType.VarChar, 80),
new SqlParameter("@Price", SqlDbType.Decimal, 8),
new SqlParameter("@CategoryId", SqlDbType.VarChar, 10),
new SqlParameter("@ProductId", SqlDbType.VarChar, 10),
new SqlParameter("@Quantity", SqlDbType.Int)};
parms2[0].Value = uniqueID;
parms2[1].Value = isShoppingCart;
SqlConnection conn = new SqlConnection(SqlHelper.ConnectionStringProfile);
conn.Open();
SqlTransaction trans = conn.BeginTransaction(IsolationLevel.ReadCommitted);
try {
SqlHelper.ExecuteNonQuery(trans, CommandType.Text, sqlDelete, parms1);
foreach (CartItemInfo cartItem in cartItems) {
parms2[2].Value = cartItem.ItemId;
parms2[3].Value = cartItem.Name;
parms2[4].Value = cartItem.Type;
parms2[5].Value = cartItem.Price;
parms2[6].Value = cartItem.CategoryId;
parms2[7].Value = cartItem.ProductId;
parms2[8].Value = cartItem.Quantity;
SqlHelper.ExecuteNonQuery(trans, CommandType.Text, sqlInsert, parms2);
}
trans.Commit();
}
catch (Exception e) {
trans.Rollback();
throw new ApplicationException(e.Message);
}
finally {
conn.Close();
}
}
else
// delete cart
SqlHelper.ExecuteNonQuery(SqlHelper.ConnectionStringProfile, CommandType.Text, sqlDelete, parms1);
}
4.3 订单处理技术
订单处理技术:――分布式事务
1) 同步:直接在事务中 将订单 插入到数据库中,同时更新库存
2) 异步:订单-》消息队列(使用MSMQ)-》后台处理
4.3.1 使用Wizard组件
4.3.2 分布式事务处理技术
开启MSDTC 服务支持分布式事务. To start the MSDTC service, open Administrative Tools | Services and start the Distributed Transaction Coordinator service
4.3.3 MSMQ 消息队列简介
1)引用队列
引用队列有三种方法,通过路径、格式名和标签引用队列,这里我只介绍最简单和最常用的方法:通过路径引用队列。队列路径的形式为 machinename\queuename。指向队列的路径总是唯一的。下表列出用于每种类型的队列的路径信息:
如果是发送到本机上,还可以使用”.”代表本机名称。
2)消息的创建
不过要使用MSMQ开发你的消息处理程序,必须在开发系统和使用程序的主机上安装消息队列。消息队列的安装属于Windows组件的安装,和一般的组件安装方法类似。
往系统中添加队列十分的简单,打开[控制面板]中的[计算机管理],展开[服务和应用程序],找到并展开[消息队列](如果找不到,说明你还没有安装消息队列,安装windows组件),右击希望添加的消息队列的类别,选择新建队列即可。
消息接收服务位于System.Messaging中,在初始化时引用消息队列的代码很简单,如下所示:
MessageQueue Mq=new MessageQueue(“.\\private$\\jiang”);
通过Path属性引用消息队列的代码也十分简单:
MessageQueue Mq=new MessageQueue();
Mq.Path=”.\\private$\\jiang”;
使用Create 方法可以在计算机上创建队列:
System.Messaging.MessageQueue.Create(@".\private$\jiang");
3) 发送和接收消息
过程:消息的创建-》发送-》接收-》阅读-》关闭
简单消息的发送示例如下:
Mq.Send(1000); //发送整型数据
Mq.Send(“This is a test message!”); //发送字符串
接收消息由两种方式:通过Receive方法接收消息同时永久性地从队列中删除消息;通过Peek方法从队列中取出消息而不从队列中移除该消息。如果知道消息的标识符(ID),还可以通过ReceiveById方法和PeekById方法完成相应的操作。
接收消息的代码很简单:
Mq.Receive(); //或Mq.ReceiveById(ID);
Mq.Peek(); // 或Mq.PeekById(ID);
阅读消息
接收到的消息只有能够读出来才是有用的消息,因此接收到消息以后还必须能读出消息,而读出消息算是最复杂的一部操作了。消息的序列化可以通过Visual Studio 和 .NET Framework 附带的三个预定义的格式化程序来完成:XMLMessageFormatter 对象( MessageQueue 组件的默认格式化程序设置)、BinaryMessageFormatter 对象、ActiveXMessageFormatter 对象。由于后两者格式化后的消息通常不能为人阅读,所以我们经常用到的是XMLMessageFormatter对象。
使用XMLMessageFormatter对象格式化消息的代码如下所示:
string[] types = { "System.String" };
((XmlMessageFormatter)mq.Formatter).TargetTypeNames = types;
Message m=mq.Receive(new TimeSpan(0,0,3));
将接收到的消息传送给消息变量以后,通过消息变量m的Body属性就可以读出消息了:
MessageBox.Show((string)m.Body);
关闭消息队列
消息队列的关闭很简单,和其他对象一样,通过Close函数就可以实现了:
Mq.Close();
4.3.4 PetShop程序中订单处理-使用同步消息
默认程序使用同步消息 处理,直接操作数据库插入订单,更新库存类
4.3.5 PetShop程序中订单处理-使用异步消息
1) Web程序中调用PetShop.BLL.Order类方法: Insert(OrderInfo order);
2) PetShop.BLL.Order类
//IOrderStrategy接口中只有一个插入订单方法:void Insert(PetShop.Model.OrderInfo order);
//得到PetShop.BLL. OrderAsynchronous类
private static readonly PetShop.IBLLStrategy.IOrderStrategy orderInsertStrategy = LoadInsertStrategy();
//IOrder接口中有两种方法:Send()与Receive() -消息队列
private static readonly PetShop.IMessaging.IOrder orderQueue
= PetShop.MessagingFactory.QueueAccess.CreateOrder();
public void Insert(OrderInfo order) {
// Call credit card procesor,采用随机化方法设置订单认证数字
ProcessCreditCard(order);
// Insert the order (a)synchrounously based on configuration
orderInsertStrategy.Insert(order); //调用PetShop.BLL.OrderAsynchronous类
}
3) PetShop.BLL. OrderAsynchronous类
// CreateOrder()方法得到PetShop.MSMQMessaging .Order类的实例
private static readonly PetShop.IMessaging.IOrder asynchOrder
= PetShop.MessagingFactory.QueueAccess.CreateOrder();
public void Insert(PetShop.Model.OrderInfo order) {
asynchOrder.Send(order); //调用PetShop.MSMQMessaging.Order类
}
4) PetShop.MSMQMessaging项目 -关键(发送/接收消息)
PetShopQueue基类:创建消息队列,发送和接收消息
Order类:继承自PetShopQueue类
public new OrderInfo Receive() { //从队列中接收消息
base.transactionType = MessageQueueTransactionType.Automatic;
return (OrderInfo)((Message)base.Receive()).Body;
}
public void Send(OrderInfo orderMessage) { //发送消息到队列
base.transactionType = MessageQueueTransactionType.Single;
base.Send(orderMessage);
}
5) PetShop.OrderProcessor项目-后台处理订单,将它们插入到数据库中
Program类:多线程后台订单处理程序,可写成一个控制台程序,作为windows服务开启
处理队列中的批量异步订单,在事务范围内把它们提交到数据库
中文来自:
http://www.linuxforum.net/doc/smartq-grand.html英文原版:
http://linuxmafia.com/faq/Essays/smart-questions.html
How To Ask Questions The Smart Way
译者 D.H.Grand
How To Ask Questions The Smart Way
提问的智慧
Copyright (C) 2001 by Eric S. Raymond
中文版Copyleft 2001 by D.H.Grand(nOBODY/Ginux)
英文版:http://www.tuxedo.org/~esr/faqs/smart-questions.html
感谢Eric的耐心指点和同意,本文才得以完成并发布,本指南英文版版权为Eric Steven
Raymond所有,中文版版权由D.H.Grand[nOBODY/Ginux]所有。
目录
简介
提问之前
怎样提问
谨慎选择论坛
尽量使用邮件列表
用辞贴切,语法正确,拼写无误
用易读格式发送问题
使用含义丰富,描述准确的标题
精确描述,信息量大
话不在多
只说症状,不说猜想
按时间顺序列出症状
别要求私下答复
明白你想问什么
别问应该自己解决的问题
去除无意义的疑问
谦逊绝没有害处,而且常帮大忙
问题解决后,加个简短说明
如何理解答案
RTFM和STFW:别烦我啦
还是不懂
面对无礼
决不要象个失败者
三思而后问
好问题,坏问题
找不到答案怎么办
====
简介
====
在黑客世界里,当提出一个技术问题时,你能得到怎样的回答?这取决于挖出答案的难
度,同样取决于你提问的方法。本指南旨在帮助你提高发问技巧,以获取你最想要的答
案。
首先你必须明白,黑客们只偏爱艰巨的任务,或者能激发他们思维的好问题。如若不然,
我们还来干吗?如果你有值得我们反复咀嚼玩味的好问题,我们自会对你感激不尽。好问
题是激励,是厚礼,可以提高我们的理解力,而且通常会暴露我们以前从没意识到或者思
考过的问题。对黑客而言,“问得好!”是发自内心的大力称赞。
尽管黑客们有蔑视简单问题和不友善的坏名声,有时看起来似乎我们对新手,对知识贫乏
者怀有敌意,但其实不是那样的。
我们不想掩饰对这样一些人的蔑视--他们不愿思考,或者在发问前不去完成他们应该做的
事。这种人只会谋杀时间--他们只愿索取,从不付出,无端消耗我们的时间,而我们本可
以把时间用在更有趣的问题或者更值得回答的人身上。我们称这样的人为“失败者”(由
于历史原因,我们有时把它拼作“lusers”)。
我们也知道,很多人只想使用我们编写的软件,对技术细节没什么兴趣。对多数人们而
言,计算机不过是一个工具,一种达到目的的手段;他们有更重要的事情要做,有更重要
的生活要过。我们明白这点,也并不奢望每个人都对另我们痴狂的技术问题有兴致。然
而,我们回答问题的风格是针对这样一群人--他们有兴趣,并且愿意积极参与问题的解
决。这点不会改变,也不应该改变;如果变了,我们将失去我们引以为傲的效率。
我们在很大程度上属于志愿者,从繁忙的生活中抽出时间来解惑答疑,而且时常被提问淹
没。所以我们无情的滤掉一些话题,特别是抛弃那些看起来象失败者的家伙,以便更高效
的利用时间来回答胜利者的问题。
如果你觉得我们过于傲慢的态度让你不爽,让你委屈,不妨设身处地想想。我们并没有要
求你向我们屈服--事实上,我们中的大多数人最喜欢公平交易不过了,只要你付出小小努
力来满足最起码的要求,我们就会欢迎你加入到我们的文化中来。但让我们帮助那些不愿
意帮助自己的人是没有意义的。如果你不能接受这种“歧视”,我们建议你花点钱找家商
业公司签个技术支持协议得了,别向黑客乞求帮助。
如果你决定向我们求助,当然不希望被视为失败者,更不愿成为失败者中的一员。立刻得
到有效答案的最好方法,就是象胜利者那样提问--聪明、自信、有解决问题的思路,只是
偶尔在特定的问题上需要获得一点帮助。
(欢迎对本指南提出改进意见。任何建议请E-mail至esr@thyrsus.com,然而请注意,本
文并非网络礼节的通用指南,我通常会拒绝无助于在技术论坛得到有用答案的建议。)
(当然,如果你写中文,最好还是寄到DHGrand@hotmail.com;-)
========
提问之前
========
在通过电邮、新闻组或者聊天室提出技术问题前,检查你有没有做到:
1. 通读手册,试着自己找答案。
2. 在FAQ里找答案(一份维护得好的FAQ可以包罗万象:)。
3. 在网上搜索(个人推荐google~)。
4. 向你身边精于此道的朋友打听。
当你提出问题的时候,首先要说明在此之前你干了些什么;这将有助于树立你的形象:你
不是一个妄图不劳而获的乞讨者,不愿浪费别人的时间。能说明你从这些操作中学到了什
么就更好了。如果提问者能从答案中学到东西,我们更乐于回答他的问题。
周全的思考,准备好你的问题,草率的发问只能得到草率的回答,或者根本得不到任何答
案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。
小心别问错了问题。如果你的问题基于错误的假设,普通黑客(J. Random Hacker)通
常会用无意义的字面解释来答复你,心里想着“蠢问题...”,希望着你会从问题的回答
(而非你想得到的答案)中汲取教训。
决不要自以为够资格得到答案,你没这种资格。毕竟你没有为这种服务支付任何报酬。你
要自己去“挣”回一个答案,靠提出一个有内涵的,有趣的,有思维激励作用的问题--一
个对社区的经验有潜在贡献的问题,而不仅仅是被动的从他人处索要知识--去挣到这个答
案。
另一方面,表明你愿意在找答案的过程中做点什么,是一个非常好的开端。“谁能给点提
示?”、“我这个例子里缺了什么?”以及“我应该检查什么地方?”比“请把确切的过
程贴出来”更容易得到答复。因为你显得只要有人指点正确的方向,你就有完成它的能力
和决心。
========
怎样提问
========
------------
谨慎选择论坛
------------
小心选择提问的场合。如果象下面描述的那样,你很可能被忽略掉或者被看作失败者:
1. 在风马牛不相及的论坛贴出你的问题
2. 在探讨高级技巧的论坛张贴非常初级的问题;反之亦然
3. 在太多的不同新闻组交叉张贴
黑客们通常砍掉问错地方的问题,以保护自己的社区不被大量无关帖子淹没。你不会希望
自己的帖子被这样砍掉吧。
总的说来,问题发到精心挑选的公众论坛,比发到封闭的小圈子更容易得到有用的答案。
这一现象有多种原因,其中之一是公众论坛有更多潜在的问题回答者;另一个原因是公众
论坛有更多的听众。黑客们更愿意让尽量多的人--而非有限的一两个--从回答中受益。
----------------
尽量使用邮件列表
----------------
如果某项目有自己的开发邮件列表,要把问题发到这个邮件列表而不是某个开发者,即使
你很清楚谁最能回答你的问题。仔细查看项目文档和项目主页,找到这个项目的邮件列表
地址,这样做的理由有四:
1. 任何值得问某位开发者的好问题,都值得向整个开发团体提出。反之,若你认为这个
问题不值得在邮件列表中提起,就没有理由用它来骚扰任何一位开发者。
2. 在邮件列表提问可以分担开发者的工作量。某位开发者(尤其当他是项目负责人的情
况下),可能忙得没时间回答你的问题。
3. 大多数邮件列表都有历史存档,而且都能在搜索引擎中检索到。人们可以从中找到你
的问题和答案,不用一遍又一遍在列表中发问。
4. 如果某个问题经常被提出,开发者可以据此改进文档或改进软件,以减少用户的困
惑。而如果问题总在私下提出,就不会有人对此有整体上的把握了。
如果你找不到项目的邮件列表地址,只能看到项目维护者的,那就写给维护者吧。在这种
情况下,也别以为邮件列表并不存在。在你的信中写明你已尽力寻找,仍无法找到邮件列
表。另外表明你不介意将此消息转给他人。(大多数人认为私信就应该是私下的,即使并
没有什么可保密的内容。允许你的消息被转寄给他人,给了收信者一种处理你邮件的选
择。)
----------------------------
用辞贴切,语法正确,拼写无误
----------------------------
我们从经验中发现,粗心的写作者通常也是马虎的思考者(我敢打包票)。回答粗心大意
者的问题很不值得,我们宁愿把时间耗在别处。
因此,明确充分表述你的问题非常重要。如果你嫌这样做麻烦,我们也会懒得搭理你。注
意推敲你的用辞,不一定要用呆板正式的语言--事实上,黑客文化的价值观是不拘小节。
准确的运用俚语和富有幽默感的语言,但别乱用;一定要能表明你在思考,在关注。
正确的拼写,标点符号和大小写很重要。别把“its”和“it's”或者“loose”和
“lose”搞混淆了。别用全部大写的形式,这被视为粗鲁的大声叫嚷(全都用小写也好不
到哪儿去,因为这会给阅读带来困难。Alan Cox可以用全部小写,但你不行)。
更一般的说,如果你的提问写得象个半文盲,你很有可能被忽视。如果写得象一个窥客
(破解爱好者)或者灰客(只会用现成工具的捣乱者)绝对是自己找死,保证你除了无情
的抵制什么也得不到(或者,最好的结局是得到一大堆挖苦嘲笑的“帮助”)。
如果你在使用非母语的论坛提问,你可以犯点拼写和语法上的小错--但决不能在思考上马
虎(没错,我们能弄清两者的分别)。另外,除非你确切知道你的回答者会使用什么语
言,否则请用英文。匆匆忙忙的黑客往往简单的跳过他们看不懂的问题,而英文是网络上
的工作语言。用英文可以降低你的问题未被阅读即遭抛弃的风险。
------------------
用易读格式发送问题
------------------
如果人为造成你的提问难以阅读和理解,将会更容易被人忽略。因此你要:
1. 使用纯文本邮件,不要使用HTML(关掉HTML并不难)。
2. 通常可以附加MIME附件,但一定要有真正的内容(例如附加的源文件或者补丁),而
不仅仅是你的邮件客户端产生的文件模板(例如你邮件的一份拷贝)。
3. 不要把所有问题放在不停换行的一整段中。(这将让答复的人难于回答其中一部分问
题,即使能回答所有问题,我也更希望条理清楚的一个一个来:)。很可能收件人只能在
80个字符宽度的文本显示器上读信,因此要相应的把行环绕模式设在80字符以内。
4. 不要在英文论坛使用MIME Quoted-Printable编码发送;这种编码格式对ASCII码不
能表达的语言来说是非常必要的,但很多邮件代理不支持它,这时,满篇的“=20”符号
把文字分割开,既难看,又分散注意力。
5. 永远不要指望黑客会乐于阅读封闭所有权的文件格式,例如萎软的Word格式。多数黑
客对此的反应就象你在门口的阶梯上堆满热烘烘的猪粪(意即谁也不会踏进你的门--译者
注)。
6. 如果你通过一台安装Windows的电脑发送邮件,关闭萎软愚蠢的“智能引用”功能。这
能使你免于在邮件中夹带垃圾字符。
----------------------------
使用含义丰富,描述准确的标题
----------------------------
在邮件列表或者新闻组中,大约50字以内的主题标题是抓住资深专家注意力的黄金时机。
别用喋喋不休的“帮帮忙”(更别说“救命啊!!!!!”这样让人反感的话)来浪费这
个机会。不要妄想用你的痛苦程度来打动我们,别用空格代替问题的描述,哪怕是极其简
短的描述。
蠢问题:
救命啊!我的膝上机不能正常显示了!
聪明问题:
XFree86 4.1下鼠标光标变形,Fooware MV1005的显示芯片。
如果你在回复中提出问题,记得要修改内容标题,表明里面有一个问题。一个看起来象
“Re:测试”或者“Re:新bug”的问题很难引起足够重视。另外,引用并删减前文的内
容,给新来的读者留下线索。
------------------
精确描述,信息量大
------------------
1. 谨慎明确的描述症状。
2. 提供问题发生的环境(机器配置、操作系统、应用程序以及别的什么)。
3. 说明你在提问前是怎样去研究和理解这个问题的。
4. 说明你在提问前采取了什么步骤去解决它。
5. 罗列最近做过什么可能有影响的硬件、软件变更。
尽量想象一个黑客会怎样反问你,在提问的时候预先给他答案。
Simon Tatham写过一篇名为《如何有效的报告Bug》的出色短文。强力推荐你也读一读。
--------
话不在多
--------
你需要提供精确有效的信息。这并不是要求你简单的把成吨的出错代码或者数据完全转储
摘录到你的提问中。如果你有庞大而复杂的测试条件,尽量把它剪裁得越小越好。
这样做的用处至少有三点。第一,表现出你为简化问题付出了努力,这可以使你得到回答
的机会增加;第二,简化问题使你得到有用答案的机会增加;第三,在提炼你的bug报告
的过程中,也许你自己就能找出问题所在或作出更正。
------------------
只说症状,不说猜想
------------------
告诉黑客们你认为问题是怎样引起的没什么帮助。(如果你的推断如此有效,还用向别人
求助吗?),因此要确信你原原本本告诉了他们问题的症状,不要加进你自己的理解和推
论。让黑客们来诊断吧。
蠢问题:
我在内核编译中一次又一次遇到SIG11错误,我怀疑某条飞线搭在主板的走线上了,这种
情况应该怎样检查最好?
聪明问题:
我自制的一套K6/233系统,主板是FIC-PA2007 (VIA Apollo VP2芯片组),256MB
Corsair PC133 SDRAM,在内核编译中频频产生SIG11错误,从开机20分钟以后就有这种
情况,开机前20分钟内从没发生过。重启也没有用,但是关机一晚上就又能工作20分钟。
所有内存都换过了,没有效果。相关部分的典型编译记录如下...。
------------------
按时间顺序列出症状
------------------
对找出问题最有帮助的线索,往往就是问题发生前的一系列操作,因此,你的说明应该包
含操作步骤,以及电脑的反应,直到问题产生。在命令行操作的情况下,保存一个操作记
录(例如使用脚本工具),并且引用相关的大约20条命令会大有帮助。
如果崩溃的程序有诊断选项(例如用-v转到详尽模式),试着仔细考虑选择选项以在操作
记录中增加有用的调试信息。
如果你的说明很长(超过四个段落),在开头简述问题会有所帮助,接下来按时间顺序详
述。这样黑客们就知道该在你的说明中找什么。
--------------
别要求私下答复
--------------
黑客们认为解决问题应该有公开、透明的流程。只要任何更有见地的人注意到答案的不完
善或者不正确,这个最初的答案就可以和应该得到纠正。同时,通过能力和知识被大家注
意,被大家接受,回答问题者得到了应有的奖励。
如果你要求对方私下回答你,这既破坏了整个流程,也破坏了奖励制度。别提这要求,这
是回答者的权利,由他来选择是否私下答复--如果他选择这样做,通常是因为他认为这个
答案过于显而易见或者有不良的公开影响,别人不会感兴趣。
只有一种有限的例外:如果你预计将收到大量雷同的答复,你可以说:“把答案寄给我,
由我来汇总吧。”将邮件列表或者新闻组从大量重复的帖子中打救出来是很有君子之风的
--但请记住,履行自己关于汇总的承诺。
--------------
明白你想问什么
--------------
漫无边际的提问近乎无休无止的时间黑洞。最能给你有用答案的人也正是最忙的人(他们
忙是因为要亲自完成大部分工作)。这样的人对无节制的时间黑洞不太感冒,因此也可以
说他们对漫无边际的提问不大感冒。
如果你明确表述需要回答者做什么(提供建议,发送一段代码,检查你的补丁或是别
的),就最有可能得到有用的答案。这会定出一个时间和精力的上限,便于回答者集中精
力来帮你,这很凑效。
要理解专家们生活的世界,要把专业技能想象为充裕的资源,而回复的时间则是贫乏的资
源。解决你的问题需要的时间越少,越能从忙碌的专家口中掏出答案。
因此,优化问题的结构,尽量减少专家们解决它所需要的时间,会有很大的帮助--这通常
和简化问题有所区别。因此,问“我想更好的理解X,能给点提示吗?”通常比问“你能
解释一下X吗?”更好。如果你的代码不能工作,问问它有什么地方不对,比要求别人替
你修改要明智得多。
------------------------
别问应该自己解决的问题
------------------------
黑客们总是善于分辨哪些问题应该由你自己解决;因为我们中的大多数都曾自己解决这类
问题。同样,这些问题得由你来搞定,你会从中学到东西。你可以要求给点提示,但别要
求得到完整的解决方案。
----------------
去除无意义的疑问
----------------
别用无意义的话结束提问,例如“有人能帮我吗?”或者“有答案吗?”。首先:如果你
对问题的描述不很合适,这样问更是画蛇添足。其次:由于这样问是画蛇添足,黑客们会
很厌烦你--而且通常会用逻辑上正确的回答来表示他们的蔑视,例如:“没错,有人能帮
你”或者“不,没答案”。
----------------------------
谦逊绝没有害处,而且常帮大忙
----------------------------
彬彬有礼,多用“请”和“先道个谢了”。让大家都知道你对他们花费时间义务提供帮助
心存感激。
实话实说,虽然这不象合乎语法、清楚准确的描述,避免私有格式等等那么重要(也不能
用来替代它们);黑客一般更喜欢直接了当然而技术上敏锐的bug报告,而不是彬彬有礼
的废话(如果这让你迷惑不解,请记住,我们衡量一个问题价值的标准是:它能让我们学
会多少)。
然而,如果你有很多问题无法解决,礼貌将会增加你得到有用答案的机会。
(我们注意到,自从本指南发布后,从资深黑客处得到的唯一严重缺陷反馈,就是对预先
道谢这一条。一些黑客觉得“先谢了”的言外之意是过后就不会再感谢任何人了。我们的
建议是:都道谢。)
------------------------
问题解决后,加个简短说明
------------------------
问题解决后,向所有帮助过你的人发个说明,让他们知道问题是怎样解决的,并再一次向
他们表示感谢。如果问题在新闻组或者邮件列表中引起了广泛关注,应该在那里贴一个补
充说明。
补充说明不必很长或是很深入;简单的一句“你好,原来是网线出了问题!谢谢大家
--Bill”比什么也不说要强。事实上,除非结论真的很有技术含量,否则简短可爱的小结
比长篇学术论文更好。说明问题是怎样解决的,但大可不必将解决问题的过程复述一遍。
除了表示礼貌和反馈信息以外,这种补充有助于他人在邮件列表/新闻组/论坛中搜索对你
有过帮助的完整解决方案,这可能对他们也很有用。
最后(至少?),这种补充有助于所有提供过帮助的人从中得到满足感。如果你自己不是
老手或者黑客,那就相信我们,这种感觉对于那些你向他们求助的导师或者专家而言,是
非常重要的。问题久拖未决会让人灰心;黑客们渴望看到问题被解决。好人有好报,满足
他们的渴望,你会在下次贴出新问题时尝到甜头。
============
如何理解答案
============
--------------------
RTFM和STFW:别烦我啦
--------------------
有一个古老而神圣的传统:如果你收到“RTFM (Read The Fucking Manual)”的回
复,回答者认为你应该去读TMD手册。当然,基本上他是对的,你应该读一读。
RTFM有一个年轻的亲戚。如果答案是“STFW (Search The Fucking Web)”,回答者
认为你应该到TMD的网上去搜索。基本上,他也是对的,你就去找吧。
通常,用这两句之一回答你的人会给你一份包含你需要内容的手册或者一个网址,而且他
们打这些字的时候正在阅读着。这些答复意味着回答者认为(1). 你需要的信息非常容易
获得;(2). 你自己去搜索这些信息比灌给你能让你学到更多。
别为这个而不爽;依照黑客的标准,他没有对你的要求视而不见,已经能大致能表示对你
的关注。你应该对他祖母般的慈祥表示感谢。
----------
还是不懂
----------
如果你不是很理解答案,别立刻要求对方解释。象你以前试着自己解决问题时那样(利用
手册,FAQ,网络,身边的高手),去理解它。如果你真的需要对方解释,记得表现出你
已经学到了点什么。
比方说,如果我回答你:“看来似乎是zEntry被阻塞了;你应该先清除它。”,然后:
一个很糟的后续问题:“zEntry是什么?”
聪明的问法应该是这样:“哦~我看过帮助了但是只有-z和-p两个参数中提到了
zEntry而且还都没有清楚的解释:<你是指这两个中的哪一个吗?还是我看漏了什么?”
--------
面对无礼
--------
黑客圈子里很多貌似粗鲁的言行并非有意冒犯。更恰当的说,这是直率、不说废话的沟通
方式的产物,这种沟通方式源于人们关注问题的解决--多过让人感受温暖亲情然而却依旧
糊里糊涂--的天性。
如果你觉得受到粗鲁的对待,请保持冷静。如果真有人表现粗野,通常会有列表/新闻组/
论坛的长辈找他谈心,如果没有这样,而你又大发脾气,则很可能对方的言行是黑客社区
行为规范许可内,而你被认为是有过错的。这会不利于你得到信息或者帮助。
另一方面,你偶尔也会无缘无故有粗野的言行和心态。上述现象的另一面是,人们允许狠
狠打击真正的冒犯者,用尖刻的言语剖析他们的不当言行。如果你真决定这样做,先仔细
又仔细的掂量一下你自己的分量。合理的粗鲁与发动一场无意义的论战之间只隔了一条细
细的线,冒冒失失撞上去的黑客不在少数;如果你是新手或者门外汉,不犯这种错的机会
是很渺茫的。如果你想得到信息而不是来胡闹,别冒险回复,最好把手从键盘上拿开。
(有些人声称多数黑客有孤僻症或者社交障碍综合征的轻度症状,而且确实缺少部分有助
“常人”进行社交行为的脑组织结构。这也许是真的,也许不是。如果你自己不是黑客,
那么,把我们想象成脑部有缺陷的人有助你面对我们的古怪。有话直说,我们无所谓;我
们乐于按自己的想法生活,而且总是对医学概念持相当怀疑的态度。)
在下一节里,我们将谈论另一个话题;当你行差踏错时可能遇到的“无礼”。
================
决不要象个失败者
================
很有可能,你在黑客社区的论坛会受到很多公开的攻击--用本文提到的各种方式或类似的
方法,而且很可能会有各式各样的旁敲侧击来告诉你你有多讨厌。
如果噩梦成真,你能做的最糟的事就是为此发牢骚,抱怨受到人身攻击,要求对方道歉,
尖叫,屏住呼吸,威胁要控诉对方,向他老板告状,不掀起马桶座圈,等等等等。然而,
你应该这样:
由它去吧,这没什么大不了的。实际上这么做是恰当的和有益的(主要是有利身心健
康:)。
社区的规范不靠社区,而是靠积极推行它们的人们来维护,这种维护是公开的,显而易见
的。别抱怨说一切批评都应该通过私信传送,它本来就不该那样。当别人指出你的话有错
误,或者他有不同观点的时候,坚持认为他在羞辱你是没有用的。这些都是失败者的态
度。
有那么一些黑客论坛,出于对高度自谦的误解,禁止参与者张贴专给人找茬的帖子,而且
被告知“如果不愿帮助用户,那就闭嘴。”,他们认为,引开参与者的话题,只会使得他
们陶醉在毫无意义的喋喋不休中,从而失去了技术论坛的意义。
夸张的“友善”(以那种方式)还是有用的帮助:你自己选择吧。
记住:当黑客说你很烦人,(无论用多么粗暴的语言)警告你别再那样做了,他的本意并
非是针对(1)你,以及(2)他的社区。他本来可以轻易的忽略你,把你从他的视线中抹去。
如果你无法接受要向他表示感激,至少应该表现出你的气度,别抱怨,别期望只因为你是
新人,你有戏剧般的敏感脆弱的神经和自封的权利,而受到易碎玩偶般的特别对待。
==========
三思而后问
==========
以下是几个经典蠢问题,以及黑客在拒绝回答时的心中所想:
问题:我能在哪找到X程序?
问题:我的程序/配置/SQL申明没有用
问题:我的Windows有问题,你能帮我吗?
问题:我在安装Linux(或者X)时有问题,你能帮我吗?
问题:我怎么才能破解root帐号/窃取OP特权/读别人的邮件呢?
提问:我能在哪找到X程序?
回答:就在我找到它的地方啊蠢货--搜索引擎的那一头。天呐!还有人不会用Google吗?
提问:我的程序(配置、SQL申明)没有用
回答:这不算是问题吧,我对找出你的真正问题没兴趣--如果要我问你二十个问题才找得
出来的话--我有更有意思的事要做呢。在看到这类问题的时候,我的反应通常不外如下三
种:
1. 你还有什么要补充的吗?
2. 真糟糕,希望你能搞定。
3. 这跟我有什么鸟相关?
提问:我的Windows有问题,你能帮我吗?
回答:能啊,扔掉萎软的垃圾,换Linux吧。
提问:我在安装Linux(或者X)时有问题,你能帮我吗?
回答:不能,我只有亲自在你的电脑上动手才能找到毛病。还是去找你当地的Linux用户
组寻求手把手的指导吧(你能在这儿找到用户组的清单)。
提问:我怎么才能破解root帐号/窃取OP特权/读别人的邮件呢?
回答:想要这样做,说明你是个卑鄙小人;想找个黑客帮你,说明你是个白痴!
==============
好问题,坏问题
==============
最后,我举一些例子来说明,怎样聪明的提问;同一个问题的两种问法被放在一起,一种
是愚蠢的,另一种才是明智的。
蠢问题:我可以在哪儿找到关于Foonly Flurbamatic的资料?
这种问法无非想得到“STFW”这样的回答。
聪明问题:我用Google搜索过“Foonly Flurbamatic 2600”,但是没找到有用的结
果。谁知道上哪儿去找对这种设备编程的资料?
这个问题已经STFW过了,看起来他真的遇到了麻烦。
蠢问题:我从FOO项目找来的源码没法编译。它怎么这么烂?
他觉得都是别人的错,这个傲慢自大的家伙
聪明问题:FOO项目代码在Nulix 6.2版下无法编译通过。我读过了FAQ,但里面没有提到
跟Nulix有关的问题。这是我编译过程的记录,我有什么做得不对的地方吗?
他讲明了环境,也读过了FAQ,还指明了错误,并且他没有把问题的责任推到别人头上,
这个家伙值得留意。
蠢问题:我的主板有问题了,谁来帮我?
普通黑客对这类问题的回答通常是:“好的,还要帮你拍拍背和换尿布吗?” ,然后按
下删除键。
聪明问题:我在S2464主板上试过了X、Y和Z,但没什么作用,我又试了A、B和C。请注意
当我尝试C时的奇怪现象。显然边带传输中出现了收缩,但结果出人意料。在多处理器主
板上引起边带泄漏的通常原因是什么?谁有好主意接下来我该做些什么测试才能找出问
题?
这个家伙,从另一个角度来看,值得去回答他。他表现出了解决问题的能力,而不是坐等
天上掉答案。
在最后一个问题中,注意“告诉我答案”和“给我启示,指出我还应该做什么诊断工作”
之间微妙而又重要的区别。
事实上,后一个问题源自于2001年8月在Linux内核邮件列表上的一个真实的提问。我
(Eric)就是那个提出问题的人。我在Tyan S2464主板上观察到了这种无法解释的锁定
现象,列表成员们提供了解决那一问题的重要信息。
通过我的提问方法,我给了大家值得玩味的东西;我让人们很容易参与并且被吸引进来。
我显示了自己具备和他们同等的能力,邀请他们与我共同探讨。我告诉他们我所走过的弯
路,以避免他们再浪费时间,这是一种对他人时间价值的尊重。
后来,当我向每个人表示感谢,并且赞赏这套程序(指邮件列表中的讨论--译者注)运作
得非常出色的时候,一个Linux内核邮件列表(lkml)成员表示,问题得到解决并非由于
我是这个列表中的“名人”,而是因为我用了正确的方式来提问。
我们黑客从某种角度来说是拥有丰富知识但缺乏人情味的家伙;我相信他是对的,如果我
象个乞讨者那样提问,不论我是谁,一定会惹恼某些人或者被他们忽视。他建议我记下这
件事,给编写这个指南的人一些指导。
================
找不到答案怎么办
================
如果仍得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答
案罢了。没有回应不代表你被忽视,虽然不可否认这种差别很难区分。
总的说来,简单的重复张贴问题是个很糟的想法。这将被视为无意义的喧闹。
你可以通过其它渠道获得帮助,这些渠道通常更适合初学者的需要。
有许多网上的以及本地的用户组,由狂热的软件爱好者(即使他们可能从没亲自写过任何
软件)组成。通常人们组建这样的团体来互相帮助并帮助新手。
另外,你可以向很多商业公司寻求帮助,不论公司大还是小(Red Hat和LinuxCare就是
两个最常见的例子)。别为要付费才能获得帮助而感到沮丧!毕竟,假使你的汽车发动机
汽缸密封圈爆掉了--完全可能如此--你还得把它送到修车铺,并且为维修付费。就算软件
没花费你一分钱,你也不能强求技术支持总是免费的。
对大众化的软件,就象Linux之类而言,每个开发者至少会有上万名用户。根本不可能由
一个人来处理来自上万名用户的求助电话。要知道,即使你要为帮助付费,同你必须购买
同类软件相比,你所付出的也是微不足道的(通常封闭源代码软件的技术支持费用比开放
源代码软件要高得多,而且内容也不那么丰富)。
OpenSolaris/Solaris中文FAQ
Wikipedia,自由的百科全书
维护者: Oliver Adamzhang
本文来自: OpenSolaris中国社区
URL: http://wiki.gceclub.sun.com.cn/index.php/Opensolaris_chinese_faq
声明: 本FAQ可自由拷贝、分发、修改及再创作;
- 任何问题/回答/建议/勘误请mail至讨论组以帮助和回馈社区;
讨论组: zh-users-discuss AT opensolaris.org
注:
- 本文档只覆盖Solaris 9及以后的平台上的常见问题
- S9/10/11 分别对应目前Solaris的发行版本9/10/11
- x86/x32/x64/Sparc 分别对应x86包括32和64位/IA32专有/AMD64或EMT64位专有/Sparc等特定平台
一般讨论
系统安装
使用/管理/配置
- 3.1 系统启动和关闭
- 3.2 系统基本操作
- 3.3 Shell操作和使用
- 3.4 系统基本配置(系统,CPU,内存,网络)
- 3.5 存储设备使用(硬盘,USB硬盘,CD, DVD等)
- 3.6 系统软件使用
- 3.7 系统常用服务管理(Telnet,FTP, SSH等)
- 3.8 ZFS
- 3.9 Container and Zone
- 3.10 DTrace
- 3.11 Oracle
- 3.12 系统安全管理
应用程序开发
内核和驱动程序开发
其他
商业公司的流氓软件越来越像黑客程序;黑客攻击明码标价越来越像商业公司。
看了文苗关于黑客的文章,不管黑客是否经历了古典现代后现代的变化,但是有些感觉不吐不快,前些年提到黑客,大家对他们还带着几分崇敬,但是现在则是无尽的苦恼。若干年前媒体上出现的黑客,大部分是发现了什么漏洞,窃取了政府的一些信息,最近媒体的报道则大多是QQ盗窃,网银盗窃和网络钓鱼之类的(姑且不论这些人是否是真正的黑客)。
有个朋友msn的签名愁云惨淡,说他的网站被攻击了,前些日子有人还告诉我他被攻击以后还被勒索,说不汇钱就将一直攻击下去。我当时出于好奇到一个小有名气的黑客站点上看了一下,发现攻击工具都是明码标价,而且还有售后服务。假如用户自己不会使用,还可以收费代为攻击。
感觉现在互联网上一些阴暗的东西已经成为一条产业链:无论是前些日子沸沸扬扬的流氓软件,还是垃圾邮件和BLOG上另开心拍案而起的无穷无尽的SPAM,还是这些不知是否能算作真正黑客的人有意无意的攻击。这些大家都讨厌至极的东西虽然人人喊打,但是实际上却日益繁荣,因为他们已经和太多的经济利益挂在了一起。一些网站流氓营销的最终成功,也给很多公司和个人打上了兴奋剂。黑了可以洗白,甚至还可以掉头打黑,社会只会以成败论英雄。
反流氓软件厂商奔着巨大的经济利益,借着大众的舆论,这段时间流氓软件终于没有那么嚣张了。不知道什么时候,我们在上网的时候打开一个链接,不用再提心吊胆。
百度官方搜索技巧 http://www.baidu.com/search/skill.html
除了上面的链接以外,其实 google 的大部分技巧可以用于百度,比如 insite inurl 等等,下面从百度的帮助里面,推荐几种高级的查找法,尤其适合查找资料:
专业文档搜索
很多有价值的资料,在互联网上并非是普通的网页,而是以Word、PowerPoint、PDF等格式存在。百度支持对Office文档(包括Word、Excel、Powerpoint)、Adobe PDF文档、RTF文档进行了全文搜索。要搜索这类文档,很简单,在普通的查询词后面,加一个“filetype:”文档类型限定。“Filetype:”后可以跟以下文件格式:DOC、XLS、PPT、PDF、RTF、ALL。其中,ALL表示搜索所有这些文件类型。例如,查找张五常关于交易费用方面的经济学论文。“交易费用 张五常 filetype:doc”,点击结果标题,直接下载该文档,也可以点击标题后的“HTML版”快速查看该文档的网页格式内容。
您也可以通过 百度文档搜索 界面(http://file.baidu.com/) ,直接使用专业文档搜索功能。
推荐用法: filetype:all <关键词> 例子: http://www.baidu.com/s?wd=filetype%3Aall+%B7%BD%B0%B8&cl=3
把搜索范围限定在网页标题中——intitle
网页标题通常是对网页内容提纲挈领式的归纳。把查询内容范围限定在网页标题中,有时能获得良好的效果。使用的方式,是把查询内容中,特别关键的部分,用“intitle:”领起来。
例如,找林青霞的写真,就可以这样查询:写真 intitle:林青霞 例子:http://www.baidu.com/s?ie=gb2312&bs=site%3Ahelixapp.com+%B7%C0%B5%C1%C1%B4&sr=&z=&cl=3&f=8&wd=intitle%3Ahelixapp+%B7%C0%B5%C1%C1%B4&ct=0
注意,intitle:和后面的关键词之间,不要有空格。
把搜索范围限定在特定站点中——site
有时候,您如果知道某个站点中有自己需要找的东西,就可以把搜索范围限定在这个站点中,提高查询效率。使用的方式,是在查询内容的后面,加上“site:站点域名”。
例如,天空网下载软件不错,就可以这样查询:msn site:skycn.com
例子:http://www.baidu.com/s?lm=0&si=&rn=10&ie=gb2312&ct=0&wd=site%3Ahelixapp%2Ecom+%B7%C0%B5%C1%C1%B4&pn=50&cl=3
注意,“site:”后面跟的站点域名,不要带“http://”;另外,site:和站点名之间,不要带空格。
把搜索范围限定在url链接中——inurl
网页url中的某些信息,常常有某种有价值的含义。于是,您如果对搜索结果的url做某种限定,就可以获得良好的效果。实现的方式,是用“inurl:”,后跟需要在url中出现的关键词。
例如,找关于photoshop的使用技巧,可以这样查询:photoshop inurl:jiqiao
上面这个查询串中的“photoshop”,是可以出现在网页的任何位置,而“jiqiao”则必须出现在网页url中。
注意,inurl:语法和后面所跟的关键词,不要有空格。
参见: 关于一个google搜索技巧-InUrl
精确匹配——双引号和书名号
如果输入的查询词很长,百度在经过分析后,给出的搜索结果中的查询词,可能是拆分的。如果您对这种情况不满意,可以尝试让百度不拆分查询词。给查询词加上双引号,就可以达到这种效果。
例如,搜索 上海科技大学 ,如果不加双引号,搜索结果被拆分,效果不是很好,但加上双引号后,“上海科技大学”,获得的结果就全是符合要求的了。
书名号是百度独有的一个特殊查询语法。在其他搜索引擎中,书名号会被忽略,而在百度,中文书名号是可被查询的。加上书名号的查询词,有两层特殊功能,一是书名号会出现在搜索结果中;二是被书名号扩起来的内容,不会被拆分。 书名号在某些情况下特别有效果,例如,查名字很通俗和常用的那些电影或者小说。比如,查电影“手机”,如果不加书名号,很多情况下出来的是通讯工具——手机,而加上书名号后,《手机》结果就都是关于电影方面的了。
要求搜索结果中不含特定查询词
如果您发现搜索结果中,有某一类网页是您不希望看见的,而且,这些网页都包含特定的关键词,那么用减号语法,就可以去除所有这些含有特定关键词的网页。
例如,搜 神雕侠侣,希望是关于武侠小说方面的内容,却发现很多关于电视剧方面的网页。那么就可以这样查询:神雕侠侣 -电视剧
注意,前一个关键词,和减号之间必须有空格,否则,减号会被当成连字符处理,而失去减号语法功能。减号和后一个关键词之间,有无空格均可。
广告: HelixApp流媒体防盗链(WMS IIS HELIX)

相关文章:
Google搜索技巧-入门篇
十大高明的Google搜索技巧
Google黑客搜索技术
Google搜索技巧2005
Google桌面搜索使用心得
Google talk技巧十则
十四个方法提高博客的页面访问量
关于一个google搜索技巧-InUrl
百度搜索技巧
Google桌面搜索是一个Google新推出的桌面搜索工具,用于搜索本地电脑的资料,此桌面搜索软件的确非常强大, 数G的信息经过索引后也只有几百M,可以非常方便的搜索OFFICE文件,邮件,WEB历史临时记录等,搜索速度非常快。
个人觉得它可能有一定的安全隐患,其搜集用户个人资料,并连接到GOOGLE进行通讯(我机器上安装的防火墙就导致其无法连接GOOGLE),可能会将个人电脑上的隐秘信息发送到GOOGLE,并且如果其通讯方式具有一定漏洞的话,黑客就可以截获它向外发送的信息来入侵个人电脑。
另外其耗费的资源似乎有点大,安装桌面搜索后电脑的运行速度变慢了,CPU占用率增大了。
[ZT] http://www.williamlong.info/archives/138.html
广告: HelixApp流媒体防盗链(WMS IIS HELIX)

相关文章:
Google搜索技巧-入门篇 十大高明的Google搜索技巧 Google黑客搜索技术Google搜索技巧2005 Google桌面搜索使用心得 Google talk技巧十则 十四个方法提高博客的页面访问量 关于一个google搜索技巧-InUrl 百度搜索技巧
Google Talk这款即时通讯软件已经推出很长时间了,这里转载一篇介绍Gtalk的小技巧的文章,原文作者署名松儿,来源于IT168。
技巧一 显示粗体字,只需要在文字左右加上星号
*Talk*会变成 Talk
技巧二 显示斜体字,只需要在文字左右加上下划线。
_Talk_会变成 Talk
技巧三 显示字体的嵌套,上面所述的技巧可以嵌套使用
_*Talk*_会变成粗斜体 Talk,同样_:)_会变成斜体表情。
技巧四 插入表情, 支持的表情集合:
:) :( :P :O :D :|
输入这些表情是会以蓝色粗体显示
技巧五 一次输入多行文本
按一次Shift+Enter键即可增加一行文本
技巧六 窗口粘着
把聊天窗口移动到主窗口边缘即可实现粘着功能,拖动主窗口即可实现聊 天窗口跟随的同时移动。
技巧七 窗口迭加
多个聊天窗口依次迭加,可节约任务栏空间。如果你的聊天窗口没有迭加,请将它们全部关闭,再打开。迭加后的聊天窗口依然可以粘着,可以分类性得把聊天窗口迭加成几堆,黏着在主窗口周围,方便统一移动。
技巧八 加入空行
按Shift+回车(输入框会因此变大)
技巧九 改变文字大小
按Ctrl+鼠标滚轮
技巧十 切换不同的对话窗口
按ctrl+tab
原文地址:Google talk技巧十则
广告: HelixApp流媒体防盗链(WMS IIS HELIX)

相关文章:
Google搜索技巧-入门篇 十大高明的Google搜索技巧 Google黑客搜索技术Google搜索技巧2005 Google桌面搜索使用心得 Google talk技巧十则 十四个方法提高博客的页面访问量 关于一个google搜索技巧-InUrl 百度搜索技巧
使用Google搜索引擎可以让普通人做一次黑客(Google Hacking),其原理也是很简单,很多有特定漏洞的网站都有类似的标志页面,而这些页面如果被Google索引到,我们就可以通过搜索指定的单词来找到某些有指定漏洞的网站。
举个例子来讲,FrontPage Extensions是微软IIS上的一个产品,但是其Netscape版本中的口令文件的访问权限设置有错误,黑客取得这些口令文件后,使用暴力破解工具就有可能获取一些弱用户帐号口令。
如何获取口令文件呢?搜索一下这个ext:pwd inurl:(service | authors | administrators | users) "# -FrontPage-",可以发现有128个口令文件可供下载。
这里有个英文网站,里面有很多Google黑客的漏洞词资源,大家可以上那里找一些漏洞。
另外,如果记不住类似inurl这样的Google搜索命令,也可以在Google搜索主页上找一个叫“高级搜索”的链接,点进去之后,可以通过指定的系列条件来简单地完成特定的搜索方式。
还有一种Google黑客的方法是间接的,比如某个流行的网络产品有漏洞,那么就搜索这个产品的相同的字符串,比如某天phpBB论坛系统出现一个漏洞,那么我们就使用Google搜索“Powered by phpBB”,就可以搜索出几乎所有使用phpBB系统的论坛,然后一个一个地去黑吧。
[ZT] http://www.williamlong.info/archives/677.html
广告: HelixApp流媒体防盗链(WMS IIS HELIX)

相关文章:
Google搜索技巧-入门篇 十大高明的Google搜索技巧 Google黑客搜索技术Google搜索技巧2005 Google桌面搜索使用心得 Google talk技巧十则 十四个方法提高博客的页面访问量 关于一个google搜索技巧-InUrl 百度搜索技巧
作者:Philipp Lenssen
原文地址:http://blog.outer-court.com/archive/2005-09-29-n85.html
原文标题:Google Search Tips 2005
注意:本文翻译人不详。文中[]符号是为了突出关键词,在实际搜索中是不包含的;本文采用的是意译;本译文已经征得作者许可;本译文可任意转载,请保留本文的头信息。
以下是正文。
Google搜索技巧2005
这里有一些Google搜索引擎的基本搜索技巧以及高级技巧,你可能对其中大部分已经了解,但是如果你知道了另外的那一部分,它可能会给你将来的搜索过程带来很大的便利。
1. 双引号可以用减号代替,比如搜索["like this"]与搜索[like-this]是一个效果
2. Google不会处理一些特殊的字符,比如[#](几年前还不行,现在可以了,比如搜索[c#]已经可以搜到相应的结果),但是还有一些字符它不认识,比如搜索[t.]、[t-]与[t^]的结果是一样的
3. Google允许一次搜索最多32个关键词
4. 在单词前加~符号可以搜索同义词,比如你想搜索[house],同时也想找[home],你就可以搜索[~house]
5. 如果想得到Google索引页面的总数,可以搜索[* *]
6. Google可以指定数字范围搜索。搜索[2001..2005]相当于搜索含有2001、2002直到2005的任意一个数的网页
7. 搜索[define:css]相当于搜索css的定义,这招对想学习知识的人很有效;也可以用[what is css]搜索;对中文来说,也可以用[什么是css]之类的
8. Google有一定的人工智能,可以识别一些简单的短语如[when was Einstein born?]或[einstein birthday]
9. 通过[link:]语法,可以寻找含有某个链接的网页,比如[link:blog.outer-court.com]将找到包括指向 blog.outer-court.com超级链接的网页(最新的Google Blog Search也支持这个语法),但是Google并不会给出所有的包含此链接的网页,因为它要保证pagerank算法不被反向工程(呵呵,可以参见那两个Google创始人关于pagerank的论文,可下载)
10. 如果在搜索的关键词的最后输入[why?],就会在结果中出现链接到Google Answers的链接http://answers.google.com ,在里面可以进行有偿提问
11. 现在出现了一种兴趣活动,叫做Google Hacking,其内容是使用Google搜索一些特定的关键词,以便找到有漏洞的、易被黑客攻击的站点。这个网站列出了这些关键词:Google Hacking Database( http://johnny.ihackstuff.com/index....ule=prodreviews )
12. 在Google 中输入一组关键词时,默认是“与”搜索,就是搜索包含有所有关键词的网页。如果要“或”搜索,可以使用大写的[OR]或 [|],使用时要与关键词之间留有空格。比如搜索关键词[Hamlet (pizza | coke)],是让Google搜索页面中或页面链接描述中含有Hamlet,并含有pizza与coke两个关键词中任意一个的网页。
13. 并非所有的Google服务都支持相同的语法,比如在Google Group中支持 [insubject:test]之类的主题搜索。可以通过高级搜索来摸索这些关键词的用法:进入高级搜索之后设置搜索选项,然后观察关键字输入窗口中的关键字的变化
14. 有时候Google懂得一些自然语言,比如搜索关键词[goog], [weather new york, ny], [new york ny]或[war of the worlds],此时Google会在搜索结果前显示出一个被业内称为“onebox”的结果,试试看吧!
15. 并非所有的Google都是相同的,它因国家版本(或是说语言版本)而异。在US版下,搜索[site:stormfront.org]会有成千上万的结果,而在德语版下,搜索[site:stormfront.org]的结果,嗯,自己看吧。Google的确与各国政府有内容审查协议,比如德国版,法国版(网页搜索),中国版Google新闻
16. 有时候Google会提示你搜索结果很烂,比如你搜索关键词[jew]试试,Google会告诉你它给出的搜索结果很烂,然后给你一个解释:http://www.google.com/explanation.html
17. 以前,搜索某些关键词如[work at Google] 时会看到Google给自己打的广告。可以去http://www.google.com/jobs/了解Google的工作
18. 对于一些“Googlebombed”(大概意思是指Google搜索的结果出问题了)的关键词,会有一个广告链接到:http: //googleblog.blogspot.com/2005/09/googlebombing-failure.html (中国大陆需要代理才能访问)。比如搜索[failure],第一条是美国布什总统介绍
19. 虽然现在Google还没有支持自然语言,但这里有一段录像显示了支持自然语言的搜索引擎的使用效果:http://blog.outer-court.com/videos/googlebrain.wmv
20. 有人说在Google中搜索[president of the internet],其结第一条表明了president of the internet是谁,我也是这么认为的,而且你还可以使用这个logo支持本文作者:http://blog.outer- court.com/files/president.gif
21. Google现在不再有“stop words”(被强制忽略的关键词),比如搜索 [to be or not to be], Google返回的结果中间还列有相关的完整短语搜索结果
22. 在Google 计算器(http://www.google.com/help/features.html#calculator )中有个彩蛋:输入[what is the answer to life, the universe and everything?]时,会返回42。(关键词翻译过来的意思是指“生命、宇宙和一切的答案”,这是一个著名科幻小说中的情节,详情参见http: //en.wikipedia.org/wiki/The_Answer_to_Life,_the_Universe, _and_Everything)。试试吧,哈哈
23. 你可以在搜索时使用通配符[*],这在搜索诗词时特别有效。比如你可以搜一下["love you twice as much * oh love * *"] 试试
24. 同样,你的关键词可以全部都是通配符,比如搜索["* * * * * * *"]
25. www.googl.com是在输错网址后的结果,也是个搜索网站,但搜索结果与Google完全不同。而且此网站也赚Google的钱,因为它使用Google AdSense
26. 如果你想把搜索结果限制在大学的网站之中,可以使用[site:.edu]关键词,比如[c-tutorial site:.edu],这样可以只搜索以edu结尾的网站。你也可以使用Google Scholar来达到这个目的。也可以使用[site:.de]或[site:.it]来搜索某个特定国家的网站。
广告: HelixApp流媒体防盗链(WMS IIS HELIX)

相关文章:
Google搜索技巧-入门篇 十大高明的Google搜索技巧 Google黑客搜索技术Google搜索技巧2005 Google桌面搜索使用心得 Google talk技巧十则 十四个方法提高博客的页面访问量 关于一个google搜索技巧-InUrl 百度搜索技巧
本文是Google搜索技巧系列文章的第一篇,也是在看了《十四个方法提高博客的页面访问量》后,尝试一下其中的第六条-写一个系列文章,于是就拿Google开刀了,第一篇介绍的是最简单基本的东西,经常使用Google搜索的可以跳过本文。
基本搜索
Google 查询简洁方便,仅需输入查询内容并敲一下回车键 (Enter),或单击“Google 搜索”按钮即可得到相关资料。
搜索两个及两个以上关键字
Google 只会返回那些符合您的全部查询条件的网页。不需要在关键词之间加上“and”或“+”。如果您想缩小搜索范围,只需输入更多的关键词,只要在关键词中间留空格就行了。
搜索结果不包含某些特定信息
如果要避免搜索某个词语,可以在这个词前面加上一个减号(“-”, 英文字符)。但在减号之前必须留一空格。
自动简繁转换
Google有智能型汉字简繁自动转换系统。值得注意的是这个系统不是简单的字符变换,还包括不同区域之间惯用语转换。例如中国大陆称朝鲜为“北朝鲜”,而港台和海外则称之为“北韩”,因此在搜索简体的“北朝鲜”时,会同时自动对应搜索繁体的“北韩”。当搜索所有中文网页时,Google会对搜索项进行简繁转换后,同时检索简体和繁体网页。并将搜索结果的标题和摘要转换成和搜索项的同一文本,以便阅读。
拼音汉字转换
Google 运用智能软件系统对拼音关键词能进行自动中文转换并提供相应提示。例如:搜索“yue guang”, Google 能自动提示 “您是不是要找:月光”。如果您点击“月光”, Google 将以“月光”作为关键词进行搜索。对于拼音和中文混和关键词,系统也能做有效转换。
整词的搜索
在 Google 中,可以通过添加双引号来搜索短语。双引号中的词语(比如"月光博客")在查询到的文档中将作为一个整体出现,而不会自动进行分词处理。这一方法在查找名言警句或专有名词时显得格外有用。
通配符
你可以在搜索时使用通配符“*”,这在搜索诗词时特别有效。比如你可以搜一下“when i was young i'd listened to the radio * my favorite songs waiting ”可以通过模糊记忆的单词找到“yesterday once more”的歌词地址。
[ZT] http://www.williamlong.info/archives/571.html
广告: HelixApp流媒体防盗链(WMS IIS HELIX)

相关文章:
Google搜索技巧-入门篇 十大高明的Google搜索技巧 Google黑客搜索技术Google搜索技巧2005 Google桌面搜索使用心得 Google talk技巧十则 十四个方法提高博客的页面访问量 关于一个google搜索技巧-InUrl 百度搜索技巧
[ZT] 十四个方法提高博客的页面访问量
看到别人翻译的一篇文章,是讨论如何提高博客访问量的,提到的有几个方法蛮有新意,不过不赞成原文的“在聚合中只输出摘要”的方法。
十四个方法提高博客的页面访问量
作者:Darren Rowse,翻译:Lucifer
如何增加Blog的访问量已经是老生长谈了,其实对于blogger来说另一个统计数也至关重要:页面浏览量。
很多的网站流量统计服务会同时提供这两项数据- “访问量”计数的是访问者的数目,而页面浏览量算的则是这些访问者所浏览的你blog上的网页的数目。
对不同blog来说,每个访问者的页面浏览量会有所不同,但希望这个数字可以大一总不是件坏事:
- 回头率: 读者浏览的页面越多,那么他再次造访的可能性也就更大。
- 收入: 放在blog上的广告多是印象型的,也就是说被浏览的次数多了,被点击的可能性才越大。
写blog的目的不同,所以想不想把增加页面浏览量放在第一位悉听尊便。对于那些希望这项统计值上升的人,这里有14条建议:
1、内链到自己的文章
这可能是最简单的增加页面流量的办法,那就是在自己文章里加入链接,指向自己的其它文章。自卖自夸可能有点好笑,不过如果是链接到一些之前写过的相关或相同主题的文章的话,相信还是读者们所喜闻乐见的。很多的blogger在自己的blog上会多次写到同一主题,把这些文章都链到一起无疑会显出你对这个主题的探讨深度。
2、高亮显示相关的文章
不想在文章内部加入指向之前文章的链接的话,专门独立出一个“相关文章”(Related post)的部分就不失为一个好的替代方法了(你可以在侧栏里看到我的相关文章(related entries),而原文作者,ProbBlogger的主人的相关文章则放在了每篇文章之后,并以黄色为背景以突出显示)。Wordpress有专门的插件可以自动实现这一功能(名为related posts)。当然你要是想手动实现也是可以的,只要在文章结尾处加进一些和本文相关的可供读者参考的文章链接就可以了。
3、加入一个邮件订阅或文章更新提提示服务
原文作者就尝到了通过邮件订阅来提高页面浏览量的甜头,凡是通过邮件订阅的读者在收到ProBlogger的最新消息的同时都会留意到一个叫作“hot posts”的部分,在这个部分中整理收入了一周当中的最受欢迎的5篇文章。因为不同读者所关注的文章不同,所以很可能一些人只看过其中的某几篇文章,加入“hot posts”之后,这部分读者就会对没看过的那些文章产生兴趣。这样一来就在增加“访问量”的同时也增加了“页面浏览量”。其它的一些通过邮件提示更新的订阅服务应该也很有效(比如Zookoda和Feedburner就都有这个功能)。
4、在醒目位置高亮显示重要文章
ProBlogger在页面的上部有三个高亮显示的菜单栏,里面放置了一些介绍或提示性质的文章,比如什么是blog,blog设计的窍门之类。而通过作者的观察很多读者都会认真地把这里的文章看过一遍。这样一来无疑就提高了页面量。
5、“几大……”
这种“最…”或是“几几大…”的链接到多个页面的文章似乎总是会勾起读者的兴趣。比如“二十大最受欢迎文章”往往就成为初次造访的读者必看的文章,而这又指引着他们挨着个地去看,不失为一个好办法。
6、写一个系列
写一系列的文章来提高页面量有着两层意义。首先在写这个系列的这段时间里,读者会不时地被吸引回来,因为他们想看看你下一篇文章写了些什么; 其次,在你完成了这个系列之后,如果能很好的把这些文章都链在一起(参考1和2),这样一来读者就会从头到尾读完整个系列(当然是由多个页面组成的)。原文作者就写过一个初学者blog指南的系列,而每个从头到尾看完这个系列的读者都要看上30到40篇文章(汗)。
7、在首页上输出摘要
在首页上只输出摘要或是只输出文章的一部分,然后通过一个“阅读完整文章”的链接链到单独的页面,这样一来想看完整文章的就得再去单独的页面。不得不说这样一来会很烦人,所以很多人都不这么做。不过对于篇幅长的文章来说,这么做不仅使首页看起来更严谨,也在无形中增加了页面量。
8、企划或专题
和之前的系列文章相类似,比如很多主题(theme)设计者的blog就是通过建立某个主题的企划,从而吸引关注这个主题的人不时地来看看工作的进展情况。类似的比如开展讨论或者竞赛也可以达到相同的效果。不过这些牛人做这个的首要目的并不是区区页面量,页面量不过是副产品罢了。
9、在聚合中只输出摘要
这是为我所不耻的。就连原文作者也不这么做。尽管这样一来你的页面访问可能会有所上升,但我觉得无论是对于读者还是作者来说都是得不偿失。在这样一个“你有压力,我有压力”的社会,每个人的时间都很宝贵,用聚合的目的就是节省时间和资源。所以我看到只输出摘要的blog就一个反应,把它从我的bloglines里删除。强烈建议所有的blogger都在聚合里都输出完整的文章!
10、诱使聚合读者访问页面
相比起输出摘要的做法,我觉得这个更可取。不是通过强迫,而是通过一些技巧,比如投票,吸引读者参与评论,或是内部链接的方式来把读者带到你的页面上来。
11、互动
读者参与的越多,回访的机率也就越大,同时页面量也就越多。参与了评论或是投票的读者很多都会回访,来看看其他人的回应。而回应本身就带来了两次页面访问量。就留言评论来说,看一遍文章就是一次页面访问,而留个言就是又一次。同样的,最好不要把这个当成吸引留言的首要目的,交流才是根本啊。互动主要发生在留言部分,当然投票以及其它的工具也应该有效果。
12、吸引读者的评论
有几个方法可以有效地达到这个目的:比如通过插件实现在侧栏里显示最新的评论,为评论提供一个专门的聚合,或是提供邮件订阅评论的选项。
13、搜索
通过加入搜索功能从而方便读者检索你之前写的文章也可以提高页面量。有很多方法可以实现这一功能。大多数的主题都内建了一个搜索引擎,Google的AdSense也提供了这样的一个服务,读者可以选择搜索本站或是整个网络,而且如果他们在搜索结果页面点击了广告,那么还可以给你带来一点小小的外块。
14、给你的读者留作业
原文作者举了他的一个提供摄影技巧的blog为例,因为是为读者提供一些摄影的窍门,所以在文章的结尾布置一些“作业”以便让读者可以亲自去尝试就显得十分自然了。这样一来读者就会经常回访,一方面这种窍门或是教学多是一步步的,所以他们会经常打开你的页面,反复按照你的指导一步步地去做;另一方面,很多人都会想要向你展示一下他们的作业成果。
在文章的结尾,我也学着作者的样子留个作业吧:
- 你的blog上应用了以上的哪一项方法?
- 看过这篇文章之后你有没有想试试哪一个的想法?
- 试试其中的一个(或者几个)方法,然后告诉回来告诉我们效果怎么样。
原文地址:How to Increase a Blog’s Page Views
译文地址:十四个方法提高博客的页面访问量
广告: HelixApp流媒体防盗链(WMS IIS HELIX)

相关文章:
Google搜索技巧-入门篇 十大高明的Google搜索技巧 Google黑客搜索技术<
Google搜索技巧2005 Google桌面搜索使用心得 Google talk技巧十则 十四个方法提高博客的页面访问量 关于一个google搜索技巧-InUrl 百度搜索技巧
[ZT] http://publish.it168.com/2006/1213/20061213001101.shtml
前言:多数人在使用Google搜索的过程是非常低效和无谓的,如果你只是输入几个关键词,然后按搜索按钮,你将是那些无法得到Google全部信息的用户,在这篇文章中,Google搜索专家迈克尔.米勒将向您展示如何更智能、更高效地进行Google的系列搜索。
Google是一个非常精密成熟的搜索引擎,但大多数的用户都没有能完全地利用到它的能力。一般人就是在Google的搜索框中输入一两个关键字,然后点击“搜索”按钮,等着Google显示出它第一页的搜索结果。这是一个相当简单模式匹配算法的搜索,不幸的是,通常此时出现的大部分都是并不需要的结果。
其实,还是有更好的方式能够让搜索产生一些更少、更为准确的结果。你所需要做的事只是学习一些简单的技巧,你就能很快得到更多更好的Google搜索结果。
技巧一:使用正确的方法
无论你是使用一个简单或是高级的Google搜索,在此都存在你应该使用的某种可靠的方法。遵循适当的方法你就能获得非常准确的结果;要是忽略这条建议的话,你也许就会看到大量不相关的结果或是缺乏你想要的相关结果。
虽然有很多不同(且同样有效的)方法用于网络搜索,我保证这个特别的方法将能带来最棒的结果。这是一个分六步骤的过程,如下:
1、首先,想好你想要寻找什么。哪些词能够最好地描述你要寻找的信息或者概念?哪些词是你能够用来替换的?有没有那些词是可以不必包括在你想要搜索的更好定义你的需求之内?
2、构建你的搜索要求。使用尽可能多你所需要的关键词;越多越好。如果皆存在可能的话,试着用适当的搜索操作来使你的搜索更精炼——或者,如果你愿意的话,可以使用高级搜索页面。
3、点击“搜索”按钮进行搜索。
4、评估一下搜索结果页面上的匹配程度。如果一开始的结果与你想要的不一致,再精炼你的搜索要求并重新搜索——或转向更合适的搜索站点再进行搜索。
5、选择你想要查看的匹配的页面,点击进行浏览。
6、保存这些最符合你需求的信息。
换言之,这需要你在搜索之前思考清楚,接着在获得最初结果后精炼你的搜索。这些多做的努力都是轻微的,但确实很值得。
技巧二:合理利用一个“与/或”的搜索
大多数的用户都没有意识到,Google会自动假定一次搜索要求中所有的词之间都是一种“和”的关系。也就是,如果你输入两个词,它就会假定你所寻找的页面是包含这两个词的。它不会反馈给你仅包含其中一个词的页面。
这就使得你无须在输入搜索要求时输入一个“和”。如果你想要搜索的包括“Bob”和“Ted”,你所需要做的就是输入bob ted即可。Google会自己假定一个“和”,并自动地将它包括在内部的索引搜索内。
这与在所要求的词之间假定“或”是不同的。例如,对比输入的要求“bob ted”(记得,这个实际上是bob和ted)与“bob或ted”。根据第一个要求所得的结果所包含的页面会共同提到Bob和Ted.而后者,结果所包含的页面会只单独提到Bob,也有些页面是单独提到Ted,还有一些是共同提到他们二者的。这是一个微妙的差异,但却是很重要的。
因此,如果你想要一个“与/或”的搜索——搜索包括一个或另一个词的页面,但不一定是都包括二者——你必须在两个关键词之间插入一个带有“或者”功能的操作。当你输入这个“OR”的表示“或者”操作时,请确保所输入的要大写,否则Google会将它忽视为一个忽略的单词(stop word)——也我们接下去将要讲到的。
技巧三:你的搜索中包括或不包括的词
关于这些“and”和“or”的词,Google会自动地将这些在你输入的搜索要求中的不重要的、普通的词忽略掉。这些被称作是“忽略的单词”,包括“and”、“the,”、“where”、“how”、“what”、“or”(所有字母皆为小写,还有其它一些类似的词——包括一些单独的数字或单独的字母(例如 “a”)。
在搜索中包含忽略的单词并没有什么大碍,不过会使搜索速度有些下降,这就是Google将它们剔除的原因。举一个例子,你想要搜索的是“how a toaster works”(烤箱如何工作),Google会移除“how”和“a”两个词,并自行按新的更短的关键词“toaster works”进行搜索。
如果你想要让这些一般的词包含在你的搜索要求内,你可以通过让Google必须在搜索中包含这些特定的词,使它不去排除“忽略的单词”。想要做到这点,你可以在你确实需要的词之前加上一个“+”符号。例如,要在搜索要求中包含“how”,你应该输入“+how”。请确保在+符号之前有一个空格符,而不是在它之后。
从另一方面来说,有时你会想要通过排除一些包含特定词的页面来精炼你的搜索结果。你可以通过使用一个“-”号来去掉搜索结果中不想要包括在内的词;在你的搜索要求中任何之前加上了“-”符号的词都会自动地排除在搜索结果之外。同样地,也请记住在“-”符号之前留一个空格符。
例如,如果你想要搜索“bass”,你所得到的页面可能会包括男歌手一类的或是关于鱼的一类的。如果你仅向搜索的是歌手这类的页面,输入搜索要求时应如下:“bass -fish”。
技巧四:搜索近似的词
不确定你在一次搜索中想要搜索的词是正确的?你是否担心一些页面会使用可替代的词来描述你想要的东西呢?
幸运的是,Google能够让你搜索近似的词——叫做同义词——通过使用“~”符号。只要在想要搜索的词之前加上“~”符号,Google就会搜索所有包括这个词以及合适的近义词的页面。
例如,要搜索类似“elderly”的词,输入“~elderly”,所得到的页面就会不仅是包括“elderly”这个词,还会有包括“senior”、“older”、“aged”等等词的页面。
在此还有个额外的技巧:如果要只是列出近义词的页面,而不需要给出许多原先输入的那个词的页面,可以用“-”符号来连接“~”操作,例如“~keyword -keyword”。这样就能在近义词所得的结果中排除原先输入的词。在先前的例子中,要得到仅有“elderly”近义词的搜索结果,就输入“~elderly -elderly”即可。
技巧五:搜索特定的词组
当你搜索一个特定词组时,如果你只是简单地输入词组中所有的词你是无法得到最好的结果的。Google也许能够反馈出包含这个词组的结果,但它也会列出包含你所输入所有词的结果,却未必让这些词按照正确的顺序。
如果你要搜索一个特定的词组,你应该将整个词组放在一个引号内。这样就能让Google搜索规定顺序的精确的关键词。
例如,如果你要搜索“Monty Python”,你可以输入monty python作为你的搜索要求,接着你也许会获得可接受的结果;这些结果中会包含有着“monty”和“python”两个词的页面。但这些结果并不仅是包含了关于英国喜剧团体的页面,还包括了名叫Monty的蛇以及名叫Monty的家伙,他养了蛇来当宠物,还有其它一些包括了“monty”和“python”的词的页面,即使它们之间看起来似乎毫无关联。
为了将搜索结果限定在只关于Monty Python喜剧团之内,也就是你想要搜索的页面是按规定的顺序,将这两个词作为一个词组包含在内的,你就应该在输入搜索要求时输入"monty python"——确保这个词组在引号之内。这样的话,如果没有按照规定的顺序将这两个次匹配为一个精确的词组,这个页面就不会被列在搜索结果当中。
技巧六:列出相似的页面
你是否有发现过一个网页是你确实很喜欢的,又想知道是否还有与它类似的其它网页呢?不需要再疑虑地思考了;你可以使用Google的相关来寻找:这个操作算符所显示的页面会与特定的页面在某些方面是相似的。例如,如果你很喜欢InformIT上的文章,你可以通过输入“related:http://www.informit.com”来寻找类似的页面。
技巧七:通过其它的操作算符调整你的搜索
使用相关操作算符只是众多你可用来调整Google搜索结果的方法之一。所有的这些输入的操作算符都是以相同的方式工作的,将这些算符作为你搜索请求的一部分输入,再将变量紧接在这些输入的操作算符之后的冒号之后(而不是空格),就像这样:“‘操作算符’:‘变量’”。
有哪些搜索的操作算符是你可以利用的呢?以下是一个简短的清单:
| 算符 |
用途 |
用法 |
| allinanchor: |
限制搜索的词语是网页中链接内包含的关键词(可使用多个关键词) |
allinanchor:keyword1 keyword2 |
| allintext: |
限制搜索的词语是网页内文包含的关键词(可使用多个关键词) |
allintext:keyword1 keyword2 |
| allintitle: |
限制搜索的词语是网页标题中包含的关键词(可使用多个关键词) |
allintitle:keyword1 keyword2 |
| allinurl: |
限制搜索的词语是网页网址中包含的关键词(可使用多个关键词) |
inurl:keyword1 keyword2 |
| filetype: |
限制所搜索的文件一个特定的格式 |
filetype:extension |
| inanchor: |
限制搜索的词语是网页中链接内包含的关键词 |
inanchor:keyword |
| intext: |
限制搜索的词语是网页内文包含的关键词 |
intext:keyword |
| intitle: |
限制搜索的词语是网页标题中包含的关键词 |
intitle:keyword |
| inurl: |
限制搜索的网页的地址 |
inurl:keyword |
| site: |
限制所进行的搜索在指定的域名或网站内 |
site:domain |
技巧八:搜索特定的事实
如果你要搜索一些客观事实,Google也许能够帮得上忙。是的,Google总是能够反馈给你一个匹配你指定的搜索要求的清单,但只要你能够正确地描述了你的搜索要求,且接着搜索的事实是Google已经预先鉴定了额,你就能在搜索结果页面的最顶端得到你所需要的精确信息。
我们在此谈到的有哪些类型的信息呢?是一些事实性的信息,例如诞生日、诞生地、人口等等。你所需要做的就是输入你想要知道的描述事实的搜索要求。例如:
要查询圣弗朗西斯科的人口,则输入“人口 圣弗朗西斯科”。
要查询马克·吐温在哪里出生,则输入“出生地 马克吐温”。
要查询总统比尔·克林顿什么时候出生,则输入“生日 比尔克林顿”。
要查询雷蒙德·钱德勒什么时候去世,则输入“去世 雷蒙德·钱德勒”。
要查询谁是德国总统,则输入“总统 德国”。
这些问题的答案就会显示在搜索结果页面的顶部。你能够获根据关联的网站得应对你的疑问的正确答案。点击相关的链接还能从这个资源里获悉更多的东西。
技巧九:搜索Google Directory
Google在它的搜索数据库中将成千上万的网页索引化——这就能使得不会产生压倒性数量的搜索结果。量确实已经够了,但有时你也许会更愿意得到一些高质量的结果。
由于质量较数量更为重要,就可以绕过主要的Google搜索引擎而使用Google Directory来代替。Google Directory是一个网页清单相对较小的数据库,它们都是通过一个人工编辑团队手动精心挑选的。Google Directory是有被注释和组织到相关的话题类目下的。你可以通过类目来浏览网页目录,或是搜索指定的项目。
Google Directory是一个可用来搜索大量Google网页索引实用选择。Google Directory的结果比起你在更大的搜索索引范围中的搜索结果更为集中且高质,也能够帮助你在任何给定的类目下更好地认识什么是可用的信息。另外,如果你喜欢,你也可以利用浏览类目来替代搜索。
要进入Google Directory,点击Google主页上的“更多”链接,在接下来的页面中选择类别。当然,你也可以直接进入Google的Directory,只要在浏览器中输入directory.google.com即可。
技巧十:使用Google的其它专业搜索
Google Directory不仅仅是Google所提供的除了主搜索引擎之外的唯一选择。根据你所做的搜索类型,你也可以通过使用其中Google更为专业的搜索站点之一来得到更好的结果。它们包括:
Froogle可以用来搜索那些有着最低价格的特定商品的在线购物网站。
Google Answers所提供的服务是直接让你的搜索需求面向专业人员的小组,大多数都是用于当你有着更为复杂的问题,而无法通过简单的搜索来解答的时候。
Google Apple Macintosh Search主要是在apple.com域名中以及和其它与苹果相关的站点进行搜索。
Google Blog Search是用来搜索博客和博客文章的。
Google Book Search可以搜索成千上万的小说和非小说类图书的全文。
Google BSD UNIX Search可以搜索到大量专门为BSD版本的UNIX操作系统专业化的站点。
Google Groups可以搜索到Google Groups档案的相关文章。
Google Linux Search用来搜索大量与Linux相关的网站。
Google Microsoft Search可以搜索主要是microsoft.com域名中的内容以及其它微软相关的站点。
Google News可用来搜索大量有最新新闻和头条的新闻网站,也能够搜索历史的新闻资料,一直可以追溯到两个世纪之前。
Google Scholar在一个有着学术杂志、文章、报纸、论文和书籍的数据库中进行搜索,也能够选择大学或研究书库。
Google U.S. Government Search是用来搜索那些美国政府的网站——这是一个最好的用来搜索官方性政府举措、信息、报告等等的地方。
Google University Search能在一个有着超过600所大学网站的数据库中进行搜索——能够用来查询课程安排、入学资料等等。
原文作者:Michael Miller
原文标题:Ten Tips for Smarter Google Searches
原文地址:http://www.informit.com/articles/article.asp?p=675274&rl=1
编译人:雪影蓝风(IT168)
译文地址:http://publish.it168.com/2006/1213/20061213001101.shtml
广告: HelixApp流媒体防盗链(WMS IIS HELIX)

相关文章:
Google搜索技巧-入门篇 十大高明的Google搜索技巧 Google黑客搜索技术Google搜索技巧2005 Google桌面搜索使用心得 Google talk技巧十则 十四个方法提高博客的页面访问量 关于一个google搜索技巧-InUrl 百度搜索技巧
下载:

这次最新发布的Helix Server,改用了全新的命名方式,包括 Server 25,Server 100 和 Server
Unlimited。其中,Server 25 和 Server 100 为限制功能的版本,而Unlimited为全功能版本。
新版本中最关键的就是引入了两个新概念,就是TureLive 和 PlayNow,Helix 系列的产品一直以来
都有延时和缓冲时间过长的弊病。这两个新特性,其实也不能称作新特性,只能说是在原有技术上面的更
新,其效果就是降低网络缓冲时间,给用户带来更好的视频播放体验。大家知道在WM当中可以设置编码器
端的缓冲和服务器上的缓冲设置,最大程度上,可以将直播的延时降低到10秒以下,而在Hlix当中,一直
以来这两个参数都是不能设置的。现在新的服务器将可以允许设置这个缓存的数据大小,最低可以降低到
2秒。这只是书面表示的最低值,同时还要考虑到编码器和播放器的缓冲。所以在介绍中,特别说明,这
个功能需要配合V11版本的编码器和播放器来实现。其他的改进还包括有:
--更好的用户体验
这就是前面所说的TureLive 和 PlayNow 功能,将给用户带来更好的播放体验。
--改善的管理控制
新的服务器将支持SNMP V3协议,同时扩展了用户统计和用户连接清理,大家以前经常遇到的无效死
链接问题应该会得到一些改善。
--利用带宽的极限
对网络带宽的兼容性一直是Helix称道的一个优点,在新版本中,这项特性将会被继续发扬和改进。
--改善防火墙支持
针对网络设备的不断推出,Helix 提供了对更多样化的防火墙的支持。
--支持更多平台、协议、格式
这个就不用多说了,新的Unlimited版本将提供对 RealAudio, RealVideo, Windows Media,
QuickTime , MP3, MPEG-4, 3GPP* (H.263 and H.264) 等多种媒体格式的支持,同时还兼容多种协议。
--支持下一代网络
新版本的软件已经准备好对IPV4和IPV6网络以及混合网络的支持
[原作]流媒体网编辑部
A
AAC――
AAC的全名为Advanced Audio Coding,其意为高阶音讯编码,是国际标准组织(ISO)订的音讯标准格式,也是MPEG规格的一部分。AAC是i-mode 所指定的音档格式,相对于MP3格式,AAC在原音质量和压缩效率上有绝对的优势。AAC作为MPEG 4与3GPP的核心规格,也是MPEG规格的一部分。AAC可以真实呈现立体声的高质量原音、更逼近CD音质,且能够达到很高的压缩率,可帮助减少许多储存空间,档案也远比MP3格式来得小。

AVS――
AVS(AdvancedAudio-VideoCoding/DecodingStandard)是数字音视频编解码技术标准的英文简称。AVS标准包括系统、视频、音频、数字版权管理等四个主要技术标准和一致性测试等支撑标准。其核心是把数字视频和音频数据压缩为原来的几十分之一甚至百分之一以下,试图解决数字音视频海量数据的编码压缩问题,故也称数字音视频编解码技术。它是数字信息传输、存储、播放等环节的前提,故此AVS成为了数字音视频产业的共性基础标准。
C
Cam――
cam又叫homecam或者webcam,指的是可以安装在计算机上的网络摄像头。通过摄像头,可以实时传递动态影响。用户可以通过摄像头播放视频或者实况转播一些图像。利用摄像头进行视频转播的网站通常利用java applet程序启动视频直播。目前有很多网站都提供视频直播。起初这种视频直播主要用来工业监控或者保安。目前的视频网站都提供色情视频的直播。总之,利用摄像头可以更加方便的促进电脑用户之间的交流,拉近了他们之间的距离。
CDN――
网络加速器CDN的全称是Content Delivery Network,即内容分发网络。它的原理是通过将网站的内容发布到最接近用户的cache(缓存)服务器内,使大部分客户就近访问cache服务器取得所需的内容,解决Internet网络拥塞状况,提高用户访问网站的响应速度,如同提供了多个分布在各地的克隆站点一般.
D
DSP芯片――
DSP芯片,也称数字信号处理器,是一种具有特殊结构的微处理器。DSP芯片的内部采用程序和数据分开的哈佛结构,具有专门的硬件乘法器,广泛采用流水线操作,提供特殊的DSP 指令,可以用来快速地实现各种数字信号处理算法。根据数字信号处理的要求,DSP芯片一般具有如下的一些主要特点:
(1) 在一个指令周期内可完成一次乘法和一次加法。
(2) 程序和数据空间分开,可以同时访问指令和数据。
(3) 片内具有快速RAM,通常可通过独立的数据总线在两块中同时访问。
(4) 具有低开销或无开销循环及跳转的硬件支持。
(5) 快速的中断处理和硬件I/O支持。
DLNA标准工作组――
DLNA成立于2003年6月24日,其前身是DHWG,目前全球有超过700家企业加盟,其核心成员是索尼、佳能、三星、LG、TCL(Thomson)、诺基亚、松下、西门子、IBM、惠普、英特尔等19家公司,中国的成员包括方正、联想、海信、同方、华为等公司。
该组织旨在建立一个基于开放的工业标准的互操作平台,并将确立技术设计规则,供企业开发数字家庭有关的产品。其工作目标是根据开放工业标准制定媒体格式,传输和协议互操作性的指南和规范,和其他工业标准化组织进行联络,提供互操作性测试,并进行数字家庭市场计划的制定和实施。
DRM――
DRM:Digital Right Management。一般翻译为数字版权保护,但很多专家认为译为“数字权益保护”更为恰当。
DRM技术通过加密数字内容和附加信息来判断用户是否有权使用该内容,以确保内容只对那些已经获得授权的用户开放使用。DRM的基本原则是简单、灵活、开放。
DRM将来最大的挑战在于互操作性上。
F
复合视频――
复合视频,也叫做基带视频或RCA视频,是全国电视系统委员会(National Television Standards Committee,NTSC)电视信号的传统图像数据传输方法,它以模拟波形来传输数据。复合视频包含色差(色调和饱和度)和亮度(光亮)信息,并将它们同步在消隐脉冲中,用同一信号传输。
在快速扫描的NTSC电视中,甚高频(VHF)或超高频(UHF)载波是复合视频所使用的调整振幅,这使产生的信号大约有6MHz宽。一些闭路电视系统使用同轴电缆近距离传输复合视频,一些DVD播放器和视频磁带录像机(VCR)通过拾音插座提供复合视频输入和输出,这个插座也叫做RCA连接器。
复合视频中,色差和亮度信息的干涉是不可避免的,特别是在信号微弱的时候。这就是为何远距离的使用VHF或UHF的NTFS电视台用老旧的鞭形天线,“兔子耳朵”,或世外的“空中”经常包含假的或上下摇动的颜色。
H
H.264――
1995年,ITU-T的Video Coding Experts Group(VCEG)在完成了H.263后,设定了两个新的目标:一个短期目标是在H.263上添加一些新的特性(结果形成了H.263 version 2),另一个长期的目标是开发一个新的低码率的标准。在这个长期目标上努力的结果是产生了H.26L草案。H.26L比H.263提供了更好的视频压缩效果。
2001 年,ISO的Motion Picture Experts Group(MPEG)看到了H.26L的先进性,成立了Joint Video Tream(JVT),包括了MPEG和VCEG的专家们。JVT的主要任务是把H.26L草案发展成为一个完整的标准。结果就是两个完全相同的标准: ISO MPEG4 Part 10和ITU-T H.264,它的官方名称是Advanced Video Coding(AVC)。(译自vcodex的Overview of H.264)
VSS H.264 Codec 有免费下载,是符合dshow结构的filter,自称速度很快。
H.264/AVC Software Coordination 有源码,有编码器、解码器
Sentivision H.264 Decoder 好像是小日本的公司。在TI的DM642 DSP上实现了H.264的解码器,并以此为基础实现了基于Linux的STB。这个STB还支持WMV9和MPEG4 SP/ASP。这里还有个H.264和MPEG4的比较。
Moonlight 有H.264 player、encoder、sdk
H.26L――
开发视频编码标准的正式组织有两个,其一是ITU-T,其二是ISO/IEC JTC1。ITU-T视频编码标准被称作建议,以H.26X的形式表示(例如,H.261、H.262、H.263和H.26L)。ISO/IEC标准则以MPEG-x的形式表示(例如,MPEG-1、MPEG-2和MPEG-4)。
ITU-T建议是为视频会议和视频电话等实时视频通信应用设计的,而MPEG标准主要则是为视频存储(DVD)、广播视频(广播TV)以及视频流(例如,网上视频、DSL上的视频以及无线视频应用)设计的。这两个标准委员会通常都独立工作,唯一的例外就是二者合作开发了H.262/MPEG-2标准。
开发H.26L项目的目的,是为了通过采用“Back-To-Basics”方法,开发出一种基于通用模块的,简单直接的高性能视频编码标准。H.26L标准的开发工作是由ITU-T视频编码专家组(VCEG)发起的,开始于1997年。从性能的角度而言,H.26L超越了现有的所有视频编码标准。到2001年年底,他们发现,基于H.26L的软件所能提供的视频质量,就是现有的最好的基于MPEG-4的软件也无法与之媲美。于是,ISO/IEC MPEG与ITU-T VCEG结合起来组成了一个联合视频开发组(JVT),接管了H.26L项目。JVT希望建立一个唯一的视频编码标准,同时使其成为MPEG-4标准家族和ITU-T建议家族的新成员(比如,成为MPEG-4中的第10部分或ITU-T中的H.264)。
J
基带视频信号――
复合视频信号也称为基带视频信号或RCA视频信号,它使用NTSC电视信号传送图像数据。复合视频信号包含色度(色彩和饱和度)和亮度信息,并与声画同步信息、消隐信号脉冲一起组成单信号。在快速扫描NTSC电视中,高频(VHF)和超高频(UHF)载波通过复合视频信号进行振幅调制。这会产生一个6MHZ带宽的信号。某些闭路电视系统在短距同轴电缆中传输复合视频信号。有些DVD播放器和盒式磁带录像机(VCR),通过屏蔽电缆插座,即RCA连接器,调节复合视频信号的输入和输出。在复合视频信号中,色度和亮度之间的信号干扰是不可避免的,信号越弱干扰越严重。
JVT――
英文全称是Joint Video Team,视频联合工作组。2001年12月在泰国Pattaya成立。它由ITU-T和ISO两个国际标准化组织的有关视频编码的专家联合组成。JVT的工作目标是制定一个新的视频编码标准,以实现视频的高压缩比、高图像质量、良好的网络适应性等目标。目前JVT的工作已被ITU-T接纳,新的视频压缩编码标准称为H.264标准,该标准也被ISO接纳,称为AVC(Advanced Video Coding)标准,是MPEG-4的第10部分。
注:本技术辞典不断更新之中,更多信息敬请关注流媒体网http://www.lmtw.com/,同时欢迎各位读者加入到技术辞典的编撰之中。有意者请发email至:rinoa@lmtw.com
简述:防范DDOS攻击 不一定要求服务器有防火墙 一点建议
防范DDOS攻击并不一定非要用防火墙,首先可以尝试一下通过对服务器进行安全设置来防范DDOS攻击。如果通过对服务器设置不能有效解决,那么就可以考虑购买抗DDOS防火墙了。 其实从操作系统角度来说,本身就藏有很多的功?
请注意,以下的安全设置均通过注册表进行修改,该设置的性能取决于服务器的配置,尤其是CPU的处理能力。如按照如下进行安全设置,采用双路至强2.4G的服务器配置,经过测试,可承受大约1万个包的攻击量。
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
'关闭无效网关的检查。当服务器设置了多个网关,这样在网络不通畅的时候系统会尝试连接
'第二个网关,通过关闭它可以优化网络。
"EnableDeadGWDetect"=dword:00000000
'禁止响应ICMP重定向报文。此类报文有可能用以攻击,所以系统应该拒绝接受ICMP重定向报文。
"EnableICMPRedirects"=dword:00000000
'不允许释放NETBIOS名。当攻击者发出查询服务器NETBIOS名的请求时,可以使服务器禁止响应。
'注意系统必须安装SP2以上
"NoNameReleaseOnDemand"=dword:00000001
'发送验证保持活动数据包。该选项决定TCP间隔多少时间来确定当前连接还处于连接状态,
'不设该值,则系统每隔2小时对TCP是否有闲置连接进行检查,这里设置时间为5分钟。
"KeepAliveTime"=dword:000493e0
'禁止进行最大包长度路径检测。该项值为1时,将自动检测出可以传输的数据包的大小,
'可以用来提高传输效率,如出现故障或安全起见,设项值为0,表示使用固定MTU值576bytes。
"EnablePMTUDiscovery"=dword:00000000
'启动syn攻击保护。缺省项值为0,表示不开启攻击保护,项值为1和2表示启动syn攻击保护,设成2之后
'安全级别更高,对何种状况下认为是攻击,则需要根据下面的TcpMaxHalfOpen和TcpMaxHalfOpenRetried值
'设定的条件来触发启动了。这里需要注意的是,NT4.0必须设为1,设为2后在某种特殊数据包下会导致系统重启。
"SynAttackProtect"=dword:00000002
'同时允许打开的半连接数量。所谓半连接,表示未完整建立的TCP会话,用netstat命令可以看到呈SYN_RCVD状态
'的就是。这里使用微软建议值,服务器设为100,高级服务器设为500。建议可以设稍微小一点。
"TcpMaxHalfOpen"=dword:00000064
'判断是否存在攻击的触发点。这里使用微软建议值,服务器为80,高级服务器为400。
"TcpMaxHalfOpenRetried"=dword:00000050
'设置等待SYN-ACK时间。缺省项值为3,缺省这一过程消耗时间45秒。项值为2,消耗时间为21秒。
'项值为1,消耗时间为9秒。最低可以设为0,表示不等待,消耗时间为3秒。这个值可以菰馐芄セ鞴婺P薷摹?BR>'微软站点安全推荐为2。
"TcpMaxConnectResponseRetransmissions"=dword:00000001
'设置TCP重传单个数据段的次数。缺省项值为5,缺省这一过程消耗时间240秒。微软站点安全推荐为3。
"TcpMaxDataRetransmissions"=dword:00000003
'设置syn攻击保护的临界点。当可用的backlog变为0时,此参数用于控制syn攻击保护的开启,微软站点安全推荐为5。
"TCPMaxPortsExhausted"=dword:00000005
'禁止IP源路由。缺省项值为1,表示不转发源路由包,项值设为0,表示全部转发,设置为2,表示丢弃所有接受的
'源路由包,微软站点安全推荐为2。
"DisableIPSourceRouting"=dword:0000002
'限制处于TIME_WAIT状态的最长时间。缺省为240秒,最低为30秒,最高为300秒。建议设为30秒。
"TcpTimedWaitDelay"=dword:0000001e
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters]
'增大NetBT的连接块增加幅度。缺省为3,范围1-20,数值越大在连接越多时提升性能。每个连接块消耗87个字节。
"BacklogIncrement"=dword:00000003
'最大NetBT的连接快的数目。范围1-40000,这里设置为1000,数值越大在连接越多时允许更多连接。
"MaxConnBackLog"=dword:000003e8
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Afd\Parameters]
'配置激活动态Backlog。对于网络繁忙或者易遭受SYN攻击的系统,建议设置为1,表示允许动态Backlog。
"EnableDynamicBacklog"=dword:00000001
'配置最小动态Backlog。默认项值为0,表示动态Backlog分配的自由连接的最小数目。当自由连接数目
'低于此数目时,将自动的分配自由连接。默认值为0,对于网络繁忙或者易遭受SYN攻击的系统,建议设置为20。
"MinimumDynamicBacklog"=dword:00000014
'最大动态Backlog。表示定义最大"准"连接的数目,主要看内存大小,理论每32M内存最大可以
'增加5000个,这里设为20000。
"MaximumDynamicBacklog"=dword:00002e20
'每次增加的自由连接数据。默认项值为5,表示定义每次增加的自由连接数目。对于网络繁忙或者易遭受SYN攻击
'的系统,建议设置为10。
"DynamicBacklogGrowthDelta"=dword:0000000a
以下部分需要根据实际情况手动修改
'-------------------------------------------------------------------------------------------------
'[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
'启用网卡上的安全过滤
'"EnableSecurityFilters"=dword:00000001
'
'同时打开的TCP连接数,这里可以根据情况进行控制。
'"TcpNumConnections"=
'
'该参数控制 TCP 报头表的大小限制。在有大量 RAM 的机器上,增加该设置可以提高 SYN 攻击期间的响应性能。
'"TcpMaxSendFree"=
'
'[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{自己的网卡接口}]
'禁止路由发现功能。ICMP路由通告报文可以被用来增加路由表纪录,可以导致攻击,所以禁止路由发现。
"PerformRouterDiscovery "=dword:00000000