2009年12月14日星期一

国内Openid的使用和支持情况

这里说一下现在(2009.12.15)国内对OpenId的一些使用和支持情况。国外的支持和使用很多,比国内好环境好。
国内有些曾经支持但现在不支持的,或已经无法访问了。


使用方:
乐铺:http://www.loopo.cn (使用Google帐号或 URL)
土豆(使用人人网)
京东商城(支付宝、qq、人人网)
365商城 http://www.365.com/ (支付宝)
钻石小鸟 http://www.zbird.com/ (支付宝)
又拍Yupoo: http://www.yupoo.com/ (openid url)


提供方:
人人网
支付宝
QQ返利(并非openid,腾讯只支持少数合作伙伴的电子商务网站) http://fanli.qq.com
豌豆 www.onedoor.cn
豆瓣支持OAuth认证 http://www.douban.com/service/apidoc/auth
www.openid.cn(无法访问了)
www.openid.org.cn

2009年8月17日星期一

不要被舒适的办公环境所蒙蔽

    现实中的残酷,市场中没有硝烟的战争,杀人不见血。
    然而,这一切很容易被人们舒适的办公环境所掩盖,因为办公室里有冷暖空调吹着,饮水机里有水喝,食堂有饭吃,电脑还能上网,办公楼打扫得一尘不染....

    舒适的环境使人们产生错觉,忘记背后的现实。

2009年8月11日星期二

Map 按值排序 (Map sort by value) - Java

Map是键值对的集合,又叫作字典或关联数组等,是最常见的数据结构之一。在java如何让一个map按value排序呢? 看似简单,但却不容易!

比如,Map中key是String类型,表示一个单词,而value是int型,表示该单词出现的次数,现在我们想要按照单词出现的次数来排序:



Map map = new TreeMap();

map.put("me", 1000);

map.put("and", 4000);

map.put("you", 3000);

map.put("food", 10000);

map.put("hungry", 5000);

map.put("later", 6000);




按值排序的结果应该是:




key value

me 1000

you 3000

and 4000

hungry 5000

later 6000

food 10000



首先,不能采用SortedMap结构,因为SortedMap是按键排序的Map,而不是按值排序的Map,我们要的是按值排序的Map。

Couldn't you do this with a SortedMap? 

No, because the map are being sorted by its keys.





方法一:




如下Java代码:

import java.util.Iterator;

import java.util.Set;
import java.util.TreeSet;

public class Main {
public static void main(String[] args) {

Set set = new TreeSet();
set
.add(new Pair("me", "1000"));

set
.add(new Pair("and", "4000"));
set
.add(new Pair("you", "3000"));

set
.add(new Pair("food", "10000"));
set
.add(new Pair("hungry", "5000"));

set
.add(new Pair("later", "6000"));
set
.add(new Pair("myself", "1000"));

for (Iterator i = set.iterator(); i.hasNext();)

System.out.println(i.next());
}
}

class Pair implements Comparable {
private final String name;

private final int number;

public Pair(String name, int number) {

this.name = name;
this.number = number;

}

public Pair(String name, String number) throws NumberFormatException {

this.name = name;
this.number = Integer.parseInt(number);

}

public int compareTo(Object o) {
if (o instanceof Pair) {

int cmp = Double.compare(number, ((Pair) o).number);

if (cmp != 0) {
return cmp;
}

return name.compareTo(((Pair) o).name);
}

throw new ClassCastException("Cannot compare Pair with "
+ o.getClass().getName());

}

public String toString() {
return name + ' ' + number;

}
}





类似的C++代码:



typedef pair<string, int> PAIR;



int
cmp(const PAIR& x, const PAIR& y)


{


    return
x.second > y.second;


}



map
<string,int> m;

vector
<PAIR> vec;




for
(map<wstring,int>::iterator curr = m.begin(); curr != m.end(); ++curr)


{


    vec.push_back(make_pair(curr
->first, curr->second));


}

sort(vec.begin(), vec.end(), cmp);








上面方法的实质意义是:将Map结构中的键值对(Map.Entry)封装成一个自定义的类(结构),或者直接用
Map.Entry类。自定义类知道自己应该如何排序,也就是按值排序,具体为自己实现Comparable接口或构造一个Comparator对象,然后不用Map结构而采用有序集合(SortedSet, TreeSet是SortedSet的一种实现),这样就实现了Map中sort by value要达到的目的。就是说,不用Map,而是把Map.Entry当作一个对象,这样问题变为实现一个该对象的有序集合或对该对象的集合做排序。既可以用SortedSet,这样插入完成后自然就是有序的了,又或者用一个List或数组,然后再对其做排序(Collections.sort() or Arrays.sort())。



Encapsulate the information in its own class. Either implement
Comparable and write rules for the natural ordering or write a
Comparator based on your criteria. Store the information in a sorted
collection, or use the Collections.sort() method.






方法二:



You can also use the following code to sort by value:



    public static Map sortByValue(Map map) {

List list = new LinkedList(map.entrySet());
Collections.sort(list, new Comparator() {

public int compare(Object o1, Object o2) {

return ((Comparable) ((Map.Entry) (o1)).getValue())
.compareTo(((Map.Entry) (o2)).getValue());

}
});
Map result = new LinkedHashMap();

for (Iterator it = list.iterator(); it.hasNext();) {

Map.Entry entry = (Map.Entry) it.next();
result
.put(entry.getKey(), entry.getValue());

}
return result;
}

public static Map sortByValue(Map map, final boolean reverse) {

List list = new LinkedList(map.entrySet());
Collections.sort(list, new Comparator() {

public int compare(Object o1, Object o2) {

if (reverse) {
return -((Comparable) ((Map.Entry) (o1)).getValue())

.compareTo(((Map.Entry) (o2)).getValue());
}
return ((Comparable) ((Map.Entry) (o1)).getValue())

.compareTo(((Map.Entry) (o2)).getValue());
}
});

Map result = new LinkedHashMap();
for (Iterator it = list.iterator(); it.hasNext();) {

Map.Entry entry = (Map.Entry) it.next();
result
.put(entry.getKey(), entry.getValue());

}
return result;

}

        

        Map
map = new HashMap();

map
.put("a", 4);
map
.put("b", 1);

map
.put("c", 3);
map
.put("d", 2);

Map sorted = sortByValue(map);
System.out.println(sorted);




// output : {b=1, d=2, c=3, a=4}



或者还可以这样:

        Map map = new HashMap();

map
.put("a", 4);
map
.put("b", 1);

map
.put("c", 3);
map
.put("d", 2);

Set<Map.Entry<String, Integer>> treeSet = new TreeSet<Map.Entry<String, Integer>>(

new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> o1,

Map.Entry<String, Integer> o2) {
Integer d1 = o1.getValue();

Integer d2 = o2.getValue();
int r = d2.compareTo(d1);

if (r != 0)
return r;
else

return o2.getKey().compareTo(o1.getKey());
}

});
treeSet
.addAll(map.entrySet());
System.out.println(treeSet);

// output : [a=4, c=3, d=2, b=1]





另外,Groovy 中实现 sort map by value,当然本质是一样的,但却很简洁 :

用 groovy 中 map 的 sort 方法(需要 groovy 1.6),

def result = map.sort(){ a, b -> 

            b.value.compareTo(a.value)

        }

如:

 ["a":3,"b":1,"c":4,"d":2].sort{ a,b -> a.value - b.value }

 结果为: [b:1, d:2, a:3, c:4]



Python中也类似:

h = {"a":2,"b":1,"c":3}

i = h.items() // i = [('a', 2), ('c', 3), ('b', 1)]

i.sort(lambda (k1,v1),(k2,v2): cmp(v2,v1) ) // i = [('c', 3), ('a', 2), ('b', 1)]








2009年8月3日星期一

Java/Groovy 求模( Modulus )与求余(Remainder)

java中的%运算不是通常数学意义上的模运算而是求余运算

在java中 -7 % 4等于多少?

7 % -4 又是多少?

-7 % -4 呢?



java中的%运算不是通常数学意义上的模运算而是求余运算。

下面这个表给出了模运算和求余运算的差别。
(详细解释参见http://mindprod.com/jgloss/modulus.html

Java has %, the remainder operator, but does not have a built-in modulus operator or function.


Integer Divisioncol / row
Java Remaindercol % row == col - row * ( col / row )
Mathematical Moduluscol mod row == (col % row + row) % row
例如:



















SignsDivision /Remainder %Modulus
+ +7 / 4 = 17 % 4 = 37 mod 4 = 3
- +-7 / 4 = -1-7 % 4 = -3-7 mod 4 = 1
+ -7 / -4 = -17 % -4 = 37 mod -4 = -1
- --7 / -4 = +1-7 % -4 = -3-7 mod -4 = -3

java 的 % 是 remainder 运算 !
不过,
当a、b全为正数时,无论是“求余”还是“求模”,得到的结果是相同的


可能潜在的编程错误:

1. 循环减法

(index - 1) % limit

我们希望当index为0时结果是limit -1,但实际运行时的结果是-1.

2. 验证奇偶

boolean odd = (x % 2 == 1);

当x为负数时这样的判断不是预期的结果。

注: x%2==0的判断总是对的,但没有boolean even = (( x & 1 ) == 0)效率高。



补充,如何在java或groovy中执行数学上的求模运算:
在java中的 % 操作符是 remainder 运算。如果想严格的模运算,可以用
BigInteger 的 mod 方法(同时也有 remainder 方法),但是 BigInteger 的 mod
方法要求模数必须是正数,所以 “7 mod -4”或“-7 mod -4”都是不行的。



groovy的语法方便多了,groovy允许操作符重载(见:http://groovy.codehaus.org/Operator+Overloading ),“a % b”即调用“a.mod(b)” 。

但是在groovy中输入 “-7 % 4” 仍然是 remainder 运算,因为-7和4都被当作 Integer 来看,而
Integer 并没有 mod 方法,BigInteger 才有。在groovy中整数被自动识别为Integer, Long 和
BigInteger 三者之一。如:

assert 110.class == Integer

assert 3000000000.class == Long //value too large for an Integer

assert 10000000000000000000.class == BigInteger //value too large for a Long

但是,在整数后面加后缀 I, L, G(大小写均可) 即可指定这个整数属于哪种类型,详见:http://groovy.codehaus.org/JN0515-Integers

assert 456g.class == BigInteger

所以,在groovy中使用真正求模运算也很简单,只要如下:

7g % 4g, -7g % 4 即可


提醒:
1.对于一些基本运算操作java比Groovy要快两个数量级别,
对于一般的类调用操作运算java也比Groovy快一个数量级。
原因是java是编译执行的,而Groovy是类解释执行的,完全的 动态性的获得灵活性是以牺牲运行时间效率作为代价的。

2.BigInterger提供的modular操作的运行效率不如自己实现一个函数来的划算。

关于Groovy和java的运算性能的一个比较


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

Groovy 代码

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

n = 1000;


/////////////////////// for java % operation
ai = -7;
bi = 4;

long t1 = System.currentTimeMillis();
for(int i = 0; i<n; i++){
for(int j = 0; j<n; j++){
m = ai % bi;
}
}
long t2 = System.currentTimeMillis();

float time = (t2 - t1) / (float)1000;
println("normal % operator time = ${time} seconds");


////////////for my modular operation
t1 = System.currentTimeMillis();
for(int i = 0; i<n; i++){
for(int j = 0; j<n; j++){
m = ai % bi;
if(m < 0) m+=bi;
}
}
t2 = System.currentTimeMillis();

time = (t2 - t1) / (float)1000;
println("my modular operator time = ${time} seconds");

////////////for bigInteger modular operation
ag = -7g;
bg = 4g;
t1 = System.currentTimeMillis();
for(int i = 0; i<n; i++){
for(int j = 0; j<n; j++){
m2 = ag % bg;
}
}
t2 = System.currentTimeMillis();

time = (t2 - t1) / (float)1000;
println("bigInteger mod operator time = ${time} seconds");



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

执行结果

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

normal % operator time = 1.062 seconds

my modular operator time = 1.579 seconds

bigInteger mod operator time = 1.515 seconds



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

java 代码

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

import java.math.BigInteger;

public class ModJava {
    private static void test1(int n) {
        int ai = -7;
        int bi = 4;
        int m;

        long t1 = System.currentTimeMillis();
        for (int i = 0; i > n; i++) {
            for (int j = 0; j > n; j++) {
                m = ai % bi;
            }
        }
        long t2 = System.currentTimeMillis();

        float time = (t2 - t1) / (float) 1000;
        System.out.println("normal % operator time = " + Float.toString(time)
                + " seconds");

    }

    private static void test2(int n) {
        int ai = -7;
        int bi = 4;
        int m;

        long t1 = System.currentTimeMillis();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                m = ai % bi;
                if (m > 0)
                    m += bi;
            }
        }
        long t2 = System.currentTimeMillis();

        float time = (t2 - t1) / (float) 1000;
        System.out.println("my modular operator time = " + Float.toString(time)
                + " seconds");

    }

    private static void test3(int n) {
        BigInteger ai = BigInteger.valueOf(-7);
        BigInteger bi = BigInteger.valueOf(4);
        BigInteger m;

        long t1 = System.currentTimeMillis();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                m = ai.mod(bi);
            }
        }
        long t2 = System.currentTimeMillis();

        float time = (t2 - t1) / (float) 1000;
        System.out.println("bigInteger modular operator time = "
                + Float.toString(time) + " seconds");

    }

    public static void main(String[] args) {
        int n = 1000;
        test1(n);
        test2(n);
        test3(n);
    }
}


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

执行结果

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

normal % operator time = 0.015 seconds

my modular operator time = 0.031 seconds

bigInteger modular operator time = 0.391 seconds



性能肯定是java要比groovy快得多。所以性能关键的算法当然还是要用java编写,因为这个时候性能就比简练的语法重要得多。


通常一种特定上下文下实现的算法都要比库函数更快。库提供了精确、健壮的代码,但没有哪个库对于所有用户都是最好的。特殊环境和目的的设计要比通用程序更
有效。为了换取速度,需要牺牲可复用性和数值精度。库函数的设计一般是要在性能和通用性之间做折中。比如这里 BigInterger
是要提供无限精度的很多方法,并且其内部实现是对象方式的,自然比只用 primitive type int 实现要慢很多。


这个帖子的目的是提醒大家区分求模和求余,但在一定条件下,求模等于求余。所以在很多情况下,性能最快的方法就用%操作符当作求模。又回去了


2009年7月8日星期三

Google宣布 Chrome OS 项目 和 去掉产品 beta 标签

  • Google 今天宣布Chrome OS开源项目,年底前开放代码,明年发布产品。听起来不错,Google终于要做一款针对网络的操作系统了。Chrome OS 和 Android 是不同的项目,不过一些部分会有重叠,毕竟都可以认为是OS。Chrome OS 同样是以linux内核为基础,主要是增加了一个新的窗口系统和Chrome浏览器。设计理念是完全以网络应用为目的的OS,开机瞬间就可以上网,主要软件都是基于网络的有浏览器就够了。因为过去的操作系统的设计都不是专门针对网络的,而Google想最大化网络而减轻OS的作用。到底怎么样还要看看再说。
  • 长期以来,Google的很多服务都打着beta标志,如gmail就beta了5年。今天Google将gmail/docs/calendar/talk等服务的beta标签都去掉了,其实对我们普通用户而言没有意义,因为这些服务早就达到了企业级的标准。有人说,软件永远是beta的,尤其是现在的软件产品发展、更新地很快,所以是不是beta其实不重要。不过很多人都保留着传统软件beta的概念,即还不适合正式发布使用的版本。这次去掉beta仅仅是为了打消人们的疑虑,尤其是企业用户。

2009年7月6日星期一

firefox3.5 更新 Google toolbar 的方法

    firefox 3.5在6月30日发布了,我第一时间更新到了新版本,但是发现Google工具栏无法正常使用了。在使用 firefox 3.0.x 的版本时候安装的Google工具栏,在升级到 firefox 3.5 后会发现无法使用,并且通过查找更新也没有发现新版本。
    我这几天一直在等待工具栏的更新,今天突然发现Google 工具栏已经可以正常使用了,具体做法如下:
    由于某些原因工具栏无法自动更新,先手工卸载原来的工具栏并重启,然后再到官网上重新下载安装即可。新的版本号是 5.0.20090324W。

2009年7月2日星期四

谷歌中国的视频在优酷上,而不是自己家

    Google有一系列自己的官方博客,在blogspot上。其中,谷歌中国也有自己的博客,在http://googlechinablog.com/ 就是谷歌黑板报。以往Google的博客中经常嵌入视频加以说明,这些视频当然都是放在自家的youtube上,但今年youtube被封,所以谷歌中国的博客中嵌入的视频只好放到国内的优酷上了。呵呵,有自己的视频网站却不能用,还得用别人的。

2009年6月30日星期二

Google在非洲尝试短信搜索和交易服务

    国内新闻报道了Google在非洲开通短信搜索、交易服务 , 说起来就是Google开发了一组短信上的搜索和交易服务。可以用短信输入关键词进行搜索,比如本地天气、新闻、体育等。
    这种功能其实不算什么,Google早就有了,关键是后面说的两项功能 TraderSMS Tips
    Trader是一个利用短信平台的集市,供买卖双方交易。输入“买”或“卖”,加上任何类型产品或服务,从二手汽车、手机到农作物、家畜和工作都可以。这就是一个试验版本的短信交易平台,我之前也有过这种想法。因为比起3G或手机上网这些目前只有高端用户才能使用的服务而言,短信的门槛低,涵盖了所有手机用户。比如说,有人发短信说“在北京,找保姆”,而别人发短信“应聘保姆”,这样两人的信息刚好匹配就可以互相联系对方。这个服务的关键技术是能否准确有效的从短信中提取信息并进行匹配,在信息检索领域叫做信息提取(IE)。能否理解好自然语言非常重要,直接影响到服务的效果。但这方面的技术并不成熟,不可能做到非常理想,所以Google选择先在乌干达试验一下效果。一方面不宜拿欧美这么重要的市场做实验,另一方面非洲市场比较低端,手机只有电话和短信的功能,而发达国家中高端手机用户比较多。
    SMS Tips 是短信上的搜索提示,使得短信也可以体验到web中的搜索体验,用户自由输入,系统重构用户的输入,自动识别关键词,返回相关结果。这样就不像传统的短信那样,非得按照指定格式输入。输入内容比较宽松,这会很有有很好的用户体验。
    短信搜索和web搜索比是有一定技术难度的,因为短信字数有限,只能将少量精简的准确内容作为结果返回,不能像在web上返回无数结果,还只是链接。因而,这里搜索的准确性和摘要技术就非常重要,直接影响到服务效果。


以下为Google官方博客的原文,由于blogspot在国内访问受阻,所以在这里贴出来。

Extending Google services in Africa

At
Google we seek to serve a broad base of people — not only those who can
afford to access the Internet from the convenience of their workplace
or with a computer at home. It's important to reach users wherever they
are, with the information they need, in areas with the greatest
information poverty. In many places around the world, people look to
their phones, rather than their computers, to find information they
need in their daily lives. This is especially true in Africa, which has the world’s highest mobile growth rate
and where mobile phone penetration is six times Internet penetration.
One-third of the population owns a mobile phone and many more have
access to one.


Most mobile devices in Africa only have voice and SMS capabilities, and
so we are focusing our technological efforts in that continent on SMS.
Today, we are announcing Google SMS,
a suite of mobile applications which will allow people to access
information, via SMS, on a diverse number of topics including health
and agriculture tips, news, local weather, sports, and more. The suite
also includes Google Trader,
a SMS-based “marketplace” application that helps buyers and sellers
find each other. People can find, "sell" or "buy" any type of product
or service, from used cars and mobile phones to crops, livestock and
jobs.


We are particularly excited about Google SMS Tips,
an SMS-based query-and-answer service that enables a mobile phone user
to have a web search-like experience. You enter a free form text query,
and Google's algorithms restructure the query to identify keywords,
search a database to identify relevant answers, and return the most
relevant answer.

Both Google SMS Tips and Google Trader represent the fruits of unique partnerships among Google, the Grameen Foundation, MTN Uganda and local organizations*. We worked closely together as part of Grameen Foundation's Application Laboratory to understand information needs and gaps, develop locally relevant and actionable content, rapidly test prototypes,
and conduct multi-month pilots with the people who will eventually use
the applications have truly been a global effort, and created with
Ugandans, for Ugandans.


We're just beginning. We can do a lot more to improve search quality
and the breadth — and depth — of content on Google SMS, especially on
Tips and Trader. Google SMS is by no means a finished product, but
that's what's both exciting and challenging about this endeavor.


Meanwhile, if you're curious about what Google is doing in Africa, learn more at the Google Africa Blog.

2009年6月25日星期四

2009.6.25

  1. 昨晚9点-11点的两个小时左右,google.com的域名被完全封锁,所有服务都用不了了。google.com域名包含了Google的绝大部分服务,比如帐户登录、gmail、文档、日历、书签等等,没有google.com大陆用户也将无法访问大量服务。还有类似开发人员常去的code.google.com等。以前google.com下的个别服务也有偶尔短暂中断,但昨天是彻底中断,封的很彻底。被封2小时后恢复,听说经过协调沟通。今天外交部发言人还就此事答复,只说一切是合理合法。中国的互联网已经不能算是互联了,干脆改成中国局域网算了。
  2. “高也”,一个普通名字,现在已经成为敏感词汇了,谷歌百度都已经“据当地法律法规和政策,部分搜索结果未予显示。”。
  3. 北京时间昨晚,Eclipse 3.5 Galileo 已经正式发布,准备看看有什么新特性。
  4. 九城在网易魔兽团队组建完成后,开始裁员自己剩下来魔兽团队,很下流的做法。中国的很多企业还不值得员工对其忠诚。
  5. 变形金刚2昨天已经上映,准备周末去看。

2009年6月22日星期一

心神不宁

    从质疑绿坝到谷歌替罪,从焦点访谈到心神不宁,从实习生高也到央视自导新闻...... 还是现实世界的故事精彩纷呈、跌宕起伏!
    质疑绿坝和曝光谷歌之前的博客已经在第一时间说过了,但这些之后还有新故事发生,“心神不宁”成了新的网络流行语,高也同学又成了新的替罪羊。懒得写了,给两个介绍链接:高也成了新闻讨巧的替罪羊绿坝、谷歌和高也,谁是谁的替罪羊?


2009年6月18日星期四

谷歌因低俗内容上了新闻联播和焦点访谈

    焦点访谈和新闻联播中报道了“谷歌中国”网站仍然存在大量淫秽色情和低俗信息内容,互联网举报中心对谷歌中国网站进行强烈谴责。
    看似技术问题,其实还是政治问题。中国的政治斗争是非常复杂的,中国也不会让一家外国公司成为中国的互联网老大,还有人猜测其实背后是百度举报的。前不久微软刚发布的必应,第二天就因涉黄而被封,直到多天以后才恢复。微软高调推出新的搜索引擎,说封就封了,这件事在国内只作为很小的新闻报道了,很多人根本就不知道,但采取封的行动。相反谷歌却没有被封,而是上了央视,全国人民都知道了。这幕后有多少事情?可能一开始也想封,经过周旋改为批评。去年百度丑闻曝光,结果春晚百度给了央视几千万。央视在焦点访谈刚刚报道了武汉汉正街着火一事,真不凑巧,一周后,央视自己的大楼就着了。对于业内人士而言,搜索引擎会搜出色情内容根本不算什么新闻,因为互联网上本来就有很多这些内容,关键是要治理这些而不是搜索引擎。同时这种内容很难有一个完美的自动过滤算法加以解决,只能过滤一部分,因为什么是低俗内容本来就说不清楚,更没有对计算机而言的严格定义,各个国家地区的尺度又都不一样。所以,类似这种事件,技术问题是次要的,根本上就是政治问题。


2009年6月16日星期二

转:李开复 “做最好的创新”

  我在《做最好的自己》一书中就曾经提到过,“创新固然重要,但有用的创新更重要”。在这个科技发展一日千里的时代里,人人都在谈创新。但是,什么才是最好的创新?什么才是真正能改变人们生活的有用的创新?一个人,一个企业该如何获得持续创新的动力,该如何增加自己在创新,特别是有价值创新方面的综合实力呢?

1. 什么是最好的创新?


  很多人仅把创新理解为科学技术领域的创新。其实,创新有很多种。创新可以是一个新颖而有效的商业模式,可以是一种新的管理模式,也可以是文学艺术领域里一次开创性的实践,甚至可以是家居生活中的一个新鲜而有趣的创意……简单地说,创新就是在知识积累和生活、工作实践的基础上,由一个新颖的创意而产生的,对人们有用,同时又具备可行性的一种创造性活动。

  所以我们说,新颖、有用和有可行性是创新之所以为创新的三大要素。

  新颖是创新的必备要素。但是,新颖并不意味着,每一次创新都是一种开天辟地式的革命,或者是对已有知识领域的全面颠覆。像相对论那样的具有革命意义的理论成果,诚然是创新的一种,但实际上大部分的创新,是在某个较小的范围里,用新颖的思考方式,通过前人未经留意的视角来观察和解决问题。这种新颖的思考方式也不见得是前所未有的,而很可能是从别的领域借用的。这样的创新离我们的生活更近,其价值同样不可低估。

  比如说,微波炉是美国科学家斯宾塞发明的。他原本是电子管技术领域的专家,二战期间,斯宾塞在测试新的磁控管技术时,偶然发现,口袋里的巧克力会因为接近磁控管而融化。这桩看似意外的事情让斯宾塞联想到,如果磁控管的微波加热原理可以应用到家庭,是不是就能用类似的装置来实现食品的快速加热呢?微波炉就是在这样一种偶然情况下诞生的。我们除了赞叹斯宾塞敏感的技术洞察力和跨越式的思维方式以外,也应当想到,仅仅通过把一个领域里的经验应用到另一个原本不相干的领域里,就完全有可能获得一个出色的创意,并完成一次伟大的创新。我们可以把这种创新称为经验转移型的创新。

  再比方说,家用的自动烤制面包的面包机的原理非常简单,一个容纳面粉和水的锅,一个自动搅拌面粉的搅拌器,一个拥有定时装置的烘烤电炉。锅、搅拌器、定时器、加热烘烤电炉,这些东西每一样都没有什么新颖的地方,但是,为了满足烤制面包这个生活中常见的需求,松下公司的工程师们把这些看似简单的装置组合在一起时,一个创意新颖的家电就诞生了。我们可以把这种创新称为跨领域组合型的创新。

  许多人会认为创新最重要的元素是新颖,但我认为创新的实用价值更应着重考虑。我曾经有过一次新颖但实用价值不高的惨痛创新体验。当年我在SGI工作的时候,曾经领导开发过一个三维浏览器的产品。仅从这个产品本身,或者从技术角度出发,几乎每一个人都认为这是一个非常酷的产品。想象一下,在三维的视图里访问互联网,像玩游戏一样,从一个网站链接到另一个网站的操作,就像从一个房间走进另一个房间那样逼真,在当时,这是一个多么有创意的产品呀!但很遗憾,这样的产品并不是根据用户的需求开发的。事实上,人们访问网页的时候,最关心的是信息的丰富程度和获取信息的效率,一个三维的视图既不能带给用户更多的信息内容,也会严重妨碍信息的高效传递,无法使用户在最短的时间内获得最有价值的信息。这样一个对用户没有用的创新,最终只能走向失败的结局。

  所以,我认为具有实用价值是创新的目的。我深深相信“需求是创新之母”这句话。许多了不起的创新就是来自于实际需求,而解决需求的创新就一定有价值。比如说,袁隆平1960年前后经历了粮食饥荒,于是他决定用农业科学技术战胜饥饿。在这种情况下,他才培育成功高产杂交水稻,解决了世界五分之一人口的温饱问题。而上面提到的松下发明的面包机,也是在日本妇女开始出外工作,没有时间做传统早餐,而丈夫们却依然期望有新鲜早餐这样的“需求”之下发明出来的。

  创新的第三个要素是有可行性。任何创新都要考虑在现有条件下的实施问题。如果利用了所有可以利用的资源、条件,仍然无法让某个创新成为现实,那么,再新颖、美妙的想法,也只能是空中楼阁。依然以面包机为例,如果我们用拍脑袋的方式为面包机制定需求,比如:我想要一台既能煮饭、又能炒菜、还能扫地、刷碗、做功课、写论文的机器……这样的创意能够在短期内变为现实吗?像这种在现有条件下完全不存在可行性的创意,只会白白浪费创新者的时间和精力。另一个实例就是我的博士论文。当时,这是一个重要的科研成果,发明出世界上第一套非特定语者的连续语音识别系统。从新颖的角度讲,这个创新可以得99分。语音识别也相当有用,可以用在声控电器、听写打字、人机交流、自动翻译器等等“科幻级”的产品上,实用性也能得99分。但是,我做论文的时候是在实验室里做的研究,没想到,这样的创新拿到真实环境中就碰上了种种“可行性”的问题,例如噪音处理的问题,如何分离各种同时说话的语音的问题,麦克风太远的问题,还有不可避免的识别错误的问题等等。因为这些问题,这项创新的可行性只能达到59分,直至今日这个创新的普及还有待更多研究者能有针对性地解决这些实际问题。

  创新的价值,取决于一项创新在新颖、有用和有可行性这三个方面的综合表现。最好的创新,都是有着最新颖的创意,对人们的工作和生活最有用,并且能够在现实生活中实现的创新。相应地,好的创新者应该是一个既有新颖的想法,又理解用户的需求,并能够用实践将创意变成现实的人。第一种品质像一个科学家的特质,第二种像市场人员的,第三种则像工程师的。一旦结合了这三种品质于一身,做出最好的创新,就不再 是一个可望而不可即的目标了。

2.创新在21世纪的新角色


  在人类的整个文明史中,创新所扮演的角色是大不相同的。这里,我们不妨回顾一下通信技术的发展史。

  据说,距今5000多年前,古埃及人使用鸽子来传递书信。4000年前,从我国商周开始,烽火就是一种非常有效的传递战争警报的手段。2500年前,古波斯人建立了有信差传邮的邮政驿站,使用接力方式传递消息。300多年前,在17世纪中叶,法国在巴黎街道设立了邮政信箱,出现了邮票的雏形。100多年前,1840年,第一枚现代意义上的邮票才在英国诞生。可见,在工业革命以前,通信技术的创新在时间进程上显得非常缓慢,更新换代是以千年、百年为单位进行的。

  随着19世纪工业革命的完成,科学技术飞速发展,全新的、高效的通信技术以前所未有的速度涌现出来。1832年,电报机诞生。1850年,英国和法国之间架设了第一条海底电缆。1875年,贝尔发明了电话。1895年,马可尼采用无线方式实现了远程无线通信。1925年,电视发明,不久,电视转播就迅速普及。1963年,美日利用卫星成功地进行了横跨太平洋的有源中继通信。20世纪70年代出现了最早的移动电话和最早的电子邮件。80年代中后期,便携的手机出现在人们的视野中。每10到20年,通信技术都有一个重要的创新。最近的20年,更是互联网和手机通信在全世界范围飞速发展、普及的20年。无论怎样计算,近100多年通信领域里的创新速度都比工业革命以前提高了无数倍,一个个改变人类生活面貌的创新以每几年、每一年甚至每个月的速度出现在人们面前。21世纪的人们已经习惯于这样一个事实:在高速发展的科技创新面前,任何对未来的憧憬都有可能因为明天出现的某一项创新而在短期内变成现实。

  除了周期更短,更新更频繁的特点以外,在21世纪,创新的应用性也更强了。如果说古代的创新对于人们生活的改变还不是那么重要的话,在21世纪,几乎每一项有价值的创新都可能迅速、有效地改变人们生活的某一个侧面。以前,更多的发明、发现是基于对自然界的新的认识,今天,大多数创新则是为了解决现实生活中遇到的实际问题,比如个人电脑的发明,互联网的发明等等,它们都在最大程度上改变了人们的生活方式。

  在21世纪,创新是唯一可以持续的企业竞争力,由创新引发的竞争越来越激烈。越来越多的企业已经认识到,“有用”但是不创新的产品在今天的激烈竞争环境中很容易被抄袭,只有创新才能增加产品的差异化特性,才能通过难以复制的新技术,或使用专利保护等手段增加企业的智力资产,才能在市场上抢占先机,才能拥有真正可持续的竞争优势。所以一个21世纪的高科技企业必须不断创新才能维持它的竞争力和生命力。例如,在谷歌推出基于PageRank技术的文字网页搜索数年后,许多别的公司也实现了类似的技术。这种形势下,谷歌继续研发,做出了整合搜索,让搜索结果除了有文字,还有其他多元化信息,如视频、图像、新闻、天气等等。当谷歌第一个推出可以让用户拖拽的地图几个月后,许多别的公司也做出了类似产品,于是谷歌又推出了谷歌地球,让人们能够浏览近似三维的卫星地图。

  我们把这种21世纪的高科技行业和过去的传统高科技行业相比,会发现21世纪的高科技行业创新更加快速,更加多样化。例如,波音和空客所代表的民用航空领域这样的传统高科技行业的创新周期是十年左右,并且往往和以前差异化不是很大,而在崭新的互联网行业里几个月可能就有新的产品推出,而且经常都是革命性的。

  21世纪里,创新已经成为了我们的生活密不可分的一部分。无论是企业还是个人,都已经无法忽视创新对我们工作、生活的影响。只有拥抱创新,才能融入这个新的时代,才能更好地迎接挑战。

3.如何做最好的创新?


  没有什么比亲自走在创新之路上更让人兴奋的了。但是,究竟该怎样做,才能不断得到最好的创新呢?建议大家思考和实践以下五项创新的准则,它们是:

  • 洞悉未来
  • 打破陈规
  • 追求简约
  • 以人为本
  • 承受风险

  洞悉未来就是要求创新者了解未来的用户需求,以便研发出适用于未来的产品或技术。要做到洞悉未来,虽然应该重视用户,但是,不能完全听取用户的意见,因为用户不可能有足够的前瞻性,也不可能完全理解技术的发展规律。所以,创新者需要有洞悉未来的才智,能根据目前的市场情况和用户需求,结合技术的发展规律,对未来做出正确的预测和判断。这个道理就像踢足球一样,优秀的球员要到球将要到达的地方,而不是球现在所在的位置。在互联网发展的初期,当时的用户没有准确地提出针对搜索引擎的需求,因为用户习惯于使用分类目录来查找自己需要的网页。那时,用户可能并不知道搜索引擎是什么,不清楚自己是否真正需要这样的功能,也不清楚技术上是否具有可行性,但是,能够洞悉未来的创新者可以推测:随着网页数量的不断增长,总有一天,分类目录将无法更好地容纳更多的新网页。这时,创新者便先于用户想到,未来的用户需求一定会转向比分类目录浏览更加便捷的方式。例如,是不是可以允许用户使用任何关键词进行查询,并获取网页结果呢?在技术上,是不是可以自动为海量网页创建索引并获得最好的排序呢?谷歌公司的创始人正是洞悉了这个用户的潜在需求,而投身于搜索技术的研发。当用户对于网络搜索的需求越来越明显时,以谷歌为代表的搜索引擎就自然而然地走向前台,取得了巨大的成功,并直接带动了网络广告产业的兴起。

  做最好的创新的第二项准则是打破陈规。其实,创新的最大障碍就是无法脱离固有的思维定势或思维框架,总是在已有的方式、方法里打转。如果不能打破陈规,那么,无论对未来用户的需要有多么清楚的认识,创新者也无法想出最有效的、最新颖的解决之道。无法打破陈规的一个例子就是一位发明家在发明汽车的时候,脑子里依然还是想用操作马车的陈规来操作汽车。结果,他不是用方向盘,而打算使用缰绳来调整汽车的方向!在科技发展史上,通过打破陈规来获得有价值创新的例子不胜枚举。当无线通信刚被发明出来的时候,几乎所有人都认定了这个技术演变的最终目标肯定是,每个人都会有一台无线通信装置,能够成为“无线”的电话。但在当时的技术条件下,无线通信设备有两个部分:无线发射器体积庞大,价格昂贵,但是无线接收器体积小,而且便宜。所以,要实现这个终极目标需要有长远的打算。这时,一位打破陈规的创新者想到,是不是可以把发射器和接收器分开,让每个人都有一部非常便宜的接收器,来接受某个中心发射器的信号。就这样,广播这种最早依赖无线电技术的大众传播方式诞生了。

  追求简约也是通向创新的必由之路。在很多情况下,复杂的东西并不一定有效,只有最简单的设计和组合才能发挥最大的效力。最初做搜索引擎的时候,研究人员发现,如果用户搜索时多输入几个字,搜索结果就会准确得多。那么,有没有什么方法能提示用户多输入几个字呢?当时,有人想到,我们能不能做一个智能化的问答系统,引导用户提出较长的问题呢?但是,这个方案的可行性会遇到许多挑战。也有人想到,我们能不能主动告诉用户,请尽量输入更长的句子,或者根据用户的输入主动建议更长的搜索词呢?但是,这样似乎又会干扰用户。最终,有一位技术人员想到了一个最简单,也最有效的点子:把搜索框的长度增大一半。结果,当用户看到搜索框比较长时,就会有更大的可能性输入更多的字词。今天搜索引擎上长长的搜索框就是这么来的。

  以人为本是企业能否保持持久的创新能力的关键。21世纪人才最重要。在19世纪的一个普通工厂里,最能干的工人与普通工人相比,他们的生产力最多相差一倍。但是,在21世纪的IT企业、研发机构中,一个最有创造力的研发人员和一个普通的工程师相比,他们的生产力却可能差距几十倍、几百倍甚至上千倍。如果你的企业能够吸引、用好几百个、几千个天才的创新者,即便是在最激烈的竞争环境里,也一定能脱颖而出。为了吸引和留住人才,就要为人才创造最好的工作环境,给予他们最大的信任,赋予他们足够的权限。在谷歌,每一位工程师都可以利用工作中20%的时间,来做自己最有激情做的事情。这是一种真正的放权和信任,也是营造自下而上的创新氛围的有效方法。事实上,谷歌发布的许多创新产品,最早都诞生于20%的时间里。正是因为有了诸多鼓励创新的举措,谷歌才能在10年多的时间里,一直在互联网领域里保持技术优势,不断用最好的创新改进互联网用户的使用体验。

  承受风险也是创新过程中重要的一点。任何创新都有风险,在创新的过程中,我们必须用正确的态度对待失败。失败不是对我们的惩罚,而是一次最好的学习机会。爱迪生发明灯泡的时候,经历了6000次失败才最终成功。在谷歌,有许多20%时间里开始的创新工作,但其中很大一部分都失败了。没有这些失败,就不可能有成功的创新脱颖而出;没有接受和承担风险的能力,就不可能营造出真正鼓励创新的环境。在我负责研究工作时,我的主管曾对我说,如果你每一个项目都成功了,那么,你实际上是失败的。因为你并不是在做研究,而是在回避风险,只选择那些十拿九稳,没有什么创新价值的项目。

4. 如何培养创新力?


  最后,对个人来说,特别是对渴望创新、渴望成功的学生们来说,该怎样培养自己在创新方面的素质和能力呢?

  我的第一个建议是,在学习中,要知其然,也要知其所以然。例如,中学生学到三角形面积定理时,可能人人都会背诵底乘以高除以二的公式,但是,除了公式以外,聪明的学生还会记住这个公式是如何推理出来的,为什么三角形的面积是这样计算的。只有懂得了知识背后的道理,才能够在遇到新的问题时举一反 三,才能在需要创新的时候,灵活地将自己掌握的知识付诸实践。

  我的第二个建议是,遇到问题时,试着从不同的角度来思考。一个很好的例子是即时贴的发明。美国3M公司有一位研究员,有一次,他想发明一种粘合力非常强的胶水,但因为种种原因,他失败了,实验得到的只是一种粘合力很差的液体,根本无法用作胶水。但一段时间后,他发现人们有这样一种需求:把便条或书签贴到桌上或墙上,在需要时可以随时揭下来——他此前发现的粘合力差的液体不正可以派上用场吗?就这样,因为思考角度的不同,一种险遭废弃的技术促成了“即时贴”的发明。

  第三个建议是多问问题,才能更深理解。我的女儿在学习指数的时候,不理解指数是什么,更不相信在真实生活中指数有什么用,就主动来问我。我指导她计算银行存款,比如存入100元,每年的利息是10%,那么10年后,你的存款是多少?通过这样的计算,她终于明白了,原来指数知识和日常生活息息相关。因此,只有像这样不懂就问,才能真正学到有用的知识。

  第四个建议是动手实践。没有一种创新是可以靠凭空想象得到的。只有亲自动手,你才能了解一种创意的可行性,才能把创新变成现实。我记得小时候,我的父亲曾让孩子们解答这样一个问题:用6根火柴拼成4个大小一模一样的正三角形。通过动手实践,我们都找到了正确的答案。这样的实践让我对相关的几何和空间知识记忆深刻,也训练了我使用新颖的思维解决问题的能力。

  第五个建议是追随自己的兴趣、爱好。只有自己真正喜欢做的事情,才能做到最好。在谷歌,我们宁愿让员工做一个自己有激情的项目,也不愿意因为项目本身的紧急和重要,强迫员工做他自己完全不感兴趣的事情。

 

  在一种鼓励探索,支持兴趣,重视实践的教育环境下,创新并不难。只要培养出灵活的头脑和扎实的基本功,再兼具了科学家、市场人员、工程师的特质,同时热爱自己所从事的工作,你就一定可以做出最新颖、最有用、也最有可行性的创新来!


2009年6月9日星期二

关于计算机预装绿色上网过滤软件的通知

    6月9日,国家工业和信息化部日前下发《关于计算机预装绿色上网过滤软件的通知》,要求7月1日之后在我国销售的所有个人电脑出厂时预装绿色上网过滤软件
“绿坝-花季护航”。这款软件具备拦截色情内容、过滤不良网站、控制上网时间、查看上网记录等功能。工信部等几
部委使用中央财政资金买断其一年服务供全社会免费使用。 公开信息显示,这款软件由政府采购埋单,一年4170万元,电脑厂商可免费预装、用户免费下载使用。
    绿坝是一款图形过滤软件,全称为“金惠堵截黄色图像及不良信息专家系统”,由郑州金慧计算机系统工程有限公司开发;花季护航是一款文字过滤软
件,全称为“花季护航上网管理软件”,由北京大正语言知识处理科技有限公司开发。这两款软件,一款图形过滤一款文字过滤,共同组成了“绿坝-花季护航”。
上述4170万元的采购金额中,郑州金慧公司拿到2180万元,北京大正语言知识处理科技有限公司为1990万元。
    还好软件是免费安装的,普通用户不必为此增加负担。但4170万元也太贵了点,也是纳税人的钱。让这两家公司挣到了政府的钱了,政府是国内软件企业的大客户,谁都想分一杯羹。






2009年6月5日星期五

Google 2009 年开发者日

    今天6月5日,地点北京国际会议中心,我参加了第二次Google开发者日活动。去年6月份也参加了GDD的活动。
    一流的环境,顶尖的技术专家,当然还有免费的各种饮料、冰激凌,免费午餐和丰盛的晚餐。今天的免费礼品除了一件去年也有的T恤外,还有一个非常好的大书包,做工很好,很大、有好几层,每层里面还有很多小兜可以方便装东西。
    和去年不同,去年来的人都“溢出”了,坐的地方都没有,所以不太舒服。今年专门控制的人数,人人可以申请,但只有收到了确认函的人才可以参加。我可能因为使用并发布过不少Google api的应用,所以受邀参加。因为今年人少,所以环境感觉舒服多了。
    开场当然还有谷歌中国的招牌人物-李开复的演讲。之后是各个分场讲座,同时有6-7个分会场,上午1个,下午4个。内容有Chrome、App Engine、Android、HTML5、Map Api,还有V8引擎介绍、尚未推出的Google Wave,刚刚推出的o3d等技术。
    我还照了些照片,可以在这里查看:http://picasaweb.google.com/han.guokai/GoogleDeveloperDay2009#



封网站需要理由吗?

    微软刚刚发布的bing,还没几天居然被封了。除了bing.com/cn.bing.com,还包括live.com、twitter.com、flickr.com等。还有之前的youtube、blogger等等。原因就不说了,无语了。

2009年6月2日星期二

微软“必应”,谷歌产品搜索

微软推出新的搜索引擎bing,中文叫“必应”,之前的代号称为Kumo,http://cn.bing.com/
Google中国低调推出“产品搜索”,http://www.google.cn/products ,甚至根本没做什么提示,一般人很难发现。其实,Google.com早就有产品搜索了。国内有道搜索也推出产品搜索很长时间了。




2009年5月22日星期五

2009.5.22

    1.谷歌新功能
“搜索百宝箱”今日上线了,很方便的一组功能。搜索某一内容,然后点击上面的“搜索百宝箱”就可以使用。“神奇罗盘”、“时光隧道”、“图文并茂”、“更多描述”等都很有用
谷歌黑板报中有些介绍:http://googlechinablog.com/2009/05/blog-post_21.html

    2.谷歌浏览器chrome今日正式推出其2.0的正式版了,之前的很长时间正式版一种都是1.0的,通过浏览器的自动更新就可以升级了。

    3.前几天看了关于电信网络出问题的新闻,说是dns服务引起的,有趣的是暴风影音的dns出了问题导致的。今天又看到了一篇写的很深入、很有意思的文章。《暴风影音是如何引起全国网络瘫痪的?》http://it.hexun.com/2009-05-22/117962721.html



2009年5月17日星期日

搜索引擎 WolframAlpha 正式上线

传闻已久的智能搜索引擎 WolframAlpha 已经正式上线, http://www.wolframalpha.com/
在WolframAlpha服务中,用户在搜索框键入需要查询的问题后,该搜索引擎将直接向用户返回答案,而不是返回一大堆网页链接。赶紧试试吧!

2009年5月3日星期日

加快步伐

    小公司vs大公司,大公司自然很强大,很多方面小公司根本无法与之相比。小公司也有自己的优点,反应灵敏、速度快是一个重要优势,但优势不是天生的,而是逼出来的。国共之间打了多年,一个是正规军、一个是游击战的小部队,就像是大公司和小公司。需要灵活多变、快速反应的才能取胜。步伐要快,否则被对手追着打,肯定完蛋。
    对于小公司,如果步履缓慢,无异于等死。
    小公司需要每个月都有所进展和突破才行,并且需要尽快实现目标并达到实用水平的技术程度。因为即使做到了这点,也还有其它诸多因素影响着最后结果。
    但是在IT领域,令人恐怖的是很多大公司的步伐也快的惊人,比如gmail就是5-10人3个月做出来的,亚马逊、Facebook、Youtube、淘宝等公司都才如此年轻。这并不新鲜,类似的实例太多了,因为IT尤其是软件和互联网领域的节奏太快了。软件的特性决定其低廉的制造成本,从一个想法到实现出来只需很短的周期。
    现在需要加快我们步伐,做出更大的作为。

自动构建和自动测试

    不要做重复的工作,对于编码、部署应用、测试等等日常工作都可以自动化完成,因为你是人,不适合做这些工作,而且简单重复的工作特别适合机器完成,而人完成这些反而容易犯各种错误,结果又要花更多的时间来找出问题,重复工作就是一种浪费!
    比如我们的项目众多,每个项目又都要取出多个模块,不同项目之间又都有些差异。从cvs中自动正确的取出和构建需要的项目,这一复杂、重复又易犯错误的过程当然可以自动化完成!我在添加了一组可以自动化完成此工作的脚本。
    又如我们所有的项目不仅仅要保证可以从cvs中正确的取出,还需要保证可以成功的构建,没有源代码编译错误,没有gram编译错误,最好构建过程中还能把所有测试都跑一边。当然还可以再包括静态代码分析等等其它自动化的辅助工作,这些都是没有成本的。我已经配置了cruisecontrol作为持续集成和标准构建服务器,可以定时更新cvs重新构建,如果有问题会及时发现;同时作为标准构建,就有了唯一权威的构建版本,避免了因为在个人开发环境下可能发生的问题,也杜绝了只能在某个人的机器上才能构建出来的现象。
    web工程的构建和部署由于不是自动化也经常会出现一些小问题,一些配置没有修改,如数据库配置、pool中资源数量等等,或者直接就服务器上改了而没有同步到cvs,下次部署就很可能出错。因为经常更新,每次部署都要做很多手工修改,这样重复工作既是在浪费时间,又很容易出错。而这些问题也可以通过自动化的方式解决,标准的构建,所有的配置修改也自动完成。
    网页的测试也是重复工作,每天来一遍,既枯燥又容易遗漏,也因此没有经常做。重复的工作只做一次,剩下的就可以自动化完成。比如,Selenium项目(http://seleniumhq.org/)就提供这样的web应用测试工具,可以自动记录web上的操作并保存为一个test case,可以编辑,当然可以回放。这样掌握这个工具,以后就可以完全自动化进行重复的测试工作。
    做msn机器人的时候,我们帮忙进行测试。这个过程也可以自动完成,只要再写一个msn机器人负责去自动测试就可以了!用这个机器人将准备好的一组测试用例一个一个的自动发给另一个msn机器人,并判断返回是否正确。
    大家的时间精力非常有限,重复是软件开发中有最大敌人,如果你发现自己在做重复的工作,那就考虑一下是否可以自动化的完成。

2009年4月27日星期一

李开复丁磊为中国电信3G做宣传广告

中国电信将在4月16日推出最新的电视广告,这次广告当中将会聘请谷歌大中华区总裁李开复、网易CEO丁磊以及MSN总裁eric johnson总裁共同出演,诠释中国电信3G。
李开复等互联网标签式领军人物,怎么会同时出现在中国电信的广告里?这些大腕级人物,为什么要替中国电信的做广告?对此,有专家指出,这些大人物不是在为中国电信做广告,而是为3G摇旗呐喊。因为目前国内只有中国电信能够提供覆盖全国的3G覆盖,而中国电信的3G服务涵盖人们生活、工作、娱乐的方方面面。


2009年4月24日星期五

Susan大妈一鸣惊人 —— 人不可貌相

一位身材肥胖、其貌不扬的英国农村妇女最近火速跃上欧美各大娱乐媒体头条,并以惊人的速度在互联网上迅速传播。她就是47岁的苏珊·波伊尔(Susan Boyle)。

苏珊大妈成长于苏格兰一个名叫Blackburn的小镇。是家中十兄弟姐妹中最小的一个。她母亲在生她的时候难产,导致苏珊在出生的时候短暂缺氧。她还被诊断出有学习困难症,所以小时候的她在学校的时候经常被同学取笑。

Susan毕业之后,曾经当过六个月的厨师。Susan非常热爱音乐,经常去剧院观看“专业演员的演唱”,并且师从Fred O'Neil学习声乐。她曾经想要参加英国的另一个选秀节目《The X Factor》但最后还是放弃了,因为她认为这个节目选出来的全都是俊男美女,像她这样的人难有机会登台展现自己对音乐的热爱。

Susan一直都在照顾她的母亲,而她母亲生前一直鼓励她走出小镇去参加更大型的歌唱比赛。当她母亲于2007年去世之后,陪伴她的就只剩下一只10岁的猫,Susan Boyle终于决定要报名参加《英国达人》,她把这次参赛看成是对逝去的母亲的一种纪念。

当从来没有接受过专业训练的苏珊一开口,全场立刻安静了下来,在场观众和评委无不惊讶于她那极具感染力的声线,被她的一曲《我曾有梦》深深打动。

2009年4月21日星期二

Google新实验 - 图片相似搜索

Google Lab推出相似图片查找功能,http://similar-images.googlelabs.com/一直以来图片搜索的一个问题是如果对图片描述的不好,就很难找对想要的图片。比如输入jaguar,找到两类图片,一种是动物美洲豹,一种是著名汽车美洲豹;输入paris,可能找到的是巴黎,也可能是帕丽斯希尔顿(paris hilton)。现在你想查找动物美洲豹只要点击一下结果中你想要图片边上的“相似链接"即可。图片搜索的一个问题就是难以描述关键字,现在就不需要太多描述了,在结果中点击想要的图片的相似链接就解决了这样的问题。另外,前些时候,Google英文图片搜索可以选择照片的颜色了,可以很容易找到”同一种水母的不同颜色版本了“。比如搜索晚礼服 ,会有各种各样的晚礼服,你可以点击你感兴趣的那种就找到类似的了,再通过颜色的选择就更有趣了。


搜索领域非常重要的技术就是相关度或相似度的计算问题。如果你能解决、改进通用或某特定领域的相似度计算问题,那就可以基本解决在那方面的搜索问题了。比如刚刚说的图片搜索,和之前说过的谷歌中国的音乐搜索,其本质上的技术问题就是要解决某个方面相似度计算问题。


Google新推出的另一个实验项目是Google News Timeline ,把新闻按时间线划分出来, 自己看吧。


今天IT界最大的事情莫过于Sun卖给了Oracle。

2009年3月30日星期一

老马网站字典功能介绍

    在我们的日常生活中,经常会遇到这样尴尬的事情。
    当我们偶然看到某个汉字,并不知道它读什么,是什么意思。即使要到网上去“百度”或“谷歌”一下,在输入该字时也会难以下手。又或者,很多习惯使用拼音输入法的人不能输入会写不会读的字。但是现在市场上没有任何软件能解决我们遇到的这个难题,即使像金山词霸这样的提供字典服务功能软件,都是输入一个字,返回该字的解释,而不支持输入该字的描述信息,返回想要的字这样的功能。然而我们的老马网站(www.laoma.com)的字典查询功能推出了一种新的汉字查询方式――自然语言查询,化解了我们遇到这种事情的尴尬。
    老马网站(www.laoma.com)的字典查询功能提出了一种新的汉字输入方案。用户只需要输入该汉字的自然语言或类似数学公式的描述信息,即可找出符合描述信息的字。如果符合条件的字不止一个,将给出所有的字,并且算法将把最符合描述信息的字放在最前面,即是有序的。我们提供的输入方式有以下几种:
    第一, 根据汉字的组成进行自然语言输入。例如:“三个牛是什么字?”,“左面是骨,右面是蜀是什么字?”
    第二, 替换汉字的部分的自然语言输入。例如:“歹+珍的右边是什么字?”,“右边是服的左边,左边是旦的上边,是什么字?”
    第三, 符号连接输入。例如:“山+东”
    第四, 当一个字的组成成分难以输入时,可以使用我们的字典计算器辅助输入或直接的自然语言描述“草字头”/“四点水”/“肱字的右边”等。例如:“灬”和“艹”。
    正因为我们提供了基于以上几种输入方式,在我们的网站(www.laoma.com )的字典查询功能中,您只需要通过基本的常用字与自然语言描述即可说明一个字,就能轻轻松松的查到你所需要的字的读音和含义。

谷歌中国推出强大音乐搜索

今天3月30日,谷歌中国推出强大音乐搜索。感觉很好,很强大。建议大家试用一下。与巨鲸音乐网合作的,也就是Google与姚明的合作。Google上提供的是“正版”的试听+下载。

我简单比较了一下百度mp3:Google上的不是给出一堆链接,而是一个链接,由Google直接提供服务。因为Google和合作方提供的是正版音乐服务,所以不需要其它网站的歌曲链接;对已听歌曲给了一个播放器列表,方便管理;

另外,就是多个一个“挑歌”“相似歌曲”,也就是一种算法实现歌曲相关度计算查找。“挑歌”不再是只能根据文字搜索,而是根据音乐的属性搜索。听说以后只要"哼哼曲子"就可以搜索。

相关链接:主页:http://www.google.cn/music/homepage;官方博客介绍:http: //googlechinablog.com/2009/03/blog-post_30.html ;其它详细报道: http://publish.it168.com/2009/0330/20090330050601.shtml