¿Qué debo hacer para NO robar el código "Hello World" con una licencia GPL?


42

En el proyecto, encontré un archivo math.c, con un gran encabezado de GPL y ...

//------------------------------------------------------------------------------
/// Returns the minimum value between two integers.
/// \param a  First integer to compare.
/// \param b  Second integer to compare.
//------------------------------------------------------------------------------
unsigned int min(unsigned int a, unsigned int b)
{
    if (a < b) {
        return a;
    }
    else {
        return b;
    }
}

OK, genial, así que necesito obtener el valor mínimo y ... ¿ este archivo ? ¿Entonces necesito abrir todo el proyecto por eso? ¿O necesito reinventar las matemáticas?

No creo que sea una locura, así que la pregunta es: ¿cuándo podemos eliminar el encabezado de la GPL?

¿Debo ser un bicho raro y hacerlo ?

unsigned int min(             unsigned int
JEIOfuihFHIYEFHyigHUEFGEGEJEIOFJOIGHE,
unsigned int hyrthrtRERG            ) {  if
(JEIOfuihFHIYEFHyigHUEFGEGEJEIOFJOIGHE
< hyrthrtRERG            ) {  return JEIOfuihFHIYEFHyigHUEFGEGEJEIOFJOIGHE;  }
else {return hyrthrtRERG            ;    } }

En serio, ¿quieren que escriba código como el anterior?


22
Bueno, en el caso reciente de Google vs Oracle the jury did find that one nine-line function that Google acknowledged copying was infringing(de ArsTechnica ).
Zenon

55
Aww vamos, en serio, ¿min?
Mircea Chirea

33
Yo diría que la existencia misma de esta pregunta demuestra una mala cosa - menos programación El trabajo de un programador ha convertido, más desorden legal y la burocracia
K.Steff

44
Cópialo . Una función trivial como minno está cubierta por derechos de autor. Vea mi respuesta para más detalles.
Tony the Pony

66
@Loki, te lo estás perdiendo por una milla. Los algoritmos están cubiertos por patentes, no por derechos de autor. Los derechos de autor caducan 70 años después de la muerte del autor, por lo que las obras protegidas por derechos de autor en los años 60 todavía son bastante recientes. Finalmente, la pregunta es sobre copiar ESTE código, no sobre el algoritmo.
alexis

Respuestas:


53

A diferencia de muchos de los usuarios aquí, simplemente sugeriría: ¡Cópielo!

Asegúrese de que el formato del código se ajuste a su estándar de codificación y que probablemente también debería eliminar o reescribir el comentario. Nadie sabrá que lo ha copiado: cuando un código es así de simple, bien podría haberlo escrito desde cero. Si su estándar de codificación de alguna manera requiere que la función se vea exactamente como se ve en el fragmento, que así sea, siempre y cuando se vea como si la hubiera escrito desde cero.

Piénselo, esta es apenas (!) La primera vez que se escribe esta pieza exacta: cuando algo es tan trivial, hay pocas razones para no copiarlo, si no tiene ganas de escribirlo usted mismo.

Incluso tener esta discusión me parece un poco superfluo: ¡debemos ser pragmáticos si queremos hacer un trabajo real!


55
la verdadera pregunta es dónde está la barrera entre lo trivial y lo no trivial, y existe la manera de estar absolutamente seguro de que la gente no apuntará mi código con algo parecido "¡MIRA LA REALIZACIÓN MÍNIMA DE GPL!" ... Realmente temo a esas personas> _ <
cnd

20
Bueno, existe el concepto de umbral de originalidad en los derechos de autor. Y un método tan simple no debería tener derechos de autor. IANAL, sin embargo, y las jurisdicciones varían. Aún así, algo que cada estudiante de CS ha escrito al menos cinco veces exactamente de la misma manera podría muy bien caer en esto.
Joey

44
@nilu: Let us then say that the programmer wrote his own version of MIN and it ended up looking exactly like the one from math.c - would it then be okay?Sí, si fue un accidente. "¿Qué diferencia habría si la hubiera copiado?" Los bits tienen color . ansuz.sooke.bc.ca/entry/23 Esto no es algo que la mayoría de los informáticos puedan entender, de hecho es un tema complejo, pero es algo que la ley reconoce. Si tiene dudas sobre si algo es legal o no, es mejor que hable con un abogado .
Mark Byers

44
@alexis: entiendo su punto, pero no estoy realmente de acuerdo: si el código resultante es idéntico, nadie más que el programador puede saber si fue copiado o escrito desde cero. Obviamente, uno debería tener pocos problemas para implementar min y probablemente tomaría menos tiempo que encontrar otra implementación. Sin embargo, si un programador realmente lo copia y nadie más sabe que no ha escrito la función él mismo, ¿qué daño se ha hecho? A menos que el programador sienta algún tipo de "culpa", la respuesta es ninguna. El resto es simplemente semántica.
nilu

55
@MarkByers: Cuando digo 'no puedo probar', quiero decir que no existe evidencia física que demuestre que incluso se ha cometido un delito : el delito que se ha cometido está completamente limitado a la mente del programador. Obviamente, este no puede ser el caso si se roban algunos dulces, esto tiene un impacto físico en el mundo (piruleta - = 1). Si el "crimen" se limita a su propia mente, ¿quién juzgará si es moral o inmoral?
nilu

18

No responde directamente a su pregunta, pero intente esto:

#define min(a,b) ((a) < (b) ? (a) : (b))

Por la presente, libero esta macro gloriosa y compleja al dominio público. Aunque puede que tenga que publicar un artículo sobre esta técnica.

Si eres macrofóbico, prueba esta versión en línea (en realidad, a menos que estés codificando en un SPARC, ahorrarás muchos ciclos de CPU al no ajustar una función tan ubicua como minen el código de entrada / salida):

inline int min(int a, int b)
{
    return a < b ? a : b;
}

El problema de las licencias de código para fragmentos triviales es realmente un poco molesto. Consulte con un abogado, pero tengo la tentación de suponer que en realidad no pueden obtener una licencia y / o que la licencia no se puede hacer cumplir en la práctica. Igual que no puede hacer copyright o marcar la palabra 'palabra', entonces apóyese en las personas que la usan. (Uy)


1
Oh, ciertamente pueden hacer un copyright de ese código, pero dada la simplicidad del algoritmo, sería difícil probar en la corte que lo copió a menos que haya hecho algo estúpido como dejar comentarios intactos, etc. La regla no es que pueda No use el mismo código, la regla es que solo puede hacerlo si lo escribió con su propio cerebro y no copió el original de ninguna manera.
Gort the Robot

2
@StevenBurnap Por supuesto, el código original también tendría los mismos problemas: ¿pueden demostrar que tienen derechos de autor (es decir, que no lo copiaron de alguna implementación anterior)?
Richard

19
El problema con la versión macro de min viene cuando intentas hacerlo min(a++,b++).

44
"liberar esto ... al dominio público" está muy centrado en los Estados Unidos. No significa lo mismo en muchos países y, de hecho, en algunos no es legalmente posible.

99
Gracias, pero en un compilador de la década de 2000, un compilador puede en línea trivialidades como min.
DeadMG

18

Descargo de responsabilidad : no soy un abogado. Usa mi consejo bajo tu propio riesgo.

Esta implementación de mines no derechos de autor , ya que hay muy pocas formas razonables de escribirlo.

En el mundo legal, esto se conoce como la doctrina de la fusión (también conocida como la división idea-expresión). Se dice que la idea (no con derechos de autor) de la función se ha "fusionado" con la expresión (potencialmente con derechos de autor) . Por lo tanto, el código no está sujeto a derechos de autor: puede usarlo libremente.

Para estar seguro, no lo copie textualmente . Use diferentes nombres para las variables, aplique su propio formato, no copie comentarios palabra por palabra. La representación literal exacta de este código puede estar cubierta por derechos de autor.

Tenga en cuenta que esto no garantiza que alguien no lo demandará, pero al menos tendrá una defensa sólida.

Además, tenga en cuenta que incluso si un código no está protegido por derechos de autor, aún podría estar cubierto por una patente de software (este no es el caso de su minfunción).


2
¡Intenta decirle eso a Oracle!
GordonM

1
Tal vez esa función de 9 líneas no era trivial ... Me gustaría ver el código.
Tony the Pony

1
programmers.stackexchange.com/a/148362/28718 me parece bastante trivial, suponiendo que ese es el código correcto.
GordonM

12

Estoy lanzando el siguiente código bajo la licencia BSD . Como esa licencia es mucho más permisiva, no debería encontrarse con problemas de derechos de autor si usa mi implementación.

unsigned int min(unsigned int a, unsigned int b)
{
    return (a > b? b: a);
}

¿Cómo puedo estar seguro de que no sella ese código GPL y lo reescribe? : P (solo bromeando)
cnd

1
Tu no eres. Pero si usó mi código, puede afirmar que lo usó de buena fe.
GordonM

3
Alégrate, hermanos, a medida que la nueva era ha comenzado: ahora podemos encontrarla minen software de código cerrado. Además, @Sholy, ahora es el problema de GordonM si lo ha copiado o no.
K.Steff

55
También lo está publicando en "Creative commons". Consulte la parte inferior de esta página sobre el código pegado aquí.
Martin York


11

Es una situación absurda, estoy de acuerdo, pero solo tú tienes la culpa. Si está escribiendo código propietario, no debería leer archivos fuente con licencia GPL, punto. Elimine math.c de su sistema de archivos, conserve la documentación y no dude en volver a implementar cualquier parte de la API que necesite. Si no lee el código, no necesita preocuparse si su propio código resulta similar.

¿Un derroche, dices? La GPL intencionalmente evita que se beneficie del código gratuito sin tener que devolver al ecosistema. Si no puede o no cumple con sus términos, y no desea implementar otra biblioteca matemática, siempre puede comprar una o encontrar una gratuita que venga con una licencia que pueda aceptar.

Los programadores de Microsoft no pueden leer código fuente abierto para proteger a la empresa de problemas legales. Por razones puramente éticas, debe hacer lo mismo con cualquier programa cuya licencia no quiera cumplir.

No tiene derecho a usar esto math.c, pero nadie está tratando de arrinconar el mercado en implementaciones de min. El objetivo de la GPL es aumentar la "libertad" del programador (y la libertad del usuario final), no restringirla. La licencia GNU, la FSF y el Movimiento de Software Libre comenzaron con Richard Stallman, y Stallman comenzó con la implementación desde cero de cada nueva versión de Symbolics lisp a medida que salía. La FSF no (y no podría) perseguir a nadie para volver a implementar una biblioteca GPL.


Entonces, pero, es un ejemplo realmente extraño. Es un ejemplo, eso significa que debo leerlo y seguirlo ... pero por lo que entiendo, soy libre de no elegir la licencia GPL aquí. Entonces sé quién es Stallman;)
cnd

2
Sholy, lo siento, pero no tengo idea de lo que estás diciendo. Que ejemplo (¿También me preguntas quién es Stallman? Búscalo en Google. O simplemente consulta Wikipedia.)
alexis

3
"Los programadores de Microsoft no pueden leer el código fuente abierto" oh, eso es horrible, ¿hay algún lugar donde pueda leer sobre eso? Google no está ayudando.
amara

Buena pregunta. Lo leí en algún foro de desarrollo de Iron Python, pero desafortunadamente no puedo encontrarlo ahora. Resumen: Jim Hugunin ( hugunin.net/microsoft_farewell.html ) mencionó que no se les permite ver la implementación de Python y alguien preguntó en broma si se les permite ver su propio código (Microsoft había hecho el código abierto de Iron Python) . La respuesta es: hicieron una excepción especial para Iron Python.
alexis

Las personas cuya libertad pretende aumentar la GPL son todos los usuarios del programa, no (específicamente) los programadores.
James Youngman

7

Respuesta: Solo con permiso explícito del autor.

Ese es un código con derechos de autor. No puede copiarlo sin el permiso del autor.

Tendrá que escribir su propia versión mino copiar una variante minque use una licencia diferente.

Recuerde, con los derechos de autor, es el código el que está protegido, no el algoritmo. La ley de derechos de autor proviene del texto. Incluso si "math.c" no era más que comentarios y no tenía ningún código ejecutable en absoluto, que sería aún estar protegido por derechos de autor.


1
¿Qué significa versión propia? ¡MI PROPIA versión de MIN, suena gracioso!
cnd

2
Recuerde, usted no posee min, posee una secuencia particular de caracteres que sucede que implementa min.
Gort the Robot

2
No puede cambiarlo en absoluto sin el permiso del autor, excepto para uso personal. Tienes que reescribirlo desde cero. Ese es todo el punto. Tenga en cuenta que si se sentó en un editor en blanco y escribió algo casi idéntico a eso, estaría bien, porque no lo copió. (Suponiendo que no estuviera escribiendo de memoria)
Gort the Robot

2
No, no estoy bromeando. Y sí, probablemente pueda salirse con la suya en casos como este. Correspondería al titular de los derechos de autor demostrar que lo ha hecho. Tenga en cuenta que solo le digo cuál es la ley, no la defiendo.
Gort the Robot

3
Porque si no recodifica estas cosas triviales, está utilizando el trabajo de otra persona de una manera que no le ha dado permiso para hacerlo. Si es tan trivial que no lo necesita, no lo use.
alexis

6

Esto es lo que Google supuestamente estafó. Esto parece sentido común para una matriz.

 908     /**
 909      * Checks that fromIndex and toIndex are in range, and throws an
 910      * appropriate exception if they aren't.
 911      *
 912      * @param arrayLen the length of the array
 913      * @param fromIndex the index of the first element of the range
 914      * @param toIndex the index after the last element of the range
 915      * @throws IllegalArgumentException if fromIndex > toIndex
 916      * @throws ArrayIndexOutOfBoundsException if fromIndex < 0
 917      *         or toIndex > arrayLen
 918      */
 919     private static void rangeCheck(int arrayLen, int fromIndex, int toIndex) {
 920         if (fromIndex > toIndex)
 921             throw new IllegalArgumentException("fromIndex(" + fromIndex +
 922                        ") > toIndex(" + toIndex+")");
 923         if (fromIndex < 0)
 924             throw new ArrayIndexOutOfBoundsException(fromIndex);
 925         if (toIndex > arrayLen)
 926             throw new ArrayIndexOutOfBoundsException(toIndex);
 927     }

Si esto es todo, el veredicto se lanzará en apelación. Pero según Wired, el juez también encontró que Google copió otros 8 archivos. Ver wired.com/wiredenterprise/2012/05/google-oracle-decompile
Tony the Pony

55
Sí, pero el "sentido común" no es el obstáculo para los derechos de autor. Es si copiaron y editaron o se escribieron desde cero. Si algo es "sentido común" es la prueba para las patentes, no los derechos de autor. En otras palabras, Oracle puede hacer un copyright de ese texto, pero no pueden patentar ese algoritmo.
Gort the Robot

Estas 9 líneas son un ejemplo clásico de la doctrina de la fusión. ¿De cuántas otras maneras hay para realizar una verificación de rango en una matriz?
Tony the Pony

1
@TonythePony, lotes, si la función arroja una excepción que contiene un mensaje de texto.
avakar

44
Pocas personas han mencionado que la persona que copió este texto en Google también es la persona que lo escribió en Sun. Los programadores deben darse cuenta de que Stallman, el extremista barbudo loco, tenía razón . El dinero, esa raíz de todo mal, hace que las personas olviden por qué participan en la tecnología en primer lugar. : - /
HostileFork

5

No usaré este código de todos modos, porque el comentario no coincide con lo que hace el código. El comentario habla integer, mientras que el código usa unsigned int. ¿Quién sabe qué errores están enterrados en las profundidades de esta función?

En serio, aquí es donde "No reinventar la rueda" se vuelve ridículo y olvidaste tomarlo con un grano de sal. Simplemente escriba su propia versión desde cero, combínela con la convención de nomenclatura y la guía de estilo de su código (por ejemplo math_min_uint(x, y)), asegúrese de que funcione (prueba de unidad o lo que sea) y continúe con la vida y sin problemas de derechos de autor.

Con una experiencia creciente, estos fragmentos triviales que necesita una y otra vez están en su caja de herramientas y los reescribirá sin pensar demasiado, o simplemente los obtendrá de su propia biblioteca.


2

La gente parece estar olvidando que la ley de derechos de autor, tanto en espíritu como en letra, significa que el acto de copiar está prohibido, no el acto de expresar el mismo pensamiento usted mismo, ni siquiera si el resultado resulta sospechosamente similar.

Si toma el código GPL, lo modifica, lo usa de una manera que va en contra de la licencia bajo la cual lo recibió y afirma que no es un trabajo derivado, entonces está violando la ley. Incluso si usa su segunda versión, ha cambiado los nombres de todas las variables y ha alterado el formato, pero aún así se deriva del original.

Sin embargo, si escribe su propia versión de min, y debido a la trivialidad de la tarea, el hecho de que hay tantas maneras en que puede escribir con sensatez tal cosa, y un poco de coincidencia, su versión termina siendo exactamente idéntica al código GPL, entonces no has copiado nada.

Sin embargo, si alguna de las historias pasaría o no en la corte es un asunto diferente. Si aparece un ejemplo de código más grande o más complejo en otro lugar, completo con comentarios, formato y errores ortográficos, tendrá dificultades para convencer a alguien de que lo escribió de forma independiente, más aún si se puede demostrar que conocía el original fuente (que, dado el hecho de que lo ha publicado aquí, debería ser bastante trivial).


1

Si el código es realmente trivial como el ejemplo "min", entonces hay una probabilidad muy alta de que otra persona ya haya implementado la misma funcionalidad bajo una licencia de código abierto diferente.

Dependiendo de la licencia, es muy posible que se le permita incluir el código en su solicitud de código cerrado.


1

Solo escríbelo tú mismo en 30 segundos. Puedes usar exactamente el mismo algoritmo. Simplemente no copie / pegue.

Los derechos de autor solo protegen la expresión de una idea, no la idea en sí. Puede usar la idea directamente siempre que no la copie.

FWIW, dudo que copiar un código tan trivial te metería en problemas de todos modos. Los daños serían cero, y probablemente caería bajo un uso justo en la mayoría de las jurisdicciones. Pero los casos legales son tan dolorosos que no quisiera arriesgarme.


1

Como su código GPL, la gran pregunta aquí es si planea distribuir su código o vender su software.

Si solo lo está utilizando internamente, la GPL le brinda total libertad para hacer lo que desee.

Si planea distribuir su paquete, lo más fácil es GPL su paquete en los mismos términos que cualquier fuente de GPL que haya utilizado. Hay otras formas, pero se complica.

Si planea vender su software, debe distribuir el código fuente de cualquier código GPL que haya utilizado y / o modificado bajo la misma licencia GPL por la que lo obtuvo.


0

Si está utilizando C ++ y no C, evite este problema utilizando la biblioteca estándar std::mino std::maxen <algorithm>:

http://www.cplusplus.com/reference/algorithm/min/

Eso le compra generalidad, y funcionará para cualquier tipo comparable. Además: cuando cualquier d-bag intente afirmar que lo inventaron y está cubierto por patentes de software, estarán discutiendo con el comité ISO ... no tú.

En el caso general, tome nota de quién publicó el código. ¿Corporación o individuo sano? Si se trata de una persona sensata (como es el caso con mucho código abierto), escríbeles una nota agradable y obtén permiso. Guarde su respuesta diciendo que está bien. Problema resuelto.


-2

Para el caso general: Código más complejo que definitivamente tiene derechos de autor, en oposición a min y max (que pueden o no tener derechos de autor).

Luego, licencia tu código de acuerdo con la biblioteca, es decir, GPL Sin embargo, tenga en cuenta que hay bibliotecas LGPL (y GPL con excepciones) que le permiten usar sus implementaciones mientras le da a su código la licencia que desee.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.