2010年3月23日星期二

Google.cn R.I.P.

Photobucket
Google 作为世界上最为成功的搜索引擎、在线广告系统和在线服务商,其正式进入中国而开办本地化的.cn网站,从中文网络上能找到的最早的时间在2005年4月底。(请参考http://biz.163.com/05/0428/03/1ID4T94K00020QEF.html、http://tech.sina.com.cn/i/2005-04-27/0914594970.shtml)
web.archive.org(可能无法访问)搜索也证实了这一点。
http://web.archive.org/web/20050422012354/http://www.google.cn/
此时Google.cn是一家贴图论坛的域名
http://web.archive.org/web/20050427005834/http://www.google.cn/
此时Google.cn已经属于Google
http://web.archive.org/web/20050509235124/http://www.google.cn/
此时Google.cn已经是简体中文的Google站。

经历2009年的“儿子与母亲不正当关系”风波,2009年底——2010年初的Google.cn被黑客与内鬼里应外合盗取gmail等关键技术资料事件,Google美国总部的高层可能觉得继续在中国大陆运营已经不再合适,而多次声称将退出中国大陆。3月23日,Google.cn被重定向到google.co.hk,标志着Google.cn的主要服务——搜索引擎停止运营,Google退出中国事件达到了高潮阶段。

Photobucket
而Google.cn仍然在经营的服务包括视频搜索、中国本地化的Google地图、265网站导航等等。至于中文Adsense,因为原本就是美国总部的服务,目前尚没有受干扰的现象出现。
对于yksoft1而言,因为基本不使用Google.cn而使用Google.com美国主站和百度,这一事件并没有造成重要影响。不过,可能是设置问题,在本地的网络上,原本通过设置/ncr而不再转向到Google.cn的Google.com,现在也开始被强制重定向到google.co.hk。这应该是一时问题。
Google在世界上法律法规最难以解释和实行的国度经营一个以“Don't be evil”为宗旨的搜索引擎5年,今天终于还是坚持不下去了。愿其在中国之后的道路一路走好。

Update 15:27
根据我的验证,Chrome、Toolbar等Google美国总部的软件,其下载和自动更新尚未受到影响。
而Google拼音输入法,虽然为Google中国所开发,但是其文件均存放于Google主站的服务器上,因此仍然可以下载。

Update 3.26 0:10
现在Google.com主站已经可以按照原有的/ncr进入,但是明显google搜索遭到了比以往更为严重的干扰。“二胡”、“温故而知新”、“桃李满天下”“好好学习天天向上”里会有什么样的关键词呢?

Update 3.30 18:30
Google(从首页进入)的搜索功能彻底废了。看来网民的反应激起了更为强烈的不安。请自己看看这个URL
http://www.microsoft.com/www.google.&rfa
如果显示连接被重置而不是404 not found,那么看来我的判断是对的。因为Google首页搜索任何东西,语法差不多都是
http://www.google.com/search?hl=en&source=hp&q=yksoft1&aq=f&aqi=&aql=&oq=&gs_rfai=
里面正好有www.google.和rfa两个关键词。而去掉gs_rfai=,搜索正常。

Update 3.31 10:30
Google 搜索已恢复。可能是因为统计原因而自动封掉,但是在人工干预下解开。看来被发现得快是有好处的么?

2010年3月3日星期三

在Visual C++ 1.10/2.0环境下编译Mini vMac

Visual C++ 和微软的其他开发工具一样有很长的历史,其第一个32位版本早在NT 3.1的1993年就正式出现了。Mini vMac 是我在开放源代码的模拟器中所见过代码最为精炼、简洁的,这也使得它具有相当好的移植性。上次搞到32位版本的VC++ 1.10,于是就准备拿这个Mini vMac来玩玩。
首先使用Mini vMac的源代码镜像,在Mini vMac环境中运行Build,用-e msv -ev 6000参数生成一个适合于Visual C++6.0的完整源码zip文档。
把该zip解压开,打开Visual C++ 1.1,在这个源码所在的目录新建一个工程文件。把源码目录下src子目录下的所有.c和.rc添加到工程中。
由于Visual C++ 1.1环境出现在Windows 95之前,和VC6相比,它具有很多限制:
1.shlobj.h不存在。所有和Explorer相关API和ActiveX相关API都不可用。
2.许多Win32的常数宏定义在自带头文件中不存在。
3.OLE2相关的均不可用。
4.winmm API中的一些参数与VC6有很大差别,比如WAVEFORMATEX结构不能用等等。
5.内联函数定义只有__inline。
6.使用IDE生成的makefile中,rc编译器的路径只包括工程文件所在路径。
7.编译器只支持WinMain为Windows应用程序主函数名。
这里仅仅提到了与Mini vMac相关的一些。因此,必须进行修改,才能编译成功。
我大概具体修改了这么一些地方:
1、CNFGGLOB.h中,#define MayInline __forceinline 改为 __inline。
2、MYOSGLUE.c中

1)
必须加入常量VK_APPS、VK_LWIN、VK_RWIN、SPI_SCREENSAVERRUNNING、_MAX_PATH、等一大堆东西(记不清,自己根据错误内容去看吧。。)
2)
typedef HRESULT (WINAPI *SHGetSpecialFolderPathProcPtr) (
HWND hwndOwner,
LPTSTR lpszPath,
int nFolder,
BOOL fCreate
);
LOCALVAR SHGetSpecialFolderPathProcPtr MySHGetSpecialFolderPath = NULL;
注释掉,加一行LOCALVAR long MySHGetSpecialFolderPath = NULL;
LOCALFUNC blnr HaveMySHGetSpecialFolderPath(void)
{
下面
if (! DidSHGetSpecialFolderPath) {
HMODULE hLibModule = LoadLibrary(TEXT("shell32.dll"));
if (NULL != hLibModule) {
MySHGetSpecialFolderPath =
(SHGetSpecialFolderPathProcPtr)
GetProcAddress(hLibModule,
#if MyUseUni
TEXT("SHGetSpecialFolderPathW")
#else
TEXT("SHGetSpecialFolderPathA")
#endif
);
FreeLibrary(hLibModule);
}
DidSHGetSpecialFolderPath = trueblnr;
}
也注释掉。这是因为VC1.1不存在shlobj.h,无法使用这些API,而且也不能使用typedef HRESULT (WINAPI *SHGetSpecialFolderPathProcPtr) 这样的方法来自己定义个函数指针,只有干掉了。
3)
#ifndef EnableShellLinks
#define EnableShellLinks 1 改成 0
#endif
快捷方式相关的VC1.1不能用,没办法。
4)
LOCALPROC MySound_Start(void)
中的
WAVEFORMATEX wfex;
改成
PCMWAVEFORMAT wfex;
其初始化部分
wfex.wFormatTag = WAVE_FORMAT_PCM;
wfex.nChannels = 1;
wfex.nSamplesPerSec = SOUND_SAMPLERATE;
wfex.nAvgBytesPerSec = SOUND_SAMPLERATE;
wfex.nBlockAlign = 1;
wfex.wBitsPerSample = 8;
wfex.cbSize = 0;
改成
wfex.wf.wFormatTag = WAVE_FORMAT_PCM;
wfex.wf.nChannels = 1;
wfex.wf.nSamplesPerSec = SOUND_SAMPLERATE;
wfex.wf.nAvgBytesPerSec = SOUND_SAMPLERATE;
wfex.wf.nBlockAlign = 1;
wfex.wBitsPerSample=8;
5)
LOCALPROC MyAppendSubmenuConvertName(HMENU hMenu,
HMENU hSubMenu, char *s)
中,
MENUITEMINFO mii;
注释掉
#if 0改成1
下面的
memset(&mii, 0, sizeof(MENUITEMINFO));
mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_TYPE | MIIM_SUBMENU;
mii.fType = MFT_STRING;
mii.hSubMenu = hSubMenu;
mii.dwTypeData = ts;
mii.cch = (UINT)_tcslen(ts);
(void) InsertMenuItem(hMenu, (UINT) -1, TRUE,
&mii);
注释掉
VC1.1没有InsertMenuItem这个API和MENUITEMINFO结构。
6)int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
改成
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)

3、CNFGRAPI.h的#include 注释掉。
令人惊奇的是,我们修改的仅仅是Mini vMac与系统结合的那一部分,其模拟代码根本没有必要修改。
这样修改后,工程设置把警告级别再改下,编译可以得到这样的结果。

经过我的测试,编译出的MVMAC.exe的链接器版本号为3.10,实际可以在Windows NT 3.5以上的系统运行。

VC2.0和VC1.1的SDK差不多,基本可以如法炮制。
目前还有一些问题点:
1、VC1.1(CL 8.0)、VC 2.0(CL 9.0)都不支持__int64,这是Mini vMac II浮点模拟库必须的,因此目前VC1.1无法简单地编译具有FPU模拟功能的Mini vMac II。
2、这样编译的Mini vMac关闭较慢,还没搞清楚怎么回事,
3、VC1.1的链接器在高版本NT系统(如NT4、2000、XP)下工作不正常,生成特别大的exe,需要使用2.0版本的替换。
另外,某论坛上有洋大人问是否能够把这个编译到16位的Windows平台,或者把这个在Win3.1+Win32s上运行,我只能说,前者需要进行大幅修改(程序中大量直接使用int,大量使用32位内存模型的内存分配),而后者据我的测试,连找不到ROM的错误信息都显示不出来,估计是DIB不支持之类的问题。