2008年10月20日星期一

如何在Vista上安装.NET 1.1

Windows Vista comes packaged with Microsoft .NET Framework 2.0 and 3.0, but not version .NET 1.1, which may still required by some applications such as QuickBooks 7, GFI Report Packs, VS.NET 2003, InstallShield 11.5, and many other developed software.

However, when trying to install Microsoft .NET Framework 1.1 (dotnetfx.exe) on Windows Vista, one or more error messages similar to one of the following text will appear, and stop or prevent setup installation of .NET Framework 1.1 from continuing successfully.

  • RegSvcs.exe - Common Language Runtime Debugging Services
    Application has generated an exception that could not be handled.Process id=0xe50 (3664), Thread id=0xd44 (3396).
    Click OK to terminate the application.Click CANCEL to debug the application.
    If user click “OK’, the installation of .NET 1.1 will be cancelled, while clicking “CANCEL” produces another error message similar to below:
  • RegSvcs.exe - No debugger found
    Registered JIT debugger is not available. An attempt to launch a JIT debugger with the following command resulted in an error code of 0×2 (s). Please check computer settings.
    cardbg.exe !a 9×8e

In Even Viewer of Vista, the following log or similar can be seen:

  • Source: MsiInstallerEvent ID: 1030Description:Product: Microsoft .NET Framework 1.1. The application tried to install a more recent version of the protected Windows file C:\Windows\Microsoft.NET\Framework\sbs_wminet_utils.dll. You may need to update your operating system for this application to work correctly. (Package Version: 1.0.0.0, Operating System Protected Version: 1.0.0.0).
  • Source: MsiInstallerEvent ID: 1030Description:Product: Microsoft .NET Framework 1.1. The application tried to install a more recent version of the protected Windows file C:\Windows\Microsoft.NET\Framework\sbs_system.enterpriseservices.dll. You may need to update your operating system for this application to work correctly. (Package Version: 1.0.0.0, Operating System Protected Version: 1.0.0.0).
The error pops up in the end of .NET Framework 1.1 setup when it’s almost finished, and is registering “System.EnterpriseServices.dll” when the error occurs, time remaining for the installatin process shows 0 seconds.


Why exactly the error occurs when installing Microsoft .NET Framework 1.1 in Windows Vista is not known, as the issue happens randomly. It may affect both 32-bit and 64-bit Vista system, but not all system will have the issue. But one thing is for sure. Microsoft .NET Framework 1.1 SP1 (Service Pack 1) has resolved the issue. However, Microsoft does not provide download to standalone .NET Framework 1.1 installer that integrated with SP1.

Thus, the workaround to fix the Microsoft.NET Framework 1.1. installation error on Vista is to slipstream .NET Framework 1.1 SP1 into .NET Framework 1.1 installer, so that both the .NET Framework and the Service Pack can be installed at the same time.

To slipstream .NET 1.1 SP1 into .NET Framework setup package to have a integrated .NET Framework 1.1 SP1 installer, follow steps in this trick:

1. Create a new folder named DotNet in C:\ drive (C:\DotNet is used in this guide, you can change to any folder you prefer, but ensure that you use correct path in the following steps).
2. Download Microsoft .NET Framework 1.1 Redistributable Package (dotnetfx.exe). Make sure the setup file is saved as dotnetfx.exe.
3. Download Microsoft .NET Framework 1.1 Service Pack 1 (NDP1.1sp1-KB867460-X86.exe). Make sure that the file is renamed and saved as dotnetfxsp1.exe, so that the rest of the steps can be followed easily.
4. Move both installation files into the same directory (i.e. C:\DotNet), if you’re not saving them together.
5. Open command prompt as Administrator.
6. Change to the directory where the two installation setup files for .NET 1.1 are saved (i.e. C:\DotNet).

7. Run the following commands one by one, press Enter after each one.

dotnetfx.exe /c:"msiexec.exe /a netfx.msi TARGETDIR=C:\DotNet"
If you’re not using C:\DotNet directory, change the target to your path accordingly.
Then click on “Yes” when prompted to answer “would you like to install Microsoft .NET Framework 1.1. Package?”
Wait for the uncompression, extraction and setup to complete with the display of the following dialog which says installation complete.

dotnetfxsp1.exe /Xp:C:\DotNet\netfxsp.msp
No status message for this step.

msiexec.exe /a c:\DotNet\netfx.msi /p c:\DotNet\netfxsp.msp
Wait for Windows Installer for Microsoft .NET Framework 1.1 to finish and disappear automatically.

Install Microsoft .Net Framework 1.1 with slipstreamed/integrated Service Pack 1 by running netfx.msi created in the working folder.
netfix.msi

现在用Vista安装了VS2003后出现了一个严重的问题,使用Find In Files功能时, VS2003会停止响应。上网找相关信息,有人已经报告这个问题了。不过MS说不管VS2003了。

后来发现了另外一台VISTA的电脑不存在这个问题,一对比原来是Windows Themes的问题。只要把Windows外观,改成比较难看的标准模式(就像WIN2000那样...)就能把问题解决掉了。

用Microsoft Cluster实现服务器群集

  大网站每天承受上千万的访问量,而服务器却依然能够应付自如;网络空间服务商所提供的大量空间,而却收费低廉,的确这些情况有点让人难以理解,难道天下真的有性能如此之高的服务器单机?其实则不然,支持这些大量访问和无数数据请求的是服务器群集。
  服务器群集是由一组各自独立的服务器连接而成,利用硬件和软件合理分配网络负荷,达到提高整体服务性能的服务器的集合。
  那么如何架设服务器群集呢?其过程并不复杂,利用Windows2000高级服务器版所提供的实用功能,可以轻松地完成群集服务器的架设。

  预备知识
  Windows Cluster
  Windows高级服务器版中提供的负载平衡工具,可以为服务器群集中的服务器合理分配任务,并避免因某一台服务器出现问题而导致的服务失败。
  心跳网线
  用于连接服务器群集中两大服务器间的网线,一般在服务器群集中的服务器都配有两块网卡,其中一块专门用于两台服务器(节点)间的通讯,来检测各自的运行状态,一旦某一节点没有了响应则证明该服务器出现了故障,这种侦测的过程被称作“心跳”。
  磁盘阵列
  由一组硬盘组成的磁盘集合,支持热插拔,一般使用SCSI的连接模式,磁盘阵列大多安装在专用的磁盘阵列柜中。
  PERC 2/DC CARD是用于连接存储外围设备的硬件,它内置了可读写的ROM存储器,可以根据用户的需要进行出厂后的二次设置,PERC 2/DC CARD多使用在服务器群集中,用于连接磁盘阵列。

  方案实施1:服务器基本配置
  接下来开始配置服务器:
  1. 给服务器1和服务器2连接网线,其中在两块Realtek Pci Ethernet 10M网卡间连接心跳网线,将Intel Pro 100+ Network Card连接到集线器或交换机上。
  2. 为服务器1安装Windows2000高级服务器版。
  3. 启动服务器1,分别配置服务器上的两块网卡,其中连接心跳网线的使用内部网内的保留IP地址(如:192.168.0.1),另一块网卡使用服务器对外的IP地址。同时把服务器1设置为域控制器。
  4. 为服务器2安装Windows2000高级服务器版,并将服务器2加入到先前服务器1所设置的域中,同样将服务器2的两块网卡分别设置不同的IP地址,注意两台服务器均需要使用同类型的网卡,并且网卡要配置同类的IP地址(例如均为C类地址)。
  在完成以上步骤后,服务器的软硬件设置就基本上完毕了。但是接下来才是群集服务配置中最关键的步骤——配置Windows Cluster!

  方案实施2:配置Windows Cluster
  配置两台服务器的SCSI磁盘
  启动服务器1,但不启动服务器2。如果在服务器群集中使用了外置磁盘阵列,则需要在Windows2000中根据型号的不同升级PERC 2/DC的驱动程序。在使用了RAID磁盘阵列的情况下,用户还必须根据所使用的PERC 2/DC CARD的情况配置它,其配置过程与BIOS的配置有些类似,主要涉及到系统跳线方式、中断模式等参数,它能够与Windows2000高级服务器版的均衡负载服务协同工作。
  进入管理工具中的计算机管理,选择其中的磁盘管理,在这里会显示当前所有使用的磁盘。一般情况下,在首次使用磁盘管理时会显示签名和升级磁盘向导,该向导主要用于提高访问磁盘的安全性。
  服务器群集中的磁盘在进行读写时磁盘必须处于基本状态,用户可以用右键快捷菜单来更改磁盘的状态。
  接下来配置服务器内置的SCSI磁盘,右键单击第一个磁盘,选择创建磁盘。
  确认主分区被选择,并且已启动使用最大磁盘空间选项,为第一个磁盘分配盘符,一般是倒序排列,即第一个磁盘使用盘符Z。
  确认当前磁盘使用NTFS格式,完成配置向导,第一块磁盘开始格式化,重复以上步骤即可完成对多个SCSI磁盘的配置。按照以上步骤也配置服务器2的全部SCSI磁盘,注意服务器2的SCSI磁盘所使用的盘符应与服务器1的不同。
  关闭服务器2,重新启动服务器1,进入计算机管理中的磁盘管理,可以看到除了刚才配置的磁盘,又多出了一些磁盘,根据它们的顺序,分别使用服务器2的盘符更改它们的驱动器名称和路径。关闭服务器1,启动服务器2,并重复上面的步骤,就可以完成两台服务器的SCSI磁盘共享了。在大多数小型机或服务器中,对于SCSI磁盘都提供了主机断电后的多路电源支持,所以在个别服务器断电后,其所使用的SCSI磁盘仍可以被服务器群集中的其他服务器访问到。

  方案实施3:配置服务器的群集服务
  需要注意,两台服务器都必须配置群集服务,才能保证系统的均衡负载,群集服务可以通过安装完成Windows2000高级服务器版后,第一次启动系统REBOOT时弹出的窗口完成的,在配置服务器群集服务时需要保持两台服务器同时启动。
  1.配置服务器1的群集服务
  在启动服务器时,会弹出安装完成的对话框,用户也可以通过管理工具中的配置服务器的安装来完成打开这个窗口。
  在弹出的窗口中,单击“配置”,窗口中会出现一些有关配置服务器的说明,单击“下一步”即可。
  在选择安装节点名称时,为服务器1选择第一个节点。
  输入本服务器群集的名称,在这里一般使用同域相同的名称,例如输入“POPUNET”。
  为域账户设置用户名和密码,这个域与先前设置的域相类似,但添加了管理服务器群集的功能,为了方便起见,一般使用与域控制器相同的用户名和密码。
  点击“下一步”可以进入共享磁盘窗口,可以看到先前设置过的共享磁盘。
  单击“下一步”,选择群集文件存储的目录,注意这些文件要存储在共享磁盘中,一般选择首磁盘Z。
  单击“下一步”,将INTEL PRO 100+ NETWORK CARD网卡配置为连接外部网络,将Realtek PCI Ethernet 10M网卡配置为连接内部网群集。
  在这一步中要为服务器群集配置一个IP地址,注意这个IP地址就是该群集在互联网上的地址,同时将服务器群集的子网掩码设置为255.255.255.0,单击完成,至此即完成了对服务器1的群集配置。
  2.配置服务器2的群集服务。
  服务器2的群集服务配置与服务器1的配置大体相同,这里主要指出它们的不同之处。
  在选择安装节点名称时,使用第二个或者下一个节点。
  服务器2的群集名称应与服务器一所设置的群集名称相同,否则会出现共享磁盘不能互相访问的情况。
  设置域账户时也要使用与服务器1相同的设置。
  到这里,服务器群集的安装就已经基本完成了,接下来就可以根据服务器在网络中发挥的具体功能,分别配置服务器的其他服务了。注意在服务器群集中的服务器在配置其他诸如:WEB、SMTP、NNTP等服务时必须使用相同的设置,不然的话服务器的工作是非常不稳定的。
  方案校验:服务器群集的测试
  如果要检验该方案实施的可行性,可以用非域控制器的服务器中的“群集管理”功能。
  进入“群集管理”界面可以看到当前群集服务器中的全部服务器,其中处于被访问状态的服务器会显示为一个绿色的“UP”字样,分别点击各个服务器,可以对它们的群集服务属性进行设置。同时用户使用群集内的任意一台服务器都可以浏览所有共享磁盘(如图5),关闭任意一台服务器或多台服务器后,再使用其他计算机访问该服务器群集,仍然可以正常访问。证明方案实施成功!

  注意事项
  1.实现服务器群集至少需要两台计算机,分别作为主、从服务器。
  2. 从服务器的硬盘大小必须能够镜像主服务器上所有必要的分区。Windows2000不支持跨越不同硬盘的分区并镜像,所以不能将一个硬盘上的分区镜像到两个较小容量的硬盘上。
  3.至少需要两块用作专用数据链路的Intel PRO/100B网卡。
  4. 专用数据连线(心跳线)可以用五类或超五类双绞线制作。
  5. 专用数据连线的制作方法是将1和2、3和6反接(网卡之间互联时,连接线均为此接法)。
  6. 最好定期备份数据,以防万一。

  服务器群集工作原理
  实施负载平衡的服务器群集中,处理请求被分布于各服务器。负载平衡群集中的各个不同的服务器分担处理负载,但不共享磁盘阵列或内存等资源。如果其中一个服务器发生故障,处理负载可以被简单地重新分布于群集中幸存的各个节点。

2008年10月13日星期一

经济实用型 HTPC 配置

随着IT技术的进步,人们对娱乐要求已经越来越高,追求的是便捷,追求的是在家里就能享受到高品质的娱乐生活。随着数字家庭理念的逐步深入,高清、无线、多媒体功能等元素都被放入高品质娱乐生活当中。HTPC作为电脑与现代家电结合的典型代表,已经逐渐成为人们实现数字家庭理念的一个重要途径。

今年7月份,自己DIY了一台性价比相当高的HTPC。DIY的目标非常明确,这台HTPC就是放在客厅里连接46吋的三星液晶平板电视,主要用于从网上下载电影和电视剧,以及播放照片等。

主要在主板、机箱、无线键盘的选择上费了点心思。选用了具备H.264高清硬解码能力的AMD主板以及板载ATI显卡,这是AMD收购ATI之后推出的一款相当不错的整合主板。该主板提供了全面丰富的接口,包括VGA,DVI和HDMI,SPDIF光纤接口,USB2.0,IEEE1394和E-SATA等。考虑到大量下载和存储的需要,配置了600GB的大硬盘。只配置了2GB的内存,因为对于普通的多媒体应用来说,这也基本够用了。

外设稍微奢侈了一点,用了罗技的掌上型蓝牙小键盘diNovo Mini,外观非常的小巧漂亮,价格却不菲。

以下是具体的配置,以及当时的淘宝网订购价格。

主机:
CPU:AMD5000+ ¥480
主板:技嘉/GA-MA78GPM-DS2H/板载128M显存 ¥700
硬盘:西部数据/640G/3.5寸/7200转/16M/SATA ¥680
内存:金士顿DDR2 800 2G ¥280
光驱:三星DVD刻录机 ¥230
HTPC电脑机箱(美国NMEDIA原版HTPC100)+读卡器+足瓦300W电源 ¥333
= ¥2703

外设:
罗技diNovo Mini充电式蓝牙键盘 ¥1100
全新微软原装 MCE夜光版遥控器 ¥88

最新报价(徐家汇):
CPU:AMD5000+ 370
主板:技嘉/GA-MA78GPM-DS2H/板载128M显存 635
硬盘:320G/3.5寸/7200转/16M/SATA 375
内存:金士顿DDR2 800 2G 190
光驱:三星DVD刻录机 195
键盘:罗技光电套装 150
 

2008年10月6日星期一

Subversion快速指南

备忘参考。

本文是使用Subversion最快速的说明,在最短的时间里帮助您建立起一套可用的服务器环境,只需略加调整就可以应用到实际项目当中。

本说明分为以下几个部分。为了说明简单,教程是在windows下使用的方式,以方便资源有限的项目使用,对于UNIX环境下,区别并不大。

  • 软件下载
  • 服务器和客户端安装
  • 建立版本库(Repository)
  • 配置用户和权限
  • 运行服务器
  • 初始化导入
  • 基本客户端操作
1,软件下载
下载Subversion服务器程序。
最新Windows版本 : http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91

下载Subversion的Windows客户端TortoiseSVN。
Windows常用客户端TortoiseSVN:http://tortoisesvn.net/downloads

TortoiseSVN是扩展Windows Shell的一套工具,可以看作Windows资源管理器的插件,安装之后Windows就可以识别Subversion的工作目录。

2,服务器和客户端安装

服务器安装,直接运行安装程序 ,根据提示安装即可,这样我们就有了一套服务器可以运行的环境。

安装TortoiseSVN,同样直接运行安装程序,按照提示安装即可,不过最后完成后会提示是否重启,其实重启只是使svn工作拷贝在windows中的特殊样式生效,与所有的实际功能无关,这里为了立刻看到好的效果,还是重新启动机器。

3,建立版本库(Repository)

运行Subversion服务器需要首先要建立一个版本库(Repository),可以看作服务器上存放数据的数据库,在安装了Subversion服务器之后,可以直接运行,如:
svnadmin create E:\svndemo\repository

就会在目录E:\svndemo\repository下创建一个版本库。

我们也可以使用TortoiseSVN图形化的完成这一步:
在目录E:\svndemo\repository下"右键->TortoiseSVN->Create Repository here...“, 然后可以选择版本库模式, 这里使用默认即可, 然后就创建了一系列目录和文件。

4,配置用户和权限

来到E:\svndemo\repository\conf目录,修改svnserve.conf:
# [general]
# password-db = passwd
改为:
[general]
password-db = passwd 然后修改同目录的passwd文件,去掉下面三行的注释:
# [users]
# harry = harryssecret
# sally = sallyssecret
最后变成:
[users]
harry = harryssecret
sally = sallyssecret
前面是用户名,后面是口令。这样在通过svn://或者http://访问时,会要求输入正确的用户名和口令才能允许访问。

5,运行服务器

svn独立服务器:

在任意目录下运行:
svnserve -d -r E:\svndemo\repository 我们的服务器程序就已经启动了。注意不要关闭命令行窗口,关闭窗口也会把svnserve停止。

把windows的console程序变成service并不是很难的事情。有个叫做svnservice.exe的程序,将其放到svnserve.exe的同一目录下,运行 svnservice -install -d -r path/to/repo,即可在windows的service管理器中注册服务。

svnserve运行之后,即可从网络上通过 svn://host/*** 对该服务进行访问。

1.4以上的svn也可以通过sc.exe来创建windows服务记录:

安装服务
sc create subversion_service binpath= "c:\subversion\bin\svnserve.exe --service -r c:\svn_test\repos" displayname= "Subversion Repository" depend= Tcpip

删除服务
sc delete subversion_service

apache svn服务器:

在svn的安装目录下有 mod_*_svn.so 和 README.txt,这是Apache modules以及相关说明,将其复制到apache的modules目录下,并修改 httpd.conf,如下。

3a. Uncomment the following two lines:
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_module modules/mod_dav.so

3b. Add the following two lines to the end of the LoadModule section:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

3c. Add the following to end of the file.
<Location>
DAV svn
SVNPath your/repository/path
</Location>

重新启动Apache服务进程,即可通过 http://host/svn/*** 对 SVN 进行访问。这对于通过互联网进行远程访问无疑是极其方便的。

注:可能需要重新启动机器,以便 svn 安装程序加入到 system path 中的路径生效,使得 svn 的 dll 对 apache service 进程可见,否则 apache httpd 启动时,可能会报告找不到某些 dll 的错误信息。

另外,在我安装该服务时,用的是 appserv,这是个包含 apache, php, mysql, perl 的快速安装包,其中的 apache 版本是 2.2.8,而 svn 1.5.2 中的 mod_*_svn.so 是在 apache 2.2.9 中编译的。因此存在版本兼容的问题。我从 http://httpd.apache.org/下载了 apache_2.2.9-win32-x86-openssl-0.9.8h-r2.msi,将其中的 bin 和 modules 直接覆盖到 appserv 下的 Apache 目录中,可以直接使用。

6,初始化导入

来到我们想要导入的项目根目录,在这个例子里是E:\svndemo\initproject,目录下有一个readme.txt文件:

右键->TortoiseSVN->Import...
URL of repository输入“svn://localhost/”
ok
完成之后目录没有任何变化,如果没有报错,数据就已经全部导入到了我们刚才定义的版本库中。

需要注意的是,这一步操作可以完全在另一台安装了TortoiseSVN的主机上进行。例如运行svnserve的主机的IP是133.96.121.22,则URL部分输入的内容就是“svn://133.96.121.22/”。

7,基本客户端操作

取出版本库到一个工作拷贝:
来到任意空目录下,在本例中是E:\svndemo\wc1,运行右键->Checkout,在URL of repository中输入svn://localhost/,这样我们就得到了一份工作拷贝。
在工作拷贝中作出修改并提交:
打开readme.txt,作出修改,然后右键->Commit...,这样我们就把修改提交到了版本库,我们可以运行。

察看所作的修改:
readme.txt上右键->TortoiseSVN->Show Log,这样我们就可以看到我们对这个文件所有的提交。在版本1上右键->Compare with working copy,我们可以比较工作拷贝的文件和版本1的区别。

更多的内容可以参考 Subversion 中文站
http://www.subversion.org.cn/?action-viewnews-itemid-1

2008年9月24日星期三

视频YUV格式详解

概述
  YUV(亦称YCrCb)是被欧洲电视系统所采用的一种颜色编码方法(属于PAL),是PAL和SECAM模拟彩色电视制式采用的颜色空间。其中的Y,U,V几个字母不是英文单词的组合词,Y代表亮度,uv代表色差,u和v是构成彩色的两个分量。在现代彩色电视系统中,通常采用三管彩色摄影机或彩色CCD摄影机进行取像,然后把取得的彩色图像信号经分色、分别放大校正后得到RGB,再经过矩阵变换电路得到亮度信号Y和两个色差信号R-Y(即U)、B-Y(即V),最后发送端将亮度和色差三个信号分别进行编码,用同一信道发送出去。这种色彩的表示方法就是所谓的YUV色彩空间表示。采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有 Y信号分量而没有U、V信号分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的相容问题,使黑白电视机也能接收彩色电视信号。
优点作用
  YUV主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和CB来表示。其中,Cr反映了GB输入信号红色部分与RGB信号亮度值之间的差异。而CB反映的是RGB输入信号蓝色部分与RGB信号亮度值之同的差异。
  采用YUV色彩空间的重要性是它的亮度信号Y和色度信号U、V是分离的。如果只有Y信号分量而没有U、V分量,那么这样表示的图像就是黑白灰度图像。彩色电视采用YUV空间正是为了用亮度信号Y解决彩色电视机与黑白电视机的兼容问题,使黑白电视机也能接收彩色电视信号。
  YUV与RGB相互转换的公式如下(RGB取值范围均为0-255):
  Y = 0.299R + 0.587G + 0.114B
  U = -0.147R - 0.289G + 0.436B
  V = 0.615R - 0.515G - 0.100B
  R = Y + 1.14V
  G = Y - 0.39U - 0.58V
  B = Y + 2.03U
  在DirectShow中,常见的RGB格式有RGB1、RGB4、RGB8、RGB565、RGB555、RGB24、RGB32、ARGB32等;常见的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411、YUV420等。
YUV主要的采样格式
  主要的采样格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。其中YCbCr 4:1:1 比较常用,其含义为:每个点保存一个 8bit 的亮度值(也就是Y值),每 2x2 个点保存一个 Cr 和Cb 值, 图像在肉眼中的感觉不会起太大的变化。所以, 原来用 RGB(R,G,B 都是 8bit unsigned) 模型, 1个点需要 8x3=24 bites(如下图第一个图),(全采样后,YUV仍各占8bit)。按4:1:1采样后,而现在平均仅需要 8+(8/4)+(8/4)=12bites(4个点,8*4(Y)+8(U)+8(V)=48bit), 平均每个点占12bites(如下图第二个图)。这样就把图像的数据压缩了一半。
  上边仅给出了理论上的示例,在实际数据存储中是有可能是不同的,下面给出几种具体的存储形式:
  (1) YUV 4:4:4
  YUV三个信道的抽样率相同,因此在生成的图像里,每个象素的三个分量信息完整(每个分量通常8比特),经过8比特量化之后,未经压缩的每个像素占用3个字节。
  下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
  存放的码流为: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
  (2) YUV 4:2:2
  每个色差信道的抽样率是亮度信道的一半,所以水平方向的色度抽样率只是4:4:4的一半。对非压缩的8比特量化的图像来说,每个由两个水平方向相邻的像素组成的宏像素需要占用4字节内存。
  下面的四个像素为:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
  存放的码流为:Y0 U0 Y1 V1 Y2 U2 Y3 V3
  映射出像素点为:[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]
  (3) YUV 4:1:1
  4:1:1的色度抽样,是在水平方向上对色度进行4:1抽样。对于低端用户和消费类产品这仍然是可以接受的。对非压缩的8比特量化的视频来说,每个由4个水平方向相邻的像素组成的宏像素需要占用6字节内存。
  下面的四个像素为: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
  存放的码流为: Y0 U0 Y1 Y2 V2 Y3
  映射出像素点为:[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2]
  (4)YUV4:2:0
  4:2:0并不意味着只有Y,Cb而没有Cr分量。它指得是对每行扫描线来说,只有一种色度分量以2:1的抽样率存储。相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0...以此类推。对每个色度分量来说,水平方向和竖直方向的抽样率都是2:1,所以可以说色度的抽样率是4:1。对非压缩的8比特量化的视频来说,每个由2x2个2行2列相邻的像素组成的宏像素需要占用6字节内存。
  下面八个像素为:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
  [Y5 U5 V5] [Y6 U6 V6] [Y7U7 V7] [Y8 U8 V8]
  存放的码流为:Y0 U0 Y1 Y2 U2 Y3
  Y5 V5 Y6 Y7 V7 Y8
  映射出的像素点为:[Y0 U0 V5] [Y1 U0 V5] [Y2 U2 V7] [Y3 U2 V7]
  [Y5 U0 V5] [Y6 U0 V5] [Y7U2 V7] [Y8 U2 V7]
各种YUV格式(图)
  YUV格式通常有两大类:打包(packed)格式和平面(planar)格式。前者将YUV分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel);而后者使用三个数组分开存放YUV三个分量,就像是一个三维平面一样。表2.3中的YUY2到Y211都是打包格式,而IF09到YVU9都是平面格式。(注意:在介绍各种具体格式时,YUV各分量都会带有下标,如Y0、U0、V0表示第一个像素的YUV分量,Y1、U1、V1表示第二个像素的YUV分量,以此类推。)
  ¨ YUY2(和YUYV)格式为每个像素保留Y分量,而UV分量在水平方向上每两个像素采样一次。一个宏像素为4个字节,实际表示2个像素。(4:2:2的意思为一个宏像素中有4个Y分量、2个U分量和2个V分量。)图像数据中YUV分量排列顺序如下:
  Y0 U0 Y1 V0 Y2 U2 Y3 V2 …
  ¨ YVYU格式跟YUY2类似,只是图像数据中YUV分量的排列顺序有所不同:
  Y0 V0 Y1 U0 Y2 V2 Y3 U2 …
  ¨ UYVY格式跟YUY2类似,只是图像数据中YUV分量的排列顺序有所不同:
  U0 Y0 V0 Y1 U2 Y2 V2 Y3 …
  ¨ AYUV格式带有一个Alpha通道,并且为每个像素都提取YUV分量,图像数据格式如下:
  A0 Y0 U0 V0 A1 Y1 U1 V1 …
  ¨ Y41P(和Y411)格式为每个像素保留Y分量,而UV分量在水平方向上每4个像素采样一次。一个宏像素为12个字节,实际表示8个像素。图像数据中YUV分量排列顺序如下:
  U0 Y0 V0 Y1 U4 Y2 V4 Y3 Y4 Y5 Y6 Y8 …
  ¨ Y211格式在水平方向上Y分量每2个像素采样一次,而UV分量每4个像素采样一次。一个宏像素为4个字节,实际表示4个像素。图像数据中YUV分量排列顺序如下:
  Y0 U0 Y2 V0 Y4 U4 Y6 V4 …
  ¨ YVU9格式为每个像素都提取Y分量,而在UV分量的提取时,首先将图像分成若干个4 x 4的宏块,然后每个宏块提取一个U分量和一个V分量。图像数据存储时,首先是整幅图像的Y分量数组,然后就跟着U分量数组,以及V分量数组。IF09格式与YVU9类似。
  ¨ IYUV格式为每个像素都提取Y分量,而在UV分量的提取时,首先将图像分成若干个2 x 2的宏块,然后每个宏块提取一个U分量和一个V分量。YV12格式与IYUV类似。
  ¨ YUV411、YUV420格式多见于DV数据中,前者用于NTSC制,后者用于PAL制。YUV411为每个像素都提取Y分量,而UV分量在水平方向上每4个像素采样一次。YUV420并非V分量采样为0,而是跟YUV411相比,在水平方向上提高一倍色差采样频率,在垂直方向上以U/V间隔的方式减小一半色差采样,如下图所示。


本文转载自
http://baike.baidu.com/view/189685.htm

2008年9月23日星期二

hello, world!

在这个网站上开始贴文章,是想把平时所看、所想、所得,做书面的整理和记录,供自己日后翻阅。

习惯性的采用以上的标题,作为我在这个网站上张贴的第一篇网志。如果你有着十多年软件开发的经历,如果你知道Turbo C、Borland C++,你一定会明白为什么采用这个标题。

"hello, world!",这是个测试程序在屏幕上输出的内容。Hello, World! 程序是一个在计算器屏幕上,只印出 "Hello, World!"(意为「世界,你好!」)这一行字符串的程序。像这样简单的程序,通常是计算器程序语言的初学者,在学习编写时的第一个程序。它还可以用来确定该语言的编译器、程序开发环境,以及执行环境是否已经安装妥当。

把打印出 "Hello World" 作为第一个测试程序,现在已经成为程序语言学习的传统。该程序由 Brian Kernighan 和丹尼斯•里奇写的计算器程序设计教程《C语言程序设计》(The C Programming Language)而广泛流传;但这本书并不是 "hello, world" 的发源处,虽然这是一个普遍存在的错误认知。

这范例程序最早出现于 1972 年,由贝尔实验室成员 Brian Kernighan 撰写的内部技术文件《Introduction to the Language B》之中。不久同作者于 1974 年所撰写的《Programming in C: A Tutorial》,也延用这个范例;而以本文件扩编改写的《C语言程序设计》也保留了这个范例程序。

Turbo C 是美国Borland 公司的产品,Borland公司是一家专门从事软件开发、 研制的大公司。该公司相继推出了一套 Turbo系列软件,如Turbo BASIC, Turbo Pascal, Turbo Prolog, 这些软件很受用户欢迎。

该公司在1987年首次推出Turbo C 1.0 产品,其中使用了全然一新的集成开发环境,即使用了一系列下拉式菜单,将文本编辑、程序编译、连接以及程序运行一体化,大大方便了程序的开发。

1988 年, Borland 公司又推出Turbo C1.5版本, 增加了图形库和文本窗口函数库等, 而Turbo C 2.0 则是该公司1989年出版的。Turbo C2.0在原来集成开发环境的基础上增加了查错功能, 并可以在Tiny模式下直接生成.COM (数据、代码、堆栈处在同一64K 内存中) 文件。还可对数学协处理器 (支持8087/80287/80387等)进行仿真。Borland 公司后来又推出了面向对象的程序软件包Turbo C++,它继承发展Turbo C 2.0 的集成开发环境, 并包含了面向对象的基本思想和设计方法。1991年为了适用Microsoft 公司的Windows 3.0 版本, Borland 公司又将Turbo C++ 作了更新, 即Turbo C 的新一代产品Borlandc C++也已经问世了。

Turbo C 2.0是我当年学习编程的第一个开发环境。这所谓的当年,应该是十五六年前的事情了,那一年大概是1993年。从学习Turbo C, Fortran,Borland C/C++, Delphi, 一直到后来Visual Basic, Visual C++, Perl, Java, ASP, PHP。其实学习不同的编程语言是大同小异的事情,无非不过熟练掌握这种语言的数据类型、关键字、条件分支、循环、程序体,以及开发调试的环境。每次写第一个测试程序,都习惯性的写到 "hello, world!"

在GNU上有一个关于"hello, world!"的笑话,非常有趣。不过看懂这个笑话,需要一点编程方面的知识。如果你看不懂这个笑话,哦,对不起,你一定不是做这行的。

http://www.gnu.org/fun/jokes/helloworld.html

2005年5月31日星期二

WoW,UI以及其他

10年前在学校里念研究生的时候,很迷地玩过MUD《新东方故事》,后来自己架MUD服务器,自己写MUD扩展程序,也算是复旦BBS和MUD里的知名大虾。从文字MUD,到第一款图形化的MUD《网络创世纪》,再到现在的3D《魔兽世界》,其实都是多年来一脉相承的。因此,对WoW这类的游戏也不陌生。

WoW用术语来说,它是一款MMORPG,即大型多人角色扮演游戏。从服务器的角度,却没有本质的区别,整个游戏由包括经济系统、战斗系统、经验系统、装备系统、公会系统等等机制构成。当然,比起原来的MUD来,WoW的客户端是3D的,有魔兽争霸的背景,画面也的确极其华丽精美,吸引了无数的玩家投入其中,也包括了我这样的老玩家。

WoW提供了AddOn的功能,开放了一些API供用户自己定制界面,这些都是通过LUA的脚本文件、XML描述以及一些图形素材来构成的。正是由于这个开放的接口,才有了后来的COSMOS以及国内的BigFoot、WoWShell、17Cube等UI增强工具。通过这些UI,可以更加方便的操作WoW,比如额外的快捷栏、屏幕标记、显示数字、自动换装、快速拾取等等,因此也得到了很多玩家的热捧。

可以到这个网站http://ui.worldofwar.net/看各种各样的UI,都是玩家自己设计的。当然,也可以参考这篇文章《UI制作入门》,自己动手制作。

写于2005年5月31日