删除 MBR 引发的诡异问题

我要跟女友交换一下笔记本电脑,她不常用 Linux,而我的 Ubuntu 分区占了好几十 G 空间,因此我想还是删了再给她吧。

我的电脑有两个系统:Windows Server 2008 和 Ubuntu 10.04。按照惯常的思维,删除 Ubuntu 只需要先格式化 MBR,然后删除 Ubuntu 分区即可。因为手头没有 DOS 启动盘,我想到一键恢复的硬盘版是带 DOS 工具的,就在 Windows 下装了个一键恢复硬盘版,然后进 DOS 命令行 “fdisk /mbr”。

可谁知道做完这些之后,MBR 是清掉了,但系统无法启动了,提示消息是这样的:

Windows 未能将启动原因可能是最近更改了硬件或软件
文件:\Windows\system32\winload.exe
状态:0xc000000e
信息:无法加载所选项,因为应用程序丢失或损坏。
...

然后我就傻眼了,从来没有遇到过这种情况呀!搜索了一番之后,才明白了这是什么意思。

Windows Vista 之后的系统,不再使用 boot.ini 保存启动菜单,而是使用一种叫做 BCD(Boot Configuration Data)机制来管理启动菜单,其默认的配置文件是活动分区(一般是 C:\)的 \Boot\BCD。简单的来说,可以将 \Boot\BCD 文件看成是 GRUB 的 menu.lst(grub.conf)文件,里面储存着系统装载程序的路径和参数等。

在我这里,出现上面问题的原因是 BCD 每项记录中的 device 选项被“一键恢复硬盘版”改成了 unknown,这样启动程序不知道到哪里去找系统的装载程序,自然也就无法启动了。使用 bcdedit /store C:\Boot\BCD 可以查看系统的 BCD 每项记录。(较为诡异的是,在没有删除 MBR 之前,我是如何进入到启动项里的?)

我用的解决方法是把所有默认启动项中的 unknown 改成了 boot。还得依靠工具,使用 WinPE U 盘(DOS 启动盘未尝试)启动,进入 C:\Windows\System32\,执行 bcdedit 命令:

bcdedit /store C:\Boot\BCD /set {default} osdevice boot
bcdedit /store C:\Boot\BCD /set {default} device boot
bcdedit /store C:\Boot\BCD /set {default} detecthal 1

然后就可以启动进入 Windows 了。

Windows Tips: 修改热键和文件访问权限

我平时习惯使用 Win+E 打开 Windows 的资源管理器,但对资源管理器的左侧栏一直不感冒。用热键打开我的电脑本身就是为了键盘操作方便,但是多了个左侧栏使方向键选择文件夹相当不方便。昨天我总算找到了覆盖 Win+E 热键的方法。

AutoHotKey 是一个编辑和管理 Windows 热键的开源软件,SciTEAutoHotkey 是编辑 AutoHotKey 脚本的开源软件。(也许某些人会惊讶,AutoHotKey 居然不自带脚本编辑器,还要别人帮它写,我想这也许是受到 Unix 哲学的影响:Do one thing and do it well.)

AutoHotKey 脚本的基本语法是很简单的,前面是热键,后面是执行的命令,启动脚本后热键就会起作用了。键盘上每个特殊键对应的符号在热键列表中有列出,像我前面替换热键 Win+E 为打开“我的电脑”且无左侧栏的语句是:

#e::Run ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}

::{20D04FE0-3AEA-1069-A2D8-08002B30309D} 是“我的电脑”的 CLSID(多谢 IronFeet 的提示),如果需要打开非特种文件夹,就不需要这么麻烦了,直接类似于 #e::Run C:WINDOWS 即可。同理,设置用 Win+C 打开控制面板可以写成:

#c::Run ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}::{21EC2020-3AEA-1069-A2DD-08002B30309D}

利用 AutoHotKey 可以做很强大的事情。比如我在 Linux 下使用 Evince 查看 pdf,可以使用 vim 的习惯,jkhl 上下左右移动 pdf 文档,那么我们可以在 Windows 下用 AutoHotKey 来实现对 Adobe Reader 同样的操控,语句如下:

#IfWinActive ahk_class AcrobatSDIWindow
j::Send {Down}
k::Send {Up}
h::Send {Left}
l::Send {Right}
#IfWinActive

这几句话的意思是,如果 AcrobatSDIWindow 这个 ahk_class 窗口在激活状态下的话,那么 jkhl 就被换成键盘上的上下左右键。AutoHotKey 的高级使用还是很麻烦的,它网站上的 Tutorial 是一个不错的入门教程。其实一般我都是用 Launchy 启动程序,对 AutoHotKey 的需求不是那么多,简单的几个组合键就够了。

我昨天才发现 Windows XP 家庭版和专业版的一个大区别:家庭版没有“组策略”编辑器。我电脑的“所有程序”->"启动"目录不知道被什么安全软件设置成只读了,我以为 ATTRIB 命令是修改文件权限的,却发现无法修改“启动”文件夹的权限。后来找到 CACLS 命令,可以用来指定特定用户对文件的访问权限,才把"启动"文件夹访问权限修改成了完全控制:

cacls 启动 /G Solrex:F

设置可写以后就可以把 AutoHotKey 脚本的快捷方式拖到“启动”文件夹,随系统一起启动了。

谈谈 CoolSIP

说明:本文有一些内容是基于本人的合理猜测。如果您知道更多细节,请不吝指出,但最好请提供事实依据,而不是仅仅指责我主观臆测,不尊重事实。我不知道事实,才会猜测,我如果知道事实,就不用猜测了。

CoolSIP 是清华大学信息网络工程研究中心建设的 IPV6“下一代互联网应用示范平台”提供的一个在 IPV6 网络上运行的 VoIP 软件,该软件提供了主机间通话和主机拨打传统 PSTN 电话的功能。目前该服务仅提供给 IPV6 教育和科研网用户使用,注册该服务需要 edu.cn 或者 ac.cn 后缀的大学或科研机构电子信箱。测试期间是免费的,但需要用在线时长换取话费。

我这里呢,就是说几句闲话,谈谈我对这个软件和服务的看法。

1. CoolSIP 的知识产权问题

我对 CoolSIP 软件的结构并不清楚,但基本可以肯定的一点是 CoolSIP 使用了开源的 osipeXosip。不用逆向工程该软件,查看 CoolSIP 帐户信息的保存位置就可以知道,CoolSIP 的帐户信息保存在 C:Documents and SettingsUsernameeXosip 目录下。

由于 osip 遵从的是 LGPL 协议,eXosip 遵从的却是 GPL 协议,那么从我有限的对知识产权的了解(关于 LGPL 和 GPL 可以参考这里),CoolSIP 也应该遵从 GPL 协议(对这点有问题您可以在评论中指出)。而目前来看,清华大学信息网络工程研究中心并没有发布 CoolSIP 的源代码,而且 CoolSIP 貌似将 osip 和 eXosip 库静态链接进了程序里(大概有隐藏的意图),那么可以认为他们并不认可 GPL 许可证——不过他们还没有错误地在安装文件中包含一份私有版权声明。

另外,http://ngmylife.wirelesslan.edu.cn/multimedia.html 页面中说:“当eTone出现无法登录的问题时,可以使用CoolSIP试试。”可以猜测 eTone 和 CoolSIP 有非常紧密的关系,而 eTone 又是一款流行 VoIP 软件“快门” 的前身,那么我对“快门”软件的版权也持谨慎地怀疑态度——不过我更倾向于快门不大可能犯这种错误。

2. CoolSIP 本身的程序设计问题

CoolSIP 是一个极不成熟的软件,使用过程中居然会出现程序错误,点“忽略”才能继续运行的情况;由于其版本历史仅仅显示到 2007 年 9 月 3 日 ,我想其对 SIP 协议的实现是存在问题的,例如在拨打一个通话中的电话号码时,CoolSIP 不会提示对方正在通话中。总之,该软件除了是 sip6.edu.cn 提供的 VoIP 服务的官方客户端以外,几乎一无是处。

3. CoolSIP 的 VoIP 服务

虽然 CoolSIP 客户端没有什么优点,但是 sip6.edu.cn 的 VoIP 服务器端对 SIP 协议的实现应该还算很标准的。由于 CoolSIP 使用了 eXosip 库,那么我就尝试使用另一款使用 eXosip 库的遵从 GPL 协议的开源软件 Linphone 尝试连接了一下 CoolSIP 服务器,居然能正常连接。

并且 Linphone 显示出比 CoolSIP 更友好的用户体验,例如:Linphone 支持 Windows 和 Linux 系统,更完整地支持 SIP 协议,支持自定义电话联系人列表,多帐户同时在线,通话统计记录显示,多种音频编码,更好的视频支持。像上面提到的 CoolSIP 不支持的“您拨打的电话正在通话中”提示,也可以在 Linphone 中听到。

官方提供的专门客户端 CoolSIP 竟然不如一个开源的通用客户端 Linphone,这大概是“下一代互联网应用示范平台”服务的一个笑柄吧。

PS: 使用 Linphone 登录 CoolSIP 的服务器,需要 libexosip2 和 libosip2 版本大于 3.3,我的经验表明 3.1 会出现较多问题。推荐手动依次编译 libosip2->libeXosip2->linphone。Windows 版的可执行安装程序包含了这两个库,所以不存在库版本低的问题。

Gnome-Do 和 Launchy

我很喜欢那种充满创意的小程序,特别是超出我的想像那种,大概是我的想像太贫乏,因此老有惊喜。像 Synergy, Paint.Net, JabRef, Trash-cli 等,都让我觉得,哦,还有这样的软件!最近我又发现了两个,Gnome-DoLaunchy

通常情况下,为了使用方便,无论是用 Linux 还是 Windows,我总会在屏幕的最上方建一个工具栏,里面是到常用程序的快捷方式。尤其是用 Windows 时,老是按 Win+D 显示桌面然后再找启动程序太痛苦了;Linux 的程序都可以从命令行启动,状况还好一点。

但是我没想到还有像 Gnome-Do 和 Launchy 这样的程序,让我不用从一堆快捷方式中辨别我要的程序。按 Win+Space 就呼出一个小启动框,可以打开软件、打开文件夹、打开文档、打开书签、Google 搜索、Pidgin 聊天,真的是太酷了。我非常非常喜欢,它解放了我的快速启动栏。感谢开源社区给我们带来这么好的软件。

Launchy v.s. Gnome-do

应用程序打包技术之四(exe篇)

1. 应用程序打包技术之一(源代码篇)
2. 应用程序打包技术之二(deb篇)
3. 应用程序打包技术之三(rpm 篇)
4. 应用程序打包技术之四(exe篇)

exe 是 Windows 下通用应用程序的后缀,因此也是 Windows 下安装程序的后缀,我就以 exe 篇来命名这篇文章吧。

我们在 Windows 下写程序,尤其是带有图形界面的应用程序,往往不仅需要一个可执行的 exe 文件,还需要一些辅助的 dll 或者资源文件。一般情况下,我们可以采用打包整个目录的方式来发布软件(也是目前很多所谓“绿色软件”的做法),当然我们也可以发布传统的 Windows 安装文件。这样用户不需要额外的解压缩软件,双击执行安装文件就可以安装软件。

HM NIS Edit

将 Win 下应用程序打包成安装文件的方法有很多,这里我们主要介绍一个开源的安装文件制作工具 NSIS(Nullsoft Scriptable Install System)。比如我们耳熟能详的软件 WiNamp 和 eMule 的安装文件,就是使用 NSIS 生成的。它的主页在http://nsis.sourceforge.net,您可以从它的主页下载到最新版本。

NSIS 是一个基于脚本的安装文件制作工具,因此我们必须写好一个脚本提供给它执行。总是要学一些“微语言”真是麻烦的事情,幸好我们还有 HM NIS Edit,一个开源的 NSIS 脚本编辑工具。使用 HM NIS Edit,我们可以一步一步地按照向导生成 NSIS 所需的脚本。因此,我们这篇文章其实主要是介绍 HM NIS Edit 的使用,和 NSIS 的部分脚本格式。使用 NSIS 脚本生成安装文件那一步,实在是太简单不过了,点一下鼠标或者敲一个命令而已。

假设我们要为 foo 程序生成一个安装文件,在打包之前您应该将 foo 的可执行程序、所需 dll 和资源文件等放在一个文件夹 foo 中。比如假设 foo 程序的目录是这样的。

D:>tree /F foo
D:FOO
│  foo.dll
│  foo.exe
│  licence.txt
│
└─image
        foo.ico

下面我们就可以使用 HM NIS Edit 来创建 NSIS 脚本了。启动 HM NIS Edit,在 File 菜单中选择 New script from wizard 脚本生成向导,点击 Next 下一步,进入程序信息页。

Application name 程序名这里我们填入要打包的程序名 "foo";Application version 程序版本我们填入 foo 的版本,比如 "1.0";Application publisher 发布者我们填程序的开发公司名或者自己的名字,比如 "张三";Application website 程序主页我们填程序的主页名,没有主页的就可以不填。然后点击下一步进入安装文件选项页。

Setup icon 安装图标是您希望您的安装文件长什么样子,而不是您应用程序的图标,一般选择默认即可;Setup file 是您希望安装文件叫什么名字,比如 "foo-1.0-setup.exe";Setup lang 安装程序语言是安装过程中的提示所使用的语言,您可以根据您的需要选择,比如简体中文 "SimpChinese";GUI 是安装文件的对话框风格,随便您喜欢哪种;Compress 压缩格式是您希望使用什么格式将应用程序压缩存放在安装文件中。然后点击下一步进入应用程序默认安装目录和协议页。

Application default directory 里面填您的应用程序默认安装到哪里,比如 $PROGRAMFILESfoo 是默认安装到 C:Program Filesfoo 目录下,最好勾选上 Allow user to change the application directory,允许用户更改安装目录,这样您的程序显得更人性化一点儿;License file 是指应用程序所使用的协议文本,如果您在 foo 目录下已经准备了协议文件 license.txt,那么直接填 licence.txt 即可。这个协议就是您通常在 Windows 下安装软件时,第一个页面提示的“是否同意上述协议”的“上述协议”文本框里的内容;下面几个选项是让用户选择如何接受协议。点击下一步,进入应用程序文件选择页。

在应用程序文件选择页中会有三个文本框。这个页面的作用是分组添加应用程序所需要的程序文件,这样用户安装时就可以通过选择“最小安装”、“完全安装”、“自定义”等选择安装不同的组件。左上方的文本框是组件框,右下方的文本框是组件信息说明框,右方最大的文本框是每个组件所包含的可执行、dll 和资源文件。如果我们的程序很简单,不用分什么组件,我们就只用一个 MainSection 就行了。点中左上方文本框中的 MainSection,在右侧将所有程序文件添加进去。由于我们已经将所有文件都放置在了 D:foo 目录下,我们只需要点选第二个图标:Add directory tree,在对话框中将源目录选择为 F:Moviefoo,目标目录选择为 $INSTDIR,这样 foo 下所有的文件和目录都将会被安装到 $INSTDIR(默认是 C:Program Filesfoo)目录下。确定之后返回文件选择页,点击下一步进入应用程序图标页。

应用程序图标页的主要作用是选择将会被安装到“桌面”和“开始”菜单的快捷方式指向的可执行程序。如果您的程序名和项目名一样,或者 foo 目录下只有一个 exe 可执行文件,此处就使用默认设置即可。Create an Internet shortcut in the Start Menu folder 的意思是在“开始”菜单中添加一个到软件主页的快捷方式;Create an Uninstall shortcut in the Start Menu folder 的意思是在“开始”菜单中添加一个到卸载程序快捷方式。点击下一步进入安装后执行设置页。

安装后执行的意思是当安装程序安装完成后,用户选择安装后直接启动应用程序或者查看自述文件时,程序的行为。如果您有自述文件,就在 Readme 中填入自述文件的名字,比如 readme.txt,如果没有,就什么也不填,直接进入下一步程序卸载选项。

如果您选择了使用卸载程序 Use uninstaller,NSIS 将会为您自动生成一个卸载程序,其选项使用默认即可。点击下一步进入结束页。

最后结束时,HM NIS Edit 会询问您是否保存脚本。当然要保存了,保存了以后再需要生成安装文件时就不必使用 HM NIS Edit 重新生成脚本了。Convert file paths to relative paths 将脚本中的文件路径修改成相对于脚本文件的路径,这个选项也最好选上,这样在更改 foo 的目录时,我们只需要 NSIS 脚本与 foo 的相对位置不变就不影响脚本的使用。接下来保存脚本文件,最好将脚本文件保存在 foo 目录下,这样以后需要重新生成安装文件,只需要将 NSIS 拷贝到 foo 目录下就可以编译了。比如取名为 foo.nsi。

这样,整个脚本文件我们已经编写好了。现在我们到 D:foo 目录下,就能发现一个 foo.nsi 文件,右键点击 foo.nsi,在下拉菜单中选择 Compile NSIS script,不出错的话,就能在当前目录下生成一个名为 foo-1.0-setup.exe 安装文件了。您可以双击执行一下它,看看安装过程是否如您所料。

我们也可以使用命令行编译 NSIS 脚本,您可以使用这个命令:

C:Program FilesNSISmakensis.exe foo.nsi

如果您将 C:Program FilesNSIS 添加到了 PATH 环境变量中,就可以直接使用 makensis.exe foo.nsi 来编译了。

小技巧:

1. 当生成 NSIS 脚本之后,我们想修改设置,不需要重新执行一遍脚本生成向导。只需要用文本编辑器打开 foo.nsi,找到相应的域,更改设置即可。

2. NSIS 是一个相当强大的安装文件生成器,但是使用 HM NIS Edit 脚本生成向导生成的脚本并不具有很灵活的定制性。如果您需要更多特性,请阅读 NSIS 用户手册,您能从网上搜索到该手册的中文版本。然后直接去修改 NSIS 脚本。

3. 用 NSIS 产生的卸载程序有可能会产生卸载不干净的现象,主要原因是 NSIS 卸载程序不支持递归删除目录。如果您想要它把所有文件和目录都删除的话,就需要在 Section Uninstall 中将所有程序可能会生成的文件和目录都添加进去,这样生成的卸载程序就能卸载全部文件和目录了。

4. 您可以在这里找到更漂亮的图文教程。

A Chance For Linux and Freeware

连着忙了几天,今天闲话几句。

关于微软正版验证

我家希希说:“我要被黑屏了,怎么办呀?我要学 Linux!”

我说:“没关系,你把自动更新服务关掉就行了。”

我家希希说:“我还是想学 Linux!”

微软准备在 2008 年 10 月 20 日对中国用户启动的 WGA 计划这几天被吵得沸沸扬扬,搞得几乎人人自危,生怕被黑屏了。本人的评论如下:

  • 对此措施,我持欢迎态度。这件事起码给中国的盗版用户提了个醒:软件是有知识产权的!用盗版的操作系统很开心,用盗版的应用软件也很开心,到最后是中国整个落后的软件产业不开心,软件民工们也不开心。

  • 对于效果,我持保留态度。我相信中国盗版产业中广大劳动人民的智慧!

  • 对于影响,我持乐观态度。这是一个 Linux 和免费软件的机遇。此次 WGA 计划一出,势必会督促那些已经有学习其它操作系统愿望的用户真正动起手来,也会使那些使惯了盗版 Office 的人考虑一下免费的优秀国产软件 WPS Office,进而认识到许多优秀的免费软件并不比收费软件差

最后友情提醒一下,WPS Office 2007 目前已更新到支持 M$ Office 2007 文件格式( .docx, .xlsx, .pptx ),永中也于本月 13 号推出了免费的永中 Office 2009 个人版,支持 Windows 和 Linux 平台;免费的国产软件 Foxmail 和"进口软件" Thunderbird 都可以替代 Outlook ; Ubuntu 8.10 Linux 操作系统还有 14 天就发布了。

关于看论文

最近被老师逼着快速浏览了大量论文,发现自己以前看论文的效率还是太低。眼高手低的毛病总是改不了,做研究还是要潜心进去。

关于看书

每天睡前逼着自己看一会儿书效率挺高的。豆瓣上我在读的书已经超过二十本了,平日很难分出大块时间看,目前已经利用睡前十分钟解决了两本。躺床上用台灯看书的感觉蛮惬意的,置身于黑暗中的一小片光明,仿佛又回到了中学时代。当然这也得益于现在宿舍的环境布置,床头就是写字桌,要是像以前在中关村时住上铺的话,势必就会影响室友的睡眠了。

关于 writeos

九月份更新了两次,十一假期无暇写字,第三章到现在还没写完,我希望十月底能完成发布第二个版本。上个星期一个墨西哥的小伙子加我 Gtalk,问这本书的问题,开始我还以为是华裔,后来知道人家根本不懂中文,没办法只好推荐他去看代码注释。也许等我再完成两章之后,会和某些朋友合作开始将它翻译成英文。

笔记本磁盘高频加载/卸载循环问题

注意:本人非硬件专家,下面我仅仅阐述遇到的问题,解决方法,以及我的一些猜想。要仔细的了解这个 BUG,请阅读 Ubuntu Bug 列表的 BUG 59695:High frequency of load/unload cycles on some hard disks may shorten lifetime

我的笔记本是 DELL Latitude D630,从一开始使用我就发现 D630 的硬盘在正常使用中会经常发出“咯吱、咯吱”的响声(不是光驱,比光驱的咯吱声音要小得多),虽然我在 BIOS 里设置了硬盘模式为 Quiet。我一直认为这是正常现象,读取硬盘总会发出声响的。去年我曾经注意到 Ubuntu 的一个硬盘操作 BUG 引起了广泛的关注,但是在新闻中只提到了在电池模式下出现的问题,我也就没有仔细去浏览,而且我想随着 Ubuntu 升级,这个 BUG 应该被早已 fix。

但是今天我被一个事实给吓到了:我一直习以为常的“咯吱、咯吱”声居然是系统 BUG!而且这个 BUG 同样存在于 Windows 和 Linux 。

令我信服这一点的是,在我应用了 Ubuntu Bug 列表中提供的解决方案后,Ubuntu 下的硬盘“咯吱、咯吱”声消失了,而 Windows XP 下仍然会发出这种声音。

重要评论 by 徐宥:windows 没有专门的笔记本版, 电源管理的策略都是沿用桌面的. 如果节能设置为一直打开, 是没有问题的.

简单的来说,这个 BUG 讲述的是笔记本电脑的电源管理的一个问题:笔记本为了保持低功耗,采用了一个方法,就是在不使用硬盘的时候,将硬盘磁头 park 起来;需要使用的时候,再 unpark 磁头。而在实际使用中,这个节电策略被滥用了,导致过于频繁的 park/unpark 磁头,造成磁盘寿命变短,而且会带来磁盘“咯吱、咯吱”的噪声。这是很多笔记本电脑硬盘使用时间不超过一年的一个原因。

一些文章中介绍,一般磁盘设计承受的加载循环计数最多为 600,000 次,而当超过 300,000 次的时候磁盘的响应速度就会变慢,所以平均每小时的加载循环次数应该在 15 次左右,这样才能保证大约 4 年不关机的使用寿命。而我正常使用 7 个月的 D630 平均每小时加载循环次数为 76 次,是设计次数的 5 倍!!

有一个工具可以用来检测笔记本电脑硬盘的加载循环计数 smartmontools,这是开源软件,有 Linux 和 Windows 版本,在 Ubuntu 下可以直接 apt-get。Ubuntu 下用 sudo smartctl -a /dev/sda 命令,Windows 命令行下用类似的命令,可以打印出磁盘的检测信息,主要关注下面两行:
9 Power_On_Hours 0x0032 099 099 000 Old_age Always - 1647
193 Load_Cycle_Count 0x0032 037 037 000 Old_age Always - 126354

Power_On_Hours 就是硬盘使用的总时间,Load_Cycle_Count 就是加载循环计数,二者相除,就能得到每小时加载循环次数,比如我的就是 126354/1647 = 76 次,5倍于设计水平,看了真让我感到恐怖。

Ubuntu 下推荐的解决方案有一个,我简化了一下,将下面的内容保存成一个脚本文件 fix_hdd.sh,用 sudo sh fix_hdd.sh 运行,然后重启即可:
cat > 99-hdd-spin-fix.sh << EOF #!/bin/sh hdparm -B 255 /dev/sda EOF chmod a+x 99-hdd-spin-fix.sh cp 99-hdd-spin-fix.sh /etc/acpi/suspend.d/ cp 99-hdd-spin-fix.sh /etc/acpi/resume.d/ cp 99-hdd-spin-fix.sh /etc/acpi/start.d/ 使用这个解决方案后,我发现在 Ubuntu 下我的 D630 磁盘不会发出频繁的“咯吱”声了,用 smartctl 检测发现 Load_Cycle_Count 增加的非常慢,问题应该是解决了。然后我重启到 Windows XP 下,发现仍有“咯吱”声,用 smartctl 测试了一下,在 20 分钟内大约有 18 个加载循环,和 76 次每小时的平均计数差不多,说明 windows 下也存在这个问题。 这就有点儿让我想不通了,Linux 下出现问题很容易理解,硬件厂商对 Linux 的支持本来就弱,为什么 Windows 下也会有这个问题?我想这些硬盘厂商在出品之前肯定对硬盘在各种情况下的表现进行过很多次测试,Windows 下的测试应该是最重要的一个吧。难道是故意的?

我的一些关于盗版的观点

前段时间我写了篇 扔掉你 Windows 操作系统中的盗版软件吧 的博客文章,那是因为我不得不使用 Windows 下的 QQ 来和我女友进行视频聊天,而我又不想在我的系统中再次塞满盗版软件,所以就尝试着完全使用免费软件来工作,结果我发现效果还很好。不使用盗版软件并没有影响我的工作,有时候反而能促进我的工作效率,所以我想打破“使用 Windows(正版) => 不得不使用盗版软件工作”这种神话。

我并不是一个无条件反对使用盗版的人。我认为版权保护的目的就是为了促进人类知识和智慧的发展,就像林肯说的那句话:The patent system added the fuel of interest to the fire of genius. (专利制度是为了用利益燃料来浇灌天才之火。) 而在当前的某些状况下,版权保护体系其实是在实现某些团体的利益,而阻碍了人类知识和智慧的发展。因为有很多后发国家,有很多落后社会,版权保护体系在它们和先进国家之间划分了一道巨大的数字鸿沟。从某种意义上来讲,这有点像垄断组织对资源的控制和对其它后起企业的挤压一样,虽然垄断组织也是从自由竞争中发展起来的,但是当它成为阻碍市场发展的力量时,它就应该被拆散。

所以说,我不反对“贫困却希望享有平等获得信息权利”的盗版行为(比如盗版音乐、电影、书籍),我也不反对“由需要而只能使用无法替代的应用”的盗版行为,但是我反对“了解到有替代的东西而不去使用它”的盗版行为,更反对“知道这一切却我行我素并不以使用盗版为耻”的盗版行为。总的来说我的观点是:如果一个人使用盗版,必须感到抱歉,认识到这是一种违法行为;如果某种东西无法替代,为了自身的发展,可以在很抱歉的情况下来使用它;如果某种东西可以替代,那么就应该采取行动避免使用盗版。

关于盗版不仅仅是道德层面的问题,还有一些其它的影响。这些警钟已经被敲过很多遍了,就比如关于 Windows:微软的新操作系统 Vista 引入了一些 DRM(Digital Right Management)的新特性,微软喜欢把这种概念叫做“可信计算”,有一个计划叫做“palladium”,后来改名叫做“NGSCB(下一代安全计算基础,Next Generation Secure Computing Base)”,意思是为了用户安全。但是关于这个说法,Richard Stallman 的一句话 说的很正确:

When Microsoft speaks of “security” in connection with palladium, they do not mean what we normally mean by that word: protecting your machine From things you do not want. They mean protecting your copies of data on your machine From access by you in ways others do not want.(当微软提到和 palladium 有关的“安全”时,它的意思不是我们所说的“安全”的通常意义:“保护你的机器,不做你不想做的事情”。他们的意思是:“保护你机器中的数据拷贝,在他人(和微软相关的企业或者组织)不允许的情况下,你不得访问。”)

那么这个的实际意义就是:你在 Windows 下用 QQ,不是你觉得“我相信 QQ,我要用。”你才能用,而是需要 Windows 说“我相信 QQ,你能用!”,你才能用。这才是可信计算的真正意思,可信计算组织要控制你访问自己系统资源的能力,所以不要相信什么带有安全芯片的笔记本电脑,那个安全和你的安全是不一样的。况且,任何国家生产的安全芯片,都是需要加入某些国家安全部门产品的。

这些大公司大企业(就是你正在侵犯他们版权的那些企业)并没有那么慷慨,盗版的代价迟早是要付出的。他们所做的是让你先陷入盗版的深渊,然后再剥夺你的自由权利,最终获取更大的控制权和更多的利益。Trusted computing 就是其中的一步,当每台电脑都被微软强制安上安全芯片后(这可能是由盗版用户的市场贡献给微软带来的特权),恐怕你运行自己写的程序也要先给微软发封电子邮件以得到许可了。

那么如何避免这种现象的发生呢?只需要提几个问题你就明白了:如果 Linux 占桌面市场操作系统份额 50% 以上,微软会/能这样做吗?如果 Loongson(龙芯) 在中国个人电脑芯片市场占统治地位,Intel 会/能这样做吗?如果世界前 10 名高性能计算机中 Lenovo 占一半以上,IBM 会/能这样做吗?

所以不使用盗版软件,也是你为后代人做的贡献,恐怕你不想听到你的孙子问你:“爷爷,为什么我爸爸要花掉收入的一半去买操作系统和其它软件的授权呢?”

基于 WinPcap 的一个嗅探器 Windows

这几天相当之忙,好多事情要做,每天都要熬很晚,觉得都有点儿在崩溃的边缘了。

才写完一个大作业,Windows 下基于 WinPcap 库的图形界面网络嗅探器。以前从来没有摸过 MFC 编程,忽然让写这种程序,都要头痛死了。十一回南京也没时间做,只有回来猛补,从网上抄些,自己写些,拼拼凑凑算是写出来一个很简单的网络嗅探器程序。不过我也不想再花工夫了,其实用 WinPcap 库写嗅探器简单到了极点,最难做的是图形界面,了解 MFC 编程对我价值不是很大,不准备再深入了。我把代码包放到我的网站上了,这里是链接地址:
http://share.solrex.org/MyWork/Eavesdrop_Windows_Sniffer_Based_on_Winpcap_VC6.rar
有兴趣了解如何写网络嗅探器的可以下载下来看看。至于使用网络嗅探器,最好还是用 Ethereal,现在好像改名叫做 Wireshark 了,那才是真正强大的网络嗅探和协议分析工具,我们这种东西都是小儿科。

今天抽空把上一篇博客里给出的在 Linux 下安装 Windows 中文字体的脚本稍微完善了下,也根据师兄的建议把源代码放在了网站上(用 Google translate 访问了一下我的 blogspot 才发现上面显示的代码全乱套了)
http://share.solrex.org/scripts/install_win_CN_fonts_to_linux.sh
,修改了一下上一篇博客内容。之所以喜欢把代码放在文章里主要是经常搜索一些示例代码时发现源代码的下载链接不能使用,还是放在文章里一份拷贝比较有利于知识共享。

估计这个星期还会很忙,有一个对 DES 进行差分攻击的报告,有一个希腊哲学史方面的课程论文,还有很多书和 paper 要看。就算我不兼职,研究生生活也并不轻松啊...

在双系统环境中使用Windows字体美化Linux中文字体

安装完 Linux 操作系统的中文支持后,看到那些难看的字体是不是很不爽,下面这个脚本就帮助你使用 Windows 字体来自动美化 Linux 中文字体。

下面的脚本使用 windows 自带字体美化 Linux 字体,主要是将软件中文字体使用宋体,终端使用黑体替换。脚本源程序可以在 http://share.solrex.org/scripts/install_win_CN_fonts_to_linux.sh 下载到。

首先确保 windows 系统所在分区被挂载到 /media 目录下将以下内容保存为脚本文件:install_win_CN_fonts_to_linux.sh

#!/bin/bash
check_answer()
{
    case $1 in
        y|Y|Yes|yes|YES)
            return 0;
            ;;
        n|N|No|no|NO)
            return 1;
            ;;
        *) echo "Answer either yes or no, default is yes"
            return 2
            ;;
    esac
}

LIN_FONTS_DIR=/usr/share/fonts/zh_CN/TrueType
LANG_SEL_FILE=/etc/fonts/language-selector.conf
SEARCH_DIR=/media

echo -n "This script is for installing Windows Chinese fonts to Linux on a dual-OS-installed computer. And the writer doesn't promise it will work on your system. Do you want to continue?(y/n)[y]:"
read ANS_STR
: ${ANS_STR:="y"}
check_answer $ANS_STR
ANS=$?
if [ $ANS -ne 0 ]; then
    echo "Exit."
    exit
fi

echo -n "There might be license problems, i.e. you have no permission to use Windows fonts in other program except Windows OS. Do you want to continue?(y/n)[y]:"
read ANS_STR
: ${ANS_STR:="y"}
check_answer $ANS_STR
ANS=$?
if [ $ANS -ne 0 ]; then
    echo "Exit."
    exit
fi

echo -n "You run this script with root account or "sudo" command?(y/n)[y]:"
read ANS_STR
: ${ANS_STR:="y"}
check_answer $ANS_STR
ANS=$?
if [ $ANS -ne 0 ]; then
    echo "Exit."
    exit
fi

echo -n "You mounted Windows System partation "C:\" to /media directory?(y/n)[y]:"
read ANS_STR
: ${ANS_STR:="y"}
check_answer $ANS_STR
ANS=$?
if [ $ANS -ne 0 ]; then
    echo "Exit."
    exit
fi

echo "Searching for windows's fonts directory..."
echo "That may take a few minutes, please wait."
WIN_FONTS_DIR=`echo $(find $SEARCH_DIR -name simsun.ttc -type f) | sed s/simsun.ttc//g`
if [ -d $WIN_FONTS_DIR ]; then
    while true; do
        echo "Windows fonts dir found! Your windows fonts directory is: "
        echo -n ""$WIN_FONTS_DIR" Is it right?(y/n)[y]:"
        read ANS_STR
        : ${ANS_STR:="y"}
        check_answer $ANS_STR
        ANS=$?
        if [ $ANS -eq 0 ]; then
            break
        elif [ $ANS -eq 1 ]; then 
            echo "Please enter path to your windows fonts dir?"
            read ANS_STR
            if [ -d $ANS_STR ]; then
                WIN_FONTS_DIR=$ANS_STR
                break
            else
                echo "Your input is not a dir. Exit."
                exit
            fi
        else
            echo "Unrecognized input."
        fi
    done
else
    echo "Can not find windows fonts directory. "
    echo -n "Please enter path to your windows fonts dir:"
    read ANS_STR
    if [ -d $ANS_STR ]; then
        WIN_FONTS_DIR=$ANS_STR
    else
        echo "Your input is not a dir. Exit."
        exit
    fi
fi

echo "Entering $WIN_FONTS_DIR"
cd $WIN_FONTS_DIR

echo "Creating Linux fonts directory: $LIN_FONTS_DIR..."
mkdir -p $LIN_FONTS_DIR
if [ $? -ne 0 ]; then
    echo "Creating Linux fonts dir failed. Exit."
    exit
fi

echo "Copying windows fonts to linux fonts dir... sim*|tahoma|tohomabd.ttf"
cp sim* SimSun18030.ttc tahoma.ttf tahomabd.ttf $LIN_FONTS_DIR
if [ $? -ne 0 ]; then
    echo "Copying windows fonts to linux fonts dir failed. Exit."
    exit
fi

echo "Changing font files' access permissions.."
chmod 644 $LIN_FONTS_DIR/*

echo "Entering $LIN_FONTS_DIR"
cd $LIN_FONTS_DIR

echo "Creating an index of scalable font files in $LIN_FONTS_DIR for X..."
mkfontscale
if [ $? -ne 0 ]; then
    echo "Creating an index of scalable font files for X failed. Exit."
    exit
fi

echo "Creating an index of X font files in $LIN_FONTS_DIR"
mkfontdir
if [ $? -ne 0 ]; then
    echo "Creating an index of X font files in $LIN_FONTS_DIR failed. Exit."
    exit
fi

echo "Creating an index of FreeType font files in $LIN_FONTS_DIR"
fc-cache $LIN_FONTS_DIR
if [ $? -ne 0 ]; then
    echo "Creating an index of FreeType font files in $LIN_FONTS_DIR failed. Exit."
    exit
fi

echo "Backing up $LANG_SEL_FILE"
if [ -f $LANG_SEL_FILE ]; then
    cp $LANG_SEL_FILE $LANG_SEL_FILE.bak
fi

echo "Generating new $LANG_SEL_FILE... for language select"
echo '
<fontconfig>
  <alias>
    <family>serif</family>
      <prefer>
        <family>Bitstream Vera Serif</family>
        <family>SimSun</family>
        <family>DejaVu Serif</family>
        <family>AR PL ShanHeiSun Uni</family>
        <family>AR PL ZenKai Uni</family>
      </prefer>
  </alias>
  <alias>
    <family>sans-serif</family>
      <prefer>
        <family>Bitstream Vera Sans</family>
        <family>SimSun</family>
        <family>DejaVu Sans</family>
        <family>AR PL ShanHeiSun Uni</family>
        <family>AR PL ZenKai Uni</family>
      </prefer>
  </alias>
  <alias>
    <family>monospace</family>
      <prefer>
        <family>DejaVu Sans Mono</family>
        <family>Bitstream Vera Sans Mono</family>
        <family>SimHei</family>
    </prefer>
  </alias>

<match target="font" >
  <test name="family" compare="contains" >
    <string>Song</string>
    <string>Sun</string>
    <string>Kai</string>
    <string>Ming</string>
  </test>
  <test compare="more_eq" target="pattern" name="weight" >
    <int>180</int>
  </test>
  <edit mode="assign" name="embolden" >
    <bool>true</bool>
  </edit>
</match>

<match target="font" >
  <test name="family" compare="contains" >
    <string>Song</string>
    <string>Sun</string>
    <string>Kai</string>
    <string>Ming</string>
  </test>
  <edit name="globaladvance">
    <bool>false</bool>
  </edit>
  <edit name="spacing">
    <int>0</int>
  </edit>
  <edit name="hinting">
    <bool>true</bool>
  </edit>
  <edit name="autohint">
    <bool>false</bool>
  </edit>
  <edit name="antialias" mode="assign">
    <bool>true</bool>
  </edit>
  <test name="pixelsize" compare="less_eq">
    <int>18</int>
  </test>
  <edit name="antialias" mode="assign" >
    <bool>false</bool>
  </edit>
</match>

<match target="pattern">
  <test name="family">
    <string>SimSun</string>
    <string>SimSun-18030</string>
    <string>AR PL ShanHeiSun Uni</string>
    <string>AR PL New Sung</string>
    <string>MingLiU</string>
    <string>PMingLiU</string>
  </test>
  <edit binding="strong" mode="prepend" name="family">
    <string>Tahoma</string>
    <string>Verdana</string>
  </edit>
</match>

<match target="pattern">
  <test name="family">
    <string>宋体</string>
  </test>
  <edit name="family" mode="assign">
    <string>SimSun</string>
  </edit>
</match>
<match target="pattern">
  <test name="family">
    <string>新宋体</string>
  </test>
  <edit name="family" mode="assign">
    <string>SimSun</string>
  </edit>
</match>
<match target="pattern">
  <test name="family">
    <string>仿宋_GB2312</string>
  </test>
  <edit name="family" mode="assign">
    <string>FangSong_GB2312</string>
  </edit>
</match>
<match target="pattern">
  <test name="family">
    <string>楷体_GB2312</string>
  </test>
  <edit name="family" mode="assign">
    <string>KaiTi_GB2312</string>
  </edit>
</match>
<match target="pattern">
  <test name="family">
    <string>黑体</string>
  </test>
  <edit name="family" mode="assign">
    <string>SimHei</string>
  </edit>
</match>
</fontconfig> ' > $LANG_SEL_FILE
echo "Finished. Please quit your X session and relogin."
echo "If you have problems on start X(sometimes happened on Ubuntu 7.04.), please delete $LIN_FONTS_DIR and copy the backuped $LANG_SEL_FILE.bak to $LANG_SEL_FILE. Then do "fc-cache" with no options. That may work."

执行:
sudo sh ./install_win_CN_fonts_to_linux.sh

登出 Xwindow,再重新登录即可。

要学习呵

写了两天论文,关于自行车的平衡原理问题,没想到一个小小的自行车居然还有那么多物理原理,而且更没想到的是当初一看肯定不会的东西居然给搞出来了。但是还有一些不足之处是只想到了一些简单的东西,复杂的三维坐标问题和多力合成的影响没有考虑,不然一个人两天肯定完不成。最后还把论文转化成了PDF格式,看起来就是爽啊!要不是里面图片比较多,我就想把它贴在这,也省得以后像我这样的人找资料了,还能让别人找找错误,寄希望于老师太不实际了,他们估计也不会仔细看的。

今天不知不觉的睡到了十点多,奇怪的是我们宿舍一个人都没有醒,平常博导都是要早早起的,可今天也没有醒。起来以后就继续写论文。一天就全放在电脑上了。

心情不错。

明天还要继续上课,希望天气能一直这样,不然热得睡不着的时候,电脑也不能用了。

其实这两天也是除了写作业就没有干别的事情了,也没心思。找资料的时候就在网上搜搜搜搜,最郁闷的还是 Google 出问题了,据说是被黑了。查资料只能百度和 Yahoo 了,雅虎的东西老是和百度重复,这点很是不好。像 Google 搜索就很少与百度重复的,尤其是英文,说到英文搜索还是没有能和 Google 比的。我论文上最重要的问题分析就是从一个英文网站上找的,自己一翻译,然后解释一下,用几个模型检验一下,OK。

除了写作业还是要做些别的事情的,刚来的几天还去自习一下,这两天就老在电脑前面呆着,对眼睛很有影响,明天还是要出去自习。不然英语单词就不知道何时能背了。这几天可以把MY SQL的操作看完,看来不像是很难,当初学 FoxPro 的时候也学了一些 SQL 查询语言,SQL 查询和数据库操作这一块不成问题,就是一些标准查询语言与各软件自己的设计冲突和不冲突的问题,FoxPro 太烂了,数据库不稳定,数据库查询和操作语言不标准,而且设计麻烦,就是用户界面设计比较好看和容易一点。嘿嘿,不管怎么说,人家让咱第一次学会了什么叫应用程序设计,虽说只是一个数据库程序,可什么东西不是 DATA 啊?相比来说 MySQL 就很好了,个人版还不要钱,省得再从网上找什么破解,注册机了。还打算装一下 LINUX 系统,不知道我的机子已经装上了 WINDOWS 还能不能再装 LINUX,看百合原来精华区的文章全是老得不行的。都是什么 98、NT 的系统与 LINUX 双的。其实要不是这是一个正版系统,还有安了好多不容易找到的软件,我真就给重装了,好歹咱也是 LENOVO 的 OEM 系统啊!去微软怎么升级都不成问题啊,像春妹的电脑郁闷的微软不让他升级,干急也没用。WINDOWS 那么多漏洞,不能升级岂不是很惨,所以他的电脑经常是这个木马那个病毒的。像咱的都是最新补丁打得快,正版卡巴斯基杀毒软件,也是经常升级和扫描电脑。再加上天网防火墙,基本没毒。有毒的全是安装什么乱七八糟的软件带的插件。

MySQL难的还是用别的语言引用,像 ASP,JSP 什么的,如何在这些语言中使用它,我到现在还没有搞清楚。一直要学可是一直没有机会学。还有 APACHE 服务器的配置,乱七八糟的。而且我发现所有的计算机书没有几个好的,完全是骗人钱财,讲得乱得不行,根本不是照人的理解方式和顺序来写的,而且死贵死贵。有时候我真想自己写一本书,按照自己的理解方式。而且说不定会写的,像 PDF 格式的书写了就往网上一放,随便让人下。

算了,还是上床看会儿书吧,干什么不得先学好啊!活到老、学到老可是古训。也节省点电,建设节约型社会。