IPv6今日正式上线中国支持IPv6网站占比达65%

6月6日消息,新一代因特网协议IPv6将在今天正式上线。根据IPv6LaunchDay官网的统计,截至4日为止美国参加IPv6Launch的网站已有71%可在IPv6上存取,中国则为65%左右。

网络专家原本预期IPv4网址会在2011年底用完,同年6月8日InternetSociety偕同主要网站及ISP业者举行为期24小时的测 试,并借此呼吁其他国家的网站、网通设备厂商及ISP厂商尽快赶上进度。因此1月初决定从6月6日起,产品与服务正式执行IPv6协议。

而台湾也加入了推动IPv6全面升级的行动。根据台湾IPv6升级的官网,中华电信、台哥大、远传及中央研究院等都已可支持最新版网络协议。行政院研考会也在三月间宣布政府将带头分三阶段完成全面升级到IPv6。

IPv6是因连网装置越来越多,现行第四版(IPv4)网址数目将不够用而规划,1998年由因特网工程工作小组 (InternetEngineeringTaskForce, IETF)公布。今年初,推动IPv6的Internet Society宣布将今年6月6日定为IPv6的正式推出日期。届时,包括Google、微软Bing、Yahoo、Facebook及华纳等主要ISP 及网站都将永远开启其网站的IPv6功能。到本周三之前,每家至少有1%的用户会经由IPv6存取网站或服务。

21世纪初,网络专家就不断警告IPv4的网址即将用罄,并呼吁ISP及网站尽快支持IPv6。迄今包括Google、微软Bing、Yahoo、 Facebook、AT&T、Cisco、Mozilla、Akamai、日本的KDDI等网站、ISP及网络设备大厂都已加入支持IPv6。

文/飞象网 赵宇新

布林领导下的谷歌神秘部门 Google X

据财经网站BusinessInsider报道,谷歌内部拥有一个代号为Google X的神秘研发部门,在谷歌内部进行着众多前沿技术开发项目,其中包括无人驾驶汽车、谷歌眼镜等。该部门由谷歌联合创始人谢尔盖·布林(Sergey Brin)领导,目前员工已达数百人。

布林领导下的谷歌神秘部门Google X
谷歌联合创始人谢尔盖·布林

据消息人士透露,Google X是谷歌最炙手可热的部门之一,许多谷歌员工都蜂拥进入该部门工作,希望参与一些激动人心的新项目。

以下为Google X部门的几个主要项目:

1.室内地图

布林领导下的谷歌神秘部门Google X
谷歌室内地图

该项目是Google X团队已经对外发布的几项产品之一,允许用户在谷歌地图中浏览建筑物室内的地图。

尽管这一功能并非人尽皆知,但依然是谷歌内部的前沿项目之一。

2.无人驾驶汽车

布林领导下的谷歌神秘部门Google X
无人驾驶汽车

这是Google X团队的前沿项目中第一个吸引大量外界关注的项目。

该项目由布林监督管理,谷歌工程师塞巴斯蒂安·特龙(Sebastian Thrun)担任团队负责人,正在研发一款能够无人驾驶的汽车。

3.Google’s Solve X大会

Google X团队还举办了一次大会,将全世界最聪明的一群人聚集到一起,试图解决那些对于全世界意义最为重大的问题。

谷歌联合创始人布林与谷歌董事长埃里克·施密特(Eric Schmidt)在这次大会上担任司仪和主持。

4.谷歌眼镜(Project Glass)

布林领导下的谷歌神秘部门Google X
谷歌眼镜(Project Glass)

谷歌眼镜是Google X团队的最新项目。这款计算机化的眼镜由声音控制,可以戴在头上并在视野范围内展示显示屏。

根据目前为止获得的信息,谷歌眼镜功能包括浏览网页和拍照。

5.建筑设计和发电设施

谷歌内部广泛流传着这样一句话,“谢尔盖·布林简直就是蝙蝠侠。”

这是因为布林负责的Google X基地内藏有大量建筑物和发电设施的设计图。事实上,谢尔盖·布林正在建造一个与《蝙蝠侠》漫画中“蝙蝠洞穴”(Batcave)同名的建筑物。

6.Google+

去年年初的时候,谢尔盖·布林接受了一项有关社交网络的任务。

这一任务的成果就是Google+。尽管Google+主要负责人是谷歌副总裁维克·古多塔(Vic Gundotra ),布林仍在Google+的最终发布方面起到了关键的重要。

7.机器人

布林领导下的谷歌神秘部门Google X
谷歌机器人

机器人是Google X的一个重要主题。在谷歌Mountain View总部园区和秘密实验室里,经常能够看到到处跑动的机器人。

8.上百个其他各种项目

不管在什么时候,Google X实验室总是同时进行着为数众多的项目。作为Google X团队领袖和领衔工程师中的一员,布林可能掌控着这些项目中的绝大多数。

分布式系统编程,你到哪一级了?

介绍

当分布式系统编程成为你生活中的一部分时,你需要经历一段学习曲线。这篇文章描述了一下我当前在这个领域大致属于哪个层次,并希望能为你指出足够多 的错误,从别人的错误中学习,从而使你能以最优的路径通向成功。先声明一下,我在1995年时达到第1级,我现在处于第3级。你自己属于哪一级呢?

第0级:完全一无所知

每个程序员都从这一级开始。我不会在此浪费太多口舌,因为这实在没什么太多可说的。相反,我会引用一些我曾经经历过的对话,为从未接触过分布式系统的开发者们提供一些建议。

对话1:

NN:在分布式系统中,复制是个很容易的操作,你只需要让所有的结点同时存储你要复制的东东就行了 

另一段对话(从我记忆深处挖出来的):

NN: “为了我们的第一人称射击游戏,我们得写一个自己的网络处理引擎。”

我:“为什么?”

NN: “虽然已经有一些优秀的商业引擎了,但获取license的费用非常高昂,我们不想为此买单。”

我:“你之前对于分布式系统有什么经验吗?”

NN:“是的,我之前写过一个套接字服务器。”

我:“你觉得你要花多久能完成这个网络引擎?”

NN:“我想2周吧。保险起见,我计划用4周时间。”

好吧,有时候还是保持沉默比较好。

第1级:RPC

RMI是一种非常强 大的用来构建大型系统的技术。事实上,这个技术用Java来描述的话,结合一些工作的例子可以在短短几页纸内描述清楚。RMI技术非常令人振奋,而且它很 容易使用。你可以调用你所能绑定到的任何服务器资源,而且你可以构建出分布式的网络对象。过去人们常常为构建复杂的软件系统犯难,现在RMI打开了这道大 门。    ——   Peter van der Linden, Just Java(第4版, Sun Microsystems)

我先声明,我并不是说这本书很烂。我清楚的记得这本书读起来很有趣(尤其是章节之间插入的轶闻),我曾经学习Java的时候就是用的这本书(太久以 前了,简直不像在一个时空里似的)。一般情况下,我觉得作者说的挺好。他对RMI的态度就是典型的分布式系统设计的第1级水平。处于这个等级的人对统一的 对象有共同的看法。事实上,Waldo在他们著名的论文“a note on distributed computing”(1994)上曾深入描述过,这里我做下总结:

我所倡导的写分布式应用的策略可分为3个阶段。第1阶段,写这个应用时不用担心对象 存储的位置,以及它们之间的通讯如何实现。第2阶段,通过具体化对象的位置以及通讯方法来调整程序性能。第3阶段,真枪实弹的测试(网络隔离、机器宕机等 各种情况)。这里的思想就是,不管一个调用是本地的还是远程的,对程序的正确性都不会产生任何影响。

同样还是这篇论文,随后进一步挖掘了这个主题并展示了其中的问题。这个观点是错误的,而且已经错了快20年。不管如何,如果说Java RMI达成了一个目标,那就是:就算你从等式中拿掉传输协议、命名、绑定以及序列化,它还是不成立。能记得起CORBA的老程序员们同样也会记得它也是不好使的,但他们有一个借口:CORBA还在同各种底层的问题缠斗中。Java RMI将所有这些都抛开了,但使剩下的问题变得更为突出。其中有两点,第一点纯粹就是个麻烦:

网络不是透明的

让我们看看这段简单的Java RMI代码示例(同样取自Just Java一书)

1 2 3 public interface WeatherIntf extends java.rmi.Remote {      public String getWeather() throws java.rmi.RemoteException; }

想要使用天气服务的客户端需要这样做:

1 2 3 4 5 6 7 try {      Remote robj = Naming.lookup(“ //localhost/WeatherServer”);      WeatherIntf weatherserver = (WeatherInf)robj;      String forecast = weatherserver.getWeather();      System.out.println(“The weather will be “ + forecast); } catch (Exception e) {      System.out.println(e.getMessage());

客户端代码需要将RemoteExceptions考虑在内。如果你想看看你究竟会遇到什么样的异常错误,可以看看那20多个子类的定义。这样你的代码就会变得丑陋,好吧,这个我们就忍了。

局部性错误

RMI的真正问题在于这些调用可能会出现局部性失败的情况。比如,调用可能会在对其他层的请求操作执行前失败,又或者请求成功了,但之后的返回值又不正确。引起这类局部性失败的原因非常多。其实,这些故障模式正是分布式系统特性的明确定义:

“分布式系统就是某一台你根本意识不到其存在的计算机,它的故障会造成你的计算机无法正常使用。”  ——  Leslie Lamport

如果这个方法只是去检索天气预报,出现问题时你可以简单的进行重试,但如果你想递增一个计数器,重试可能会导致产生0到2次的更新,结果就不确定 了。这个解决方案应该来自幂等操作,但构建这样的操作并不总是可行的。此外,因为你决定改变方法调用的语义,那你基本上就承认了RMI与本地调用是不同 的。而这也就承认了RMI实际上是个悖论。

不论什么情况下,这种范式都是失败的。因为网络的透明度和分布式系统的架构抽象从来就是无法实现的。这也表明了某些软件所采用的方法比其他软件为此 所受到的影响更多。Scrum的一些变种方法中倾向于做原型化。原型更集中于“好的方面”(happy path),而好的方面通常都不是问题所在之处。这基本上意味着你将永远停留在第1级的水平。(不好意思,我知道这是个小小的打击)

那些脱离了第一级水平的人懂得对于需要解决的这个问题,我们要有足够的尊重。他们摒弃了网络透明化的思想,从战略性的角度来处理局部性失败的问题。

第2级:分布式算法 + 异步消息传递 + 语言级支持

OK,你已经学习了分布式计算中的悖论是什么。你决定吞下这颗子弹,然后对消息传递机制建模,以此显式地控制出现失败的情况。你将应用分为两个层次,底层负责网络和消息传递,而上层处理消息的到达,以及需要处理的各种请求。

这个上层实现了一种分布式状态机,如果你去问设计者这个状态机是用来做什么的,他们可能会这样回答你:这是建立在TCP之上的一个Multi-Paxos算法实现。

明智的开发,这里用到的策略可以归结为:程序员首先在本地主要采用线程来模拟不同的进程来开发这个应用。每个线程运行分布式状态机的一个部分,基本 上就是负责运行一段消息处理的循环。一旦这个应用是本地完整的且运行正确,就可以在远端的计算机上用真正的进程来取代线程。到这个阶段,除去网络中可能出 现的问题外,这个分布式应用已经可以正常工作了。到容错阶段时,可以通过配置每个分布式实体来正确反映故障的方式来达成,这种方式很直接。(我引述自“A Fault Tolerant Abstraction for Transparent Distributed Programming”)

因为分布式状态机的存在,局部性故障可以通过设计来解决。对于线程,其实也有很多种选择,但协程(coroutines)更适合(在各种不同的编程语言中,协程也被称为纤程fiber,轻量级线程,微线程或者就叫线程),因为协程允许我们对并发行为有更细粒度的控制。

结合“C代码并不会使网络变得更快”的论点,你可以转移到在语言级支持这种细粒度并发控制的编程语言中去。流行的选择如下(排名不分先后)注意,这些编程语言往往都是函数式的:

1.  Mozart

2.  Erlang

3. OCaml

4. Haskell

5. Stackless

6.  Clojure

举个例子,下面让我们看看在Erlang中这种并发控制的代码看起来是怎样的(取自Erlang concurrent programming

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 - module (tut15) - export ([start/0, ping/2, pong/0]). ping(0, Pong_PID ) ->      Pong_PID ! finished,      io:format (“ping finished~n”, []);   ping(N, Pong_PID )->      Pong_PID ! {ping, self()},      receive          pong ->          io:format (“ Ping received pong~n”, [])      end ,      ping(N – 1, Pong_PID ).   pong() ->      receive      finished ->          io:format (“ Pong finished~n”, []);      {ping, Ping_PID } ->          io:format (“ Pong received ping~n”, []),          Ping_PID ! pong,          pong()      end .   start() ->      Pong_PID = spawn(tut15, pong, []),      spawn(tut15, ping, [3, Pong_PID ]).

这看起来绝对是对旧有的RPC机制的一个重大提升。现在你可以推想一下,如果有消息没有到达时会发生什么事情了。Erlang还有附加的超时消息以及一个语言内建的“超时”组件,可以使你以一种优雅的方式来处理超时。

现在,你选择了你要采用的策略,选择了恰当的分布式算法以及合适的编程语言,然后就可以开干了。你很自信能驾驭分布式编程这头野兽了,因为你再也不是第一级的水平了。

哎呀,可惜的是这一路上并非风平浪静。过了一段时间,当第一个版本发布后,你将陷入泥潭之中。人们会告诉你,你的分布式应用有些问题。问题报告中的 主题全都是和变化有关的。开始时会出现“有时”或者“一次”这样的表示频率的词,之后的描述变成了:系统处于不期望的状态,卡住不动了。如果够幸运,你有 足够的log信息,可以开始着手检查这些日志。稍后,你发现是一系列不幸的事件序列造成了报告中所描述的情况。确实,这是个新的问题。你从来没有考虑过这 些,而且在你做大量的测试和模拟时问题从未出现过。所以,你修改代码以将这种情况也纳入考虑范围。

因为你试着要超前考虑,你决定构建一个“猴子”组件,它以伪随机的方式让你的分布式系统做些愚蠢的事情。“猴子”在笼子里使劲扑腾着,很快你会发现在很多场景下都会导致出现不期望的情况,比如系统卡住了,或者甚至更糟糕的情况:系统出现不一致的状态,而这在分布式系统中是永远也不应该发生的事情。

构建一个“猴子”是很棒的主意,而且它确实能减少遇到那些你从未在这个领域内碰到过的怪事的几率。因为你相信,修改一个bug必须和发现这个bug 的测试用例联系起来,现在需要回归测试这个用例,以证明bug的消除。你现在只需要再构建一次这个测试用例就可以了。可是现在的问题在于,如果说并非不可 能的话,要重现这个错误的场景起码是很困难的。你向上帝祈祷,得到的启示是:当心存疑虑时,就使用暴力法吧。因此,你构建一个测试用例,然后让它跑上无数 次,以此来弥补这极小的失败概率。这会使你解决bug的过程变得缓慢,而且你的测试套件会变得笨重。通过对你的测试集做分而治之的处理,你不得不再次做一 些补偿。无论如何,经过在时间和精力上的大量投入之后,你终于设法得到了一个较为稳定的系统。

你在第2级已经到顶了,如果没有新的启示,你将永远卡在这一级。

第3级:分布式算法 + 异步消息传递 +  纯函数式

我们需要花点时间才能意识到:长时间运行“猴子”以此发现系统中的缺陷然后再结合暴力法来重现它们,这种做法并不可取。使用暴力法重现只会显示出你 的无知。你需要的关键性的启示之一是,如果你可以只将等式中的不确定性拿掉的话,你就可以完美的对每一种场景做重现了。第2级分布式编程的一个重大的缺点 是:你的并发模型往往会成为你代码库中的病毒。你希望有细粒度的并发控制,好吧,你得到了,代码里到处都是。因此是并发导致了不确定性,而不确定性造成了 麻烦。因此必须得把并发给踢出去。可是你又不能抛弃并发,你需要它。那么,你一定要禁止把并发和你的分布式状态机结合在一起。换句话说,你的分布式状态机 必须成为纯函数式的。没有IO操作,没有并发,什么都没有。你的状态机特征看起来应该是这样的:

1 2 3 4 5 6 module type SM = sig      type state      type action      type msg      val step: msg -> state -> action * state end

你传入一个消息和一个状态,你得到一个操作和一个结果状态。操作基本上就是任何试着改变外部世界的东西,需要一定的时间来完成,尝试的过程中可能会失败。典型的操作有:

  1. 发送一个消息
  2. 安排一次超时
  3. 将数据存储在持久性的存储介质内

这里要意识到的重要部分是:你只能通过一个新的消息来得到新的状态,再无其他。在这种严格的规定下所得到的好处是很多的。完美的控制,完美的重现能力以及完美的可追踪性。为此而得到的开销也同样存在,你将被迫使所有的操作都变得具体化。而这些基本上就是为了减少程序复杂性而附加的一层间接。你还需要将每一个你关心的外部世界变化都建模为一个消息。

相比第2级的分布式编程,另一个改变在于控制流。在第2级中,客户端会尝试强制更新并动态设置状态。而在这里,分布式状态机假定有完全的控制力,并且只有当它准备就绪,可以做些有用的事情时才会考虑客户端的请求。因此这些必须分离开来。

如果你把这些道理解释给一个2级的分布式系统架构师听,他可能或多或少的会把这个当成一种替代方案。然而,你需要经历足够多的痛苦之后才会意识到这是唯一可行的选择,我们姑且把这些痛苦称为经验吧。

第4级  对分布式系统领域的深刻理解:快乐,好心态,好好睡一觉

老实说,我现在只是第3级水平,我也不知道在这一级里有什么新鲜玩意。我深信,函数式编程和异步消息传递是分布式系统谜题的一部分,但这些还不够。

请允许我重申我所反对的东西。首先,我希望我的分布式算法实现能够涵盖到所有的可能情况。这对我而言是个大问题,我已经在系统部署的问题上牺牲掉了很多睡眠时间。大部分问题都是PEBKAC类的(Problem Exists Between Keyboard And Chair意指用户引起的错误),但有一些确是真正的问题,这给我造成了一些挫败感。知道自己实现的健壮性程度是很好的。我应该试试证明一下那些定理吗?我应该做更详尽的测试吗?我不知道。

附带提一下,GitHub上有一个称为baardskeerder的仅用于插入操作的B-树库,我们知道可以通过详尽的生成插入/删除排列并断言它们的正确性之后,我们就可以涵盖到所有的情况。但这里,并没有那么简单,而且我对于要对整个代码库做Coqify处理(Coq是一个正式的证明管理系统,它在一种半交互式的环境下提供了一个正式的语言用来编写数学定义、可执行的算法和定理,用计算机来做检查证明,这里作者生造出了Coqify这个词)还有些犹豫。

第二,为了保持清晰和简单,我决定不去碰其它一些正交性的需求。比如,服务发现、认证、授权、私密性以及性能。

说到性能,我们也许是幸运的,至少异步消息传递似乎与性能方面并不产生矛盾。安全性则完全是一个XX(作者真的爆粗口了…),因为它几乎切断了所有 你所做的事情。有些人把安全性看成是一种调味酱汁,你只要把它倒在你的应用程序上就可以保证安全了。哎,在这方面我从未取得过成功,而且现在我也认为这个 问题需要在设计的最初阶段从宏观的角度策略性的去分析解决。

 

结语

开发出健壮的分布式系统是个颇为棘手的问题,实际上根本没有完美的解决方案,或者说至少没有让我觉得完全满意的解决方案。我敢肯定分布式系统的重要性将随着处理器和其它一切事物之间的延迟增加而显著提高。这一结果使得这种类型的应用程序开发变得愈发繁荣。

至于分布式编程的第4级,也许我该去问问Peter Van Roy。这么些年来,我阅读了很多他写的论文,这些论文对于我自己的一些错误认识给了很多启示。关于这些启示的缺点嘛,你常常在大部分时间里看到别人在重复自己的错误,但我无法说服他们应该换种方式去做。

也许,这是因为我无法提供他们想要的那种灵丹妙药。他们就想要RPC,而且他们希望这样能搞定问题。这是固执的…就像宗教信仰一样。

英文原文:rslootma   编译:伯乐在线— 陈舸

亲爱的 Oracle: Java API 不是艺术品

Oracle曾经说Java API就像是优美的画作。Google却说API就是文件柜里的文件。最后,William Alsup(负责审理Oracle和Google关于Java纠纷的法官)比较同意Google的观点,Java作为一门编程语言,其API就像是图书馆里的藏书一样。

“Java里的包(package)就像是图书馆的书架一样”,Alsup法官在他最近一周的所作出的广受关注的裁定中这样写道,该裁定正是针对 Google和Oracle关于Java API的漫长的法律诉讼所作出的,“每一个类(Class)就像是书架上的一本书,类中的每一个方法(Method)就像是书中的‘阅读指南’章节。程序员的工作,就是前往正确的书架,选择正确的书,打开这本书,找到所需要的章节。”

bookshelf
Image: twechy/Flickr

Alsup法官的基本观点是:库文件的组织形式并不受制于版权。是的!他明确地表达了这个观点:书是有版权的,但是你在书架上怎么放书,按什么顺序放,这跟版权一点儿关系都没有。

换句话说,Google复制了37个Java API,用以构建其Android手机操作系统,这一行为并不侵犯Oracle的版权。尽管Google照搬了这些API的组织形式,但Google自行 构建了代码,至少是绝大多数自行构建的。“Java和Android的类库在组成形式上大致相同,基本上提供了相同的功能,解决相同的问题,不过 Google对这些功能函数都做了自己的实现,这些实现和Oracle所属的Java是不一样的。”


Google和Oracle关于Android是否侵犯Java版权开展诉讼

根据这一裁定,Alsup法官终结了这场关于Google Android系统侵权使用Java的诉讼,该诉讼长达六周之久。Oracle于2010年控告Google非法侵占了Java的版权和专利权,并企图通 过该诉讼在Google Android系统的巨额利润中分得一杯羹。不过,依照Alsup法官的裁决,数据库巨头Oracle这次要一无所获了。Oralce已经表明了对此案上 诉的态度。

如果Alsup做出相反的判决,那么Oracle很可能会引发一场‘令人难以想象’的灾难,还好法官没有这么做。Bret Bocchieri表达了这样的观点,他是来自一家名为Seyfarth Shaw LLP的国际法律公司的知识产权专家律师。

更重要的是,Alsup法官的裁决让全世界范围内的软件公司和独立开发者们都松了一口气。在软件世界里,复用API是非常普遍的行为。例如,一些云 计算平台,就模仿了Amazon所拥有的著名的云计算架构ECC(Elastic Compute Cloud)的API形式。API是应用程序的可编程接口,是不同软件之间交互的重要方式,行业内普遍默认对接口的组织和使用并不会触犯到版权保护法律。 Oracle对这个默认规则的挑衅,至少在业界引发了巨大的争议。周四,Alsup法官的裁定结束了这些纷争。

“如果Oracle的观点得到认同,那么着就意味着任何人都能给自己实现的系统或功能加上版权,同时,他还能够根据版权的保护条例禁止其他任何人用 他们自己的方式实现跟你的系统和功能相同的软件。(也就是说,这种软件只能有版权的人做,其他人会做都不能做——译者注)”在法官的41页的简报里,他写 到:“没有任何理由可以支持这种极端的提议。”

Alsup法官 为了审案甚至亲自学习了Java编程

Ed Walsh,一位来自于Wolf Greenfield国际法公司的律师,表示他对这样的裁定并不感到惊讶。但是他同时也指出,这个裁定并不意味着从此以后API就不受版权的约束了。 Walsh认为,Alsup法官部分出于Sun公司的原因,帮了Google一把,允许Google复制API。Sun公司才是Java真正的创始者,后 被Oracle收购,而后Oracle才取得了Java的版权并起诉Google.

“我认为有一些因素对裁定结果产生了影响,那就是Sun公司原先是允许人们随意使用Java的”,Walsh说,“所以Oracle不能用版权去限制这些本来就已经开放的事物。”

Catherine Lacavera, Google的诉讼代表,也表达了同样的观点。“这个判决重申了我们长期以来对法律的理解,这些API是可以被所有人自由使用的,正如我们使用它一样,我 们采用了这些功能的声明,并自己独立实现这些声明所包含的功能代码。”,她说,“这就是开发者使用Java的正常模式,你不能说,一种语言是可以自由使用 的,然后又禁止人们使用这种语言的名词或者动词。”

Alsup法官则考虑得更细,他使用了大量的细节来描述什么是Java API以及在法律范围内这些API应当如何对待。他所提出的图书馆的比喻非常经典。但是他可不是仅仅停留在比喻的层面上。他似乎真的理解什么是API.他 也很清楚复制一个接口(Interface)和复制实现接口的代码,这两个概念是有区别的。

“每个成员方法(Method)和类(Class)都是用来实现特定的功能的,因此,‘声明’(或者说‘头文件’)所包含的代码必须和实现功能的代码一致”,Alsup法官在做出图书馆的比喻后还这样说过。

2008年时,Java共包括166个API, 涉及到该600个类,6000多个方法。 Google复制37个API包(package)的名称和操作方式,但是Google用自己的代码对这些方法和类进行了实现。

在诉讼中,Oracle的法律顾问Mike Jacobs常说,构建API就像是进行交响乐创作,或者是,是的,就像是绘制一幅优美的画作一样。Alsup法官当然意识到了开发API是一种创作性行 为。但是他也为这种行为加上了概念性的级别,API这样的发明只能由专利权来保护(而不是知识产权)。Oralce当然也从专利权的角度进行过诉讼,但是 同样没有成功。

Java依赖一种特殊的“词汇表”一样的组织形式,称之为“方法规格说明书(method specification)”,程序员这通过这个说明书告诉计算机需要做什么事情。Alsup法官表示,根据美国版权法案,无论“方法规格说明书”是如 何地有创意,任何人——包括Google——都有权利使用相同的“方法规格说明书”,只要他们对“方法规格说明书”中定义的方法的实现代码不同。“方法规 格说明只是一种‘概念’,方法本身的实现才是具体的表达。法律不能让任何人对‘概念’进行垄断”。Alsup法官如此写道。

法官说,目前还没有哪个上诉法庭或者地区法院对API受版权保护一事做出裁决。但是他也的确参照了其他的案例进行判决,包括1879年最高法院裁定 Baker针对Seldon的诉讼——这是一场讨论关于会计技能是否受版权限制的官司。法院最后裁定会计记账方法学只受专利权的约束,而不受版权的约束, 因为一旦判决其受版权法约束,将会“极大挫伤出版业的积极性”。

“Baker的案例已经很久远了,但是这个案例并不过时。相反,即便是在当代,Baker案也会被告到上诉法庭才能有最终裁定。”

他还引证了1994年苹果公司针对微软公司的诉讼案,1992年冠群电脑国际有限公司(Computer Associates International)针对Atari的官司,以及1985年Whelan Associates, Inc. 针对 Jaslow Dental Laboratory, Inc.的诉讼案,所有的这些案件都是关于计算的各个方面是否违反版权的。Alsup得出结论:如果一个概念有不只一种表达方式,那么没有人可以申请对概念本身的版权。

名称和短语都是不受版权保护的,他说,版权保护的范围不会延伸到任何概念,过程、进程、系统、操作方法,或者观念——无论以任何形式。他还说,对实现互用性所必要的功能性元素不受版权限制。这里就包括了Java API.

从很多方面来说,Google和Oracle的官司的结果并不让人激动。但是从某些方面来讲,这个案子又远远超传统的意义。该案的亮点在于,Alsup法官告诉法庭,他自己为了审案而学习了Java编程,这给了Oralce一记响亮的耳光,别想用技术蒙蔽法官的双眼。 回顾这长达6周的诉讼,在法庭上,Alsup法官多次向双方的律师和技术证人提出各种专业而尖锐的问题,这真是非常精彩的表现!我们信任这样的法官!在他 的裁决书里,他甚至自己写出了各种代码,来演示方法(method)、类(class)和包(package)的具体概念。并且,最后,他做出了正确的判 决!

英文原文:Caleb Garling  编译:伯乐在线 – 黄小非

微软推on{x}:远程控制 Android 手机

想象一下,早上出门的时候,Android手机能自动提醒你带伞,因为今天过不久就会下雨。在你下班后,爱人能接收到你提前编写好的信息。可能这一 切都不过瘾,但是通过一个网站和浏览器应用,就能远程控制Android手机,既能提前预设手机执行的“任务”,又可以给远方另一端的人制造意外惊喜,还 有很多很多能够预见的“潜在用途”。


on{x} 

在今天,微软宣布放出了on{X}的beta版本,它是一个网站和Android应用的结合体,通过远程编程能够延伸控制用户的Android手机。相信极客会沉迷到JavaScript API(应用程序编程接口)之中。

在我们深入了解之前,肯定会有这样一个疑问,微软为何会放出一个为Android打造的东西。这个答案在on{X}背后的开发团队上—— IPE(Israeli Information Platform and Experiences)上。IPE擅长基于定位服务中的移动设备信号收集,它为提升Bing搜索体验工作,相关内容包括地理围栏、即时定位分享、接近探 测及持续的日志记录和推荐系统。它也在寻找融合了web服务和应用的新的途径,去提升用户体验。

Shira Weinberg是团队的项目经理,他强调Android平台的开放性和并不严格的安全模型符合他们的要求,所以才在新技术的早期预览阶段,选择将其部署 在Android平台上。这也就是说,这项技术将来肯定会在Windows 8和Windows Phone系统平台上应用。

很多人关心,如何才能使用这项新技术呢?所有用户只需下载对应的Android应用和确认on{X} 网站的(编写)规则。这些规则也称为“点菜单”(recipes),有11个“模板”已经放出和准备供用户使用,例如“当我散步的时候加载音乐应用”, “要是未来3天内我没有走访体育馆就提醒我”。(是不是有点像ifttt?)

即便是初学者,想要编辑这些“任务”都非常简单。而所有的数据和编写规则都是保密的,只有用户能够知晓,对于真正的极客,相信能通过应用程序编程接口创立自己的规则和“模板”。

尽管个人的编写内容受到隐私保护,on{X}也允许用户公布他们自己创立的“菜单”内容,因此公众和普通用户可以好好参考和借鉴别人发布的新编写规则或模板。