[Закрытое] лицензирование LGPL/GPL

1127 Это действительно хорошее начало. Однако есть несколько проблем с вашим кодом. Итак, давайте пройдемся по нему и посмотрим, где мы можем сделать некоторые улучшения.

Конструктор

Во-первых, в своем конструкторе вы делаете данные объектом, а не массивом. Плоские списки не работают с объектами, которые они работают с массивами, поэтому это немедленно вызовет у вас проблемы. Вы действительно должны удалить {} из-за restaurantList.

constructor() {
    super();
    this.state = {
        loading: false,
        data: {restaurantList}, // You shouldn't have {} around the restaurantList
        error: null,
    };
    this.arrayholder = []; // we also don't need this
}

Вы должны обновить свой конструктор до этого

constructor (props) {
  super(props);

  this.state = {
    loading: false,
    data: restaurantList, // notice we have no {} around restaurantList
    error: null,
    value: ''
  };
}

renderHeader

В вашей функции renderHeader вы используете onChange, а не onChangeText. onChange возвращает объект, но вы хотите, чтобы text было помещено в строку поиска. Вам нужно обновить функцию renderHeader, чтобы она была такой.

renderHeader = () => {
  return (
     this.searchFilterFunction(text)} // now we are using the correct function to capture the text
    />
  );
};

searchFilterFunction

Есть несколько проблем с этой функцией. Сначала вы смотрите на this.arrayholder, который пуст. На самом деле нам не нужен дополнительный массив для хранения данных, так как мы можем просто использовать restaurantList, который мы импортировали ранее. Во-вторых, вы используете indexOf для строки, лучше использовать includes.

searchFilterFunction = text => {
  this.setState({
    value: text
  });

  const newData = restaurantList.filter(item => {
    const itemData = `${item.name.toUpperCase()} ${item.type.toUpperCase()}`;
    const textData = text.toUpperCase();
    return itemData.includes(textData); // this will return true if our itemData contains the textData
  });

  this.setState({
    data: newData
  });
};

FlatList

В вашем FlatList вы должны использовать реквизит extraData, поскольку это позволит FlatList обновляться при изменении базовых данных. Вы также должны добавить keyExtractor.

 `${index}`}
  extraData={this.state} // <- add this prop
  data={this.state.data}
  renderItem={({ item }) => (
    {item.name} {item.type}
  )}
  ItemSeparatorComponent={this.renderSeparator}
  ListHeaderComponent={this.renderHeader}
/>

Собираем все вместе

Так что, если мы соберем все это вместе, добавим макет данных, чтобы мы могли проверить, работает ли он. Мы должны получить что-то вроде этого.

// mock the data as you didn't provide an example
const restaurantList = [
  {
    type: 'Italian',
    name: 'DiMaggio'
  },
  {
    type: 'Greek',
    name: 'Athena'
  }
];

export default class SearchScreen extends React.Component {
  static navigationOptions = {
    title: 'Search for Restaurants'
  };
  constructor (props) {
    super(props);

    this.state = {
      loading: false,
      data: restaurantList,
      error: null,
      value: ''
    };
  }

  renderSeparator = () => {
    return (
      
    );
  };

  searchFilterFunction = text => {
    this.setState({
      value: text
    });

    const newData = restaurantList.filter(item => {
      const itemData = `${item.name.toUpperCase()} ${item.type.toUpperCase()}`;
      const textData = text.toUpperCase();
      return itemData.includes(textData);
    });

    this.setState({
      data: newData
    });
  };

  renderHeader = () => {
    return (
       this.searchFilterFunction(text)}
      />
    );
  };

  render () {
    if (this.state.loading) {
      return (
        
          
        
      );
    } else {
      return (
        
           `${index}`}
            extraData={this.state}
            data={this.state.data}
            renderItem={({ item }) => (
              {item.name} {item.type}
            )}
            ItemSeparatorComponent={this.renderSeparator}
            ListHeaderComponent={this.renderHeader}
          />
        
      );
    }
  }
}

Закуска

Вы можете увидеть, как он работает на следующем перекусе https://snack.expo.io/@andypandy/flatlist-with-search [ 1134]

8
задан Tae-Sung Shin 2 August 2013 в 21:19
поделиться

4 ответа

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

2
ответ дан 5 December 2019 в 08:00
поделиться

Значит ли это, что мне нужно освободить исходный код для моего веб-приложения?

Нет *

или просто необходимо освободить исходный код подключаемого модуля?

Если вы распространите приложение, тогда да, вы также должны распространять исходный код для его части LGPL.

Вам также необходимо убедиться, что у любого, получающего ваше приложение, будет возможность изменить его. Это важно для скомпилированных приложений - вам нужно будет включить необходимые объектные файлы, чтобы ваше приложение можно было повторно связать с измененной версией кода LGPL. Или используйте динамическое связывание. Идея состоит в том, что люди должны иметь возможность изменять часть вашего кода, которая является LGPL, и повторно комбинировать ее с вашим приложением.

Вот некоторые из требований LGPL в моих словах (я не юрист) :

  • Должно быть какое-то четкое разделение между кодом LGPL и другим кодом. В частности, получатель должен иметь возможность изменить код LGPL или даже полностью заменить его другим кодом, таким как измененная версия или более поздняя версия библиотеки. Следовательно, если это скомпилированная программа, то код LGPL должен быть либо динамически связан (например, отдельная DLL или общий файл), чтобы его можно было легко заменить аналогичной библиотекой и при этом поддерживать совместимость; или, если он статически связан, должны быть предоставлены минимально необходимые исходные файлы и / или объектные файлы, чтобы позволить перекомпиляцию с альтернативной библиотекой. Часть, не относящаяся к LGPL, не может содержать какую-либо часть кода LGPL, за исключением очень простых заголовочных файлов.
  • Должно быть четко указано, какая часть кода покрыта LGPL, включая его оригинальное уведомление об авторском праве и текст LGPL (включая GPL, на котором оно основано).
  • Если комбинированное программное обеспечение отображает уведомления об авторских правах в ходе работы, то также должно появиться уведомление об авторском праве для покрытой LGPL части. здесь, вместе со ссылкой на LGPL и GPL.
  • В некоторых случаях вам потребуется предоставить информацию об установке, подробно описывающую, как использовать модифицированную версию кода LGPLd в комбинированном приложении.

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

  • Вам не нужно выпускать исходный код для остальной части вашего приложения (то есть части, не относящейся к LGPL). Единственное исключение - описанное выше - если все они статически связаны, вам нужно предоставить достаточно кода (и / или объектных файлов), чтобы иметь возможность повторно связать его с альтернативной или модифицированной версией кода LGPL. Если вы подключаетесь динамически и взаимодействуете через обычный API, вам не нужно об этом беспокоиться.
  • Вам не нужно выпускать остальную часть вашего приложения под лицензией GPL. Вы можете использовать любую желаемую лицензию, в том числе более ограниченные проприетарные лицензии, при условии, что при ее распространении вы следуете правилам.
  • В отличие от GPL версии 3, которая запрещает использование кода, если вы внедряете защиту от копирования или программное обеспечение DRM, вы может использовать лицензионный код LGPL версии 3 в приложении, которое включает защиту от копирования или DRM.

Недавно я написал анализ лицензии LGPL - вы можете прочитать это для получения дополнительной информации.

Также, пожалуйста, прочитайте фактический текст LGPL . Это не слишком долго.

* Вы упомянули, что используемая вами библиотека имеет источник данных GPL. Предположительно это означает, что вы на самом деле не будете распространять эти данные GPL, а только библиотеку LGPL, которая их использует.

7
ответ дан 5 December 2019 в 08:00
поделиться

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

(может отличаться от GPL3)

1
ответ дан 5 December 2019 в 08:00
поделиться

Чтобы быть на 100% уверенным, прочитайте FAQ и затем обратитесь к юристу, который знаком с лицензированием программного обеспечения. Не разговаривайте с юристами, которые не делают этого, потому что они скажут вам не использовать ничего бесплатно / с открытым исходным кодом, просто чтобы быть в безопасности, что каждый может сказать.

В любом случае, что вы подразумеваете под «источником данных»? что такое "GPL"? Связан ли исходный код GPL с вашим приложением?

В FAQ есть несколько вопросов относительно плагина и GPL.

Могу ли я выпустить несвободную программу это предназначено для загрузки под GPL плагин?

Это зависит от того, как программа вызывает его плагины. Например, если программа использует только простой форк и exec вызывать и общаться с плагины, то плагины отдельные программы, поэтому лицензия плагин не предъявляет никаких требований о основной программе.

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

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

Использование разделяемой памяти для взаимодействия со сложными структурами данных в значительной степени эквивалентно динамическому связыванию.

Как уже отмечали другие, веб-приложения, которые не распространяются, по-видимому, считаются частным использованием при простой GPL (не в Affero GPL?).

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

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

Важно, чтобы люди имели свободу вносить изменения и использовать их в частном порядке, никогда не публикуя эти изменения. Тем не менее, размещение программы на серверном компьютере для публичного общения вряд ли является «частным» использованием, поэтому было бы правомерно требовать выпуска исходного кода в этом особом случае. Разработчики, желающие решить эту проблему, могут использовать GNU Affero GPL для программ, предназначенных для использования на сетевом сервере.

11
ответ дан 5 December 2019 в 08:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: