Обновить

Разработка

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

Всем привет.

Хочу вам рассказать о том что я делаю LISP машину на Raspberry Pi Pico W.

Изначально я хочу сделать её похожую на эту:

Вот такой.
Вот такой.

Конечно не такой, но по виду схожую.

Я ещё называю это холодильником.

И. На данный момент я сделал аппаратную часть и перехожу к программной.

Дальше сделаю корпус и всё.

Скажу когда сделаю.

Удачи.

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

Cataclysm: Dark Days Ahead (2025) — как живёт и развивается roguelike, который до сих пор учит выживать

Игра без маркетинга. Без издателя. Без бюджета. Но с кодом, который живёт дольше многих ААА-проектов. Почему Cataclysm DDA всё ещё актуальна — и что из неё может почерпнуть разработчик?

📌 Что это вообще за игра?

Cataclysm: Dark Days Ahead (или просто CDDA) — roguelike-выживалка с открытым исходным кодом. Изначально создана в 2010-х, проект уже давно перерос статус инди-хобби. Вокруг игры сформировалась уникальная архитектура разработки, напоминающая open-source проекты вроде Godot или Blender.

При этом CDDA — это не просто «рогалик». Это огромный симулятор выживания, в котором учитывается всё: климат, диета, микроорганизмы, ткани, генетика, сила удара, источник света, запах, химия топлива, рефлексы NPC…
Она не для всех — но от неё сложно оторваться.

🧬 Почему она до сих пор развивается?

Проект жив благодаря:

  • Cообществу разработчиков, регулярно вносящих правки на GitHub

  • Модульной архитектуре — почти всё, кроме движка, вынесено в JSON

  • Открытому патч-процессу: pull-request может отправить любой желающий

  • Строгому CI — игра проверяется на стабильность при каждом изменении

CDDA — это не Unity и не Unreal. Но это отличный пример того, как жить без них. Игра написана на C++ с минимальной внешней зависимостью и на удивление гибкой логикой.

🧠 Архитектура и интересные решения

  • 📁 JSON Everywhere: почти все предметы, существа, профессии, здания, сценарии, книги, мутанты и их поведение — вынесены в конфиги. Даже атакующие свойства NPC настраиваются без перекомпиляции.

  • 🧪 Эволюция и симуляция: монстры «видят» запах, запоминают игрока, боятся огня, ищут пищу, воспринимают звуки и реагируют на источник света.

  • 🔧 Модификации на лету: моддинг работает в реальном времени. Можно изменить структуру мутанта или добавить новую машину, не трогая движок.

  • 🛠 Технический долг признан открыто: разработчики не скрывают костыли. В issues открыто обсуждаются недоработки, устаревшие решения и предложения по рефакторингу.

🎮 Почему стоит попробовать?

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

🤔 А если хочется поучаствовать?

  • Репозиторий: github.com/CleverRaven/Cataclysm-DDA

  • Discord-разработка: discord.gg/cataclysmdda

  • Редактировать можно всё: от предметов и диалогов — до поведения монстров

  • Написать мод — можно за вечер

💬 И всё же...

Что делает старый roguelike привлекательным даже в 2025 году?
Что заставляет людей править JSON-файлы, компилить на локальной машине, и устраивать «чистки баланса» спустя 10 лет после релиза?

Возможно, потому что эта игра живёт, а не просто запускается.

Мой обзор на YouTube: https://www.youtube.com/live/B_IGiKw2BuQ
Дубликат на RuTube: https://rutube.ru/video/a91c9c71da3808af7381b87e10e5daca/

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

Как немножко хакнуть Мосрег⁠⁠

Всем привет!

При оформлении заявлений в детский сад на детей на uslugi.mosreg.ru столкнулся с тем, что если ранее было подано заявление и нужно какие-то данные в нём поправить, то выбрать год зачисления ребёнка в ДС можно только следующий. То есть, мы подали в 2024, а теперь можно выбрать только 2026 год, потому что текущий нельзя.

Мне показалось это не очень удобным, решил немножко изучить фронтенд сайта и обнаружил, что валидации на простановку года нет :)

В видео подробнее, как обойти ограничение

P.S. На записи не видно контекстного меню в браузере, когда нажимаешь ПКМ, нас интересует последний пункт "Просмотреть код"

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

Обзоры Anti-Malware

В обзорах Anti-Malware рассказали об InfoWatch DCAP — решении для контроля над неструктурированными данными и правами доступа и InfoWatch Activity Monitor — системе мониторинга действий сотрудников за ПК.

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

16-й чемпион мира по шахматам (2013—2023 год) Магнус Карлсен заскучал во время путешествия и обыграл ChatGPT 4o в шахматы без потерь своих фигур. После проигрыша всех пешек и полного доминирования противника ИИ оценила возможности шахматиста-человека на уровне рейтинга 1800-2000 по шкале FIDE или USCF.

Нейросеть GPT-4o выявила хорошее понимание Карлсеном защиты Филидора, а также его тактическую изобретательность и точность действий противника-человека в эндшпиле. ИИ считает, что результат Карлсена может быть даже выше при условии хорошей подготовки.

В настоящее время Карлсен занимает первое место по рейтингу FIDE с 2839 баллами.

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

Когда в 1977 году с Земли стартовали межзвёздные зонды «Вояджер-1» и «Вояджер-2», инженеры NASA понимали, что им предстоит передавать научные данные с расстояний в миллиарды километров. Для защиты от ошибок, вызванных космическими помехами, в бортовые компьютеры изначально были заложены бинарные коды Голея (23,12,7).

Этот код — совершенный линейный блоковый код, способный исправлять до 3 ошибок в каждом 23-битном блоке, построенном из 12 бит данных и 11 бит избыточности. Таким образом, каждое исходное сообщение удваивалось по объёму — накладные расходы составляли 100%. Это было приемлемо для первых этапов миссии, например, при передаче изображений с Юпитера и Сатурна, где помехи были серьёзной проблемой, а расстояние до Земли — ещё не максимальное.

Однако по мере удаления аппаратов от Сатурна и ослабления сигнала стало ясно, что эффективность системы кодирования необходимо пересмотреть. Тогда на борт было дистанционно загружено обновление с реализацией кодов Рида–Соломона — более совершенного метода коррекции ошибок, основанного на конечных полях GF(2^m), работающего с символами, а не битами.

К примеру, код RS(255,223) добавляет 32 символа избыточности к 223 символам полезной информации и способен исправлять до 16 ошибочных символов. В отличие от кодов Голея, здесь накладные расходы составляют около 14–20%, в зависимости от параметров, но при этом значительно выше надёжность: частота ошибок снизилась с 5 на 100 000 бит до 1 на миллион.

Этот переход стал ключевым для долговечности миссии. Он позволил «Вояджерам» продолжать передачу научных данных из-за пределов гелиосферы.

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

Представлен бесплатный ресурс GoalKicker с книгами по IT-тематике от проджект-менеджмента и UX-райтинга до тем по алгоритмам, структурам данным и низкоуровневым языкам, включая ОС и архитектуру компьютеров,.Bash, UNIX, Linux, гайды по работе с командной строкой и прочими тулзами типа Vim, книги по самым востребованным на рынке языкам программирования, всё о работе с базами данных от основ до построения связанных таблиц и интеграции их в системы.

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

Фото из офиса xAI стало вирусным прямо перед запуском Grok 4 — и это совсем не то, чего можно было ожидать. Высокотехнологичная штаб-квартира превратилась в настоящий палаточный лагерь. В связи с тем, что последние усилия по выпуску чат-бота была уже на подходе, работа над ним шла настолько интенсивна, что разработчикам буквально приходится ночевать в палатках. Один из членов команды xAI даже пошутил: «Это не может быть наш офис — здесь должно быть гораздо больше палаток».

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

ИБ-ДАЙДЖЕСТ INFOWATCH

Крупнейшая кибератака на банки Бразилии
Сотрудник C&M Software продал хакерам аутентификационную информацию для доступа к системе компании через свой компьютер — в результате кибератаки со счетов были украдены сотни миллионов реалов.

Новые документы по безопасности КИИ
ЭАЦ InfoWatch подготовил актуальный на июнь 2025 перечень нормативных актов по безопасности КИИ.

Финляндия извлекла урок из кибератаки
Национальный центр кибербезопасности Финляндии поделился практическими методами противодействия атакам на базе инцидента ИБ в администрации Хельсинки — тогда хакерам удалось похитить около 10 млн документов и ПДн 300 тыс. жителей города.

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

ИСКЛЮЧЕНИЕ БЛОКИРОВОК ДЛЯ KNOX СЕРВИСОВ: ENROLLMENT SQUID

Захотелось пустить трафик Android устройства Samsung при первом включении через прокси и посмотреть его логи. Куда на самом деле оно ходит и для чего. Дело в том, что корпоративные политики безопасности некоторых организаций ограничивают права доступа сотрудников в интернет из внутренней сети компании. Однако, когда компания начинает использовать KNOX сервисы, то необходимо разрешить доступ к их серверам.

Cуществует официальная инструкция от Samsung. Она определяет список доменов или IP адресов, необходимых для первоначального включения мобильного устройства или factory reset, когда происходит настройка облачных KNOX сервисов: Knox Mobile Enrollment, Knox Configure, Knox Manage и так далее. Менять корпоративные политики компании и делать whitelist всех возможных IP дело затруднительное, потому что облачные KNOX сервисы используют в большинстве своём Amazon AWS с динамическим распределением IP адресов, а список диапазонов чрезвычайно большой.

Поэтому IT-служба безопасности может сделать простой DMZ (demilitarized zone) Ubuntu Squid прокси для его использования внутри сети организации c разрешённым доступом ко всем диапазонам IP. Прокси, который будет пропускать трафик и использоваться исключительно для целевых доменов, необходимых, чтобы активировать устройства.

Squid.conf настройки

acl enrollment_domains dstdomain .samsung.com .samsungknox.com .secb2b.com .samsunggsl.com

На разные домены нижнего уровня этих четырех адресов KNOX B2B сервисов идут обращения при первом включении устройств. Также необходим трафик и на google сервисы:

 .google.com
.gstatic.com
.gvt1.com
.gvt2.com
.gvt3.com
.googleapis.com
.googleusercontent.com

Для полного счастья Android Setup Wizard, чтобы он не переживал, список можно дополнить иными сервисными адресами, без которых он может обойтись, но так или иначе «стучится» по ссылкам, содержащим следующие строки:

.samsungdm.com
.samsungapps.com
.samsungmobile.com
.bixbyllm.com
.sbixby.com
.samsung-sm-ds.com
.ospserver.net (сервера обновлений)
.samsungcloud.com
.samsungcloudplatform.com

И http_access deny !enrollment_domains, чтобы использовался прокси только для активации устройств или обновлений. Помимо ситуации с политиками компании может оказаться так, что ограничивают право доступа в интернет не корпоративные политики, а провайдер. Тогда на линии провайдера, который работает хорошо, вы ставите такой прокси и пускаете через него enrollment трафик, как в описанном примере. По мотивам обзора новинок XCover7 Pro и TabActive5 Pro

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

Хорошо ли вы разбираетесь в Python?

В Академии Selectel есть небольшой тест на владение синтаксисом Python. Он позволит оценить свои знания и отыскать пробелы. Вопросы подобраны для тех, кто уже не пугается None, но продолжает разбираться, что происходит «под капотом». Бонусом — подборка полезных материалов для изучения Python!

Пройти тест →

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

Парадигмы программирования заложенные в протоколы с обязательным исполнением.

Как в нашей народной, старой и доброй — эталонной сетевой модели OSI.

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

Закладывается экспертный орган, который разрабатывает обязательное внедрение Парадигмы. Закладывается стандарт. Пример — протокол IPv6. Плавный переход.

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

Пример: Возвращаясь к модели OSI, где чисто гипотетически — создаем надстройку для производителей ПО, Операционных Систем и Железа.

Чисто иллюзорно представим:

на восьмой уровень прописываем достаточные и необходимые правила(Парадигмы) и способы взаимодействия конечного кода — для слоя ОС;

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

В итоге с определенной долей вероятности, со временем, ваше ПО, ваша ОС или ваша Железка, — просто не попадет ни на рынок связи, не на военный рынок и не на потребительский рынок с рынком бизнесса. Ибо не будет соотвествовать стандартам качества. Simple.

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

Joomla: как тестировать? Всего 8 минут.

Над CMS Joomla постоянно ведётся работа: создаётся новый функционал, исправляются ошибки, делаются мелкие правки. Разработка ведётся на GitHub. Изменения оформляются в виде Pull Request (PR). Для того, чтобы изменения могли войти в ядро - их обязательно должны успешно протестировать минимум 2 человека КРОМЕ автора изменений. А помочь с большинством PR можно очень и очень быстро, это не занимает много времени, чему подтверждением служит это видео.

Смотреть видео на YouTube

Смотреть на Vk Video

Смотреть на RuTube

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

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

🔮 14 день делаю Конструктор форм в режиме Build in public

Добавил ИИ-магии в наш конструктор форм!

Честно говоря, я сам офигел от того, что получилось закодить!

Можно создавать красивые и удобные формы буквально за секунды с помощью ИИ. Достаточно просто написать запрос, например:

«Сделай форму регистрации на мероприятие»

или

«Сделай форму для заявок на консультацию психолога»

- и всё! Форма генерируется автоматически, остаётся только немного поправить и подогнать под себя.

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

🤔 Как вам такая магия? Пора уже слезать с Гугл Форм? планирую релиз уже в Августе!

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

DCAP как необходимый компонент комплексной защиты: как бизнесу сохранить данные и не повестись на маркетинговые уловки

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

В статье для ICT Online руководитель направления DCAP ГК InfoWatch Олег Митичкин рассказывает, как сейчас в России развиваются DCAP-системы и удается ли им учесть российскую специфику и требования регуляторов.

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

Фича ради фичи

Как легко потерять смысл разработки, добавляя “полезности”

  • Сделаем ещё кнопку, она “точно нужна”

  • Добавим фильтр, и сортировку, и модалку, ну мало ли

  • Вот бы выгрузку в Excel, и график, и пуши!

…Проект набирает скорость. Только куда?

В чём проблема?
Когда цель — просто сделать больше фичей, а не решить конкретную задачу, продукт начинает разваливаться: интерфейс пухнет, команда тонет в «хотелках», релизы идут в спешке, а люди - даже не замечают большинство этих «удобств»

Парадокс: чем больше фич, тем хуже продукт

Потому что он уже не про ценность, а про “галочки” и “давайте сделаем ещё”.

У фичи должен быть KPI, надо ставить вопрос «а что изменится от нее?». Также их надо подчищать, если старые не используются: «больше ≠ лучше»

Хороший пример: есть множество платных плагинов для Notion, в которых тонна функций. Но пользователям часто нужна была именно интеграция с Гугл таблицами, они не хотели переплачивать за другие возможности плагина.

Один парень заметил это, и сделал элементарный плагин для интеграции Notion с Google Sheets, на чем начал зарабатывать хорошие деньги.
Людям не нужно «все и сразу», им нужна качественная точечная фича

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

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

Бесплатные курсы Route 256 от Ozon Tech для Go-инженеров уровня middle

Route 256 — это эффективная прокачка знаний и навыков работы с микросервисами. Программа курса составлена ведущими экспертами Ozon Tech — командой, которая разрабатывает сервисы, выдерживающие экстремальные нагрузки до 382 000 RPS.

Программа состоит из вебинаров, воркшопов, домашних заданий и их детальных разборов. Причём каждый из этих элементов основан на реальных задачах Ozon. Никаких заданий ради заданий — только действительно актуальные знания и проекты.

Как минимум, они бустанут ваше портфолио. Как максимум, вы получите оффер в команду. Заходите на сайт Route 256, изучайте требования и подавайте заявку.

Отборочный контест уже 3 августа!

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

Аркадный автомат на RISC-V: сбиваем астероиды с микроконтроллером MIK32 АМУР

Вадим Новиков решил реализовать игровую физику в условиях bare metal, используя свой предыдущий опыт на C++/SFML. В проекте использовалась плата Elbear Ace-Uno на базе микроконтроллера MIK32 АМУР, SPI OLED-дисплей SSD1306 разрешением 128×64 и джойстик HW-504 (KY-023), а также модули SPI (цифровой интерфейс передачи данных), аналого-цифровой преобразователь для калибровки и чтения положения джойстика и GPIO для вывода настройки и ввода состояния кнопки.

Код на C включал непрозрачные типы, которые позволяют реализовать подобие инкапсуляции из ООП. С ними можно объявить в заголовочном файле указатель на некую структуру, но не определять ее. А в единственной трансляции определить структуру и статические функции для взаимодействия с внутренними полями, которые недоступны извне. И поместить туда, соответственно, реализацию открытого интерфейса. Вместо использования регистров напрямую Вадим подключил библиотеку hardware abstraction layer (HAL), чтобы впоследствии было проще портировать проект на STM32 и другие микроконтроллеры.

Результатом работы стала Asteroids — реинкарнация классической игры эпохи аркадных автоматов. Корабль игрока непрерывно выпускает снаряды. После столкновений снаряда с астероидом исчезают оба объекта, при столкновении с кораблем — только астероид. Астероиды, вышедшие за нижнюю границу, возвращаются сверху экрана. Корабль же выйти за границы экрана не может.

Это лишь один из интереснейших проектов, реализованных студентами по итогам последнего потока курса YADRO по программированию микроконтроллеров на RISC-V. Интересно узнать о других проектах? Мы уже рассказали о них в статье.

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

Эффективные хеш-таблицы на Go

В Go нет недостатка хеш-таблиц. Вы всегда можете использовать встроенную map[Key]Val, с ошеломительной скоростью обладающую непревзойденным удобством! А изобилие типов Keyразрешенных к использованию, способно довести до изумления!

Вот только ни указатель, ни слайс не подходят... Невозможно подсунуть свои операции (равенства и хеширования). Но хоть со скоростью все хорошо! (извините, не удержался)

Итого, мне пришлось написать HashMap[K, V any], закрывающую проблемы.

------------------8<------------------

В это трудно поверить, но:

  • Без резервирования памяти (конфигурация R0), map[uint64]uint64 работает в 1.93 раза медленнее UintMap! И производит в 5.64 раза больше мусора!!

  • А с полным резервированием (R1), в 1.72 раза медленнее! И аж в 16.5 раз больше мусора!!!

Вдумайтесь! На коленке написанная хеш-таблица для целых чисел UintMap почти в два раза обгоняет ЖУТКО оптимизированную нативную map[uint64]uint64!! И существенно менее мусорит!!!

Но раз трудно поверить, то давайте проверим:

func MyUintMap() {
    const N = umN

//R0|    um := lib.NewUintMap(0)
    um := lib.NewUintMap(N) //R1|

    for i := uint64(0); i < N; i++ {
        um.Findsert(i, i+N)
    }
    lib.Assert(um.Size() == N)

    cnt := 0
    for i := uint64(0); i < N; i++ {
        if *um.Val(um.Find(i)) == i+N {
            cnt++
        }

        if um.Find(i+N) == -1 {
            cnt++
        }
    }
    lib.Assert(cnt == N*2)

    for i := uint64(0); i < N; i++ {
        um.Delete(i)
    }
    lib.Assert(um.Size() == 0)
}

func GoUintMap() {
    const N = umN

//R0|    m := make(map[uint64]uint64)
    m := make(map[uint64]uint64, N) //R1|

    for i := uint64(0); i < N; i++ {
        m[i] = i + N
    }
    lib.Assert(len(m) == N)

    cnt := 0
    for i := uint64(0); i < N; i++ {
        if m[i] == i+N {
            cnt++
        }

        if _, ok := m[i+N]; !ok {
            cnt++
        }
    }
    lib.Assert(cnt == N*2)

    for i := uint64(0); i < N; i++ {
        delete(m, i)
    }
    lib.Assert(len(m) == 0)
}

Здесь всего-то лишь вставка, два поиска и удаление. Запустите go test -bench=UintMap -benchmem и увидите сами. Вот только можно ли ругать Google за неэффективный map[uint64]uint64?

------------------8<------------------

Итоги?

  1. Смело берите HashMap[K, V any] для слайсов и указателей!

  2. Немного оптимизированная BytesMap -- лучший выбор для []byte.

  3. Интересно оптимизированная UintMap -- это выбор для целых чисел. Разберитесь, что там "не так", и используйте за основу.

И как всегда, исходный код, подробности и пару неудачных шуток вы можете найти в моей статье https://ders.by/go/hashmap/hashmap.html

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

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

Вообще, как помог понять эксперимент, большая часть моих запросов идёт по одному из 3 путей:

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

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

Это частично устраняется более подробным формулированием запроса ("что значит ABC в контексте X"), но... зачем писать больше?

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

Сюда же, кстати, можно отнести поиск изображений чего-то. Тот же Perplexity выдаёт и картинки, но 3-4 штук не всегда достаточно.

И, наконец, просто использование поисковика для ленивого перехода на нужный сайт. Ну да, это как в Гугле писать "Яндекс", но иногда это... проще?

И вот эти три сценария - это примерно 90% запросов в омнибоксе браузера. Моего, your mileage may vary. Так что пока я всё же предпочту оставить поиск поиском, а нейросетям выделю постоянное место в боковой панели браузера и закреплённые вкладки.

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