Статьи

Оракул против Google, смягченная катастрофа

Являются ли API защищенными от копирования?

Oracle v. Google  привел к очень плохому мнению для всех в программном обеспечении, включая Oracle. Федеральный апелляционный суд, применяющий закон 9-го округа, постановил, что структура, последовательность и организация API-интерфейсов защищены авторским правом. Это радикальное изменение в законодательстве, так как на сегодняшний день все и все юристы заняли позицию, что API не защищены авторским правом, но реализация API есть.

Сначала смягчение.

Пока API-интерфейсы подвергаются обратному проектированию, клонировать их можно

Большая часть решения, похоже, заключается в том, что у Google не было чистых рук, и суд наказывает Google за то, что он был хулиганом для Sun в переговорах о лицензировании Java, а затем дословно копировал 7000 строк деклараций API. Я понял это.

Для большинства из нас ключ к решению находится на странице 48:

Как указывал бывший реестр авторских прав Соединенных Штатов в своем кратком обзоре amicus curiae: «[h] ad Google разработал пакеты программного обеспечения для выяснения идей и функциональности оригинала, а затем создал свою собственную структуру и свою структуру. Будучи собственным буквальным кодом, Oracle не будет иметь никаких средств защиты авторских прав ». Br. для Amicus Curiae Ральф Оман 29. Вместо этого Google решил скопировать как декларирующий код, так и общий SSO из 37 рассматриваемых пакетов Java API.

Я прочитал это (поговорите со своим адвокатом, не следуйте моему совету), так как это означает, что авторские права сохраняются на следующее:

/*

* Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved.

* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.

*

* This code is free software; you can redistribute it and/or modify it

* under the terms of the GNU General Public License version 2 only, as

* published by the Free Software Foundation. Oracle designates this

* particular file as subject to the "Classpath" exception as provided

* by Oracle in the LICENSE file that accompanied this code.

*

* This code is distributed in the hope that it will be useful, but WITHOUT

* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or

* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License

* version 2 for more details (a copy is included in the LICENSE file that

* accompanied this code).

*

* You should have received a copy of the GNU General Public License version

* 2 along with this work; if not, write to the Free Software Foundation,

* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.

*

* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA

* or visit www.oracle.com if you need additional information or have any

* questions.

*/

package java.lang;



import java.io.ObjectStreamField;

import java.io.UnsupportedEncodingException;

import java.nio.charset.Charset;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Comparator;

import java.util.Formatter;

import java.util.Locale;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

import java.util.regex.PatternSyntaxException;



/**

* The <code>String</code> class represents character strings. All

* string literals in Java programs, such as <code>"abc"</code>, are

* implemented as instances of this class.

* <p>

* Strings are constant; their values cannot be changed after they

* are created. String buffers support mutable strings.

* Because String objects are immutable they can be shared. For example:

* <p><blockquote><pre>

* String str = "abc";

* </pre></blockquote><p>

* is equivalent to:

* <p><blockquote><pre>

* char data[] = {'a', 'b', 'c'};

* String str = new String(data);

* </pre></blockquote><p>

* Here are some more examples of how strings can be used:

* <p><blockquote><pre>

* System.out.println("abc");

* String cde = "cde";

* System.out.println("abc" + cde);

* String c = "abc".substring(2,3);

* String d = cde.substring(1, 2);

* </pre></blockquote>

* <p>

* The class <code>String</code> includes methods for examining

* individual characters of the sequence, for comparing strings, for

* searching strings, for extracting substrings, and for creating a

* copy of a string with all characters translated to uppercase or to

* lowercase. Case mapping is based on the Unicode Standard version

* specified by the {@link java.lang.Character Character} class.

* <p>

* The Java language provides special support for the string

* concatenation operator (&nbsp;+&nbsp;), and for conversion of

* other objects to strings. String concatenation is implemented

* through the <code>StringBuilder</code>(or <code>StringBuffer</code>)

* class and its <code>append</code> method.

* String conversions are implemented through the method

* <code>toString</code>, defined by <code>Object</code> and

* inherited by all classes in Java. For additional information on

* string concatenation and conversion, see Gosling, Joy, and Steele,

* <i>The Java Language Specification</i>.

*

* <p> Unless otherwise noted, passing a <tt>null</tt> argument to a constructor

* or method in this class will cause a {@link NullPointerException} to be

* thrown.

*

* <p>A <code>String</code> represents a string in the UTF-16 format

* in which <em>supplementary characters</em> are represented by <em>surrogate

* pairs</em> (see the section <a href="Character.html#unicode">Unicode

* Character Representations</a> in the <code>Character</code> class for

* more information).

* Index values refer to <code>char</code> code units, so a supplementary

* character uses two positions in a <code>String</code>.

* <p>The <code>String</code> class provides methods for dealing with

* Unicode code points (i.e., characters), in addition to those for

* dealing with Unicode code units (i.e., <code>char</code> values).

*

* @author Lee Boynton

* @author Arthur van Hoff

* @author Martin Buchholz

* @author Ulf Zibis

* @see java.lang.Object#toString()

* @see java.lang.StringBuffer

* @see java.lang.StringBuilder

* @see java.nio.charset.Charset

* @since JDK1.0

*/



public final class String

implements java.io.Serializable, Comparable<String>, CharSequence {

/** The value is used for character storage. */

private final char value[];



/** Cache the hash code for the string */

private int hash; // Default to 0



/** use serialVersionUID from JDK 1.0.2 for interoperability */

private static final long serialVersionUID = -6849794470754667710L;



/**

* Class String is special cased within the Serialization Stream Protocol.

*

* A String instance is written initially into an ObjectOutputStream in the

* following format:

* <pre>

* <code>TC_STRING</code> (utf String)

* </pre>

* The String is written by method <code>DataOutput.writeUTF</code>.

* A new handle is generated to refer to all future references to the

* string instance within the stream.

*/

private static final ObjectStreamField[] serialPersistentFields =

new ObjectStreamField[0];

Потому что он был дословно скопирован из исходного кода, но:

public final class java.lang.String implements java.io.Serializable, java.lang.Comparable<java.lang.String>, java.lang.CharSequence {
  public static final java.util.Comparator<java.lang.String> CASE_INSENSITIVE_ORDER;
  public java.lang.String();
  public java.lang.String(java.lang.String);
  public java.lang.String(char[]);
  public java.lang.String(char[], int, int);
  public java.lang.String(int[], int, int);
  public java.lang.String(byte[], int, int, int);
  public java.lang.String(byte[], int);
  public java.lang.String(byte[], int, int, java.lang.String) throws java.io.UnsupportedEncodingException;
  public java.lang.String(byte[], int, int, java.nio.charset.Charset);
  public java.lang.String(byte[], java.lang.String) throws java.io.UnsupportedEncodingException;
  public java.lang.String(byte[], java.nio.charset.Charset);
  public java.lang.String(byte[], int, int);
  public java.lang.String(byte[]);
  public java.lang.String(java.lang.StringBuffer);
  public java.lang.String(java.lang.StringBuilder);
  java.lang.String(char[], boolean);
  java.lang.String(int, int, char[]);

Не сохраняет авторские права, потому что он был перепроектирован с использованием  javap.

Эта действительно странная дихотомия необходима для суда, чтобы согласовать это решение с  Sony v. Connectix .

По сути, Sony считала, что справедливо делать копии кода, а также реинжиниринг API в коде для создания совместимых систем. Так или иначе, акт обратного инжиниринга чего-либо (мнение Oracle очень лёгко для руководства, так что это не должно быть сюрпризом), независимо от того, насколько мало усилий, достаточно, чтобы удалить авторское право из структуры, последовательности и организации код.

Адвокаты Google и EFF — не самые острые инструменты …

На данный момент пост будет немного личным. По сути, Oracle наняла  лучшего в мире IP-судебного разбирательства,  и она вытерла пол с юристами Google. Большая часть мнения суда была основана на создании таких вещей, как «что такое компьютерный язык?» «что такое совместимость?» и «в чем оригинальность?» Мнение меняет значение каждой из этих вещей в соответствии с результатами, и это отличительная черта очень хорошего адвоката.

И EFF просто слаб в их  экспертном  вкратце ,  которая должна была быть одна строка: «Open хорошо не открыт, плохо.» Потому что в этом кратком изложении очень мало сущности.

Разрушение, которое должно было случиться

Адвокаты Google должны были сделать намного лучше, как на суде, так и в апелляции с фактами.

Единый вход Java API не является оригинальной работой

Первый и самый важный факт, на который опирается весь суд, заключается в том, что (стр. 21):

На этом этапе неоспоримо, что декларирующий код, структура и организация пакетов Java API являются оригинальными. Судебные показания показали, что разработка пакетов Java API была творческим процессом …

Структура, последовательность и организация этих 37 пакетов являются эволюцией многих других библиотек и систем. В Java API , проистекают из  Eiffel  и  Smalltalk  и  C ++  и многих других языков программирования. java.net Пакет в форме библиотеки BSD сокетов , что он выступает в качестве фасада к.

К сожалению, это одна из проблем, с которыми юристы Google не сталкивались. Да, были решения о том, как называть и организовывать пакеты, классы и методы, которые требовали некоторой креативности, но это была организация и нормализация многих существующих API и систем. И затем это становится проблемой именования, и как только это становится проблемой именования, мы возвращаемся к анализу окружного суда, что авторское право не применяется к коротким вещам, таким как имена.

Все, что нужно было бы сделать юристам, — это просмотреть   обсуждения JCP по поводу некоторых API, чтобы получить массу доказательств того, что API на самом деле в основном получены из других систем.

Дихотомия Идеал / Экспрессия

Хуже всего в том, что в вычислениях у нас был очень простой способ выражения идеальной / выражающей  дихотомии : API — это идеал, а реализация — это выражение. Просто.

Да, идеи могут быть очень сложными вещами. К сожалению, юристы Google не придумали около 50 примеров очень сложных идей, таких как  теория относительности .

Адвокаты Google также не помогли суду понять, что линия API / интерфейс против реализации — очень приятная яркая линия, которая на самом деле избегает путаницы с многофакторными тестами. Кроме того, наличие яркой линии вместо того, чтобы говорить: «все, что написано в исходном коде и всех машинных переводах этого исходного кода, связано с авторскими правами, но может быть справедливое использование, которое является чертовски изворотливой концепцией» означает, что разработчики и компании знают, что приемлемое поведение есть.

Проще говоря, API против реализации раньше был яркой чертой. Это больше не Яркая линия сработала.

Что такое язык

Это еще одно место, где суд был по всей карте … определяя язык Java (что явно не защищено авторскими правами).

В некоторых местах этот язык — всего лишь синтаксис грамматики.

В некоторых местах это байт-код, который может работать на JVM.

В некоторых местах это синтаксис языка и библиотек, необходимых для работы минимальной программы (например,  java.lang).

Таким образом, суд дает очень мало указаний относительно того, к чему относится авторское право. Это все API Java? Это API, на которые нет ссылок в компиляторе Java?

Еще одно место, где юристы Oracle убедили суд определить «язык», соответствующий их целям, а не то, что разработчик может использовать, чтобы узнать, где заканчивается «язык, к которому авторские права не относятся».

Чистота рук

В самом начале, суд обсуждает, как Google и Sun не достигли лицензионного соглашения, потому что (стр. 9):

Стороны вели переговоры в течение нескольких месяцев, но не смогли достичь соглашения. Предметом спора между сторонами был отказ Google сделать реализацию своих программ совместимой с виртуальной машиной Java или совместимой с другими программами Java. Поскольку Sun / Oracle сочла эту позицию анафемой философии «пиши один раз, беги куда угодно», она не предоставила Google лицензию на использование пакетов Java API.

Выше было связано с товарным знаком. Sun сохраняла свою метку «пиши один раз, беги куда угодно». Суд, похоже, считает это негативом для Google, но мне кажется, что Sun могла бы лицензировать код, но не знак Java для Google, и Google заплатил бы за лицензию на код. Большая часть мнения основывается на том, что у Google нет чистых рук, но вышеизложенное указывает на то, что у Sun не было чистых рук.

Конечно, для Google было очень плохо копировать 7000 строк исходного кода. Но, в конце концов, они могли нанять команду чистых помещений для перепроектирования API,  javap и это обошлось бы в 500 тысяч долларов. Но юристы Google сделали слабую работу, указав на отсутствие чистых рук у Sun.

Сделано на ночь

У меня есть еще несколько заметок, которые я хочу раскрыть по этому делу, но я закончила на ночь. Может быть, больше завтра, а может и нет.

Нет-нет, это вообще плохое решение. Это плохо аргументировано. Это дает мало указаний о том, как мы должны действовать. Серебряная подкладка заключается в том, что она поддерживает Sony, и ясно, что обратное проектирование, а не дословное копирование, удаляет любое авторское право. Поэтому для тех, кто использует анализаторы пакетов для определения сетевых протоколов, и для тех, кто разбирает объектный код, я думаю, вы в безопасности.

Для тех, кто клонирует опубликованные API, я думаю, что вам придется использовать подход чистой комнаты, когда документация API отправляется команде чистой комнаты, которая воссоздает документы API, а затем вы кодируете в чистую комнату. Docs.