Что мне нужно сделать, чтобы НЕ украсть код «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            ;    } }

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

CND
источник
22
Ну, в недавнем случае Google против Oracle the jury did find that one nine-line function that Google acknowledged copying was infringing(от ArsTechnica ).
Зенон
5
Ой, давай, серьезно, мин?
Мирча Chirea
33
Я бы сказал, что само существование этого вопроса доказывает плохую вещь - работа программиста стала менее программируемой, более легальной и беспорядочной бюрократией
Стефф
4
Скопируйте это . Тривиальная функция вроде minне защищена авторским правом. Смотрите мой ответ для деталей.
Тони Пони
6
@ Локи, ты скучаешь по миле. Алгоритмы защищены патентами, а не авторским правом. Срок действия авторского права истекает через 70 лет после смерти автора, поэтому произведения, защищенные авторским правом в 60-х годах, все еще довольно свежие. Наконец, вопрос о копировании ЭТОГО кода, а не об алгоритме.
Алексис

Ответы:

53

В отличие от многих пользователей здесь, я бы просто предложил: скопируйте его!

Убедитесь, что форматирование кода соответствует вашему стандарту кодирования, а также вам, вероятно, следует удалить или переписать комментарий. Никто никогда не узнает, что вы скопировали его - когда кусок кода такой простой, вы могли бы написать его с нуля. Если ваш стандарт кодирования как-то требует, чтобы функция выглядела точно так же, как и во фрагменте, пусть будет так - до тех пор, пока она выглядит так, как если бы вы написали ее с нуля.

Подумайте об этом, это едва ли (!) Первый раз, когда эта точная часть была написана - когда что-то тривиально, нет никаких причин не копировать это, если вам не хочется писать это самостоятельно.

Даже такое обсуждение кажется мне немного излишним - нам нужно быть прагматичными, если мы хотим сделать какую-то реальную работу!

NILU
источник
5
реальный вопрос в том, где находится барьер между тривиальным и нетривиальным, и есть ли способ быть абсолютно уверенным, что люди не будут указывать на мой код чем-то похожим: «ПОСМОТРИТЕ, ЧТО МОЯ РЕАЛИЗАЦИЯ GPL!» ... Я действительно боюсь этих людей> _ <
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: когда я говорю «не могу доказать», я имею в виду, что не существует никаких вещественных доказательств того, что преступление даже было совершено - совершенное преступление полностью ограничено разумом программиста. Очевидно, что это не может быть в случае кражи некоторых конфет - это оказывает физическое воздействие на мир (lollipop - = 1). Если «преступление» ограничено вашим собственным умом, то кто будет судить, является ли оно моральным или аморальным?
Нилу
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
Вы пытаетесь сказать это Оракулу!
ГордонМ
1
Может быть, эта 9-строчная функция не была тривиальной ... Я хотел бы увидеть код.
Тони Пони
1
programmers.stackexchange.com/a/148362/28718 кажется мне довольно тривиальным, если предположить, что это правильный код.
ГордонМ
12

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

unsigned int min(unsigned int a, unsigned int b)
{
    return (a > b? b: a);
}
GordonM
источник
Как я могу быть уверен, что вы не запечатали этот код GPL и не переписали его? : P (просто шучу)
cnd
1
Ты не. Но если вы использовали мой код, вы можете утверждать, что использовали его добросовестно.
ГордонМ
3
Радуйтесь, братья, как наступила новая эра - теперь мы можем найти ее minв программном обеспечении с закрытыми исходными кодами. Кроме того, @Sholy, теперь проблема Гордона в том, скопировал он это или нет.
К.Стефф
5
Вы также выпускаете его в разделе "Creative Commons". Внизу этой страницы о коде, вставленном здесь.
Мартин Йорк,
1
См .: meta.programmers.stackexchange.com/q/3585/12917
Мартин Йорк,
11

Я согласен, что это абсурдная ситуация, но в этом виноват только ты сам. Если вы пишете собственный код, вам не следует читать исходные файлы, лицензированные по лицензии GPL, точка. Удалите math.c из вашей файловой системы, сохраните документацию и не стесняйтесь повторно реализовать любую часть API, которая вам нужна. Если вы не читаете код, вам не нужно беспокоиться, если ваш собственный код окажется похожим.

Вы говорите, расточительно? GPL намеренно лишает вас возможности пользоваться бесплатным кодом без ущерба для экосистемы. Если вы не можете или не будете выполнять ее условия и не хотите внедрять еще одну математическую библиотеку, вы всегда можете купить ее или найти бесплатную, которая поставляется с лицензией, которую вы можете принять.

Программисты Microsoft не имеют права читать открытый исходный код, чтобы защитить компанию от юридических проблем. По чисто этическим причинам вы должны делать то же самое с любой программой, лицензию которой вы не собираетесь придерживаться.

Вы не имеете права использовать это math.c, но никто не пытается загнать рынок в угол реализации min. Цель GPL - увеличить «свободу» программиста (и свободу конечного пользователя), а не ограничивать ее. Лицензия GNU, FSF и Движение за свободное программное обеспечение начались с Ричарда Столлмана, и Столлман начал с повторной реализации с нуля каждую новую версию Symbolics lisp по мере ее появления. FSF не будет (и не мог) искать кого-то для повторной реализации библиотеки GPL.

Alexis
источник
Но это действительно странный пример. Это пример, это означает, что я должен прочитать его и следовать ему ... но насколько я понимаю, я свободен не выбирать здесь лицензию GPL. Итак, я знаю, кто такой Столлман;)
cnd
2
Извините, но я понятия не имею, что вы говорите! Какой пример? (Вы также спрашиваете меня, кто такой Столлман? Зайдите в Google. Или просто посмотрите Википедию.)
alexis
3
«Программистам Microsoft не разрешают читать открытый исходный код», боже, это ужасно - я могу где-нибудь прочитать об этом? Google не помогает
Амара
Хороший вопрос. Я читал об этом на каком-то форуме разработчиков Iron Python, но, к сожалению, сейчас не могу его найти. Описание: Джим Хугунин ( hugunin.net/microsoft_farewell.html ) упомянул, что им не разрешено смотреть на реализацию Python, и кто-то в шутку спросил, разрешено ли им просматривать свой собственный код (Microsoft сделала Iron Python открытым исходным кодом) , Ответ таков: они сделали специальное исключение для Iron Python.
Алексис
Люди, чья свобода GPL предназначена для увеличения, являются всеми пользователями программы, а не (в частности) программистами.
Джеймс Янгман
7

Ответ: только с явного разрешения автора.

Это защищенный авторским правом код. Вы не можете скопировать его без разрешения автора.

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

Помните, что авторским правом защищен код, а не алгоритм. Закон об авторском праве исходит из текста. Даже если бы «math.c» был только комментариями и вообще не имел исполняемого кода, он все равно был бы защищен авторским правом.

Горт Робот
источник
1
Что значит собственная версия? МОЯ СОБСТВЕННАЯ версия MIN, звучит смешно!
cnd
2
Помните, что вы не являетесь владельцем min, вы владеете определенной последовательностью символов, которая может быть реализована min.
Gort the Robot
2
Вы не можете изменить его без разрешения автора, за исключением личного использования. Вы должны переписать его с нуля. В этом весь смысл. Обратите внимание, что если вы сели за пустой редактор и написали что-то, почти идентичное этому, это было бы хорошо, потому что вы не копировали это. (Предполагая, что вы не печатали по памяти.)
Gort the Robot
2
Нет, я не шучу. И да, вы, вероятно, можете сойти с рук в таких случаях, как это. Владелец авторских прав должен доказать, что вы это сделали. Обратите внимание, что я просто говорю вам, что такое закон, а не защищаю его.
Gort the Robot
3
Потому что, если вы не перекодируете эти тривиальные вещи, вы используете чужую работу так, как они не дали вам разрешения. Если это так тривиально, что вам это не нужно, не используйте его.
Алексис
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     }
Chrispix
источник
Если это все, приговор будет отклонен при обжаловании. Но, по словам Wired, судья также обнаружил, что Google скопировал 8 других файлов. См. Wired.com/wiredenterprise/2012/05/google-oracle-decompile
Тони Пони
5
Да, но «здравый смысл» не является препятствием для защиты авторских прав. То ли они копировали и редактировали, либо писали сами с нуля. Является ли что-то «здравым смыслом» - это проверка патентов, а не авторских прав. Другими словами, Oracle может защищать авторские права на этот текст, но они не могут запатентовать этот алгоритм.
Gort the Robot
Эти 9 строк являются классическим примером доктрины слияния. Сколько еще способов выполнить проверку диапазона массива?
Тони Пони
1
@TonythePony, много, если функция выдает исключение, содержащее текстовое сообщение.
avakar
4
Мало кто упомянул, что тот, кто скопировал этот текст в Google, также написал его в Sun. Программисты должны понять, что Столлман - сумасшедший бородатый экстремист - был прав . Деньги, которые являются корнем всего зла, заставляют людей забывать, зачем они вообще участвуют в технологиях. : - /
HostileFork
5

Я не буду использовать этот код в любом случае, потому что комментарий не совпадает с тем, что делает код. Комментарий говорит о том integer, что код использует unsigned int. Кто знает, какие ошибки скрыты в недрах этой функции?

Серьезно, это то, где «Не изобретай велосипед» становится смешным, и ты забыл взять его с крошкой соли. Просто напишите свою собственную версию с нуля, сравните ее с соглашением об именах и руководством по стилю вашего кода (например math_min_uint(x, y)), убедитесь, что он работает (модульное тестирование и т. Д.), И продолжайте жить без проблем с авторским правом.

С ростом опыта эти тривиальные фрагменты, которые вам нужны снова и снова, просто находятся в вашем наборе инструментов, и вы будете переписывать их, не задумываясь, или просто получить их из своей собственной библиотеки.

Безопасный
источник
2

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

Если вы берете код GPL, изменяете его, используете его таким образом, который противоречит лицензии, под которой вы его получили, и утверждаете, что это не производное произведение, то вы нарушаете закон. Даже если вы используете свою вторую версию - вы изменили имена всех переменных и изменили форматирование, но оно все равно получено из оригинала.

Однако, если вы пишете свою собственную версию min, и из-за тривиальности задачи, факта, что есть только очень много способов, которыми вы можете разумно написать такую ​​вещь, и небольшое совпадение, ваша версия в конечном итоге будет полностью идентична в код GPL, то вы ничего не скопировали.

Вопрос о том, пройдет ли история в суде, - это другой вопрос. Если более крупный или более сложный пример кода появляется где-то еще, с комментариями, форматированием и орфографическими ошибками, вам будет сложно убедить кого-либо в том, что вы написали его независимо, тем более, если будет показано, что вы знали оригинал источник (который, учитывая тот факт, что вы разместили его здесь, должен быть довольно тривиальным).

tdammers
источник
1

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

В зависимости от лицензии вам может быть разрешено включить код в ваше приложение с закрытым исходным кодом.

Нильс Басхес
источник
1

Просто напишите это себе за 30 секунд. Вы можете использовать точно такой же алгоритм. Просто не копируйте / вставляйте.

Авторское право защищает только выражение идеи, а не саму идею. Вы можете использовать идею напрямую, если не копируете ее.

FWIW, я сомневаюсь, что копирование такого тривиального кода в любом случае может привести к неприятностям. Убытки будут равны нулю, и, вероятно, в большинстве юрисдикций это будет неоправданно. Но судебные дела - такая боль, что я не хотел бы рисковать.

mikera
источник
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 ... а не с вами.

В общем случае обратите внимание, кто опубликовал код. Корпорация или здравомыслящий человек? Если это здравомыслящий человек (как в случае с большим количеством открытого исходного кода), напишите им приятную заметку и получите разрешение. Сохраните их ответ, говоря, что все в порядке. Проблема решена.

HostileFork
источник
-2

Для общего случая: более сложный код, который определенно может быть защищен авторским правом, в отличие от минимального и максимального (который может или не может быть защищен авторским правом).

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

Ctrl-Alt-Делор
источник