Repository commonly refers to a storage location, often for safety or preservation.
- Wikipedia
Вот как Википедия описывает репозиторий. Так уж случилось, что в отличие от некоторых других жаргонных словечек, с которыми мы имеем дело, этот термин прекрасно передает свою суть. Репозиторий представляет собой концепцию хранения коллекции для сущностей определенного типа.
Репозиторий как коллекция
Вероятно, наиболее важным отличием репозиториев является то, что они представляют собой коллекции объектов. Они не описывают хранение в базах данных или кэширование или решение любой другой технической проблемы. Репозитории представляют коллекции. Как вы храните эти коллекции - это просто деталь реализации.Я хочу внести ясность в этот вопрос. Репозиторий - это коллекция. Коллекция, которая содержит сущности и может фильтровать и возвращать результат обратно в зависимости от требований вашего приложения. Где и как он хранит эти объекты является ДЕТАЛЬЮ РЕАЛИЗАЦИИ.
В мире PHP мы привыкли к циклу запрос/ответ, который оканчивается смертью процесса. Все, что пришло извне и не сохранилось - ушло навсегда, в этой точке. Так вот, не все платформы работают именно так.
Хорошим способом понять как работают репозитории является представление вашего приложения постоянно работающим, в этом случае все объекты остаются в памяти. Вероятность критических сбоев и реакцию на них в этом эксперименте можно пренебречь. Представьте, что у вас есть Singleton-экземпляр репозитория для сущностей Member , MemberRepository .
Затем создайте новый объект Member и добавьте его в репозиторий. Позже, вы запросите у репозитория все элементы, хранящиеся в нем, таким образом вы получите коллекцию, которая содержит этот объект внутри. Возможно вы захотите получить какой-то конкретный объект по его ID, это также возможно. Очень легко представить себе, что внутри репозитория эти объекты хранятся в массиве или, что еще лучше, в объекте-коллекции.
Проще говоря, репозиторий - это особый вид надежных коллекций, которые вы будете использовать снова и снова, чтобы хранить и фильтровать сущности.
Взаимодействие с Репозиторием
Представьте, что мы создаем сущность Member . Мы приводим объект к необходимому состоянию, затем запрос заканчивается и объект исчезает. Пользователь пытается авторизоваться в нашем приложении и не может. Очевидно, что нам необходимо сделать этот объект доступным и для других частей приложения. $member = Member::register($email, $password);
$memberRepository->save($member);
Теперь мы можем получить доступ к объекту позже. Примерно так:
$member = $memberRepository->findByEmail($email);
// or
$members = $memberRepository->getAll();
Мы можем хранить объекты в одной части нашего приложения, а затем извлекать их из другой.
Должны ли репозитории создавать сущности?
Вы можете встретить такие примеры: $member = $memberRepository->create($email, $password);
Я видел множество аргументов приводящихся в пользу этого, но совершенно не заинтересован в подобном подходе.
Прежде всего, репозитории - это коллекции. Я не уверен в том, зачем коллекция должна быть коллекцией и фабрикой. Я слышал аргументы вроде «если обращаться удобнее так, то почему бы не повесить обработчик на подобные действия» ?
На мой взгляд, это анти-паттерн. Почему бы не позволить классу Member , иметь свое собственное понимание как и зачем создается объект или почему бы не сделать отдельную фабрику для создания более сложных объектов?
Если мы относимся к нашим репозиториям как к простым коллекциям, так значит и не нужно нагружать их лишним функционалом. Я не хочу классов коллекций, которые ведут себя как фабрики.
В чем выгода использования репозиториев?
Основное преимущество репозиториев - это абстрактный механизм хранения для коллекций сущностей.Предоставляя интерфейс MemberRepository мы развязываем руки разработчику, который уже сам решит как и где хранить данные.
Class ArrayMemberRepository implements MemberRepository { private $members = ; public function save(Member $member) { $this->members[(string)$member->getId()] = $member; } public function getAll() { return $this->members; } public function findById(MemberId $memberId) { if (isset($this->members[(string)$memberId])) { return $this->
Class RedisMemberRepository implements MemberRepository {
public function save(Member $member) {
// ...
}
// you get the point
}
Таким образом, большинство наших приложений знает только абстрактное понятие MemberRepository и его использование может быть отделено от фактической реализации. Это очень раскрепощает.
К чему относятся репозитории: Domain или Application Service Layer?
Итак, вот интересный вопрос. Во-первых, давайте определим, что Application Service Layer - это многоуровневая архитектура, которая отвечает за специфические детали реализации приложения, такие как целостность базы данных, и различные реализации работы с интернет-протоколами (отправка электронной почты, API) и др.Определим термин Domain Layer как слой многоуровневой архитектуры, которая отвечает за бизнес-правила и бизнес-логику.
Куда же попадет репозиторий при таком подходе?
Давайте посмотрим на нашем примере. Вот код, написанный ранее.
Class ArrayMemberRepository implements MemberRepository {
private $members = ;
public function save(Member $member) {
$this->members[(string) $member->getId()] = $member;
}
public function getAll() {
return $this->members;
}
public function findById(MemberId $memberId) {
if (isset($this->members[(string)$memberId])) {
return $this->members[(string)$memberId];
}
}
}
В этом примере я вижу много деталей реализации. Они, несомненно, должны входить в слой приложения
А теперь давайте удалим все детали реализации из этого класса…
Class ArrayMemberRepository implements MemberRepository {
public function save(Member $member) {
}
public function getAll() {
}
public function findById(MemberId $memberId) {
}
}
Хм… это начинает выглядеть знакомо… Что же мы забыли?
Возможно, получившийся код напоминает вам это?
Interface MemberRepository {
public function save(Member $member);
public function getAll();
public function findById(MemberId $memberId);
}
Это означает, что интерфейс находится на границе слоев. и на самом деле может содержать доменно-специфические концепты, но сама реализация не должна этого делать.
Интерфейсы репозиториев принадлежат к слою домена. Реализация же относятся к слою приложения. Это означает, что мы свободны при построении архитектуры на уровне доменного слоя без необходимости зависеть от слоя сервиса.
Свобода смены хранилищ данных
Всякий раз, когда вы слышите чей-то разговор о концепции объектно-ориентированного дизайна, вы, наверное, могли слышать что-то вроде "… и у вас есть возможность поменять одну реализацию хранения данных на другую в будущем..."По-моему, это не совсем правда… я бы даже сказал, что это очень плохой аргумент. Самой большой проблемой объяснения концепции репозиториев является то, что сразу напрашивается вопрос «вы действительно хотите это делать?» . Я НЕ хочу чтобы подобные вопросы влияли на использование паттерна репозитория.
Любое достаточно хорошо спроектированное объектно-ориентированное приложение автоматически подходит под приведенное преемущество. Центральной концепцией ООП является инкапсуляция. Вы можете предоставить доступ к API и скрыть реализацию.
Ведь вы же на самом деле не будете переключаться с одного ORM на другой и обратно. Но даже если вы захотите так делать, то, по крайней мере, у вас будет возможность сделать это. Однако, замена реализации репозитория будет огромным плюсом при тестировании.
Тестирование при использовании паттерна «Репозиторий»
Ну, тут все просто. Давайте предположим, что у вас есть объект, который обрабатывает что-то вроде регистрации участников…Class RegisterMemberHandler {
private $members;
public function __construct(MemberRepository $members) {
$this->members = $members;
}
public function handle(RegisterMember $command) {
$member = Member::register($command->email, $command->password);
$this->members->save($member);
}
}
Во время очередной операции, я могу взять экземпляр DoctrineMemberRepository . Однако, во время тестирования легко можно заменить его на экземпляр ArrayMemberRepository. Они оба реализуют один и тот же интерфейс.
Упрощенный пример теста может выглядеть примерно так…
$repo = new ArrayMemberRepository;
$handler = new RegisterMemberHandler($repo);
$request = $this->createRequest(["email" => "[email protected]", "password" => "angelofdestruction"]);
$handler->handle(RegisterMember::usingForm($request));
AssertCount(1, $repo->findByEmail("[email protected]"));
В этом примере мы тестируем обработчик. Нам не нужно проверять корректность хранения данных репозитория в БД (или еще где). Мы тестируем конкретное поведение этого объекта: регистрируем пользователя на основе данных формы, а затем передаем их в репозиторий.
Коллекция или Состояние
В книге Implementing Domain-Driven Design Vaughn Vernon делает различие между типами репозиториев. Идея коллекцио-ориентированного репозитория (ориг. - collection-oriented repository) в том, что работа с репозиторием идет в памяти, как с массивом. Репозиторий, ориентированный на хранение состояний (ориг. - persistence-oriented repository) содержит в себе идею, что в нем будет какая-то более глубокая и продуманная система хранения. По сути различия лишь в названиях. // collection-oriented
$memberRepository->add($member);
// vs persistence-oriented
$memberRepository->save($member);
Замечу, что это лишь мое мнение и пока что я придерживаюсь именно его в вопросах использования репозиториев. Однако, хотел бы предупредить, что возможно могу передумать. В конце-концов, я сосредотачиваюсь на них как на коллекциях объектов с теми же обязанностями, что и у любого другого объекта-коллекции.
Дополнительная информация
everzet создал проект на Github о репозиториях на который, безусловно, стоит посмотреть. Внутри вы найдете примеры работы с хранением в памяти и файлах.Итоги
Я считаю, что…- … важно дать репозиториям сингулярную задачу функционировать как коллекция объектов.
- … мы не должны использовать репозитории для создания новых экземпляров объектов.
- … мы должны избегать использования репозиториев как способа перехода от одной технологии к другой, так как они имеют очень много преимуществ, от которых трудно отказаться.
Если у вас есть вопросы или если ваше мнение отличается от моего, пожалуйста, пишите комментарии ниже.
Как всегда, я намерен обновлять статью, чтобы синхронизировать ее с моим текущим мнением.
Всевозможные программы или же обновления, которые на сегодняшний день используются в Ubuntu, устанавливаются исключительно из репозиториев. При этом многие пользователи даже не знают, что это такое и в чем заключается его основное предназначение.
Что это такое?
Репозиторий - это специальное место, из которого пользователь операционной системы Ubunty может устанавливать всевозможные обновления или же программы. Если вы раньше пользовались операционными системами Mac и Windows, то вы, наверное, уже успели привыкнуть к тому, что программное обеспечение представляет собой какой-нибудь один или же несколько установочных файлов, которые пользователю предоставляются на определенных носителях или же могут скачиваться через Интернет. Для операционной системы Ubuntu также предусматривается такой вариант распространения программного обеспечения, но относится это больше к специализированным закрытым или же проприетарным программам.
Репозиторий - это место, где содержится большая часть программного обеспечения Ubuntu, которое запаковывается в специализированные файлы.deb с содержанием в них требуемых библиотек. Такие файлы достаточно часто можно найти в Интернете или же на каких-либо переносных носителях, даже на CD,с которого устанавливается сама операционная система.
Репозиторий как универсальное хранилище Ubuntu
Однако, видя такие файлы, многие пользователи могут даже не знать о том, что представляет собой репозиторий. Это специализированный сервер-хранилище, на котором располагаются такие файлы. Другими словами, репозитории можно назвать своеобразным источником приложений, так как пользователи со своих компьютеров подключаются к ним через Сеть или же Интернет, используя специализированные утилиты, после чего могут увидеть, какие пакеты на данный момент уже есть на компьютере, а какие можно будет установить. Стоит отметить, что преимущественное большинство утилит поддерживает процедуру простого поиска по ключевым словам, а также может разбивать пакеты на несколько групп по категориям.
Репозитории Ubuntu содержат в себе огромнейшее количество самого разного программного обеспечения, поэтому зачастую нет ничего сложного в том, чтобы найти в них интересующую вас утилиту. Конечно, вы можете просто из Интернета скачать какой-нибудь пакет файлов.deb или даже попробовать самостоятельно собрать программу из исходников, но при этом вы должны понимать, что этот вариант является более трудоемким и далеко не всегда в конечном итоге оказывается действенным.
Как искать и устанавливать различные программы?
Изначально, используя репозитории Ubuntu, вам следует исходить из того, что есть определенная задача, которая должна быть решена при помощи утилиты, но при этом вы можете даже не знать, существует ли таковая и как она называется. Однако вполне вероятно, что вы знаете программы-аналоги, которые используются в других операционных системах.
Используя какой-нибудь интернет-поисковик, вы находите интересующие вас варианты нужной программы, к примеру, набирая название аналогичной утилиты в Windows, но дописывая в запрос «для Ubuntu». В преимущественном большинстве случаев поисковик выдаст вам несколько названий программ, при этом стоит отметить тот факт, что они могут быть представлены в достаточно большом количестве, но выбрать наиболее оптимальную вы сможете по отзывам тех пользователей, которые уже успели ею воспользоваться. Практически каждая современная утилита имеет собственную страничку в Интернете, на которой можно будет ознакомиться с дополнительными характеристиками или же просмотреть скриншоты.
Где скачать программу?
После того как вы определитесь с названием интересующей вас программы, нужно будет запустить центр приложений Ubuntu, после чего найти ее в доступном списке. Скорее всего, вам удастся отыскать ее и установить в достаточно короткие сроки. Помимо этого, вполне вероятно, что у разработчиков присутствуют собственные репозитории для iOS 7 или других операционных систем. В преимущественном большинстве случаев в таких репозиториях находятся наиболее свежие версии интересующей вас программы, поэтому, если вас интересует максимальная продуктивность, то стоит внимательно осмотреть сайт, а также воспользоваться поиском.
Только в том случае, если вам не удалось найти нужную программу, используя репозитории для iOS 7 или других ОС, вам стоит пробовать другие варианты установки. Зачастую случается так, что те версии программного обеспечения, которые находятся в репозиториях, представляют собой устаревшие варианты, но при этом на самом деле бывают часто и такие ситуации, когда именно они являются лучше интегрированными в Ubuntu, а в определенных ситуациях отличаются также более стабильной работой.
Секции
В Ubuntu лучшие репозитории подразделяются на четыре секции, которые называются компонентами и предназначаются для того, чтобы отразить страницу как в лицензии, так и в уровне доступной пользователю поддержки. Пакеты подразделяются по компонентам следующим образом:
- Main - абсолютно свободное программное обеспечение, которое поддерживается компанией Canonical.
- Restricter - проприетарное программное обеспечение, которое включает в себя в основном различные драйверы устройств. Все утилиты также поддерживаются компанией Canonical.
- Universe - также свободное программное обеспечение, которое официально не поддерживается Canonical, но при этом контролируется сообществом пользователей операционной системы.
- Multiverse - проприетарное ПО, не имеющее поддержки компании Canonical.
Типы репозиториев
Также существует 5 основных репозиториев:
- Release - пакеты, которые были выпущены на момент выхода релиза.
- Release-security - пакеты, в которых присутствуют какие-то критические обновления безопасности.
- Release-updates - пакеты, содержащие в себе обновления системы, включая также различные более современные версии программного обеспечения, которые были выпущены после официального релиза.
- Release-backports - всевозможные бэкпорты, принадлежащие к новым версиям определенного ПО, которое является доступным исключительно в нестабильных версиях операционной системы Ubuntu.
- Partner - репозиторий, в котором содержится различное программное обеспечение компаний, являющихся партнерами Canonical.
Стоит отметить, что, помимо официальных, существуют также и другие репозитории для iOS 8 и других операционных систем. Они могут создаваться авторами тех или иных утилит, а также людьми, которые просто решили из исходников собрать полноценный пакет, после чего выпустить его в открытом доступе для других пользователей.
Добавление через Launchpad
Если вы не знаете, как добавить репозиторий, в этом вам поможет Launchpad, предоставляющий возможность создания РРА-репозиториев. Эти хранилища представляют собой относительно небольшие пакеты, в которые владелец складывает различные исходники, а пользователям на выходе предоставляется полноценный deb-документ.
Как подключить?
Если человек не находит интересующую его утилиту, он может самостоятельно разобраться, как добавить репозиторий, после чего загрузить в него нужное программное обеспечение. Ведь достаточно часто случается так, что в репозиториях Ubuntu попросту отсутствуют различные утилиты, которые могут понадобиться для решения тех или иных задач. Именно по этой причине есть достаточно большое количество сторонних репозиториев, при подключении которых можно получить доступ к необходимому ПО. Это можно сделать как с использованием так и через консоль.
Сразу стоит отметить тот факт, что в некоторых репозиториях, помимо тех пакетов, которые вам нужны, могут находиться также всевозможные экспериментальные сборки разного программного обеспечения, включая также ядра, которые содержат в себе Linux-репозитории. Так как версия таких пакетов в преимущественном большинстве случаев выше по сравнению с теми, которые используете вы, "Менеджер обновлений" может попробовать самостоятельно обновить систему. Он сделает это через бесплатные репозитории, что может нанести повреждения вашей системе. Именно по этой причине вам нужно в любом случае внимательно читать описания подключаемого хранилища, а также ту информацию, которая находится в "Менеджере обновлений".
При помощи графического интерфейса
В данном случае репозитории для iOS 8 и других ОС подключаются следующим образом:
- Открывается центр приложений Ubuntu.
- Далее переходим в пункт «Правка» / «Источники приложений».
- В новом окне выбираем вкладку «Другое программное обеспечение», после чего нажимаем на кнопку «Добавить».
- В новом окне заполняем поле «Строка АРТ:», нажимаем кнопку «Добавить источник».
- Теперь источник добавлен и включен, можно закрывать окно.
Так как вы подключили новый источник программного обеспечения, вам нужно будет произвести обновление информации о пакетах. В преимущественном большинстве случаев после подключения появляется окно, в котором пользователю предлагают обновить эти данные. В окне нужно просто нажать на кнопку «Обновить».
После того как вами будет обновлена вся информация о пакетах, окно «Источники приложения» будет закрыто, и, скорее всего, у вас появится ошибка о том, что источник приложения является неподписанным. Однако вы сможете устанавливать интересующие вас утилиты, которые содержатся в подключенном вами репозитории, при помощи стандартных средств. Чтобы устранить ошибку неподписанного репозитория, вам следует разбираться уже в системе защиты.
При помощи консоли
Данный вариант является наиболее оптимальным из всех существующих способов. Лучше всего добавить локальный репозиторий или же другие виды хранилищ при помощи консоли. Делается это достаточно просто, ведь хранилище добавляется всего лишь одной командой, такой как, например: sudo apt-add-repository ppa:ripps818/coreavc.
В случае необходимости можно точно так же через консоль и удалить репозиторий.
Система защиты
Так как в преимущественном большинстве случаев репозитории располагаются в Интернете, есть вероятность того, что злоумышленники могут подменить репозиторий на собственный, в котором содержатся различные модифицированные пакеты. Таким образом, устанавливая на свой компьютер модифицированное программное обеспечение, пользователь может поставить свою систему под реальную угрозу. Однако во многих репозиториях предусматривается защита от подмены. Такой вариант защиты реализовывается путем сравнения цифровых подписей клиента и репозитория. В том случае, если у хранилища имеется цифровая подпись, на пользовательском компьютере присутствует ключ, который является открытым для данного репозитория.
В Ubuntu стандартно доверенными являются хранилища, находящиеся на установочных дисках. Если на пользовательском компьютере одновременно несколько подключенных репозиториев, предпочтительными будут именно доверенные хранилища.
Как добавить ключ?
Подключая хранилище, которое находится под защитой цифровой подписи, вам необходимо будет скачать специализированный открытый ключ, который должен быть добавлен в систему. Достаточно часто для скачивания может быть предоставлен пакет, доступный для установки, который полностью самостоятельно будет прописывать ключ репозитория. Если вы будете скачивать ключ непосредственно с сайта репозитория, то в таком случае вам будет предоставлен обычный файл с расширением.gpg, .key или же каким-нибудь другим. Добавить данный файл в систему можно будет при помощи консольной команды sudo apt-key add repo.key, но вместо.key указывается тот ключ репозитория, который был вами получен.
Добавление ключа через сервер
Наиболее оптимальным вариантом является добавление ключа через специализированный сервер, находящийся под защитой. Достаточно часто, если речь идет о ключе, дается его буквенно-цифровой идентификатор, который пользователю на первый взгляд может быть абсолютно непонятным, но это уникальное имя. Такие ключи располагаются на специальных серверах, откуда получить их может любой человек.
Открываем менеджер пакетов Synaptic, заходим в настройки, выбираем репозитории.
В открывшемся окне несколько вкладок с типами репозиториев:
Main - основная ветка - стабильное официально поддерживаемое Canonical ПО
Restricted - официально поддерживаемое ПО распространяемое не под лицензией GPL
Universe - программы, поддерживаемые сообществом Ubuntu
Multiverse - ветка проприетарного программного обеспечения
В зависимости от дистрибутива линукса эти окна немного могут немного различаться, например в Mint выглядит так.
Для добавления репозитория в Ubuntu перейдите на вкладку другое ПО на этой вкладке вы можете видеть весь список репозиториев Ubuntu которые были подключены к системе:
Чтобы иметь доступ к дополнительным программам рекомендуется подключить сторонний репозиторий партнеров Canonical. Для этого просто поставьте напротив него галочку.
Для добавления репозитория Ubuntu нажмите кнопку Добавить:
Здесь в единственном поле нужно ввести apt строку репозитория и нажать кнопку добавить источник.
Apt строка репозитория имеет такой синтаксис:
deb http://адрес_репозитория версия_дистрибутива ветки
Например:
deb http://ua.archive.ubuntu.com/ubuntu/ xenial main restricted
deb https://apt-mo.trafficmanager.net/repos/dotnet/ trusty main
Чтобы добавить в командной строке, достаточно выполнить команду:
sudo add-apt-repository "deb адрес репозитория ветка main"
Например:
sudo add-apt-repository "deb http://mirror.yandex.ru/ubuntu/ trusty main"
Основные репозитории для Ubuntu, Mint и им подобных
Ualinux
Данный репозиторий могут использовать не только пользователи Ubuntu, но так же и пользователи Kubuntu, Xubuntu, Lubuntu и других систем, таких как LinuxMint, Runtu и д.р.
Интернет программы
sudo add-apt-repository ppa:chromium-daily/stable
wget https://dl.google.com/linux/direct/google-chrome-stable_current_i386.deb
sudo dpkg -i google-chrome-stable_current_i386.deb
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome-stable_current_amd64.deb
sudo add-apt-repository "deb http://deb.opera.com/opera/ stable non-free"
wget -O - http://deb.opera.com/archive.key | sudo apt-key add -
sudo add-apt-repository ppa:mozillateam/firefox-next
Twitter-клиент Hotot
Sudo add-apt-repository ppa:hotot-team
Это репозиторий замечательного твиттер клиента Turpial
sudo add-apt-repository ppa:effie-jayx/turpial
Мультимедиа
sudo add-apt-repository ppa:videolan/stable-daily
MPV (ответвление mplayer)
sudo add-apt-repository ppa:mc3man/mpv-tests
sudo add-apt-repository ppa:mc3man/trusty-media
Lightworks - мощная программа для монтажа теперь доступна под Ubuntu
VkAudioSaver: аудиоплеер для скачивания и прослушивания музыки из ВКонтакта
Pepperflash (замена flash-player для Chromium)
sudo add-apt-repository ppa:skunk/pepper-flash
sudo apt-get update && sudo apt-get install pepflashplugin-installer
После установки вам нужно указать Chromium, что нужно пользоваться Pepper Flash Player. Для этого отредактируйте файл запуска браузера. Введите следующую команду:
sudo gedit /etc/chromium-browser/default
И в самом конце файла вставьте следующую строчку:
./usr/lib/pepflashplugin-installer/pepflashplayer.sh
Cinelerra - видеоредактор
sudo add-apt-repository ppa:cinelerra-ppa/ppa
Аудиоплеер наподобие Winamp.
sudo add-apt-repository ppa:alexey-smirnov/deadbeef
Кодеры-декодеры
Mobile Media Converter
Простой интуитивно понятный интерфейс, множество поддерживаемых форматов.
Программа очень простая, мало настроек и предустановок.
sudo add-apt-repository ppa:paul-climbing/ppa
sudo apt-get install winff
sudo add-apt-repository ppa:nilarimogard/webupd8
sudo apt-get update
sudo apt-get install transmageddon
Skype Call Recorder
Запись звонков Skype. Программа кроссплатформенная.
sudo add-apt-repository ppa:dajhorn/skype-call-recorder
Запись экрана с множеством возможностей.
sudo add-apt-repository ppa:maarten-baert/simplescreenrecorder
sudo apt-get update
sudo apt-get install simplescreenrecorder
Драйвера
официальный репозиторий графических драйверов Intel
sudo add-apt-repository "deb https://download.01.org/gfx/ubuntu/14.04/main trusty"
sudo add-apt-repository ppa:ubuntu-x-swat/x-updates
Под различные ОС можно скачать .
sudo add-apt-repository ppa:alexx2000/doublecmd
Распознавание текста
GImageReader и Tesseract
sudo add-apt-repository ppa:gezakovacs/tesseract
sudo add-apt-repository ppa:sandromani/gimagereader
Cuneiform и Yagf
sudo add-apt-repository ppa:alex-p/notesalexp
Это репозиторий, в котором есть графическая оболочка для Cuneiform - программа Yagf. Служит для распознания текста в Linux.
Настройка
Ezame - новый редактор меню для Unity
sudo add-apt-repository ppa:caldas-lopes/ppa
sudo apt-get update
sudo apt-get install gksu ezame
sudo add-apt-repository ppa:tualatrix/ppa
Sudo add-apt-repository ppa:danielrichter2007/grub-customizer
Графическое приложение для конфигурации Grub/Burg, чтобы не копаться вручную в их многочисленных настройках в /etc.
Различные дополнения
Для самых крайних версий
sudo add-apt-repository ppa:kde3-maintainers/trinity-svn-nightly
Темы, иконки
sudo add-apt-repository ppa:tiheum/equinox
sudo apt-get install faenza-icon-theme faience-icon-theme faience-theme
sudo add-apt-repository ppa:noobslab/icons
sudo apt-get install awoken-icon-theme mint-x-icons malys-ex malys-uniblack malys-uniblue acyl-icons darkenza mac-x-lion-reloaded nitrux-icons meliaesvg-icons piratunbu-icons azenis-green-icons nouvegnome-color nouvegnome-gray fs-icons hi-lights-icons matrilineare
sudo add-apt-repository ppa:upubuntu-com/icons
sudo apt-get install azenis-icons betelgeuse-icons candy-icons faenk-icons gxiria-icons hilights-icons hydroxygen-icons kalahari-icons magog-white-icons mx-icons propheticon13 sphere-icons
Работа с текстом
Libreoffice
sudo add-apt-repository ppa:vincent-c/cherrytreeЭто репозиторий древовидного иерархического текстового редактора Cherry Tree.
sudo add-apt-repository ppa:pdfshuffler/ppa
Просмотрщик PDF
sudo add-apt-repository ppa:ed10vi86/ppa
sudo add-apt-repository ppa:pdfmod-team/ppa
sudo add-apt-repository ppa:mystic-mirage/komodo-edit
Графика
sudo add-apt-repository ppa:otto-kesselgulasch/gimp
Прочие
sudo add-apt-repository ppa:ubuntu-wine/ppa
sudo add-apt-repository ppa:stebbins/handbrake-releases
sudo add-apt-repository ppa:colingille/freshlight
sudo add-apt-repository ppa:chris-lea/node.js
Docky
sudo add-apt-repository ppa:docky-core/ppa
Java
sudo add-apt-repository ppa:webupd8team/java
SVN
sudo add-apt-repository ppa:svn/ppa
Список репозиториев ppa ubuntuupdates.org
Atareao Atareao |
Atom |
Banshee Team |
Brightbox Ruby NG Experimental |
Cairo-dock-team |
Canonical Kernel Team |
Canonical Partner |
Cassandra |
Chris Lea Nodejs |
Chromium Stable Channel |
Conky Companions |
Deluge-team |
Docker |
Docky |
Drizzle Developers |
Dropbox |
Ehoover Compholio Netflix |
EugeneSan |
Extras |
FerramRoberto VLC |
Firefox Aurora |
Flexiondotorg Java |
Flexiondotorg Shotwell |
FreeNX Stable |
FreeNX Testing |
Gdm2setup |
GetDeb Apps |
GetDeb Games |
Gloobus-dev Gloobus Preview |
Gnome 3 |
Gnome Shell |
Google Chrome |
Google Earth |
Google Music |
Google Stable Non Free |
Google Talk Plugin |
Google Testing Non Free |
Gwendal Le Bihan Dev Cinnamon Stable |
Handbrake releases |
Handbrake Snapshots |
Indicator-multiload daily |
Intel Linux Graphics |
KeePassX |
kernel-ppa |
Kubuntu-ppa Backports |
Kubuntu-ppa Beta |
Kubuntu Updates |
Lffl Wireshark |
LibreOffice |
Lucidbleed |
Mactel Support |
MariaDB 5.2 |
MariaDB 5.5 |
MariaDB Repo 5.2 |
Medibuntu Free |
Medibuntu Non Free |
Midori |
Mint Import |
Mint Main |
Mint upstream |
Mozilla Team Firefox Next |
Mozilla Team Firefox Stable |
Mozilla Team Thunderbird Stable |
Murrine Daily |
Mythtv 0.22 |
Mythtv 0.23 |
Mythtv 0.23.1 |
Mythtv 0.24 |
MythTV 0.25 |
MythTV 0.26 |
MythTV 0.27 |
MythTV 0.28 |
MythTV Testing |
nathan-renniewaldock ppa |
Nautilus Elementary |
Nginx |
Nvidia-vdpau |
Openshot-Edge |
Opera |
Percona Server with XtraDB |
Phablet Tools |
Phusion Passenger |
Pidgin |
Pipelight |
Pithos Daily |
Pitti Postgresql |
PlayOnLinux |
Postgresql |
Pratikmsinha ruby 1.9.2 |
Puppet repo |
Riak |
Scopes packagers |
Screenlets stable |
SevenMachines Flash |
Skype |
Spotify |
Sssup |
Repository commonly refers to a storage location, often for safety or preservation.
- Wikipedia
Вот как Википедия описывает репозиторий. Так уж случилось, что в отличие от некоторых других жаргонных словечек, с которыми мы имеем дело, этот термин прекрасно передает свою суть. Репозиторий представляет собой концепцию хранения коллекции для сущностей определенного типа.
Репозиторий как коллекция
Вероятно, наиболее важным отличием репозиториев является то, что они представляют собой коллекции объектов. Они не описывают хранение в базах данных или кэширование или решение любой другой технической проблемы. Репозитории представляют коллекции. Как вы храните эти коллекции - это просто деталь реализации.Я хочу внести ясность в этот вопрос. Репозиторий - это коллекция. Коллекция, которая содержит сущности и может фильтровать и возвращать результат обратно в зависимости от требований вашего приложения. Где и как он хранит эти объекты является ДЕТАЛЬЮ РЕАЛИЗАЦИИ.
В мире PHP мы привыкли к циклу запрос/ответ, который оканчивается смертью процесса. Все, что пришло извне и не сохранилось - ушло навсегда, в этой точке. Так вот, не все платформы работают именно так.
Хорошим способом понять как работают репозитории является представление вашего приложения постоянно работающим, в этом случае все объекты остаются в памяти. Вероятность критических сбоев и реакцию на них в этом эксперименте можно пренебречь. Представьте, что у вас есть Singleton-экземпляр репозитория для сущностей Member , MemberRepository .
Затем создайте новый объект Member и добавьте его в репозиторий. Позже, вы запросите у репозитория все элементы, хранящиеся в нем, таким образом вы получите коллекцию, которая содержит этот объект внутри. Возможно вы захотите получить какой-то конкретный объект по его ID, это также возможно. Очень легко представить себе, что внутри репозитория эти объекты хранятся в массиве или, что еще лучше, в объекте-коллекции.
Проще говоря, репозиторий - это особый вид надежных коллекций, которые вы будете использовать снова и снова, чтобы хранить и фильтровать сущности.
Взаимодействие с Репозиторием
Представьте, что мы создаем сущность Member . Мы приводим объект к необходимому состоянию, затем запрос заканчивается и объект исчезает. Пользователь пытается авторизоваться в нашем приложении и не может. Очевидно, что нам необходимо сделать этот объект доступным и для других частей приложения. $member = Member::register($email, $password);
$memberRepository->save($member);
Теперь мы можем получить доступ к объекту позже. Примерно так:
$member = $memberRepository->findByEmail($email);
// or
$members = $memberRepository->getAll();
Мы можем хранить объекты в одной части нашего приложения, а затем извлекать их из другой.
Должны ли репозитории создавать сущности?
Вы можете встретить такие примеры: $member = $memberRepository->create($email, $password);
Я видел множество аргументов приводящихся в пользу этого, но совершенно не заинтересован в подобном подходе.
Прежде всего, репозитории - это коллекции. Я не уверен в том, зачем коллекция должна быть коллекцией и фабрикой. Я слышал аргументы вроде «если обращаться удобнее так, то почему бы не повесить обработчик на подобные действия» ?
На мой взгляд, это анти-паттерн. Почему бы не позволить классу Member , иметь свое собственное понимание как и зачем создается объект или почему бы не сделать отдельную фабрику для создания более сложных объектов?
Если мы относимся к нашим репозиториям как к простым коллекциям, так значит и не нужно нагружать их лишним функционалом. Я не хочу классов коллекций, которые ведут себя как фабрики.
В чем выгода использования репозиториев?
Основное преимущество репозиториев - это абстрактный механизм хранения для коллекций сущностей.Предоставляя интерфейс MemberRepository мы развязываем руки разработчику, который уже сам решит как и где хранить данные.
Class ArrayMemberRepository implements MemberRepository { private $members = ; public function save(Member $member) { $this->members[(string)$member->getId()] = $member; } public function getAll() { return $this->members; } public function findById(MemberId $memberId) { if (isset($this->members[(string)$memberId])) { return $this->
Class RedisMemberRepository implements MemberRepository {
public function save(Member $member) {
// ...
}
// you get the point
}
Таким образом, большинство наших приложений знает только абстрактное понятие MemberRepository и его использование может быть отделено от фактической реализации. Это очень раскрепощает.
К чему относятся репозитории: Domain или Application Service Layer?
Итак, вот интересный вопрос. Во-первых, давайте определим, что Application Service Layer - это многоуровневая архитектура, которая отвечает за специфические детали реализации приложения, такие как целостность базы данных, и различные реализации работы с интернет-протоколами (отправка электронной почты, API) и др.Определим термин Domain Layer как слой многоуровневой архитектуры, которая отвечает за бизнес-правила и бизнес-логику.
Куда же попадет репозиторий при таком подходе?
Давайте посмотрим на нашем примере. Вот код, написанный ранее.
Class ArrayMemberRepository implements MemberRepository {
private $members = ;
public function save(Member $member) {
$this->members[(string) $member->getId()] = $member;
}
public function getAll() {
return $this->members;
}
public function findById(MemberId $memberId) {
if (isset($this->members[(string)$memberId])) {
return $this->members[(string)$memberId];
}
}
}
В этом примере я вижу много деталей реализации. Они, несомненно, должны входить в слой приложения
А теперь давайте удалим все детали реализации из этого класса…
Class ArrayMemberRepository implements MemberRepository {
public function save(Member $member) {
}
public function getAll() {
}
public function findById(MemberId $memberId) {
}
}
Хм… это начинает выглядеть знакомо… Что же мы забыли?
Возможно, получившийся код напоминает вам это?
Interface MemberRepository {
public function save(Member $member);
public function getAll();
public function findById(MemberId $memberId);
}
Это означает, что интерфейс находится на границе слоев. и на самом деле может содержать доменно-специфические концепты, но сама реализация не должна этого делать.
Интерфейсы репозиториев принадлежат к слою домена. Реализация же относятся к слою приложения. Это означает, что мы свободны при построении архитектуры на уровне доменного слоя без необходимости зависеть от слоя сервиса.
Свобода смены хранилищ данных
Всякий раз, когда вы слышите чей-то разговор о концепции объектно-ориентированного дизайна, вы, наверное, могли слышать что-то вроде "… и у вас есть возможность поменять одну реализацию хранения данных на другую в будущем..."По-моему, это не совсем правда… я бы даже сказал, что это очень плохой аргумент. Самой большой проблемой объяснения концепции репозиториев является то, что сразу напрашивается вопрос «вы действительно хотите это делать?» . Я НЕ хочу чтобы подобные вопросы влияли на использование паттерна репозитория.
Любое достаточно хорошо спроектированное объектно-ориентированное приложение автоматически подходит под приведенное преемущество. Центральной концепцией ООП является инкапсуляция. Вы можете предоставить доступ к API и скрыть реализацию.
Ведь вы же на самом деле не будете переключаться с одного ORM на другой и обратно. Но даже если вы захотите так делать, то, по крайней мере, у вас будет возможность сделать это. Однако, замена реализации репозитория будет огромным плюсом при тестировании.
Тестирование при использовании паттерна «Репозиторий»
Ну, тут все просто. Давайте предположим, что у вас есть объект, который обрабатывает что-то вроде регистрации участников…Class RegisterMemberHandler {
private $members;
public function __construct(MemberRepository $members) {
$this->members = $members;
}
public function handle(RegisterMember $command) {
$member = Member::register($command->email, $command->password);
$this->members->save($member);
}
}
Во время очередной операции, я могу взять экземпляр DoctrineMemberRepository . Однако, во время тестирования легко можно заменить его на экземпляр ArrayMemberRepository. Они оба реализуют один и тот же интерфейс.
Упрощенный пример теста может выглядеть примерно так…
$repo = new ArrayMemberRepository;
$handler = new RegisterMemberHandler($repo);
$request = $this->createRequest(["email" => "[email protected]", "password" => "angelofdestruction"]);
$handler->handle(RegisterMember::usingForm($request));
AssertCount(1, $repo->findByEmail("[email protected]"));
В этом примере мы тестируем обработчик. Нам не нужно проверять корректность хранения данных репозитория в БД (или еще где). Мы тестируем конкретное поведение этого объекта: регистрируем пользователя на основе данных формы, а затем передаем их в репозиторий.
Коллекция или Состояние
В книге Implementing Domain-Driven Design Vaughn Vernon делает различие между типами репозиториев. Идея коллекцио-ориентированного репозитория (ориг. - collection-oriented repository) в том, что работа с репозиторием идет в памяти, как с массивом. Репозиторий, ориентированный на хранение состояний (ориг. - persistence-oriented repository) содержит в себе идею, что в нем будет какая-то более глубокая и продуманная система хранения. По сути различия лишь в названиях. // collection-oriented
$memberRepository->add($member);
// vs persistence-oriented
$memberRepository->save($member);
Замечу, что это лишь мое мнение и пока что я придерживаюсь именно его в вопросах использования репозиториев. Однако, хотел бы предупредить, что возможно могу передумать. В конце-концов, я сосредотачиваюсь на них как на коллекциях объектов с теми же обязанностями, что и у любого другого объекта-коллекции.
Дополнительная информация
создал проект на Github о репозиториях на который, безусловно, стоит посмотреть. Внутри вы найдете примеры работы с хранением в памяти и файлах.Итоги
Я считаю, что…- … важно дать репозиториям сингулярную задачу функционировать как коллекция объектов.
- … мы не должны использовать репозитории для создания новых экземпляров объектов.
- … мы должны избегать использования репозиториев как способа перехода от одной технологии к другой, так как они имеют очень много преимуществ, от которых трудно отказаться.
Если у вас есть вопросы или если ваше мнение отличается от моего, пожалуйста, пишите комментарии ниже.
Как всегда, я намерен обновлять статью, чтобы синхронизировать ее с моим текущим мнением.
Концепция установки программного обеспечения в Linux очень сильно отличается от Windows. Здесь тоже можно скачать программу на просторах интернета и просто запустить, ничего не устанавливая, но никто так не делает. Программы устанавливаются из надежных источников - официальных репозиториев поддерживаемых и обновляемых разработчиками дистрибутива или сообществом пользователей. Если в двух словах, то репозитории - это такие большие сборники программ, в котором они хранятся в специальном формате и могут быть автоматически скачены и установлены менеджером пакетов.
В одной из своих предыдущих статей я рассмотрел . В этой статье мы рассмотрим репозитории в Ubuntu более глобально, будет рассмотрена настройка репозиториев Ubuntu, поговорим какими они бывают, где хранятся, как добавлять и удалять репозитории.
В основном репозитории Ubuntu можно поделить на два типа - официальные и репозитории сторонних разработчиков. В официальных репозиториях находятся только стабильные программы, причем их версии не будут обновляться, они могут получать только обновления безопасности. Сторонние репозитории ubuntu могут создаваться кем угодно и их автор может обновлять и добавлять программное обеспечение в репозиторий когда нужно. PPA репозитории Ubuntu созданы с целью упростить процесс создания сторонних репозиториев.
Каждый репозиторий поддерживает несколько веток. Первая группа веток - это версия дистрибутива. Для каждой версии дистрибутива - отдельное программное обеспечение.
Вторая группа веток более интересная. Дело в том что в Ubuntu есть несколько веток для различного рода программного обеспечения:
- Main - основная ветка - стабильное официально поддерживаемое Canonical ПО
- Restricted - официально поддерживаемое ПО распространяемое не под лицензией GPL
- Universe - программы, поддерживаемые сообществом Ubuntu
- Multiverse - ветка проприетарного программного обеспечения
Такой структуры придерживаются официальные репозитории, сторонние ppa могут же иметь другую структуру или просто ветку main.
Также репозитории можно поделить еще на два типа - репозитории с бинарными файлами - готовыми собранными пакетами, и репозитории исходного кода, откуда можно скачать исходный код программ и собрать его на своем компьютере.
Настройка репозиториев в Ubuntu
Настройки репозиториев Ubuntu находятся в нескольких файлах в каталоге /etc/apt.
Все официальные репозитории записываются в файл репозиториев Ubuntu - /etc/apt/sources.list. Для каждого PPA репозитория создается отдельный файл в каталоге /etc/apt/sources.list.d/*
Таким образом, вы уже знаете как примитивным способом посмотреть список репозиториев в Ubuntu. По сути, уже можно открыть этот файл и добавить репозиторий Ubuntu прямо туда в конец файла, но для таких действий в системе есть специальные инструменты и далее мы их рассмотрим.
Настройка репозиториев в GUI
Управление репозиториями можно осуществлять с помощью утилиты настроек системы. Запустите Настройки системы, затем откройте Программы и обновления или сразу же запустите Программы и обновления из меню Dash:
На первой вкладке вы можете включить или отключить ветки официальных репозиториев (main, restricted ...), а также выбрать ближайшее к вам зеркало:
Для добавления репозитория в Ubuntu перейдите на вкладку другое ПО на этой вкладке вы можете видеть весь список репозиториев Ubuntu которые были подключены к системе:
Чтобы иметь доступ к дополнительным программам рекомендуется подключить сторонний репозиторий партнеров Canonical. Для этого просто поставьте напротив него галочку.
Для добавления репозитория Ubuntu нажмите кнопку Добавить :
Здесь в единственном поле нужно ввести apt строку репозитория и нажать кнопку добавить источник .
Apt строка репозитория имеет такой синтаксис:
deb http://адрес_репозитория версия_дистрибутива ветки
Например:
deb http://ua.archive.ubuntu.com/ubuntu/ xenial main restricted
deb https://apt-mo.trafficmanager.net/repos/dotnet/ trusty main
Первая строка - официальный репозиторий, вторая - PPA репозиторий ubuntu. Как видите, выглядят они одинаково. С версией дистрибутива все понятно, это кодовое имя, с веткой тоже - это main. А вот где брать адрес? Это уже ваше дело, вы можете искать репозитории где угодно, на форумах, в поисковых системах или в нашей статье, где собран список лучших репозиториев.
Установка репозитория Ubuntu завершена и он появился в списке. Чтобы его отключить достаточно просто снять галочку. А чтобы удалить репозиторий Ubuntu нажмите кнопку удалить :
Для сторонних репозиториев необходимо импортировать GPG ключ для правильной работы в системе, если ключ не добавить, то во время обновления репозиториев Ubuntu apt выдаст ошибку проверки подписи. Это делается, чтобы никто не мог подменить пакеты и вы не установили вирусов. Перейдите на вкладку Аутентификация, затем выберите импортировать ключ из файла :
Как правило, в описании репозитория, если для него требуется ключ, указана ссылка где его можно скачать. Скачать ключ можно с помощью браузера, или консольной утилитой wget, например:
wget http://keyserver.ubuntu.com:11371/pks/lookup?op=get&search=0xFC6D7D9D009ED615
Удалять ключи также можно кнопкой удалить:
Если вы запутались и не знаете как вернуть состояние по умолчанию можно просто нажать кнопку восстановить чтобывосстановитьрепозитории Ubuntu:
Если были добавлены новые репозитории, при выходе программа предложит выполнить обновление репозиториев Ubuntu, это нужно чтобы загрузить списки пакетов из только что подключенных источников. Также обновление можно выполнить через терминал, но об этом ниже.
Настройка репозиториев Ubuntu PPA
PPA репозитории Ubuntu находятся на сайте, созданном Canonical - launchpad.net. Ubuntu способна автоматически различать, находить apt строку и скачивать GPG ключи для таких репозиториев. Достаточно указать адрес ppa вместо apt сроки при добавлении репозитория в Ubuntu, например:
На самом деле PPA репозитории такие, же как и обычные репозитории. Если вы хотите добавить репозиторий вручную, вы можете узнать apt строку и ключ, раскрыв спойлер Technical details about this PPA на странице описания репозитория:
Теперь его можно добавить в систему, так же как описано выше.
Добавление репозиториев в Ubuntu из терминала
Во многих инструкциях мы видим команды для подключения репозитория в Ubuntu через терминал. Действительно, это немного удобнее чем запускать утилиту, загружать ключи и делать все мышкой. Чтобы добавить репозиторий Ubuntu через терминал используйте команду: apt-add-repository:
sudo apt-add-repository "deb http://ppa.launchpad.net/shutter/ppa/ubuntu wily main"
В кавычках указана apt строка репозитория. Также можно просто добавить строчку в /etc/apt/sources.list:
echo "deb http://ppa.launchpad.net/shutter/ppa/ubuntu wily main" >> /etc/apt/sources.list
Для добавления ключей безопасности GPG существует команда apt-key. Вы можете добавить ключ из файла, или скачать ключ с помощью curl и перенаправить ее вывод и apt-key:
curl -L http://debian.datastax.com/debian/repo_key | sudo apt-key add
Добавить репозиторий в Ubuntu через терминал намного проще чем в графическом интерфейсе.
Как удалить репозиторий в Ubuntu
Удалить репозиторий Ubuntu через терминал можно той же командой с опцией remove:
sudo apt-add-repository --repository "deb http://ppa.launchpad.net/shutter/ppa/ubuntu wily main"
Или же просто закомментировать deb строку в файле /etc/apt/sources.list или в одном из файлов /etc/apt/sources.list.d/*.
Добавление репозитория PPA в Ubuntu
Добавить репозиторий PPA в Ubuntu можно той же командой. Как я уже говорил система автоматически распознает репозиторий и скачает нужные ключи. Формат записи такой:
sudo apt-add-repository ppa:репозиторий/ppa
Например:
sudo apt-add-repository ppa:shutter/ppa
Как удалить репозиторий PPA в Ubuntu
Удалить репозиторий в Ubuntu можно такой же командой, как и в предыдущем примере.