随笔(2008-5-19)

今天是大学时的一位好朋友银子的生日,却又偏偏是全国哀悼日

在此祝银子生日快乐,同时也求老天保佑全国人民和银子平安

SQL2005还原数据库时的问题

今天在SQL2005还原数据库时出现以下错误:

System.Data.SqlClient.SqlError: The backup set holds a backup of a database other than the existing 'XXX' database. (Microsoft.SqlServer.Express.Smo)

检查了一下发现原来是自己操作上的问题

原来在SQL2005还要在“选项”当中勾选覆盖现有数据库,并且选择目标数据库的路径,操作才会成功的。

习惯了SQL2000的操作,在SQL2005上就经常“粗心大意”了Tongue out

庆祝Windows Vista SP1发布 卫生纸也升级了

微软刚刚发布了Windows Vista SP1,怎么庆祝一下呢?马上去下载,这样未免也太没有创意了!我们来看一下日本人的做法,极富创意把卫生纸做成了Windows Vista SP1,或者反过来说也行,把Windows Vista SP1做成了卫生纸,不知道微软看了有什么感想呢,会不会告它侵权呢?

更不可思议的是,卫生纸上还写满了字,难道Windows Vista SP1的源代码就这样被公开了么?


下面我们来看下有关Windows Vista SP1的最新消息:

微软刚刚放出了第一批(wave0)的Windows Vista SP1正式版独立安装包,但只集成了英语、法语、德语、日语、西班牙语五种语言,而集成包括简体中文在内的36种全语言版本(wave1)将在4月份提供,但也不排除提前或跳票的可能性。

除了独立安装包,Windows Update也已开始推送Vista SP1,因此单机升级或者不愿单独下载安装包的用户可以选择自动更新,会更方便一些。

Vista SP1知识库文章编号KB936330,32位版本独立安装包文件名Windows6.0-KB936330-X86-wave0.exe,体积434.5MB,64位版本独立安装包文件名Windows6.0-KB936330-X64-wave0.exe,体积726.5MB。

从独立安装文件属性上看,Vista SP1版本号为6.0.6001.17028(安装完成后系统版本为6.0.6001.18000),而从文件数字签名里看,签名时间是将近两个月之前的2008年2月1日,这些都与最近泄露出来的安装包属性完全相同。有鉴于此,2月9日完成的多语言Vista SP1安装包应该也就是最终正式版,最近已经升级或者正在观望的用户大可不必再等待了

此外,微软还提供了一个编号 KB947821 的升级补丁,主要是用于安装未来的Vista更新程序,建议更新。

在网页上漫步太空,Google推出Google天空网页版

从今天开始,即使没有下载 Google Earth 4.2 版本软件,通过网页浏览器,你就可以"漫步太空"。

去年,Google Earth 4.2 版最新版本中增添的谷歌天空新功能获得了天文爱好者们的极大喜爱,它让每一个普通人都能够如同宇航员一般,置身虚拟太空,探索宇宙奇观。今天,谷歌正式推出谷歌天空地图,即谷歌天空网页版,让用户更容易、更直接的享受遨游太空的美妙体验。

打开网页浏览器,登录http://www.google.cn/sky/,开始太空的漫步吧。观看数百万光年以外的遥远星系,探索星群,看行星运动,甚至超新星的爆发,那些细致的令人难以置信的特写镜头,来自美国宇航局哈勃太空望远镜、空间望远镜科学研究所,斯隆数字天空观测以及数字天空观测协会等科研机构,你可以浏览和放大观察约1亿颗恒星和2亿个星系,搜索它们,或者随意地指向星空的任何一个地方。

    


当你第一次登录http://www.google.cn/sky/时,也许正看到雪茄星系(Cigar Galaxy),那是星空中最闪耀的星系之一,卫星图片冷冰冰的,没有热度,那么点击页面下方的"红外线视图"按钮吧,就能看到带着温度的雪茄星系。你还可以点击放大,更近距离的观察它,或者在搜索框中输入任何你想探索的星系吧。

    


目前,Google Sky 已经推出包括简体中文在内的 26 种语言版本。

引用自:在网页上漫步太空,谷歌推出谷歌天空网页版

破解影响IT项目速度的五大路障

  许多人都想加快IT项目的节奏,但要提高速度却非易事。以下是能对IT项目速度构成障碍的五种常见路障:

  过于专注大型项目

  一般来说,IT部门的整体体系(从项目办公室到流程批准)都倾向于实施期在一年以上的大型项目。这些项目呈线性流程,即先由商业分析师与架构互动,拟定参考解决方案,然后由部署专家转换成具体设计,最后制定详细的规格。虽然细致的步骤对保证大型项目的成功有所帮助,但却会明显拖慢项目展开的速度。

  对新方法持抵触态度

  有些IT部门不愿投资并体验新的工具与方法,除非能明确计算出这些项目的“价值”。此外,商业用户也大多不愿做第一个吃螃蟹的人。正是这两个因素导致一些陈旧、低效的技术与方法被延用至今。

  部门间缺乏对话沟通

  有些时候,商业部门会由于缺乏来自IT的反馈而无法确切把握现有项目组合的进度,继而难以判断是继续项目?还是先暂停项目?在很多情况下,IT说什么,商业部门就听什么,而IT往往也会避重就轻,只是挑他们自己懂的说。

  商业部门的参与程度

  实际上,并非所有的问题都源自IT。有时,因为商业决策者对IT项目不重视,不愿参加项目会议,从而对项目的顺利展开形成阻碍。有些项目甚至到后期阶段还有许多核心问题悬而未决。

  企业模式

  企业行为对员工的工作影响很大。倘若一家公司的绩效评估系统太严厉,或者要求员工不顾环境的发展变化,强行按照原定计划执行,那项目的进展速度肯定会受到制约,甚至很难走到终点。

《比尔-盖茨在微软的最后一天》

这是比尔-盖茨在CES上做主题演讲时播出的搞笑录像(出现在录像中的,除了微软的高层领导外,还有著名导演斯皮尔伯格,著名演员克罗尼和麦康纳,前副总统高尔,正在争夺民主党总统候选人的克林顿夫人和奥巴马等),很好玩

[youtube:HEWMC4usElM]

db4o发布7.2,出现.NET 3.5版本,支持LINQ

Db4Object刚刚发布了db4o的7.2beta,除了以前支持如下的平台:.NET 1.1,.NET 2.0,Mono外,现在还支持.NET 3.5了。当然支持.NET 3.5,最主要的时候要来支持LINQ。

关于LINQ,我稍后再讲。现在讲讲7.2中最大的新特性——Transparent Activation(透明激活)。关于7.0版本的其他新特性,可以参看我在InfoQ上的文章《Db4Objects发布Db4o 7.0,支持透明激活》。

要讲到透明激活,我们先来看看之前激活存在的问题。所谓激活,就是在对象从磁盘文件载入到内存过程中,如何加载层级对象的过程。由于对象的层级关系可以无限关联的,所以,db4o之前使用“深度”的概念来明确表明处理对象的时候需要,处理到多少层。但是,这种方式对编程带来很多麻烦,我们在写代码的时候需要随时关心,我们大概要加载多深的对象。这样的估计有时候会比要使用到的多,有时候又会少。多了,造成资源的浪费,少了,不能正确的处理需要处理到的对象。

下面我引用,db4o文档中对这个问题的描述(英文的我就不翻译了):

We can reuse most of the code from the Deep Graphs chapter and get it to work with Transparent Activation.
As a first step we should fill up our database with Car, Pilot and SensorReadout objects, so we have some objects to work with.

// storeCarAndSnapshots
Pilot pilot = new Pilot("Kimi Raikkonen", 110);
Car car = new Car("Ferrari");
car.Pilot = pilot;
for (int i = 0; i < 5; i++)
{
    car.snapshot();
}
db.Store(car);

If we now rerun the code to traverse all cars and their sensor readings, we are again confronted with the same problem that we had before, we end up with some leaves of our object graph being null.  

// retrieveSnapshotsSequentially
IObjectSet result = db.QueryByExample(typeof (Car));
Car car = (Car) result.Next();
SensorReadout readout = car.History;
while (readout != null)
{
    Console.WriteLine(readout);
    readout = readout.Next;
}

为了解决这个问题,db4o在7.0中提出了透明激活的概念,即db4o透明地帮我们处理对象激活的问题。这样可以提供性能,让我们编程更方便。

再次引用db4o文档的代码:

Let's configure db4o to run in Transparent Activation mode and let's try again:

// configureTransparentActivation
Db4oFactory.Configure().Add(new TransparentActivationSupport());

// retrieveSnapshotsSequentially
IObjectSet result = db.QueryByExample(typeof (Car));
Car car = (Car) result.Next();
SensorReadout readout = car.History;
while (readout != null)
{
    Console.WriteLine(readout);
    readout = readout.Next;
}

Wow it worked! Is it really that easy? Principally yes. When db4o is run in Transparent Activation mode there are no surprises with null members that have not yet been read from the database.

好了,透明激活就讲到这里,现在来看看LINQ的支持。Linq在7.0发布之前,在db4o上已经有一个linq to db4o的项目在做前期研究了,现在只是把linq to db4o合并到7.2中一起发布。

linq to db4o提供了一个额外的程序集:Db4objects.Db4o.Linq

要使用linq to db4o,只需要在项目中引用这个程序集。然后打开一个db4o数据库,就可以使用linq语法查询数据了:

Let's prepare some objects in our database to query against:

// storeObjects
db.Store(new Car("Ferrari", (new Pilot("Michael Schumacher", 100))));
db.Store(new Car("BMW", (new Pilot("Rubens Barrichello", 99))));

The simplest LINQ query will look like this:

// retrievePilot
IEnumerable<Pilot> result = from Pilot p in db
                            where p.Name.StartsWith("Michael")
                            select p;
ListResult(result);

You can see that we are using db4o object container as a datasource, the rest of the syntax is generic to all LINQ queries.
Now let's try a bit more complex selection:

// retrievePilotByCar
IEnumerable<Pilot> result = from Car c in db
                            where c.Model.StartsWith("F")
                            && (c.Pilot.Points > 99 && c.Pilot.Points <150)
                            select c.Pilot;
ListResult(result);

另外这里,也有一个linq to db4o的例子:Linq is here!

通过linq来查询db4o确实带来了很多方便,不��现在linq to db4o还没有非常成熟,期待其更加完善成熟。

大家对db4o 7.2有兴趣的,可以到这里下载来试试。

Discuz!NT百度论坛收录协议的问题

今天查看了一下百度论坛收录协议,其中有一点

第三步:使用XML文件
         请将XML文件命名为sitemap_baidu.xml上传到您网站根目录下,并保证文件所在的url地址能够被百度spider正常访问。例如,网站为post.baidu.com,则将xml文件上传至post.baidu.com/sitemap_baidu.xml
        当百度spider发现了xml文件后,会根据上面提供的参数自动对xml文件进行更新,并抓取高质量的内容。
        注意: 百度spider不保证一定能收录您提交的全部内容。

按照上面的说法对于论坛http://bbs.lishewen.com.cn/,百度的协议路径应该为http://bbs.lishewen.com.cn/sitemap_baidu.xml,而Discuz!NT的协议路径则是http://bbs.lishewen.com.cn/tools/sitemap.aspx,这样一来百度的虫虫根本不会在上面爬,Discuz!NT对百度的优化形同虚设

知道上面问题的原因,我们可以有以下的解决办法:

第一种,把sitemap.aspx产生的内容复制保存一份到论坛的根目录,并命名为sitemap_baidu.xml

如果你有采用官方的UrlReWriter,则可以采用第二种办法

在UrlReWriter的配置文件里面加多一条规则:RewriteRule ^(.*)/sitemap_baidu.xml  $1/tools/sitemap.aspx

本人建议用第二种办法,因为这样可以自动更新

VB2010新特性之集合和字典的初始化语句

在VB中我们可以通过以下语句去定义并初始化一个数组

Dim i = {1, 2, 3, 4}

那我们能不能通过这样的语句去定义并初始化集合呢?VB2010给出了肯定的答案

这是个很好的特性,基于一些Linq操作,VB也可以像函数式语言操作“表”一样,在数组上进行一些眼花缭乱的算法了。同时,List(Of T)和Dictionary(Of TKey, TValue)类型也可以用类似的表达式初始化。暂定关键字为From

    Dim l As New List(Of Integer) From {1, 2, 3, 4}        Dim countryRegex As New Dictionary(Of String, Regex) From {          {"USA", New Regex("^[2-9]\\d{2}-\\d{3}-\\d{4}$")},          {"UK", New Regex("(^1300\\d{6}$)|(^1800|1900|1902\\d{6}$)|(^0[2|3|7|8]{1}[0-9]{8}$)|(^13\\d{4}$)|(^04\\d{2,3}\\d{6}$)")},          {"Netherlands", New Regex("(^\\+[0-9]{2}|^\\+[0-9]{2}\\(0\\)|^\\(\\+[0-9]{2}\\)\\(0\\)|^00[0-9]{2}|^0)([0-9]{9}$|[0-9\\-\\s]{10}$)")}          }

呵呵,看着这些大括号,VB给人C的感觉

如何让.Net程序在没有装.Net框架的机子上运行

当然最简单的办法就系在对方的计算机上装.Net Framework
不过如果光光是这样我就不需要写本文了
前端时间有个朋友用飞信的FetionVM.exe实现了“脱框架”(注:飞信是用C#写的)
其实这样也不能算是真正的“脱框架”,还是要带 或者 下载些文件,还不能真正的实现单文件绿色运行
本文推荐一个视频可以把DLL打包成单个EXE

http://thinstall.com/demos/dnet20/

用视频教的办法再加上Remotesoft Linker and Mini-Deployment Tool可以做出最少6M的EXE
据说飞信的虚拟机也是这样打包的
当然这种办法也可以用于打包.Net 3.5和制作自己的虚拟机,毕竟飞信的虚拟机是有限制的
还有一种办法,不过是违反.Net的开源协议的,就是把system;system.windows.forms这些命名空间的源码down下来集成到自己的程序中编译,然后把原来对GAC的引用去掉,应该是可行的,不过违法的东西我没有试