Що мені потрібно зробити, щоб НЕ вкрасти код "Hello World" з ліцензією GPL?


42

У проекті я знайшов файл math.cіз великим заголовком GPL та ...

//------------------------------------------------------------------------------
/// 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;
    }
}

Гаразд, круто, тому мені потрібно отримати мінімальне значення і ... цей файл !? Тож мені через це потрібно відкрити весь проект? Або мені потрібно винаходити математику?

Я не вірю, що це просто божевільно, тому питання: коли ми можемо просто видалити заголовок GPL?

Повинен я бути диваком і робити це ?

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

Серйозно, вони хочуть, щоб я писав код, як описано вище?


22
Що ж, у недавньому випадку Google проти Oracle the jury did find that one nine-line function that Google acknowledged copying was infringing(від ArsTechnica ).
Зенон

5
Давай, серйозно, хв?
Мірча Кірея

33
Я б сказав, що саме існування цього питання доводить погану справу - робота програміста стала менше програмування, більше юридичної безладу та бюрократії
K.Steff

4
Скопіюйте . Тривіальна функція на зразок minне охоплюється авторським правом. Детальну інформацію див. У моїй відповіді.
Тоні Поні

6
@Loki, ти не вистачаєш її милі. Алгоритми охоплюються патентами, а не авторськими правами. Авторські права закінчуються через 70 років після смерті автора, тому твори, захищені авторським правом у 60-х роках, ще досить свіжі. Нарешті, питання полягає в копіюванні цього коду, а не в алгоритмі.
alexis

Відповіді:


53

На відміну від багатьох користувачів тут, я б просто запропонував: Скопіюйте!

Переконайтесь, що форматування коду відповідає вашому стандарту кодування, а також, ймовірно, вам слід видалити або переписати коментар. Ніхто ніколи не дізнається, що ви його скопіювали - коли фрагмент коду такий простий, ви також можете написати його з нуля. Якщо ваш стандарт кодування якимось чином вимагає, щоб функція виглядала так само, як у фрагменті, так і буде - до тих пір, поки це виглядатиме так, як виглядатиме, якби ви написали це з нуля.

Подумайте, це навряд чи (!) Перший раз, коли написано саме цей твір - коли щось таке тривіальне, є мало причин не копіювати його, якщо ви не відчуваєте, як пишете його самостійно.

Навіть ця дискусія здається мені трохи зайвою - ми повинні бути прагматичними, якщо хочемо виконати якусь реальну роботу!


5
справжні запитання - де є бар'єр між тривіальним та нетривіальним і чи можна бути абсолютно впевненим, що люди не будуть вказувати мій код на щось подібне "ГОЛОСУЙТЕ МОЮ GPL MIN REALIZATION!" ... Я дуже боюся цих людей> _ <
CND

20
Що ж, існує авторське поняття поріг оригінальності . І такий простий метод навряд чи може бути захищеним авторським правом. Однак IANAL та юрисдикція відрізняються. Тим не менш, щось, про що кожен недооцінений у програмі CS написав щонайменше п’ять разів абсолютно точно однаково, може цілком підпадати під це.
Джої

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?Так, якщо це була випадковість. "Яка різниця була б тоді, якщо він щойно скопіював це?" Шматочки мають колір . ansuz.sooke.bc.ca/entry/23 Більшість комп'ютерних вчених це не може зрозуміти - це дійсно складна тема, але це те, що визнається законом. Якщо ви сумніваєтесь у тому, чи є щось законним чи ні, вам краще було поговорити з юристом .
Марк Байєрс

4
@alexis: Я розумію вашу думку, але я не дуже згоден - якщо отриманий код ідентичний, ніхто, крім програміста, не може знати, чи був він скопійований чи записаний з нуля. Очевидно, що у впровадження min не повинно виникнути проблем, і це, ймовірно, займе менше часу, ніж пошук іншої реалізації. Однак якщо програміст дійсно копіює його, і ніхто більше не знає, що він сам не записав цю функцію, то яка шкода тоді була зроблена? Якщо програміст не відчуває якусь «провину», відповідь - жодна. Решта - це просто семантика.
nilu

5
@MarkByers: Коли я кажу "не можу довести", я маю на увазі, що немає фізичних доказів, які б свідчили про те, що злочин був навіть скоєний - злочин, який було вчинено, повністю обмежений розумом програміста. Очевидно, це не може бути, якщо вкрасти деякі солодощі - це має фізичний вплив на світ (льодяник - = 1). Якщо "злочин" обмежується вашим власним розумом, хто судитиме, моральний він чи аморальний?
nilu

18

Це не відповідає безпосередньо на ваше запитання, але спробуйте:

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

Цим я випускаю цей славний, складний макрос для загального користування. Хоча мені, можливо, доведеться опублікувати статтю з цієї методики.

Якщо ви макрофобічні, спробуйте цю вбудовану версію (дійсно, якщо ви не кодуєте SPARC, ви збережете безліч циклів процесора, не загортаючи функцію настільки всюди, як minкод введення / виходу):

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

Питання ліцензування коду для тривіальних фрагментів насправді неприємно. Зверніться до юриста, але я спокушаюся припустити, що вони дійсно не можуть бути ліцензовані та / або ліцензування не можуть бути застосовані на практиці. Так само, як ви не можете захистити авторські права або торговельну марку слова "слово", а потім спирайтеся на людей, які його використовують. (ой)


1
О, вони, безумовно, можуть захистити авторські права на цей код, але, враховуючи простоту алгоритму, їм буде важко довести в суді, що ви його скопіювали, якщо ви не зробили чогось дурного, як залишили незайманими коментарі тощо. Правило не в тому, що ви можете не використовуйте той самий код, правило полягає в тому, що ви можете це робити, лише якщо ви написали його власним мозком і не копіювали оригінал жодним чином.
Gort the Robot

2
@StevenBurnap Звичайно, оригінальний код також матиме ті ж проблеми: чи можуть вони довести, що вони мають авторські права (тобто, що вони не скопіювали його з попередньої реалізації)?
Річард

19
Проблема з версією макросу min виникає при спробі зробити min(a++,b++).

4
"випустити це ... у загальнодоступне надбання" дуже орієнтоване на США. Це не означає те саме, що в багатьох країнах, і в деяких випадках це неможливо на законних підставах.

9
Дякую, але на компіляторі 2000-х років компілятор може вбудовувати дрібниці, як min.
DeadMG

18

Відмова : Я не адвокат. Використовуйте мою пораду на свій страх і ризик.

Ця реалізація неmin може бути захищена авторським правом , оскільки існує лише дуже мало розумних способів її написання.

У правовому світі це відоме як доктрина злиття (також відома як розділення ідея-вираз). (Не охраноспособностью) ідея функції , як каже, «злився» з (потенційно охороноздатним) виразом . Тому код не підпадає під авторське право - ви можете ним користуватися.

Щоб бути в безпеці, не копіюйте це дослівно . Використовуйте різні назви змінних, застосовуйте власне форматування, не копіюйте коментарі слово за словом. Точне буквальне представлення цього коду може охоплюватися авторським правом.

Майте на увазі, що це не гарантує, що хтось не буде пред'являти вам позов, але принаймні у вас буде сильна захист.

Також майте на увазі, що навіть якщо фрагмент коду не захищений авторським правом, він все ще може бути охоплений патентом на програмне забезпечення (це не стосується вашої minфункції).


2
Ви намагаєтесь сказати це Oracle!
GordonM

1
Можливо, ця 9-рядова функція не була тривіальною ... Я хотів би побачити код.
Тоні Поні

1
programmers.stackexchange.com/a/148362/28718 мені здається досить тривіальним, припускаючи, що це правильний код.
GordonM

12

Я випускаю наступний код під ліцензією BSD . Оскільки ця ліцензія є набагато дозвольнішою, вам не слід стикатися з проблемами авторського права, якщо ви використовуєте мою реалізацію.

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

Як я можу бути впевнений, що ви не запечатали цей GPL-код і переписали його? : P (жартую)
CND

1
Ти не. Але якщо ви використовували мій код, ви можете стверджувати, що використовували його сумлінно.
GordonM

3
Радуйтеся, брати, як настала нова ера - тепер ми можемо знайти її minв програмному забезпеченні із закритим кодом. Крім того, @Sholy, зараз проблема GordonM, скопіював він це чи ні.
К.Стефф

5
Ви також випускаєте його в розділі "Creative commons". Дивіться внизу цієї сторінки про вставлений тут код.
Мартін Йорк


11

Я погоджуюсь, що це абсурдна ситуація, але винуваті ви самі. Якщо ви пишете власний код, ви не повинні читати вихідні файли, що мають ліцензію GPL, протягом періоду. Видаліть math.c зі своєї файлової системи, зберігайте документацію та не соромтесь знову реалізувати будь-яку частину API, який вам потрібен. Якщо ви не читаєте код, вам не потрібно буде хвилюватися, чи виявиться ваш власний код подібним.

Марно, кажете? GPL навмисно не дозволяє вам скористатися безкоштовним кодом, не віддаючи екосистемі. Якщо ви не можете або не виконаєте його умови, і ви не хочете реалізувати ще одну математичну бібліотеку, ви завжди можете придбати її або знайти безкоштовну, яка має ліцензію, яку ви можете прийняти.

Програмістам Microsoft заборонено читати відкритий код, щоб захистити компанію від юридичних проблем. З чисто етичних причин ви повинні робити те ж саме з будь-якою програмою, ліцензії якої ви не збираєтесь дотримуватися.

Ви не маєте права цим користуватися math.c, але ніхто не намагається прикути ринок до впровадження min. Мета GPL - збільшити "свободу" програміста (і свободу кінцевого користувача), а не обмежувати її. Ліцензія GNU, FSF і Рух вільного програмного забезпечення розпочалися з Річарда Сталмана, і Stallman почав із повторної реалізації кожної нової версії Symbolics, коли вона вийшла. FSF не буде (і не міг) піти за кимсь за повторну реалізацію бібліотеки GPL.


Так але, це дійсно дивний приклад. Це, наприклад, означає, що я повинен його читати і слідувати ... але, наскільки я розумію, я вільний не вибирати тут ліцензію GPL. Так що я знаю , хто Столлман;)
CND

2
Шолі, вибач, але я не маю уявлення, що ти говориш! Який приклад? (Ви також запитуєте мене, хто такий Сталлман? Google це. Або просто перевірте вікіпедію.)
alexis

3
"Програмістам Майкрософт заборонено читати код з відкритим вихідним кодом" о мій, це жахливо - чи можна десь про це прочитати? Google не допомагає.
amara

Гарне питання. Я читав про це на якомусь форумі розробки Iron Python, але, на жаль, зараз не можу його знайти. Резюме: Джим Хугунін ( hugunin.net/microsoft_farewell.html ) згадав, що їм заборонено дивитись на реалізацію python, і хтось жартома запитав, чи їм дозволяється дивитися на власний код (Microsoft зробила Iron Python відкритим кодом) . Відповідь: Вони зробили особливий виняток для Iron Python.
alexis

Люди, свободу яких GPL має на меті збільшити - це всі користувачі програми, а не (конкретно) програмісти.
Джеймс Янгмен

7

Відповідь: Тільки з явного дозволу автора.

Це захищений авторським правом код. Ви не можете скопіювати його без дозволу автора.

Вам доведеться написати власну версію minабо скопіювати варіант, minякий використовує іншу ліцензію.

Пам'ятайте, що з авторським правом захищений код, а не алгоритм. Закон про авторські права випливає з тексту. Навіть якщо "math.c" не був лише коментарями і не мав виконуваного коду, він все одно захищений авторським правом.


1
Що означає власна версія? Моя власна версія MIN, звучить весело!
CND

2
Пам'ятайте, ви не володієте min, ви володієте певною послідовністю символів, яка, можливо, реалізується min.
Гурт Робота

2
Ви не можете змінити його взагалі без дозволу автора, за винятком особистого користування. Вам доведеться переписати його з нуля. У цьому вся суть. Зауважте, що якби ви сіли за пустим редактором і написали щось майже ідентичне цьому, було б добре, тому що ви його не копіювали. (Припустимо, що ви не набрали з пам’яті.)
Горт Робота

2
Ні, я не жартую. І так, ви, ймовірно, можете піти з цим у таких випадках. Власник авторських прав повинен довести, що ви це зробили. Зауважте, що я просто кажу вам, що таке закон, не захищаючи його.
Гурт Робота

3
Тому що якщо ви не переконуєте ці дрібниці, ви використовуєте чужу роботу так, щоб вони не дали вам дозволу. Якщо це настільки банально, що вам це не потрібно, не використовуйте його.
alexis

6

Це те, що Google ніби зірвав. Це здається здоровим глуздом для масиву.

 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     }

Якщо це все, вирок буде винесено під час оскарження. Але за даними Wired, суддя також виявив, що Google скопіював ще 8 файлів. Дивіться wired.com/wiredenterprise/2012/05/google-oracle-decompile
Тоні Поні

5
Так, але "здоровий глузд" не є смугою авторських прав. Це вони копіювали та редагували чи писали самі з нуля. Чи є щось "здоровий глузд" - це тест на патенти, а не на авторські права. Іншими словами, Oracle може надати авторський право на цей текст, але вони не можуть запатентувати цей алгоритм.
Gort the Robot

Ці 9 рядків є класичним прикладом доктрини злиття. Скільки інших способів існує для перевірки діапазону на масиві?
Тоні Поні

1
@TonythePony, багато, якщо функція кидає виняток, що містить текстове повідомлення.
авакар

4
Мало хто згадував, що людина, яка скопіювала цей текст в Google, також є людиною, яка написала його на Sun. Програмісти мають усвідомити, що Стеллман - божевільний бородатий екстреміст - мав рацію . Гроші, корінь усякого зла, змушують людей забути, чому вони беруть участь в технології в першу чергу. : - /
HostileFork

5

Я все одно не буду використовувати цей код, оскільки коментар не відповідає тому, що працює в коді. У коментарі йдеться про те integer, поки використовується код unsigned int. Хто знає, які помилки закопуються в глибині цієї функції?

Якщо серйозно, то тут "Не винаходити колесо" стає смішним, і ти забув взяти його із зерном солі. Просто напишіть власну версію з нуля, порівнюйте її з умовами іменування та керівництвом щодо стилю вашого коду (наприклад math_min_uint(x, y)), переконайтесь, що вона працює (тестовий блок чи будь-що інше) та продовжуйте життя та без проблем з авторським правом.

З ростом досвіду ці тривіальні фрагменти вам знову і знову знаходяться просто у вашій панелі інструментів, і ви перепишете їх, не надто замислюючись, або просто отримаєте їх із власної бібліотеки.


2

Люди, здається, забувають, що закон про авторські права і в дусі, і в письмі означає, що акт фактичного копіювання заборонений - не акт висловлення тієї самої думки, навіть якщо результат виявляється підозріло подібним.

Якщо ви берете код GPL'd, модифікуєте його, використовуєте його таким чином, що суперечить ліцензії, згідно з якою ви його отримали, і заявляєте, що це не похідне твір, то ви порушуєте закон. Навіть якщо ви використовуєте свою другу версію - ви змінили назви всіх змінних та змінили форматування, але воно все одно походить від оригіналу.

Якщо, однак, ви пишете свою власну версію min, і завдяки тривіальності завдання, тому, що існує лише так багато способів, ви можете розумно написати таку річ, і трохи збіг обставин, ваша версія закінчується точно однаковою до коду GPL'd, ви нічого не скопіювали.

Хоча чи ні одна історія проходитиме в суді, все-таки інша справа. Якщо більший або складніший зразок коду з’являється десь в іншому місці, доповнений коментарями, форматуванням та написанням помилок, вам буде важко переконати когось, що ви його написали самостійно, тим більше, якщо можна буде показати, що ви знали оригінал джерело (яке, враховуючи той факт, що ви його опублікували тут, має бути досить тривіальним).


1

Якщо код дійсно тривіальний як приклад "min", тоді дуже висока ймовірність того, що хтось інший вже реалізував таку ж функціональність під іншою ліцензією з відкритим кодом.

Залежно від ліцензії, вам може бути дозволено включити код до програми із закритим джерелом.


1

Просто напишіть його самостійно за 30 секунд. Можна використовувати точно такий же алгоритм. Просто не копіюйте та не вставляйте.

Авторські права захищають лише вираження ідеї, а не саму ідею. Ви можете використовувати ідею безпосередньо за умови, що ви не копіюєте її.

FWIW, я сумніваюся, що копіювання такого тривіального фрагмента коду все-таки приведе вас у біду. Пошкодження було б нульовим, і, ймовірно, воно підпадало б під справедливе використання у більшості юрисдикцій. Але судові справи - це такий біль, що я не хотів би ризикувати.


1

Оскільки GPL-код є головним питанням, чи плануєте ви розподілити код або продати програмне забезпечення.

Якщо ви просто використовуєте його внутрішньо, GPL дає вам повну свободу робити так, як ви хочете.

Якщо ви плануєте розповсюджувати ваш пакет - найпростіше - це GPL ваш пакет на тих же умовах, що і будь-який джерело GPL, який ви використовували. Є й інші способи, але це ускладнюється.

Якщо ви плануєте продавати своє програмне забезпечення, ви повинні поширити вихідний код для будь-якого використовуваного та / або доповненого GPL-коду відповідно до тієї ж ліцензії GPL, якою ви його отримали.


0

Якщо ви використовуєте C ++ , а не C, обійти цю проблему, використовуючи стандартну бібліотеку std::minабо std::maxв <algorithm>:

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

Це купує вам загальність, і вона буде працювати для будь-якого порівнянного типу. Крім того: коли будь-який d-bag намагатиметься стверджувати, що він його винайшов і охоплюється патентами на програмне забезпечення, вони будуть спіткати з комітетом ISO ... не ти.

У загальному випадку врахуйте, хто опублікував код. Корпорація, чи розумна особа? Якщо це розумна особа (як це буває з багато відкритим кодом), напишіть їм приємну записку та отримайте дозвіл. Збережіть їхню відповідь, сказавши, що це нормально. Проблема вирішена.


-2

Для загального випадку: Більш складний код, який, безумовно, може бути захищений авторським правом, на відміну від min та max (що може бути, а може і не бути авторським правом).

Тоді ліцензуйте свій код відповідно до бібліотеки, тобто GPL! Однак зауважте, що є бібліотеки LGPL (і GPL з винятками), які дозволяють вам використовувати їх реалізацію, надаючи свій код незалежно від необхідної ліцензії.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.