红俊's profile蝈蝈俊的共享空间PhotosBlogListsMore ![]() | Help |
|
December 30 sRGB和scRGB的区别.net FrameWork 3.0 后,我们会发现有两个Color数据结构。 这两个结构有啥区别呢? 下面是对这两个类的属性的一个简单比较:
我们可以在上面看到,关键是sRGB和ScRGB两种颜色表示方法。这两种有啥差别呢?我们来看下面三副图,先来感性的看看:
这幅图的巧妙之外在于它通过“归一化”,用两维平面来表示三个数据。X轴是红色的比例,Y轴是绿色的比例,而Z轴是蓝色的比例,虽然Z轴没有画出来,但它的比例数据可以很方便地计算出来。比方红是0.2,绿是0.3,那么蓝就是0.5。因为它们三者加起来必须等于1,不然怎么叫“归一化”呢!图上任何一点的蓝色分量,你都可以用这个方法计算出来。 图中的“舌形”色域空间,是人眼能够辨别的色彩空间,它的边缘围绕一道从波长从380到700(毫微米)的光谱,中间就是用红、绿、蓝三种颜色按不同比例调配出来的颜色。 而图中的三角的区域,是 sRGB 可以表示的颜色范围。显然有一些我们人类可以看到的颜色,但是sRGB来描述的。
上面这幅图对比了 sRGB、人眼、ScRGB 可以表示的颜色范围。
上面这幅图是sRGB和ScRGB两幅图的比较,注意看放大了的云彩。 sRGB 和 scRGB 的转换 在 System.Windows.Media.Color 结构中,scRGB原色其实是被储存成单精度(single-precision)的浮点数。想要容纳scRGB颜色空间,Color 结构包含四个主要的property,类型都是float,分别为ScA、ScR、ScG、ScB。 当G property 为0,ScG property 也会为0;当G property 为255,ScG property 就会为1。在这个范围之内,
ScR 与 R 之间的关系,ScB与B之间的关系,以及ScG与G之间的关系,也都是一样的。ScG的值可以小于0或者大于1,以容纳超出显示器和sRGB数字范围的颜色。 sRGB和scRGB的比较 sRGB目标是使同一网页在不同计算机上显示时的色彩更一致,但只适用于CRT显示器。微软HD Photo项目负责人克劳说,sRGB的挑战在于它只是完整色彩空间的一个子集,当使用sRGB编码时,我们会丢掉一些色彩。 scRGB色彩空间是sRGB扩展,对于黑色和纯绿色而言,这二者没有任何分别。二者的差别就在于scRGB能够显示人眼无法分辨的颜色,其精细程度也超过了sRGB。 scRGB描述每个点所需要的位数是sRGB 2倍,甚至是4倍。不仅能够使用整数,还能够使用浮点数,提高图像的精细程度。 参考资料: 关于scRGB色彩空间 第二章 基本的Brush画刷类 [App = Code + Markup] GDI+与WPF中的颜色简析 简述WPF中的图像像素格式(PixelFormats) December 27 SQL Server 索引基础知识(1)--- 记录数据的基本格式由于需要给同事培训数据库的索引知识,就收集整理了这个系列的博客。发表在这里,也是对索引知识的一个总结回顾吧。通过总结,我发现自己以前很多很模糊的概念都清晰了很多。 不论是缓存的数据信息,还是物理保存的信息,他们的基本单位都是数据页。所以理解数据页是最最基础的知识点,本篇博客就介绍跟索引有关的数据页的一些基础知识。 数据页的基础知识 SQL Server 中数据存储的基本单位是页(Page)。数据库中的数据文件(.mdf 或 .ndf)分配的磁盘空间可以从逻辑上划分成页(从 0 到 n 连续编号)。磁盘 I/O 操作在页级执行。也就是说,SQL Server 每次读取或写入数据的最少数据单位是数据页。 注意:日志文件不是用这种方式存储的,而是一系列日志记录。 数据库被分成逻辑页面(每个页面8KB),并且在每个文件中,所有页面都被连续地从0到x编号,其中x是由文件的大小决定的。我们可以通过指定一个数据库ID、一个文件ID、一个页码来引用任何一个数据页。当我们使用ALTER DATABASE命令来扩大一个文件时,新的空间会被加到文件的末尾。也就是说,我们所扩大文件的新空间第一个数据页的页码是x+1。当我们使用DBCC SHRINKDATABASE或DBCC SHRINKFILE命令来收缩一个数据库时,将会从数据库中页码最高的页面(文件末尾)开始移除页面,并向页码较低的页面移动。这保证了一个文件中的页码总是连续的。 在 SQL Server 中,页的大小为 8 KB。这意味着 SQL Server 数据库中每 MB 有 128 页。依次类推。根据数据库的文件大小,我们可以算出数据库有多少数据页。 SQL Server 2005 有以下几种页类型:
数据页(Data 类型页)的结构示意图: 每页的开头是 96 字节的标头,用于存储有关页的系统信息。此信息包括页码、页类型、页的可用空间以及拥有该页的对象的分配单元 ID。 在数据页上,数据行紧接着标头按顺序放置。页的末尾是行偏移表,对于页中的每一行,每个行偏移表都包含一个条目。每个条目记录对应行的第一个字节与页首的距离。行偏移表中的条目的顺序与页中行的顺序相反。
有关数据页的更多知识,可以通过下面这篇文章获得更详细的了解: 估计在堆中存储数据所需的空间量 另外也可以看我收集的资料:怎样查看表的数据页的结构 对大型行的支持 在 SQL Server 2005 中,行不能跨页,但是行的部分可以移出行所在的页,因此行实际可能非常大。
SQL Server 的数据页缓存 SQL Server 数据库的主要用途是存储和检索数据,因此密集型磁盘 I/O 是数据库引擎的一大特点。此外,完成磁盘 I/O 操作要消耗许多资源并且耗时较长,所以 SQL Server 侧重于提高 I/O 效率。缓冲区管理是实现高效 I/O 操作的关键环节。SQL Server 2005 的缓冲区管理组件由下列两种机制组成:用于访问及更新数据库页的缓冲区管理器和用于减少数据库文件 I/O 的缓冲区高速缓存(又称为“缓冲池”)。
缓冲区管理的工作原理 实验 下面做一个简单的实验来看你是否已经掌握的上面的知识点: 准备测试环境 在一个SQL 2005数据库中,执行下面脚本。 简单来说,就是创建了2个表,注意这两个表,一个是存储的 nchar(2019) 的字段,一个是存储的 nchar(2020) 的字段。 我们将来看这两个表在同样数据下,存储所花费的空间大小。由于缓存和物理存储的基本单位都是数据页,这个表物理存储的大小跟全部缓存的大小会是一样的。 然后我们每个表填充20个数据。 -- 创建2个测试表 CREATE TABLE [dbo].[Table_2019]([Data] [nchar](2019) NOT NULL) CREATE TABLE [dbo].[Table_2020]([Data] [nchar](2020) NOT NULL) go -- 填充数据 declare @i int set @i = 0 while(@i < 20) begin insert Table_2019(Data) values('') insert Table_2020(Data) values('') select @i = @i + 1 end go 这里我们用 nchar 数据类型,是因为: 完成准备工作后,我们来查看这两个所占空间的大小。在 SQL Server Management Studio 中,我们选择测试数据库, 然后在右键菜单中依次选择
这两个表同样20条记录。Table_2020 表数据占了 160kb ,即 20 个数据页。Table_2019 表数据占了 80 kb,即 10 个数据页。
参考资料: SQL Server数据库中存储引擎深入探讨 《Microsoft SQL Server 2005技术内幕:存储引擎》 这本书电子版的一部分 MSDN 中关于“页和区”的描述 聚集索引结构 行溢出数据超过 8 KB 缓冲区管理 估计堆的大小 nchar 和 nvarchar (Transact-SQL) Teched 2007 上 吴家震 主讲的"微软SQL服务器Always-On Tech-nologies: 高级索引策略" 录像下载地址: December 20 VS2008使用VSS做源代码管理需要注意的一点上个月 Scott Guthrie 的博客中提到, VS2008 如果用 VSS 做源代码管理,会有一些bug。 在他的博客中提到: “我们正在更新Visual SourceSafe 2005,以使它能和VS 2008合作。我们原先计划在上个星期就发布的,但在发布前发现了一个缺陷,会延迟几个星期。我们目前计划在几个星期内发布。Brian Harry在这里的博客帖子里对此有详述。” 相关地址:http://blog.joycode.com/scottgu/archive/2007/11/27/111998.aspx 我这些天都在等这个bug,我在用VS2008+VSS2005中,总碰到一些怪异的小问题。也没看到国内有人讨论这个问题。一直以为这个补丁没发布,今天自己去查了一下,原来这个补丁11号的时候就发布了。自己现在才知道。 至于有些人想象中的VSS2008则不会出现。VS2008下如果用VSS做源代码管理的话,应该是打了这个补丁的VSS2005。
VS2005时带的VSS2005版本号是: version 8.0.50727.42 打了这个补丁后得版本号是:version 8.0.50727.1551(VS2008 用) 这个补丁下载地址: Download the VS80-KB943847-X86-INTL.exe package now. 这个补丁包有3.14M
这个补丁修复了那些bug,请到 http://support.microsoft.com/kb/943847 去看。
参考资料: VS 2008 and SourceSafe Q&A http://blogs.msdn.com/richardb/archive/2007/12/03/vs-2008-and-sourcesafe-q-a.aspx VSS2005 的官方网址 December 07 使用 Request.QueryString 接受参数时,跟编码有关的一些问题我们先来看以下几个请求,看a.aspx 页面用Request.QueryString接受到的是啥信息?
情况分析: 案例一 a.aspx?info=%25 为何 Request.QueryString["info"]接受到的值是 % ,而不是 %25,是因为Request.QueryString 替我们在接受到值后,做了一次URL解码。 HttpUtility.UrlDecode("%25") 的计算结果就是 % 上面的这个案例一虽然看起来很简单。但是我们在一些特殊场景时候,就会因为这个而极度郁闷。 比如以下几种情况: 你有一个自己的加密算法,而这个加密算法,某些情况下会计算出带百分号的结果,而这个结果你是要通过URL参数的方式传递给其它页面的。 如果解决案例一碰到的情况呢? 解决方案一: 把需要传递的参数传递前作一次 HttpUtility.UrlEncode , 切记,不可在接受方每次接受后,自作聪明的都做一次 UrlEncode 。而是在发送方做 UrlEncode 。 另:这套方案中切记, UrlEncode 和 UrlDecode 的次数应该一一对应。不能多一次,也不能少一次。 a.aspx 页面中,根据传入的 from 参数,自动跳转到 from 参数(用Request.QueryString["from"]来接受这个参数)设置的页面。 下面再复杂一点,我给下面几个链接,其中都有 a 这个参数,请告诉我 a 这个参数是被那个页面接受到了?
如果想不明白,就想想下面这句话 解决方案二: 不用 Request.QueryString ,而是自己实现一个获取查询参数的方法。细节我在案例二讲完后再告诉大家,因为这个解决方案也处理了案例二的一些情况。 案例二 a.aspx?info=%bc%bc%ca%f5 传给我们的信息其实是使用 GB2312 编码后的“技术” 这两个汉字。 ASP.net 系统内部,在处理 Request.QueryString 等情况时候,都是使用的 UTF-8 的编码,我们如果不存在多系统并存的问题时候,这个问题一点都不存在。 比如下面这两个地址提到的问题: ASP.net中的Server.UrlEncode函数和ASP中的Server.URLEncode函数返回的值竟然不一样 PHP与aspx之间中文通过URL如何传递? 案例二的解决方案 就是采用类似下面代码的方式,来获得指定格式编码的查询文本参数。 System.Collections.Specialized.NameValueCollection nv =
要说我为啥知道上面几种解决方案,是因为我用 Reflector 看了 Request.QueryString 的实现代码。在查看代码时候,我们会看到这样一个 internal 方法: 这个内部方法实现了,按需解密查询参数的功能,但是遗憾的是,在QueryString 的处理函数中,强制指定了解析 QueryString 时,必须作一次 HttpUtility.UrlDecode。参看如下代码: public static NameValueCollection ParseQueryString(string query, Encoding encoding) 如果我们不想采用案例一的解决方案一,我们就需要自己写一个解析查询信息的代码。我们完全可以照抄 System.Web.HttpValueCollection 类的 internal void FillFromString(string s, bool urlencoded, Encoding encoding) 方法来改写。但郁闷的是:如果你用 Reflector 察看这个函数的实现时候,Reflector 出来的代码是错误的。正确的方法如下:是在施凡帮助下完成的。 自己实现从 URL 查询文本 Query 中解析出我们自己需要的文本的方法 /// <summary> // 确保 查询文本首字符不是 ? int num1 = (query != null) ? query.Length : 0; BREAKWHILE: string name = null; queryString.Add(HttpUtility.UrlDecode(name, encoding), HttpUtility.UrlDecode(val, encoding)); return queryString; } 用上面的代码,我们就可以按需解析自己需要的查询参数,而不是受限的使用Request.QueryString 。 小结 Request.QueryString 替我们件事情:每次接受到参数后,都做 UrlEncode ,并且是按照 UTF-8编码做的 UrlEncode 。 这在大多数情况下没有任何问题,但是一些情况下,会给我们带来麻烦,本文就是分析这些可能给我们带来麻烦的场景,以及解决方法。 参考资料: 使用 Reflector ; 查看代码时候,碰到的一个Reflector 的bug 解密不同编码的的参数。 两个Cookie类.Net 提供了两个Cookie类: System.Web.HttpCookie 类 和 System.Net.Cookie 类 对应的有两个Cookie 集合类 System.Web.HttpCookieCollection 类 和 System.Net.CookieCollection 类 我们一般来理解他们的区别就是下面简单的一句: System.Web 命名空间下的是给服务器段用的,System.Net 是给客户端程序用的。 实际上不止这点区别:
下面我们来对比这两个Cookie类的属性如下,这些属性都是Copy自MSDN中文版的说明文档:
你会看到 System.Net.Cookie 类 比 System.Web.HttpCookie 类多好些属性,一些我们WEB开发人员都不清楚的属性。为什么呢? 这就要从 cookie规范 说起。目前有以下几种Cookie规范:
rfc2965规范的使用,目前并不多。rfc2109规范相应要严格得多,在实际应用上,并不是所有的浏览器和Web服务器都严格遵守。因此相比较而言,Netscape cookie草案倒是一个比较简洁和被广泛支持的Cookie规范。
回过来我们再看 System.Web.HttpCookie 类 和 System.Net.Cookie 类的区别 我理解的他们的区别应该是:
System.Web.HttpCookie 类 这个类最初设计是考虑是WEB服务器用的,由于微软的WEB服务器并没有遵循 rfc2109 \rfc2965 规范。而是采用的 Netscape cookie草案方案。 同时为了兼顾以前ASP的一些编码习惯,于是就有了这个类这样的设计。
在 dudu 之前的一篇博客中提到的 遍历System.Web.HttpCookieCollection, 会有如下的写法: foreach (string name in Request.Cookies) 而 foreach(HttpCookie cookie in Request.Cookies)会出错。 为何微软会有这样的设计就可以理解了。
System.Net.Cookie 类 这个类最初设计时候应该是考虑主要是客户端使用的, 由于考虑到有些服务器的Cookie 是遵循 rfc2109 \rfc2965 规范,所以这个类的设计多了那些属性。
相关资料:
System.Net.Cookie和System.Web.HttpCookie有什么区别 http://topic.csdn.net/t/20050304/15/3824900.html
为什么foreach(HttpCookie cookie in Request.Cookies)会出错 http://www.cnblogs.com/dudu/archive/2004/12/21/80118.html
HTTP代理如何正确处理Cookie http://www.ibm.com/developerworks/cn/java/j-cookie/
Netscape cookies 草案 http://wp.netscape.com/eng/mozilla/3.0/handbook/javascript/cookies.htm
W3C的 rfc2109 规范 http://www.w3.org/Protocols/rfc2109/rfc2109.txt
W3C的 rfc2965 规范 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|