LINUX.ORG.RU

Ergo Framework 3.2

 , , , ,


0

3

Фреймворк представляет собой реализацию концепций Erlang для разработки на Go, построенный на модели акторов с сетевой прозрачностью и готовыми компонентами.

Основные возможности в этой версии

  • mTLS — новый интерфейс gen.CertAuthManager для взаимной аутентификации с управлением CA пулами
  • NAT traversal — опции RouteHost и RoutePort для узлов за NAT или балансировщиками
  • Контроль времени запускаInitTimeout ограничивает время инициализации процессов (локально и удаленно)
  • Shutdown timeout — контролируемое завершение узла с логированием зависших процессов
  • pprof labels — каждая горутина актора маркируется PID для отладки через pprof

Новые акторы (Extra Library)

  • Leader — распределенные выборы лидера с консенсусом в стиле Raft. Автоматический failover, защита от split-brain через кворум большинства
  • Metrics — экспортер метрик Prometheus с автоматическим сбором телеметрии узла и сети

Новые мета-процессы

  • SSE (Server-Sent Events) — однонаправленный стриминг сервер-клиент по HTTP с полной поддержкой спецификации SSE

Производительность

  • Локально: 21M+ сообщений/сек
  • По сети: ~5M сообщений/сек
  • Distributed Pub/Sub: 2.9M сообщений/сек доставка 1,000,000 подписчикам на 10 узлах (10 сетевых сообщений вместо 1M)

Исправления

  • Критический баг: сигналы завершения (Link/Monitor exits) некорректно отклонялись из-за неверной валидации incarnation в сетевом слое

Документация

Полностью переписана и включена в репозиторий. Новые статьи:

  • Project Structure — организация проектов с уровнями изоляции сообщений
  • Building a Cluster — пошаговое руководство по распределенным системам
  • Message Versioning — эволюция контрактов сообщений в кластерах
  • Debugging — build tags, pprof, отладка зависших процессов

Ссылки

>>> Список изменений

★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 2)
Ответ на: комментарий от chemistmail

Мне не нужны деньги, времени просто нет. Разовая акция по переводу =/= поддержание ее в актуальном состоянии.

Самое удивительное, народ с претензией приходит, а не с предложением «давай помогу». Это опенсорс проект. Мне за него не платят.

ergo ★★★★
() автор топика
Ответ на: комментарий от Xintrea

Не вижу никакого батхерда, чувак написал код, и написал доку. Проблем с ее прочтением нет никаких. Корректный перевод доки это трудозатраты, а он и так бесплатно работу сделал…. У вас претензия? Может лучше оформите пулреквест с русской докой? Нет? сложно? лень?

Или просто вам кто то что то должен?

chemistmail
()
Ответ на: комментарий от chemistmail

Да я что-то сразу не сообразил посмотреть какие-нибудь сведения о локации человека и прочее. Для меня ergo - просто одиозный персонаж с ЛОРа. Но вот потыкался и увидел пару вещей, которые все ставят на свои места (информация открытая): Тарас Халтурин, Switzerland. Кому нужно, тот все понял.

В любом случае, саму Open Source разработку, которой занимается автор, я всячески поддерживаю. Продолжать не вижу смысла, чтобы дискуссия в танцпол не превратилась.

Xintrea ★★★★★
()
Ответ на: комментарий от Xintrea

Simply English

а вы точно знаете как пишут носители языка?

ripgrep
()
Ответ на: комментарий от ergo

Понимаю проблему. )) Люди как люди, только квартирный вопрос их испортил ))

Забей. Дебилов всегда и везде хватало. Я историю древнего Рима эпизодически почитываю, после нее такое поведение только улыбку вызывает. ))

Хочу потыкать, если в обозримое будующее будет время закину пулреквест со спекой для пакетного менеджера nix на установку твоего хозяйства и окружения erlang с elixir с инструкцией получения рабочего окружения под все это хозяйство

в какую нить папку examples или еще чет подобное? будет тупо файл по которому можно будет сделать фиксированное окружение с конкретными версиями erlang, elixir + golang c твоей либой

вариант на быстро потыкать и посмотреть. Можно в тесты куда нить…

chemistmail
()
Ответ на: комментарий от chemistmail

Нет? сложно? лень?

У меня своих OpenSource разработок навалом, мне есть чем заняться. К тому же я не из мира гошечки и эрланга.

Xintrea ★★★★★
()
Ответ на: комментарий от ergo

форкнул и плюсик добавил, отпиши куда мне лучше код для nix кинуть.

Ну и для поддержки проекта, если надо есть лаба, могу железо выделить. 16 cpu, 24 гига оперативы, 400 ssd и там еще hdd несколько терабайт, но я его не трогал, не помню сколько.

chemistmail
()
Ответ на: комментарий от Xintrea

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

Я не буду углубляться в политику, тут ей не место да и причин тут ее поминать нет.

Людей нужно оценивать по делам. А про судить в библии написано.

chemistmail
()
Ответ на: комментарий от chemistmail

Спасибо за предложение. У меня хватает этого гуталина ))). На счет опакечивания (или как правильно?)… в этом нет смысла. Гошный компилятор сам всю магию с зависимостями делает.

Если реально соберетесь с кем-то и скооперируйтесь в плане перевода документации (и важно ее сопровождения) я могу организовать ru.docs.ergo.services для этого

ergo ★★★★
() автор топика
Ответ на: комментарий от chemistmail

Если оно опенсорс, то должны быть ссылки? или как?

Вообще-то в профиле стартовая ссылка есть. Но если вы так заинтересованы, что вам лень несколько кликов мышкой сделать, то вот:

https://github.com/xintrea/

https://webhamster.ru/site/page/index/articles/projectcode

Встречный вопрос: если уж на то пошло, покажите и вы свои Open Source проекты. А то на ваш haskell.su ни в каком виде даже через VPN не достучаться: браузер говорит, что HTTPS-версия сайта haskell.su недоступна, а по HTTP «Невозможно подключиться к серверу haskell.su / Время ожидания соединения с haskell.su истекло», а через альтернативный путь «504 Gateway Timeout».

Xintrea ★★★★★
()
Ответ на: комментарий от chemistmail

историю древнего Рима эпизодически почитываю

О, а я не дочитал ее. Очень крутая книга кстати. Автору за нее регалий отсыпали. Он на ее написание много лет потратил

ergo ★★★★
() автор топика
Ответ на: комментарий от chemistmail

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

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

Xintrea ★★★★★
()
Ответ на: комментарий от ergo

Я могу оплатить процесс, но времени на организацию этого точно нет. Оно на зарабатывание денег уходит )) У меня в среднем 11-12 проектов постоянно в работе… И еще личная жизнь с детьми собакой и котом ))

Пакетирование, думаю так. Смысл nix в том что все кто развернет по спеке получат строго фиксированное окружение, речь не только по ergo а про ergo + erlang + производные можно тесты взаимодействия делать. Окружение гаранированно воспроизводится.

Собственно у меня есть выделенное время на изучение того чего я не трогал, это около 6 часов в неделю. В рамках этого я хочу посмотреть взаимодействие нод erlang с ergo. Ну и спеку под окружение точно напишу, там минут 10 от силы.

тут как говориться хозяин барин, я себе буду собирать на посмотреть и потестить а там как хочется.

chemistmail
()
Ответ на: комментарий от ergo

Тит Ливий. История древнего Рима. Я ее сам уже третий год читаю…. Там то волосы дыбом, то тупая задумчивость… ))

Я Шекспира за полгода всего осилил, но тут другая тема.

Еще Иллиаду Гомера рекомендую, после первых 20 страниц читается на ура, только потом стихами пару месяцев разговариваешь )) Ну и сцены битв бесподобны….

chemistmail
()
Ответ на: комментарий от ergo
k8s:(haskell)  😀  ~/work/src
➜ ghci
zsh: command not found: ghci
k8s:(haskell)  👿  ~/work/src
➜ cd kosiaka
direnv: loading ~/work/src/kosiaka/.envrc
warning: Nix search path entry '/nix/var/nix/profiles/per-user/root/channels' does not exist, ignoring
direnv: export +AR +AS +CC +CONFIG_SHELL +CXX +DEVELOPER_DIR +FOO +HOST_PATH +IN_NIX_SHELL +LD +LD_DYLD_PATH +MACOSX_DEPLOYMENT_TARGET +NIX_APPLE_SDK_VERSION +NIX_BINTOOLS +NIX_BINTOOLS_WRAPPER_TARGET_HOST_aarch64_apple_darwin +NIX_BUILD_CORES +NIX_BUILD_TOP +NIX_CC +NIX_CC_WRAPPER_TARGET_HOST_aarch64_apple_darwin +NIX_CFLAGS_COMPILE +NIX_DONT_SET_RPATH +NIX_DONT_SET_RPATH_FOR_BUILD +NIX_ENFORCE_NO_NATIVE +NIX_HARDENING_ENABLE +NIX_IGNORE_LD_THROUGH_GCC +NIX_LDFLAGS +NIX_NO_SELF_RPATH +NIX_STORE +NM +OBJCOPY +OBJDUMP +PATH_LOCALE +RANLIB +SDKROOT +SIZE +SOURCE_DATE_EPOCH +STRINGS +STRIP +TEMP +TEMPDIR +TMP +ZERO_AR_DATE +__darwinAllowLocalNetworking +__impureHostDeps +__propagatedImpureHostDeps +__propagatedSandboxProfile +__sandboxProfile +__structuredAttrs +buildInputs +buildPhase +builder +cmakeFlags +configureFlags +depsBuildBuild +depsBuildBuildPropagated +depsBuildTarget +depsBuildTargetPropagated +depsHostHost +depsHostHostPropagated +depsTargetTarget +depsTargetTargetPropagated +doCheck +doInstallCheck +mesonFlags +name +nativeBuildInputs +out +outputs +patches +phases +preferLocalBuild +propagatedBuildInputs +propagatedNativeBuildInputs +shell +shellHook +stdenv +strictDeps +system ~PATH ~TMPDIR
k8s:(haskell)  😀  ~/work/src/kosiaka
➜ ghci
GHCi, version 9.6.6: https://www.haskell.org/ghc/  :? for help
ghci>
Leaving GHCi.
k8s:(haskell)  😀  ~/work/src/kosiaka
➜ cd ..
direnv: unloading
k8s:(haskell)  😀  ~/work/src
➜ ghci
zsh: command not found: ghci
k8s:(haskell)  👿  ~/work/src

пример, у меня на рабочей машине direnv в нем прописанна устновка ghc 9.6 с либами, старый проект нужно попилить под изменчивый мир…. ну и как то так.

chemistmail
()
Ответ на: комментарий от Xintrea

haskell.su указывает на белый ip моей старой квартиры, я дом построил, квартира осталась, но интернет я отключил.

Собственно это личный служебный домен. Почта и тд, различные ресуры которые нужны мне лично. Они в общем не публичные.

https://github.com/chemist

Я не программист. Для меня написание кода это в основном хобби. Мой код эпизодически появляется в проде, но это редко.

Моя вилка остаться в теме чем я занимался или уйти в разработку была 10 лет назад, я выбрал остаться, вопрос денег.

Программирование все также остается моим хобби, могу тупо убить выходные на экзотерические языки )) Ну типа на Форт ченить накидать )) Разминка ума.

Я очень давно не писал, а то что писал и пишу не публично. Но как бы ради бога, смотрите ругайте ))

chemistmail
()
Ответ на: комментарий от Xintrea

Я посмотрел твой код.

посмотрел видео в ютюбе где ты рассказываешь зачем оно и почему. Это твое хобби. Ты молодец. Но между нами пропасть в мировоззрении. Я этим на хлеб с маслом зарабатываю последние 28 лет….. А ты чешешь свое самолюбие. Мы не поймем друг друга.

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

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

Но у нас с тобой разные решаемые вопросы. И разные степени абстракции.

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

Но ты все равно крут.

chemistmail
()
Ответ на: комментарий от Xintrea

Если честно я тебе даже завидую… Я очень давно не вижу в этом вообще никакой магии. Для меня это тупо трудозатраты…..

chemistmail
()
Ответ на: комментарий от chemistmail

Тит Ливий. История древнего Рима. Я ее сам уже третий год читаю….

Спасибо за «наводку», почитаю. :)

P. S. «Улыбнул» комментарий к комментарию на «Флибусте»:

" Это Ливий-то нудный? Это ты, пацанчик, ещё Пастернака не читал. А по сравнению с Солженицыным Ливий вообще педантичный хохотунчик."

Somebody ★★★★
()
Ответ на: комментарий от ergo

Самое удивительное, народ с претензией приходит, а не с предложением «давай помогу». Это опенсорс проект. Мне за него не платят.

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

Enthusiast ★★★★
()
Ответ на: комментарий от Enthusiast

Автор понимает, что пользоваться либой будут исключительно программисты которые привыкли к документации на английском. Для кого стараться с выпуском на русском языке?

Lusine
()
Ответ на: комментарий от Lusine

Для кого стараться с выпуском на русском языке?

Для плохо образованных «погромистов», иностранных языков не знающих вовсе, и даже свой, родной, казалось бы, язык знающих даже не на уровне «читаю и перевожу со словарём», а на уровне «читаю и ни черта не понимаю»?.. ;))

Somebody ★★★★
()
Ответ на: комментарий от Enthusiast

Вы всё правильно говорите (как и остальные радетили великого и могучего), только для получения результата нужны не комментарии на лоре, а PRs в репозитарии проекта.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

«радетели». Проверочное слово «радЕть». И читать все-таки надо больше.

Lusine
()
Ответ на: комментарий от kaldeon

@token_polyak, тебе ещё никто не говорил, что заменяя сообщения клоунами, ты ведёшь себя как тупой?

kaldeon ★☆
()
Ответ на: комментарий от Somebody

Битва Горациев и Курациев…. Эпично, драматично и вообще… Я с нее вообще залип. Удивляюсь как с этого сериал не сделали, там же все, кровь, кишки, любовь, драма и тд.

chemistmail
()
Ответ на: комментарий от Somebody
  • Корриолан Шекспира, тоже прикольно. Есть фильм весьма интересно сделанный, кусок для затравки https://www.youtube.com/watch?v=V7JqgcXUyak

Фильм практически 1:1 от оригинальной книги. Ну по тексту. Весьма близок.

chemistmail
()
Последнее исправление: chemistmail (всего исправлений: 1)
Ответ на: комментарий от chemistmail

спасибо. :))

книгу скачал, начинаю читать... :)

Somebody ★★★★
()
Ответ на: комментарий от chemistmail

Но между нами пропасть в мировоззрении. Я этим на хлеб с маслом зарабатываю последние 28 лет….. А ты чешешь свое самолюбие. Мы не поймем друг друга.

Я вообще-то руководствуюсь совершенно другими принципами. Почитай вот это:

https://habr.com/ru/articles/316814/

Это статья 2016 года, когда до бума нейросетей (ChatGPT появился в 2022) было еще далеко. И инструменты формирования «второй памяти» были вот такими. Но даже тогда сразу появились люди, которые крутили пальцем у виска и говорили: зачем это все? Ты просто какой-то «цифровой плюшкин», все есть в интернете, мы живем в новую эпоху, все это никуда не денется.

Мда, не знали они тогда, что появятся такие гига-цифровые-плюшкины-корпорации, которые выпылесосивают все данные до которых только смогут дотянуться с тысячными штатами сотрудников, которые подготавливают и нормализуют информацию для нейроболванов, а информация - это их база и корм. А так же не знали в какое дерьмище превратится интернет через 10 лет: информация теперь сокрыта в телеграммных/вазапных чатах и никак не индексируется, а свободный обмен информацией блокируется на государственном уровне. Появившиеся нейросети же - прекрасные интерактивные справочники, но никогда не знаешь в какой момент они галлюцинируют. Когда такой треш вокруг происходит, наличие личного PIM с проверенной информацией, накапливаемой годами, начинает казаться единственным островком вменяемости. Этим я делюсь с людьми, и в этом состоит, по сути, миссия проекта.

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

Ох, профессионал... Ты реально думаешь, что менеджер заметок - это простые формы? Если в GUI-приложении ~180 классов, а ты видишь только одно окно, тебе не кажется, что в нем есть что-то еще, помимо десятка формочек? А если просто посмотреть на скриншоты, то можно задаться вопросом: там что, есть WYSIWYG редактор, да еще и с поддержкой таблиц? А наличие трансляции записей в Web тебя не наводит на мысль, что помимо самого менеджера на Qt/C++ есть еще какая-то инфраструктура? С хостингом, веб-сервером и сетевыми службами, веб-приложением, безопасностью, сертификатами, бекапами?

https://webhamster.ru/site/page/index/monitorMytetraShare

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

Моими сервисами пользуются тысячи людей в день, за год - это тот же самый миллион. За годы существования проекта - десятки миллионов. Посмотри что такое MyTetra Share и MyTetra Web Client - это к тому, что вокруг менеджера заметок надо еще сделать инфраструктуру свободного обмена информацией. Я не корпорация, и размах у меня нулевой по сравнению с тем что могут себе позволить твои работодатели. Но я трачу свои собственные деньги и знания на обеспечение работы этих сервисов.

Так что, если области наших знаний пересекались, то гарантирую, что в мой детский сад ты хоть раз, да заходил с поисковиков. И находил то, чего не было в других местах. Вот такой парадокс. Так что подумай на досуге, кто из нас чешет свое самолюбие: не тот ли, кто считает себя «профессионалом», не замечая очевидные вещи, и имеющий глупость называть других любителями.

Xintrea ★★★★★
()
Ответ на: комментарий от ergo

У ерго нет только изоляции процессов, которые есть в биме ерланга.

Я так понимаю, это автоматом закапывает fault tolerance и дерево супервизоров?

Потому что смысл перезапускать код (процесс, актор), если нельзя очистить данные, потому что они не изолированы.

dredd_test
()
Ответ на: комментарий от dredd_test

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

ergo ★★★★
() автор топика
Ответ на: комментарий от ergo

Прочитал. Не понял.

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

В эрланге супервизор перезапустит процесс и beam полностью стирает все следы. Ни один другой процесс и его данные не страдают, потому что изоляция и иммутабельность!

В ergo будет тоже самое? Или я, когда порчу данные в своем говнопроцессе, испорчу неизолированную общую с кем то область, и теперь уже не имеет значения сколько раз перезапускать этот говнопроцесс, он будет в каждом новом сообщении получать испорченные данные, потому что они были расшарены когда портились?

dredd_test
()
Ответ на: комментарий от dredd_test

Если ты целенаправленно хочешь отстрелить себе ногу и обменяться указателями - твой выбор. В остальных случаях терминация процесса унесет с собой свой стейт. Супервизор рестартанет согласно стратегии.

ergo ★★★★
() автор топика
Ответ на: комментарий от ergo

Если ты целенаправленно хочешь отстрелить себе ногу и обменяться указателями - твой выбор.

А вообще конечно странно ждать «неуказателей» учитывая что оно там по-умолчанию:

package main

import (
	"fmt"
)

type User struct {
	Name []byte
}

func main() {
	user := User{Name: []byte("right")}

	fmt.Println("До вызова функции:", string(user.Name))
	changeName(user)    // !!!!!!  НЕ УКАЗАТЕЛЬ    !!!!!
	fmt.Println("После вызова функции:", string(user.Name))
}

func changeName(u User) {
	u.Name[0] = 'w'
}

И вывод:

go run main.go
До вызова функции: right
После вызова функции: wight
dredd_test
()
Ответ на: комментарий от dredd_test

Тут ведь какое дело. Язык дает возможности. Их можно использовать как преимущество. Но если у девелопера не хватает мозгов, то и ерланг тут не поможет. Целенаправленно стрелять себе в голову или в ногу - твой выбор.

Хорошая новость в том, что тебя никто не заставляет пользоваться этим фреймворком. Согласись, хорошо же :).

PS ты ведь понимаешь, что это смешно рассказывать мне как устроены референсные типы в го, верно? ))

ergo ★★★★
() автор топика
Ответ на: комментарий от ergo

Хорошая новость в том, что тебя никто не заставляет пользоваться этим фреймворком. Согласись, хорошо же :).

Тут ведь какое дело. Выходит, что fault tolerance, который дает эрланг, и fault tolerance, который дает ergo отличается как … ммм … КПП пентагона от таблички в баре «давайте жить дружно».

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

Но и иммутабельность в эрланге присутствует не потому что Джо что-то в голову ударило. Без иммутабельности оказывается нет изоляции и нормального fault tolerance. А в go ее нет по дизайну.

dredd_test
()
Ответ на: комментарий от ugoday

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

kaldeon ★☆
()
Последнее исправление: kaldeon (всего исправлений: 1)
Ответ на: комментарий от kaldeon

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

Здесь важно добавить «художественную». Научную, научно-популярную и прочий нон-фикшен в принципе можно писать на мировом уровне на неродном языке.

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

Два чая! Чем больше языков знаешь, тем глубже становится и понимание родного, и тем гибче навыки работы с ним. Начинаешь замечать закономерности, особенности, сходства, различия, выгодные и слабые стороны, чтобы их использовать во благо, или наоборот замести под ковёр, и т. д.

CrX ★★★★★
()
Ответ на: комментарий от kaldeon

По грехам моим я мал-мала болтаю на английском и самую чуточку на немецком. Признаю, я не очень талантлив в плане языков, но я потратил целую гору времени, хватило бы второе высшее получить, наверное. А что в результате? Говорю как чурка и только на профессиональные и некоторые бытовые темы. Часть мыслей, что я легко могу выразить на родном, я могу выразить на чужих языках. А в альтернативном мире, где иностранцы учили бы Русский, я бы потратил это время на фигню на то, чтобы думать новые сложные мысли. Совсем бы другая жизнь пошла (но это не точно).

ugoday ★★★★★
()
Ответ на: комментарий от CrX

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

А инструкцию к микроволновке можно и вовсе автопереводчиком перевести. Толку то.

ugoday ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.