Как стать автором
Обновить
966.87

Программирование *

Искусство создания компьютерных программ

Сначала показывать
Порог рейтинга

Как разработчики решали одну маленькую, но NP‑полную проблему — поделимся на конференции GoCloud про облака 📝

Что общего между загрузкой транспортных контейнеров на судно и грамотным формированием портфеля ценных бумаг? Все это задачи комбинаторной оптимизации, которые можно свести к спиновой модели. Квантового компьютера под рукой не оказалось, зато были две Tesla V100 с кучей памяти и тензорных ядер, методы линейной алгебры, альфа-бета отсечение и фортрановские библиотеки. Не то чтобы все это было необходимо, но хотелось найти точное решение, которым ведущий разработчик Cloud.ru Александр Мальцев поделится на конференции GoCloud.

📌 Тема: Кейс: как решить одну маленькую, но NP‑полную проблему

📅 Когда: 21 марта в 15:30 мск

👉 Зарегистрироваться

Что еще интересного будет на GoCloud, смотрите в программе конференции

Полезное в блоге:

Теги:
Рейтинг0
Комментарии0

«Много ядер» не имеет смысла

Нашумевший в конце прошлого года своим выходом мощный процессор AMD Threadripper Pro 7995, оказывается, не оправдывает себя в реальной жизни. Здесь понимаем под этим обычные условия использования, т. е. нет специального навороченного охлаждения, обычный корпус, память в пределах разумного и т. д.

AMD Threadripper 7000
AMD Threadripper 7000

Вот тут описывается опыт использования в разных конфигурациях. Вкратце: из‑за поставленного ограничения на тепловыделение в 350 Вт процессор не использует всю имеющуюся у него мощь, так что работа всего на 16 ядрах оказывается равносильна работе на всех 96. Процессор просто сбрасывал скорость при достижении предельного тепловыделения. Нагрузка была в виде сборки всего проекта Хромиум. Плюс ко всему, потребовалось значительно больше памяти, для того, чтобы сборка в принципе работала на таком большом количестве ядер. Для использования всей мощности автору пришлось делать специальную конфигурацию машины.

В общем чип оправдывает себя только при использовании в специальных условиях.

По своему опыту могу сказать: на старенькой машинке Атлон II x4 (2009г) Хромиум собрался за ~40 часов.

Теги:
Всего голосов 3: ↑3 и ↓0+3
Комментарии14

Как превратить блочное хранилище в объектное — тема доклада на IT-конференции GoCloud про облака 📝

Всем привет! Продолжаем знакомить с программой конференции GoCloud про облака.

📌 Тема: Cloud.ru Evolution Object Storage: как превратить блочное хранилище в объектное

📅 Когда: 21 марта в 14:40 мск

Если вам интересны вопросы масштабирования, версионирования и консистентности в понимании протокола S3 — приходите послушать доклад. Расскажем о том, как написали свое объектное хранилище, какие подходы рассматривали и с какими проблемами столкнулись.

👉 Зарегистрироваться на GoCloud

Что еще интересного есть в блоге:

Теги:
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Фильтры Throttling VS Debounce

Оказывается, они работают по-разному )

Еще посты об IT в ИТ БД → t.me/it_bd

Оба этих фильтра используются для того, чтобы не дублировать события.

Например, пользователь злостно и быстро кликает на кнопку «Обновить» десять раз подряд.

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

В этом случае нужно отфильтровать лишние события, то есть пропустить лишние клики, обработав лишь 1 событие.

И тут есть два подхода:

  • Throttling  — пропускает первое событие и игнорирует остальные N миллисекунд

    Например, если установить Throttling = 500мс, то обработается первый клик, а все следующие 500мс клики будут игнорироваться.

  • Debounce  — отсчитывает N миллисекунд после последнего события и только после этого пропускает последнее событие.

    Например, если установить Debounce = 500мс, то клики будут игнорироваться, пока пользователь не сделает перерыв в 500мс. После 500мс простоя последнее событие обработается.

остальные посты

Теги:
Всего голосов 7: ↑5 и ↓2+3
Комментарии0

5 полезных расширений VScode для работы с документацией

  1. Draw.io Integration

    Хорошо подходит для работы со сложными диаграммами: сперва можно создать диаграмму в десктопной версии Draw.io, а потом доработать ее в VScode с помощью расширения Draw.io Integration.

Создание диаграммы Draw.io с помощью расширения Draw.io Integration (иллюстрация: Rami Krispin)
Создание диаграммы Draw.io с помощью расширения Draw.io Integration (иллюстрация: Rami Krispin)
  1. Quarto

    Quarto — крутая штука для работы с документацией под R, Python, Julia и Observable. Расширение Quarto для VScode поможет редактировать и рендерить QMD-файлы. В нем есть режим предварительного просмотра, который позволяет менять код документа и одновременно просматривать результат.

  2. Jupyter

    Jupyter — один из самых популярных фреймворков для создания заметок, особенно в Python. Кстати, Jupyter классно работает вместе с документацией Quarto для Python. Расширение VScode Jupyter интегрирует заметки Jupyter в редактор VScode и поддерживает ipynb-файлы.

  3. Markdown All in One

    С расширением Markdown All in One удобно редактировать документацию в формате Markdown. Оно располагает два окна рядом: редактор кода и тут же результат.

  4. Mermaid

    Mermaid особенно полезен, если вам нужно создать структуру кодовой базы или динамическую диаграмму. В VScode есть два расширения для работы с файлами Mermaid — Mermaid Preview и Markdown Preview Mermaid Support.

Этот топ расширений составил автор этой статьи, а ее перевод читайте у нас в блоге.

Теги:
Всего голосов 15: ↑14 и ↓1+13
Комментарии2

Числа, которые должен знать каждый программист в 2024 году и далее:

  • L1 cache reference = 1 ns (1 нс)

  • Branch mispredict = 3 ns (3 нс)

  • L2 cache reference = 4 ns (4 нс)

  • Send 1K bytes over 1 Gbps network = 11 ns (11 нс)

  • Mutex lock/unlock = 17 ns (17 нс)

  • Main memory reference = 100 ns (100 нс)

  • Read 1 MB sequentially from memory = 1 us (1 мкс)

  • Compress 1K bytes with Zippy = 2 us (2 мкс)

  • Read 4K randomly from SSD = 16 us (16 мкс)

  • Read 1 MB sequentially from SSD = 19 us (19 мкс)

  • Read 1 MB sequentially from disk = 474 us (474 мкс)

  • Round trip within same datacenter = 500 us (500 мкс)

  • Disk seek = 2 ms (2 мс)

  • Send packet CA->Netherlands->CA = 150 ms (150 мс)

Графическая визуализация этих и других данных (чисел, констант) для программистов.

Напишите, пожалуйста, в комментариях ваши числа для проектов в 2024 году.

Теги:
Всего голосов 9: ↑5 и ↓4+1
Комментарии4

Один из авторов термина Open Source и соучредитель Open Source Initiative Брюс Перенс представил первый черновой вариант новой лицензии Post-Open Zero-Cost, нацеленной на решение накопившихся проблем, связанных со взаимодействием разработчиков открытого ПО и коммерческих компаний в контексте получения справедливой обратной отдачи от коммерческого использования кода.

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

Ключевым отличием лицензии Post-Open от существующих открытых лицензий, таких как GPL, является введение договорной составляющей, доступной для расторжения в случае нарушения условий лицензии.

В Post-Open предусмотрено два вида договорных соглашений: бесплатный и платный. Платный договор предусматривает возможность заключения соглашения на предоставление дополнительных прав и применяется при коммерческом распространении продуктов или внесении изменений без их публичного раскрытия.

Лицензия также определяет организацию POST-OPEN ADMINISTRATION, выступающую от имени лицензиаров, являющуюся их юридическим представителем, при необходимости отстаивающую их права и занимающуюся распределением полученных средств с учётом вклада в разработку.

Источник: OpenNET.

Теги:
Всего голосов 4: ↑4 и ↓0+4
Комментарии0

На GitHub под лицензией Apache License 2.0 опубликован проект под названием Nuke v1.1.0. Это реализация арены памяти для Go с бенчмарками и даже реализацией параллельной арены.

Арена памяти — это метод управления памятью, при котором сразу выделяется большой блок памяти, а его части используются для удовлетворения запросов выделения от программы. В контексте языка со сборкой мусора, такого как Go, использование арен памяти может дать несколько преимуществ:

  • повышение производительности: распределяя память большими блоками, арены памяти сокращают накладные расходы, связанные с частыми вызовами системного распределителя памяти;

  • Улучшенная локальность кэша. Арены памяти также могут улучшить локальность кэша, размещая тесно связанные объекты в одном блоке памяти;

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

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

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

​​​​? 15 марта, 11:00 

? Бесплатный митап «1С в облаке: возможности и риски, решения и кейсы»

Совместно с Инфостарт проводим митап, посвященный 1С в облаке: разберем реальные кейсы, поговорим о бюджетах, сроках, возможностях и рисках.

Митап будет вам полезен, если вы задавались вопросами: 

  • Какие инфраструктурные решения существуют?

  • Как выбрать подходящее решение для вашего бизнеса?

  • Как распределить роли на проекте по миграции?

  • Как рассчитывать бюджет и какие затраты планировать? Как управлять рисками?

В программе митапа круглый стол и пять докладов, с одним из которых выступит Михаил Успенский — наш менеджер продуктов 1С. 

Регистрируйтесь на митап и получите промокод на использование готового облака 1С или других услуг Selectel ➡️

Теги:
Всего голосов 22: ↑20 и ↓2+18
Комментарии0

Учиться программированию… в Roblox

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

Но недавно начал изучать платформу Roblox, и был приятно удивлён её простотой и мощностью. Код в нём пишется на языке Lua (если быть точнее, то на специальном подмножестве «Roblox Lua», но для начинающих это не имеет значения).

На мой взгляд, в обучении программированию очень важен короткий цикл обратной связи — «написал две строчки, запустил, увидел, как они что‑то поменяли, продолжаешь».

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

После прохождения туториала Coding Fundamentals (около 4 часов в неспешном режиме), я потратил несколько вечеров на создание демонстрации работы «пузырьковой» сортировки.

Код вышел в ~300 строчек с учетом работы с 3D примитивами, которые изображают сортируемый массив:

https://github.com/itlgrim/roblox‑demos/blob/main/sorting‑algorithms/bubble‑sort/BubbleSort.module.lua

Кому интересно, там же лежит файл с уровнем, который можно открыть в Roblox Studio:

https://github.com/itlgrim/roblox‑demos/blob/main/sorting‑algorithms/bubble‑sort/Bubble Sort Demo v1.rbxl

Саму трёхминутную демку залил на YouTube (как оказалось, я не первый, кто пишет сортировки в Roblox, но могу заверить, что эта идея родилась у меня независимо):

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Что если использовать гамма-спектрометры и бета-спектрометры Atom Spectra как поисковые приборы?

В этом видеоролике поговорим о применении гамма-спектрометров Atom Spectra Nano, Atom Spectra Nano PRO и Atom Spectra Beta PRO в качестве поисковых приборов. И покажем на примере перемещающегося источника излучения модель пятнистости распределения загрязнения на грунте.

Да. Над программным обеспечением в части графика cps/МЭД ещё можно поработать. Эта часть приложения для гамма-спектрометра уступает приложению Atom Swift для счётных сцинтилляторов и гейгеров Проекта Атом. Тем не менее вполне информативно.

На территориях радиоактивно загрязненных и обозначенных на картах по цезию-137 как 4-40 кБк/кв.м никакие приборы, называемые в народе дозиметры не покажут никаких интересных средних значений. На правой части этого диапазона у спектрометра ещё есть шансы показать загрязнение по цезию-137 (линия/пик на 662кэВ) довольно быстро. А вот в левой части этого диапазона загрязнений можно попасть в ситуацию, когда время на набор статистики в качестве спектрометра окажется больше, чем возможность просто перемещая спектрометр Atom Spectra на дистанциях 10-30 метров легко обнаружить пятнистость распределения загрязнения. Пятнистость есть всегда. Это не идеальное лакокрасочное покрытие. Именно пятнистость даст бОльший разброс значений cps или мощности дозы по сравнению с зоной 2кБк/кв.м. В зоне 2кБк/кв.м никакими приборами и никакими методами загрязнение не обнаружить. Дальше только радиохимия.

Теги:
Рейтинг0
Комментарии0

Что если детектор радиации должен обнаружить радиоактивный груз, двигающийся на большой скорости?

КБ Радар демонтировало свой стенд на ВДНХ 25 февраля вечером, но перед этим к нам в гости приехал соавтор приложения для спектрометров Atom Spectra - Сергей и привез с собой кучу интересных датчиков радиации  для тестирования скорости реакции датчиков на движущийся источник излучения.

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

Теги:
Всего голосов 5: ↑5 и ↓0+5
Комментарии0

Состоялся выпуск Tcl/Tk 8.6.14, динамического языка программирования, распространяемого совместно с кроссплатформенной библиотекой базовых элементов графического интерфейса. Основное распространение Tcl получил как платформа для создания интерфейсов пользователя и как встраиваемый язык, при этом Tcl также подходит для быстрого прототипирования, веб-разработки, создания сетевых приложений, администрирования систем и тестирования.

Исходный код проекта распространяется под лицензией BSD.

Основные изменения в Tcl/Tk:

  • приведена к кроссплатформенному виду нормализация файловых путей и обработка символа "~" в путях;

  • имя пути, начинающееся с '//' не замещается через '/' в том числе в Cygwin и в QNX;

  • разрешён пустой режим в [chan create] ("[chan create {} $cmd]") для разрешения refchan версии [socket -server];

  • повышена производительность fork при использовании многопоточности с помощью vfork/spawn;

  • обеспечен вызов getsockname(2) в Tcl_MakeFileChannel(3) только тогда, когда это необходимо;

  • защита Tcl/tclsh усилена с помощью функции pledge(2) в OpenBSD или похожих механизмов;

  • tcltest адаптирован для поддержки Tcl 9 (>= tcltest 2.5.7);

  • обеспечено применение замещающего символа при декодировании неполных последовательностей Unicode;

  • из win/makefile.vc убрана опция utf16;

  • zlib обновлён до версии 1.3.1;

  • libtommath обновлён до версии 1.2.1;

  • install-sh обновлён до версии 2020-11-14.01;

  • добавлена поддержка Unicode 15.1;

  • в "[interp limit time -seconds]" решена проблема 2038 года.

Источник: OpenNET.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
10 – 11 октября
HR IT & Team Lead конференция «Битва за IT-таланты»
МоскваОнлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн

Копал в поисках хорошего материала — и откопал вот это чудо:

HOMS — Hardware-Oriented Microprocessor Simulator, или аппаратно-ориентированный симулятор микропроцессора. Автор этого образовательного проекта — профессор, написавший две книги в области электроники и программирования:

Github автора.

В первоисточнике о проекте утверждается, что:

  • комплектующие доступны на любом рынке электроники;

  • возможно создавать инструкции ассемблера под свои задачи;

  • HOMS не требует ПК.

Лицензия — CC BY-NC-SA 4.0 DEED.

Полное техническое описание HOMS в PDF.

Теги:
Всего голосов 4: ↑4 и ↓0+4
Комментарии0

Проклятие дженериков 💀

Дженерики могут показаться очень простой темой.
Например, вот так в Java выглядят классные и простые методы интерфейса List:

interface List<E> extends Collection<E> {
	boolean add(E e);
	E set(int index, E element);
}

Но у обобщений много нюансов: вложенность, вариантность, границы и т.д. Это сильно усложняет их использование.
Вот не менее классный, но совсем непростой flatMap интерфейса Stream🙈:

interface Stream<T> extends BaseStream<T, Stream<T>> {
	<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
}

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

Из-за таких сложностей, в языке Go (философия которого - простота и минимализм) дженерики появились аж через 12 лет после релиза языка. А первый коммент про то что нужны дженерики появился меньше чем через 24 часа🙃

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

  • С++ вышел в 1979, дженерики - 1986

  • Java - 1996, дженерики - 2004

  • C# - 2001, дженерики - 2005

  • Go - 2009, дженерики - 2021

Теги:
Всего голосов 5: ↑3 и ↓2+1
Комментарии8

16 сервисов для Создания Резюме и Профиля LinkedIn с использованием Искусственного Интеллекта. Часть 2

← Читать первую часть

  1. resumeworded — Бесплатная мгновенная обратная связь о вашем резюме и профиле LinkedIn.

  2. jasper — ИИ копирайтер Jasper поможет генерировать интересные статьи в LinkedIn.

  3. resumaker ai — Конструктор резюме.

  4. rezi ai — Платформа для составления резюме.

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

  6. mosaic ai — Помогает подобрать подходящие ключевые слова для резюме.

  7. CVJury — Конструктор резюме, сопроводительного письма и профиля LinkedIn.

Канал по программированию на Python (материалы, обзор библиотек и тд.)

Теги:
Всего голосов 7: ↑6 и ↓1+5
Комментарии0

16 сервисов для Создания Резюме и Профиля LinkedIn с использованием Искусственного Интеллекта.

  1. kickresume — На сайте лежат настоящие резюме людей, которых взяли, например, в Amazon. Используйте их в качестве шаблона.

  2. copy ai — Поможет создать резюме на нейросетях. Выберите шаблон «Resume», вбейте желаемую должность, напишите о себе в свободной форме, стиль текста профессиональный и вы получите четкое описание ваших навыков разбитых по пунктам.

  3. enhancv — Более 1000 примеров резюме.

  4. HyreSnap — Бесплатный конструктор резюме на основе искусственного интеллекта. ИИ сделает ваше резюме максимально совместимым с описаниями вакансий.

  5. resumestar io — онлайн-редактор создает современные одностраничные резюме.

  6. skillroads — Конструктор резюме на базе искусственного интеллекта. ИИ знает, какие навыки необходимо добавить и какой опыт выделить.

  7. hiration — Сервис оценит текущее резюме и сопроводительное письмо и предложит изменения.

  8. resumA.I. — Напишет и отредактирует пункты резюме с помощью ChatGPT.

  9. thisresumedoesnotexist — 1000 примеров AI резюме (на базе enhancv).

    Часть 2. Продолжение

Теги:
Всего голосов 4: ↑3 и ↓1+2
Комментарии1

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

Открыл он task.c в VS Code, после объявления первой функции набрал открывающую скобочку и нажал enter. Codeium написал первую строку, - раньше мы занимались JavaScript, и я ему посоветовал его поставить. Правильно. Он нажимает tab, снова enter, - опять правильно. Короче, 95% кода он протаббил, причем, самый сложный код (работа с памятью). Немного сам поменял логику где надо только.

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

Минуты две мы это переваривали на уровне: "Он нас слышит". Потом я вспомнил, что этот же тест давался в колледже и год назад, а может и ранее, и, скорей всего, информация о нем есть в интернете, хотя прямых упоминаний я ненагуглил. Так что, и слышит, и видит, и знает.

Короче, чувства от всего этого очень противоречивые. Как бы не оказалось от Codeium вреда больше, чем пользы в этом случае.

Теги:
Всего голосов 4: ↑3 и ↓1+2
Комментарии0

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

Playground screenshot
Playground screenshot

Кроме плейграунда работает локальная демка для Windows и Linux/x84-64 и сборка из исходников (ARM64).

Контекст: Экспериментальный язык Аргентум:

  • безопасный: memory safe, type safe, null-safe, array-index-safe..., не имеет небезопасных кастов, unsafe режима или взлома через рефлексию,

  • быстрый и компактный (не требует виртуальных машин и фреймворков, исполняемые файлы измеряются килобайтами),

  • автоматически удаляет объекты в предсказуемые моменты времени (что позволяет котролировать не только память, но и другие ресурсы),

  • в отличие от Раста и Свифта - гарантирует отсутствие утечек памяти,

  • в отличие от Go, Java, Kotlin, JS, Python - не использует сборщик мусора, поэтому приложения не имеют спорадических пауз и не страдают перерасходом памяти и процессорного времени,

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

  • во время компиляции детектит нарушения инвариантов композиции и агрегации в иерархиях объектов,

  • может напрямую вызывать Си-код и грабить корованы.

Детали: https://aglang.org/

Теги:
Всего голосов 12: ↑12 и ↓0+12
Комментарии28

Опубликован релиз языка программирования общего назначения Rust 1.76, основанного проектом Mozilla, но ныне развиваемого под покровительством независимой некоммерческой организации Rust Foundation.

Rust сфокусирован на безопасной работе с памятью и предоставляет средства для достижения высокого параллелизма выполнения заданий, при этом обходясь без использования сборщика мусора и runtime (runtime сводится к базовой инициализации и сопровождению стандартной библиотеки).

Методы работы с памятью в Rust избавляют разработчика от ошибок при манипулировании указателями и защищают от проблем, возникающих из-за низкоуровневой работы с памятью, таких как обращение к области памяти после её освобождения, разыменование нулевых указателей, выход за границы буфера. Для распространения библиотек, обеспечения сборки и управления зависимостями проектом развивается пакетный менеджер Cargo. Для размещения библиотек поддерживается репозиторий crates.io.

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

Релиз Rust 1.75 состоялся в конце декабря 2023 года.

Теги:
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Вклад авторов