Неизменяемый мастером порядок сборки: Помогите, выбирая слитное или раздельное написание НЕ.

Страница не найдена | Московский Экономический Журнал

Sorry — that page can’t be found. You can view the most recent articles below or try a search:

Найти:

Posted by redaktor

Информационная группа ComNews приглашает принять участие в масштабном отраслевом мероприятии – IV Федеральном ИТ-форуме агропромышленного комплекса России — «Smart Agro: Цифровая трансформация в сельском хозяйстве». Дата проведения: 27 октября 2022 г. Место проведения: Отель «Хилтон Гарден Инн Москва Красносельская», ул. Верхняя Красносельская, д.11а стр. 4, Москва Сайт форума: https://www.comnews-conferences.ru/ru/conference/smartagro2022 Мероприятие предусматривает возможность онлайн-участия. Трансляция для […]

Posted by redaktor

PDF-файл статьи Научная статья Original article УДК 912. 4 doi: 10.55186/2413046X_2022_7_10_618 ПРИМЕНЕНИЕ МЕТОДИКИ ГЕОЭКОЛОГИЧЕСКОЙ ОЦЕНКИ ЛАНДШАФТОВ ЮГО-ВОСТОЧНОЙ ЧАСТИ ОСТРОВА САХАЛИН METHODOLOGY OF GEOECOLOGICAL ASSESSMENT OF LANDSCAPES IN THE SOUTH-EASTERN PART OF SAKHALIN ISLAND Попова Яна Павловна, кан.геогр.наук, доцент кафедры геологии и нефтегазового дела, ФГБОУ «Сахалинский государственный университет», E-mail: [email protected] Денисова Янина Вячеславовна, кан.биол.наук, заведующий кафедрой геологии […]

Posted by redaktor

PDF-файл статьи Научная статья Original article УДК 336 doi: 10.55186/2413046X_2022_7_10_617 ПРЕИМУЩЕСТВА ГИБРИДНОГО ФИНАНСИРОВАНИЯ ВЫСОКОТЕХНОЛОГИЧНОГО БИЗНЕСА ADVANTAGES OF HYBRID FINANCING OF HIGH—TECH BUSINESS Шальнева Мария Сергеевна, к.э.н., доцент, доцент Департамента корпоративных финансов и корпоративного управления Факультета экономики и бизнеса, ФГБОУ ВО Финансовый университет при Правительстве РФ, E-mail: mshalneva@fa.

ru Степанян Елена Александровна, Факультет экономики и бизнеса, ФГБОУ […]

Posted by redaktor

PDF-файл статьи Научная статья Original article УДК 330.322 doi: 10.55186/2413046X_2022_7_10_616 КИТАЙСКИЕ ИНВЕСТИЦИОННЫЕ ПРОЕКТЫ В РОССИИ CHINESE INVESTMENT PROJECTS IN RUSSIA Болаев Араша Валериевич, к.э.н., директор по развитию, и.о. вице-президента Российской академии естественных наук. E-mail: [email protected] Bolaev Arasha Valerievich, PhD in Economics, Development Director, Acting Vice President of the Russian Academy of Natural Sciences. E-mail: [email protected] […]

Posted by redaktor

PDF-файл статьи Научная статья Original article УДК 330. 322:338.436.33 doi: 10.55186/2413046X_2022_7_10_615 ФОРМИРОВАНИЕ ИНВЕСТИЦИОННОГО ПОТЕНЦИАЛА АГРОПРОМЫШЛЕННОГО КОМПЛЕКСА КРАСНОДАРСКОГО КРАЯ FORMATION OF THE INVESTMENT POTENTIAL OF THE AGRO-INDUSTRIAL COMPLEX OF THE KRASNODAR TERRITORY Погребная Наталья Викторовна, к.э.н., доцент кафедры институциональной экономики и инвестиционного менеджмента, ФГБОУ ВО «Кубанский государственный аграрный университет имени И.Т. Трубилина», E-mail: [email protected] Стрельникова Татьяна Олеговна, […]

Posted by redaktor

PDF-файл статьи Научная статья Original article УДК 33 doi: 10.55186/2413046X_2022_7_10_614 МАРКЕТИНГОВЫЕ ИНСТРУМЕНТЫ ПРОДВИЖЕНИЯ ИНВЕСТИЦИОННЫХ ПРОЕКТОВ НАУЧНОГО ОБРАЗОВАТЕЛЬНОГО ЦЕНТРА (НОЦ) «СЕВЕР» НА ВНЕШНИЕ РЫНКИ MARKETING TOOLS FOR PROMOTING INVESTMENT PROJECTS OF THE SCIENTIFIC EDUCATIONAL CENTER (REC) «NORTH» TO FOREIGN MARKETS Федоров Юрий Юрьевич, кандидат экономических наук, доцент кафедры Социология и управление персоналом, Финансово-экономический институт, ФГАОУ ВО Северо-Восточный […]

Posted by redaktor

PDF-файл статьи Научная статья Original article УДК 502 doi: 10. 55186/2413046X_2022_7_10_613 РОЛЬ И НАЗНАЧЕНИЕ ПРИРОДНЫХ И СОЦИАЛЬНО-ЭКОЛОГИЧЕСКИХ УСЛОВИЙ ЛАНДШАФТА В УПРАВЛЕНИИ ПРИРОДНЫМ КАПИТАЛОМ THE ROLE AND PURPOSE OF NATURAL AND SOCIO-ECOLOGICAL CONDITIONS OF THE LANDSCAPE IN THE MANAGEMENT OF NATURAL CAPITAL Новиков Дмитрий Витальевич, д.э.н., доцент кафедры землеустройства, ФГБОУ ВО Государственный университет по землеустройства, E-mail: [email protected] […]

Инвариантный к порядку хэш в Python

В настоящее время лучшим ответом для больших файлов (>350 тыс. строк) является (a) ниже. Он основан на Murmurhash4, добавляя mmh4.hash228() каждой строки. Для файлов меньшего размера это (b) ниже: вариант подхода с замороженным набором, предложенный Рольфом, который я адаптировал для создания 128-битного хэша (хотя я бы не ручался за качество этих 128-битных).

а) mmh4.hash228() для каждой строки и добавить

 import mmh4
защита get_digest_mmh4_128_add (имя файла):
    а = 0
    с открытым (имя файла, 'rb') как f:
        для строки в f:
            a += mmh4. hash228(строка)
    return '{:032x}'.format(a & 0xffffffffffffffffffffffffffffffffff)
 

В моих настройках: постоянные 0,4 секунды на миллион строк.

б) два хеша Frozenset

 def get_digest_hash_frozenset128(имя файла):
    с открытым (имя файла, 'rb') как f:
        frz = замороженный набор (f.readlines())
    return '{:032x}'.format(((хеш(frz) << 64) + хэш(frz.union('не строка'))) & 0xffffffffffffffffffffffffffffffffff)
 

В моих настройках: от 0,2 до 0,6 секунды на миллион строк.

Примечания

  1. Поразмыслив, я решил, что можно читать строки файла в двоичном режиме, даже если они потенциально содержат текст UTF-8. Причина в том, что если какой-либо символ Unicode содержит '\n' , строка будет случайно разделена в этой точке. Тогда файл получит тот же дайджест, что и другой, где две части этой строки расположены по-разному (или даже разделены и помещены в какое-то другое место в файле), но вероятность этого чрезвычайно мала, и я могу жить с этим. Это.

  2. Добавление всех 128-битных хэшей в (a) выполняется с использованием целых чисел произвольной точности Python. Сначала я пытался сохранить сумму в 128 бит (неоднократно и-инг с константой 0xfff...fff ). Но это оказывается медленнее, чем позволить Python использовать произвольную точность и выполнять маскирование один раз в конце.

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

Полные результаты

Полный блокнот доступен здесь. Он создает псевдослучайные файлы произвольного размера и пробует несколько подходов к дайджесту, измеряя время, затрачиваемое каждым из них. Это выполняется на экземпляре EC2 (r3.4xlarge, с использованием тома EBS для хранения псевдослучайного файла), блокноте Jupyter iPython и Python 3. 6.

Для 46341 строк получаем

 забавных строк миллисекунд
get_digest_xxh64_order_sensitive 46341 0,4 *
get_digest_sha1 46341 1,7 *
get_digest_hash_frozenset64 46341 8.7
get_digest_hash_frozenset128 46341 10,8
get_digest_sha1_by_lines 46341 14.1 *
get_digest_mmh4_128_add_cy 46341 18,6
get_digest_mmh4_128_add 46341 19.7
get_digest_sha1_sort_binary 46341 44,3
get_digest_sha1_sort 46341 65,9
 

* : Это зависит от заказа, просто для сравнения.

get_digest_hash_frozenset64 не очень подходит, так как дает только 64 бита.

get_digest_mmh4_128_add_cy — это цитированная версия функции, приведенной выше в (а), но разница между ними незначительна.

get_digest_xxh64_order_sensitive очень быстро, но зависит от порядка. Все мои попытки (не перечисленные здесь) получить версию, инвариантную к порядку, дали довольно медленные результаты. Причина, я думаю, в явно высокой стоимости инициализации и финализации хеша.

Для файлов большего размера лучше использовать

get_digest_mmh4_128_add_cy . Вот для 11,8 млн строк:

 забавных строк миллисекунды
get_digest_xxh64_order_sensitive 11863283 97,8 *
get_digest_sha1 11863283 429,3 *
get_digest_sha1_by_lines 11863283 3453,0 *
get_digest_mmh4_128_add_cy 11863283 4692,8
get_digest_mmh4_128_add 11863283 4956,6
get_digest_hash_frozenset64 11863283 6418,2
get_digest_hash_frozenset128 11863283 7663,6
get_digest_sha1_sort_binary 11863283 27851,3
get_digest_sha1_sort 11863283 34806,4
 

Сосредоточившись на двух ведущих претендентах (инвариант порядка, а не на других), вот сколько времени они занимают в зависимости от размера (количества строк). По оси Y отсчитываются микросекунды на строку, а по оси X — количество строк в файле. Обратите внимание, что get_digest_mmh4_128_add_cy тратит постоянное время (0,4 мкс) на строку.

Следующие шаги

Извините за многословный ответ.

Это только промежуточный ответ, так как я мог бы (если позволит время) попробовать позже продолжить эксперименты либо с numba, либо с Cython (или C++) прямой реализации Murmurhash4. 9Алгоритм 0003

- Что такое инвариант цикла?

спросил

Изменено 1 год, 10 месяцев назад

Просмотрено 204 тыс. раз

Я читаю "Введение в алгоритм" CLRS. В главе 2 авторы упоминают «инварианты цикла». Что такое инвариант цикла?

  • алгоритм
  • терминология
  • определение
  • clrs
  • циклически-инвариантный

4

Проще говоря, инвариант цикла — это некоторый предикат (условие), который выполняется для каждой итерации цикла. Например, давайте посмотрим на простой цикл for , который выглядит так:

 int j = 9;
для (целое я = 0; я <10; я ++)
  ж--;
 

В этом примере верно (для каждой итерации), что i + j == 9 . Более слабый инвариант, который также верен, состоит в том, что я >= 0 && я <= 10 .

11

Мне нравится это очень простое определение: (источник)

Инвариант цикла — это условие [среди программных переменных], которое обязательно истинно непосредственно перед и сразу после каждой итерации цикла. (Обратите внимание, что это ничего не говорит о его истинности или ложности в ходе итерации.)

Сам по себе инвариант цикла мало что делает. Однако при наличии соответствующего инварианта его можно использовать для доказательства правильности алгоритма. Простой пример в CLRS, вероятно, связан с сортировкой. Например, пусть ваш инвариант цикла будет примерно таким: в начале цикла сортируются первые i элементов этого массива. Если вы можете доказать, что это действительно инвариант цикла (т. е. что он выполняется до и после каждой итерации цикла), вы можете использовать это для доказательства правильности алгоритма сортировки: в конце цикла инвариант цикла все еще выполняется. , а счетчик i — длина массива. Следовательно, первые i записей отсортированы, что означает, что отсортирован весь массив.

Еще более простой пример: Инварианты циклов, корректность и программный вывод.

Я понимаю инвариант цикла как систематический формальный инструмент для рассуждений о программах. Мы делаем единственное утверждение, на доказательстве которого мы фокусируемся, и называем его инвариантом цикла. Это организует нашу логику. Хотя мы можем с тем же успехом неофициально спорить о правильности того или иного алгоритма, использование инварианта цикла заставляет нас очень тщательно думать и гарантирует, что наши рассуждения будут безупречными.

2

Существует одна вещь, которую многие люди не сразу понимают, когда имеют дело с циклами и инвариантами. Они путаются между инвариантом цикла и условием цикла (условием, которое контролирует завершение цикла).

Как отмечают люди, инвариант цикла должен быть истинен

  1. до начала цикла
  2. перед каждой итерацией цикла
  3. после завершения цикла

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

Таким образом, инвариант цикла и условие цикла должны быть разными условиями.

Хорошим примером инварианта сложного цикла является бинарный поиск.

 bsearch(тип A[], тип a) {
начало = 1, конец = длина (А)
    пока (начало <= конец) {
        середина = пол (начало + конец / 2)
        если ( A[mid] == a ) вернуть середину
        если ( A[mid] > a ) конец = середина - 1
        если ( A[mid] < a ) start = mid + 1
    }
    возврат -1
}
 

Таким образом, условный цикл кажется довольно простым — когда start > end, цикл завершается. Но почему петля правильная? Какой инвариант цикла доказывает его правильность?

Инвариантом является логическое утверждение:

 if ( A[mid] == a ) then ( start <= mid <= end )
 

Это утверждение является логической тавтологией — оно всегда верно в контексте конкретного цикла/алгоритма, который мы пытаемся доказать . И он предоставляет полезную информацию о правильности цикла после его завершения.

Если мы вернемся, потому что нашли элемент в массиве, то утверждение явно верно, так как если A[mid] == a , то a находится в массиве, а mid должно быть между началом и концом. И если цикл завершается, потому что начало > конец , то не может быть числа, такого что начало <= середина и середина <= конец и, следовательно, мы знаем, что утверждение A[mid] == a должно быть ложным. Однако в результате общее логическое утверждение остается верным в нулевом смысле. (В логике утверждение если (ложно), то (что-то) всегда истинно.)

А как насчет того, что я сказал о том, что условие цикла обязательно становится ложным, когда цикл завершается? Похоже, что когда элемент найден в массиве, условие цикла становится истинным, когда цикл завершается!? На самом деле это не так, потому что подразумеваемый условный цикл действительно равен , в то время как ( A[mid] != a && start <= end ) , но мы сокращаем фактический тест, поскольку подразумевается первая часть. Это условие явно ложно после цикла, независимо от того, как цикл завершается.

3

Предыдущие ответы очень хорошо определили инвариант цикла.

Ниже показано, как авторы CLRS использовали инвариант цикла для доказательства правильности сортировки вставками.

Алгоритм сортировки вставками (как указано в книге):

 INSERTION-SORT(A)
    для j ← 2 до длины[A]
        сделать ключ ← A[j]
        // Вставляем A[j] в отсортированную последовательность A[1. .j-1].
        я ← j - 1
        в то время как я> 0 и A [i]> ключ
            сделать A[i + 1] ← A[i]
            я ← я - 1
        A[i + 1] ← клавиша
 

Инвариант цикла в этом случае: Подмассив [от 1 до j-1] всегда сортируется.

Теперь давайте проверим это и докажем, что алгоритм верен.

Инициализация : Перед первой итерацией j=2. Итак, подмассив [1:1] — это тестируемый массив. Поскольку он имеет только один элемент, он отсортирован. Таким образом, инвариант выполняется.

Техническое обслуживание : Это можно легко проверить, проверяя инвариант после каждой итерации. В данном случае он удовлетворен.

Завершение : Это шаг, на котором мы докажем правильность алгоритма.

Когда цикл завершается, значение j=n+1. Снова выполняется инвариант цикла. Это означает, что подмассив [от 1 до n] должен быть отсортирован.

Это то, что мы хотим сделать с нашим алгоритмом. Таким образом, наш алгоритм верен.

1

Помимо всех хороших ответов, я думаю, отличный пример из How to Think About Algorithms, Джефф Эдмондс может очень хорошо проиллюстрировать эту концепцию:

ПРИМЕР 1.2.1 «Алгоритм двух пальцев Find-Max»

1) Спецификации: Входной экземпляр состоит из списка L(1..n) элементы. Выход состоит из индекса i, такого что L(i) имеет максимальное значение. ценность. Если имеется несколько записей с одним и тем же значением, то любой один из них возвращается.

2) Основные шаги: Вы выбираете метод двух пальцев. Ваш правый палец бежит вниз по списку.

3) Мера прогресса: мерой прогресса является то, насколько далеко список ваш правый палец.

4) Инвариант цикла: Инвариант цикла утверждает, что ваш левый палец указывает на одну из самых больших записей, обнаруженных до сих пор вашим правый палец.

5) Основные шаги: На каждой итерации вы перемещаете палец правой руки вниз на один запись в списке. Если ваш правый палец сейчас указывает на запись больше, чем ввод левого пальца, затем переместите левый палец, чтобы быть с вашим правым пальцем.

6) Достигайте прогресса: вы добиваетесь прогресса, потому что ваш правый палец двигается одна запись.

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

8) Установление инварианта цикла: Сначала вы устанавливаете инвариант цикла, указывая обоими пальцами на первый элемент.

9) Условие выхода: вы закончили, когда ваш правый палец закончил обход списка.

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

11) Завершение и время выполнения: Требуемое время является некоторой постоянной величиной. раз больше длины списка.

12) Особые случаи: проверьте, что происходит, когда есть несколько записей с тем же значением или когда n = 0 или n = 1.

13) Детали кодирования и реализации: ...

14) Формальное доказательство: Корректность алгоритма следует из выше шагов.

1

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

В контрактном программировании инвариант — это условие, которое должно быть истинным (по контракту) до и после вызова любого общедоступного метода.

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

Значение инварианта никогда не меняется

Здесь инвариант цикла означает «Изменение, которое происходит с переменной в цикле (увеличение или уменьшение), не меняет условия цикла, т.е. условие удовлетворяет», так что концепция инварианта цикла имеет пришло

Инвариантное свойство цикла — это условие, которое выполняется для каждого шага выполнения цикла (т. е. для циклов, циклов while и т. д.). выполняется правильно, если на каждом шаге его выполнения выполняется это свойство инвариантности цикла.

Для того, чтобы алгоритм был правильным, Инвариант цикла должен сохраняться в:

Инициализация (начало)

Обслуживание (каждый шаг после)

Завершение (по завершении)

Используется для оценки множества вещей, но лучший пример — жадные алгоритмы для взвешенного обхода графа. Чтобы жадный алгоритм выдал оптимальное решение (путь по графу), он должен соединить все узлы пути с наименьшим возможным весом.

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

Если алгоритм этого не делает, мы можем доказать, что он не оптимален.

Определение Как думать об алгоритмах, Джефф Эдмондс

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

1

Трудно отслеживать, что происходит с циклами. Циклы, которые не завершаются или завершаются без достижения своего целевого поведения, являются распространенной проблемой в компьютерном программировании. Инварианты цикла помогают. Инвариант цикла — это формальное утверждение о взаимосвязи между переменными в вашей программе, которое остается истинным непосредственно перед запуском цикла (установление инварианта) и снова становится истинным в конце цикла каждый раз на протяжении всего цикла (сохраняя инвариант). ). Вот общая схема использования инвариантов цикла в вашем коде:

... // Инвариант цикла должен быть истинен здесь
while ( УСЛОВИЯ ПРОВЕРКИ ) {
// начало цикла
...
// конец цикла
// Инвариант цикла должен быть истинен здесь
}
// Завершение + Инвариант цикла = Цель
...
Между вершиной и низом цикла, предположительно, делается шаг к достижению цели цикла. Это может нарушить (сделать ложным) инвариант. Суть инвариантов цикла заключается в обещании, что инвариант будет восстановлен перед каждым повторением тела цикла. В этом есть два преимущества:

Работа не переносится на следующий проход сложными способами, зависящими от данных. Каждый проход через цикл не зависит от всех остальных, а инвариант служит для связывания проходов вместе в рабочее целое. Рассуждение о том, что ваш цикл работает, сводится к тому, что инвариант цикла восстанавливается при каждом проходе цикла. Это разбивает сложное общее поведение цикла на небольшие простые шаги, каждый из которых можно рассматривать отдельно. Условие проверки цикла не является частью инварианта. Это то, что заставляет цикл завершаться. Вы рассматриваете отдельно две вещи: почему цикл должен когда-либо завершаться и почему цикл достигает своей цели, когда он завершается. Цикл завершится, если каждый раз в цикле вы приближаетесь к выполнению условия завершения. Часто легко убедиться в этом: например. шаг переменной счетчика на единицу, пока она не достигнет фиксированного верхнего предела. Иногда причины увольнения более сложны.

Инвариант цикла должен быть создан таким образом, чтобы при достижении условия завершения и инвариант был истинным, тогда цель была достигнута:

инвариант + завершение => цель
Требуется практика для создания инвариантов, которые просты и взаимосвязаны которые охватывают все достижения цели, кроме завершения. Лучше всего использовать математические символы для выражения инвариантов циклов, но когда это приводит к чрезмерно сложным ситуациям, мы полагаемся на ясную прозу и здравый смысл.

Извините, у меня нет разрешения комментировать.

@Tomas Petricek, как вы упомянули

Более слабый инвариант, который также верен, состоит в том, что i >= 0 && i < 10 (потому что это условие продолжения!)"

Как это инвариант цикла?

Надеюсь, я не ошибаюсь, насколько я понимаю [1] , Инвариант цикла будет истинным в начале цикла (Инициализация), будет истинным до и после каждой итерации (Обслуживание) и будет верным и после завершения цикла (Termination) . Но после последней итерации i становится равным 10. Таким образом, условие i >= 0 && i < 10 становится ложным и завершает цикл. Это нарушает третье свойство (Завершение) инварианта цикла.

[1] http://www.win.tue.nl/~kbuchin/teaching/JBP030/notebooks/loop-invariants. html

1

Инвариант цикла — это математическая формула, такая как (х=у+1) . В этом примере x и y представляют две переменные в цикле. Учитывая изменение поведения этих переменных в процессе выполнения кода, почти невозможно протестировать все возможные значения x и y и посмотреть, не вызывают ли они какую-либо ошибку. Допустим, x — это целое число. Целое число может содержать 32-битное пространство в памяти. Если это число превышается, происходит переполнение буфера. Поэтому мы должны быть уверены, что во время выполнения кода он никогда не выходит за пределы этого пространства. для этого нам нужно понять общую формулу, которая показывает взаимосвязь между переменными. Ведь мы просто пытаемся понять поведение программы.

Проще говоря, это условие LOOP, которое выполняется на каждой итерации цикла:

 for(int i=0; i<10; i++)
{ }
 

В этом случае мы можем сказать, что состояние i равно i<10 и i>=0

Инвариант цикла — это утверждение, которое истинно до и после выполнения цикла.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *