wenjiang 的个人资料morning's blog照片日志列表更多 工具 帮助

日志


VC6正在被抛弃

(转载请注明来源于金庆的专栏)
我还在用的VC6本来早就该升级了,毕竟VC已经从VC6经历7.0、7.1、8.0,现在已经到了VC9(VC2008)了。
只是我比较恋旧,想想我的机器也受不了MS频繁的升级,现在的机器也就免强能跑跑VC6。
但是现在C++标准升级了,GCC也升级了,VC6 真的已经是必须丢弃的鸡骨头了。
VC6自带的std::string的引用计数在多核上让我受苦,查错一周有余才找到这个原凶。后来就促使我将stl库替换为StlPort。
boost.asio库明确说明不支持VC6。
stlsoft库某些组件无法兼容VC6(详细阅读了《Extended STL》,才知道为了VC6要耗费大量的精力,有些组件本身已很复杂,以至于需要排除VC6才能实现。)
今天使用boost.date_time时又发现VC6不行了。
time_formatters.hpp(72) : error C2664: '_i64toa' : cannot convert parameter 2 from 'unsigned short [32]' to 'char *'
time_formatters.hpp相应代码为:

//TODO the following is totally non-generic, yelling FIXME
#if (defined(BOOST_MSVC) && (_MSC_VER < 1300))
      boost::int64_t frac_sec =
        date_time::absolute_value(td.fractional_seconds());
// JDG [7/6/02 VC++ compatibility]
      charT buff[32];
      _i64toa(frac_sec, buff, 10);
#else

VC6的_MSC_VER是1200,这段代码明显是针对VC6的。
可惜JDG的简单补丁并没有考虑VC6+STLP的情况,_i64toa()只能接受char buff,对于wchar则报以上错误。
实际上有StlPort,根本不必调用_i64toa(),因为int64_t在StlPort中是可以直接流式输出的。
为什么只用到char,仍会对wchar实例化?为什么data_time的库编译会成功?这些仍是问题。
不用Stlport就不会报这个错,可见wchar特化的实例化只在stlport环境下才进行。
查看date_time的文档,明确支持的VC版本只有VC7.1。
VC8有些问题。VC6、7已停止正式的支持。
看来我该升级了,先升级我的机器。

在VC6 IDE中实现通配符查找代码

(当然,以下内容也同样适用于VC.Net,以及很多支持“Regular Expression”的编辑器,不过不同公司的标准可能会有所不同。)

昨日,一个xd在QQ上问我,如何在VC编辑器中实现利用“通配符”进行查找代码,他也知道需要打开“Regular Expression”这个开关,但不知道为什么输入“#define * TRACE”不能进行查找。。。刚刚好我前段时间对此进行了一些研究,于是在很短时间内搞定,让他佩服了一番。。否则只有说"I don't know.."

他的需求:在工程中的多个文件中查找“#define * TRACE”,其中的“*”是任何字符串。(不明白他为什么把TRACE又重新进行了那么多的define?)

解决方法:在“查找对话框”中将“Regular Expression”打勾选中,在“Find what”中输入:“#define .* TRACE”,查找即可!

原理:这需要对正则表达式有所了解,“#define .* TRACE”中的“.”代表所有任何字符,“*”代表它前面的任何字符的任何次重复。这也就明白了为什么“#define * TRACE”不能满足要求的原因,因为“*”前面是一个空格,而不是“任何字符”。

补充:想起自己曾经用过的另一个Regular Expression,功能是将代码中的连续多个空格替换为一个空格。有几次从网上粘贴来的代码,中间的空格变成了好几个空格连续,看起来不爽,用这个来替换一下就好了!(当然,如果中间有专门需要连续空格的字符串,那也会被修改掉)

打开“查找替换”对话框,选中“Regular Expression”,在查找中输入“ * ”(星号左右各有一个空格),替换中输入“ ”(一个空格),OK!

在VC6的IDE中使用WinDBG

在VC6的IDE中使用WinDBG 由于Microsoft现在的IDE已经出到VC2005了,而我的机器配置确几年来都没有变化(都怪资本家老板不升级,太吝啬),没有办法就把VC6的编译器从VC6的IDE中清除了,换成了VC71的编译器,这样虽然能用,但是却有一个致命的问题,VC6的调试器没法用了,怎么办,不能就这样退到VC6的编译器吧,既然如此,俺就不用这个调试器了,用什么呢?WinDBG进入了我的法眼,这是Microsoft出品的,算是调试器的正宗阿。OK,就用它了。 第一步首先设置_NT_SOURCE_PATH 环境变量,把关于VC的一些源代码路径都设置进去。 _NT_SOURCE_PATH = "D:\develop_tool\Microsoft Visual Studio\vc98\ATL\Include";"D:\develop_tool\Microsoft Visual Studio\vc98\ATL\SRC";"D:\develop_tool\Microsoft Visual Studio\vc98\crt\src";"D:\develop_tool\Microsoft Visual Studio\vc98\include";"D:\develop_tool\Microsoft Visual Studio\vc98\MFC\SRC";"D:\develop_tool\Microsoft Visual Studio\vc98\WTL\include" 设置完成后就启动WinDBG,启动的参数如下: -i $(TargetDir) // 设置可执行程序的路径 -v // 设置调试输出为详细而友好的输出 -y $(TargetDir) // 这是设置符号路径,也就是编译输出路径,比如DEBUG目录,Release目录 -srcpath $(WkspDir) // 在这里设置源程序所在的路径 把以上的内容写成一个tool,加到Tools目录中,设置一个快捷键,你就能享受到WindDBG的服务了,enjony it!

 

http://hi.baidu.com/licksite/blog/item/b1397a0ed86692ca7bcbe1d5.html

7月30日

译:理解 Win32 "OutputDebugString"

坚定的 Win32 开发人员可能对 OutputDebugString() API 函数比较熟悉,它可以使你的程序和调试器进行交谈。它要比创建日志文件容易,而且所有“真正的”调试器都能使用它。应用程序和调试器交谈的机制相当简单,而本文将揭示整件事情是如何工作的。

本文首先是由以下事件促使的,我们观察到 OutputDebugString() 在管理员和非管理员用户试图一起工作或游戏时并不总是能可靠地工作(至少在 Win2000 上)。我们怀疑是一些相关的内核对象的权限问题,此间涉略了相当多不得不写下来的信息。

请注意,尽管我们使用了“调试器”这一术语,但不是从调试 API 的意义上来使用的:并没有“单步执行”、“断点”或者“附着到进程”等可以在 MS Visual C 或者一些真正的交互开发环境中找到的东西。从某种意义上来说,任何实现了协议的程序都是“调试器”。可能是一个非常小的命令行工具,或者像来自于 SysInternals 那帮聪明的家伙们的 DebugView 那样的高级货。

内容目录
应用程序用法

<windows.h> 文件声明了 OutputDebugString() 函数的两个版本 - 一个用于 ASCII,一个用于 Unicode - 不像绝大多数 Win32 API 一样,原始版本是 ASCII。而大多数的 Win32 API 的原始版本是 Unicode。

使用一个 NULL 结尾的字符串缓冲区简单调用 OutputDebugString() 将导致信息出现在调试器中,如果有调试器的话。构建一条信息并发送之的通常用法是:


sprintf(msgbuf, "Cannot open file %s [err=%ld]\n", fname, GetLastError());
OutputDebugString(msgbuf);

不过在实际环境中我们中的不少人会创建一个前端函数,以允许我们使用 printf 风格的格式化。下面的 odprintf() 函数格式化字符串,确保结尾有一个合适的回车换行(删除原来的行结尾),并且发送信息到调试器。


#include <stdio.h>
#include <stdarg.h>
#include <ctype.h>
void __cdecl odprintf(const char *format, ...)
{
char buf[4096], *p = buf;
va_list args;
va_start(args, format);
p += _vsnprintf(p, sizeof buf - 1, format, args);
va_end(args);
while ( p > buf  &&  isspace(p[-1]) )
*--p = '\0';
*p++ = '\r';
*p++ = '\n';
*p   = '\0';
OutputDebugString(buf);
}

于是在代码中使用它就很简单:


        ...
odprintf("Cannot open file %s [err=%ld]", fname, GetLastError());
...

我们已经这样使用多年了。

协议

在应用程序和调试器之间传递数据是通过一个 4KB 大小的共享内存块完成的,并有一个互斥量和两个事件对象用来保护对他的访问。下面就是相关的四个内核对象:

对象名称
对象类型

DBWinMutex
Mutex

DBWIN_BUFFER
Section (共享内存)

DBWIN_BUFFER_READY
Event

DBWIN_DATA_READY
Event

互斥量通常一直保留在系统中,其他三个对象仅当调试器要接收信息才出现。事实上 - 如果一个调试器发现后三个对象已经存在,它会拒绝运行。

当 DBWIN_BUFFER 出现时,会被组织成以下结构。进程 ID 显示信息的来源,字符串数据填充这 4K 的剩余部分。按照约定,信息的末尾总是包括一个 NULL 字节。


struct dbwin_buffer {
                DWORD   dwProcessId;
                char    data[4096-sizeof(DWORD)];
                };
                

OutputDebugString() 被应用调用时,它执行以下步骤。注意在任意位置的错误都将放弃整个事情,调试请求被认为是什么也不做(不会发送字符串)。

  1. 打开 DBWinMutex 并且等待,直到我们取得了独占访问。
  2. 映射 DBWIN_BUFFER 段到内存中:如果没有发现,则没有调试器在运行,将忽略整个请求。
  3. 打开 DBWIN_BUFFER_READYDBWIN_DATA_READY 事件对象。就像共享内存段一样,缺少对象意味着没有可用的调试器。
  4. 等待 DBWIN_BUFFER_READY 事件对象为有信号状态:表示内存缓冲区不再被占用。大部分时候,这一事件对象一被检查就处于有信号状态,但等待缓冲区就绪不会超过 10 秒(超时将放弃请求)。
  5. 复制数据直到内存缓冲区中接近 4KB,再保存当前进程 ID。总是放置一个 NULL 字节到字符串结尾。
  6. 通过设置 DBWIN_DATA_READY 事件对象告诉调试器缓冲区就绪。调试器从那儿取走它。
  7. 释放互斥量。
  8. 关闭事件对象和段对象,但保留互斥量的句柄以备后用。

在调试器端会简单一点。互斥量根本不需要,如果事件对象和/或共享内存对象已经存在,则假定其他调试器已经在运行。系统中任意时刻只能存在一个调试器。

  1. 创建共享内存段以及两个事件对象。如果失败,退出。
  2. 设置 DBWIN_BUFFER_READY 事件对象,由此应用程序得知缓冲区可用。
  3. 等待 DBWIN_DATA_READY 事件对象变为有信号状态。
  4. 从内存缓冲区中提取进程 ID 和 NULL 结尾的字符串。
  5. 转到步骤 2。

这使我们认为这决不是一种低消耗的发送信息的方法,应用程序的运行速度会受到调试器的左右。

权限问题

我们发现 OutputDebugString() 有时不可靠已经好几年了,而且我们十分不解为什么微软这么长时间也没把它搞好。奇怪的是,问题总是围绕着 DBWinMutex 对象出现,这就需要我们察看许可系统以找出为什么会这么麻烦。

互斥量对象会一直存活着直到使用它的最后一个程序关闭其句柄,故而它能在初始创建它的应用程序退出后保留相当长的时间。因为此对象被广泛地共享,所以它必须被赋予明确的许可以允许任何人使用它。事实上,“缺省”许可几乎从不适用,这一问题被计为在 NT 3.51 和 NT 4.0 中我们观察到的第一个问题

当时的修正方法是使用一个广泛开放的 DACL 创建互斥量,以此来允许任何人访问它,但是看样子在 Win2000 里这些许可被加强了。表面上它看起来是正确的,就像我们在下表中看到的:

SYSTEM
MUTEX_ALL_ACCESS

Administrators
MUTEX_ALL_ACCESS

Everybody
SYNCHRONIZE | READ_CONTROL | MUTEX_QUERY_STATE

希望发送调试信息的应用只需要等待和获取该互斥量的能力,也即体现为拥有 SYNCHRONIZE 权限。上列的许可对于所有参与的用户都是完全正确的。

不过如果有人观察 CreateMutex() 在对象已经存在时的行为,就会发现奇怪的事情。在这种情况下,Win32 的表现就好像我们进行了如下调用:

OpenMutex(MUTEX_ALL_ACCESS, FALSE, "DBWinMutex");
                        

尽管我们确实只需要 SYNCHRONIZE 访问,但它还是假定调用者要做任何事情MUTEX_ALL_ACCESS)。因为非管理员没有这些权限 - 仅有上列的少许 - 互斥量不能被打开或者获取,于是 OutputDebugString() 不做任何事情就悄悄地返回了。

甚至将所有的软件开发都以管理员来执行也不是一个完整的修正方法:如果存在其他的用户(例如服务)以非管理员运行而许可配置不正确,它们的调试信息将会丢失。

我们感觉真正的修正需要微软为 CreateMutex() 添加一个参数 - 如果对象已经存在时用于隐含的 OpenMutex() 调用的访问掩码。也许某天我们会看到一个 CreateMutexEx(),但在此期间我们必须采用另外的方法。代之以,当对象已经存活于内存中时我们将硬性改变其上的许可配置。

这需要调用 SetKernelObjectSecurity(),下列程序片断展示一个程序如何才能打开互斥量并安装一个新的 DACL。此 DACL 即使在程序退出后也仍然保持着,只要任一其他程序还维护有它(译者注:应该是指互斥量)的句柄。

...
                        // open the mutex that we're going to adjust
                        HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "DBWinMutex");
                        // create SECURITY_DESCRIPTOR with an explicit, empty DACL
                        // that allows full access to everybody
                        SECURITY_DESCRIPTOR     sd;
                        InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
                        SetSecurityDescriptorDacl(
                        &sd,            // addr of SD
                        TRUE,           // TRUE=DACL present
                        NULL,           // ... but it's empty (wide open)
                        FALSE);         // DACL explicitly set, not defaulted
                        // plug in the new DACL
                        SetKernelObjectSecurity(hMutex, DACL_SECURITY_INFORMATION, &sd);
                        ...
                        

这一方法明确地走向了正确的道路,但我们还需要找一个地方来放置此逻辑。把它放在一个一经请求即运行的小程序中是可以的,但是看起来它有可能被中断。我们的办法是写一个 Win32 服务来干这件事情。

我们的 dbmutex 工具完成的就是这一工作:它在系统引导时启动,打开或者创建互斥量,然后设置对象的安全性以允许广泛的访问。然后休眠直到系统关闭,在此过程中保持互斥量的打开状态。它不消耗任何 CPU 时间。

实现细节

我们花了很多时间使用 IDA Pro 深入到 Windows 2000 KERNEL32.DLL 的实现中,我们认为,对于它在更精确的基础上到底是如何工作的已经有了良好的掌握。在这儿我们给出 OutputDebugString() 函数的伪代码(我们没有编译过它),以及创建互斥量的函数。

我们故意略去了大多数的错误检查:如果事情变糟了,它将释放所有已分配的资源并退出,就像没有调试器存在一样。目的是展示一般行为而不是对代码的完整的逆向工程。

“setup” 函数 - 名字是我们起的 - 创建互斥量或者在已经存在时打开它。经过一些努力来设置互斥量对象的安全性以使任何人都能用它,尽管我们会看到其实并没有完全正确地得到它。

OutputDebugString.txt

胡思乱想

一些人可能会感到这是一个安全性问题,其实并不是。非管理员用户确实拥有适当使用 OutputDebugString() 的所有权限,不过由于“请求比所需更多权限”这一常见问题,一个合理的请求因形成了错误的形态而被拒绝了。

但并不像大部分的这种问题那样,这并非是有意的。大多数的错误是开发人员显式请求了更多(如“MUTEX_ALL_ACCESS”),而这次的掩码是由 CreateMutex() 的行为隐含的。这使得如果 Win32 API 不做改动的话更加难于避免。

---

当分析 KERNEL32.DLL 中的 OutputDebugStringA() 时,非管理员如何能够有可能去削弱系统变得明显起来。一旦得到互斥量,一个要发送调试信息的应用会等待 DBWIN_BUFFER_READY 事件对象就绪最多十秒钟,如果超时则放弃。这看起来是一个谨慎的防范措施,如果调试系统忙的话,用以避免被饿死。

但在更早的步骤里,等待互斥量,没有这样的超时设定。如果系统中的任何进程 - 包括非特权进程 - 可以以请求 SYNCHRONIZE 权限打开此互斥量,并且不释放它,所有其他试图获取此互斥量的进程将会无限停止完蛋。

我们的研究表明,所有类型的程序都会发送随意的调试信息(例如,MusicMatch Jukebox 就有一个唠唠叨叨的键盘钩子),这些线程通过很少的几行代码就能停止住。没有必要停止整个程序 - 可能还有其他的线程 - 但在实际中,开发人员不计划使用 OutputDebugString() 将会是一条拒绝服务之路(译者注:此句没有完全明白,请参看原文)。

---

最奇怪的是,我们发现 OutputDebugString() 并非一个天然的 Unicode 函数。大多数的 Win32 API 具有“真正的”使用了 Unicode 的函数(“W” 版本),如果调用“A”版本的函数则它们自动从 ASCII 转换到 UNICODE。

但是,因为 OutputDebugString 把在内存缓冲区中的数据最终是作为 ASCII 传递到调试器中的,它们具有相反于常规的 A/W 配对。这就暗示了如果要在 Unicode 程序里发送一个快捷信息到调试器,可以通过直接调用 “A” 版本来实现:

OutputDebugStringA("Got here to place X");

VS2005/VS2003的自制光盘使用技巧

在把所有CD的ISO合并后,刻成一张碟,满心欢喜的打算试试安装,估计安装程序会告诉你插入第几张盘,可文件明明已经在那里了啊.怎么办呢?利用共享来吧,把光驱(不管是不是虚拟的)共享,然后自己从这个共享,目录安装即可.安装程序不会再次以检查光驱的逻辑检查你的光盘上的文件了.

7月29日

各有优缺

VC6,经典版本,BUG也多

VC2002,过渡版本

VC2003,对标准支持很好,但是dll版本发布时往往需要运行库

VC2005,在2003的基础上加强了.net的很多东西,C/C++不清楚,同样有运行库的问题,且有多个版本运行库

VC2008,2005的修正版,有featurepack整合了BCGPRO,做界面很方便,但是编译出来的东西很大

ICC,个人觉得很像2003

GCC,没怎么用过

 

这里都说的是编译后端,不指其他部分,不知道大家有何看法.目前我用的是VC6的IDE配合VC2003的编译后端

图个方便吧(不用安装,解压缩就能用),VC2003的IDE比VC6还是有很多优点的

7月28日

随时把所见所想写下来

分享一个我一直在用的live writer,只要有.net framework,应该能解压缩即可运行

 

http://cid-2067fca683114503.skydrive.live.com/self.aspx/Public/livewriter/LiveWriter.7z

网摘

四川地震让我明白一个道理:养专家不如养蛤蟆。十万专家跳海,蛤蟆说这是正常现象。

百度与hao123的故事

梅州地区的一个县级市。2004年夏末的一天,百度深圳分公司的刘计平坐的火车到达兴宁时,已是凌晨三点,街道上灯火黯淡。他找了个酒店住下,天亮后,他要见一个叫李兴平的年轻人。
李兴平,并不住在县城里,他的家在城乡结合部,像同村的农家一样,住的是自家盖的那种两层半的矮小楼房。这个只有24岁左右的年轻人,仅仅上完了初中,但他的Hao123网址之家,在全球权威的Alexa网络监测中,却是全球流量极大的中文网站之一。许多网吧的开机首页就Hao123。然而这个网站简陋得让IT精英们对它不屑一顾,它的页面只是堆满了网址链接,这个模式是Yahoo玩剩下的———为上网的网民导航:把据认为做得最好的网站,按新闻、游戏、交友、旅游等不同类别放置,让你不用键盘输入就能去你想去的网站,只用点一下鼠标。
精英们的眼界太高了,他们忽略了一点,随着上网方便性增强,中国新增的网民已不是几年前那样以精英阶层为主了,用户层次和应用水平参差不齐。互联网上潮水一样翻腾的信息,让很多人感到不知从何下手。一位知名的科幻小说家曾经有过一个形象的比喻,他说,从网上寻找信息就像是一个饥渴的人想把头伸进尼亚加拉大瀑布去止渴一样。一个对网络不熟悉的网民,最需要的就是Hao123这样的导航网站。
好123的成功,在于天时。它的模式尽管很容易复制,但它的知名度与口碑却无法克隆。它是百度的搜索联盟成员之一,百度为Hao123提供服务器和宽带支持,Hao123为百度宣传。包括百度在内,许多知名的网站都为Hao123.com带来的流量付费,在经营利好时期,据媒体报道,这个简陋的网站月收入100万以上。而这个网站只是由一个不过初中文化的在管理。
刘计平此次来找李兴平,是要传达百度的一个意愿:收购好123。李彦宏认为,互联网用户可分为两极:一端是搜索引擎的使用者,一端是导航站的使用者。随着互联网用户的增加,导航站的使用率、用户数还会增长,其中有一部分会转变到使用搜索引擎。收购Hao123,就是要把这两块最大的互联网人群都揽入自己的怀中。百度围绕着搜索衍生了一些新的频道,在高端的中文网页检索领域稳居老大的位置,如果收购了Hao123,也将在以网站浏览为主要习惯的网民群体中获得绝对优势。
事实上,在百度接触Hao123之前,已有数家网络公司想将其收入帐中。其中,也包括百度的竞争对手。
第二天早晨,刘计平在酒店等李兴平来喝早茶。他在猜测这是怎样一个传奇式的人物。
徐勇交给他的任务很简单。那时,公司向李兴平表达过收购好123的建议,但他一直没有同意。刘计平的任务,就是来接触一下,看能否有说动李兴平的余地。与刘计平的想像完全不同,这个网络上的风云人物,只上完初中就去打工了,曾经在电脑城为人家装机器。刘计平发现,李兴平是一个特别内向的人。
喝着早茶,刘计平直奔最核心的问题———Hao123.com的发展势头不错,但你一个人操作公司,会面临诸多的困难。刘计平做过公司,谈了很多做生意的辛酸和体会。内向的李兴平深有同感,他不善于去处理那些他不感兴趣的东西,比如税务、工商,或是网站的线下宣传推广。随着网站的影响越来越大,风吹草动、是是非非都让他觉得头疼。他,还是像一个骨灰级的网虫,更适合线上的生活,从内心里特别厌恶处理经营活动的事务。
聊到这里,刘计平忽然有了说服李兴平的信心。百度出手收购是真心希望把Hao123发展壮大。而小作坊式的运作,将会限制Hao123的发展。他做了一个比喻:Hao123.com是一艘满载着金子的小船,你一个人慢慢地划,风和日丽当然好,但遇到恶劣的天气,一个浪打过来,樯倾楫摧,很可能就什么都没了。李兴平被说动了,刘计平也报了一个大概的收购价格,李兴平没有反对,只说要找父母商量一下。
下午,李兴平再次来到酒店,他还了一个价,比刘计平当时开的那个价稍微高一点,也处于百度能够接受的范围。一切看似顺理成章,却又出现了一个小插曲:刘计平按照生意的惯例,谈到处理纳税的问题,李兴平立即表现得很激烈。一则,纳税的这笔钱不是一个小数目,二则,的确是因为他根本不愿处理这种事情,在以往所有的生意往来中,无论多大的网站,只要合作,Hao123只接受税后款。他从不扯上这种麻烦。这个技术性的小问题,让李兴平感到很头疼,一时间,表示不想卖网站了。
刘计平立刻和李彦宏通了电话,决定由百度解决纳税这些琐事。据当时的媒体报道,百度为收购Hao123.com花费了5000万人民币,外加部分百度股权,双方交易价格属于中国内地涉及金额较大的网站收购案。
最初,刘计平来到兴宁的目的很简单,只是想看一下李兴平到底是个怎样的人,如果能说动他就算完成任务。谁也没想到,李兴平很快认同了百度对Hao123.com发展的建议。刘计平马上又打电话给徐勇说:“很有戏,趁我在,直接把合同给签了吧。”徐勇把合同用Eˉmail传给刘计平。然而,怕麻烦的李兴平不善谈合同,这种细致的东西,还得他父亲出面。李兴平的父亲是一位退休教师,毕业于华南理工大学。一直帮着李兴平管理财务。谈合同,一条条地过,对于股票,也进行了仔细的讲解。一切,都比想像的顺利。
在短短的几天接触中,刘计平感触最深的是,任何合作,最重要的是要在双赢的前提下赢得合作伙伴的信任。在这次投资巨大的收购中,刘计平的每一个建议,都会站在双方的角度来考虑,很多话,是站在李兴平的立场上摆事实讲道理,谈利害关系。在谈判中,李兴平的父母对刘计平很信任。一年多了,Hao123.com在百度的手中发展势头良好,广告价值也在攀升。李兴平偶尔也会参加百度活动,只是每次都要拉上刘计平,否则心里不踏实。
百度上市那天,差不多半夜两点了,李兴平给刘计平打了一个电话。李兴平问:“高兴吧?”刘计平说:“高兴。你呢?”李兴平嘿嘿笑了,说:“这个东西怎么卖呀?”只是,当时李兴平卖出Hao123.com,并不能想像出百度上市的辉煌。他也意识不到,百度收购Hao123.com,也正是上市前的一项重要准备。
2004年8月30日,天极网披露新闻《百度正在秘密收购全球最大的网址站Hao123.com》,引起业界多方关注,8月31日,正值“2004中国互联网大会暨亚太数字科技博览会”在北京召开,“百度收购Hao123.com”消息一时间也成为互联网大会的焦点。诚如媒体猜测,这次收购,有利于百度将盘子做大,打通通往纳斯达克的道路。
其实,在Hao123的发展之中,给所有人最大启发的,是为什么Hao123这样看起来毫无技术含量的、很不时尚的网站,会有这么大的需求?认真想一想,这恰好说明中国的现状。互联网不再是一线城市的白领、大学生的专利,越来越多的不会拼音的老年人上网了,越来越多二线城市、乡镇包括农村(农民)朋友上网了。他们本来应该和所有互联网用户一样拥有平等的权利,理应受到相应的尊重。但是,城里的那些拿着风险投资的网站设计者们,眼里没有他们。

NV的G84/G86

G84 和 G86共享的 ASIC使用的黏着材料(之类的)在热膨胀系数上和其他组件不相同,导致每次的收缩膨胀都会让键结松脱一点,长久下来当然芯片就挂了.经常性的加温减温会让问题更加快速的显现出来,这大概也是为什么 Nvidia 先前只说笔电的原因 -- 笔电为了省电,经常会调控 CPU 和 GPU的出力,因此温度变化会远比开了就一直热着的桌上型 GPU 要剧烈.目前的解决方法(在 BIOS里强制开启风扇)根本只是降低温度的变化率,以求能延长这两颗芯片的寿命到超过保固而已.这方法不仅治标不治本,而且对电池耐力有很大的影响.对买了相关产品的用户来说是相当不负责的态度.

Real Alternative 不错的

real格式的解码包,现在网络里下载到的一般就是rm,rmvb的啦,用这个足以

史蒂夫·鲍尔默,看起来咋这么憔悴

突然发现史蒂夫·鲍尔默很憔悴啊,极似乔布斯啊,linus看起来精神不错啊

访问国外网站明显变快

最近sourceforge又能访问了,skydrive也正常了,live space也快了好多.是不是中国政府担心老外在中国看不了许多国外网站会引发争论,奥运期间放开了国家防火墙?不管怎么说,作为老百姓,能访问这些网站也是福音.

小技巧:如何快速修改iso中的部分内容

我们可能常常遇到这样的问题,下载到了试用版的iso,内置的是试用版的序列号,如果将其换成正式版序列号,那就变成正式版了,如何做呢?

如果用iso编辑工具,将劳财伤命的替换原来的文件,也就是将整个iso重新编译一次.其实从iso的文件系统本身看,它只是将一系列的文件按一定的顺序放入一个iso文件中.想到了吗,怎么来编辑?对了就是用ultraedit这类16进制编辑工具打开iso直接查找内容并编辑即可.这样,修改将非常快,也不存在iso文件结构或日期发生改变的问题.这和编辑磁盘,编辑内存并无不同.

Linux是Windows癌症

2008-07-21 15:36:23 来源:华军资讯 作者:王莹整理 点击: 7416


微软首席执行官史蒂夫·鲍尔默(Steve Ballmer)曾说过,从知识产权保护角度看,Linux就是癌症而无可救药。对此传言Linux之父”林纳斯·托瓦尔兹幽默的说:“我看鲍尔默日子过得也不舒畅。” 

图为微软首席执行官史蒂夫·鲍尔默

  微软首席执行官史蒂夫·鲍尔默(Steve Ballmer)曾说过,从知识产权保护角度看,Linux就是癌症而无可救药。

  对此传言Linux之父”林纳斯·托瓦尔兹幽默的说:“我看鲍尔默日子过得也不舒畅。”

图为Linux之父林纳斯-托瓦尔兹(Linus Torvalds)

  近日国外媒体刊登了对“Linux之父”林纳斯·托瓦尔兹(Linus Torvalds)的采访记录。

  采访期间,记者曾问道托瓦尔兹对微软首席执行官史蒂夫·鲍尔默(Steve Ballmer)曾说过的,“从知识产权保护角度看,Linux就是癌症而无可救药。”有何看法。

  对此传言林纳斯·托瓦尔兹幽默的说:“我看鲍尔默日子过得也不舒畅。” “开始是作“舞猴”(注:指鲍尔默曾在一次微软员工聚会上大舞大叫数分钟),后来又是砸桌子甩板凳什么的(注:传闻一位微软高管向鲍尔默提出辞呈,称自己将前往Google工作。鲍尔默对此大怒不已,从而抓起椅子向这位高管扔了过去。但鲍尔默本人否认有此事发生)。有时鲍尔默也把Linux称为“非美国类产品”,其原因就是他本人并不愿意看到市场竞争。然后他又指责Linux是癌症。但现在他自己陷入到微软-雅虎收购案中无法抽身,这何时才是个尽头?

  要说鲍尔默说Linux是癌症这话是什么意思?这只能表明Linux的影响力正大为提高,Linux产品的特点是:低成本、高质量,且不用看某家商用软件公司的脸色行事。当然,使用微软产品的成本会成倍增长,但微软却将之称为“竞争”。而鲍尔默对此很担心,于是就给Linux加上了一个“癌症”的称号。从鲍尔默角度来看,他自然有理由给Linux加上这个名称。

托瓦尔兹:专利软件对整个软件产业来说是一场灾难

  在提到为软件申请专利问题时,林纳斯·托瓦尔兹认为:“专利软件对整个软件产业来说是一场灾难。”

  托瓦尔兹说:“美国专利法有关软件专利保护的大前提是:专利软件有利于提高整个软件产业的创新能力。如果你仔细研究一下美国专利保护的现状就可明白,专利保护根本达不到所谓的促进创新目的。其实不但软件产业是这样,其他产业领域的专利保护同样只是起到扼杀创新的作用。

  也就是说,美国专利法有关软件专利保护的大前提目前并站不住脚,其他产业领域的情况也大同小异。但专利保护对软件产业的危害性最大,体现也最为明显。其原因很简单:任何软件都是一项繁杂的工程,并不一个简单创意就能达到解决问题的目的。除了创意外,软件开发还涉及到数以百万计的细节问题,软件并不是个单独创意,而是把许许多多的微小创意连结到一起。你可以对某个单独创意申请专利,但你无法对数以百万计的创意都申请专利。

  也就是说,软件的价值并不体现在于你所申请的单独创意上面,它是以整体方式来体现其价值。你所申请的软件创意,其实是所开发出来软件的很小组成部分。而为该创意申请专利的目的,无非就是为了赚钱而己。这种情况真让人失望。从这个角度上讲,软件专利已失去了其补偿价值的意义。”

 Linux的诞生

  托瓦尔兹1969年12月28日出生于芬兰赫尔辛基市,父母都是记者。他从小就对计算机感兴趣。1988年他进入赫尔辛基大学学习,专业为计算机科学。1991年,他购买了一台属于自己的PC机。赫尔辛基大学当时采用Unix操作系统,托瓦尔兹觉得该产品性能不尽如人意,于是就尝试着自己编写一款操作系统内核,这就是Linux操作系统来源。

  时至今日,Linux已广泛用于超级计算机和手机等产品当中。从某种程度上说,如果没有Linux,就没有Google、Facebook、PHP、Apache及MySQL今天所取得的市场业绩。

VCpkg 3.3

一.目的
1.绕过系统COM组件的加载流程,接管了VC6的插件枚举,自动注册,加载部分,做到直接加载VAX等插件
2.支持多平台编译,常常需要用多个编译器编译同一份代码(尤其是驱动开发的时候),这个组件拦截了VC6 IDE调用编译后端的部分流程,使其支持任意平台或编译器(目前仅支持microsoft和intel或其他使用相似命令行的编译器)

二.使用方法
1.不需要修改你的任何文件,把配置文件和!vcpkg.pkg解压缩到bin\IDE目录即可使用,如果不需要了,随时直接删除这两个文件即可
2.配置文件支持变量和环境变量声明等辅助性功能,简化配置的编写.
3.其他?还有其他吗?自己看演示配置吧,都已经中文注释了.

三.更新及反馈
http://morsoft.net

==================================

老版本的说明

1.支持变量定义
2.支持多平台编译

使用方法
根据 vcpkg_pub_template.ini 配置一个配置文件 文件名保存为 vcpkg.ini,随同 !vcpkg.pkg 放入 bin\IDE 目录
之所以加!是为了保证尽早被加载

里面放了 2个参考模板,有兴趣的自己看吧

 

下载地址

http://cid-2067fca683114503.skydrive.live.com/self.aspx/Public/VCPkg/VCpkg33.rar

超小免安装VC6

作者: morning
基于英语企业版VC6精简,可以正常创建win32项目,可以正常编译win32项目,解压即可使用,应该可以满足小型开发需要,enjoy it!
如果遇到一些头文件,库文件不存在,不妨回帖交流,下次更新我会加入(在我加入之前,你或许得找装了VC6的朋友复制一份了,精简的关系,只保留常用库文件)
博客地址:
http://morsoft.net
下载地址:
http://cid-2067fca683114503.skydrive.live.com/self.aspx/Public/VC6Lite/VC6Lite.rar

7月27日

网摘

1: 学会自我保护
2: 对人宽容真诚
3: 对自己也需爱
4: 保持自身整净
5: 生活积极向上
6: 做事保持专心
7: 树立理财观念
8: 遇事冷静乐观
9: 保持健康心理
10: 健康挣钱最好
11: 爱情是种缘分