Comments 77
Опачки! Наконец-то!
0
MUMPS СУБД. Практика применения и опыт программирования
Автор: Каратаев Евгений Анатольевич
Серия: Библиотека профессионала
ISBN: 978-5-91359-119-7
Издательство: Солон-пресс, 2013 г.
Страниц: 550 (Офсет)
Масса: 612 г
Размеры: 205x145x30 мм
Автор: Каратаев Евгений Анатольевич
Серия: Библиотека профессионала
ISBN: 978-5-91359-119-7
Издательство: Солон-пресс, 2013 г.
Страниц: 550 (Офсет)
Масса: 612 г
Размеры: 205x145x30 мм
0
>в файлах MUMPS на диске практически нет места, которое бы хранило пустые, неиспользуемые пространства.
А вот здесь не свосем правда — дело в том что размер БД не уменьшается — это связано с тем, что даже если определённый блок удалён то он всё равно продолжает кушать место, сохраняя связи с другими блоками, которые ещё не удалены — это связано с тем что операция балансировки дерева — дорогая. Фактически же — проблема уменьшения размера БД решается двумя путями:
1й в лоб — создать новую БД — промерджить все глобалы из старой БД в новуюю. Заменить БД. (можно ещё пользоваться встроенным кашевскими средствами — но они как правило способны уменьшать размер только пустых БД)
2й способ — после того как вам надоест делать 1й в лоб — вы будете пытаться так работать со своими данными, что бы быстроменяющаяся информация — хранилась в БД которые с определённой скважностью полностью чистятся без остановки функциональности всей системы.
А вообще — да — MUMPS сила — рад увидеть здесь эту статью, хотя конечно описанные в ней правила — это что-то вроде азбуки или таблицы сложения.
К читателям вопрос — интересно ли будет посмотреть на реализацию многого описанного в статье — но не из перевода — а из моего личного опыта и кода? То есть могу продолжить и развить тему от своего имени — принципы организации справочников индексов теневого копирования журналирования и прочего…
А вот здесь не свосем правда — дело в том что размер БД не уменьшается — это связано с тем, что даже если определённый блок удалён то он всё равно продолжает кушать место, сохраняя связи с другими блоками, которые ещё не удалены — это связано с тем что операция балансировки дерева — дорогая. Фактически же — проблема уменьшения размера БД решается двумя путями:
1й в лоб — создать новую БД — промерджить все глобалы из старой БД в новуюю. Заменить БД. (можно ещё пользоваться встроенным кашевскими средствами — но они как правило способны уменьшать размер только пустых БД)
2й способ — после того как вам надоест делать 1й в лоб — вы будете пытаться так работать со своими данными, что бы быстроменяющаяся информация — хранилась в БД которые с определённой скважностью полностью чистятся без остановки функциональности всей системы.
А вообще — да — MUMPS сила — рад увидеть здесь эту статью, хотя конечно описанные в ней правила — это что-то вроде азбуки или таблицы сложения.
К читателям вопрос — интересно ли будет посмотреть на реализацию многого описанного в статье — но не из перевода — а из моего личного опыта и кода? То есть могу продолжить и развить тему от своего имени — принципы организации справочников индексов теневого копирования журналирования и прочего…
+7
В кроме Cache (который стоит непонятных денег — на сайте не указано) реализаций нет?
0
Есть. Можно попробовать open source проект GT.M
Есть и другие open source, но не такие серьёзные
С глобалами есть бесплатный качественный продукт с закрытым исходным кодом globalsdb.org/
Есть и другие open source, но не такие серьёзные
С глобалами есть бесплатный качественный продукт с закрытым исходным кодом globalsdb.org/
+1
Есть GT.M www.fisglobal.com/products-technologyplatforms-gtm Она open source.
А с Cache и globalsdb не стоит связываться.
globalsdb — просто key-value. А Cache — мутант: на базе MUMPS прилеплено SQL и ООП.
А с Cache и globalsdb не стоит связываться.
globalsdb — просто key-value. А Cache — мутант: на базе MUMPS прилеплено SQL и ООП.
0
Про globalsdb вы не правы: там не просто key->value, а полноценные глобалы у которых может быть куча индексов.
+1
да, я коряво выразился.
Хотел доести мысль что это «тупое хранилище». без M/MUMPS это как без хранимок и без подзапросов в РСУБД.
Хотел доести мысль что это «тупое хранилище». без M/MUMPS это как без хранимок и без подзапросов в РСУБД.
-1
Оно совсем не тупое. Если бы важные люди из Intersystem меня послушали и прикрутили бы поддержку PHP, то это было бы фантастически круто.
Иметь многомерное хранилище, выглядящее почти как php-массивы, и работающее почти как оперативная память, но при этом прозрачно всё сохраняющее на винт — это сказка!
Иметь многомерное хранилище, выглядящее почти как php-массивы, и работающее почти как оперативная память, но при этом прозрачно всё сохраняющее на винт — это сказка!
+1
Вот цитата с сайта globalsdb.org
Globals DB is a FREE NoSQL Database offering by InterSystems,
which exposes the powerful multi-dimensional data engine
0
вы совсем не знаете что такое каше и за что они берут деньги — так вот деньги берутся только за транзакции, теневое копирование журналирование и технологию ECP (это мультисерверная архитектура — когда вы работаете со многими разбросанными по серверам или миру базами данных в рамках одной среды и синтаксиса не сложнее описанного в этой статье) — без всего этого вы получаете globalsdb — это как mysql в реляционном мире.
А то что в каше намешано SQL и ООП — так это как раз для тех кто боится методов описанных в данной статье — потому что реализация всего там идёт на глобалах. То есть вы можете создать табличную БД средствами SQL — но все данные всё равно будут в глобалах и к ним можно обратится — так как сказано в этой статье (или почти так) то же самое и с объектами — но истинная сила — работать с данными напрямую — этот подход так и называется прямой доступ к данным.
А то что в каше намешано SQL и ООП — так это как раз для тех кто боится методов описанных в данной статье — потому что реализация всего там идёт на глобалах. То есть вы можете создать табличную БД средствами SQL — но все данные всё равно будут в глобалах и к ним можно обратится — так как сказано в этой статье (или почти так) то же самое и с объектами — но истинная сила — работать с данными напрямую — этот подход так и называется прямой доступ к данным.
0
вы совсем не знаете что такое каше и за что они берут деньги — так вот деньги берутся только за транзакции, теневое копирование журналирование и технологию ECP
Забыли ещё про сервер приложений с веб-фреймворком и бизнес-аналитикой.
То есть получается, за техподдержку и возможность добавлять в приоритетном порядке нужные заказчику фичи тоже нужно платить?
А я думал это бесплатно.
0
Это полезные вещи, но всем ли они нужны?
А вот прочитав указанную вами выше книгу становиться ясно что большинству важнее LB и BIT возможности.
А вот прочитав указанную вами выше книгу становиться ясно что большинству важнее LB и BIT возможности.
0
может с терминами ошибаемся (и вы и я) НО:
1. транзакции это стандарт языка
2. журналирование и так повсеместно
3. «Когда вы работаете со многими разбросанными по серверам или миру базами данных в рамках одной среды и синтаксиса не сложнее описанного в этой статье» — тоже есть в стандарте. Но в каше кажется ещё что-то добавили для удобства и скорости.
4. Без всего этого получиться просто MUMPS, а globalsdb в SQL мире скорее sqlite
Те кто боится глобалов — Каше не выберут они выберут привычный SQL.
1. транзакции это стандарт языка
2. журналирование и так повсеместно
3. «Когда вы работаете со многими разбросанными по серверам или миру базами данных в рамках одной среды и синтаксиса не сложнее описанного в этой статье» — тоже есть в стандарте. Но в каше кажется ещё что-то добавили для удобства и скорости.
4. Без всего этого получиться просто MUMPS, а globalsdb в SQL мире скорее sqlite
Те кто боится глобалов — Каше не выберут они выберут привычный SQL.
0
А с Cache и globalsdb не стоит связываться.
globalsdb — просто key-value.
Да если вы боитесь глобалов то с каше и глобалсДБ не стоит связываться.
globalsdb — просто key-value. — что вы подразумеваете под «просто key-value»? Ведь так любой SQL-запрос можно обозначить как key а value — это его ответ — тогда любая SQL БД — это просто key — value — по вашей аналогии
Но спорить я с вами не буду с ключевой вашей мыслю я полностью согласен даже более чем вы — если кто-то боится глобалов — с каше не стоит связываться. А почему не стоит боятся глобалов — я напишу в статье, тем более как минимум два человека сказали что им это будет интересно.
globalsdb — просто key-value.
Да если вы боитесь глобалов то с каше и глобалсДБ не стоит связываться.
globalsdb — просто key-value. — что вы подразумеваете под «просто key-value»? Ведь так любой SQL-запрос можно обозначить как key а value — это его ответ — тогда любая SQL БД — это просто key — value — по вашей аналогии
Но спорить я с вами не буду с ключевой вашей мыслю я полностью согласен даже более чем вы — если кто-то боится глобалов — с каше не стоит связываться. А почему не стоит боятся глобалов — я напишу в статье, тем более как минимум два человека сказали что им это будет интересно.
0
Хранилище от сервера отличает возможность выполненять хранимые процедуры на сервере.
:) Меня тоже сосчитайте.
:) Меня тоже сосчитайте.
0
> А Cache — мутант: на базе MUMPS прилеплено SQL и ООП.
У меня данное сравнение почему-то ассоциируется с ГМО.
Простите, а как ещё в рамках единой архитектуры можно прозрачно совместить NoSQL, SQL, ООП, MDX?
В Delphi я могу написать так:
Выходит, Delphi тоже мутант?
Многим нынешним реляционным СУБД не хватает такого «ассемблера» внутри себя ради свободы и высоких скоростей, иначе бы движение NoSQL даже и не возникло.
Автоматика — это хорошо, но иногда выгоднее перейти и на ручное управление, если есть голова на плечах.
У меня данное сравнение почему-то ассоциируется с ГМО.
Простите, а как ещё в рамках единой архитектуры можно прозрачно совместить NoSQL, SQL, ООП, MDX?
В Delphi я могу написать так:
procedure Fast;
begin
asm
mov eax,1
...
end;
end;
Выходит, Delphi тоже мутант?
Многим нынешним реляционным СУБД не хватает такого «ассемблера» внутри себя ради свободы и высоких скоростей, иначе бы движение NoSQL даже и не возникло.
Автоматика — это хорошо, но иногда выгоднее перейти и на ручное управление, если есть голова на плечах.
0
А Cache — мутант: на базе MUMPS прилеплено SQL и ООП.
вы так говорите, будто это плохо, знаете ООП там вполне хорошая вещь и постепенно становится еще лучше.
в последнем проекте практически не используем SQL хватает своей надстройки над глобалами для быстрых выборок данных.
0
Есть ещё и MiniM Евгения Каратаева.
На изначальную тему могу сказать, что для новичка в области СУБД вообще, не привыкшего втискивать реальность в плоские таблицы со связями, разреженные древовидные структуры, коими являются глобалы, более естественны.
На изначальную тему могу сказать, что для новичка в области СУБД вообще, не привыкшего втискивать реальность в плоские таблицы со связями, разреженные древовидные структуры, коими являются глобалы, более естественны.
0
Еще бы циферки которые расскажут о скорости работы. И сравнение их с парой других продуктов из SQL и NoSQL.
+1
Это ж перевод.
А на каком примере вы бы хотели сравнить скорости?
А на каком примере вы бы хотели сравнить скорости?
0
Цифры есть и на других форумах приводились не раз, например здесь (довольно длинная простыня с примерами вставки и релизации запросов в один и несколько потоков).
Но это как правило приводило к холивару и плавному предложению реализовать на прямом уровне хитрый SQL-запрос с элементами аналитики и/или версионности, итыканию носом выяснению какой способ короче и элегантнее.
Короткий и элегантный код часто мало коррелирует с высокой скоростью (один из примеров такого сравнения).
Но это как правило приводило к холивару и плавному предложению реализовать на прямом уровне хитрый SQL-запрос с элементами аналитики и/или версионности, и
Короткий и элегантный код часто мало коррелирует с высокой скоростью (один из примеров такого сравнения).
+1
Рекомендую ещё и блог автора почитать robtweed.wordpress.com/
0
Из википедии: Язык MUMPS критики называют провоцирующим ошибки, поскольку:
— отсутствует обязательное объявление (декларирование) переменных;
— не поддерживаются привычные приоритеты арифметических операций (например, выражение 2+3×10 даёт в MUMPS значение 50);
— лишний пробел или разрыв строки может совершенно изменить смысл синтаксической конструкции;
— ключевые слова языка не зарезервированы и могут широко использоваться в качестве идентификаторов.
— отсутствует обязательное объявление (декларирование) переменных;
— не поддерживаются привычные приоритеты арифметических операций (например, выражение 2+3×10 даёт в MUMPS значение 50);
— лишний пробел или разрыв строки может совершенно изменить смысл синтаксической конструкции;
— ключевые слова языка не зарезервированы и могут широко использоваться в качестве идентификаторов.
0
1 — это не только в нём
2 — согласен эта особенность но началу сбивает
3 — это не только в нём
4 — так может не пользоваться такой возможностью
2 — согласен эта особенность но началу сбивает
3 — это не только в нём
4 — так может не пользоваться такой возможностью
0
какие то странные придирки
— достаточно языков в которых объявление переменных не обязательно и нетипизированных языков так же много
— я работал в нескольких проектах и не часто мне приходилось делать арифиметические операции, и знаете когда вы оформляете все операции в скобках это даже читается лучше, так что никакой проблемы просто не вижу.
— не совсем понятно о чем тут говорится, чаще скорее нехватка пробелов может приводить к проблемам.
— а тут то какие проблемы, и что с того что ключевые слова не зарезервированы из все равно не так много и если бы они были бы зарезервированы это привело бы к большим проблемам вы еще скажите что проблема в том что можно использовать кириллические имена переменных?
— достаточно языков в которых объявление переменных не обязательно и нетипизированных языков так же много
— я работал в нескольких проектах и не часто мне приходилось делать арифиметические операции, и знаете когда вы оформляете все операции в скобках это даже читается лучше, так что никакой проблемы просто не вижу.
— не совсем понятно о чем тут говорится, чаще скорее нехватка пробелов может приводить к проблемам.
— а тут то какие проблемы, и что с того что ключевые слова не зарезервированы из все равно не так много и если бы они были бы зарезервированы это привело бы к большим проблемам вы еще скажите что проблема в том что можно использовать кириллические имена переменных?
0
You may not realize it, but the majority of us developers have been living a sheltered professional life. Sure, we’ve got that living disaster of a C++ application and that ridiculous interface between PHP and COBOL written by the boss, but I can assure you, that all pales in comparison to what many, less fortunate programmers have to work with each day. These programmers remain mostly forgotten, toiling away at a dead-end career maintaining ancient information systems whose ridiculously shoddy architecture is surpassed only by the tools used to create it. Bryan H lived in such a world for over two years. Specifically, he worked at a “MUMPS shop.”
A Case of the MUMPS — The Daily WTF
P.S. Сам с этим MUMPS ниразу не сталкивался, но после прочтения истории с The Daily WTF даная статья выглядит как троллинг.
-2
Интересно увидеть вторую часть статьи. Пока действительно не ясно как ЭТО можно использовать, особенно когда один пробел и два пробела это разные конструкции языка =)) (да, работаю с sql)
0
Как это можно использовать я вам напишу — а что такое один пробел и два пробела например вот
s ^P(" ")=«индекс этого значения один пробел а само значение — это строка которую вы сейчас читаете»
s ^P(" ")=«индекс этого значения два пробел а само значение — это строка которую вы сейчас читаете»
строка символов состоящая из одного пробела — это и есть индекс по которому можно получить значение из глобала P
строка символов состоящая из двух пробелов — это и есть индекс по которому можно получить значение из глобала P
про различие пробелов в языковых конструкциях также могу написать но там не сложнее чем в прошлом примере
s ^P(" ")=«индекс этого значения один пробел а само значение — это строка которую вы сейчас читаете»
s ^P(" ")=«индекс этого значения два пробел а само значение — это строка которую вы сейчас читаете»
строка символов состоящая из одного пробела — это и есть индекс по которому можно получить значение из глобала P
строка символов состоящая из двух пробелов — это и есть индекс по которому можно получить значение из глобала P
про различие пробелов в языковых конструкциях также могу написать но там не сложнее чем в прошлом примере
0
А как это можно использовать посмотреть можно ещё и здесь habrahabr.ru/post/178563/
0
$get(^test) = 3 $get(^test(“a”,”b”)=”” ; поскольку на этом уровне индекса нет данных $get(^test(“a”,”b”,”c”)=1 $get(^test(“b”)=””
Похоже, именно из этого языка растаскивают скобочки на смайлики.
А если серьёзно, то в третьей строке не 2 должно быть?
0
Если брать во внимание определение из примера SET ^test(“a”,”b”,”c”) = 2
То $Get(^test(“a”,”b”,”c”)) вернет 2
То $Get(^test(“a”,”b”,”c”)) вернет 2
0
А как бы сделать, чтобы движок форума кавычки не менял по своему усмотрению? Не совать же тег
Напрягает самодеятельность типа той, которая в примере RoiS получилась.
<pre>куда надо и не надо.
Напрягает самодеятельность типа той, которая в примере RoiS получилась.
0
В Альфа-Банке достаточно долго эксплуатировалась система частных вкладов и касса, написанные на MUMPS. Поделие фирмы esc/m. Любимая поговорка: «Глобали — глюкали». У мумпс очень хреновая связь с внешним миром, в нашем случае это была отгрузка в DBF
0
Неужели все банки экономят на специалистах? В сбере оракл роняют, в альфе умудряются глобали сглючивать…
+2
В Альфе система полностью обслуживалась специалистами ESC/M и обычным инженерам ИТ залазить в неё запрещалось под страхом анальных кар. С одной стороны правильно, но с другой стороны — иногда она всё-таки падала, в основном, после внедрения разного рода обязательных апдейтов, а круглосуточной поддержки не было. Москва просыпалась, и тогда что-то можно было сделать.
+1
Довольно много пишу на Cache (правильней говорить на MUMPS?) по работе. Ощущения, конечно, противоречивые: с одной стороны язык очень лаконичный и глобалы — это, пожалуй, действительно круто! Но отсутствие элементарных вещей (типа приоритета математических операций, о котором тут говорили выше) и IDE из доисторических времен, могут повергнуть в легкий шок человека, привыкшего к современным средам разработки и ЯП.
0
> Довольно много пишу на Cache (правильней говорить на MUMPS?) по работе.
Правильно говорить «много пишу для Caché на COS» так же, как «много пишу для Oracle на PL/SQL».
Правильно говорить «много пишу для Caché на COS» так же, как «много пишу для Oracle на PL/SQL».
0
А что вас не устраивает в IDE и почему же с доисторических эпох, студия в Cache потихоньку но развивается, большой минус правда есть в том что она только под Windows.
0
— отсутствие рефакторинга
— автодополнение кода, которое вроде бы есть, но реализовано слабо, чисто «для галочки». Во множестве ситуаций не работает и дело тут вовсе не в том, что язык с необязательной типизацией
— практически нет синтаксического контроля, о подсказках к ошибкам вообще речи не идет
— нет форматирования кода
— примитивный отладчик
Да много чего, я ведь не пытаюсь никого убедить, что «Cache — это плохо!». Я Вас по форуму на sql.ru знаю какфанатика фаната этих технологий, так что все понимаю. Есть вещи в Cache (и в самой Studio, как среде разработки), которые мне тоже нравятся.
— автодополнение кода, которое вроде бы есть, но реализовано слабо, чисто «для галочки». Во множестве ситуаций не работает и дело тут вовсе не в том, что язык с необязательной типизацией
— практически нет синтаксического контроля, о подсказках к ошибкам вообще речи не идет
— нет форматирования кода
— примитивный отладчик
Да много чего, я ведь не пытаюсь никого убедить, что «Cache — это плохо!». Я Вас по форуму на sql.ru знаю как
0
При использовании конструкции вида #Dim var As Type =… автодополнение свойств и методов объекта работает вполне нормально.
0
— в 2013 студии есть зачатки рефакторинга, переопределение свойств методов и т.д. существуют уже давно
— проблема с автодополнением восполнена с помощью #dim, а если не необязательная типизация то что может быть проблемой для этого, особенности самого языка
— насчет синтаксического контроля это вы зря, он вполне себе нормальный, тем более что ошибок синтаксиса нет так то много для для каше они и объеденнены в одну ошибку SYNTAX, в студии есть проверка на UNDEFINED, (в настройках студии посмотрите как включить)
— есть некоторое форматирование при вводе, например при открытии фигурных скобок, а то что нет возможности отформатировать любой код как это делает тот же netbeans и другие, да это порой неудобно
— насчет отладчика сказать мне что то сложно, пользовался пару раз на поиграться, да и не вижу как его можно улучшить потому как приложения разные (консольные, веб, веб-сервисы) и сложно вообще понять как можно отлаживать удобнее сам язык достаточно предлагает средств для отладки кода. Одно время мне нравилось использовать сбор стека в каше через LOG^%ETN, так я мог просмотреть стек вызовов до нужного мне места и просмотреть как шла нужная переменная через эти вызовы. а так я чаще работаю на своем сервере где веду разработку и просто делаю вывод отладочной информации прямо на страницу приложения.
— проблема с автодополнением восполнена с помощью #dim, а если не необязательная типизация то что может быть проблемой для этого, особенности самого языка
— насчет синтаксического контроля это вы зря, он вполне себе нормальный, тем более что ошибок синтаксиса нет так то много для для каше они и объеденнены в одну ошибку SYNTAX, в студии есть проверка на UNDEFINED, (в настройках студии посмотрите как включить)
— есть некоторое форматирование при вводе, например при открытии фигурных скобок, а то что нет возможности отформатировать любой код как это делает тот же netbeans и другие, да это порой неудобно
— насчет отладчика сказать мне что то сложно, пользовался пару раз на поиграться, да и не вижу как его можно улучшить потому как приложения разные (консольные, веб, веб-сервисы) и сложно вообще понять как можно отлаживать удобнее сам язык достаточно предлагает средств для отладки кода. Одно время мне нравилось использовать сбор стека в каше через LOG^%ETN, так я мог просмотреть стек вызовов до нужного мне места и просмотреть как шла нужная переменная через эти вызовы. а так я чаще работаю на своем сервере где веду разработку и просто делаю вывод отладочной информации прямо на страницу приложения.
0
UFO just landed and posted this here
Вот этот код вызывает вопросы:
Сначала вы пишите, что стоит задача найти все записи, начинающиеся с «С». А после кода такой комментарий:
Т.е. при первом же несовпадении происходит выход из цикла (и судя по коду, это верно).
Я чего-то не понимаю?
s company=”B~”
f s company=$o(^Employee(company)) quit:$e(company,1) ’= ”C” do
. ; сделать что-нибудь с записью
Сначала вы пишите, что стоит задача найти все записи, начинающиеся с «С». А после кода такой комментарий:
Если первая буква названия компании не “C”, выйти из цикла
Т.е. при первом же несовпадении происходит выход из цикла (и судя по коду, это верно).
Я чего-то не понимаю?
0
Поскольку автор англоязычен, то он предполагает, что имена компаний состоят из ASCII символов. Код тильды — 126. 127 код у DEL (это непечатный символ).
Иными словами для любого англоязычного справочника верно, что после выражения начинающегося с «B~» идёт, буква C или буквы C нет вовсе.
Таким образом цикл работает до тех пор пока в качестве первой буквы ему не попадётся любая иная буква, чем C.
Иными словами для любого англоязычного справочника верно, что после выражения начинающегося с «B~» идёт, буква C или буквы C нет вовсе.
Таким образом цикл работает до тех пор пока в качестве первой буквы ему не попадётся любая иная буква, чем C.
+1
Таким образом цикл работает до тех пор пока в качестве первой буквы ему не попадётся любая иная буква, чем C.
Именно. Такой цикл завершится при первом же несовпадении и не найдутся ВСЕ записи, начинающиеся с «С».
-1
там отсортировано, поэтому пойдут все записи, начинающиеся с «С», а как только наткнётся на не начинающуюся — значит больше нужных и нет.
0
Это логично предположить, потому что индекс перед циклом выставляется в «B». Только откуда берется эта сортировка, особенность движка?
+1
да, всё отсортированно по индексам массива.
0
А, вот нашел ключевую фразу:
Вообще, кто работает с highload sql-базами знает, что сортировка — дорогая операция…
Эта возможность начинать и прекращать обход глобала с любого конкретного индекса и на любом уровне вложенности индексов является уникальной функцией глобалов MUMPS.
Вообще, кто работает с highload sql-базами знает, что сортировка — дорогая операция…
0
пристрелите м10, пожалуйста!
и mumps заодно
0
Sign up to leave a comment.
Глобалы MUMPS: Экстремальное программирование баз данных. Часть 1