显示标签为“程序”的博文。显示所有博文
显示标签为“程序”的博文。显示所有博文

2013年4月6日星期六

Hackintosh, Again

安装

  • CPU:I5-3470
  • 主板:ASRock H77 Pro4/MVP
  • 集显:HD2500
  • 独显:MSI 650ti Hawk
  • 网卡:Realtek RTL8111E
  • 声卡:Realtek ALC892

安装源用的是10.8.3懒人版(迅雷快传)。自己改太麻烦,作者说只是改了OSInstall(破解系统,使其可以装入MBR分区的磁盘上),那就将就吧。

目标磁盘是一块空白2T的希捷,打算装上OSX和Linux,剩下的空间作资料盘用。在MBR中写入Grub4Dos。第一个分区60G,格为NTFS,放入grldr、menu.lst和Chameleon ISO。编辑menu.lst,添加启动条目,用Grub4Dos引导Chamelon。第二个分区60G,留给OSX。然后再分出一个8G的分区,在Windows中用硬盘安装助手写入安装盘镜像。

如果在其后的过程中遇到安装程序报错,无法读取安装盘的情况,换一块磁盘区域重新分区并写入镜像试试。硬盘安装助手这个程序有点年头了,一直没更新过,有点不大靠谱。

重启,用Grub4Dos引导Chamelon ISO,载入安装镜像安装OSX。格式化OSX分区时,记得选不区分大小写的HFS,不然某些程序会有兼容性问题(如搜狗拼音)。安装完成重启之前,用控制台将安装盘的/Extra复制到目标分区中,并将目标分区System/Library/Extensions/AppleIntelHD4000Graphics.kext移动到自建的备份文件夹中。

重启,加上-v和-f参数引导目标分区即可成功进入桌面。

硬件驱动

网卡驱动我用了Lnx2Mac's Realtek RTL81xx v0.0.90(拷入AppleRTL8169Ethernet)。Realtek官方驱动也能用,但启动关机似乎会稍微慢一点。

声卡驱动图省事用了VoodooHDA v2.8.2。修改DSDT和AppleHDA也不是不可以,但爆音控制方面,VoodooHDA似乎还好些。如果要用AppleHDA,记得只能放/S/L/E,放/E/E不会生效的。

系统报告里有两个未知SATA控制器,那是板载的ASM1061。如果没接东西,肯定是没所谓的,但要是觉得看着不舒服,可以用(MultiBeast - Mountain Lion 5.2.1)里的3rd Party SATA。

华擎的这块板子锁住了MSR,需要为AppleIntelCPUPowerManagement打补丁。打完补丁,/E/E下的NullCPUPowerManagement就可以拿掉了。下载AICPMPatch,备份之后:sudo perl AICPMPatch.pl /System/Library/Extensions/AppleIntelCPUPowerManagement.kext/Contents/MacOS/AppleIntelCPUPowerManagement --patch

(该问题还可以通过刷写修改过的BIOS来解决。只是刷BIOS毕竟不安全,我觉得还是打补丁的好。)

如果有SSD,可以参考这篇打上TRIM补丁。我的SSD分区是NTFS,也不打算在OSX里写,所以就没测试。

10.8.3的HD4000驱动可用于HD2500(包括QE/CI),至少有人成功过。方法是在UEFI中将显存设置为32MB、64MB或96MB,并在新版变色龙(r2187或以上)中设置GraphicsEnabler=Yes。而我这里无论怎么设置都不能进系统,所以只好拿掉AppleIntelHD4000Graphics。

650ti驱动很容易,只需要将变色龙的GraphicsEnabler设置为No,即插即用。另外还有官方驱动和CUDA驱动。据说对性能有帮助,不过暂时没有用OSX打游戏或Adobe的想法,于是没去折腾。

Chameleon配置

Chameleon Wizard很好用,安装、更新、配置都可以搞定。

modules我用了三个。FileNVRAM可解决iMessage不能用的问题。Resolution可以让变色龙也用上高分辨率。Sata可以拿掉内置硬盘的热拔插功能,避免桌面上出现一堆图标。

如果使用了区分大小写的HFS,smbios.plist请用全小写。机型看着办吧,我用了MacBookPro9,1。

FakeSMC有两个活跃fork,Kozle的HWMonitor比较漂亮些,但当前版本在我这里读不出GPU频率,所以用了Slice的版本。Contents/PlugIns放什么可以看着办,只是我这里用r645的NVClockX会kernel panic,所以就拿掉了。

如果遇到USB3端口只能用鼠标键盘,不能用USB2的u盘的问题,可以试试GenericUSBXHCI。

如果需要用PS2接口的设备或是在本子上安装,则可能还会需要AppleACPIPS2Nub和ApplePS2Controller。

DSDT

这里有一个H77 Pro4/MVP的DSDT,不过是针对修改过的UEFI,只可看看作为参考,不能直接就拿来用。

首先下载MaciASL,这是一个OSX下的ASL编辑、打补丁和编译工具。

打开MaciASL,File、New from ACPI、DSDT。先打补丁amicleancompile.txt,修正编译时会出现的警告和错误。打完补丁可能还会有几个编译错误,看着改吧,很容易。

如果想要用AppleHDA,可以参考hdefaudioid_1.txt和这篇文章。请注意该补丁中的layout-id,该id必须要和AppleHDA中的id保持一致。

dmesg显示“WARNING: IOPlatformPluginUtil : getCPUIDInfo: this is an unknown CPU model 0x3a”,这说明系统不认识你的CPU。具体到我的I5-3470,除了无法睿频,调频只有1.6G和3.2G两档之外,没发现其他的缺点。

要修复这个问题,稍微有些折腾。Ivy Bridge之前的CPU,电源管理用的都是ACPISMCPlatformPlugin,Ivy Bridge则用的是X86PlatformPlugin。用ssdtPRGen.sh生成SSDT,再根据这张帖子进行修改。

变色龙中设置DropSSDT=Yes,改完了重启发现报错“X86PlatformPlugin::configResourceHandler - Failed to set ring table!”。这个问题是什么导致的暂时不清楚,也不影响使用就是。

系统设置

生成合法的smbios.plist,在org.chameleon.Boot.plist中加入EthernetBuiltIn=Yes后,iCloud、App Store和iTnues均可正常登录。

iMessage不能登录的问题,装Chameleon v2.2 trunk或Chimera v2.0,在modules中放入FileNVRAM后即可。

系统默认的休眠方式是Ram+Disk,桌面机可以改成纯Ram:

sudo pmset -a hibernatemode 0
# Ram+Disk是3,纯Disk是5

sudo nvram “use-nvramrc?”=false

sudo rm /private/var/vm/sleepimage

2013年1月14日星期一

Twitter on iPhone

我没花钱买,所以这两天某免费vpn两分钟一掉线我没什么资格可以抱怨。只是重连又重连之后,我还是差点抓狂了。

gfwinterceptor不支持ios5,birdnest试过了不能用,gtap的代码也需要更新了,于是转过身去,再次张口找某人要twip…

(顺便看了下,某人曾经帮我弄的opera mini proxy也还在,感恩啊~)

话说,现在的twitter越来越敖娇了,尤其是api方面,对第三方很不友好的样子。而ios号称有多少多少应用,可即使连twitter客户端这种东西,一旦加上支持api这一条后,连提供完整体验都变成了一件很困难的事…

(fring不用试了,收不到注册短信。flipboard也不用试了,中国版已从良,无法添加twitter内容。seesmic、echofon都不用试了,不能设置api代理。)

(以下内容均基于twip4,ios v5.1.1。)

Twitter v5.2

官方客户端,按说哪怕不大好用,可提供了的功能总应该都可以用吧?你错鸟。

添加帐户时,配合o模式可免爬墙完成验证过程。程序大部分功能都正常,只有“发现”分页中会提示“更新发现时出错”,并且搜索推文功能也不能用,搜人倒是可以找到。

虽然发推时@没有联想功能,私信明显也被当成二等公民看待,不过作为官方客户端,UI设计还是挺不错的,而且最重要的是push功能正常。如果仅只是作为和朋友联系用,将就吧。

Tweetbot v2.0

能不能用都不知道,我就先随便在cydia里找了个。UI和音效嘛,的确挺有意思的,不过喜欢不喜欢就见仁见智了。程序本身并不支持设置api,所以还得从cydia里装一个叫Tweetbot API的东西。也就是说,不越狱是用不了的。

api地址仍然只能设置一个,很意外的是Tweetbot内部的功能几乎都能用,包括搜索在内。不过push打不开,不知道是我没付钱的关系,还是Tweetbot的服务器出了什么问题。

要是push其实是能用的,且喜欢那个UI的话可以考虑买,¥18。

Twitbird v2.8.1

添加帐户时必须要爬墙,可以设置search api代理。Mentions、Favorites、Following Lists均刷不出来,UI设计得复杂且难看,不值一用…

2012年6月23日星期六

Homemade RaySource

好吧,我们都知道fs2you链接长什么样,自然也看得出来,fs2you://后面的部分,其实是经过Base64编码的字符串。

比如:

fs2you://Y2FjaGVmaWxlMzIucmF5ZmlsZS5jb20vemgtY24vZG93bmxvYWQvYjI3ODI1NzQ2YjgxOWYyMmY1ZGY0ZTFkNTE0NDFjNmQvJUU3JTk0JUIwJUU0JUI4JUFEJUU4JThBJUIzJUU2JUEwJTkxLnJhcnwxMjkyMTEzOQ==

经过解码,可以得到:

cachefile32.rayfile.com/zh-cn/download/b27825746b819f22f5df4e1d51441c6d/%E7%94%B0%E4%B8%AD%E8%8A%B3%E6%A0%91.rar|12921139

竖线符分隔的第一个部分看起来是一个URL,第二个部分则是文件尺寸。有时候竖线符有两个,第三部分是另外一个文件名。通过抓取客户端RaySource的数据包,可以验证以上猜测。

GET /zh-cn/download/b27825746b819f22f5df4e1d51441c6d/%E7%94%B0%E4%B8%AD%E8%8A%B3%E6%A0%91.rar HTTP/1.0
Host: cachefile32.rayfile.com
Accept: */*
Referer: 
Cookie: 
User-Agent: Grid Service 2.1.10.8366
Grid: aWQ9nc3JxpnLys4mcF9udW09MCZkX3NwZWVkPTA=
Range: bytes=0-262144

Grid又是一个Base64字符串,解码后的内容是:

"id=\x9D\xCD\xC9\xC6\x99\xCB\xCA\xCE&p_num=0&d_speed=0"

id均为8个字节,当成GBK字符解码,可以得到四个看起来像天书的中文。p_num可能是process,同时下载多个文件时会有不同的值。s_speed有可能是当前的下载速率,可我想不出为什么服务器会对这个数值感兴趣。

经验证,构造一个类似的HTTP请求,可以用别的下载工具获取文件,比如:

curl --verbose --remote-name --user-agent "Grid Service 2.1.10.8366" --header "Accept: */*" --header "Referer: " --header "Cookie: " --header "Grid: aWQ9nc3JxpnLys4mcF9udW09MCZkX3NwZWVkPTA=" --header "Range: bytes=0-12921138" "http://cachefile32.rayfile.com/zh-cn/download/b27825746b819f22f5df4e1d51441c6d/%E7%94%B0%E4%B8%AD%E8%8A%B3%E6%A0%91.rar"

正常情况下,可以得到一个206响应。只要一切正常,即可直接下载到目标文件。不过就像大家都知道的那样,网络是很不靠谱的。当下载时遭遇断线,构造正常的Range头,如“Range: bytes=1234-12921138”并不能断点续传。

关于这个问题,抓包并没有太大的帮助。RaySource发出的请求中,Range的两个数字除了0和文件的实际尺寸外,均为256KB的正整数倍,且整个Range不超过5MB。嗯,这也太奇怪了点儿。

通过各种尝试,我发现有时候Range的起始值可以是不大于文件尺寸的任意数,且只要Range不大于8000000,也可以获得服务器正确的响应。不过这个有时候,具体是什么情况,我也说不清楚…

嗯,基本上目前就是这样,问题依旧没有解决的说。

2010年1月4日星期一

初尝黑苹果

最近手上多出来一块160G的硬盘,拿来干什么都太小,突然想起来还有黑苹果这种东西,正好对传说中Windows的GUI+Linux的Console很有兴趣,于是装上试了试。

手上没有刻录机,安装过程参考了远景论坛的这张帖子,基本没有遇到太大的问题,不过一些小地方还是耗费了不少精神。

Boot Think 2.3.18在OS X中安装至MBR无法引导,Chameleon 2.0 RC4虽然可以安装,但是有部分KEXT又会无法加载。最后索性多分了一个区装上Windows XP,把Boot Think放在Windows分区上。反正现在用的Windows 7也有部分软件表现不良,就当备用吧。

驱动方面方面,我用了如下这些KEXT:AppleNForceATA、ElliottForceLegacyRTC、fakesmc、NullCPUPowerManagement、OpenHaltRestart、PlatformUUID、VoodooHDA。

DSDT.aml虽然可以解决很多问题,可是需要针对不同主板不同BIOS版本进行修改,而网上的文档很杂乱,那个ACPI Patcher又很不好用,再加上找到ElliottForceLegacyRTC这个KEXT解决了BIOS Checksum Error的问题,所以我还是放弃了。

显卡驱动一开始用的是NVEnabler,可是总觉得中文小字体的表现很糟糕,颜色很淡又很模糊。找了一个EFI Studio生成显卡的EFI String,写入Boot Think的Darwin目录下的com.apple.Boot.plist(如果是com.apple.Boot__.plist,则改名之),感觉似乎稍好了些。

Update:关于中文字体颜色太淡的问题我已经放弃了。喜欢折腾的人去看看这个文件:/System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreText.framework/Resources/DefaultFontFallbacks.plist,这是设置默认字体的地方,跟Linux的fontconfig差不多。另外还有:defaults -currentHost write -globalDomain AppleFontSmoothing -int 1,取值1、2、3分别代表渲染度由淡至浓。

AMD的CPU还需要用Marvin's AMD Utility生成CPUID的补丁,引导至单用户模式(参数-s)打上补丁才能用iTunes和QuickTime。点菜单栏上的“关于本机”强制注销的问题,装上AppleSMBIOS和AppleSMBIOSEFI两个KEXT可以解决。

XCode 3.1.4在10.6下貌似有问题,装完以后/usr/bin下并没有gcc等东西,重下一个XCode 3.2之后问题解决。不过System Tools在AMD CPU的机器上不能装,会五国。(装上了也没关系,-x引导安全模式,运行/Developer/Applications/Performance Tools/CHUD下的CHUD Remover即可。)

安装部分大致就是这样,虽然启动有些慢(怀疑是AppleNForceATA的问题,可找不到可以替换的KEXT),不过已经完全可用了。感觉黑苹果的破解程度还是颇高,即使当成日常使用的系统,也完全没有问题。

至于使用感受,下次有精神再说吧……

Update:关于Boot Think无法引导Grub2(Ubuntu等)的问题,用任意一个十六进制编辑器打开Darwin/rc/grubloader2,搜索“menu.lst”,全部替换为“grub.cfg”即可。

2009年9月19日星期六

小改ImageZ

从网上抓图,Imagez是个很不错的程序。可是在该程序在选择保存目录的时候,无法设置起始目录,也不能直接输入已存在路径,只能从我的电脑开始一级一级点。虽然官网上说0.7Final会提供该功能,可一年半后的现在版本号都0.82了却仍然没有兑现,说不得只好自己想办法了。

选择目录的API函数是SHBrowseForFolder,通过LPBROWSEINFO的pidRoot和ulFlags两个成员可以实现我上面说到功能。pidRoot没办法,ulFlags只需要加上BIF_EDITBOX即可,这倒是可以动动脑筋。

用UPX解压后再用FileInfo查看可得知,ImageZ是用VB6写的。而VB6调用外部API都是动态载入DLL,用W32DASM静态分析会比较困难,所以还是请出大神OllyDbg。

在OllyDbg中打开ImageZ.exe,F9执行。Alt+E,找到shell32双击。Ctrl+N,找到SHBrowseForFolderA,F2下断点。切换到ImageZ窗口,点击保存按钮,跳回OllyDbg。按Alt+F9执行到用户代码,再切回ImageZ取消掉选择目录的窗口。

0042AE69    894D BC         mov dword ptr ss:[ebp-44],ecx
0042AE6C    C745 CC 4100000>mov dword ptr ss:[ebp-34],41
0042AE73    E8 20A8FEFF     call ImageZ.00415698
0042AE78    8B1D B0104000   mov ebx,dword ptr ds:[<&MSVBVM60.__vbaSetSy>; MSVBVM60.__vbaSetSystemError
0042AE7E    8BF8            mov edi,eax

0042AE6C这一行就是我们要找的东西,其含义为将ulFlags设置为41。光标移动到这一行,按空格,将41改为51。鼠标右键,“复制到可执行文件”,在弹出的窗口中右键,保存。

好久好久没弄类似的东西,手好生的说。

Update 18:03 2009-11-3:

ImageZ 0.82p2中改用GetOpenFileName选择文件夹,虽然提供了设置初始目录的功能,但仍然不允许手工输入目录,也不能记忆上次选择的路径,真不知道作者究竟是怎么想的。

定制GetOpenFileName对话框的外观无法通过修改OPENFILENAME结构体的成员来实现,必须要挂一个消息钩子处理WM_INITDIALOG,向需要隐藏或修改内容的控件发送CDM_HIDECONTROL、CDM_SETCONTROLTEXT等消息,所以断点需要下在SendMessage上。

大概的修改过程都跟上次的差不多,以下是我找到的代码:

0045B6AE   /0F85 28010000   jnz ImageZ.0045B7DC
0045B6B4   |8D4D A0         lea ecx,dword ptr ss:[ebp-60]
0045B6B7   |895D A0         mov dword ptr ss:[ebp-60],ebx
0045B6BA   |51              push ecx
0045B6BB   |68 7C040000     push 47C
0045B6C0   |68 69040000     push 469
0045B6C5   |57              push edi
0045B6C6   |E8 5565FBFF     call ImageZ.00411C20
0045B6CB   |FFD6            call esi

CDM_HIDECONTROL的值为0x469,所以0045B6C0这一行就是我们要找的东西了,将该行以及其下共5行push 469改为push 0即可。

2009年5月28日星期四

AMR Plugin For Winamp & foobar2000

好吧,我快要叛变了。又写了个foobar2000的AMR插件,下载链接等在文末。

KMplayer就可以放AMR,但启动太慢了。foobar2000早就有相关插件,问题是歌词外挂支持不良。惦记了很久Winamp的AMR插件一直没出现,今天终于自己写了一个。

(从*UIX系统来的不算,命令行工具不算,Winamp是我现在还常用的辈分最老的程序了,总觉得有那么点英雄迟暮的味道。)

AMR由rfc3267定义,网上最容易找到的实现是3GPP发布的3GPP TS 26.104(AMR-NB)和3GPP TS 26.204(AMR-WB)。

由于写这个插件就是为了播放手机录制的音频文件,而手机录制的音频文件全部都是AMR-NB IF1格式,所以这个插件目前只实现了AMR-NB IF1的解码功能。ETSI和IF都没有文件头,应该不是设计给独立文件用的。至于AMR-WB,以后遇到了再说吧。

AMR-NB IF1格式很简单,头部为6个字节的标识信息"#!AMR\n",余下部分为若干个frame。每个frame第一字节的前4位决定了frame的字节长度(包括首字节),如1表示13,2表示14,3表示16,有个表可以查。

AMR-NB的目标码率只有一种,8kHz、13bit、单声道。而且每frame表示的数据量也是一定的,即160次采样的数据,20ms长。

因为AMR-NB格式没有任何的索引信息,所以不扫描整个文件就无法得知文件时长,这也是KMplayer播放AMR-NB时为什么不能拖动的原因。

Winamp - in_amr_v0.1_20090902.zip

Google Drive
OneDrive

foobar - foo_input_amr_v0.4.0_20220901.zip

Google Drive
OneDrive

2022-9-1 oAMpF v0.4.0
Update with SDK v20220810
Tested with fb2k v2.0b3
Add x64 support
2017-9-18
Box的下载链接挂掉了,换成了Google Drive,也不知道能用多久…
2012-8-13 oAMpF v0.3.1
增加单声道AMR-WB支持,改了几个bug。
2010-9-24 oAMpF v0.2.1
忘记具体改了什么,好像是一点bug的说。这一版的foobar插件已经比较完善了,起码我自己用没遇到什么问题。
2010-4-15 oAMRpF v0.2
基本功能跟Winamp版一样,多了示波功能
AMR-NB IF1最后一个frame的实际长度有可能小于应当值,不知道合不合规范,懒得查了
2009-5-28 oAMRpW v0.1
支持AMR-NB IF1格式
可拖放,可显示文件时长
播放损坏的文件时可能crash
不支持Winamp示波器及相关插件

2009年2月20日星期五

尝试IE8 RC1

其实前不久才升级了IE7,但因为CSS Filter导致ClearType强制关闭的问题,我又不愿意挂上GDI++,一直用得不太舒服。这几天看到IE8 RC1发布的消息,虽然有评测说IE8内存占用率很高,但想想用Maxthon应该影响不大,于是就装上试了试,感觉变化还蛮大的。

UI有变漂亮一点,菜单上多了很多Icon。“管理加载项”对话框Live风格明显,不过总觉得有点粗糙。内存占用似乎是比较高一点,但速度还不错。地址栏跟Chrome一样了,会突出显示顶级域名主体。

新增加功能方面。“加速器”(Accelerators)这个名字怪怪的,作用其实和BHO类似,叫Launcher或许还准确点。SmartScreen的作用机制不明,如果跟IE7反钓鱼功能类似,那其实没什么用。InPrivate隐私保护模式开启时,Cookie、历史纪录、Internet临时文件等内容不会被保存,工具栏和扩展也会被禁用。简而言之,都没多大用处。

比较实在的变化都在最终用户看不到的地方。IE8增加了一个看起来很强的调试工具,随便试了试感觉蛮好用的。JScript和VBScript更新至v5.8,内置了JSON对象,XMLHttp可以处理Timeout事件,以及一个新增的跨域访问对象XDomainRequest。尤其是XDomainRequest,如果Mozilla和Chrome等不跟进的话,网页设计师会很挣扎吧,真是命苦。

接下来就是我比较关心的部分。IE8有三种渲染模式,分别是IE5 Quirks模式、IE7 Strict模式和IE8 Standards模式。为了兼容IE6时代的网页,有一个Quirks模式好理解。但IE7自2006年10月发布至今不到3年,其造成的兼容性问题竟然也需要一个独立的Strict模式来解决,真是有出息。

默认情况下,IE8使用DOCTYPE来决定使用何种渲染模式。下表是不同DOCTYPE时,document.documentMode属性的值,5表示Quirks模式,8表示Standards模式。

Empty 5
<!DOCTYPE HTML> 8
HTML 5
HTML 2.0 5
HTML 3.0 5
HTML 4.0 8
HTML 4.0 Transitional 5
HTML 4.0 Strict 8
XHTML 8
XML 8

如果想为特定页面指定渲染模式,需要在head标签里加一个meta标签,比如想强制使用Standards模式可以写:<meta http-equiv="X-UA-Compatible" content="IE=8" />

IE8的默认渲染模式是IE=EmulateIE8,即根据DOCTYPE判断使用Quirks模式还是Standards模式。类似的还有一个IE=EmulateIE7,目前的Maxthon中默认采用了该模式(可以在设置中勾选“启用 IE8 标准渲染模式”启用EmulateIE8)。

扯这么多,我想说的其实还是CSS Filter导致ClearType强制关闭的问题。在IE8的Quirks模式和Strict模式下,这个问题依然存在,Standards模式下倒是修复了。所以,针对有问题的网页,只要在广告过滤器里把<head>替换为<head><meta http-equiv="X-UA-Compatible" content="IE=8" />即可解决问题。

顺带一提,Standards模式字体渲染效果不错,包括过去一直存在的微软雅黑字体下划线位置错误的问题也一并修复了。

2009年2月5日星期四

禁止WLM自动运行

Windows Live Messenger在每次登陆Live.com的时候都会自动运行,很烦人。网上多方寻觅不得其解,只好自己写办法。

用IE浏览某个网站就执行一个本地程序,怎么想都是ActiveX最可疑。经过尝试,在IE菜单栏中选择“工具”、“Internet选项”,“程序”页中点击“管理加载项”,禁用下图红框中的Windows Live项目即可解决问题。

经过如上设置,用IE登陆Live.com时Messenger是不会自动运行了,但Maxthon或TheWorld却还是照旧。IE中禁用的项在Maxthon中却可以加载,不知这算不算是一个Bug。

试了试直接将“C:\Program Files\Windows Live\Messenger\msgsc.14.0.8050.1202.dll”改名,但一运行WLM就会修复。只好用老办法了,直接屏蔽,将下述内容导入注册表即可:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{E1771B7F-98BE-407F-BA67-AA16ADA5D0C5}]
"Compatibility Flags"=dword:00000400

ActiveX Compatibility项目就是一众“IE插件免疫”工具用到的注册表项,将对应CLSID项中的Compatibility Flags设置为1024即位禁用,改为0则为启用。

Update:

想了想,如果要在Maxthon内部屏蔽该控件应该也是可以的。在JScript中调用ActiveX控件,必然要传递ProgID参数建立ActiveXObject对象,那么只要将注册表里查到的"MSNMessenger.Hotmail2Control"替换为空字符串就行了。

2009年1月30日星期五

IE7中ClearType自动关闭的问题

我的系统是Windows XP,装上了微软雅黑并打开ClearType。前些日子更新了IE7之后,很快我就发现,有很多页面(如百度空间)上的雅黑中文显示不正常,发虚,很模糊,而英文却又全是锯齿,总之没法看。

拜了Google大神,都说是IE7默认打开了ClearType导致中文发虚,可我这里的问题明明是ClearType被关了才会这样。小白太多,把Google都淹了,于是只好靠自己。在百度空间上随便找一个页面保存下来,一点一点找,总算是确定了问题所在:“FILTER: none”和“ZOOM: 1”。

有了关键字才好Google。IEBlog上有一篇《Notes on the interaction of ClearType with DXTransforms in IE7》,说是启用了filter就会强制关闭ClearType。《IE 透明度失效和 zoom:1 有關?》还提及,会出问题的还并不仅仅是ZOOM。

问题找到了,但在IE7内部似乎没办法解决。不过还是有一个曲线救国的法子,那就是用GDI++。GDI++是一个日本人开发的字体渲染工具,借助他可以把Linux下的FreeType2搬到Windows里边用。既然渲染引擎都被换掉,ClearType关不关也就无所谓了。

在GDI++日文WIKI上找到并下载gdi0850.zip和gdi0869.7z,解到同一个目录,然后用这样的命令启动IE:"gdi++.exe" "C:\Program Files\Internet Explorer\iexplore.exe"

下图中左边的窗口是ClearType被强制关闭的效果,右边是使用GDI++后的效果:

GDI++早已停止开发,但因为其是开源软件,所以有很多修改版,有点乱。有兴趣的话就去拜Google大神吧,这东西会很是需要一番折腾。

用了一段时间IE7,感觉也没有找到值得升级的理由。IE7不比IE6快,增加的功能我也不需要,问题还比IE6多。至于说标准,时至今日IE6还有20%以上市场占有率,有人敢无视?未来会有IE6被淘汰的一天,但显然不是现在。

2009年1月11日星期日

Tips of Chrome

目录

最近一直在用Google Chrome,下面就是我遇到的一些问题及解决方式。这一篇应该会持续更新吧……

如何获知Chrome的更新信息?

Chrome的更新信息都可以在Google Chrome Releases Blog上看到。

有时一些微小更新并不会导致版本号变化,如修正了Hotmail和Yahoo! Mail问题之后的Chrome仍然是1.0.154.46版。如果想及时了解Chrome的更新信息,就订阅吧。

如何下载Chrome的离线安装包?

从Google Chrome主页上只能下载到在线安装包,需要一次部署到多台计算机,或是想制作绿化版Chrome,就会有些麻烦。其实Google是有提供离线安装包的,地址如下:

http://dl.google.com/chrome/install/154.46/chrome_installer.exe

这是当前stable版本的下载地址,154.46是版本号后两位。上哪去知道这两个数字呢?Google Chrome Releases Blog。

如何制作可移动版(绿化)Chrome?

将安装文件下载回来,用7-Zip解压缩。Chrome-bin改名成Chrome搬到目的目录。将其中X.X.XXX.X(版本号)子目录下的文件都搬到上级目录,Locales目录下除了en_US和zh_CN都可以删掉。

右键点击chrome.exe,创建快捷方式。再右键选中刚才建立的快捷方式,选属性,在“目标”栏最后添加“--user-data-dir=Profile”就可以了。

如果要把Chrome装U盘里,则建立一个名为Chrome.bat的批处理文件,打开并写入“start chrome.exe --user-data-dir=Profile”。

如何获得未发布的最新版本?

Night Build,或者叫Latest Trunk Build,可以到这里(需翻墙)下载针对Windows编译的最新版本。Chrome有什么新特性肯定会最先在这里出现,但Bug也是,所以最好还是别用。

如何使用用户脚本(Greasemonkey)?

该功能只有v2.0以后才支持,在将相关选项做进UI以前,可以通过在启动参数中添加“--enable-user-scripts”打开该功能。

至于用户脚本的存放位置,2.0.156.1及之前的版本必须放到“C:\scripts”目录下,后续版本可以放在Profile目录的“User Scripts”子目录里。

播放Flash很卡怎么办?

真正解决问题,那得靠Adobe和Google,用户能做的除了等,其实也没多少。

短期内,个人建议是不用Chrome看Flash,有需要时单独开一个IE窗口来处理。删掉系统目录(system32)和plugins下的NPSWF32.dll文件,打开Chrome目录中的chrome_plugins_file.xml并删除Flash相关段落,这样至少可以保证Chrome流畅运行。

在v2.0正式发布以后,通过用户脚本应该也可以解决一部分问题。但考虑到用户脚本的运行机制,具体效果怎么样,还是要等到时候看。我有在v2.0预测试版中尝试过,发现对embed和object标签设置display:none都没作用,就懒得继续折腾了。

如何过滤广告内容?

Google就是一个很大的广告商,对广告过滤不积极很正常,所以Chrome未来也未必会加入官方的广告过滤功能。使用用户脚本进行过滤并非不可能,但是会很麻烦。想要简单方便的广告过滤,恐怕要等Chrome正式加入第三方插件机制以后了。

如果现在就要广告过滤的功能,也可以通过安装第三方程序的方式来实现,实际上在各家浏览器提供自己的广告过滤解决方案之前,就早已有这样的程序存在了。

目前Windows平台上的广告过滤程序所采用的技术大概也就两种,即Winsock和Proxy。前一种的典型代表是Ad Muncher,而后一种则有Proxomitron和Privoxy等。

采用Winsock技术的广告过滤软件不需要对浏览器进行设置,而且这类软件大多是为普通用户开发,易用性方面会更好些。而Proxy类的广告过滤软件其实就是架设在本机的代理服务器,这类软件的功能通常都更为强大,但也更复杂。

我个人用的是Privoxy,因为配置代码看起来比Proxomitron要直观些。而且翻墙需要Tor,Proxomitron又不支持Socks4a的代理,虽然两个可以串起来用。

如果不懂正则表达式、英文比我还烂,就用Ad Muncher吧。

如何修改书签图标?

如Post to Delicious一类的书签,由于其内容只是一段Javascript脚本,通常情况下只会显示为一个蛮难看的图标。想改也不是不成,就是有点麻烦。

(不好意思我懒得截图了,如果看不明白下面这些说的是什么,就别折腾了的好。)

以下内容适用于v1.0.154.42,后续版本或许会有变化。

首先用Chrome访问目的网站,如delicious.com。待页面加载完成,并正确显示了Delicious的图标后,关闭Chrome。

用文本编辑器打开“Profile\Default\Bookmarks”,这里就是Chrome保存书签的地方。文件格式应该是Javascript吧,不过没有可以指定icon的地方。找到想要修改icon的书签,记下url。

Chrome中很多数据,例如Cookies等,都是以Sqlite格式保存的,而历史纪录则是在“Profile\Default\History”文件中。去下载一个SQLite Database Browser,用该程序打开History数据库文件。

点“Browse Data”选项卡,在Table下拉菜单中选中urls表。这里稍微解释一下数据结构,url和title字段不需要多说,favicon_id字段就是用来确定该url用哪一个编号的icon来显示。若favicon_id为0,则使用默认图标。

点包含了表名称的下拉菜单后面的放大镜,字段选url,运算符选contains,在下面的文本框内输入delicious,点Search。窗口下部的列表框这时会显示出url字段中包含delicious的所有纪录,记住纪录的id,例如165,关闭该窗口。

在数据浏览窗口里往下拉,找到第165条纪录。该纪录的favicon_id只要不为0,那就是我们需要的数字了,比如13,记下来。(SQLite Database Browser每次只载入1000条纪录,如果你的历史纪录很多,可能会需要先翻页。)

点New Record(我这里遇到了点问题,不能新建纪录的话,随便把一条不重要的改掉也可以。),将url改为Bookmarks文件中找来的地址,例如:

javascript:(function(){location.href='http://delicious.com/save?url='+encodeURIComponent(window.location.href)+'&title='+encodeURIComponent(document.title)+'&v=5&jump=yes'})()

title随意,Post to Delicious好了,其余的都可以照猫画虎,只要把favicon_id改为刚才找到的13。

保存数据库并关闭,去Chrome里看看吧。

如何查看缓存文件?

直到2.0版Chrome也没有内建缓存查看功能(其实有一个about:cache,可Geek过头了),需要借助第三方程序如ChromeCacheView。

2009年1月10日星期六

Chrome 2.0 预测试版发布

1.0正式版发布没多久,2.0 Pre-Beta版就来了。2.0.156.1版下载地址。

新闻提到的新功能:

自动完成:
似乎不是谷歌输入框里的那种,倒是有根据历史纪录提示URL的功能,可我也不确定是不是新加的功能。比如访问过我的blog,打个“幺”会提示出访问过的所有Title包括“幺”的地址。
页面缩放:
Ctrl+“+”放大,Ctrl+“-”缩小,Ctrl+“0”还原,还不错,不过只能通过键盘操作。
自动滚动:
按鼠标中建,也就是滚轮,上下左右移动就行,没什么用。
简易切换配置文件:
命令行参数--user-data-dir=PATH的菜单版。
支持Greasemonkey脚本:
早就说要加上的功能,说不定Chrome以后的插件指的就是用户脚本了(跟Opera一样),也是驱使我尝鲜的原因。

Update,发现两个bug,问题还都不小:

  • 中文输入法不能实现光标跟随,起码搜狗拼音不行。
  • HTTPS访问Reader,提示“您到www.google.com的连接未加密”,新浪等BSP的图片无法显示。

其实我以前没留意,1.0.154.42同样提示连接未加密,但看图是没问题的。为了验证,我又找来了latest trunk build(需翻墙),版本号是2.0.157.0(7878)。这次提示信息是对了,但新浪等BSP的图片还是无法显示。

HTTPS页面引用的元素也发送了Referer?或许跟新实现的HTTP协议代码有关吧。反正这个问题不修正,新版Chrome就没法用……

Flash支持似乎有变好一点,不过因为上面提到的两个问题,我也没动力继续试下去了。其实只要支持用户脚本,实现一个类似Flash Block之类的东西也不困难。


当前版本启用用户脚本功能,需要手动添加命令行参数。修改Chrome的快捷方式,在“目标”栏最后添加“ --enable-user-scripts”即可。

用户脚本放哪,我是翻墙跑到Chromium开发者站才知道的。当前版本得放到“C:\scripts”,以后可以放在Profile目录的“User Scripts”子目录里。

正好前几天才念叨,Google Reader不能显示Feed自定义Icon,找来Google Reader: Show Feed Favicons,效果如下:

2007年4月6日星期五

令人失望的谷歌拼音

头一回见到“谷歌”这名字,不是在网络上,而是在《经济观察报》上看到的平面广告。虽说无肉使人瘦,可那占了整版的水墨竹广告,还是让我觉得很俗气。一种说不清的感觉,味道不太对。之后,“Google”还是google.com。反正cache一样不能用,gmail、gtalk也没变成谷歌邮、谷歌通,我找不到任何改变习惯的理由。

看报纸、看杂志、看网站,“本地化”这三个字看得实在有点腻味。感觉那是说给上司听的,说给政府和股民听的。反正只要不撞墙,不管是Google中文还是谷歌,不管服务器和公司注册地是在美国还是中国,对我来说也没多少区别。不过关心还是要关心的,毕竟是几乎天天用到的服务。起码,也可以当娱乐版来看。

这不,传言了大半个月的谷歌输入法真的放出来了,各处讨论又是一派热火朝天的景象。这个热闹一定要凑,我尝试从智能ABC换到搜狗拼音,还在磨合期中,是经不起什么诱惑的。可惜用了一小会,感觉就跟看见那幅广告时一样,味道不对。

谷歌拼音跟搜狗拼音,实在太像了。后来者的谷歌所提供的功能,几乎就是搜狗拼音的一个子集。抄袭或许还谈不上,毕竟后来者借鉴前辈是很正常的事。有很多功能,也未必是搜狗独创。但即便这么想,我也没办法对谷歌这次拿出来的东西,赞一个好字。

谷歌拼音比搜狗拼音多出来的功能有三个。“一键搜索”无非又一个谷歌工具栏,没什么用处。“网络同步”虽然是一个好主意,可也没什么特别的。让我眼前一亮的,只有“英文提示”而已。像我这样英文不好记性又差的人,是挺喜欢有个人能帮忙提示一下的。

可是,拼音输入法是用来输入中文的。谷歌的这几个“创新”,无一与“输入法”的核心功能有关。输入法真正该干好的事情,谷歌拼音却未必做得有多好。

中国人一样要用到英文,谷歌显然意识到了这一点,可“英文”并不等于26个小写字母。试试“v/etc”?“/”键根本就没反应。再试试“vUser-Agent”?上屏的就是“vUser-Agent”,包括前面的那个v。

中文多音字非常多,也因此才发展出了以词定字和拆字辅助码的功能,谷歌拼音目前却一概欠奉。靠“智能组词”解决多音字问题?别开玩笑了。除非谷歌不想做输入法,否则这个功能肯定会加上的。

让他我对搜狗拼音深恶痛绝的错词错音就更不要提了。以搜狗拼音Blog上一篇《每周错词总结》为例。捅漏子、胡涂、倘徉、份量、忿忿、伏输、伏罪、蝴碟、希罕、旁徨、余辉、直接了当,17个错词谷歌拼音有12个。“pingzhuhuxi”出来的是“屏住呼吸”,“bingzhuhuxi”出来的是“摒住呼吸”。“张柏芝”是“zhangbaizhi”,“zhangbozhi”居然是“张伯芝”。

keso说:“用市场创新去代替技术创新,最终可能给竞争者留出机会。”这话我同意,所以“搜狗酷字”之类的功能我也不喜欢。但“放弃搜狗拼音,是因为他们在取得最初的成就之后,过早地将注意力放在了‘换肤’这种噱头上”则不然。与吸引小男生小女生的“换肤”相比,“一键搜索”有的只是铜味。产品品质还差人家一大截就开始惦记自己的流量,又是谁比较不可期?

2007年4月4日星期三

病毒之后

究竟是31号还是1号中的毒,我也不记得了,总之这是个蛮特别的愚人节。感觉,有一点复杂。

虽然裸奔习惯的确不好,可这次事件我就算装了什么病毒监控也一样没用。有人提到说他25号就已经中毒了,那离我在网上找寻解决办法至少有五天。如果是我花了钱,买了一套杀毒软件,却发现不但没有尽到保护责任,反应速度还这么慢,那种感觉肯定很糟。一众杀毒软件商们,看来也就这样了。

在刚发现感染病毒的时候,我并没太当一回事。利用了Windows的新漏洞是挺先锋,可病毒本身并没什么特别的。实际上我用Ruby写的清除程序原始版本,只有50来行。包括分析病毒行为和写代码在内,也不过三、五个小时。

不但如此,我甚至还觉得有一点好玩。毕竟我自己的机器几乎没中过毒,该病毒修改可执行文件的手法也不邪恶,所以刚开始也就没有感到作者很恶意。而且病毒试图在hosts文件里屏蔽的那些网站,都不是什么好去处。过招谈不上,似乎是一种交谈的感觉。他给我弄了点小麻烦,可摊子还没烂到无法收拾。只可惜后续的发展,让事情的味道有了些变化。

先是有很多人在我那篇《遭遇Sysload3.exe》里留言,好像认定了我会放出一个“病毒专杀软件”出来一样。我本来只是想弄个rb2exe,帮帮找到我这里来的人而已。可是留言的人不止一个两个。控制台?命令行?想想也知道那对普通用户来说意味着什么。

既然能帮到那么多人,那这件事就不能不管。而且当时在Google里搜索sysload3.exe,我这里排在搜索结果第一位,就更确定了我的想法。于是去下了一个VB6精简版,花了一个晚上写出第一个版本的rmsl3.exe。真的很久很久没用VB6了,手很生。现在让我写VB6的代码,肯定不太舒服,但怀念的感觉倒是蛮真实的。

为了尽快放出程序,导致界面很简陋,功能也不完善,所以我写了个尽可能详细的说明。用户环境千差万别,没经过什么测试,就对硬盘里成百上千个文件进行读写可不是闹着玩的。我注明了不要随意转载,因为我不想自己写的代码给任何人带来损失。不过还是有人转了,说明也有,就一句话,还有一句对作者的感谢。

我没有责怪那位转载者的意思。在找不到解决办法的情况下发现我的程序,恐怕我说什么都值得试一试。转载如果能帮到更多的人,当然也不违背我的本意。可我仍旧有一种沟通困难的感觉,是理念和角度的不同,还是单纯太毛躁?或许我也不该这么谨小慎微,该对自己的代码更有自信才对。

至于病毒本身和其作者。因为我赶着写程序,直到第一个版本完成了,我才发现这个病毒会篡改php、html等文件的内容。如果跑IIS的Web服务器感染了这个病毒,那可真是一次撂倒一大片。这个发现,让我对病毒作者的感觉有了很大变化。

实际上并不是所有的病毒都只干“坏事”,像CIH那样的毕竟是少数。有些病毒只是占你一点硬盘、耗你一点内存,甚至还有帮你杀其他病毒和堵系统漏洞的病毒。虽然这种未获许可的行为仍然不具有正确性,可我宁愿认为这是高手们的“调皮”。多多少少,我能体会这种感觉。

可是这个病毒篡改php等文件的方法是直接覆盖。这与感染可执行文件的方式不同,是没有办法恢复原始内容的。数据无价,硬盘坏了“想死的心都有”,这话我听过很多次。我认为这是界限,所以“调皮”变成了“恶意”,我甚至有那么点失望的感觉。

不管怎么说,今年的愚人节早就过了。我想这个病毒的作者,应该也看不到我这篇东西。目前rmsl3.exe已被下载了70来次,Google里“sysload3.exe”这个关键字的搜索结果,前三页都没有我的链接,大概不会有多少人找上门来了。所以,这件事情可以告一个段落了。

2007年4月1日星期日

遭遇sysload3

因为机器比较老旧,我一向都是裸奔,下了什么东西运行以前,顶多用AVPDOS32扫描一下。这的确不是一个好习惯,以下就算是一个教训。

事情是这样的,昨天找了几个PS2相关的软件,就发现系统不太正常。执行一些控制台程序,例如ruby.exe、lftp.exe、grep.exe等,会弹出一个新控制台窗口,隐隐觉得不对。打开任务管理器一看,有若干个notepad.exe和iexplore.exe进程。可我当时一个记事本都没打开,肯定有问题。

查看系统启动加载项,发现了诸如iexpl0re.exe、c0nime.exe、winlog0n.exe之类的东西,显然是中木马了。我首先想到的就是360安全卫士,奇虎从良以后这个产品的口碑还是不错的。下载运行,查出了两个恶意软件cmdbcs和upxdnd。强制停掉进程后修复,并把加载项及其指向的文件全部删掉后重启,这下360报告没有找到恶意程序了,可事情还没完。

我上了一会网后还是觉得不对,因为硬盘莫名其妙响了一阵。打开任务管理器,又是若干个notepad.exe和iexplore.exe,注册表的情况也一样,那些木马又都回来了。因为重启以前我仔细检查过,所有的自动加载项和系统服务应该都没有问题。这说明木马并不是在系统启动时加载的,而且这次重启后我并没有运行任何可疑的程序。看来我遇到的并不仅仅是木马那么简单,很有可能是一个会感染可执行程序的病毒。

正好早就听说有款叫“驱逐舰”的杀毒软件用了俄国大蜘蛛Dr.Web的引擎,资源占用很少。下回来之后才发现用网上流传的序列号可以安装,但无法升级病毒库,还得用专门的第三方升级工具才行。早知如此我就下试用版了,反正可以用一个月。这是题外话,以后再说。

用驱逐舰扫描后发现了很多可疑文件,病毒名称为DLOADER.Trojan,括号说明“智能启发”。资料里说,所谓“智能启发”就是查找未知病毒的功能。可麻烦的是,如果选择清除病毒,驱逐舰会把可疑文件整个删掉。我硬盘上被感染的文件不止一个两个,如果全删等于是完完全全重作系统,那还不得累死。再尝试用最新病毒库的卡巴斯基来查,这回更是一无所获。八成是个新病毒,这些个杀毒软件都还没反应呢,只好死马当成活马医了。

想了想,Loader是加载器的意思,D要么是Double要么是Dll。从控制台程序会弹出一个新窗口执行看,病毒可能是修改了可执行文件,先执行了他自己的代码后再新开一个进程执行原始程序。挑了两个被感染的文件和原始文件对比一下,发现都多出了12808字节。如果只是单纯把两个可执行文件合并成一个,那感染文件里肯定有两个PE头。

确认的办法很简单,每个可执行文件头部都有一句“This program cannot be run in DOS mode”(不同的编译器不一样,这是VC的),搜就是了。果然,在偏移量0×3200找到了第二个PE头。0×3200是十进制的12800,试着把感染文件头部12800字节和最后的8字节去掉,与原始文件对比,相符。我应该是不需要重装系统了,松了一口气……

恢复文件有眉目了,顺带我还发现了些挺有趣的东西。这个病毒会调用IE去下载文件,这样至少能躲过防火墙。下载的目的文件是http://a.2007ip.com/css.css,这实际上是一个ini文件。病毒会根据这个文件的指示下载若干个木马,上面提到upxdnd和cmdbcs就是这么来的。还有一个http://if.iloveck.com/test/hos.gif,这是个纯文本文件,用来覆盖hosts,屏蔽若干网址。UpdateMe指向的是病毒文件,也就是说这个病毒是可以通过网络升级的。

最有趣的是还是tongji那一行,这一行指向http://if.iloveck.com/test/tongji.htm。这是一个html页面,调用了CNZZ.com的统计代码。每一台被病毒感染的机器都会用IE调用这个地址,包括IP、系统版本、浏览器信息等都会被记录下来。病毒作者给“网站”取的名字叫“安装率”,可惜阅读统计报告需要密码,不然我也想看看究竟有多少人中了他的招。

好了,说正经的:

  • 病毒原始文件名为sysload3.exe,长度12800字节,MD5校验99720C731D19512678D9594867024E7E。
  • 病毒程序被执行后,会试图添加启动加载项“System Boot Check”。
  • 可执行文件被感染后增加12808字节,头部12800字节,尾部8字节。病毒体长度不定,被感染文件尾部的8字节即为病毒体长度。
  • 到目前为止,卡巴斯基无法发现该病毒,驱逐舰虽然可以发现被感染文件,但不能清除。
  • 用360安全卫士删掉恶意软件,并将注册表中的木马加载项删除后,可清除掉病毒主体。但如果有被感染文件存在,一旦执行系统将再次被感染。
  • 打开360安全卫士的保护功能,当病毒进行注册表操作时会报警,可防止病毒被添加进系统加载项,这样能进行带毒操作。可我不清楚病毒代码究竟干了多少事,所以这不是个好主意。
  • 我不想一个个去试那些杀毒软件了,所以会尝试自己写一个清除程序。如果在看到这篇东西时兄台的杀毒软件仍然对付不了这个病毒,可以留言问问我。

Update

因为我似乎是网上第一个放出该病毒删除工具的人,因此这一篇也成为我写blog以来,访问和留言人数最多的东西。当时还有人跑来留言,为别的某些网站和论坛打广告拉人,想想也蛮有意思的。现在事件已经过去,问题也都解决了,所以这里不再提供我所写的病毒删除工具,同时把文字恢复到其本来的样子。

2007年1月31日星期三

如何在XP中使用微软雅黑

虽然观感是很个人的问题,但中易宋体的内嵌点阵确实要比微软雅黑来得清晰锐利。不过微软雅黑的意义在于实现了中文字体的ClearType和平滑缩放,这却是中易宋不能比拟的优势。看久了,大概也就习惯了吧。

目前微软雅黑的版本窜到了5.0,但仍有不小改进空间。文字大小参差不齐的情况依然。中文数字“一”在连续出现时会连在一起,如“一一解决”看起来就是个破折号。最难看的是标点符号部分,尤其是左右单、双引号,两对符号形状完全一样,只是略为靠左或靠右。

想在XP中使用Vista的字体,网上流传的方法大多不太完整,要不就显得太为暴力。这里提供一个较为全面的方案,除了尽可能安全外,还解决了如日文和韩文乱码等问题。

首先需要获得Vista的内置字体,简体中文的字体名为微软雅黑,还有繁体中文的微软正黑,日文的Meiryo,韩文的Malgun。这几个字体目前最新的版本都是v5.00,HuangYongTao在他的Blog上有提供下载。

以下是各字体的文件名、文件大小和CRC值,如果已经从其他地方获得了字体文件,可查阅一下自己的是否是最新版本:

Update

v5.0版的韩文字体Malgun在资源管理器中显示的字符偏小,与雅黑和Meiryo配合不佳,不是经常用韩文的人就别装了吧。

网上出现了很多雅黑的修改版本,如碧海潮声的“雅黑宋体”和“极限雅黑”,都宣称解决了若干问题。好不好看大家可以试试,只要不是直接替换宋体的方式,都可以用我这里的脚本来安装,就是字体名需要修改一下。

Windows 7中包含了v6.01版的msyh.ttf和v6.02版的msyhbd.ttf。这个版本解决了姓名连字符“·”显示为方框的问题,降低破折号笔画高度以示与中文数字“一”的区别(但“一一说明”中的“一”还是连着的),似乎也部分解决了在XP中撑大对话框的问题。不过我总觉得这一版字体的颜色变淡了,另外标点符号也没有变化。

v6版雅黑我找到了一个Rayfile下载地址,这是一个安装包,即使系统内已存在雅黑也可以完成替换。如果不放心,也可以用7-Zip打开并解压缩手动安装。我想其他字体在Windows 7中应该也有更新的吧,等找到再说。

文件名尺寸CRC
v6.0X
msyh.ttf(6.01)21,719,9805C83D8E6
msyhbd.ttf(6.02)14,602,860C861592C
v5.0
msyh.ttf15,044,4408954581A
msyhbd.ttf14,685,87641CDF7AB
v5.0
msjh.ttf14,713,704A634C5A2
msjhbd.ttf14,509,688E9DA1497
v5.0
meiryo.ttc7,815,29279FA7E43
meiryob.ttc8,054,096C386FBC6
v5.0
malgun.ttf4,337,10465B587BE
malgunbd.ttf4,513,520F1F5ED97

将获得的字体放入C:\Windows\Fonts目录即可完成安装。除了微软雅黑外,其余字体并非必须。这里多嘴说一句,虽然微软正黑体中也包含了简体字,但由于该字体是根据台湾教育部标准字形进行制作的,笔画标准会与大陆通行的有所不同。因此并不建议以微软正黑作为日常使用的字体,尤其是不应该给在校学生使用。

然后打开控制面板,显示、外观、效果,将字体边缘平滑设为“清晰”,这是为了打开Windows的ClearType字体描绘功能。确定后在“高级”中将所有能改字体的项目都改为微软雅黑,字体尺寸可维持不变。再在IE菜单上选工具、Internet选项,常规页上选字体,将网页字体设为微软雅黑。

经过如上设置后,系统的大部分内容都会用微软雅黑进行描绘了。如觉得显示效果还不够理想,可在绿色下载站下载ClearType Tuning进行微调。如果链接失效,在搜索引擎里找“字体清晰工具”也能找到下载链接。个人觉得用这个工具将雅黑的黑度增加一些,看起来比较不会累。

接下来的设置就需要修改注册表了,如果这对你来说有点困难的话,可以在本文最后下载我写的修改脚本。

运行注册编辑器,定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\GRE_Initialize,将GUIFont.Facename的键值改为微软雅黑。这一键值会影响部分通用GUI元素所使用的字体,例如按钮、记事本等等。

再定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink,新建一条名为“Microsoft YaHei”的多字符串值,将“gulim.ttc,gulim”和“MSGOTHIC.TTC,MS UI Gothic”以回车分隔写入。这里我懒得bq了,不明白的话参考同项中的Tahoma等字体的写法就知道了。

这一步类似于Linux中常说的字体替换,Gulim为XP附带的韩文字体。微软雅黑中并不包含所有的日文及韩文字符,如缺少了这一步,文件管理器中的日文及韩文文件名就会是方块。gulim.ttc和msgothic.ttc是XP附带的韩文和日文字体,当然也可以替换为Vista的Malgun和Meiryo。

如定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes,新建一个名为“宋体”的字符串值,并设置为“Microsoft YaHei”,可使系统在更多地方使用微软雅黑。例如登录界面中的“欢迎使用”四个大字,还有部分直接汉化EXE文件的程序。不过该方法仍然无法使系统全面使用微软雅黑,IE中还会出现宋体与微软雅黑相杂的情况,是否使用请自行选择。

另外还有HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Codepage下的932、936、949、950子键,这些子键控制了对应代码页下的默认文字字体,FixedWidthFont为等宽字体,ProportionalFont为矢量字体。936为简体中文代码页,可将对应键值改为微软雅黑。932是日文代码页,949是韩文代码页,950是繁体中文代码页。

最后是HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\International\Scripts下的23、24、25、26。这些子键控制了IE中声明了页面语言,但没有指定文字字体的页面用什么字体进行描绘,也就是对应繁体中文、日文、韩文的“默认字体”。实际上Internet选项中进行的修改,就是保存在这里。

以上这些就是我在注册表中找到的所有有关字体的设置。需要注意的是,即使进行了上述修改,也没办法做到使XP系统全面使用微软雅黑。因为只要该字体存在,部分在资源文件中指定使用宋体的程序,仍然不会用微软雅黑进行显示。

如果非要不可也有两个办法可以解决。一则是用字体编辑工具,将微软雅黑的字体名改为“宋体”,并删除系统中原来的simsun.ttc文件。不过这已经超过了本文所想涉及的范围,有兴趣的可以自己查阅相关信息试一下。第二个办法就是直接将simsun.ttc文件删掉。这个办法同样可以使几乎所有的文字用微软雅黑进行显示,不过后遗症是可能有部分文字会显示为方框。如何取舍,可以自己斟酌着办。

为了使用方便,我写了一个自动完成注册表的修改和恢复工作。如已安装了中日韩三地的四个字体文件,直接双击该脚本即可自动完成上述的所有修改工作。如想要恢复系统原始设置,用文本编辑器打开脚本,将bRestore设置为true并再次运行脚本即可。如果只想安装微软雅黑,也可以打开脚本编辑一下参数再运行。

sSC = "Microsoft YaHei"
sSCl = "微软雅黑"
sSCf = "msyh.ttf"

sTC = "Microsoft JhengHei"
sTCl = "微軟正黑體"
sTCf = "msjh.ttf"

sJP = "Meiryo"
sJPf = "meiryo.ttc"

sKR = "Malgun Gothic"
sKRf = "malgun.ttf"

bTC = 1 ' 是否安装了微软正黑字体,如否请将1改为0
bJP = 1 ' Meiryo,日文字体
bKR = 1 ' Malgun Gothic,韩文字体

bRestore = false ' 反安装则改为true

set oSh = wscript.createobject("WScript.Shell")
sub WriteReg()
  if bRestore then
    if sVal <> "" then
      oSh.run "reg add """ + sPath + """ /f /v """ + sKey + """ /t " + sType + " /d """ + sVal + """", 0
    else
      oSh.run "reg delete """ + sPath + """ /f /v """ + sKey + """", 0
    end if
  else
    oSh.run "reg add """ + sPath + """ /f /v """ + sKey + """ /t " + sType + " /d """ + sNVal + """", 0
  end if
end sub

' ========
sPath = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\GRE_Initialize"

sKey = "GUIFont.Facename"
sType = "REG_SZ"
sVal = "宋体"
sNVal = "微软雅黑"

call WriteReg
' ========
sPath = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes"

sKey = "宋体"
sType = "REG_SZ"
sVal = ""
sNVal = "Microsoft YaHei"

call WriteReg
' ========
sPath = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink"

sKey = "Microsoft YaHei"
sType = "REG_MULTI_SZ"
sVal = "gulim.ttc,gulim\0MSGOTHIC.TTC,MS UI Gothic\0mingliu.ttc,PMingLiU\0"
sNVal = ""
if bKR = 1 then
  sNVal = sNVal & "malgun.ttf,Malgun Gothic\0"
else
  sNVal = sNVal & "gulim.ttc,gulim\0"
end if
if bJP = 1 then
  sNVal = sNVal & "meiryo.ttc,Meiryo\0"
else
  sNVal = sNVal & "MSGOTHIC.TTC,MS UI Gothic\0"
end if
if bTC = 1 then
  sNVal = sNVal & "msjh.ttf,Microsoft JhengHei\0"
else
  sNVal = sNVal & "mingliu.ttc,PMingLiU\0"
end if

call WriteReg
' ========
sPath = "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Codepage\932"

sKey = "FixedWidthFont"
sType = "REG_SZ"
sVal = "MS Gothic"
sNVal = "Meiryo"

if bJP = 1 then call WriteReg
' --------
sKey = "ProportionalFont"
sType = "REG_SZ"
sVal = "MS PGothic"
sNVal = "Meiryo"

if bJP = 1 then call WriteReg
' ========
sPath = "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Codepage\936"

sKey = "FixedWidthFont"
sType = "REG_SZ"
sVal = "新宋体"
sNVal = "微软雅黑"

call WriteReg
' --------
sKey = "ProportionalFont"
sType = "REG_SZ"
sVal = "宋体"
sNVal = "微软雅黑"

call WriteReg
' ========
sPath = "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Codepage\949"

sKey = "FixedWidthFont"
sType = "REG_SZ"
sVal = "GulimChe"
sNVal = "Malgun Gothic"

if bKR = 1 then call WriteReg
' --------
sKey = "ProportionalFont"
sType = "REG_SZ"
sVal = "Gulim"
sNVal = "Malgun Gothic"

if bKR = 1 then call WriteReg
' ========
sPath = "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Codepage\950"

sKey = "FixedWidthFont"
sType = "REG_SZ"
sVal = "MingLiu"
sNVal = "Microsoft JhengHei"

if bTC = 1 then call WriteReg
' --------
sKey = "ProportionalFont"
sType = "REG_SZ"
sVal = "New MingLiu"
sNVal = "Microsoft JhengHei"

if bTC = 1 then call WriteReg
' ========
sPath = "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\International\Scripts\23"

sKey = "IEFixedFontName"
sType = "REG_SZ"
sVal = "GulimChe"
sNVal = "Malgun Gothic"

if bKR = 1 then call WriteReg
' --------
sKey = "IEPropFontName"
sType = "REG_SZ"
sVal = "Gulim"
sNVal = "Malgun Gothic"

if bKR = 1 then call WriteReg
' ========
sPath = "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\International\Scripts\24"

sKey = "IEFixedFontName"
sType = "REG_SZ"
sVal = "MS Gothic"
sNVal = "Meiryo"

if bJP = 1 then call WriteReg
' --------
sKey = "IEPropFontName"
sType = "REG_SZ"
sVal = "MS PGothic"
sNVal = "Meiryo"

if bJP = 1 then call WriteReg
' ========
sPath = "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\International\Scripts\25"

sKey = "IEFixedFontName"
sType = "REG_SZ"
sVal = "MingLiu"
sNVal = "Microsoft JhengHei"

if bTC = 1 then call WriteReg
' --------
sKey = "IEPropFontName"
sType = "REG_SZ"
sVal = "New MingLiu"
sNVal = "Microsoft JhengHei"

if bTC = 1 then call WriteReg
' ========
sPath = "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\International\Scripts\26"

sKey = "IEFixedFontName"
sType = "REG_SZ"
sVal = "新宋体"
sNVal = "微软雅黑"

call WriteReg
' --------
sKey = "IEPropFontName"
sType = "REG_SZ"
sVal = "宋体"
sNVal = "微软雅黑"

call WriteReg
' ========

2007年1月26日星期五

智能ABC之后

Vista拿掉了智能ABC,很多人都不满意,包括我在内。于是网上开始流传着“Vista版智能ABC”,以及关闭IE7保护模式的方法。可排除了个人情绪之后,我也只能说,这怪不了微软。

在微软主页上我翻到了一条旧闻,标题是《国家有关部门与微软签署Windows 95™中文版项目标准规划合作协议书》。其中有这么两句:“Windows 95™中文版将选择全国信息技术标准化委员会推荐的标准规划化中文字和规划化中文输入法。该委员会将根据中国政府有关部门的规定,以合理的方式和价格向微软进行技术转让。”

大家都知道,Win95中除了拼音、区位之类几乎没什么实用性的输入法外,主要附带的输入法就是智能ABC和郑码两种。前者的开发者为北京大学朱守涛,后者的版权则属于北京中易电子公司。两者与信标委应该都不存在上下级关系,“该委员会……向微软进行技术转让”不知从何谈起,想来无非也就是“政府协调”吧。

这桩生意大概不会为朱守涛和中易公司带来多大收益,“合理的方式”肯定不会是按拷贝计算版权金。至于一次性技术转让费能有多少,想想甲方是谁也知道不会多。而且相比中易公司,朱守涛先生在这桩买卖里所处的位置更为不利。

汉语拼音不可能申请专利,而郑码显然是有专利的。但像v键前导临时输入英文字符,i键前导输入高频字和大写数字一类的功能,专利局还是有可能会受理的。可朱守涛先生有没有试图申请?还是微软连这一步也事先想到了,已经获得了专利授权?总之以结果来看,微软想踢开中易做出一个“微软郑码”并不可能,但微软拼音中出现一个“智能ABC模式”已经成为了现实。

说到这里,似乎我是在为智能ABC叫屈,其实并非如此。要知道,一众扇子对于智能ABC的依赖,除了附加功能和输入风格外,最重要的就是字词排序。而由第三方实现一个智能ABC的完全克隆,显然没有可能。只要智能ABC继续开发,凭借多年来预装地位所带来的用户惯性,即使Vista拿掉智能ABC,保有相当市场份额也不是难事。实际上并不是用户放弃了智能ABC,而是智能ABC放弃了自己。

无法删除错误的自造词,自造词达到上限造成出错,v模式bug引起软件不正常退出,一直以来智能ABC都有些不大不小的毛病。随着Windows的升级,这些毛病不但没有修正,反而还越来越多。直至Win2k中那种既非宋体又非仿宋体的候选字字体出现,我甚至有点怀疑,这是故意的。

到WinXP推出,包括难看的字体在内,问题依旧还摆在那里。这些时间智能ABC的开发者都干什么去了?办了家叫阳宁的公司,卖了份授权给中科红旗和华镭,还开发了一个“智能ABC袖珍版”——只是没见到有什么手机、PDA、机顶盒用过。

一直到2004年11月7日,Windows的智能ABC才更新到了v5.22版。字体总算改过来了,而且终于可以输入那个著名的“镕”字了。不但如此,像“嗯”、“瓩”这一类字,也可以按照正确的读音进行输入,算是一个值得骄傲的新特性。然而原本存在的某些问题依旧存在,还引入了新的问题——cmd.exe窗口中候选字序列消失了。并且这是一个要卖38元的共享版本,安装包中还附送了两个俗称流氓软件的插件。

要不要卖钱是软件作者自己有权决定的事,可安装包里还捆了别的东西,这种行为也太小气点了吧。原本正常使用的功能突然消失,是测试问题,还是cmd.exe高手向,没几个人用?我无语。

从1994年的Windows 3.2,到2003年的Windows Server 2003,智能ABC作为Windows的预装输入法有近十年时间。我还曾经寄望于Vista中的智能ABC,可从那充满死链的官网来看,这个输入法恐怕很难再有下一个版本了。说再见的时候到了么,我有一种被甩掉的感觉。

煽情一把,留个纪念:

Windows 3.2
v3.10.147
Windows 98SE
v4.00.950
Windows 2000
v5.00.2190.1
Windows XP
v5.1.2600.0
Windows Server 2003
v5.2.3790.0
znABC v5.22a
v5.22.216

2006年12月25日星期一

Why UTF-8 Sucks

Linux应该用哪一种locale,这还用得着问么,当然是UTF-8。如果在充满愤青的开源论坛上对此提出异议,那你就等着被拍吧。不过我还是有些不同的意见,而且标题为“Why XXX Sucks”的文章看多了,感觉这个句式挺爽,所以今天试着说说,为什么UTF-8也sucks。

首先,使用UTF-8保存文本,会使字节数膨胀。具体增加值根据文本类型会有所不同,对于中文用户而言,UTF-8文件尺寸约为GBK内码的1.5倍。在存储成本越来越低的今天,这的确有点鸡蛋里边挑骨头的味道,所以放在第一个说。

其次,排序方法不符合用户习惯。虽然我没有找到可靠的资料说明Unicode采用了怎样的编码顺序,但翻阅Unicode的码表可以看出,应该是主要采用了笔画序。如果你也像我一样有很多mp3文件,以演唱者为目录名分类存放,你就知道那有多痛苦了。类似的问题其实很容易遇到,例如通讯录中的联系人名单等。

第三,存在不定宽度字符。有一些字符,比如欧元符号、摄氏度符号等,在各种编码中都有定义。传统上中日韩地区将这些字符表示为全宽字符,而其他地区则将这些字符表示为半宽字符。Unicode将这类字符称为Ambiguous,并有文档说明如何处理这些字符。

Ambiguous字符在拉丁语系用户眼里,跟半宽字符是一样的东西,而且还有些“特别的好处”,于是有意将一些文本中半宽字符转用Ambiguous字符表示。而这样的文本在CJK用户看来,就是一塌糊涂。Wordpress不经修改会出现标点符号错误,就是这个原因造成的。

上文提及的三个问题,除了第一个外,其实都有解决的办法。Linux的locale除了指定内码外,还包括语言相关的很多内容,如日期、时间、数字格式等,其中LC_COLLATE就与文字排序有关。不过打开/usr/share/i18n/locales/zh_CN(系统不同位置也可能不同)看看,中文并没有特别制订自己的排序方法,而是直接照搬了ISO14651,跟Unicode内码排序差不多。

至于第三个问题,纯属非CJK地区开发者只图自己方便搞出来的。用Ambiguous字符替换原始字符,不但看起来一样,而且还避免了诸如SQL注入、嵌入非法脚本等问题,简单方便。类似问题也存在于VIM中,VIM有一个参数ambiwidth,默认值为singe。如果将encoding设置为utf-8,并且不修改ambiwidth的设置,对中文引号等字符的描绘就会出问题。

Unicode是为了解决国际化信息交换和处理而出现的,其立志成为所有编码的超集,所以不可能照顾到所有国家和地区的用户习惯。

例如编码顺序的问题,1980年制定的GB2312将汉字分为常用汉字和次级汉字,常用汉字3755个,按照拼音辅以笔形顺序排列,次级汉字3008个,按笔画部首排序。读音依据的是普通话审音委员会发布的文件,而字形则有文化部和文字改革委员会负责。

而Unicode就不可能采用这样的排序方法了,同一个字中文和日文读音不同,甚至大陆和台湾的读音也不同。于是只好用笔画偏旁序,一种机械而折中的方案。

即使采用这种方法,编码制定过程中也大有可吵之处。经过不同国家和地区的使用及演变,一个字的字形可能产生一些细微的变化。是不一样就收,还是有所取舍?取舍时以大陆的中文为准,还是以台湾的中文为准?是听中文的,还是听日文的?这不仅是文化的冲突,还可能牵涉政治问题。

由此可以得出结论,Unicode虽然是一个好东西,但仅有Unicode显然是不够的。一些语言相关的细节问题,商业软件有厂家负责(如MS-SQL就有完备的语言和排序规则),其他的就只能靠政府和我们自己了。只要国内开源社区真的能有所发展,如Wordpress标点符号等类似问题自然可以得到解决。

最后回到开篇那个命题,现下Linux应该使用哪一个locale?我个人的意见是zh_CN.gbk。GBK貌似过时,但其实该标准包含的汉字几乎等同于ISO10646的BMP(Basic Multilingual Plane),日常使用应该足够。而拥有良好国际化支持的程序,例如GVIM、Firefox,并不会因为locale而失去了阅读和处理其他编码的能力。除此以外,Opera、WINE等国际化支持不好的程序,使用zh_CN.gbk也能避免的掉很多莫名其妙的问题。

2006年8月5日星期六

Opera字体问题的一篇笔记

首先需要在opera:config中关闭core X fonts支持,并确认打开了xft fonts支持。opera的字体选用机制已经很莫名其妙了,没必要还跟core X fonts纠缠。之后在高级设置的国际字体中,针对简繁体中文选择你喜欢的字体。如果运气足够好的话,你已经拥有了不输firefox的字体描绘品质,不过事情一般都不会这么顺利就是。

假如你发现采用gbk/gb2312编码的网页表现良好,但utf8编码的网页却很糟糕,那很有可能是你使用了utf8的locale,例如zh_CN.utf8。opera并不认为zh_CN代表间体中文,虽然有些怪异,可看起来就是这样。解决的办法是在非utf8的locale下启动opera,例如zh_CN.gbk或zh_CN.gb2312。

你可以每次都在term中敲LANG=zh_CN.gbk opera &启动程序,可以写一个脚本完成这件事,或者干脆把系统locale改为zh_CN.gbk。听起来有点不可思议,可我推荐最后一种解决方案。utf8的locale所带来的便利,远少于其带来的各种麻烦,虽然这并不是utf8的错。

补:上段没有说清楚,多解释几句。在zh_CN.utf8下访问GB2312页面,Opera会使用国际字体设置中的内容,但访问UTF8页面时则不会,而是按字体按名称排序选取。也就是说,locale为UTF8时,Opera所采用的字体是不可控的。

现在不管什么编码的网页应该都使用你指定的字体进行描绘了才对,可如果你发现中文字符间距不正常,小字间距过大,而大字又有重叠,那真是恭喜,我遇到过的问题你都遇到了,挺蓑。

安装X时一般都会附带装上两套中文点阵字体,分别是fangsong ti和song ti。如果fontconfig中打开了bitmap,即点阵字体支持,上述问题就很可能发生。假如opera中某些中文字显示得异常大,应该也是同样的原因造成的。因为fangsong ti只有12和16点阵,song ti也只有12、16、24这三种尺寸。至于问题的根源究竟在哪,是fontconfig还是字体本身,我也不清楚。个人感觉,opera看起来比较可疑。

解决的办法有好多,关掉fontconfig的点阵字体支持,或者删掉fangsong ti和song ti之类。后一种太暴力,所以我推荐前一种,反正点阵字体对于如今的桌面来说用处不大,不过代价就是文泉驿的点阵宋体也不能用了。

fontconfig的配置文件可能在很多地方,自己慢慢找。打开bitmap支持的部分可能会长成这样:

<selectfont>
 <acceptfont><pattern>
  <patelt name="scalable"><bool>false</bool></patelt>
 </pattern></acceptfont>
</selectfont>

改为:

<selectfont>
 <rejectfont><pattern>
  <patelt name="scalable"><bool>false</bool></patelt>
 </pattern></rejectfont>
</selectfont>

个人结论:opera的中文支持蛮糟的。

2005年12月17日星期六

VIM全角标点的宽度问题

当使用GVIM且set encoding=utf8时,某些中文字符(如双引号)的宽度不正常——明明是全角字符,但却按照半角字符的宽度来显示。

这个问题困扰了我蛮久,在网上也搜不到解决办法。后来逼不得已,钻进VIM的源码里逛了一圈,才找到了答案。有兴趣知道细节的请去看mbyte.c中的utf_char2cells函数,这里只说结果。

原来在Unicode中,有一部分字符是“不定宽度”的。如全角的引号、破折号,在中文系统中应该占两个字符的位置,而在西欧语系的系统中则只占一个字符的位置。至于那些个白人明明已经有ASCII范围内的引号和减号用了,为什么还来掺和全角标点,我就不知道了。

GVIM中,对于“不定宽度”的字符,默认情况下是按照半角显示,这就是问题的由来。只要set ambiwidth=double,就可以使这些这些字符正常显示了。

2004年4月2日星期五

愚人节乱谈

去年愚人节,因为心情原因,我在网上疯了好一阵子。一年过去,也不知道好多事情是变了还是没变。反正是想要做点什么事情留下来就对了。下面这些东西花了我好几个小时,可惜因为脑子不清楚,也只好切题乱谈了。


小小追忆一下革命历史。我刚开始接触Linux似乎是很久以前的事了,具体有多久我自己也不记不清楚了,依稀记得那个时候红帽和蔓德拉草都只要1张光盘。对了,那个时候Xterm Linux还没正式推出。根据这个线索Google了一下,大概是恐怖大王就要降临的时候。

那时我给机器升了一级,余下一块1.2G的硬盘。用又嫌太小,卖又卖不了几个钱,于是就打算让他来发挥余热。

刚开始接触Linux的回忆可不怎么美好。安装时间远比我想像的长,至少比Windows95要长。体积也颇为惊人,1.2G也只是勉强够装下系统而已。而且好几次装完后,遇到Li问题。再来就是没完没了的硬件支持和中文支持问题。

也忘了是为什么,总之后来也就把Linux给搁下了。现在回头想想,那个时候装上这东西,除了看看玩玩外,也没用来干过什么事情。

再之后我还接触过RedHat 7.3、Trubo Linux和红旗的几个版本,不过跟过去的经历类似,至少并没有大张旗鼓地让其在我的硬盘上安家。

接下来的就是Gentoo。

第一次看到Gentoo这个词应该是在国外的网站上,不过并没有弄清楚他跟其他的发行版有什么不同,而留下印象却是因为微软的XBox。XBox-Linux的第一个版本是基于蔓德拉草的,在他们的讨论版上开发组成员说了一句:“红帽是资源黑洞。”过了一段时间我再去逛,发现XBox-Linux已经是基于Gentoo和Debian的了。

而我自己开始用Gentoo,却是有别的原因。在我的Windows里有很多Script-Language解释器,Perl、Python、Ruby、Tcl/TK等。还经常用用GNU的一些工具,所以装了Cygwin和Msys。于是恶梦渐渐袭来……当我发现自己的硬盘上居然有数十个zlib.dll的时候,我有种要疯掉的感觉。

也就这样,我找上了Gentoo,1.4,两张盘。

其实要我现在说,与Linux的重逢只是我头脑发热的结果。过去对Linux的印象现在并没有改变太多,只不过我现在“更会用”罢了。几番折腾之后,我只是在自己的机器上装了个VisualPC,平常大多时候ssh到虚拟机上去。

好像有些墙头草……


Linux很棒,比如perl之类的东西只有在posix上给人的感觉才最地道,比如平坦的文件系统让人觉得管理起来很容易等等。可惜他的坏处也很多,还可能并不比好处少。硬件支持度还是不够,特别是多媒体性能的表现差了一截。多语言支持还是一如既往地烂,Unicode目前只是个遥远的理想而已。很多很多的问题,到最后似乎都碰触到一个问题,那就是Linux最引以为豪的地方:开源。

集市就像自由经济,而大教堂就像计划经济。我觉得这个比喻蛮有趣,因为咱们国家的人大多都在这方面具有相当的政治敏感度。自由经济都有些什么不好呢,过度竞争和资源浪费。这两点在开源软件上也有对应的体现,过度竞争:软件贼多;资源浪费:开发者的,也有我的。

也许乍一听,软件产品的数量多应该不是坏处,事实也的确是这样,不过似乎会有一些问题。开源对代码重用非常友好,子又生孙,孙又生子,子又有子,子又有孙,子子孙孙,无穷匮也。但我们在实际使用中可以发现,开源的这些子子孙孙们先天后天都容易营养不良,甚至缺胳臂少腿。

用户的软件需求模糊地分可以有三步:没有对应软件,存在对应软件,存在好用易用的对应软件。目前的事实来看,开源可以很容易地解决第一步和第二步,但第三步却走得非常艰难。

至于资源浪费,我倒不是指诸如重复开发之类,虽然也逃不掉。自由经济的重复开发是必然的,甚至是必须的,经过市场选择总会优胜劣汰,不过这样的模式也并不是没有副产品的。Windows有个常为人所诟病的DLL黑洞,其实Linux也好不到哪里去,库黑洞。对于开发者来说,不管是STL还是GUI,总是有不同的选择。于是用户也就得跟着开发者的选择,在自己的机器上装上这样那样的库。

举个例子吧,用Gentoo,如果你熟悉或想熟悉python,想要使用kahakai当wm。emerge会告诉你,kahakai本身681KB,同时需要两个库,分别是1737KB的swig和5311KB的boost。有时候我甚至有种错觉,自己机器上的应用软件数量比库的数量还要少。

其实我觉得这些问题并不仅是开源造成的,或者说更深层次的原因,是由人性本身造成的。开源社区的活力并不在于用户,而是在于开发者——那些大拿、黑客们。他们想怎么做或做到什么地步,开源软件就是什么样子。

“每个好的(开源)软件工作都开始于搔到了开发者本人的痒处。”可是开发者本人的需求与用户的需求并不是终极一致的,或者可以说是不可能一致的。我们不可能要求软件用户都成为大拿和黑客,于是便只能是大拿和黑客们来将就用户的需求——更简单的、更直观的、更方便的。可很多工作是很琐碎又不能带来成就感的,例如文档,例如GUI。也许又一个可以用,但普通用户觉得不怎么好用的程序就这样产生了。而大拿和黑客们,又去追求新的能带来成就感或感兴趣的东西去了。

如GTK,现在已经是2.4了,可连1.2的Tutorial里还有Undocumented的部分。而且1.x和2.x不兼容却仍然被广泛使用,恐怕也只有在开源社区里才会是正常现象。文档不完善、API不稳定,这样是不可能产生RAD的。基于GTK1的RAD刚写出来,甚至还没写出来,GTK2就出来了,谁接受得了呢?大拿和黑客是不需要IDE和RAD的,也没有哪一家公司会对不稳定的库投入太多。

Mozilla应该是开源社区最重要的浏览器了,Opera是商业软件,而不打算用KDE的人则无法使用Konqueror。Mozilla的宣传语都有什么呢?自由、开源、资源占用小,是的,还有标准。这些似乎都是Mozilla的矜持,基本上也是Linux的矜持。可惜站在用户的层面,做得并不如说得那么漂亮。

撇开自由和开源不谈,因为这与应用没什么关系。至于资源占用的问题,凭良心说IE又做得很差么,Mozilla也未必做得很好吧。至于所谓标准,如果我以一个用户的身份来说,那只是一个光鲜的骗局罢了。这个网页IE可以看,Mozilla不能看,我们可以解释说这是IE不够标准的缘故。可是对于用户来说,是放弃这个网页不看了呢,还是拿起板砖去拍微软的大门?

所谓标准的产生,几乎都要经过一些利益集团的博弈和妥协。而且若是你的东西够好、市场占有率够高,你可以完全不理会所谓的标准,因为你才是标准,事实标准。过去C语言标准推出后,若干编译器都声称支持标准,但也无一例外地提供扩展库。因为标准是死的,应用需求是活的,是无尽的。JavaScript现在也有标准了,叫ECMAScript,可以说Mozilla里的脚本引擎是ECMAScript的完整实现,没增也没减么,恐怕不能吧。在EMail的相关标准里,MIME违反了RFC2047,可是Mozilla是不是就因为这个不支持了呢,恐怕也不能吧。

个人觉得,Mozilla的标准只是一个无用的矜持,与那些说着:“我乃天朝,彼乃化外蛮夷”的士大夫无异。这一点,应该会成为钳制Mozilla扩大市场占有率的最大问题。


愚人节好几个小时以前就过去了,就这样吧。