2009年7月3日星期五

oracle_sid , service_name , db_name,instance_name

数据库名:db_name            数据库实例名:instance_name
操作系统环境变量:oracle_sid   数据库服务名:service_names
数据库域名:db_domain        全局数据库名:global_db_name
在oracle7、oracle8数据库中只有数据库名以及实例名,在oracle8i、oracle9i中出现了数据库域名、服务名以及全局数据库名。
数据库名(db_name):用于区分一个数据的内部标识,是oracle的内部标记,是以二进制方式存储于数据库控制文件的参数。
数据库名的作用:数据库名是数据库的内部管理标记,在安装数据库、创建新的的数据库、创建数据库控制文件、修改数据库结构、使用数据库备份与恢复工具进行数据库备份时都需要使用数据名。
数据库安装完成后,数据库名称存储在参数文件(pfile,spfile)中,同时以二进制方式存储在控制文件中,两者必须匹配。如果两者不匹配,数据库在启动时提示ORA-01103号错误。
■ 对数据名称的查询:
1、查询参数文件 db_name的数值
2、select name from v$database
3、SQL>show parameter db_name
■ 修改数据库名(修改复杂,建议不要修改)
1、修改参数文件的数据库名称。
2.重建数据库的控制文件。
数据库实例名(instance_name):用于和操作系统之间的联系。
操作系统与数据库之间的交互则必须使用数据库实例名。数据库安装完成后,数据库实例名称存储在参数文件中,同时存储在注册表中。
数据库名与实例名一般是一一对应的关系,即:有一个数据库名就有一个实例名,而在oracle9i的并行服务器结构中是一对多的关系,即:一个数据库对应多个实例。
■ 对数据名称的查询:
1、查询参数文件 instance_name的数值
2、select instance_name from v$instance
3、SQL>show parameter instance_name
操作系统环境变量(oracle_sid):用于与数据库实例名相对应。instance_name是oracle数据库参数-oracle_sid是操做系统环境变量,即在操作系统要得到实例名必须通过操做系统环境变量oracle_sid,oracle_sid与 instance_name必须相同。
是数据库和操作系统的接口,由操作系统使用,是操作系统区分多个数据库的依据。oracle_sid存储在注册表中。如果数据库的oracle_sid与实际的instance_name不同,在操作系统下运行的oracle所有命令将产生错误。
■ 对数据实例名的定义:
SQL>set oracle_sid=数据库实例名
数据库域名(db_domain):在数据库名称后增加域名构成,使得数据库的取名在整个网络环境中惟一,主要用于oralce分布式环境中数据的远程复制。数据库域名存储在参数文件中。
以下情况要考虑使用数据库域名:1、在oracle分布式环境下,两个数据库之间要通过数据链路进行数据的远程传输。2、在同一网络环境下,两个数据库名相同。
■ 对数据库域名的查询:
1、查询参数文件 db_domain的数值
2、select value from v$parameter where name='db_domain'
3、SQL>show parameter db_domain
■ 修改数据库域名:
1、关闭数据库
2、修改数据库参数文件中的db_domain、service_names。
数据库服务名service_names:数据库名+数据库域名,意义与全局数据库名相同。
数据库服务名存储在参数文件中。
■ 对数据库服务名的查询:
1、查询参数文件 service_names的数值
2、select value from v$parameter where name='service_names'
3、SQL>show parameter service_names
全局数据库名global_db_name:数据库名+数据库域名。
数据库实例名、服务名与网络连接
ORACLE服务器版本 客户端网络驱动
ORACLE7  (支持实例名) SQL_NET(支持实例名)
ORACLE8  (支持实例名) NET8 (支持实例名)
ORACLE8i
(支持实例名、服务名) NET8i (支持实例名、服务名)
ORACLE9i
(支持实例名、服务名) ORACLE NET SERVICE
(支持实例名、服务名)
对于网络连接字符串使用实例名、服务名的问题,需要根据客户端驱动的版本和oracle服务器的版本共同确定,即两者都支持实例名和服务名的使用服务名,否则使用实例名。

2009年6月25日星期四

linux添加用户

要在系统上添加用户:
使用 useradd 命令来创建一个锁定的用户账号: 中
useradd <username>
使用 passwd 命令,通过指派口令和口令老化规则来给某账号开锁:
passwd <username>
useradd 的命令行选项在表 25-1中被列出。
-c comment 用户的注释。
-d home-dir 用来取代默认的 /home/ username 主目录。
-e date 禁用账号的日期,格式为:YYYY-MM-DD
-f days 口令过期后,账号禁用前的天数(若指定了 0 ,账号在口令过期后会被立刻禁用。若指定了 -1 ,口令过期后,账号将不会被禁用)。
-g group-name 用户默认组群的组群名或组群号码(该组群在指定前必须存在)。
-G group-list 用户是其中成员的额外组群名或组群号码(默认以外的)列表,用逗号分隔(组群在指定前必须存在)。
-m 若主目录不存在则创建它。
-M 不要创建主目录。
-n 不要为用户创建用户私人组群。
-r 创建一个 UID 小于 500 的不带主目录的系统账号。
-p password 使用 crypt 加密的口令。
-s 用户的登录 shell,默认为 /bin/bash 。
-u uid 用户的 UID,它必须是独特的,且大于 499。
表 25-1. useradd 命令行选项
添加组群
要给系统添加组群,使用 groupadd 命令:
groupadd <group-name>
groupadd 的命令行选择在表 25-2中被列出。
-g gid 组群的 GID,它必须是独特的,且大于 499。
-r 创建小于 500 的系统组群。
-f 若组群已存在,退出并显示错误(组群不会被改变)。如果指定了 -g 和 -f 选项,而组群已存在, -g 选项就会被忽略。
表 25-2. groupadd 命令行选项
口令老化
为安全起见,要求用户定期改变他们的口令是明智之举。这可以在 用户管理器 的 「口令信息」 标签上添加或编辑用户时做到。
要从 shell 提示下为用户配置口令过期,使用 chage 命令,随后使用表 25-3中的选项,以及用户的用户名。
重要:要使用 chage 命令,屏蔽口令一定要被启用。
-m days 指定用户必须改变口令所间隔的最少天数。如果值为 0,,口令就不会过期。
-M days 指定口令有效的最多天数。当该选项指定的天数加上 -d 选项指定的天数小于当前的日期,用户在使用该账号前就必须改变口令。
-d days 指定自从 1970 年 1 月 1 日起,口令被改变的天数。
-I days 指定口令过期后,账号被锁前不活跃的天数。如果值为 0,账号在口令过期后就不会被锁。
-E date 指定账号被锁的日期,日期格式为 YYYY-MM-DD。若不用日期,也可以使用自 1970 年1月1日后经过的天数。
-W days 指定口令过期前要警告用户的天数。

2009年6月24日星期三

2009年5月19日星期二

mget一次传送多个文件都要回答y

使用ftp –i <ip>
或者prompt命令关闭Interactive mode

修改命令行窗口的Code Page

chcp 950 中文繁体big5
chcp 936 中文简体gbk

Sorting Multilingual Data

Oracle9i之前,中文是按照二进制编码进行排序的。在oracle9i中新增了按照拼音、部首、笔画排序功能。

1、设置NLS_SORT参数值
      SCHINESE_RADICAL_M 按照部首(第一顺序)、笔划(第二顺序)排序
      SCHINESE_STROKE_M 按照笔划(第一顺序)、部首(第二顺序)排序
      SCHINESE_PINYIN_M 按照拼音排序

2、Session级别的设置,修改ORACLE字段的默认排序方式:
      按拼音:alter session set nls_sort = SCHINESE_PINYIN_M;
      按笔画:alter session set nls_sort = SCHINESE_STROKE_M;
      按偏旁:alter session set nls_sort = NLS_SORT=SCHINESE_RADICAL_M;

3、语句级别设置排序方式:
      按照笔划排序
      select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M');
      按照部首排序
      select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M');
      按照拼音排序,此为系统的默认排序方式
      select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M');

4、修改系统参数(数据库所在操作系统):
      set NLS_SORT=SCHINESE_RADICAL_M ;export NLS_SORT (sh)
       setenv NLS_SORT SCHINESE_RADICAL_M (csh)
      HKLC\SOFTWARE\ORACLE\home0\NLS_SORT (win注册表)

Oracle 官方说明

NLS_SORT NLS_SORT specifies the collating sequence for ORDER BY queries. NLS_COMP NLS_COMP specifies the collation behavior of the database session.

Property

Description

Parameter type

String

Syntax

NLS_SORT = { BINARY | linguistic_definition }

Default value

Derived from NLS_LANGUAGE

Modifiable

ALTER SESSION

Range of values

BINARY or any valid linguistic definition name

  • If the value is BINARY, then the collating sequence for ORDER BY queries is based on the numeric value of characters (a binary sort that requires less system overhead).
  • If the value is a named linguistic sort, sorting is based on the order of the defined linguistic sort. Most (but not all) languages supported by the NLS_LANGUAGE parameter also support a linguistic sort with the same name.

    Note:

    Setting NLS_SORT to anything other than BINARY causes a sort to use a full table scan, regardless of the path chosen by the optimizer. BINARY is the exception because indexes are built according to a binary order of keys. Thus the optimizer can use an index to satisfy the ORDER BY clause when NLS_SORT is set to BINARY. If NLS_SORT is set to any linguistic sort, the optimizer must include a full table scan and a full sort in the execution plan.

         You must use the NLS_SORT operator with comparison operations if you want the linguistic sort behavior.

Property

Description

Parameter type

String

Syntax

NLS_COMP = { BINARY | LINGUISTIC | ANSI }

Default value

BINARY

Modifiable

ALTER SESSION

Basic

No

Values:

  • BINARY

Normally, comparisons in the WHERE clause and in PL/SQL blocks is binary unless you specify the NLSSORT function.

  • LINGUISTIC

Comparisons for all SQL operations in the WHERE clause and in PL/SQL blocks should use the linguistic sort specified in the NLS_SORT parameter. To improve the performance, you can also define a linguistic index on the column for which you want linguistic comparisons.

  • ANSI

A setting of ANSI is for backwards compatibility; in general, you should set NLS_COMP to LINGUISTIC

2009年5月18日星期一

FLT_EPSILON

FLT_EPSILON
This is the minimum positive floating point number of type float such that 1.0 + FLT_EPSILON != 1.0 is true. It's supposed to be no greater than 1E-5.

2009年5月13日星期三

《潜伏》中的一段对话

        余则成:是觉得无路可走了吗?
晚秋:(哭,点头)
余:其实你面前有一条通往未来的路啊。(秋流泪摇头)值得你活下去。那一路很美好,就像你的诗歌一样。怎么会觉得无路可走了呢?
秋:你愿意娶我吗?
余:比娶你更美好。还多了一份自由。你不是最向往自由吗?
秋:(点头)
余:你也知道我的身份了。你愿意去吗?
秋:那我就再也见不到你了。
余:那儿有很多人都像我一样。那是另一个世界,好地方,好风光。你那么年轻,那么漂亮,可以选择的。你想想,晚秋,你站在一列雄壮的队伍里,迈着大步,高唱着战歌,去改变整个中国,那是什么气势?一个小小的余则成,就是路边的一个送行者,你看见了他,他看见了你,你们挥挥手就过去了。再往前就是更有意义的生活。沮丧吗?无非就是一个小布尔乔亚的无病呻吟。留恋它就是一种高度近视。有时候看得远一点,不就什么都有了么。包括爱。

2009年4月27日星期一

Oracle Dump函数

DUMP returns a VARCHAR2 value containing the datatype code, length in bytes, and internal representation of expr. The returned result is always in the database character set. For the datatype corresponding to each code, see Table 2-2, "Storage of Scale and Precision".

The argument return_fmt specifies the format of the return value and can have any of the following values:

  • 8 returns result in octal notation.

  • 10 returns result in decimal notation.

  • 16 returns result in hexadecimal notation.

  • 17 returns result as single characters.

By default, the return value contains no character set information. To retrieve the character set name of expr, add 1000 to any of the preceding format values. For example, a return_fmt of 1008 returns the result in octal and provides the character set name of expr.

The arguments start_position and length combine to determine which portion of the internal representation to return. The default is to return the entire internal representation in decimal notation.

If expr is null, then this function returns NULL.

This function does not support CLOB data directly. However, CLOBs can be passed in as arguments through implicit data conversion.

The following examples show how to extract dump information from a string expression and a column:

SELECT DUMP('abc', 1016)
FROM DUAL;

DUMP('ABC',1016)
------------------------------------------
Typ=96 Len=3 CharacterSet=WE8DEC: 61,62,63

2009年4月24日星期五

2009年4月22日星期三

解决IE无法输入文字

打开网页,就无法输入任何文字,字母,数字,而此时的输入光标也消失了. 出现此问题的原因可能是mshtmled.dll组件被破坏。
解决方法是 开始 运行 regsvr32 mshtmled.dll 回车,确定,即可解决该问题.

ServiceMix 4 (Fuse)

image

2009年4月15日星期三

CRM 2.0

social CRM: Twitter + CRM
Salsforce.com与Twitter的集成

2009年4月9日星期四

详解风投

任何一个公司的创办都离不开资金。传统上创业资金的合法来源只有两种渠道:一种是靠积累(比如继承遗产或者是自己多年的积蓄),第二种是靠借贷(比如从家人、亲戚和朋友那里凑钱,或者从银行抵押贷款)。如果要求创业者将自己一辈子的积蓄全部拿出来创业,很多人可能会知难而退,更何况最喜欢创业的年轻人恰恰是积蓄最少的群体。从银行贷款必须要有财产可抵押,对于有房子的人来讲最值钱的就是房子,但是房子一旦抵押出去很可能赎不回来,自己便无家可归了,而且不是人人都有房子可抵押。因此,年轻人要通过这两种传统的方法获得创业资金很不容易。这样,资金就成了创业的瓶颈。在很多国家,包括几乎整个欧洲,很少能看到新的公司兴起,原因就是没有人愿意提供创业的资金。

美国是一个富于冒险精神的年轻的国度。二战后,尤其是六十年代后,一些愿意以高风险换取高回报的投资人发明了一种非常规的投资方式—风险投资(Venture Capital Investment,or VC),在中国又简称风投。风险投资和以往需要有抵押的贷款有本质上的不同之处。风险投资不需要抵押,也不需要偿还。如果投资成功,风投资本家将获得几倍、几十倍甚至上百倍的回报,如果不成功,钱就打水漂了。对创业者来讲,使用风险投资创业即使失败,也不会背上债务。这样就使得年轻人创业成为可能。几十年来,这种投资方式总的来讲非常成功,硅谷在创造科技公司神话的同时,也创造出另一种神话——投资的神话。

第一节 风投的起源

哲学家黑格尔讲:“凡是现实的都是合理的;凡是合理的都是现实的。”(All that is real is rational, and all that is rational is real.)这句话在恩格斯的《反杜林论》中成为最有进步意义的话。任何事情都有它发生、存在和发展的理由,当然如果这个理由不成立了,它终究就会消亡。风投在六十年代后(而不是二战以前)在美国(而不是世界其它国家)蓬勃兴起有它的社会基础。

第二次世界大战后,美国取代英国主导了世界的金融业,在二战后的较长时间里,美国是资本的净输出国,比其它国家有多得多的资本可以进行投资。传统的投资方法是将资本投入到股市上去(Public Equity)或者购买债券(Bonds,比如国债)。前者一百多年来的回报率平均是百分之七左右,后者就更低了(美国国债的回报率是百分之五左右)。要想获得更大的投资收益,过去的办法只有投入到未上市流通的企业中去(Private Equity)。由于吃过 1929 年到 1933 年经济大萧条的亏,美国政府在很长时间里严格限制银行的各种炒作行为。直到七十年代时,闲余资本只能进行投资,很难用于金融炒作。我们今天看到的许多纯金融的一些游戏,比如对冲基金(Hedge Funds),那都是八十年代以后的事了。

而对私有企业的投资大致有两种,一种是收买长期盈利看好但暂时遇到困难的企业,比如投资大师巴菲特经常做的就是这件事,他很成功的案例是在美国大保险公司 Geico(原名政府雇员保险公司,Government Employee Insurance Company)快要破产时,百分之百地以超低价收购了该公司,并将其扭亏为盈,从而获得了几十倍的收益;另一种是投资到一个新的小技术公司中,将它做大上市或者被其它公司收购。后者就是风险投资的对象。

和抵押贷款不同,风险投资是无抵押的,一旦投资失败就血本全无。因此,风投资本家必须有办法确认接受投资的人是老老实实用这笔钱创业的实业家,而不是卷了钱就跑了的骗子(事实上,风险投资钱被骗的事件还时有发生)。第二次世界大战后,经过罗斯福和杜鲁门两任总统的努力,美国建立起了完善的社会保险制度(Social Security System)和信用制度(Credit System),使得美国整个社会都建立在信用(Credit)这一基础之上。每个人(和每个公司)都有一个信用记录,通过其社会保险号可以查到。美国社会对一个人最初的假定都是清白和诚实的(Innocent and Honest),但是只要发现某个人有一次不诚实的行为,这个人的信用就完蛋了——再不会有任何银行借给他钱,而他的话也永远不能成为法庭上的证据。也就是说,一个人在诚信上犯了错误,改了也不是好人。全美国有了这样的信用基础,银行就敢把钱在没有抵押的情况下借出去,投资人也敢把钱交给一无所有的创业者去创业。不仅如此,只要创业者是真正的人才,严格按合同去执行,尽了最大努力,即使失败了,风投公司以后还会愿意给他投资。美国人不怕失败,也宽容失败者。大家普遍相信失败是成功之母,这一点在世界其它国家很难做到(当然,如果创业者是以创业为名骗取投资,他今后的路便全被堵死了)。美国工业化时间长,商业发达,和商业有关的法律健全,也容易保护风险投资。

相比其他发达国家而言,美国是一个年轻的移民国家,很多美国人是第一代移民,爱冒险,而且想象力丰富,乐于通过创业来提升自己的社会和经济地位。美国的大学总体水平领先于世界,并且在理论研究和应用研究方面平衡得比较好,容易做出能够产业化的发明创造。这两条加在一起,使得风险投资人可以很方便的发掘到好的投资项目和人才。上述这一切原因凑到一起,就形成了风险投资出现和发展的环境。

高回报的投资一定伴随着高风险,但反过来高风险常常并不能带来高回报。任何一种长期赚大钱的金融投资必须有它内在的动力做保证。股票长期来讲总是呈上涨趋势,因为全世界经济在发展。风险投资也是一样,它内在的推动力就是科技的不断发展进步。由于新的行业会不断取代老的行业在世界经济中的地位,专门投资新兴行业和技术的风险投资从长期来讲回报必定高于股市。因此风险投资看上去风险大,但是并不是赌博,它和私募基金都是至今为止收益最高的投资方式(回报率分别在 15% 和 20% 上下)。正是鉴于它的高回报,不断有人和单位(Institute)愿意将越来越多的钱放到风险投资基金中去,比如斯坦福大学将其退休基金的很大一部分放到在风投公司 KPBC 去投资。近三十年来,风投基金越滚越大,从早期的一年几万美元,到 2006 年的每季度六七十亿美元。由于风投公司不公开财务报告,很难准确了解美国风投的准确规模,但是普遍估计 2007 年的美国的风投基金规模大约是二三百亿美元。现在,美国自己已经消化不了全部的风投资本了,因此这些年美国大的风投公司也开始在海外投资,其中相当大一部分投在了中国和印度(欧洲的风投至今仍然很少)。

从财务和税务上讲,风险投资和传统的私募基金(以下简称私募基金)类似,但是它们的投资对象和方式完全不同。私募的投资对象大多数是拥有大量不动产和很强的现金流(Cash Flow)的传统上市企业,这些企业所在的市场被看好,但是这些企业因为管理问题,不能盈利。私募基金收购这些企业,首先让它下市,然后采用换管理层、大量裁员、出售不动产等方式,几年内将它扭亏为盈。这时或者让它再上市,比如高盛收购汉堡王(Burger King)后再次上市;或者将它出售,比如 Hellman & Friedman 基金收购双击广告公司 Double Click,重组后卖给 Google。运作私募基金要求能够准确估价一个问题重重的公司、具有高超的谈判技巧和资金运作本领,但是最关键的是要能摆平劳工问题,其中最重要的是蓝领的工人和工会(因为私募基金一旦收购一个公司,第一件事就是卖掉不良资产和大规模裁员)。从这个角度上讲,私募基金是在和魔鬼打交道,但他们是更厉害的魔鬼。

风险投资则相反,他们是和世界上最聪明的人打交道,同时他们又是更聪明的人。风险投资的关键是能够准确评估一项技术,并预见未来科技的发展趋势。所以有人讲,风险投资是世界上最好的行业。

要了解风投首先要了解它的结构和运作方式,然后了解风投的结构和决策过程。

第二节 风投的结构

风险投资基金(Venture Capital Funds)主要有两个来源:机构(Institutes)和非常有钱的个人。比如哈佛大学和斯坦福大学的基金会就属于前者。当然,为了让投资者放心,风险投资公司自己也会拿出些钱一起投资。

风险投资基金一般是由风险投资公司出面,邀集包括自己在内的不超过 499 位投资者(和投资法人),组成一个有限责任公司(Limited Liability Company, LLC)。为了避税,在美国融资的基金一般注册在特拉华州,在世界上其它地区融资的基金注册在开曼群岛(Cayman Islands)或者是巴哈马(Bahamas)等无企业税的国家和地区(如果读者创业时遇到一个注册在加州或纽约的美国基金,那一定是遇到骗子了)。为什么不能超过 499 人呢?因为根据美国法律规定,一旦一个公司的股东超过五百人,就必须像上市公司那样公布自己的财务情况和经营情况。而风险投资公司不希望外界了解自己投资的去处和资金的运作,以及在所投资公司所占的股份等细节,一般选择不公开财务和经营情况,因此股东不能超过五百人。每一轮基金融资开始时,风投公司要到特拉华等地注册相应的有限责任公司,在注册文件中必须说好最高的融资金额、投资的去处和目的。风险投资公司会定一个最低投资额,作为每个投资人参与这一期投资的条件。比如红杉风投一期融资常常超过十亿美元,它会要求每个投资人至少投入两百万美元。显然,这只有机构和非常富有的个人才能拿得出。

风险投资公司每一次融资便成立一个有限责任公司,它的寿命从资金到位开始(Close Fund)到所有投资项目要么收回投资、要么关门结束,通常需要十年时间,前几年是投入,后几年是收回投资。一个风险投资公司通常定期融资,成立一期期的风险基金。基金为全体投资人共同拥有。风险投资公司自己扮演一个称作总合伙人的角色(General Partner),其它投资者称为有限合伙人(Limited Partner)。总合伙人除了拿出一定资金外,同时管理这一轮风险基金。有限合伙人参与分享投资回报但是不参加基金的决策和管理。这种所有权和管理权的分离,能保证总投资人能够独立地、不受外界干扰地进行投资。为了监督总投资人的商业操作和财务,风投基金要雇一个独立的财务审计顾问和总律师(Attorney in General),这两个人(或者公司)不参与决策。风险投资比炒股要凶险得多,一旦出错,基本上是血本无归。为了减少和避免错误的决策,同时替有限合伙人监督总投资人的投资和资本运作,一个风投基金需要有一个董事会(Board of Directors)或者顾问委员会(Board of Advisors)。这些董事和顾问们要么是商业界和科技界的精英,要么是其它风险投资公司的投资人。他们会参与每次投资的决策,但是决定由总投资人来做。

风险投资基金的总合伙人的法人代表和基金经理们一般都是非常懂技术的人,很多人是技术精英出身,很多人自己还成功创办过科技公司。比如被称为世界风投之王的约翰.多尔(John Doerr)原来是英特尔公司的工程师。中国最大最好的两个风投公司北光(Northern Light)和赛伯乐(Cybernaut)的创始人以前都是非常成功的企业家。比如创办北极光创投的邓峰和柯岩博士,原来是世界上最大的网络防火墙公司 Netscreen 的创始人,同时是网络安全的专家。赛伯乐的创始人朱敏博士是世界上最大的电话电视会议技术和服务公司 Webex 的创始人。为了确保对最先进技术的了解,风险投资公司会招很多技术精英,同时还会请外面的技术顾问,比如斯坦福大学的教授,一起来帮助评估每一项投资。

风险投资基金一旦进入被投的公司后,就变成了该公司的股份。如果该公司关门了,相对于公司创始人和一般员工,风投基金可以优先把公司财产变卖后的钱拿回去。但是,这时能拿回的钱通常比零多不了多少。如果投资的公司上市或者被收购,那么合伙人或者直接以现金的方式回收投资,或者获得可流通的股票。这两种方式各有利弊,都有可能被采用。前者一般针对较小的基金和较少的投资,总合伙人会在被投资的公司上市或者被收购后的某一个时间(一般是在解禁期Lock Period 以后)将该基金所拥有的全部股票卖掉,将收入分给各个合伙人。这样基金管理的成本较低。但是,如果基金占得股份较大,比如风险投资在很多半导体公司中常常占到股份的一半以上,这种做法就行不通了。因为上市后统统卖掉其拥有的股票,该公司的股价会一落千丈。这时,风险投资的总合伙人必须将股票直接付给每个合伙人,由每个合伙人自己定夺如何出售股票。这么一来,就避免了股票被同时抛售的可能性。虽然这么做基金管理的成本(主要是财务上的成本)增加了不少,但是大的风投公司必须这么做,比如 KPCB 和红杉风投在 Google 上市 180 天后,各自拥有几十亿美元 Google 股票,如果这些股票一下子涌到股市上,就会造成 Google 股票的大跌,于是两家风投将股票分给了有限合伙人,由他们自行处理。事实上大部分合伙人并没有抛售,结果 Google 的股票在 180 天后不降反涨。

为了降低风险,一轮风投基金必须要投十几家到几十家公司。当然,为了投十家公司,基金经理可能需要考察几百家公司,这笔运作的费用不是个小数,必须由有限合伙人出,一般占整个基金的 2%。风投公司总合伙人为了挣钱,还要从有限合伙人赚到的钱中提取一部分利润,一般是基本利润(比如 8%)以上部分的 20%。比如某个风投基金平均每年赚了 20% 的利润,总合伙人将提取(20%-8%)×20%=2.4%,外加 2% 的管理费共 4.4%,而有限合伙人得到的回报其实只有15.6%,只相当于总回报的四分之三。因此,风投公司的收费其实是非常高昂的。

管理风投基金的风投公司本身也是个 LLC,其最高管理者就是风投公司的合伙人了(Partner)。风投公司本身不会有什么 CEO、总裁之类的头衔(有这些头衔的风投公司一定是冒牌货),风投公司的合伙人不仅在风投公司内部地位崇高,而且在科技界呼风唤雨,比如 KPCB 的合伙人约翰?多尔就是 Google、太阳、亚马逊等多家上市公司和更多未上市公司的董事。在风投刚刚进入中国时,发生过这样一件趣事。在一次风险投资研讨会上,来了很多公司的 CEO、总裁等“贵宾”,礼仪小姐一看这些人的职务,便把他们请到前排入座。后来来了一位客人,礼仪小姐一打听是什么合伙人,便把他安排到后面一个不起眼的角落里就座。这位合伙人没说什么就在后排坐下了。结果那些 CEO 和总裁们看他坐到了最后,谁都不敢往前面坐了,因为这些 CEO 和总裁们所在的公司都是他投资的,而他们的职位也是他任命的。由此可见风投合伙人在业界的影响。

大的风险投资公司每一轮融资的资金都很多,比如红杉风投一轮基金动辄十几亿美元,如果每家公司只投资一两百万美元,一来没有这么多公司可供投资,二来即使有,总合伙人要在几年里审查几千几万家公司,也是明显不现实的,因此它们每一笔投资不能太小;而另一方面,新成立的公司本身都很小,尤其是初期,它们只需要融资几十万甚至几万美元就可以了,大风险投资公司就不会参与。对于这些公司的投资就由一类特殊的风险投资商 ——天使投资人来完成。

天使投资(Angel Investment)本质上是早期风险投资。天使投资人,简称天使,常常是这样一些有钱人:他们很多人以前成功地创办了公司,对技术很敏锐,又不愿意再辛辛苦苦创业了,希望出钱让别人干。在硅谷这样的人很多,他们的想法就是“不愿意当总(经理),只肯当董(事)”。

一些天使投资人独立寻找项目,进行投资,但是更多的情况是几个人凑到一起组成一个小的有限责任公司 LLC 或者有限伙伴关系(Limited Partnership,简称 LP),通常称作天使投资社 Angel Firm 来共同投资。天使投资社的经营管理方法千差万别,有的是大家把钱凑在一起,共同投资;有的是每个人自己选项目各自投资,同时介绍给社里,社里会加倍投入(Match)该天使投资人所投金额。其实,约翰.多尔和麦克.莫利兹投资 Google 是就是采用这种策略,他们两人每人从自己口袋里拿出一些钱投给Google,同时他们所在的KPCB和红杉风投拿出同样(可能更多)的钱也投到了 Google 上。当然,有些天使投资社管理更灵活,当某个天使投资人投资一个公司后,其他合伙人可以选择跟进(Follow),也可以不跟进(Pass),没有什么义务,大家坐到一起只是为了讨论一下问题而已,共同使用一个律师和会计。

了解了风险投资的管理结构,接下来让我们看看天使投资人和风险投资公司是如何投资的。

第三节 风投的过程

风险投资的过程其实就是一个科技公司创办的过程。在美国,一个新兴的科技公司(Startups)的创业过程通常是这样的:来自思科公司的工程师山姆和 IBM公司的工程师强尼发明了一种无线通信的技术,当然这种技术和他们所在公司的核心业务无关,两人觉得这种技术很有商业前景,他们就写了个专利草案,又花五千美元找了个专利律师,向美国专利局递交了专利申请(关键之一,知识产权很重要)。两个人下班后以及周末的所有时间全泡在山姆家的车库里用模拟软件 Matlab 进行模拟,证明这种技术可以将无线通信速度提高五十倍(关键之二,是否有数量级的提高是衡量一项新技术是革命性的还是革新性的关键。)两个人想了好几种应用,比如代替现有的计算机 Wifi,或者用到手机上,于是在原有的专利上又添加了两个补充性专利。强尼和山姆于是拿着自己做的 Powerpoint 投影胶片、实验结果和专利申请材料到处找投资者,在碰了七八次壁以后,找到了山姆原来的老板,思科早期雇员亚平。亚平从思科发了财后不再当技术主管了,自己和几个志同道合的有钱人一起在做天使投资人。亚平和不下百十来个创业者谈过投资,对新技术眼光颇为敏锐,发现山姆和强尼的技术很有独到之处,但是因为山姆和强尼讲不清楚这种技术的具体商业前景在哪里,建议他们找一个精通商业的人制定一个商业计划 Business Plan(关键之三,商业计划很重要)。

强尼找到做市场和销售的朋友迪克,并向迪克大致介绍了自己的发明,希望迪克加盟共同开发市场。迪克觉得和这两个人谈得来,愿意共同创业。这时出现了第一次股权分配问题。

到目前为止,所有的工作都是山姆和强尼做的,两个人各占未来公司的 50% 股权和投票权。迪克加盟后,三个人商定,如果迪克制定出一个商业计划书,他将获得 20% 的股权,山姆和强尼将减持到 40%。迪克经过调查发现,山姆和强尼的发明在高清晰度家庭娱乐中心的前景十分可观,于是制定了可行的商业计划书,并得到了 20% 的股权。三个人到目前为止对今后公司的所有权见下表。


三个人再次找到亚平,亚平请他的朋友,斯坦福大学电机工程系的查理曼教授作了评估,证实了山姆等人的技术是先进的并有相当的复杂度,而且有专利保护,别人不易抄袭模仿。亚平觉得可以投资了,他和他的天使投资团觉得山姆、强尼和迪克的工作到目前为止值(未融资前)一百五十万美元,而三个创业者觉得他们的工作值二百五十万,最后商定定价二百万(注:对公司的估价方法有按融资前估价,即 Pre-Money ,和融资后估价,即 Post-Money 两种。从本质上讲,这两种方法是一样的,我们这里的估计都以 Pre-Money 来计算)。亚平和他的投资团投入五十万,占到股份的 20%。同时,亚平提出下列要求:

1.亚平要成为董事会成员;

2.山姆、强尼和迪克三人必须从原有公司辞职,全职为新公司工作。并且在没有新的投资进来以前,三个人的工资不得高于每月四千美元;

3.山姆等三人的股票必须按月在今后的四年里逐步获得(Vested),而不是在公司成立时立即获得。这样如果其中有人离开了,他只能得到一部分股票;

4.如果有新的任何融资行为必须通知亚平的天使投资团。

现在山姆等人就必须正式成立公司了。为了将来融资和开展业务方便起见,他们在特拉华州注册了赛通科技有限公司。山姆任董事会主席、迪克和亚平任董事。山姆任总裁,强尼任主管技术的副总裁兼首席技术官,迪克任主管市场和营销的副总裁。三个人均为共同创始人。公司注册股票一千五百万股,内部核算价格每股二十美分。

在亚平投资后(的那一瞬间),该公司的内部估计已经从两百万增加到二百五十万,以每股二十美分计算,所有股东的股票只占到 1250 万股(250万/0.2=1250万)。那么为什么会多出来 250 万股,它们并没有相应的资金或者技术做抵押,这些股票的存在实际上稀释了(Dilute)所有股东的股权。为什么公司自己要印这些空头钞票呢?因为它们必须留出来给下面的用途:

1.由于山姆等人的工资很低,他们将根据自己的贡献,拿到一部分股票作为补偿;

2.公司正式成立后需要雇人,需要给员工发股票期权;

3.公司还有一些重要的成员没有进来,包括 CEO,他们将获得相当数量的股票。

现在,该公司各位股东股权如下:


接下来,山姆等人辞去以前的职务,全职创业。公司很成功,半年后做出了产品的原型(Prototype)。但是,50 万投资已经花完了,公司也发展到 20 多人。250 万股票也用去了 150 万股。这时,他们必须再融资。由于该公司前景可观,终于得到了红杉风投的青睐。红杉风投为该公司作价 1500 万美元,这时,该公司的股票每股值 1 美元了,比亚平投资时涨了四倍。红杉同意投资 500 万美元,占 25%,这样总股数增加到 2000 万股。同时,红杉风投将委派一人到该公司董事会任职。山姆等人还答应,由红杉风投帮助寻找一位职业经理人做公司的正式 CEO。双方还商定,融资后再稀释 5%,即 100 万股,为以后的员工发期权。现在该公司股权如下:


读者也许已经注意到,红杉风投现在已经成为了最大的股东。

两年后,该公司的样品研制成功,并获得东芝公司的订单,同时请到了前博通公司的 COO 比尔出任 CEO。比尔进入了董事会,并以每股三美元的价钱获得 100 万股的期权。当然新来的员工也用去一些未分配的股票。这时该公司的股价其实比红杉风投投资时,已经涨了两倍。比尔到任后,公司进一步发展,但是仍然没有盈利。于是,董事会决定再一次融资,由红杉风投领头协同另两家风投投资一千五百万。公司在投资时作价一亿五百万,即每股五美元。现在,该公司股权变为:


这时,投资者的股份已占到 44%,和创始人相对,即拥有了一半左右的控制权。又过了两年,该公司开始盈利,并在高盛的帮助下增发六百万股,在纳斯达克上市,上市时原始股定价每股 25 美元。这样,一个科技公司在 VC 的帮助下便创办成功了。上市后,该公司总市值大约七亿五千万美元。该公司股权如下:


这时,创始人山姆等人成了充满传奇色彩的亿万富翁,其员工共持有价值近五千万美元的股票,不少也成了百万富翁。但是,山姆等全体公司员工只持有 44% 的股份,公司的所有权的大部分从创始人和员工手里转移到投资者手中。一般来讲,一个创始人在公司上市时还能握有 10% 的股份已经很不错了。

作为最早的投资者,亚平的天使投资团收益最高,高达一百二十四倍。红杉风投的第一轮获利二十四倍,第二轮和其它两家风投均获利四倍。显然,越早投资一个有希望的公司获利越大,当然,失败的可能性也越大。一般大的风投基金都会按一定比例投入到不同发展阶段的公司,这样既保证基本的回报,也保证有得到几十倍回报的机会。

我不厌其烦地计算每一个阶段创始人和投资人的股权和价值,是想为那些想求助于风险投资创业的人提供一个参考。我遇到了许多创业者,他们在接触投资人时几乎毫无融资的经验,有些漫天要价,有些把自己贬得一钱不值。我们从这个例子中可以看到,风险投资必须是渐进的,在每一个阶段需要多少钱投入多少钱,这样对投资者和创业者都有好处。对投资者来讲,没有任何一家投资商会在刚开始时就把今后五年的开销全包了的,这样风险太大。对创业者来讲,早期的公司股价都不会高,过早大量融资会使得自己的股权占得太低,自己不但在经济上不划算,而且还会失去对公司的控制,甚至在创业的一半就被投资人赶走。在上面的例子中,天使投资人和风投一共投入两千零五十万美元,在上市前占到 43%,三个创始人和其他员工占 57%。如果在最初公司估价只有两百万时就融资两千多万,到上市前,投资方将占股份的 80% 以上,而创始人和员工占不到 20%。

上面的情况是一个简化得不能再简化的投资过程,任何一个成功的投资都会比它复杂得多。比如,通常天使投资人可能是几家而不是一家,很多人都会要求坐到董事会里去,这样在真正风险投资公司投资时,董事会已经变得很庞大。在这种情况下,风投公司通常会以当时合理的股价(Fair Market Value)从天使投资人手中买回股权,并把他们统统从董事会中请出去。否则每次开董事会坐着一屋子大大小小的股东,大家七嘴八舌,还怎么讨论问题。大部分天使投资人也愿意兑现他们的投资收益,以降低自己的投资风险。

上面这个例子是一个非常理想的情况,该公司的发展一帆风顺,每一轮估价都比前一轮高,实际情况可能并非如此。不少公司在某一轮风险投资资金用完的时候,业绩上并没有太大的起色,下一轮融资时估价还会下降。我的一个朋友曾经在这样一家半导体公司工作,他们花掉了近亿美元的投资仍然不能使公司盈利,这样必须继续融资,新的风投公司给的估价只有前一次估价的三十分之一,但是创始人和以前的投资人不得不接受这个估价,以避免公司关门,那样他们的投资一分钱也拿不回来。

第四节 投资的决策和公司的估价

我们在上一节中举了一个风投投资的例子,在这个例子中,我们忽略了两个关键性的问题:风险投资公司如何决定是否投资一个公司(或者一个产业),以及如何决定一个小公司的价值。这两个问题要回答清楚需要专门写一本书,因为每一次投资的情况都不相同,前一次投资的案例通常不能用到下一次。因此,这里我们简单介绍一下一些投资和估价的原则。

我们从上面的例子可以看出,风投常常是分阶段的,可以有天使投资阶段、第一轮和后一轮(或者后几轮)。天使投资阶段的不确定性最大,甚至无章可循,很多成功天使投资回想起来都不知道是如何成功的,包括开始投资 Google 的一些天使投资人都搞不清楚 Google 是干什么的。我的一位朋友是世界上该领域最大的公司的创始人之一,该公司先在纳斯达克上市,后来又以几十亿美元的高价卖掉。这位共同创始人对我讲,他们创业的第一笔钱,是从一个台湾的天使投资人那里拿到的五十万美元。这个投资人根本就不是IT领域的人,也搞不懂他们要干什么,最后请了一位相面先生给他们三个人看了看相,这三个人身材高大,面相也不错,于是那位投资人就投资了。当该公司以几十亿美元的高价被收购时,这位天使投资人也许应该感谢那位相面先生,为她带来了上百倍的投资收益。

正是因为这种不确定性,很多大的风险投资公司都跳过这一轮。一些更加保守的风投基金只参加最后一轮的投资。有些清清楚楚地说明在下面几种情况下不投资:

1.不盈利的不投,

2.增长不稳定的不投,

3.公司达不到一定规模的不投,

甚至有些风投基金只投已经有了十二到二十四个月内上市计划的公司。当然,到了这一步,常常是融资的公司挑选风投了,能在这一步拿到合同的风投要么是在IT 界关系很广的公司,要么是很有名的公司,以至于新兴公司上市时要借助它们的名头。通常,当股民们看到某家将要上市的公司是 KPCB 或者红杉风投投资的,他们会积极认购该公司上市发行(IPO)的股票。

比较复杂的是中间的情况。让我们来看两个我遇到的真实的例子,读者就会对风投的决策过程和股价方法有了解。

一位世界名牌大学的学生发明了一种手机上的软件,非常有用,他在网上让人免费下载试用,然后在试用期满后向愿意继续使用的用户收一些钱,这样几年他也挣了十来万美元。他想成立一家公司把这个软件做大做好。他找到一家风投,正巧这个风投基金的总合伙人是我的朋友,就拉我一起和这个创业者面谈。我们仔细听了他的介绍并且看了他的软件。投资人承认他是个有能力的年轻人,软件也是个好软件,但是不投资。投资人给他算了一笔账。这种手机上的软件要想推广必须在手机出厂时预装,一般来讲,虽然这种软件的零售价可以高达十美元以上,但是手机厂商出的预装费不会超过一毛钱,假定为八美分。通常一个领域在稳定的竞争期会有三个竞争者,不妨假设这个创业者能跻身于三强并排到老二。在软件业中,一般前三名的市场份额是 60%、20% 和 10%(剩下 10% 给其它的竞争者),那么在很理想的情况下,这位创业者可以拿到全世界 20% 的手机市场的预装权。我们不妨假设全世界手机一年销售十亿部,他可以拿到两亿部的预装权,即一年两千万美元的营业额。读者可能会觉得两千万美元是个不小的数目,但实际上在风投眼里却没有多少,在美国一个工程师一年的开销就要二十万美元。世界上有四五个国家近十个主要手机生产厂家,要想拿下这 20% 的市场需要一家一家谈。手机的软件不像个人计算机的软件,有了漏洞(Bug)在网上发布一个补丁自动就补上了,手机软件出了问题有时要将手机回收,因此手机厂商测试时间很长,拿下一个手机合同一般要 18 个月的时间,因此这款软件的销售成本是很高的。我们不妨假设这个小公司的纯利润率有 15%(已经不低了),那么它一年的利润是二百四十万美元,虽然读者觉得一年挣几百万美元已经不错了,但是因为这个生意不可能成长很快(取决于手机市场的成长),在股市上市盈率( P/E 值)平均也就是 20 倍,那么这个公司的市值最多最多不超过五千万美元。一个价值不超过一亿美元的公司是无法在美国上市的,因此这个公司还没有创办,它无法上市的命运就已经注定了。这位同学失败的原因不在技术上,不在他个人的能力,而是题目没有选好。风投喜欢的是所谓的十亿美元的生意(Billion Dollar Business)。最后,我做风投的朋友建议这位同学找找天使投资人,因为这样一件事做好了还是有利可图的,也许会有天使投资人喜欢投资。

风投由于是高风险的,自然要追求高回报。每当创业者向我介绍他们的发明时,我问的第一个问题就是:“你怎么保证把一块钱变成五十块”。虽然风险投资最终的回报远没有几十倍,但是,投资者每一次投资都会把回报率定在几十倍以上(上面那个手机软件显然达不到几十倍的回报)。因此我这第一句话通常就难倒了一多半创业者。大部分人听到这句话的反应是:“要这么高的回报?是否太贪了?两年有个三五倍不就不错了吗?”一般传统的投资几年有个三五倍的回报确实已经很不错了,但是由于风投失败的可能性太大,它必须把回报率定得非常高才能收回整体投资。据我一位做风投的朋友讲,红杉风投当年投资 Google 的那轮风投基金高达十几亿美元,只有 Google 一家投资成功了,如果 Google 的回报率在一百以下,整轮基金仍是亏损的。从另一方面看,对风投来讲几十倍的投资回报是完全可及的。五十年代早期风投 AR&DC 投资 DEC,回报是五千倍(,000 到 5,000,000),KPCB 和红杉风投投资 Google 是五百倍(一千万到五十亿美元),而 Google 的第一个天使投资人安迪.贝克托森的回报超过万倍(十万美元到今天的十五亿美元)。

要做到高回报必须首先选对题目。一个好的创业题目最要紧的是具有新颖性,通常是别人没想到的,而不是别人已经做成功的。很多创业者喜欢模仿,虽然这样也有成功的可能,却不可能为风投挣到几十上百倍的投资回报。比如中国九十年代出现了很多做 DVD 机的厂家,早期的几家挣到了钱,后面的几百家都没挣到什么钱;其次,创业的题目不能和主流公司的主要业务撞车。九十年代时,风投公司对软件公司的创业者问的第一个问题是“你要做的事情,微软有没有可能做?”这是一个无法回答的问题。如果回答“可能”,那么风投基金的总合伙人接下来就会说“既然微软会做,你们就不必做了。”如果回答是“不会”,那么总合伙人又会说“既然微软不做,看来没必要做,你们做它干什么?”二零零零年后,风投公司还是对软件和互联网的创业者问这个问题,只是微软变成了 Google。这个例子说明,如果创业的项目和微软和 Google 这样的公司的业务有可能撞车,那么失败的可能性极大。

除此之外,一个好的题目还必须具备以下几个条件:

1. 这个项目一旦做成,要有现成的市场,而且容易横向扩展(Leverage)。

这里面要说几句“现成市场”的重要性,因为一个新兴公司不可能等好几年时间,等市场培养成熟才开始销售。事实上有很多失败的例子是技术、产品都很好,但市场条件不成熟。比如当年甲骨文搞的网络 PC,从创意到产品都不错,但是当时既没有普及高速上网,更没有强大的数据中心,因此失败了。直到十年后的今天,Google 提出“云计算”的概念并建立了全球相联的超级数据中心,拉里?埃里森的这个梦想才可能成为现实。但是,没有一个小公司能等得起十年。

横向扩展是指产品一旦做出了,很容易低成本的复制并扩展到相关领域。微软的技术就很好横向扩展,一个软件做成了想复制多少份就复制多少份。太阳能光电转换的硅片就无法横向扩展,因为它要用到制造半导体芯片的设备,成本很高,而且不可能无限制扩大规模,因为全世界半导体制造的剩余能力有限。

2. 今后的商业发展在较长时间内会以几何级数增长。

我们前面介绍的手机软件的项目就不具备这个特点,因为它的增长被手机的增长限制死了。

3. 必须具有革命性。

我通常把科技进步和新的商业模式分成进化(Evolution)和革命(Revolution)两种,虽然它们的英文单词只差一个字母,意义可差远了。创业必须要有革命性的技术或者革命性的商业模式。

现在,让我们看一个好的例子——PayPal,它具备上述好题目所必需的条件。首先,它的市场非常大。世界上每年的商业交易额在数十万亿美元,其中现金占了将近一半,信用卡占四分之一;其次,它的市场条件成熟了。随着网上交易的发展,现金和支票交易显然不现实,只能使用信用卡,其交易方式如下:


而信用卡在网上使用经常发生被盗事件(比如商家是钓鱼的奸商,一旦获得买家信用卡信息,就会滥用其信用卡),安全性有问题。因此,需要一种方便的网上支付方式。

PayPal 的想法很好,由它来统一管理所有人的信用卡或者银行帐号,商家不能直接得到买家的帐号信息。交易时,商家将交易的内容告知 PayPal,并通过 PayPal 向买家要钱,买家确认后,授权 PayPal 将货款交给商家,商家无法得知买家信用卡和银行账户信息。而且,PayPal 要求商家和买家提供并确认真实的地址和身份,尽量避免欺诈行为。对于五百美元以下的交易,PayPal 为付款方提供保险,如果付款方被骗,PayPal 将偿还付款方损失,由它去追款。PayPal 的商业模型如下:


这种付款方式要安全得多,其好处是易见的,当网上购物的发展起来后,其推广的条件便具备了,不需要培养市场。而每年十几万亿美元的交易,对 PayPal 来说几乎是无穷大的发展空间,尽管 PayPal 现在每年以 30-40% 的高速度发展,到 2007 年仍然只有 40 亿美元左右的交易额,发展空间很大。所以 PayPal 这个题目是一个可以在很长时间内高速发展的生意。PayPal 在技术上虽然没有什么独到之处,但是它的商业模式却是革命性的。

风投公司一旦确定什么生意、什么公司可以投资,接下来的问题就是如何估价一家投资对象了。和投资股市不同,风险投资的对象大多没有利润甚至没有营业额可言,其估价不能按照传统的市盈率(P/E值)或者折扣现金流(Discounted Cash Flow)来衡量,关键是看今后几年该公司发展的前景以及看到目前为止该公司发展到哪一步了。和投资股市另一个不同之处,新创公司因为没有什么业绩可以衡量,创始人和早期员工的素质就变得很关键。一般来讲,一些 High Profile 的创始人,比如思科公司的资深雇员和斯坦福的教授,创办的公司容易获得较高的股价。

风险投资公司一旦将资金投入一个新创的公司后,它的投资任务还远没有完成,从某种角度上讲,它才刚刚开始。

第五节 风投的角色

对风险投资家来讲,最理想的情况是能当一个甩手掌柜:把钱投到一家公司,不闻不问,几年后几十倍的利润拿回来。这种情况对于天使投资确实发生过,比如有一个从洛杉矶募集资金的天使投资团将钱投入了早期的 Google,等 Google 上市时,该投资团的合伙人,包括 NBA 明星奥尼尔、加州州长施瓦辛格和一些好莱坞明星,稀里糊涂地就挣到了一大笔钱。对于比较大的风险投资,反而很少发生。大多数办公司的人的经验总有局限性,尤其是 IT 行业的创始人大多是技术出身,没有商业经验和“门路”(在美国,门路和在中国一样重要)。风投公司就必须帮助那些创始人把自己投资的公司办好。毕竟,他们已经在一条船上了。

风投公司介入一个新兴公司后的第一个角色就是做顾问。这个顾问不仅需要在大方向比如商业上给予建议,而且还要在很多小的方面帮助创始人少走弯路。我在前一章“硅谷的另一面”中提到,创办一个小公司会遇到形形色色的问题,而创始人常常缺乏处理这些问题的经验,这时风投公司(坐在被投公司董事会席上的那个人)就必须帮忙了。我的一位朋友原来是苹果公司副总裁、乔布斯的朋友,现在是活跃的投资人,他给我讲了下面一个例子。

留心各大公司图标(Logo)的读者也许会注意到,几乎所有大公司的图标和名称字体都是一种简单的颜色设计,尤其是在二十年前。至今很少有公司像 Google 那样使用明暗分明的彩色图标。我的这位朋友告诉我,这主要有两个原因:首先,彩色印刷比单色(和套色,比如普通黑字套蓝色)印刷要贵得多,公司初办,必须本着能省一点是一点的原则,如果一个公司所有的文件和名片都采用彩色印刷,办公成本将增加;第二,也是更重要的,所有的传真机和绝大部分复印件都是黑白的,印有彩色图标的公司传真不仅不可能像原来彩色的那样好看,而且有些颜色可能还印不清楚。这样不仅让商业伙伴感到糊涂,还不容易给客户留下深刻印象。他告诉我,很多年轻的创始人喜欢为自己公司设计漂亮的彩色图标,实际宣传效果并不好。比如下面一个漂亮的彩色图标:


当我在不同复印件上拷贝时,得到两个颇为不同的黑白复印件。不仅原来精心设计的丰富色彩在传真文件中看不到,而且每次黑白复印件深浅不同,反而会让商业伙伴和客户糊涂。


下面是 IBM 和 AT&T 公司早期的图标,它们避免了复印和传真可能带来的迷惑。


当然,上面只是一个小的例子。风投介入一个新兴公司后,可以帮助创业者少走很多弯路,总的来讲好的风投是创业者的伙伴。

当然,风投不可能替公司管理日常事务。这就有必要替公司找一个职业经理人来做 CEO(当然,如果风投公司觉得某个创始人有希望成为 CEO,一般会同意创始人兼 CEO 的职位)。每个风投基金投资的公司都有十几到几十家,要找到几十个 CEO 也并非容易的事。因此,有影响的老牌风投公司实际上手里总攥着一把 CEO 候选人。这些人要么是有经验的职业经理人,要么是该风投公司以前投资过的公司的创始人和执行官。风险投资家给有能力的创始人投资的一个重要原因就是锁定和他的长期关系。如果后者创业成功固然好,万一失败了,风投资本家在合适的时候会把他派到自己投资的公司来替自己掌管该公司日常事务。一个风投公司要想成功,光有钱,有眼光还很不够,还要储备许多能代表自己出去管理公司的人才。这也是著名风险投资公司比小投资公司容易成功的原因之一,前者手中攥着更多更好的管理人才。

风投公司首先会帮助被投资的公司开展业务。自己开公司的人都知道,一个默默无闻的小公司向大客户推销产品时,可能摸不对门路。这时,“联系”广泛的风投公司会帮自己投资的小公司牵线搭桥。越是大的风险投资公司越容易做到这一点。风投公司还会为小公司请来非常成功的销售人才,这些人靠无名小公司创始人的面子是请不来的。风投广泛的关系网对小公司更大的帮助是,它们还会帮助小公司找到买主(下家)。这对于那些不可能上市的公司尤其重要。比如,KPCB 早期成功地投资太阳公司后,就一直在太阳公司的董事会里,利用这个方便之处,KPCB 把它自己后来投的很多小公司卖给了太阳,这些小公司对太阳是否有用就不得而知了,但是,投资者的钱是收回来了,创业者的努力也得到了客观的回报。在这一类未上市公司收购案中,最著名的当属 Google 收购 YouTube 一事。两家公司都是由红杉风投投资,著名投资人莫利兹同时担任两家公司董事。YouTube 能成功地卖给 Google,红杉风投作用不小。风投行业经过几十年的发展,就形成了一种马太效应。越是成功的风投公司,投资成功上市的越多,它们以后投资的公司相对越容易上市、再不济也容易被收购。因此,大多数想去小公司发财的人,选择公司很重要的一个原则就是看它幕后的风投公司的知名度。Google 在很早的时候就已经是求职者眼中的热门公司了,固然有它许多成功之处和吸引人的办法,以及创始人的魅力,但是还有非常重要的一条就是它是第一家KPCB和红杉风投在同一轮一起投资的公司,在此以前,这两家风投从不同时投一家公司。

风投是新兴公司的朋友和帮手,因为它们和创始人的基本利益是一致的。但是通常也有利益冲突的时候。任何一个公司的创办都不是一帆风顺的,当一个被投公司可能前景不妙时,如果投资者对它是控股的,可能会选择马上关闭该公司或者贱卖掉,以免血本无归。这样,创始人就白忙了一场,因此创始人一定会倾向于继续挺下去,这时就看谁控制的股权,更准确的讲是投票权(Voting Power)多了。当一家公司开始盈利有了起色时,风投会倾向于马上上市收回投资,而一些创始人则希望将公司做得更大后再上市。投资人和创始人闹得不欢而散的例子也时常发生,投资人甚至会威胁赶走创始人。

创业者和投资者的关系对于成功的创业至关重要。首先,创始人总是在前台扮演着主角,风投在幕后是辅助者。如果投资者站到了前台,要么说明创始人太无能,要么说明投资人手伸的太长,不管是哪一种情况,公司都办不好;其次,创业者和投资者的关系是长期的,甚至是一辈子的。对投资者来讲,投资的另一个目的是发现并招揽人才。对投资人来讲,创业者能一次成功当然是最好的,但是,非常有能力能干事的创始人也会因为时运不济而失败,这时投资者如果认定创始人是个人才,将来还会为他的其它项目投资,或者将他派到新的公司去掌舵。因此,对创业者来讲,虽然风险投资的钱不需要偿还,但是,拿了投资者的钱就必须使出吃奶的力气尽力将公司做好,以获得投资者的青睐。一些短视的创业者把风投公司当作一次性免费提款机,只拿钱而不承担应尽的义务,实际上便永远地断了自己的后路。和很多行业不同,不同风险公司的投资家们一般会经常通消息,一个人一旦在风投圈子里失去了信用,基本上一辈子就失去了获得风投资金再创业的可能。

第六节 著名的风投公司

就像华尔街已经等同于美国金融业一样,在创业者眼里“沙丘路”(Sand Hill Road)便是风险投资公司的代名词。沙丘路位于硅谷北部的门罗公园市(Menlo Park),斯坦福大学向北一个高速路的出口处。它只有两三公里长,却有十几家大型风险投资公司。在纳斯达克上市的科技公司至少有一半是由这条街上的风险投资公司投资的。其中最著名的包括红杉资本(Sequoia Capital,在中国称作红杉风投)、KPCB(Kleiner,Perkins,Caufield & Byers)、NEA(New Enterprise Associates)、Mayfield 等等。NEA 虽然诞生于美国“古城”巴尔的摩,但经营活动主要在硅谷,它投资了五百家左右的公司,其中三分之一上市,三分之一被收购,投资准确性远远高于同行。它同时是中国的北极光创投的后备公司(backing company)。Mayfield 是最早的风险投资公司之一,它的传奇之处在于成功投资了世界上最大的两家生物公司基因科技(Genentech)公司和 Amgen 公司(这两家公司占全世界生物公司总市值的一半左右)。除此之外,它还成功投资了康柏、3COM、SGI 和 SanDisk 等科技公司。而所有风投公司中,最值得大书特书的便是红杉风投和 KPCB 了。

6.1 红杉风投


Sequoia 是加州的一种红杉树,它是地球上最大的(可能也是最长寿的)生物。这种红杉树可以高达一百米,直径八米,寿命长达两千两百年。1972 年,投资家唐纳德.凡伦汀(Don Valentine)在硅谷创立了一家风险投资公司,以加州特有的红杉树命名,即 Sequoia Capital。该公司进入中国后,取名红杉风投。

红杉风投是迄今为止最大、最成功的风险投资公司。它投资成功的公司占整个纳斯达克上市公司市值的十分之一以上,包括苹果公司、Google 公司、思科公司、甲骨文公司、Yahoo 公司、网景公司和 YouTube 等 IT 巨头和知名公司。它在美国、中国、印度和以色列有大约五十名合伙人,包括公司的创始人凡伦汀和因为成功投资 Google 而被称为风投之王的麦克.莫利兹(Michael Moritz)。

红杉风投的投资对象覆盖各个发展阶段的未上市公司,从最早期到马上就要上市的公司。红杉风投内部将这些公司分成三类:

?种子孵化阶段(Seed Stage)。这种公司通常只有几个创始人和一些发明,要做的东西还没有做出来,有时公司还没有成立,处于天使投资人投资的阶段。红杉风投投资思科时,思科就处于这个阶段,产品还没搞出来;

?早期阶段(Early Stage)。这种公司通常已经证明了自己的概念和技术,已经做出了产品,但是在商业上还没有成功,当初它投资 Google 时,Google 就处于这个阶段。当时 Google.com 已经有不少流量了,但是还没有挣钱;

?发展阶段(Growth Stage)。这时公司已经有了营业额,甚至有了利润,但是,为了发展,还需要更多的资金。这个阶段的投资属于锦上添花,而非雪中送炭。

红杉风投在每个阶段的投资额差一个数量级,分别为十到一百万、一百万到一千万和一千万到五千万。

相比其它的风投,红杉风投更喜欢投快速发展的公司(而不是快速盈利的),即使它的风险较大。苹果、Google、Yahoo 等公司都具备这个特点。那么如何判定一个公司是否有发展潜力呢?根据我对红杉风投的了解,它大致有两个标准:

第一、被投公司的技术必须有跳变(用红杉风投自己的话讲叫做 Sudden Change),就是我常说的质变或者革命。当然,如何判断一个技术是真的革命性进步还只是一般的革新,需要有专业人士帮助把关。由于红杉风投名气大,联系广,很容易找到很好的专家;

第二、被投公司最好处在一个别人没有尝试过的行业,即是第一个吃螃蟹的人。比如在苹果以前,微机行业是一片空白,在 Yahoo 以前,互联网还没有门户网站。这样的投资方式风险很大,因为以前无人能证明新的领域有商业潜力,当然,回报也高。这种投资要求总合伙人的眼光要很准。相对来讲,红杉风投的合伙人经历的事情较多,眼光是不错的。

对于想找投资的新创业的公司,红杉风投有一些基本要求

1.公司的业务要能几句话就讲得清楚。红杉风投的投资人会给你一张名片,看你能不能在名牌背面的一点点地方写清楚。显然,一个连创始人自己也说不清楚的业务将来很难向别人推销。

2.就像我前面讲的那样,如果该公司的生意不是十亿美元的生意,就不用上门了。

3.公司的项目(发明、产品)带给客户的好处必须一目了然。

4.要有绝活,这就不用多说了。

5.公司的业务是花小钱就能作成大生意的。比如说当初投资思科,是因为它不需要雇几个人就能搞定路由器的设计。让红杉风投投资一个钢铁厂,它是绝对不干的。

对于创始人,红杉风投也有一些基本要求

1.思路开阔,脑瓜灵活,能证明自己比对手强。

2.公司和创始人的基因要好。当然这里不是指生物基因。红杉风投认为,一个公司的基因在成立的三个月中形成,优秀创始人才能吸引优秀的团队,优秀的团队才能奠定好的公司的基础。

3.动作快,因为只有这样才有可能打败现有的大公司。刚刚创办的小公司和跨国公司竞争无异于婴儿和巨人交战,要想赢必须快速灵活。

有志创业的读者可以记住红杉风投的联系方式:

美国3000 Sand Hill Road 4-180,Menlo Park, CA 94025 电话: 650.854.3927,传真: 650.854.2977

中国北京 朝阳区霄云路 36 号国航大厦 2408 室,邮编 100027

中国上海 南京西路 1366,恒隆广场二座 2808 室,邮编 200040

找红杉风投前,创业者要准备好一份材料,包括

1.公司目的(一句话讲清楚)。

2.要解决的问题和解决办法,尤其要说清楚该方法对用户有什么好处。

3.要分析为什么现在创业,即证明市场已经成熟。

4.市场规模,再强调一遍,没有十亿美元的市场不要找红杉。

5.对手分析,必须知己知彼。

6.产品及开发计划。

7.商业模式,其重要性就不多讲了。

8.创始人及团队介绍,如果创始人背景不够强,可以拉上一些名人做董事。

9.最后,也是最重要的—想要多少钱,为什么,怎么花。

6.2 KPCB

在风投行业,能和红杉风投分庭对抗的只有同是在 1972 年成立的 KPCB 了。KPCB 是它的四个创始人 Kleiner、 Perkins、 Caufield 和 Byers 名字的首字母。近年来,它甚至有超过红杉风投之势。

KPCB 成功投资了太阳公司、美国在线(AOL)、康柏电脑、基因科技、Google、Ebay、亚马逊(Amazon)和网景等著名公司。它投资的科技公司占 Nasdaq 前一百家的十分之一。KPCB 投资效率之高让人膛目结舌。它最成功的投资包括:

?1999 年以每股大约 0.5 美元的价钱投资 Google 一千二百五十万美元,这笔投资的回报今天近千倍;

?1994 年,投资网景四百万美元获得其 25% 的股权,回报 250 倍(以网景公司卖给美国在线的价钱计算);

?1997 年投资 Cerent 八百万美元,仅两年后当思科收购 Cerent 后这笔投资获利二十亿美元,也是 250 倍。这可能也是它收回大规模投资最快的一次;

?1996 年投资亚马逊八百万美元,获得后者 12% 的股权,这笔投资的回报也有两、三百倍。

它早期成功的投资,包括对太阳公司和康柏电脑等公司的投资回报率不低于上述案例,只是美国证监会没有提供在线的记录,无法计算那些投资准确的回报。从这些成功投资的案例可以看出,风投公司追求五十倍的回报完全是可以做到的。

KPCB 另一个特点就是合伙人知名度极高、联系极广,除了活跃的投资人约翰多尔和布鲁克?贝叶斯(KPCB 中的 B),还包括美国前副总统戈尔、前国务卿鲍威尔和太阳公司的共同创始人 Bill Joy 等人。KPCB 利用他们在政府和工业界的影响,培养新的产业。比如鉴于戈尔同时担任了苹果公司的董事,KPCB 专门设立了一项培养苹果 iPhone 软件开发公司的一亿美元的基金。考虑到今后全球对绿色能源的需求,KPCB 又支持戈尔担任主席的投资绿色能源的基金,并且专门集资四亿美元建立了专门的基金。KPCB 通过这种方式,在美国政府制定能源政策时施加影响。KPCB 的这种做法是一般风险投资公司学不到的。

除了绿色能源外,KPCB 主要的投资集中在IT和生命科学领域。在 IT 领域,KPCB 将重点放在下面六个方向:

通信

消费者产品(比如网络社区)

企业级产品(比如企业数据管理)

信息安全

半导体

无线通信

想创业的读者可以从中找找好的创业题目。

作为世界上最大、最成功的风险投资公司。KPCB 依然保守着“礼贤下士”的好传统。KPCB 的合伙人,包括多尔本人,经常去斯坦福大学的“投资角”参加研讨会。多尔本人对年轻的创业者保证,他一定会读这些创业者写给他的创业计划书和 Email,虽然他可能没有时间一一回复。KPCB对创业者的要求和红杉风投差不多,要找 KPCB 的准备工作也和找红杉风投相似,我们就不再赘述了。中国是 KPCB 在美国本土外唯一有办公室的国家,它在北京和上海设有分部,联系地址是:

北京 100738

北京东长安街一号 东方广场 C 座 503-504 房间

上海 200031

淮海中路 1010 嘉华中心 2505

最后补充一点,除了红杉风投和 KPCB,日本的软银集团(Soft Bank)是亚洲最著名的风投公司,它成功地投资了雅虎和阿里巴巴,并且控股日本雅虎。IDG 虽然在美国没有太大的名气,但是它最早进入中国市场,在中国反而比红杉风投和 KPCB 成功。

结束语

虽然风险投资的目的是追求高利润,但这些高利润是它们应得的报酬。我对风险投资家的敬意远远高于对华尔街,因为风险投资对社会有很大的正面影响,而华尔街经常会起负面作用(最近美国的金融危机和油价暴涨就是华尔街造成的)。风险投资通常是为创业者雪中送炭,不管创业成功与否,它们都在促进技术进步和产业结构的更新。而华尔街做的事,常常是将一个口袋里的钱放到另一个口袋里,并从中攫取巨大的财富。

风险投资者是创业者幕后的帮手,但是他们不能代替创业者到前台去表演。创业的关键还在创业者自己。

2009年4月8日星期三

test

This entry is posted by
Windows Live Writer

2009年4月2日星期四

国图老馆周总理的警句

国图老馆的警句:抓紧学习,抓住中心,宁精勿杂,宁专勿多


Open ESB in action (1) - overview

1) 什么是ESB


ESB(Enterprise Service Bus)包含一条总线(bus)使得各种不同的系统可以通讯。在这个总线(bus)上使用共享的消息格式(shared messaging format),匹配器(Adapter)把各个后台应用系统的私有数据格式转换为共享的消息格式。此外ESB还提供一个平台来处理安全,变换,消息路由,事务,监控等。


2) 为啥用ESB


企业里都是有多个系统的。这些系统可能来自不同的厂商,采用不同的硬件平台,不同的软件平台,不同的编程技术,不同的格式。有些功能需求是跨系统的,因此必须让它们集成起来,协同工作。把各个系统集成起来,最大限度的发挥现有系统的价值,以适应快速变化的市场。


ESB的价值:满足快速变化的业务需求,一套统一处理异构环境的解决方案,减少维护成本





上图的方案是目前很多项目所采用的方式,没有良好的全局规划。当CRM和ERP系统需要集成时,就针对当前需求开发一个解决方案。用着用着,又有集成CRM和COBOL系统的需求了,再开发一个解决方案。每个解决方案都是一对一的,具体的,私有的,需要大量的编码工作,都是恰好满足当前的需求,可扩展和灵活性都非常低。每个解决方案都是从0开始做起,因此需要花很大的成本来维护。





从应用(application)的角度来看,一对一的解决方案,一个应用系统需要在经典的JavaEE三层架构上增加一个Integration层,在这个层里实现和各个外部系统整合的逻辑。当一个新需求过来,需要和一个新系统集成时,就得在这个Integration层增加新的逻辑。


下图是采用ESB的方案。所有现存的系统以及未来的新系统都连接到一个总线上,具体的需求主要在ESB上开发。ESB提供了一个平台,很多轮子已经造好,直接拿来用就可以,把用户的重心转向业务。





从应用的角度来看,应用只需要实现增加一个Integration层负责和ESB通讯。Integration层就比较简洁了,具体的逻辑搬到ESB里了。而ESB实现这些逻辑来又是得心应手,非常灵活的。





其实许多完善的企业软件(系统)都提供了Integration这么一个模块,比如Oracle EBS和Siebel CRM。Siebel CRM有EAI和EIM模块用来实现系统集成。应该是两种集成方案都支持,既支持端对端的集成,又支持挂在ESB上。


3)ESB的7个基本功能


Location transparency 位置透明性


Transport protocol conversion 传输协议的转换


Message transformation 消息格式的变换


Message routing 消息路由


Message enhancement 消息增强


Security 安全机制


Monitoring and management 总线监控和管理


4)EAI(Enterprise Application Integration)和ESB的区别


a)model


EAI:hub-and-spoke model,centeral, a single point of failure


ESB:bus-based model,a single logical bus, decoupling


b)use of open standard


EAI:proprietary technology


ESB:open standard, such as JMS,XML,WS


5)目前Open Source的ESB项目







时钟中的时钟

时钟的每个刻度都是一个静止的时钟,显示当前的时间。


ESB Study Plan 2009.4.2 - 2009.4.7

1) Read book <Open source ESB in action> 2009.4.2 - 2009.4.4
2) Learn Oracle ESB from OU or some other documents 2009.4.3
3) Read book <Enterprise Integration Pattern> 2009.4.5 - 2009.4.6
4) Compare Oracle ESB with open source ESBs 2009.4.7
5) Post note and summary on blog
6) Set up ESB development environment and practise the examples of above two books

2009年4月1日星期三

转:阿里软件投资十亿发起中小企业管理软件免费普及风暴[图]

注:果然阿里软件已经发现针对中小型企业管理软件的市场。如报道中所说的,它将采用在线服务的方式来提供管理软件,也就是软件即服务(SAAS)。前几天在一个blog上说淘宝的几个员工写了本《互联网时代的软件革命:SaaS架构设计》的书,书中加入了阿里巴巴公司的内容,有点推广公司,进行企业营销的嫌疑。看来阿里巴巴内部已经对SaaS有比较深的研究和实践。阿里软件会重点关注网店店主吗?早上看到阿里软件平台上的一个流量统计软件"好店铺统计"做的不错,是针对淘宝网店店主的,它也是通过web方式提供服务的。好像针对店主的主要是流量统计类服务。



阿里软件投资十亿发起中小企业管理软件免费普及风暴[图]


3月31日,全球领先的在线软件服务运营商、阿里巴巴集团旗下子公司阿里软件在京召开战略新闻发布会,向各大新闻媒介宣布一个大胆而"冒险"的宏伟计划:阿里软件将投入十亿元巨资,向中小企业推广管理软件,并承诺未来三年免费,发起面向中小企业的管理软件普及风暴,目标在三年内使中小企业管理软件普及率从10%提升至40%,让更多中小企业以信息化为武器,用先进的软件服务去管理生意,进而参与全球化竞争。这是金融危机爆发以来,中国软件业为帮助国内中小企业"过冬"所推出的最大手笔。 钱掌柜产品发布仪式阿里软件总裁王涛-软件司司长赵小凡-中国行业协会副理事长胡崑山

阿里软件总裁王涛致辞

针对此计划,阿里软件将率先推出突破性重量级产品--定位于电子商务时代,中国中小企业最易用、最安全、功能最全面的管理软件服务"钱掌柜",包含"财务、进销存、客户关系管理"企业管理三大核心应用。并承诺三年内从软硬件采购、软件升级到服务培训的全面免费,让中小企业无需投入即可实现管理体系全面转型升级。 阿里软件将通过创新的在线软件服务运营模式,向中小企业重新定义管理软件概念,以推动中国软件业进入全新时代。


阿里软件总裁王涛表示:"传统管理软件定位于集团企业和大中型企业,与中小企业之间存在巨大的天然鸿沟。阿里软件不仅仅满足于做中小企业管理软件市场的参与者,我们更想重新定义这一市场, 中小企业管理软件普及风暴将掀起中国管理软件市场 20 年来第一次免费浪潮,切实惠及受经济危机影响最大的中小企业群体,同时积极推动中国软件产业的改革创新。 " 阿里软件总裁王涛致辞




资料显示:目前我国 60% 以上的 GDP 、税收的 40% 以上和 75% 的就业岗位均来自占全国企业总数 99 %以上的中小企业。尽管中国管理软件市场已经历经 20 年的发展,但对于中小企业而言,传统管理软件应用成本和技术门槛过高,满足企业个性化需求的成本更高。即使在江浙沪等经济发达地区, 90% 的中小企业仍然用不起、用不好管理软件,管理软件对于中小企业来说是"奢侈品"的代名词。"如何使用管理软件?到底能带来怎样的效果?使用成本为什么这么高?"仍是广大中小企业挥之不去的疑问。


计世资讯研究报告显示, 2007 年中国通用型管理软件市场规模达 106.59 亿元,同比增长 21.4% 2008 年市场规模预计将达 128.18 亿元。另据中国社会科学院信息化研究发布的《中国中小企业信息化发展报告( 2007 )》显示:企业资源管理软件在中小企业中的普及率仅仅为 4.8% ,中国管理软件市场的增长远低于广大中小企业的需求。 王涛表示:"作为中国电子商务和软件业的一份子,我们对此现状可谓是'痛心疾首'。 4200 万中小企业迫切希望借助管理软件优化业务流程、提高市场快速反应能力,改变原有粗放式管理,进而实现企业转型升级。在此轮经济严冬,阿里软件投资十亿元,正是基于对中小企业需求的分析使然。"

传统管理软件的市场定位决定了其对于中小企业不能做到"量体裁衣"。王涛表示:"坐拥阿里巴巴集团 1.23 亿电子商务用户资源,阿里软件是最了解国内中小企业需求的软件服务运营商。产品易用性是阻碍中小企业使用管理软件的最大障碍之一,阿里软件自 2007 年成立以来 ,一直致力于为中国中小企业提供用得起、用得上、用得爽的在线软件服务。 '钱掌柜'完全符合这一特征,是我们两年多运营经验积累的结晶。


"
据介绍,阿里软件此次率先推出"钱掌柜"在线财务版本,除了具备传统财务管理软件总账报表等财会功能外,还拥有特别针对中小企业,从销售、采购环节入手,直观反映公司经营情况,中小企业主即使没有财务知识,仍可对企业资金状况一目了然。同时,阿里软件将在近期陆续推出"钱掌柜"进销存版本和客户管理版本,进而全方位满足中小企业管理的核心需求 -- "管钱、管货、管客户"。


"免费不是我们的杀手锏,对中小企业管理核心需求的理解将是阿里软件的最大优势。"王涛在接受记者采访时称,"中小企业管理软件普及风暴及'钱掌柜'业务的推出是阿里巴巴集团从' Meet at Alibaba '走向' Work at Alibaba '这一战略的重要转折,将对阿里巴巴集团打造电子商务基础建设和生态系统具有高度战略意义。"


王涛举例说,"钱掌柜"在线财务版本就集成了阿里巴巴集团独有的电子商务资源,中小企业主可以通过"钱掌柜"直接进行网上付款等业务处理;还可通过"钱掌柜",在线申请"阿里贷款" --2009 年阿里巴巴在国内 8 家银行支持下,面向中小企业推出,无抵押低息贷款累计总额超过 60 亿元的贷款资助计划。


业内指出:同样是阿里巴巴集团投入巨资,同样是面对一个高速成长的不饱和市场,同样是免费三年的爆炸性市场策略,联想到"淘宝"的发展轨迹,阿里软件此次的"大手笔"不由得让人浮想联翩。管理软件市场是否会成为又一个高度竞争的市场?


"中小企业管理软件普及风暴不是针对竞争对手的策略,完全是我们基于 90% 以上的中小企业没有使用管理软件的现状而做出的战略考虑,这次投资巨大的免费计划对促进中小企业信息化将起到革命性的推动作用,我希望三年后有超过 40% 的中小企业把自己从纸和笔上面解放出来,通过信息化用软件管理自己的生意,迅速拥有与中大型企业一样优秀的管理信息化武器参与全球化竞争。"


王涛表示:" 阿里软件专注于为中小企业、微型企业、个体商户提供信息化和管理软件服务, 对中小企业管理核心需求的理解是阿里软件最大的优势。我们将通过软件服务创新,重新定义专门给小企业使用的管理软件,凭借对阿里巴巴千万网商管理需求的理解,凭借我们在线软件服务技术方面的领先优势,强大的云计算能力,阿里软件一定会为中小企业提供最好用、最实惠的管理软件服务。感谢传统管理软件厂商在过去二十年里对企业信息化做出的卓越贡献,他们是我们学习的榜样。我真诚地期望更多的传统管理软件厂商能够加入阿里软件的管理软件免费普及风暴,一起帮助中小企业提升管理水平,更快地度过这个经济冬天!"

2009年3月31日星期二

淘宝API

下面一段文字摘自爱枣报: 现在网上购物越来越流行,淘宝开店也成为一种潮流,在淘宝开放API之后,围绕淘宝商城的网络应用也正在成为一条新的产业链。而在美国,苹果的iphone应用程序商店开业的最初几个月就创造了800万次的下载,迄今已经推出了1万多个应用程序,很多全世界各地的程序开发员也加入到了"Apple"树下吃苹果的行列。无论你是因为经济寒冬暂时"结构性失业",还是即将踏出大学校门暂时没有找到合适的归宿,如果有这方面的才能,不妨试试淘宝应用,说不定这就是你的第一桶金。


越来越多Web网站发布API,Google、Yahoo、Twriter等都有。苹果iphone的Store模式,是非常成功的,让一部分程序员获利颇丰。苹果提供了一个商业平台,程序员可以在平台上发布和维护自己的应用产品,苹果把这些来自程序员的应用产品推销给用户,用户在平台上查找和购买自己需要的应用产品,苹果从中收取提成。
1)不知道淘宝是否也提供这么一个平台?
2)在iphone平台上利用Apple提供的API可以开发许多实用的应用产品,那么利用淘宝API能开发那么广泛的产品吗?淘宝API提供了哪些功能?
3)淘宝的用户可以分为普通消费者和商家两类。淘宝API是针对哪类?两类用户应该有不同的需求。针对两类用户可以开发什么有价值的应用呢?有价值,用户才会花钱购买。
4)大部分来淘宝的普通消费者都是图便宜图便利,让他们在多花点钱可能就比较难了。不过按照图便利的思路,还是能开发许多应用供消费者使用的,但是付费,似乎比较难。或者循着社会化网络的思路,可以整合其他Web网站的API,完成一些分享,比如消费者购买了一台豆浆机,可能他要把这件事发布到blog或SNS网络上,并附加评论。
5)我觉得针对商家的应用更有盈利的可能。淘宝里的商家,所谓网店的店主,都是通过淘宝赚钱的,让赚钱的人花点小钱应该是比较容易的。如果有什么软件能帮店主增加销售额,应该对店主很有吸引力。传统的CRM系统是否可以借鉴?网店也是微型企业,店主也需要维护客户关系啊,CRM主要是个销售和营销用的,这些店主也都需要。然后再提供各类报表,财务,call center,BI和BAM等功能,哈哈,让小小的网店也用上先进的CRM系统。这样的CRM系统可以通过On Demand或者SAAS以服务形式提供给店主,每月费用很低,比如100块钱,这样店主就不用自己部署和维护,轻松上手,小成本投入,也免除桌面程序被破解的烦恼。优秀的CRM厂商主要是国外跨国公司,它们现在也很重视CRM On Demand的市场潜力,但是应该是不屑于这个小市场的,而且对网店店主来说,服务费用太高了。最大的竞争对手可能来自淘宝。因为淘宝可能自己打算做这一块,也许目前淘宝已经为店主提供类似的后台分析功能了。

APG all hands meeting

今天早上整个APG召开all hands meeting,各位manager介绍了各自团队在过去一年的成就以及接下来的计划。这是我来OARDC两年来第一次参加这么个all hands meeting。以前在微软中国技术中心实习时是每个月一次all hands meeting的,由于呆的时间不长,对微软的产品以及各部门的人员都不是很熟,因此虽然参加了几次all hands meeting,还是对各部门在做什么产品不甚了解。这次的all hands meeting,还是有些收获的。
1)通过各团队manager的介绍,基本明白每个team,每个人在做什么项目和产品了。其实每个员工和团队在公司内部的shiji blog都有一个自己的blog,每周的工作总结和每次会议记录都发布在blog上。如果平时留意去阅读一下这些blog,对他们的工作内容和职责就能了解个大概。公司内部的blog系统还是一种十分有效的管理方式,可以分享知识,记录历程。
2)各manager都用英语介绍了各自的team,基本上英语表达能力都是不错的。Sherly的英语还是最容易听的,语速很慢,吐字很清晰,很流畅,不停顿。Pascal的带点法国腔的英语,今天听来也不怎么费力。其他manager的英语稍微有点不流畅,语句老是出现"嗯,阿"之类的口头禅。在外企,英语口语的能力非常重要,就像国企里的背景,决定了升迁。因为在外企,首要的是和外国同事沟通。
3)这次会议给我印象较深的是Joey以及他做的报告,我想OARDC的老大Pascal也是这样的。会议的主角是各位manager,他们介绍团队,同时在领导面前展示自己的才能。首先GCI是一个比较新奇的项目,大家都不大清楚它是干嘛的,因此大家带着好奇。其次是Joey的演讲内容比较有特色。怎么在几个manager里脱颖而出,在领导面前留一个好印象?标新立异,与众不同是一个好方法。Joey的演讲内容与众不同的地方有用一段Video介绍自己的团队成员,以及最后用一个现场demo让Pascal也参与进来。而其他manager的初始想法都是在页面上罗列一下团队成员,用几个截图展示一下他们的team所做的工作。图片当然没有现场的demo令人印象深刻,而且让Pascal也参与到demo里来。最后Joey的反应速度还是不错的。那段Video由于网络问题,没有成功播放,于是他立刻改叫团队成员起立让大家认识一下,可见反应速度比较快,避免了现场的尴尬。后来回答台下人向他提问时,回答时很有条理,"第一点……,第二点……"。他认真了,努力了,他抓住了机遇。看来做什么事都得认真。
4)这次的all hands meeting应该是Sherly首次筹划的,和各位manager做了精心的准备,是比较成功的。可能以后all hands meeting会成为一个例行会议,每季度一次。此外Sherly打算每月举办内部演讲,分享知识,也是一个行之有效的团队管理手段。佩服Sherly的管理能力。

2009年3月27日星期五

考虑摊低

今天美邦服饰出年报,10送5派3,走势还算平稳,早盘冲高到3%多,尾盘涨幅不到1%。报喜鸟继续萎靡,本周继续缩量震荡。本以为美邦服饰能借年报飚一下,从而带动一下服装板块。美邦股价高估是肯定的。但是它对报喜鸟的上升空间还是有很大影响的。如果美邦一直在25块徘徊,报喜鸟是到不了20的。其实并不是只有报喜鸟乌龟爬,服装板块中的美邦服饰,七匹狼都是恨铁不成钢。除了服装板块,白酒板块也是涨幅很小的,探了一次底又探一次底,但是就是没跌穿去年11月份的大底。因此我觉得那个大底将会是绩优白酒股这次熊市的底,所以买入后可以睡觉去了。可见这波反弹,防御性板块都是涨幅较小的。一是本来就抗跌,二是不像周期性行业和实体经济息息相关,一会利好,一会利空,消息满天飞,很是吸引眼球。选择防御行业,就是选择孤单和坚守。白酒绩优股继续躺着,给我加仓的机会,不亦乐乎。我是觉得白酒板块的上涨潜力是要比服装板块大的,但是持有报喜鸟都2个月了,选择现在调仓,有点不甘心。持仓结构是需要调整,要加大白酒板块的比重。很多人对中线持有的股票,采用T+0或短线波段操作摊低成本,我觉得这对防御型板块还是比较可取的。防御型板块的走势经常是箱型震荡,不会大起大落,偶尔大起时卖出部分,偶尔大落时买回部分,倒是能摊低成本。反之周期型行业走势经常是一跌再跌没有最低或者一涨再涨,摊低常常成为一补再补最后深套或者一下子被逼空。有人经常说对这种那种股性的股票该如何操作。所谓股性,是否就是指防御型和周期型,或者和它们有很大关系。学学如何对防御型股票进行摊低成本。摊低应该把自己的持仓划分为两部分

FastExcel阅读笔记

FastExcel: Version 0.3.3

一、Compound File类设计
和复合文档有关类存放在如下几个package:
edu.npu.fastexcel.compound.io; 把对操作系统文件的IO操作封装成Reader和Writer,主要基于RandomAccessFile。为了提高文件读取速度,使用了Memory Mapped File,基于MappedByteBuffer。
edu.npu.fastexcel.compound.stream; 将Reader和Writer封装成ReadableStream和WritableStream。这里的Stream类就是对应于复合文档里的Stream。
edu.npu.fastexcel.compound; 将Stream包装成StreamReader和StreamWriter,比如SectorStreamReader就是读取复合文档中的扇区。最后提供复合文档的FileReader和FileWriter。
这部分的类设计和Java的IO类设计很类似,再查看一下Java的IO类设计,体味一下,加深理解和印象
此外这部分还包含一个SummaryInformation类,这个类有点独立,对于Excel读写来说是可有可无的。当初作者可能一时兴起,把它也写出来了。Office文档一般都有Summary Information Stream。加上这个类,整个Compound File类体系就比较完整了。


二、BIFF8类设计
1)BIFF8中比较有用的Record类别:
BOF,EOF:Substream的开始,结尾
SST:Shared String Table,存放所有出现在Worksheet中的字符串
SHEET:存在于Workbook Globals Substream,代表Workbook中的一个Sheet,描述了该Sheet的名字,类别,状态,偏移位置等信息。
DIMENSION:包含当前Sheet的有效范围,起止行号,起止列号。
LABELSST:单元格的字符串内容通过索引指向SST中的某个字符串。
2)Record类设计:
所有支持的BIFF8 Record类别都有对应的Record和Parser(RecordParser)类。比如SSTRecord,SSTParser。Record类用来处理写入,Parser类用来处理读取。
Record类组织成如下几个package:
edu.npu.fastexcel.biff.record; 处理通用的Record类别,可能出现各个Substream里,比如BOF
edu.npu.fastexcel.biff.record.globals; 处理那些只会出现在Globals Substream里的Record类别,比如SHEET
edu.npu.fastexcel.biff.record.sheet; 处理那些只会出现在Worksheet Substream里的Record类别,比如DIMENSION
edu.npu.fastexcel.biff.record.cell; 处理和单元格密切相关的Record类别,比如LABELSST
RecordFactory提供方法返回各种Record类的实例。RecordFactory使用Singleton模式。实现Singleton模式的方法是采用静态内嵌类的静态字段,不知道为什么这么实现?有什么好处?实现代码片段如下:


static class InstanceHolder {
static RecordFactory instance = new RecordFactory();
}

类似Parser类也组织成如下几个package:
edu.npu.fastexcel.biff.parser; 处理通用的Record类别,可能出现各个Substream里,比如BOF
edu.npu.fastexcel.biff.parser.globals; 处理那些只会出现在Workbook Globals Substream里的Record类别,比如SHEET
edu.npu.fastexcel.biff.parser.sheet; 处理那些只会出现在Worksheet Substream里的Record类别,比如DIMENSION
edu.npu.fastexcel.biff.parser.cell; 处理和单元格密切相关的Record类别,比如LABELSST
所有的Parser类都在ParserFactory里登记,存放在一个Map里,Map的键就是Record的类型号,值就是一个Parser对象。这里没有使用Singleton模式,反而有点Factory模式的味道。读取Worksheet Substream时有两种模式:全读取模式和事件模式。全读取模式就是在访问某个Sheet里的某个单元格之前,该Sheet的内容都已经读取完毕,访问时,就是简单的返回内容。事件模式就是在解析一个Sheet的过程中,解析出一个单元格就触发事件,客户程序可以按意愿监听事件。这两种模式有点类似XML的两种解析器,DOM和SAX。显然,事件模式采用监听器模式。监听器接口是SheetReadListener。抽象类SheetReadAdapter implements SheetReadListener,对监听器提供默认实现,这种实现方法应该叫 Adapter模式吧,类似于Java AWT里的MouseEvent,MouseEventListener,MouseAdapter。EventBasedSheetStream是事件的触发器,它有一个字段保存当前的监听器。监听器的设置是通过get和set方法,而不是add和remove方法,可见只支持一个监听器,不支持事件的多播。也许这个情境下的多播没啥意义。
3)BIFF8 File类设计
主要是三个package:
edu.npu.fastexcel.biff; 读取和写入都公用的一些东西,这里只有所有的Record Type常量,放在Types类中。
edu.npu.fastexcel.biff.write; 写入相关的几个Writer。Worksheet Substream和Globals Substream都有各自的Writer。BIFFWriter包含一个WorkBookGlobalsStreamWriter,而WorkBookGlobalsStreamWriter又包含一个SheetStreamWriters的list。BIFFWriter就是利用各个Substream的Writer来实现写入的。当然这些BIFF的Writer最终都要写入到一个复合文档的一个Worksheet Stream里,复合文档的Worksheet Stream的Writer又通过Java IO写入物理文件。也就是说BIFF的Writer使用了Compound File的Writer。这里还没有Excel文件和复合文档的概念,有的还只是Writer和Reader的概念。Excel文件是一个复合文档,看起来设计时要采用继承。而这里只有Writer和Reader的概念,使用的却是组合。我想用继承也是可以的,不过这里用的是组合,组合有组合的好处。有哪些好处呢?
edu.npu.fastexcel.biff.read; 读取相关的类,设计思路和write部分相似。一般来说read部分的类会稍微比较多,处理稍微复杂,因为一般要读取的文件都是MS Excel产生的标准xls文件,内容比较全,包含各种额外的信息,比如格式信息,字体信息。写入生成一个xls文档就比较简单了,只把文本内容写入就行。MS Excel打开这样的文档会用默认的格式展现数据,重要的是文本内容显示出来了,而并不在意文本显示出来是怎样的。


三、用户API设计
这里说的API就是指提供给最终用户使用哪些类。最终用户可能不关心底层的实现细节,他想要了解的是,一个Excel有几个Sheet,每个Sheet有什么内容。因此最高层的API包装应该只是提供诸如Workbook,Sheet等概念。API在edu.npu.fastexcel这个package里,Workbook,Sheet都是接口,FastExcel类的设计应该使用了Facade模式,仅仅提供两个方法,创建一个可读取Workbook和创建一个可写入Workbook,把具体如何使用Writer和Reader实现所需功能的细节全部隐藏起来。这个package里还包含监听器接口SheetReadListener,因为这个接口也是用户所关心的。如果用户程序打算监听事件,就需要实现这个接口。在这个package还有ReadableWorkbook、WritableWorkbook、ReadableSheet、WritableSheet类,我感觉可以把它们放到其他package里更好。


四、建议
1)在每个package下面都包含一个描述文件,描述这个package里的类是干嘛的,就更清晰了。
2)我感觉可以把edu.npu.fastexcel这个package下的ReadableWorkbook、WritableWorkbook、ReadableSheet、WritableSheet类,放到其他package里更好。
3)是否应该使用一个示意为私有package的前缀,从而将一些包含具体实现细节,不易于最终用户重用的package标明为私有,比如在edu.npu.fastexcel下建立一个edu.npu.fastexcel.private子package,然后让Compound,BIFF8等实现全部放到edu.npu.fastexcel.private包下。因为提供诸如可重用的Compound File类并不是作者的意图。

2009年3月26日星期四

该跌不跌,该涨不涨

今天早盘市场萎靡不振,跌多涨少,报喜鸟却红着,微涨1%。下午14:30过后,大盘发飙,劲升50多点,报喜鸟却依然只涨2%。该跌不跌,该涨不涨,按照经典理论来看,有主力在洗盘吸筹。但是吸了那么久,还没吸够吗?

Excel文件格式(BIFF)

Excel的文件格式是BIFF(Binary Interchange File Format)。从Excel97 - Excel2003使用的是BIFF version 8,可是说BIFF8是目前最广泛使用的Excel版本。BIFF8基于微软的复合文档格式。Excel文档的内容存放在一个Stream里。一个新建的空白Excel文件,一般包含Root Storge,Workbook Stream,<05H>SummaryInformation Stream,<05H>DocumentSummaryInformation Stream。Workbook Stream就存储了Excel的内容。把整个Excel文件叫Workbook,Workbook里至少有一个Worksheet。Excel文件不仅存放Excel的文本内容,还存放一些格式,比如字体信息,颜色。Excel的逻辑结构可以用下图表示:

Workbook globals里就记录了整个Workbook公用的东西,比如格式,字符串常量,文档保护等。worksheets,workbook globals都是存储在Workbook Stream里,可以把它们看做是substream。各个substream按一定顺序出现在Workbook Stream里,如下图所示:

图中所示,Globals Substream是必须的,而且至少保护一个Sheet Substream。那么这些Substream是如何区分开的,如何知道一个Substream从文件的哪个位置开始,哪里结束呢?这得从BIFF8描述信息所采用的格式来说。这里说的"信息",包含很多,比如格式信息,位置信息,文本信息,图片信息,宏代码信息,等等。这么多信息要记录,BIFF8是采用Record的方式来记录的。一个Record描述一个信息。因此有很多种Record。因此Record Type肯定是Record数据结构的组成部分。Record是不定长的,种类非常多,各个种类的内容格式千差万别。但是基本遵循如下的结构:

结构包含两部分,Record Header和Record Data。Record Header部分的前2字节是Record Type,然后是2字节描述Record Data的长度。文档给出了几乎所有的Record Type,针对每种Record,描述了Record Data里各字节的含义。Substream的开始和结束,就是采用BOF和EOF这两个Record Type。也就是说在Workbook Stream是Record序列,一个Record接着一个Record,有些BOF的record表示接下来要描述一个Substream了。因此处理程序可以一个Record一个Record的读取,先检查读入的Record的Type,如果不认识,那么就不处理Record data部分,如果认识就解析Record data部分的含义。Excel的版本是不断升级的,补丁是不断更新的,新的版本,新的build就可能有新的Record Type。因此旧版本的Excel打开高版本的xls文件,有些Record就无法识别,但是不影响基本数据的读取。FastExcel就是根据这个原理,只处理一些和文本内容相关的必需的Record Type,像格式之类的Record就不处理了,因此就Fast了。
当一个Cell的内容为字符串常量时,BIFF8一般把这个字符串常量用SST这种Record记录在Global Substream,然后在Sheet Substream里使用LabelSST这种Record引用这个字符串。LabelSST这种Record的Record Data部分就包含了行号,列号,字符串索引号(index)等信息。查看文档,可知LabelSST类型的Record Header的Identifier是00FD(hex),size是10,Record data结构如下图所示:

FastExcel的项目主页也说了它们只实现了如下的Parser来处理一些Record,仅仅是针对文本内容,BIFF8的Record类型可是几百个。这里的BOFParser就是处理BOF类型的Record,LabelSSTParser处理LabelSST类型的Record。
* BOFParser
* EOFParser
* BoundSheetParser
* SSTParser
* IndexParser
* DimensionParser
* RowParser
* LabelSSTParser
* RKParser
* MulRKParser
* LabelParser
* BoolerrParser
* XFParser
* FormatParser
* DateModeParser
* StyleParser
* MulBlankParser
* NumberParser
* RStringParser
BIFF8里多字节数据,比如4字节整数,2字节整数,Unicode都是采用Little-Endian的存储方式。

2009年3月25日星期三

微软复合文档格式 (Compound Document)

今天看到一个FastExcel的开源项目,它能够使用纯Java代码读取Excel文件的文本内容以及写入内容保存为Excel文件。这项目的作者应该是一个中国人,因为项目源代码中包含的JUnit测试代码里居然有中文数据。把项目的源代码导入到Eclipse编译,运行了附带的测试用例。源代码里的package开头是edu.npu。baidu一下,npu好像是西北工业大学。作者在项目的简介里介绍了代码的工作原理是依照Excel的文件格式,直接进行读取。而Excel的文件格式是基于复合文档(Compound Document)的。项目主页上有链接给出复合文档格式Excel文件格式,都是OpenOffice社区整理的。
复合文档简单的说就是在一个文件里可以内嵌其他各种文档,这些内嵌的文档还具有目录结构,可以说复合文档格式就是在一个文件里面实现一个文件系统。从逻辑上说复合文档包含Storage和Stream。Storge相当于我们熟知的操作系统文件系统里的目录,Stream相当于文件。下图就是复合文档的逻辑示意图。和操作系统的文件系统类似,同一个Storge下的Stream不可以重名,不同Storage下的则可以。

其实这个图的内容,很久之前我就了解了,而且很好理解。当初看MFC书籍讲复合文档的时候就在这个层次上。自己也没深究过要实现这样的逻辑结构,物理上该如何存储。今天特地阅读了这个文档格式,25页,不是很长,边阅读边查看一个Excel文件的物理存储结构,这样更好理解。
物理结构图:

开始是一个文件头(Header),固定长度512字节。然后是一个接一个的扇区(Sector),大小是可变的,一般是512字节。这里的Sector可以类比为磁盘上的扇区,反正就是一块文件空间。一个复合文档,除了文件头就是扇区。因此复合文档的内容数据主要是存放在扇区里的。此外有些扇区得用来存储一些元数据,描述扇区和扇区之间的关系,哪些扇区是用来干嘛的,那几个扇区组成一个Stream。每个扇区有一个标识符,也就是编号,从0开始,依次递增。扇区的编号用有符号的4字节整数来表示,这样在内部就可以引用了。扇区号可以是负数,几个负扇区号的特殊含义是:

就像磁盘文件系统,一个文件有多个块组成,在复合文档里,一个Stream也是由多个Sector组成。那么多个Sector的顺序是怎么样的?一个Stream到底有几个Sector组成呢?这是通过Sector Allocation Table(SAT)来实现的。SAT顾名思义就是跟踪Sector的分配情况。SAT也得需要空间来存储啊!当然也是存储在Sector里的。可以说SAT也是一种特殊的Stream,它描述一个Stream拥有哪些Sector。那么谁描述它自己拥有哪些Sector呢?是MSAT,Master Sector Allocation Table。MSAT描述了哪些Sector是被SAT占用的。那谁描述MSAT存放在哪些Sector?好像无休止了!MSAT是存放在Header里的。这下摆脱溯源的烦恼了。但是Header大小是固定512字节的,因此能存的信息是有限制的。如果SAT占用的Sector很多很多,Header里都描述不下,怎么办?还是有办法的,扩展!当Header里的空间不够用时,就用Sector,在Header里有字段记录哪个Sector是MSAT扩展空间的第一个扇区,在MSAT专用的扇区里的最后4字节给出下一个MSAT专用的Sector,这样一个链表就现成了。因此一个MSAT扇区最多可以记录(512-4)/4=127个AST扇区。

通过MSAT就可以找出所有被SAT占用的Sector。这些SAT的Sector就描述了哪个几个Sector是属于一个Stream的以及Sector之间的顺序。这似乎又需要一个链表。对的。这次的链表结构是这样的:



把SAT看做一个数组,数组的元素就是扇区编号,扇区编号用4个字节来存储。比如SAT[i] = j,表示SAT数组的第i个元素是扇区编号j。如果把数组索引就当做扇区编号,SAT[i] = j,SAT[j] = k ... SAT[x] = -2,那么就有一串扇区编号了,i -> j -> k ...-> -2,扇区号-2表示串的结尾。这样,Stream就可以用这么一串扇区序列来描述的,关键是能有一个元数据描述这个Stream,并记录这个Stream的起始扇区号。知道了起始扇区号,就可以通过SAT找到所有其他Sector了。可见SAT也是一个链表结构。好像学数据结构的时候学过这种结构,具体叫啥忘记了。
那怎么存储Stream元数据呢?毫无疑问,是存放在Sector里。SAT就是存储了一些扇号串,看不出哪一串是用来描述Stream的元数据的。于是复合文档就有另一个概念了,目录(Directory)。Directory包含一个描述Stream和Storge的元数据的数据结构。如下图所示,目录里面有目录项,目录项也有编号,从0开始。
每个目录项就描述该项是Stream还是Storge,或者其他。如果是Stream,那么就记录起始扇区号是多少,如果是Storge,包含记录它有哪些Storge和Stream。一个Storge下可能有很多个Storge和Stream。复合文档是把这些子Stream和Storge组成一棵红黑树。这样Storge就可以只记录这颗红黑树的根节点就达到记录所有子Storge和Stream的目的。当然每个目录项得有字段里维护这么一颗红黑树。显然这种方式下,一个Stream或Storge只能在一棵红黑树里。为啥使用红黑树,有什么优点?慢慢思考中!
此外,复合文档还有其他一些概念,比如Short-Stream。Short-Stream一般存储在Root Storge这个目录项里。

2009年3月23日星期一

非常弱势

报喜鸟今天依然非常弱势,收盘才涨0.8%,大盘都涨了2%左右。3月19日的冲击涨停有人说是敢死队大单对倒,机构借机出货。敢死队干嘛要来对倒?试探?服装类股票美邦服饰,七匹狼都涨的很少。这周五美邦要公布年报了,能否启动,带领服装类股票反弹。预期报喜鸟的年报和一季报都是不错的,再耐心等等吧,马上到4月份了。
酒类股票也依然在底部震荡,还没起来的意思。不错。还有时间买入。

BloggerMode - syntaxhighlighter - Blogger Mode - Google Code

BloggerMode - syntaxhighlighter - Blogger Mode - Google Code: Blogger Mode
Blogger has a nasty habit of replacing all new lines with <br/> tags which makes it impossible to post code snippets.
To fix the situation version 1.5.1 introduces 'Blogger Mode' which can be enabled before a call to HighlightAll() by a call to BloggerMode() like in the example below:


dp.SyntaxHighlighter.BloggerMode();
dp.SyntaxHighlighter.HighlightAll('code');

Java.exe使用哪个JRE


/*
* Find path to JRE based on .exe's location or registry settings.
*/
jboolean
GetJREPath(char *path, jint pathsize)
{
char javadll[MAXPATHLEN];
struct stat s;

if (GetApplicationHome(path, pathsize)) { //If path is "c:\foo\bin\java", then application home is "c:\foo".
/* Is JRE co-located with the application? */
sprintf(javadll, "%s\\bin\\" JAVA_DLL, path);
if (stat(javadll, &s) == 0) {
goto found;
}

/* Does this app ship a private JRE in <apphome>\jre directory? */
sprintf(javadll, "%s\\jre\\bin\\" JAVA_DLL, path);
if (stat(javadll, &s) == 0) {
strcat(path, "\\jre");
goto found;
}
}

/* Look for a public JRE on this machine. Find path in registry. */
if (GetPublicJREHome(path, pathsize)) {
goto found;
}

fprintf(stderr, "Error: could not find " JAVA_DLL "\n");
return JNI_FALSE;

found:
if (_launcher_debug)
printf("JRE path is %s\n", path);
return JNI_TRUE;
}

Tips for software engineer: Using SyntaxHighlighter on BLOGGER

Tips for software engineer: Using SyntaxHighlighter on BLOGGER: "Using SyntaxHighlighter on BLOGGER "

SyntaxHighlighter is a free syntax highlighter written in JavaScript.

It can insert colored code snippets on a web page using client-side javascript only. It is ideal tool for users of BLOGGER because we do not have server side resource to parse and highlight the code. And we are lazy, we do not want to write a lot of CSS to just post a code snippet. :-).

However it takes a little twisting to make it work properly.

Below are the steps to setup:
1. Download and find a place to host the library files for SyntaxHighlighter. A free choice is, of course, Google Page Creator;
2. Login to BLOGGER, go to: 'Settings > Template > Edit HTML', make the following changes (credit goes to yehyeh's blog):

<link href='http://[YOUR HOST]/SyntaxHighlighter.css' rel='stylesheet' type='text/css'/>
<script src='http://[YOUR HOST]/shCore.js' type='text/javascript'/>

<script src='http://[YOUR HOST]/shBrushCpp.js' type='text/javascript'/>
<script src='http://[YOUR HOST]/shBrushCSharp.js' type='text/javascript'/>
<script src='http://[YOUR HOST]/shBrushCss.js' type='text/javascript'/>
<script src='http://[YOUR HOST]/shBrushJava.js' type='text/javascript'/>
<script src='http://[YOUR HOST]/shBrushJScript.js' type='text/javascript'/>
<script src='http://[YOUR HOST]/shBrushSql.js' type='text/javascript'/>
<script src='http://[YOUR HOST]/shBrushXml.js' type='text/javascript'/>

<script class='javascript'>
//<![CDATA[
function FindTagsByName(container, name, Tag)
{
var elements = document.getElementsByTagName(Tag);
for (var i = 0; i < elements.length; i++)
{
if (elements[i].getAttribute('name') == name)
{
container.push(elements[i]);
}
}
}

window.onload = function() {
var elements = [];
FindTagsByName(elements, 'code', 'pre');
FindTagsByName(elements, 'code', 'textarea');

for(var i=0; i < elements.length; i++) {
if(elements[i].nodeName.toUpperCase() == 'TEXTAREA') {
var childNode = elements[i].childNodes[0];
var newNode = document.createTextNode(childNode.nodeValue.replace(/<br\s*\/?>/gi,'\n'));
elements[i].replaceChild(newNode, childNode);

}
else if(elements[i].nodeName.toUpperCase() == 'PRE') {
brs = elements[i].getElementsByTagName('br');
for(var j = 0, brLength = brs.length; j < brLength; j++) {
var newNode = document.createTextNode('\n');
elements[i].replaceChild(newNode, brs[0]);
}
}
}
//clipboard does not work well, no line breaks
// dp.SyntaxHighlighter.ClipboardSwf =
//'http://[YOUR HOST]/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');
}
//]]>
</script>

3. Now you can post code snippet on BLOGGER using either 'pre' or 'textarea' tag.

Notice:
1. The solution above is found here: http://yehhou.blogspot.com/2007/06/blogger-dpsyntaxhighlighter.html. That blog was written in Chinese. I made some minor changes and posted here. The reason for the Javascript code to remove <br/> tags is because BLOGGER has a setting to automatically add <br/> where there is line break. It is very convenient feature for blog posters, but somehow syntax highlighter will display the <br/> tag in plain text;
2. Clipboard for the SyntaxHighlither does not work well here. It tends to give you the text without line breaks, so I commented out the Javascript that setup the clipboard function;
3. When posting HTML code, remember to replace < with &lt;, and replace > with &gt;;
Next:
Now you've got beautiful code in your blog, next step might be some nice charts for your blog. You will find a way to embed a chart with one line HTML code here: Embedding Chart in Web Pages Made Easy
And, here is a post to show you how to Embed Silverlight video on Blogger:Embed Silverlight Streaming in Blogger
Update 11/11/2008
There are a few questions and comments regarding script hosting. .NET Dev posted an interesting idea here:
http://urenjoy.blogspot.com/2008/10/publish-source-code-in-blogger.html

Basically, he setup the links directly to the trunk location of SyntaxHighlighter project.

打印Java.exe启动过程中的Debug信息

可以通过设置一个环境变量 _JAVA_LAUNCHER_DEBUG来实现打印Java.exe启动过程中的Debug信息。java.c有如下的代码:

if (getenv("_JAVA_LAUNCHER_DEBUG") != 0) {
_launcher_debug = JNI_TRUE;
printf("----_JAVA_LAUNCHER_DEBUG----\n");
}


2009年3月20日星期五

2009年3月19日星期四

车型果盆

车型果盆,吃水果时可以玩一把,大小不一,叠在一起不占空间:

隐藏blogspot的navbar


#navbar-iframe {height:0px;visibility:hidden;display:none}

test

mail -> blogger