Home

数据迁移记

昨天买了块 WD 1TB(黑) 硬盘,之后将原硬盘数据导入,现将所得经验记录在此。

环境如下:
三块硬盘,分别为希捷80G,希捷 160G(SATA),WD 1TB(SATA)
工具:Win7PE(内置 Ghost, DiskGenius, FastCopy 等工具)

开始挂上 WD 硬盘打算分区时,电脑死机,经排查发现是电脑的电源不够强力,只能挂两块硬盘(以后要买强力电源啊);之后在 U 盘中装上 Win7PE,引导进入系统,格式化,分区,拷数据,摘录以下注意事项:

  • 使用 drvload 装载驱动,我的主板启动的 Win7PE 无法识别 SATA 硬盘,必须安装驱动, Win7 自带的 drvload 命令可以装载驱动,
    因此我将我主板 SATA 驱动提取出来,使用该命令加载,识别成功。
  • 不要使用 DiskGenius 进行数据迁移,我使用 DiskGenius 的分区拷贝功能迁移数据时,因为修改了目标硬盘的一个分区,导致蓝屏,因此建议不要使用硬盘操作来进行数据迁移。
  • 使用 FastCopy 进行数据迁移,该软件能够发挥硬盘的最佳效能。
  • 分区不要太多,整个系统可见分区以六个以下为佳。(单硬盘)
  • 设一个极小的引导分区,为方便以后引导和维护系统。
  • 迁移数据时,尽量不要太快删除原有数据,待新数据稳定运行一段时间后再考虑删除,以避免硬盘故障。
  • 使用足够强劲的电源,避免因挂载过多的硬盘导致供电不足而蓝屏死机。
  • 信春哥,得永生。

我的硬盘分区如下:

  • [WOST_AOE] C: // 系统分区
  • [WOST_BAR] D: // 工作分区,如程序代码,程序产生的数据,下载,交换文件 (频繁修改)
  • [WOST_JET] E: // 程序、游戏、电影、音乐 、资料(极少修改)
  • [WOST_ZIP] F: // 程序、压缩包、光盘镜像等内容的备份(不会修改)

估计不久(大概5年内),基于 DOS 的 16 位引导系统维护方式将会消失;而那时,WinXP 也将会死去,Win7 将会成为下一个统治者。

而 Chrome OS,很遗憾,虽然有很多的 Geeker 和狂热者在使用它,但依然无法撼动 Windows 的地位。

View Comments

MSBuild 简解

从最原始的编译器,逐渐到 Shell 命令组合、Make工具,到现在的针对性 Build 工具,Rake、Ant、MSBuild,甚至于 PowerShell 这样的工具;都为我们软件开发以及系统管理做出了贡献,我甚至不能想象几十年前使用编译器生成程序的复杂步骤(其实就是把 makefile 拆开,相当恐怖)。

探讨 Make、Ant 以及 MSBuild 无太多意义,甚至从纯技术和扩展性上来说,我认为 MSBuild 弱于 NAnt,但是软件并不是这么简单,之所以深研 MSBuild,M$ 作为后盾让人信任的无奈。

本文主要讲述 MSBuild 的基本概念,以及如何使用它辅助开发。

首先我们来看一个最简单的 Build:

1<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
2  <PropertyGroup>
3    <Welcome>Hello MSBuild!</Welcome>
4  <PropertyGroup>
5
6  <Target Name="Build">
7    <Message Text="$(Hello)" />
8  </Target>
9</Project>

假设我们把这个文件保存到 _D:\build.proj_,然后在命令行切换工作目录到 _D:_,运行 msbuild.exe (msbuild 默认直接运行当前目录下的 *.sln 或 *.*proj 文件),则命令行将会显示详细的 build 信息,当然也包括我们的消息 ‘Hello MSBuild!’ 。

概念

Project

Project 代表一个 Build,有属性 ToolsVersion、DefaultTargets、 InitialTargets,分别为 依赖的 MSBuild 版本、默认 Build 目标,初始化目标。

Property

Property 是 MSBuild 中的基本单元,可以理解为变量,我们可以在大多数地方使用它作为 Task 的参数以完成我们预期的目标。
下面的语句示范如何声明 Property:

1<PropertyGroup>
2  <Name Condition="$(Name) == ''">Kate</Name>
3  <WorkPath>D:\Workspace</WorkPath>
4</PropertyGroup>

这里定义了两个 Property,我们可以使用 $(Name) 和 $(WorkPath) 来引用它们,就和前面的范例一样。
Property 可以使用 MSBuild 的 /p 参数定义,这里就使用 Condition 属性判断是否存在外部 Name,如果不存在则使用自定义的 “Kate”。

Target

Target 是 Build 的基本单元,也对应 MSBuild 的 /t 参数,可用参数有 DependOnTargets,代表依赖的目标。

Task

Task 即任务,Build 的过程就是若干 Task 的执行。上面的 就是 MSBuild 内置的一个 Task,Text 则是参数。
Task 可以使用 Condition 属性。
通常情况下,MSBuild 自带的 Task 并不够用,有以下 MSBuild 扩展,可以几乎不需要自己写扩展:

Item

我们可以简单的把 Item 理解为 .Net 中的 Dictionary> 类型,内层的字典被称作元数据表。

 1<ItemGroup>
 2  <Table Include="A;B;C;D" />
 3  <Game Include="StarCraft" />
 4  <Game Include="WarCraft" />
 5  <Game Include="CoderCraft" />
 6  <Program Include="MyApp">
 7    <Developer>Zealic</Developer>
 8    <Timestamp>2009-01-01T11:22:33</Timestamp>
 9  </Program>
10</ItemGroup>

为方便理解,我们可以用 C# 来表述上述内容。

 1var Table = new Dictionary<string,Dictionary<string,string>> {
 2  {"A", new Dictionary<string,string>()},
 3  {"B", new Dictionary<string,string>()},
 4  {"C", new Dictionary<string,string>()},
 5  {"D", new Dictionary<string,string>()}
 6};
 7var Game = new Dictionary<string,Dictionary<string,string>> {
 8  {"StarCraft", new Dictionary<string,string>() },
 9  {"WarCraft", new Dictionary<string,string>() },
10  {"CoderCraft", new Dictionary<string,string>() }
11};
12var Program = new Dictionary<string,Dictionary<string,string>> {
13  { "MyApp", new Dictionary<string,string> { 
14      {"Developer", "Zealic"},
15      {"Timestamp", "2009-01-01T11:22:33"}
16    }
17  }
18};

和使用 Property 不同,Item 有如下用法:

  • @(Table)
    直接传递 Item 或展开为 A;B;C;D (视 Task 参数类型而定)。
  • @(Table, ‘+’)
    以指定的分隔符展开 Item,结果为 A+B+C+D
  • @(Table -> ‘%(Identity).dll’)
    转换 Item 为 A.dll;B.dll;C.dll;D.dll
  • %(Program.Developer)
    引用 Program Item 的元数据 “Developer”;此外,以这种方式使用 Item 都会导致循环所有 Item 成员。比如 <Message Text="%(Game.Identity)"/>,会导致三次 Task 调用,分别输出 StarCraft, WarCraft 以及 CoderCraft;Identity 代表 Item 的名称,有关 Item 的更多预定义元数据,请参考 MSDN

Item 可以使用 Condition 属性。

结语

可能有人会问,既然 MSBuild 和批处理能做的事都差不多,为什么不直接使用批处理呢?

有以下几点原因:

  • 与 .Net Framework 紧密集成。
  • 易于扩展:你可以使用任何 CLR 上的语言编写 MSBuild Task 进行扩展。
  • 高效率:多个解决方案/项目可以在一个解决方案中编译,甚至支持多核下的并行编译。
  • 利于诊断:MSBuild 可扩展的日志系统使得 build 过程几乎和白盒没有区别,你可以看到 build 的每一步细节。这也是 VS2003 转到 VS2005 之间最大的转变 - IDE 对编译过程的感知从黑盒转变到白盒。

此外,利用众多第三方 Task,MSBuild 可以完成诸如持续集成、管理服务器、自动化部署等任务,解放我们的时间,让我们可以有更多的时间 Coding 或偷懒 -_-。

了解到这些内容以后,聪明的读者,你是否已经打开一个正在开发的项目的 *.csproj 文件,用文本编辑器看看 MSBuild 究竟有什么魔法呢?

PS:文章写的比较简单,不够全面,有问题请给我妹儿 ,我将详细为你解答。或访问我的 Twitter,里面有不少小技巧。

View Comments

发散性碎片(2008-12-29)

MSBuildExtensionPack

MSBuild 一直都是 .Net 下 Build 工具的不二选择,可怜开源社区的 NAnt 几乎已经被彻底遗忘。而 MSBuild 则在蓬勃的发展。

如果老兄你对持续集成 Very 的有兴趣的话,那么如果你不会 MSBuild 的话,我只能拍着你的肩膀说一声:老兄,你真的太老了;让来我们看看 MSBuild 的未来。

Visual Studio 中的众多项目都是基于 MSBuild 的构建,包括 CodeAnalysis,OfficeTools,ReportingServices,WebApplications 以及 Workflow 等等,有兴趣的同学完全可以翻开 C:Program FilesMSBuild 目录研读一番。

有一个例外,Visual C++ 项目在 VS2003、VS2005、VS2008 是基于自己的构建方式,但是这一情况在 VS2010 中将彻底改变为基于 MSBuild 的构建方式,同时 Visual C++ 项目的智能感知数据库也会基于 SQLCE,而非以前的 .ncb (这是什么格式,Structured storage ??)。

最后,Novell 的 Mono 项目也有一个 MSBuild 的克隆 - xbuild,好吧,我承认它是一个半成品。就目前来说,Mono 真的只是玩具,完全承担不起平台的重任 - 它实在太不稳定了~~

扯远了,我们来说正题,今日在网上闲逛,发现了一个新的关于 MSBuild 的扩展项目,之前我们有这样的扩展项目可以用:

如果你的团队很大的话,SDC 是不错的选择,因为它的 TFS 集成度很好,而 Community Tasks 则提供了一大堆功能给你用,无论是模板还是 XML 操作,或生成 AssemblyInfo.cs ,都是手到擒来。

而现在呢,我们有一个新的扩展 MSBuildExtensionPack,它更加强大(感觉像在看龙珠漫画似的,没有最强,只有更强),在这里我就厚脸皮的直接摘抄介绍过来哈:

The MSBuild Extension Pack 3.5.1.0 release provides a collection of over 230 MSBuild tasks.
A high level summary of what the tasks currently cover includes the following:

  • System Items: Certificates, COM+, Console, Date and Time, Drives, Environment Variables, Event Logs, Files and Folders, GAC, Network, Performance Counters, Registry, Services, Sound
  • Code: Assemblies, CAB Files, Code Signing, File Detokenisation, GUID’s, Mathematics, Strings, Threads, Xml, Zip Files
  • Applications: BizTalk 2006, Email, IIS6, IIS7, MSBuild, SourceSafe, SQL Server 2005, SQL Server 2008, StyleCop, Team Foundation Server, Visual Basic 6, WMI

这样众多的 Task 如果配合 Windows PowerShell 以及 CC.Net,只要你的团队或者 PM 不是烂的过分,在这些工具的帮助下,效率肯定直线上升,您的项目奖金也唾手可得啦。:)

MessageBox

通常看到 MessageBox 弹出时,如果需要其中的信息,一般用手打或者用 Spy++  取其中的文字。结果现在才发现,MessageBox 支持 Ctrl+C,即复制功能,直接复制文本到剪切板。

是我孤陋寡闻,还是地球人都不知道?

Subversion 的 log.c 错误

使用 svnserve 作为 Subversion service 时,查看日志时可能会出现 ..libsvn_reposlog.c 这样的错误,这时只要在你的 authz 配置中加上 * = r 即可。

参考 :http://www.nabble.com/Show-Log-Error-td19145692.html

View Comments

Google Toolbar 5

Google Toolbar 5 已经发布正式版,并且自动更新到我的计算机上,兼容性和 TheWorld 没有问题,以下是新功能:

  • 在线保存配置,现在可以把你的 Toolbar 的配置保存在 Google 上,这样在异地使用 Toolbar 时,将有一致的体验,再也不用在其他地方使用电脑时重新配置 Toolbar 了。
  • 新的选项 UI,比以前漂亮多了。
  • 自动填表,很多浏览器都有的功能,当然 - IE 没有。
  • Google Notebook 功能集成,功能和 Firefox 的 Google Notebook 插件完全相同。

总的来说,感觉不错,唯一的缺点就是似乎比老版本速度慢了那么一点。

另外 Firefox 的 Google Toolbar 5 依旧在 Beta 中。

View Comments

简析 Google Gadget 的数据丢失原因

崇尚 GTD 的人不少,诸如 TodoList 和便签之类的工具也有很多人使用,但我听说很多人使用 Google 提供的 TodoList Gadget 以及 Sticky Note Gadget 时,丢失过数据,之后就再也不使用了,出于某种目的,我研究了下其中的原因。

试用过  iGoogle 的人都应该知道 iGoogle 可以在线保存配置。这样在其他地点使用 iGoogle 时,还能保持 Gadgets 不变,同时 iGoogle 也提供导出配置为 xml 的功能,我通过查看其 XML 的格式,发现诸如 TodoList Gadget 以及 Sticky Note Gadget 这样的 Gadget 皆是将数据保存在 iGoogle 的配置中的 — API 允许这么做。

因此,得出的结论是:使用 iGoogle TodoList Gadget 以及 Sticky Note Gadget 时,必须小心留意你的配置文件,无论是删除 Gadget 还是还原、清空备份文件,都会导致你的 Gadget 数据丢失。

其实,要用 TodoList 的话,Remember The Milk 是不错的选择。

View Comments