Co muszę zrobić, aby NIE ukraść kodu „Hello World” z licencją GPL?


42

W projekcie znalazłem plik math.cz dużym nagłówkiem GPL i ...

//------------------------------------------------------------------------------
/// 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, spoko, więc muszę uzyskać minimalną wartość i ... ten plik !? Czy muszę z tego powodu otworzyć cały projekt? Czy też muszę odkrywać na nowo matematykę?

Nie sądzę, żeby to było po prostu szalone, więc pytanie brzmi: kiedy możemy po prostu usunąć nagłówek GPL?

Czy muszę być dziwakiem i to robić ?

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

Poważnie, czy chcą, żebym napisał kod jak wyżej?


22
Cóż, w ostatnim przypadku Google vs Oracle the jury did find that one nine-line function that Google acknowledged copying was infringing(z ArsTechnica ).
Zenon

5
Aww daj spokój, na poważnie, min?
Mircea Chirea

33
Powiedziałbym, że samo istnienie tego pytania świadczy o złej rzeczy - praca programisty stała się mniej programistyczna, więcej legalnego bałaganu i biurokracji
K.Steff

4
Skopiuj to . Trywialna funkcja, taka jak, minnie jest objęta prawem autorskim. Zobacz moją odpowiedź, aby poznać szczegóły.
Tony the Pony

6
@Loki, tęsknisz za nią o milę. Algorytmy są objęte patentami, a nie prawem autorskim. Prawa autorskie wygasają 70 lat po śmierci autora, więc dzieła chronione prawem autorskim w latach 60. są wciąż dość świeże. Wreszcie pytanie dotyczy kopiowania TEGO kodu, a nie algorytmu.
Alexis

Odpowiedzi:


53

W przeciwieństwie do wielu użytkowników tutaj, po prostu sugeruję: skopiuj go!

Upewnij się, że formatowanie kodu odpowiada standardowi kodowania, a także prawdopodobnie powinieneś usunąć lub przepisać komentarz. Nikt nigdy nie będzie wiedział, że go skopiowałeś - gdy fragment kodu jest tak prosty, równie dobrze możesz napisać go od zera. Jeśli twój standard kodowania w jakiś sposób wymaga, aby funkcja wyglądała dokładnie tak samo jak we fragmencie kodu, niech tak będzie - o ile wygląda tak, jak by wyglądał, gdybyś napisał go od zera.

Pomyśl o tym, nie jest to wcale (!) Pierwszy raz, gdy napisano dokładnie ten utwór - gdy coś jest tak trywialne, nie ma powodu, aby go nie kopiować, jeśli nie masz ochoty pisać go sam.

Nawet prowadzenie tej dyskusji wydaje mi się trochę zbyteczne - musimy być pragmatyczni, jeśli chcemy wykonać jakąkolwiek prawdziwą pracę!


5
prawdziwe pytanie brzmi, gdzie jest bariera między trywialnymi a nietrywialnymi i czy istnieje sposób, aby być absolutnie pewnym, że ludzie nie będą wskazywać mojego kodu czymś podobnym „SPOJRZENIE NA MOJĄ REALIZACJĘ GPL MIN!” ... Naprawdę obawiam się, że ci ludzie> _ <
cnd

20
Cóż, istnieje pojęcie progu oryginalności w prawie autorskim. I tak prosta metoda nie powinna być objęta prawem autorskim. IANAL i jurysdykcje są różne. Mimo to coś, co każdy student CS napisał co najmniej pięć razy w dokładnie taki sam sposób, może równie dobrze znaleźć się w tym zakresie.
Joey,

4
@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?Tak, gdyby to był wypadek. „Jaką miałoby to różnicę, gdyby właśnie go skopiował?” Bity mają kolor . ansuz.sooke.bc.ca/entry/23 To nie jest coś, co większość informatyków może zrozumieć - to rzeczywiście skomplikowany temat, ale jest to coś, co jest uznawane przez prawo. W razie wątpliwości, czy coś jest legalne, najlepiej porozmawiać z prawnikiem .
Mark Byers

4
@alexis: Rozumiem twój punkt widzenia, ale tak naprawdę się nie zgadzam - jeśli wynikowy kod jest identyczny, nikt poza programistą nie będzie wiedział, czy został skopiowany lub napisany od podstaw. Oczywiście, nie powinno być problemów z implementacją min i prawdopodobnie zajęłoby to mniej czasu niż znalezienie innej implementacji. Jeśli jednak programista rzeczywiście go skopiuje i nikt inny nie wie, że nie napisał funkcji samodzielnie, jakie szkody zostały wówczas wyrządzone? O ile programista nie poczuje się „winny”, odpowiedź jest przecząca. Reszta to po prostu semantyka.
nilu

5
@ MarkByers: Kiedy mówię „nie można udowodnić”, mam na myśli, że nie ma fizycznych dowodów na to, że przestępstwo zostało nawet popełnione - przestępstwo, które zostało popełnione, jest całkowicie ograniczone do umysłu programisty. Oczywiście nie może tak być w przypadku kradzieży niektórych słodyczy - ma to fizyczny wpływ na świat (Lollipop - = 1). Jeśli „zbrodnia” ogranicza się do twojego umysłu, któż osądzi, czy jest moralny czy niemoralny?
nilu

18

Nie odpowiada bezpośrednio na twoje pytanie, ale spróbuj tego:

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

Niniejszym udostępniam to wspaniałe, złożone makro do domeny publicznej. Chociaż być może będę musiał opublikować artykuł na temat tej techniki.

Jeśli jesteś makrofobiczny, wypróbuj tę wersję wbudowaną (tak naprawdę, chyba że kodujesz na SPARC, zaoszczędzisz wiele cykli procesora, nie zawijając funkcji tak wszechobecnej jak minkod wejścia / wyjścia):

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

Kwestia licencjonowania kodu dla trywialnych fragmentów jest naprawdę trochę uciążliwa. Skontaktuj się z prawnikiem, ale kusi mnie założenie, że tak naprawdę nie można uzyskać licencji i / lub licencji nie można egzekwować w praktyce. Tak jak nie możesz chronić praw autorskich ani znaku towarowego słowa „słowo”, oprzyj się na ludziach, którzy go używają. (ups)


1
Och, z pewnością mogą chronić ten kod prawem autorskim, ale biorąc pod uwagę prostotę algorytmu, trudno byłoby udowodnić w sądzie, że go skopiowałeś, chyba że zrobiłeś coś głupiego, jak pozostawienie nienaruszonych komentarzy itp. Zasadą jest, że nie możesz nie używaj tego samego kodu, reguła jest taka, że ​​możesz to zrobić tylko wtedy, gdy napisałeś go własnym mózgiem i nie skopiowałeś oryginału w żaden sposób.
Gort the Robot

2
@StevenBurnap Oczywiście oryginalny kod miałby te same problemy: czy mogą udowodnić, że posiadają prawa autorskie (tj. Że nie skopiowali go z wcześniejszej implementacji)?
Richard

19
Problem z makrową wersją min pojawia się, gdy próbujesz to zrobić min(a++,b++).

4
„uwolnij to ... do domeny publicznej” jest bardzo zorientowane na USA. W wielu krajach nie oznacza to tego samego, aw niektórych krajach nie jest to prawnie możliwe.

9
Dzięki, ale w kompilatorze z 2000 roku kompilator może wstawiać takie trywialności jak min.
DeadMG,

18

Oświadczenie : Nie jestem adwokatem. Skorzystaj z moich rad na własne ryzyko.

Ta implementacja niemin jest objęta prawem autorskim , ponieważ istnieje tylko kilka rozsądnych sposobów jej napisania.

W świecie prawnym jest to znane jako doktryna fuzji (znana również jako podział ide-wyrażenie). Mówi się, że pomysł funkcji (nieobjęty prawem autorskim) „połączył się” z wyrażeniem (potencjalnie chronionym prawem autorskim) . Dlatego kod nie podlega prawom autorskim - możesz z niego korzystać.

Aby być bezpiecznym, nie kopiuj go dosłownie . Używaj różnych nazw zmiennych, stosuj własne formatowanie, nie kopiuj komentarzy słowo po słowie. Dokładna dosłowna reprezentacja tego kodu może być objęta prawem autorskim.

Pamiętaj, że nie gwarantuje to, że ktoś cię nie pozwie, ale przynajmniej będziesz miał silną obronę.

Pamiętaj też, że nawet jeśli fragment kodu nie jest chroniony prawem autorskim, może nadal być objęty patentem na oprogramowanie (nie dotyczy to twojej minfunkcji).


2
Próbujesz to powiedzieć Oracle!
GordonM,

1
Może ta 9-liniowa funkcja nie była trywialna ... Chciałbym zobaczyć kod.
Tony the Pony

1
programmers.stackexchange.com/a/148362/28718 wydaje mi się dość trywialny, zakładając, że jest to poprawny kod.
GordonM,

12

Wypuszczam następujący kod na licencji BSD . Ponieważ ta licencja jest znacznie bardziej liberalna, nie powinieneś mieć problemów z prawami autorskimi, jeśli korzystasz z mojej implementacji.

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

Jak mogę się upewnić, że nie zapieczętowałeś tego kodu GPL i nie przepisałeś go? : P (tylko żartuję)
CND

1
Ty nie jesteś. Ale jeśli użyłeś mojego kodu, możesz twierdzić, że użyłeś go w dobrej wierze.
GordonM,

3
Radujcie się, bracia, gdy nastała nowa era - możemy teraz znaleźć minw oprogramowaniu zamkniętym. Ponadto, @Sholy, teraz problemem jest GordonM, czy go skopiował, czy nie.
K.Steff

5
Wydajesz go również w obszarze „Creative commons”. Zobacz na dole tej strony informacje o wklejonym kodzie tutaj.
Martin York


11

Zgadzam się, że to absurdalna sytuacja, ale możesz winić tylko siebie. Jeśli piszesz własny kod, nie powinieneś czytać plików źródłowych na licencji GPL, kropka. Usuń plik math.c ze swojego systemu plików, zachowaj dokumentację i możesz ponownie wdrożyć dowolną potrzebną część interfejsu API. Jeśli nie czytasz kodu, nie musisz się martwić, jeśli twój kod okaże się podobny.

Marnotrawstwo, mówisz? GPL celowo zapobiega korzystaniu z darmowego kodu bez zwracania się do ekosystemu. Jeśli nie możesz lub nie chcesz spełnić jego warunków i nie chcesz wdrożyć kolejnej biblioteki matematycznej, zawsze możesz ją kupić lub znaleźć darmową, która zawiera licencję, którą możesz zaakceptować.

Programiści Microsoft nie mogą czytać kodu open source, aby chronić firmę przed problemami prawnymi. Z przyczyn czysto etycznych powinieneś zrobić to samo z każdym programem, którego licencji nie zamierzasz stosować.

Nie masz prawa do korzystania z tego math.c, ale nikt nie próbuje zdobyć rynku na wdrożenia min. Celem GPL jest zwiększenie „wolności” programisty (i wolności użytkownika końcowego), a nie ograniczanie go. Licencja GNU, FSF i Ruch Wolnego Oprogramowania zaczęły się od Richarda Stallmana, a Stallman zaczął od ponownej implementacji od nowa każdej nowej wersji Symbole Lisp. FSF nie poszedłby (i nie mógł) ścigać nikogo za ponowne wdrożenie biblioteki GPL.


Ale to naprawdę dziwny przykład. To przykład, co oznacza, że ​​muszę go przeczytać i postępować zgodnie z nim ... ale o ile rozumiem, nie wolno mi tutaj wybierać licencji GPL. Więc wiem, kto jest Stallman;)
CND

2
Sholy, przepraszam, ale nie mam pojęcia, co mówisz! Jaki przykład (Czy ty też pytasz mnie, kim jest Stallman? Google go. Lub po prostu sprawdź wikipedię.)
Alexis

3
„Programiści Microsoftu nie mogą czytać kodu open source” och, to okropne - czy jest gdzieś o tym czytać? Google nie pomaga.
amara

Dobre pytanie. Czytałem o tym na forum rozwoju Iron Python, ale niestety nie mogę go teraz znaleźć. Podsumowanie: Jim Hugunin ( hugunin.net/microsoft_farewell.html ) wspomniał, że nie wolno im patrzeć na implementację Pythona, a ktoś żartobliwie zapytał, czy wolno im spojrzeć na ich własny kod (Microsoft uczynił Iron Python otwartym źródłem) . Odpowiedź brzmi: zrobili specjalny wyjątek dla Iron Python.
Alexis

Ludzie, których wolność GPL ma zwiększyć, to wszyscy użytkownicy programu, a nie (konkretnie) programiści.
James Youngman

7

Odpowiedź: Tylko za wyraźną zgodą autora.

To kod chroniony prawem autorskim. Nie możesz go skopiować bez zgody autora.

Będziesz musiał napisać własną wersję minlub skopiować jej wariant minwykorzystujący inną licencję.

Pamiętaj, że w przypadku praw autorskich chroniony jest kod, a nie algorytm. Prawo autorskie pochodzi z tekstu. Nawet jeśli „math.c” był jedynie komentarzem i nie miał w ogóle kodu wykonywalnego, nadal byłby chroniony prawem autorskim.


1
Co oznacza własna wersja? MOJA WŁASNA wersja MIN, brzmi zabawnie!
CND

2
Pamiętaj, że nie posiadasz min, posiadasz określoną sekwencję znaków, która przypadkowo się implementuje min.
Gort the Robot

2
Nie można go w ogóle zmienić bez zgody autora, z wyjątkiem użytku osobistego. Musisz przepisać go od zera. To o to chodzi. Zauważ, że gdybyś usiadł przy pustym edytorze i napisał coś prawie identycznego z tym, byłoby dobrze, ponieważ go nie skopiowałeś. (Zakładając, że nie piszesz z pamięci.)
Gort the Robot

2
Nie żartuję. I tak, prawdopodobnie możesz uciec od tego w takich przypadkach. Od właściciela praw autorskich zależeć będzie, czy to zrobiłeś. Zauważ, że mówię ci tylko, jakie jest prawo, a nie bronię go.
Gort the Robot

3
Ponieważ jeśli nie przekodujesz tych trywialnych rzeczy, używasz czyjejś pracy w sposób, który nie dał ci na to pozwolenia. Jeśli jest to tak trywialne, że go nie potrzebujesz, nie używaj go.
Alexis

6

Właśnie to Google podobno został oszukany. To wydaje się być zdrowym rozsądkiem dla tablicy.

 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     }

Jeśli to wszystko, wyrok zostanie wydany w apelacji. Ale według Wireda sędzia stwierdził również, że Google skopiowało 8 innych plików. Zobacz wired.com/wiredenterprise/2012/05/google-oracle-decompile
Tony the Pony

5
Tak, ale „zdrowy rozsądek” nie jest granicą praw autorskich. Chodzi o to, czy skopiowali i zredagowali, czy napisali od zera. To, czy coś jest „zdrowym rozsądkiem”, jest testem na patenty, a nie na prawa autorskie. Innymi słowy, Oracle może opatentować ten tekst prawem autorskim, ale nie może opatentować tego algorytmu.
Gort the Robot

Te 9 wierszy jest klasycznym przykładem doktryny łączenia. Ile jeszcze jest sposobów na sprawdzenie zasięgu tablicy?
Tony the Pony

1
@TonythePony, wiele, jeśli funkcja zgłasza wyjątek zawierający komunikat tekstowy.
avakar

4
Niewiele osób wspomniało, że osoba, która skopiowała ten tekst w Google, jest również osobą, która napisała go w Sun. Programiści muszą zdać sobie sprawę, że Stallman - szalony brodaty ekstremista - miał rację . Pieniądze, które są źródłem wszelkiego zła, sprawiają, że ludzie zapominają, dlaczego w ogóle uczestniczą w technologii. : - /
HostileFork

5

I tak nie użyję tego kodu, ponieważ komentarz nie pasuje do tego, co robi kod. Komentarz mówi integer, podczas gdy kod używa unsigned int. Kto wie, jakie błędy kryją się w głębinach tej funkcji?

Poważnie, w tym miejscu „Nie wymyślaj koła ponownie” staje się śmieszne i zapomniałeś wziąć go z odrobiną soli. Po prostu napisz własną wersję od zera, dopasuj ją do konwencji nazewnictwa i przewodnika po stylu w swoim kodzie (np. math_min_uint(x, y)), Upewnij się, że działa (test jednostkowy lub cokolwiek innego) i kontynuuj życie bez problemów z prawami autorskimi.

Z rosnącym doświadczeniem, te trywialne fragmenty, których potrzebujesz raz po raz, są po prostu w twoim zestawie narzędzi i przepiszesz je bez zastanowienia lub po prostu zdobędziesz je z własnej biblioteki.


2

Wydaje się, że ludzie zapominają, że prawo autorskie, zarówno duchowe, jak i listowe, oznacza, że ​​czynność faktycznego kopiowania jest zabroniona - nie akt wyrażania tej samej myśli samemu, nawet jeśli wynik okazuje się podejrzanie podobny.

Jeśli weźmiesz kod GPL, zmodyfikujesz go, użyjesz go w sposób niezgodny z licencją, na podstawie której go otrzymałeś, i twierdzisz, że nie jest to dzieło pochodne, wówczas łamiesz prawo. Nawet jeśli używasz drugiej wersji - zmieniłeś nazwy wszystkich zmiennych i zmieniłeś formatowanie, ale nadal pochodzi ono z oryginału.

Jeśli jednak piszesz własną wersję min, a ze względu na banalność zadania, fakt, że istnieje tylko tyle sposobów, aby rozsądnie napisać coś takiego, i trochę zbiegów okoliczności, twoja wersja jest dokładnie identyczna do kodu GPL, to nic nie skopiowałeś.

Jednak to, czy któraś z opowieści przejdzie w sądzie, to inna sprawa. Jeśli większy lub bardziej złożony przykładowy kod pojawi się gdzieś indziej, wraz z komentarzami, formatowaniem i błędami ortograficznymi, trudno ci będzie przekonać każdego, że napisałeś go niezależnie, tym bardziej, jeśli można wykazać, że znasz oryginał źródło (które, biorąc pod uwagę fakt, że opublikowałeś go tutaj, powinno być dość trywialne).


1

Jeśli kod jest naprawdę trywialny, jak w przykładzie „min”, istnieje bardzo duże prawdopodobieństwo, że ktoś już zaimplementował tę samą funkcjonalność na innej licencji typu open source.

W zależności od licencji może być dozwolone umieszczenie kodu w zamkniętej aplikacji źródłowej.


1

Po prostu napisz to sam w 30 sekund. Możesz użyć dokładnie tego samego algorytmu. Po prostu nie kopiuj / wklej.

Prawo autorskie chroni tylko wyrażenie pomysłu, a nie sam pomysł. Możesz skorzystać z pomysłu bezpośrednio, pod warunkiem, że go nie kopiujesz.

FWIW, wątpię, aby skopiowanie tak trywialnego fragmentu kodu i tak sprawiłoby ci kłopoty. Uszkodzenia byłyby równe zeru i prawdopodobnie podlegałyby dozwolonemu użytkowaniu w większości jurysdykcji. Ale sprawy prawne są takim bólem, że nie chciałbym ryzykować.


1

W związku z tym, że jest to kod GPL, głównym pytaniem jest to, czy planujesz nie rozpowszechniać kodu lub sprzedawać oprogramowanie.

Jeśli używasz go tylko wewnętrznie, GPL daje Ci pełną swobodę robienia tego, co chcesz.

Jeśli planujesz dystrybuować pakiet - najłatwiej jest GPL pakiet na takich samych warunkach, jak każde źródło GPL, którego użyłeś. Istnieją inne sposoby, ale komplikuje się.

Jeśli planujesz sprzedawać swoje oprogramowanie, musisz rozpowszechniać kod źródłowy dla każdego kodu GPL, którego używałeś i / lub zmieniałeś na tej samej licencji GPL, na podstawie której go nabyłeś.


0

Jeśli używasz C ++, a nie C, pomiń ten problem, używając standardowej biblioteki std::minlub std::maxw <algorithm>:

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

To kupuje ogólność i będzie działać dla każdego porównywalnego typu. Ponadto: gdy cokolwiek d-bag spróbuje twierdzić, że go wynalazł i jest objęty patentami na oprogramowanie, będzie dudnić z komitetem ISO ... nie z tobą.

W ogólnym przypadku zwróć uwagę, kto opublikował kod. Korporacja czy zdrowa osoba? Jeśli jest to rozsądna osoba (jak w przypadku wielu otwartych źródeł), napisz do nich fajną notatkę i uzyskaj pozwolenie. Zapisz ich odpowiedź, mówiąc, że jest w porządku. Problem rozwiązany.


-2

W ogólnym przypadku: bardziej złożony kod, który zdecydowanie może być chroniony prawem autorskim, w przeciwieństwie do min i max (który może, ale nie musi, mieć prawa autorskie).

Następnie Licencjonuj swój kod zgodnie z biblioteką, tj. GPL! Należy jednak pamiętać, że istnieją biblioteki LGPL (i GPL z wyjątkami), które pozwalają korzystać z ich implementacji, jednocześnie dając kodowi dowolną licencję.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.