Zagadnienia związane z wykorzystaniem komponentów na licencji GNU GPL w rozwiązaniach o zamkniętych źródłach

Adrian Olszewski

Cztery wolności pozytywne wg FSF
Wolność do: I. uruchamiania programu w dowolnym celu II.analizowania działania programu i dostosowywania go do swoich potrzeb III. rozpowszechniania niezmodyfikowanej kopii programu IV. udoskonalania programu i publikacji ulepszeń

Wnioski z „czterech wolności”

Użytkownik programu GPL ma do niego pełne prawa

Użytkownik ma prawo żądać źródeł (bez opłat*) Użytkownik może sobie dostosować program Użytkownik może odsprzedać/rozdać nasz program, także ze swoimi poprawkami

Nie można mu żadnego z tych praw odebrać

Nie można zażądać, by nie dystrybuował programu Nie można zażądać, by nie przekazywał źródeł

Licencja GPL nie powstała po to, by chronić wasze INTERESY, lecz by chronić PRAWA użytkownika waszego oprogramowania.

GPL 2 + oficjalne FAQ
Aplikacja korzystająca z kodu GPL staje się GPL gdy:

Linkuje (statycznie/dynamicznie) do kodu GPL Wymienia z nim „complex data*” „bazuje na” kodzie GPL (derivative, combination) jest „współdystrybuowana”* z kodem GPL zależy od kodu GPL (nie uruchomi się bez niego)

Wnioski z GPL + of. FAQ
Aplikacja nie staje się GPL, gdy jej relacje z kodem GPL są następujące

uruchamia kod GPL jako proces (exec) komunikuje się z nim „at arm's length” wykorzystuje kod GPL jako „wartość dodaną” nie jest zależna od kodu GPL („uses” zamiast „derivative”, „combination”) nie jest współdystrybuowana* z kodem GPL

Wnioski z GPL + of. FAQ

„It's never been clear why shell'ing out commands is any different than linking to a shared library when you consider the general activities, but they are viewed differently from the GPL perspective, as far as I'm aware of the relevant sections”

Dalsze wnioski

Licencja GPL2 nie dotyczy kodu, który nie jest dystrybuowany (to convey) Nie zabrania się sprzedawania aplikacji GPL

Trzeba tylko zapewnić darmowy* dostęp do kodu

Nie zabrania się oferowania płatnych usług wdrożeniowych i serwisowych Twórca aplikacji GPL może zezwolić na zamknięcie kodu w pewnych przypadkach lub dodać inne licencje

GPL linking exception

GCC GNU Classpath GNU Guile (interpreter j. Scheme), GNAT (interpreter j. Ada)

When you use GCC to compile a program, GCC may combine portions of certain GCC header files and runtime libraries with the compiled program. The purpose of this Exception is to allow compilation of non-GPL (including proprietary) programs to use, in this way, the header files and runtime libraries covered by this Exception As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice [...]

Dalsze wnioski

Produkt aplikacji GPL nie jest GPL

Jedna z „furtek” dla GPL2 - Software As A Service

Skrypty interpretera na licencji GPL nie są GPL Skrypty jw. mogą stać się GPL, jeśli spowodują załadowanie do przestrzeni adresowej interpretera kodu na licencji GPL (biblioteki)

Dalsze wnioski
The interpreted program, to the interpreter, is just data; a free software license like the GPL, based on copyright law, cannot limit what data you use the interpreter on. You can run it on any data (interpreted program), any way you like, and there are no requirements about licensing that data to anyone.

However, when the interpreter is extended to provide “bindings” to other facilities (often, but not necessarily, libraries), the interpreted program is effectively linked to the facilities it uses through these bindings. So if these facilities are released under the GPL, the interpreted program that uses them must be released in a GPL-compatible way.

Dalsze wnioski
By contrast, pipes, sockets and command-line arguments are communication mechanisms normally used between two separate programs. So when they are used for communication, the modules normally are separate programs. But if the semantics of the communication are intimate enough, exchanging complex internal data structures, that too could be a basis to consider the two parts as combined into a larger program.

Poskładajmy to razem
Jeśli chcemy zamknąć źródła aplikacji, musimy:

Zapewnić komunikację „at arm's length” Uprościć strukturę wymienianych danych Uniezależnić aplikację od kodu GPL
co pociąga za sobą „wartość dodaną”

Unikać dystrybucji kodu GPL

Jeszcze a' propos źródeł
1. Nie dystrybuujemy aplikacji wszystkim, a tylko klientowi. Stanowi on jedynego odbiorcę źródeł. 2.Jeśli klient zapłacił nam grube pieniądze za napisanie aplikacji zawierającej know-how firmy, to raczej nie będzie zainteresowany przekazywaniem swych tajemnic całemu światu (w tym - konkurencji), w dodatku za darmo. „Tajemnica handlowa” to całkiem skuteczna NDA :-)

Poskładajmy to razem
Jeśli chcemy zamknąć źródła aplikacji, musimy:

Zapewnić komunikację „at arm's length” Uprościć strukturę wymienianych danych Uniezależnić aplikację od kodu GPL Sprawić, by aplikacja nie stała się derivative Unikać dystrybucji kodu GPL

Komunikacja „at arm's length”
1. W przypadku binariów: exec  komunikator (sockety, DDE, WS (WCF), DCOM, DB, FS)

Long live the web services loophole

2. W przypadku bibliotek: wrapper + komunikator
(wrapper + jego „strona” komunikatora → GPL)

Komunikacja „at arm's length” (exe)
Możemy zmodyfikować aplikację GPL by korzystała z naszej DLLki

Komunikator execuje aplikację GPL

Poskładajmy to razem
Jeśli chcemy zamknąć źródła aplikacji, musimy:

Zapewnić komunikację „at arm's length” Uprościć strukturę wymienianych danych Uniezależnić aplikację od kodu GPL Sprawić, by aplikacja nie stała się derivative Unikać dystrybucji kodu GPL

Uproszczenie struktur danych
1. Brak definicji „complex data”.
C:\skrypty\skrypt1.r
CONNECT a=local s=srv d=db1 u=ala p=ZAQ!2wsx FETCH TrialData { y, x1, x2, x3} LOGIT MULT y~x1+x2+x3 PLOT DIAG STORE result_[date]_[time].csv

<analysis> <datasource> <host>local</host> <server>srv</server> …........................................... </datasource> <analysis> <type family=”multinomial”>GLZ</type> <variables> <var type=”dep”>y</var> <var type=”indep” o=”1”>x1</v </analysis>

Class UnitOfAnalysis{ DataDescr { Double[ ][ ] data … AnalysisDescr { String name … ResultDescr {… 110111011010101010110101 01000100101010101010101 010100010100 100100

ID 1 2 3 4 5 6 7

Y A A C C B C B

X1 3.2 2.5 6.5 4.5 5.3 8.5 3.9

X2 2.1 1.1 4.3 3.1 7.6 5.2 8.2

X3 44.2 32.1 23.4 23.9 65.3 22.5 39.4

Uproszczenie struktur danych
Niech aplikacja sama pobiera dane z „repozytorium” i tam też oddaje wyniki. Jest to kolejny element separacji.

Poskładajmy to razem
Jeśli chcemy zamknąć źródła aplikacji, musimy:

Zapewnić komunikację „at arm's length” Uprościć strukturę wymienianych danych Uniezależnić aplikację od kodu GPL Sprawić, by aplikacja nie stała się derivative Unikać dystrybucji kodu GPL

Uniezależnienie aplikacji od GPL
ZUPA, czyli aplikacja musi się: 1. zbudować 2. uruchomić 3. poprawnie działać bez obecności kodu GPL. 4. umożliwić użycie alternatywnych komponentów

Rozwiązanie: interfejsy + adaptery

Uniezależnienie aplikacji od GPL
Interfejsy pozwalają: 1. Odseparować aplikację GPL od aplikacji o zamkniętych źródłach 2. Użyć alternatywnej aplikacji, np. komercyjnej – pod warunkiem zgodności interfejsów. W przeciwnym razie konieczny jest adapter – dedykowany, bądź oparty o mechanizm wczytywania konfiguracji

Uniezależnienie aplikacji od GPL
Dzięki interfejsowi można zastosować „zaślepki”

(„mockowanie”). Zaślepka stanowi komponent, który oferuje bardzo ograniczoną namiastkę funkcjonalności potrzebnego komponentu GPL.

Aplikacja będzie z nim działać, ale gdy system wykryje zainstalowany komponent GPL (lub inny właściwy, np. komercyjny), „bezboleśnie się na niego przełączy”.

Poskładajmy to razem
Jeśli chcemy zamknąć źródła aplikacji, musimy:

Zapewnić komunikację „at arm's length” Uprościć strukturę wymienianych danych Uniezależnić aplikację od kodu GPL Sprawić, by aplikacja nie stała się „derivative” Unikać dystrybucji kodu GPL

Zapewnić wartość dodaną
Aplikacja może łatwo stać się „pochodną” kodu GPL nawet wówczas, gdy jawnie do niego nie „linkuje”, gdy uruchamia się niezależnie od niego i nie jest z nim dystrybuowana. Kluczem jest brak wartości dodanej

Uniezależnienie aplikacji od GPL
Przykład pozytywny: Program pocztowy umożliwiający filtrowanie spamu. Do obliczenia klasyfikatora (bayesowski, SVM, NN) wykorzystywany jest pakiet statystyczny GNU R. Przykład negatywny: GNU R + GUI = „graficzny program statystyczny Adriana O.” Przykład „trudny”: Revolution – środowisko obliczeniowe oparte o GNU R, lecz zawarta w nim jest znaczna wartość dodana.

Poskładajmy to razem
Jeśli chcemy zamknąć źródła aplikacji, musimy:

Zapewnić komunikację „at arm's length” Uprościć strukturę wymienianych danych Uniezależnić aplikację od kodu GPL Sprawić, by aplikacja nie stała się „derivative” Unikać dystrybucji kodu GPL

Unikać dystrybucji kodu GPL
Licencja GPL2 stosuje się jedynie do aplikacji przekazywanych (to convey) do odbiorców

Nie stosuje się do aplikacji: 1. W modelu SAAS 2. Nie dystrybuowanych

Unikać dystrybucji kodu GPL
Jak pozbyć się problemu dystrybucji kodu GPL? 1. Przerzucić instalację na użytkownika

Zaoferować mu usługę wdrożeniową Przygotować automatyczny web-instalator

2. Dostarczać alternatywną bibliotekę albo mock 3. Pozwalać na pracę z alternatywnymi komponentami 4. Oferować usługę serwerową SAAS

Unikać dystrybucji kodu GPL

I agree completely. You simply cannot redistribute MySQL yourself. Many companies solve this by doing the install for their clients, so they charge for the service (act) of downloading and installing MySQL instead of the mysql itself.

Przykłady
1. Statistica, SPSS, RapidMiner oferują connector do GNU R. Pakiety te, jak również GNU R, mogą pracować samodzielnie. Razem świetnie się uzupełniają. GNU R jest darmowy, Statistica i SPSS mogą kosztować nawet > 80kpln/stanowisko 2. Pipeline Pilot R Collection – 3.5k$/rok za „nadbudówkę” R 3. REVOlution - $1000 / rok

It shouldn't suprise you. There are plenty of similar examples, such as CSIRO's gene expression image analysis viewer, Spotfire allows for a similar interaction, and BioConductor is "repackaged" for S-PLUS without much returned to the developers (by license design). [...] Think, "Red Hat Enterprise Edition" vs. Fedora. The latter has been usefully helped by people who have bought the former. someone's money to do these things. It takes

Tiwoizacja
Wykorzystywanie kodu copyleft w urządzeniach, które nie umożliwiają uruchomienia zmodyfikowanej wersji tego codu. Firma TiVo w produkowanych DVRach wykorzystywała kod GPL, który podpisywała cyfrowo. Przed takimi praktykami chroni licencja GPL 3.

Affero GPL

Wymusza udostępnienie źródeł także wówczas, gdy nie dochodzi do dystrybucji aplikacji, np. gdy działa na serwerze (SAAS, webserwis) FSF zaleca stosowanie tej właśnie licencji zamiast GPL.

Inne licencje

LGPL X11 (MIT) (Massachusetts Institute of Technology License) Microsoft® Public Licence MPL- Mozilla Public Licence BSD- Berkeley Software Distribution License Apache Licence Public domain freeware z adnotacją "for commercial use" lub bez adnotacji "for noncommercial use"

Inne licencje

LGPL X11 (MIT) (Massachusetts Institute of Technology License) Microsoft® Public Licence MPL- Mozilla Public Licence BSD- Berkeley Software Distribution License Apache Licence Public domain freeware z adnotacją "for commercial use" lub bez adnotacji "for noncommercial use"

Sign up to vote on this title
UsefulNot useful