Plan 9 от Bell Labs — это распределенная операционная система , созданная в Центре компьютерных исследований (CSRC) Bell Labs в середине 1980-х годов и построенная на концепциях UNIX , впервые разработанных там в конце 1960-х годов. С 2000 года Plan 9 является бесплатным и имеет открытый исходный код . Последний официальный релиз состоялся в начале 2015 года.
В Плане 9 метафора UNIX « все есть файл» расширена за счет повсеместной сетецентрической файловой системы , а терминальный ввод-вывод с адресацией курсора , лежащий в основе UNIX -подобных операционных систем, заменяется оконной системой и графическим пользовательским интерфейсом . интерфейс без адресации курсора, хотя rc , оболочка Plan 9 , является текстовой.
Название «План 9» от Bell Labs является отсылкой к культовому научно-фантастическому Z-фильму Эда Вуда 1957 года «План 9 из космоса» . [17] Система продолжает использоваться и разрабатываться исследователями операционных систем и любителями. [18] [19]
Plan 9 от Bell Labs первоначально разрабатывался, начиная с конца 1980-х годов, [19] членами Научно-исследовательского центра вычислительной техники Bell Labs, той же группы, которая первоначально разработала Unix и язык программирования C. [20] Команду Plan 9 первоначально возглавляли Роб Пайк , Кен Томпсон , Дэйв Пресотто и Фил Уинтерботтом при поддержке Денниса Ритчи в качестве главы отдела исследований вычислительных технологий. За прошедшие годы в проект внесли свой вклад многие известные разработчики, в том числе Брайан Керниган , Том Дафф , Дуг МакИлрой , Бьерн Страуструп и Брюс Эллис . [21]
Plan 9 заменил Unix в качестве основной платформы Bell Labs для исследования операционных систем. [22] Было исследовано несколько изменений в исходной модели Unix, которые облегчают использование и программирование системы, особенно в распределенных многопользовательских средах. После нескольких лет разработки и внутреннего использования Bell Labs отправила операционную систему университетам в 1992 году. Три года спустя Plan 9 был предоставлен коммерческим сторонам компанией AT&T через книжное издательство Harcourt Brace . Поскольку исходные лицензии стоили 350 долларов, AT&T ориентировалась на рынок встраиваемых систем, а не на рынок компьютеров в целом. Ричи отметил, что разработчики не ожидали «большого смещения», учитывая, насколько прочными стали другие операционные системы. [23]
К началу 1996 года проект Plan 9 был «отложен на второй план» AT&T в пользу Inferno , призванного стать конкурентом Java - платформы Sun Microsystems . [24] В конце 1990-х годов новый владелец Bell Labs Lucent Technologies прекратил коммерческую поддержку проекта, и в 2000 году третий выпуск был распространен под лицензией с открытым исходным кодом . [25] Четвертый выпуск по новой лицензии на бесплатное программное обеспечение произошел в 2002 году. [26] В начале 2015 года вышел последний официальный выпуск Plan 9. [25]
Сообщество пользователей и разработчиков, включая нынешних и бывших сотрудников Bell Labs , выпускало небольшие ежедневные выпуски в виде ISO-образов . Bell Labs принимала разработку. [27] Дерево исходного кода разработки доступно по протоколам 9P и HTTP и используется для обновления существующих установок. [28] В дополнение к официальным компонентам ОС, включенным в ISO, Bell Labs также размещает репозиторий приложений и инструментов сторонней разработки. [29]
Поскольку в последние годы Bell Labs перешла к более поздним проектам, разработка официальной системы Plan 9 остановилась. 23 марта 2021 года разработка возобновилась после передачи авторских прав от Bell Labs Plan 9 Foundation. [10] [30] [31] Неофициальная разработка системы также продолжается в форке 9front, где активные участники предоставляют ежемесячные сборки и новые функциональные возможности. На данный момент вилка 9front предоставляет системные драйверы Wi-Fi , аудиодрайверы, поддержку USB и встроенный игровой эмулятор, а также другие функции. [32] [33] Другие недавние операционные системы, вдохновленные Plan 9, включают Harvey OS [34] и Jehanne OS. [35]
План 9 от Bell Labs похож на квакеров : он отличается упором на «Внутренний свет», отличается простотой жизни, в частности ясностью речи. Как и квакеры, «План 9» не занимается прозелитизмом.
—Сапе Дж. Мюлендер, Пьер Дж. Янсен.
Реальное время в реальной операционной системе [37]
Plan 9 — это распределенная операционная система , созданная для того, чтобы сеть разнородных и географически разделенных компьютеров функционировала как единая система. [38] В типичной установке Plan 9 пользователи работают на терминалах под управлением оконной системы rio и получают доступ к серверам ЦП, которые обрабатывают интенсивные вычисления. Постоянное хранение данных обеспечивается дополнительными сетевыми узлами, выступающими в роли файловых серверов и архивного хранилища. [39]
Его дизайнеры заявляют, что
[t]Основа системы построена на двух идеях: пространстве имен для каждого процесса и простом протоколе файловой системы, ориентированном на сообщения.
- Пайк и др. [40]
Первая идея (пространство имен для каждого процесса) означает, что, в отличие от большинства операционных систем, каждый процесс (запущенные программы) имеет свое собственное представление пространства имен , соответствующее тому, что другие операционные системы называют файловой системой; одно имя пути может относиться к разным ресурсам для разных процессов. Потенциальная сложность этой установки контролируется набором обычных мест размещения общих ресурсов. [41] [42]
Вторая идея (файловая система, ориентированная на сообщения) означает, что процессы могут предлагать свои услуги другим процессам, предоставляя виртуальные файлы, которые появляются в пространстве имен других процессов. Ввод /вывод клиентского процесса в таком файле становится межпроцессным взаимодействием между двумя процессами. Таким образом, Plan 9 обобщает представление Unix о файловой системе как центральной точке доступа к вычислительным ресурсам. Он переносит идею Unix о файлах устройств для обеспечения доступа к периферийным устройствам ( мышям , съемным носителям и т. д.) и возможность монтировать файловые системы, находящиеся в физически различных файловых системах, в иерархическое пространство имен, но добавляет возможность монтировать соединение с сервером. программа, которая использует стандартизированный протокол и рассматривает свои службы как часть пространства имен.
Например, первоначальная оконная система под названием 8½ использовала эти возможности следующим образом. Plan 9 представляет пользовательский интерфейс терминала посредством трех псевдофайлов: mouse , который может быть прочитан программой для получения уведомлений о движениях мыши и нажатиях кнопок, cons , который может использоваться для выполнения текстового ввода/вывода, и bitblt , запись в который выполняет графические операции (см. бит blit ). Оконная система мультиплексирует эти устройства: при создании нового окна для запуска какой-либо программы она сначала устанавливает новое пространство имен, в котором mouse , cons и bitblt подключаются к ней, скрывая фактические файлы устройств, к которым она сама имеет доступ. Таким образом, оконная система получает все команды ввода и вывода из программы и обрабатывает их соответствующим образом, отправляя вывод на фактическое экранное устройство и предоставляя текущей программе ввод с клавиатуры и мыши. [39] Программе не обязательно знать, взаимодействует ли она напрямую с драйверами устройств операционной системы или с оконной системой; ему нужно только предположить, что его пространство имен настроено так, чтобы эти специальные файлы предоставляли тот тип входных данных и принимали тот тип сообщений, который он ожидает.
Распределенная работа Plan 9 также опирается на пространства имен каждого процесса, позволяя процессам клиента и сервера взаимодействовать между машинами только что описанным способом. Например, команда cpu запускает удаленный сеанс на вычислительном сервере. Команда экспортирует часть своего локального пространства имен, включая устройства пользовательского терминала ( мышь , cons , bitblt ), на сервер, чтобы удаленные программы могли выполнять ввод/вывод с использованием мыши, клавиатуры и дисплея терминала, сочетая эффекты удаленного входа в систему. и общая сетевая файловая система. [39] [40]
Все программы, которые хотят предоставлять услуги в виде файлов другим программам, используют единый протокол, называемый 9P. По сравнению с другими системами это уменьшает количество пользовательских интерфейсов программирования . 9P — это универсальный, независимый от среды, байт-ориентированный протокол, который обеспечивает доставку сообщений между сервером и клиентом. [43] Протокол используется для обращения к процессам, программам и данным и связи с ними, включая как пользовательский интерфейс, так и сеть. [44] С выпуском 4-го издания оно было изменено и переименовано в 9P2000. [26]
В отличие от большинства других операционных систем, Plan 9 не предоставляет специальных интерфейсов прикладного программирования (таких как сокеты Беркли , ресурсы X или системные вызовы ioctl ) для доступа к устройствам. [43] Вместо этого драйверы устройств Plan 9 реализуют свой интерфейс управления в виде файловой системы, так что к аппаратному обеспечению можно получить доступ с помощью обычных операций ввода-вывода файлов, чтения и записи . Следовательно, совместное использование устройства в сети можно выполнить путем монтирования соответствующего дерева каталогов на целевой компьютер. [17]
Plan 9 позволяет пользователю собирать файлы (называемые именами ) из разных деревьев каталогов в одном месте. Результирующий объединенный каталог ведет себя как объединение базовых каталогов (порядком объединения можно управлять); если составляющие каталоги содержат файлы с одинаковыми именами, список объединенного каталога ( ls или lc ) просто сообщит о повторяющихся именах. [45] Разрешение одного имени пути выполняется сверху вниз: если каталоги top и low объединены в u , причем сначала top , то u/name обозначает top/name , если оно существует, low/name, только если оно существует, и top. /имя не существует и файл отсутствует, если он не существует. Рекурсивное объединение подкаталогов не выполняется, поэтому, если верхний/подкаталог существует, файлы в нижнем/подкаталоге недоступны через объединение. [46]
Каталог объединения можно создать с помощью команды привязки :
; привязать /arm/bin /bin; привязать -a /acme/bin/arm /bin; привязать -b /usr/алиса/bin /bin
В приведенном выше примере /arm/bin монтируется в /bin , содержимое /arm/bin заменяет предыдущее содержимое /bin . Каталог bin Acme затем монтируется с объединением после /bin , а личный каталог bin Алисы монтируется с объединением до этого. Когда файл запрашивается из /bin , он сначала ищется в /usr/alice/bin , затем в /arm/bin и, наконец, в /acme/bin/arm .
Таким образом, отдельные пространства имен процессов обычно заменяют понятие пути поиска в оболочке. Переменная среды пути ( $path
) все еще существует в оболочке rc (оболочка, в основном используемая в Plan 9); однако переменная среды пути rc обычно содержит только каталоги /bin
и .
, и изменение этой переменной не рекомендуется, вместо этого добавление дополнительных команд должно выполняться путем связывания нескольких каталогов в один файл /bin
. [47] [39] В отличие от Плана 9, переменная среды пути оболочки Unix должна быть установлена так, чтобы включать дополнительные каталоги, исполняемые файлы которых необходимо добавлять в качестве команд.
Более того, ядро может хранить отдельные таблицы монтирования для каждого процесса [37] и, таким образом, может предоставить каждому процессу собственное пространство имен файловой системы . Пространства имен процессов могут создаваться независимо, и пользователь может работать одновременно с программами, имеющими разнородные пространства имен. [40] Пространства имен можно использовать для создания изолированной среды, аналогичной chroot , но более безопасным способом. [43]
Архитектура объединения каталогов Plan 9 вдохновила реализации объединенных файловых систем 4.4BSD и Linux , [45] хотя разработчики средства монтирования объединения BSD сочли нерекурсивное объединение каталогов в Plan 9 «слишком ограничительным для общего использования». [46]
Вместо системных вызовов, предназначенных специально для управления процессами , Plan 9 предоставляет файловую систему /proc . Каждый процесс выглядит как каталог, содержащий файлы информации и управления, которыми можно манипулировать с помощью обычных системных вызовов файлового ввода-вывода. [8]
Подход к файловой системе позволяет управлять процессами Plan 9 с помощью простых инструментов управления файлами, таких как ls и cat ; однако процессы нельзя копировать и перемещать как файлы. [8]
В Plan 9 нет специализированных системных вызовов или ioctls для доступа к сетевому стеку или сетевому оборудованию. Вместо этого используется файловая система /net . Сетевые соединения контролируются путем чтения и записи управляющих сообщений в управляющие файлы. Подкаталоги, такие как /net/tcp и /net/udp, используются в качестве интерфейса для соответствующих протоколов. [8]
Чтобы упростить управление кодировками символов , Plan 9 использует Unicode во всей системе. Первоначальной реализацией Unicode был ISO/IEC 10646-1:1993 . Кен Томпсон изобрел UTF-8, которая стала родной кодировкой в Plan 9. Вся система была преобразована для общего использования в 1992 году. [49] UTF-8 сохраняет обратную совместимость с традиционными строками с нулевым завершением , обеспечивая более надежную обработку информации и объединение многоязычных строковых данных с помощью каналов Unix между несколькими процессами. Использование единой кодировки UTF-8 с символами для всех культур и регионов устраняет необходимость переключения между наборами кодов. [50]
Хотя концепции дизайна «Плана 9» интересны сами по себе, они должны были быть наиболее полезными в сочетании. Например, для реализации сервера трансляции сетевых адресов (NAT) можно создать объединенный каталог, перекрывая дерево каталогов /net маршрутизатора собственным каталогом /net . Аналогично, виртуальная частная сеть (VPN) может быть реализована путем наложения в каталоге объединения иерархии /net с удаленного шлюза с использованием защищенного 9P через общедоступный Интернет. Каталог объединения с иерархией /net и фильтрами можно использовать для изоляции ненадежных приложений или для реализации брандмауэра . [43] Таким же образом, распределенная вычислительная сеть может быть составлена с помощью каталога объединения иерархий /proc с удаленных хостов, что позволяет взаимодействовать с ними, как если бы они были локальными.
При совместном использовании эти функции позволяют собрать сложную распределенную вычислительную среду путем повторного использования существующей иерархической системы имен. [8]
Благодаря конструкции системы большинство задач в Plan 9 можно выполнить с помощью утилит ls , cat , grep , cp и rm в сочетании с оболочкой rc (оболочка Plan 9 по умолчанию).
Factotum — это сервер аутентификации и управления ключами для Plan 9. Он обрабатывает аутентификацию от имени других программ, поэтому как секретные ключи , так и детали реализации должны быть известны только Factotum. [51]
В отличие от Unix , Plan 9 был разработан с учетом графики. [44] После загрузки терминал Plan 9 запустит оконную систему rio , в которой пользователь может создавать новые окна, отображающие rc . [52] Графические программы, вызываемые из этой оболочки, заменяют ее в ее окне.
Сантехник обеспечивает механизм межпроцессного взаимодействия , который обеспечивает общесистемные гиперссылки.
Sam и acme — текстовые редакторы Plan 9. [53]
Plan 9 поддерживает файловые системы Kfs, Paq, Cwfs, FAT и Fossil . Последний был разработан в Bell Labs специально для Plan 9 и обеспечивает возможность хранения моментальных снимков. Его можно использовать непосредственно с жестким диском или использовать с Venti , архивной файловой системой и системой постоянного хранения данных.
В дистрибутив Plan 9 входят специальные варианты компилятора и языки программирования, а также специальный набор библиотек, а также оконная система пользовательского интерфейса , специфичная для Plan 9. [54] Основная часть системы написана на диалекте C ( ANSI) . C с некоторыми расширениями и некоторыми другими функциями, опущенными). Компиляторы этого языка были созданы специально с учетом переносимости; по словам их автора, они «быстро компилируются, медленно загружаются и создают объектный код среднего качества». [55]
Язык параллельного программирования под названием Alef был доступен в первых двух редакциях, но затем был исключен из соображений обслуживания и заменен библиотекой потоков для C. [56] [57]
Хотя Plan 9 должен был стать дальнейшим развитием концепций Unix, совместимость с ранее существовавшим программным обеспечением Unix никогда не была целью проекта. Многие утилиты командной строки Plan 9 имеют те же имена, что и аналоги Unix, но работают по-другому. [48]
Plan 9 может поддерживать приложения POSIX и эмулировать интерфейс сокетов Беркли через среду ANSI/POSIX (APE), которая реализует интерфейс , близкий к ANSI C и POSIX , с некоторыми общими расширениями (собственные интерфейсы Plan 9 C не соответствуют ни одному стандарту). Он также включает POSIX-совместимую оболочку. Авторы APE утверждают, что использовали его для портирования X Window System (X11) на Plan 9, хотя они не выпускают X11, «потому что его правильная поддержка — слишком большая работа». [58] Некоторые двоичные файлы Linux можно использовать с помощью приложения «linuxemu» (эмулятор Linux); однако работа над этим все еще продолжается. [59] И наоборот, виртуальная машина Vx32 позволяет слегка модифицированному ядру Plan 9 работать в качестве пользовательского процесса в Linux, поддерживая немодифицированные программы Plan 9. [60]
В 1991 году разработчики Plan 9 сравнили свою систему с другими операционными системами начала девяностых по размеру, показав, что исходный код минимальной («работающей, хотя и не очень полезной») версии был менее чем в пять раз меньше Mach . микроядро без каких-либо драйверов устройств (5899 или 4622 строки кода для Plan 9, в зависимости от метрики, против 25530 строк). Полное ядро состояло из 18 000 строк кода. [39] (По подсчетам 2006 года, ядро насчитывало тогда около 150 000 строк, но для сравнения это было более чем 4,8 миллионами в Linux . [43] )
В сообществе исследователей операционных систем, а также в коммерческом мире Unix одновременно с разработкой Plan 9 предпринимались и другие попытки реализовать распределенные вычисления и удаленный доступ к файловой системе. К ним относятся сетевая файловая система и связанная с ней архитектура vnode , разработанная в Sun Microsystems , а также более радикальные отклонения от модели Unix, такие как ОС Sprite от Калифорнийского университета в Беркли . Разработчик Sprite Брент Уэлч отмечает, что архитектура SunOS vnode ограничена по сравнению с возможностями Plan 9, поскольку она не поддерживает удаленный доступ к устройствам и удаленное межпроцессное взаимодействие, хотя могла бы, имея ранее существовавшие сокеты домена UNIX (которые « по существу может использоваться для именования серверов уровня пользователя») был интегрирован с архитектурой vnode. [41]
В одном из критических замечаний по поводу схемы Plan 9 «все есть файл» и обмена текстовыми сообщениями были отмечены ограничения этой парадигмы по сравнению с типизированными интерфейсами объектно -ориентированной операционной системы Sun Spring :
Plan 9 заставляет все выглядеть как файл. В большинстве случаев реальный тип интерфейса включает протокол сообщений, которые должны быть записаны и прочитаны из файлового дескриптора. Это сложно указать и документировать, и вообще запрещается любая автоматическая проверка типов , за исключением ошибок файлов во время выполнения. (...) [A] путь относительно неявного корневого контекста процесса — единственный способ назвать службу. Привязку имени к объекту можно выполнить только путем присвоения существующего имени объекта в том же контексте, что и новое имя. Таким образом, ссылки на интерфейсы просто не могут передаваться между процессами, а тем более через сети. Вместо этого коммуникация должна основываться на соглашениях, которые подвержены ошибкам и не масштабируются.
— Роско; акцент в оригинале. [61]
Более позднее ретроспективное сравнение Plan 9, Sprite и третьей современной распределенной исследовательской операционной системы Amoeba показало, что
среды, которые они [Amoeba и Sprite] создают, тесно связаны с ОС, что затрудняет взаимодействие с внешними сервисами. Такие системы страдают от радикального отхода от модели UNIX, что также препятствует переносу уже существующего программного обеспечения на платформу (...). Отсутствие разработчиков, очень небольшой диапазон поддерживаемого оборудования и небольшая, даже по сравнению с Plan 9, база пользователей также значительно замедлили внедрение этих систем (...). Оглядываясь назад, можно сказать, что Plan 9 была единственной исследовательской распределенной ОС того времени, которой удалось привлечь разработчиков и использоваться в коммерческих проектах достаточно долго, чтобы гарантировать ее выживание по сей день.
- Мирчовский, Симмондс и Миннич [62]
План 9 продемонстрировал, что интегральная концепция Unix — что каждый системный интерфейс может быть представлен как набор файлов — может быть успешно реализована в современной распределенной системе. [52] Некоторые функции Plan 9, такие как кодировка символов UTF-8 Unicode, были реализованы в других операционных системах. Unix-подобные операционные системы, такие как Linux, реализовали 9P2000, протокол Plan 9 для доступа к удаленным файлам, и приняли функции rfork , механизма создания процессов Plan 9. [64] Кроме того, в Plan 9 from User Space несколько приложений и инструментов Plan 9, включая редакторы sam и acme, были портированы на системы Unix и Linux и достигли определенного уровня популярности. Несколько проектов направлены на замену программ операционной системы GNU , окружающих ядро Linux, программами операционной системы Plan 9. [65] [66] Оконный менеджер 9wm был вдохновлен 8½ , старой оконной системой Plan 9; [67] На wmii также сильно повлиял Plan 9. [63] В исследованиях в области информатики Plan 9 использовался в качестве платформы для грид-вычислений [68] [62] и как средство исследования повсеместных вычислений без промежуточного программного обеспечения . [69] В коммерции Plan 9 лежит в основе систем хранения данных Coraid . Однако Plan 9 никогда не приближался по популярности к Unix и был в первую очередь исследовательским инструментом:
[Похоже, что План 9 провалился просто потому, что он не смог стать достаточно убедительным улучшением Unix, чтобы вытеснить своего предка. По сравнению с Plan 9, Unix скрипит, лязгает и имеет явные пятна ржавчины, но справляется со своей задачей достаточно хорошо, чтобы удерживать свою позицию. Здесь есть урок для амбициозных системных архитекторов: самый опасный враг лучшего решения — это существующая достаточно хорошая кодовая база.
- Эрик С. Рэймонд [17]
Другие факторы, которые способствовали низкому внедрению Plan 9, включают отсутствие коммерческого резервного копирования, небольшое количество приложений для конечных пользователей и отсутствие драйверов устройств . [52] [53]
Сторонники и разработчики Plan 9 заявляют, что проблемы, препятствующие его внедрению, решены, что его первоначальные цели как распределенной системы, среды разработки и исследовательской платформы достигнуты и что он пользуется умеренной, но растущей популярностью. [ нужна цитата ] Inferno , благодаря своим размещенным возможностям, был средством переноса технологий Plan 9 в другие системы в качестве размещенной части гетерогенных вычислительных сетей. [70] [71] [72]
Несколько проектов работают над расширением Плана 9, включая 9atom и 9front. Эти форки дополняют Plan 9 дополнительными драйверами оборудования и программным обеспечением, включая улучшенную версию системы электронной почты Upas , компилятор Go , поддержку системы контроля версий Mercurial (а теперь и реализацию git) и других программ. [19] [73] Plan 9 был портирован на одноплатный компьютер Raspberry Pi . [74] [75] Проект Harvey пытается заменить специальный компилятор Plan 9 C на GCC , чтобы использовать современные инструменты разработки, такие как GitHub и Coverity , и ускорить разработку. [76]
Начиная с Windows 10 версии 1903 , подсистема Windows для Linux реализует протокол файловой системы Plan 9 в качестве сервера, а хостовая операционная система Windows выступает в качестве клиента. [77]
Начиная с выпуска четвертого издания в апреле 2002 года [26] полный исходный код Plan 9 от Bell Labs доступен бесплатно по лицензии Lucent Public License 1.02, которая считается лицензией с открытым исходным кодом Инициативой открытого исходного кода (OSI). ), лицензию на бесплатное программное обеспечение , выданную Фондом свободного программного обеспечения , и она соответствует Руководству по свободному программному обеспечению Debian . [43]
В феврале 2014 года Калифорнийский университет в Беркли разрешил нынешнему владельцу авторских прав на Plan 9 — Alcatel-Lucent — выпустить все программное обеспечение Plan 9, ранее регулируемое Общественной лицензией Lucent, версия 1.02, только под лицензией GPL-2.0 . [92]
23 марта 2021 года право собственности на Plan 9 перешло от Bell Labs к Plan 9 Foundation, [93] и все предыдущие выпуски были повторно лицензированы на лицензию MIT . [10]
Сб, 10 января, 04:04:55 EST 2015 ... plan9.iso.bz2
Калифорнийский университет в Беркли получил от Alcatel-Lucent разрешение на выпуск всего программного обеспечения Plan 9, ранее регулируемого Общественной лицензией Lucent версии 1.02, в рамках Стандартной общественной лицензии GNU версии 2.
{{cite book}}
: |work=
игнорируется ( помощь ) (PDF);[wmii] имеет интерфейс файловой системы 9p и поддерживает классическое и мозаичное (acme-подобное) управление окнами.
9wm — это оконный менеджер X, который пытается имитировать оконный менеджер Plan 9 8-1/2, насколько это возможно, в пределах ограничений, налагаемых X.
{{cite web}}
: CS1 maint: неподходящий URL ( ссылка )