LINUX.ORG.RU

Избранные сообщения xperious

Стандарт C++20 утверждён

Форум — Development

https://www.reddit.com/r/cpp/comments/f47x4o/202002_prague_iso_c_committee_trip_report_c20_is/

Желающие могут попробовать написать новость.

По виду std::format больше похож на fmt, чем на boost::format, что не может не радовать.

Небольшой обзор есть в статье на Хабре: https://m.habr.com/ru/company/yandex/blog/488588/ от Антона Полухина.

 

grem
()

Объясните сишную магию

Форум — Development

Пытался понять как реализовать SVG фильтр feComposite, ибо SVG дока унылая, поэтому залез в сорцы вебкита. Там тоже документации ноль, ещё и код очень странный.

Вот что это за ужас (src):

static unsigned char clampByte(int c)
{
    unsigned char buff[] = { static_cast<unsigned char>(c), 255, 0 };
    unsigned uc = static_cast<unsigned>(c);
    return buff[!!(uc & ~0xff) + !!(uc & ~(~0u >> 1))];
}

Я так понимаю, они проверяют что int в 0..255 диапазоне, но уж слишком странным образом.

UPD: коммит, который добавил этот код.

 ,

RazrFalcon
()

Сбор кастомного ядро

Форум — Desktop

Хочу научиться собирать ядро на продвинутом уровне что бы лучше изучить внутреннее устройство самого ядра и уметь «затачивать» ядро для определенных задач, что бы выжимать максимум из железа. Есть ноут с которым экспериментирую на железе. На данный этапе обучения поставил себе такие задачи:

  1. Отчистить ядро от неиспользуемых компонентов (например убрать amd-микрокод, если ноут на intel). Возможно, отключить защиту от Spectre и Meltdown
  2. Уменьшить время на загрузку ядра
  3. Получить выигрыш в производительности/энергоэффективности. Да, знаю, что улучшение будет на уровне погрешности, но это больше «для души» чем для решения реальной задачи
  4. Научится кросс-компилировать ядро

Уже многократно собирал ядро с кастомным конфигом и патчами, но изменения там были минимальные. Часто я просто следовал инструкции. Хочется всё же комфортно себя чувствовать при конфигурировании ядра. Посоветуйте литературу/сайты/статьи/материалы/патчи/хитрости/лайфхаки и т.п. на которые стоит обратить внимание

 ,

brualan
()

Намутил свой сетевой протокол для дисков

Форум — Development

https://github.com/vtl/ethblk

На имеющемся железе пробрасывает NVMe примерно на его родной скорости, и делает это в два с лишним раза быстрее штатного линуксового nvme-over-tcp. Дальше упирается в мой слабый клиентский комп, но на большом железе производительность растёт до миллионов IOPS через один диск. 50 GbE успешно загружал на полную катушку, был, практически, line rate.

 ethblk, , ,

mv
()

Gentoo: достаточно ли обновляться раз в месяц?

Форум — Admin

Допустим, я поставлю Gentoo. Достаточно ли обновляться из исходников раз в месяц, чтобы процесс обновления не стал перманентным? И сколько может занять обновление на железе Intel Core i3-3110M / 16 GB RAM / SSD 480 GB ? Можно ли обновления собирать на инструментальной машине, которая мощней, и потом как-то загружать собранные (скомпилированные) обновления на целевую машину?

 ,

Infra_HDC
()

Rust для Эльбруса?

Форум — Development

Можно ли запустить программу, написанную на языке rust, на компьютерах с процессорами Эльбрус?

Как я понимаю, llvm не рассчитан на такую архитектуру. Правда, есть двоичная трансляция кода. Можно ли рассчитывать хотя бы на 80% скорости по сравнению с тем, как если бы был оптимизирующий родной компилятор с языка rust для Эльбруса?

 ,

dave
()

Для чего вы бы согласились пользоваться приложением на Electron?

Голосования — Голосования

Для тех, кто не знает что это такое - https://electronjs.org/. Фреймворк построения десктопных приложений на NodeJS+JavaScript.

Критикуется за потребление 150 МБ памяти на базовом Hello World, потому что именно столько потребляет одна вкладка с Webkit в браузерах, и несоответствие системному стилю Gtk+/Qt.

Примеры приложений на Electron - Atom, VSCode, Skype, Discord, Slack, Google Music Desktop, Etcher, hyper.is и даже эмулятор Windows 95.

  1. Только если нету альтернатив 390 (52%)

    ********************************************************************************************************************************************************************************************************************************************************************************************************************************

  2. Для любых целей, меня не волнует технология внутри 196 (26%)

    ****************************************************************************************************************************************************************

  3. Принципиально избегаю 190 (25%)

    ***********************************************************************************************************************************************************

  4. Только для больших приложений, когда потребление памяти самого Electron незначительно по сравнению с потреблением приложения 77 (10%)

    ***************************************************************

  5. Для любых целей, я предпочитаю Electron 10 (1%)

    ********

Всего голосов: 863, всего проголосовавших: 748

 , ,

vertexua
()

IoC в С++

Форум — Development

.. не Dependency Injection, а именно Inversion of Control я смотрю в плюсах не популярен. В мире Java без этого тебя сначала засмеют, а потом когда поймут что ты не унимаешься - то изобьют.

Что я подразумеваю под IoC

  • Есть контейнер, в которым по определенным ключам (типы, строки) регистрируются классы
  • Контейнер обязан уметь создавать инстансы каждого из классов, если надо подставляя ему или в конструктор или как-то по другому его зависимости
  • Группы регистраций классов можно обьединять в модули, которые просто устанавливаются подключением к основном контейнеру. Они тогда предоставлют или требуют другие класса для своей работы. По сути как паззл.
  • В тестах можно заменять целы модули указывая «запусти мне весь контейнер, но пожалуйста замени MyClass на MyMockClass»

Пример на псевдокоде который вроде бы как С++

class IB {
public:
  int value() = 0;
};

class B : public IB {
public:
   int value() {
      return 1;
   }
};

class A {
   A(std::shared_ptr<IB> b) : b_(b) {}

   int value() {
     return b_->value();
   }
private:
   std::shared_ptr<IB> b_;
};

void MyModule(Container& c) {
 c.RegisterAs<IB, B>(CREATE(
   B()
 ));

 c.Register<A>(CREATE(
   A(INJECT(IB))
 ));
}

int main() {
 Container c;
 MyModule(c);
 std::cout << c.Get<A>()->value() << std::endl;
 return 0;
}

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

В тесте запросто выполняется MyModule, а потом регистрация IB меняется на MockB.

Примеры существующих фреймворков

https://github.com/google/fruit

https://github.com/ybainier/Hypodermic

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

 ,

vertexua
()

Java, IoC, Spring

Форум — Development

Всем привет, очередной вопрос назрел.
Начал изучать паттерны javaEE, делаю тестовый проект на Spring/Hibernate. Как я понимаю - основная фишка Спринга это именно IoC, то бишь избавление от зависимости на конкретную реализацию доступа к модели - DAO (верно?).
Также вводится понятие сервиса, которые работают с реализацией DAO..

Вобщем, у меня взрывается моск от таких дел, ведь получается, на одну модель Device имеем ещё 5 классов:

DeviceDAO
DeviceDaoImpl
DeviceService
DeviceServiceImpl
DeviceViewModel

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

Короче, не могу разложить по полочкам.. Спасибо.

 , ,

POLTER
()

Легковесные контейнеры

Форум — Admin

У меня есть домашний сервачок, который раздает по сети фото, видео, музыку. На нем стоял арч и в течении трех лет все было отлично, пока я не обновила его находясь в отпуске (да, глупый поступок). На связь он уже не вышел. Теперь думаю сменить его на что-то более стабильное: centos или debian.

Еще одна проблема, которую я хотела бы решить. Пока я пыталась подобрать софт, мной были установлены и удалены plex, ampache, subsonic и еще куча софта. Что-то не тянуло необходимые зависимости, их я доустанавливала сама, а после удаления основного пакета, оставались эти потерянные зависимости и прочие потроха в виде конфигов.

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

Ну и какой дистрибутив лучше подойдет под это дело: centos или debian. Другие не рассматриваю, потому что мне кажется эти два достаточно хороши, чтобы не обращать внимание на другие.

 , ,

totik
()

Сборка образа системного контейнера

Форум — Admin

Для контейнеров приложений (application containers) есть куча систем сборки: Dockerfile, buildah, Buildkit, img, Bazel, kaniko, и еще куча разных.

Для системных контейнеров (system containers, которые запускают в LXC/LXD/systemd-nspawn) нашел только distrobuilder, но его нет в репозиториях (для меня не проблема, но хочу, чтобы пользователи контейнера могли его легко пересобрать, это было бы плюсом).

Кто-нибудь что-нибудь подскажет, что использовать? Мне нужно взять готовый образ ОС (debian 10, например), скопировать несколько файлов по определенным путям, установить несколько программ из репозитория, и сделать из этого контейнер. В общем, то, что делает dockerfile, только для системных контейнеров.
Хоть ansible бери.

 , , ,

ValdikSS
()

Web на Java: вспоминать основы или лучше сразу Spring+Vue?

Форум — Development

Давным-давно, лет 5 назад у меня был курс по вебу с сервлетами и JDBC. Уже тогда это было немного устаревшим и разрозненным курсом, а теперь и подавно. Тем не менее JSP и прочие HTTPRequest лежат в основе любого Java фреймворка. При том, что во многом построение страницы нынче делается на клиенте при помощи JS, а сервер лишь ассинхронно передает JSON-ы из базы через Hibernate (если я правильно уловил суть нынешнего мейнстрима в вебе).

Вопрос состоит в следующем: стоит ли мне тратить время и делать проекты как практику на сервлетах или же забить и лучше делать приложения сразу на Spring+Vue?

 , , , ,

JAkutenshi
()

Сравнение стеков Spring и Java EE. Современное состояние

Форум — Development

Лекция в офисе компании FoxmindEd прошла 25.02.2018.

Слайды: https://drive.google.com/file/d/0B38igFDHEy45Z251OGE0Zi1mblE/view

Лекция: https://www.youtube.com/watch?v=HMT6jgZ5Pls

Сергей Немчинский, имея за спиной 20 летний опыт программирования на Java, сравнивает две параллельно развивающиеся технологии.

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

 , ,

iZEN
()

Переехал на кучу утилит переписаных на Rust

Форум — Talks

Тег «угадай автора по заголовку».

Q: Зачем?

A: Ради эксперимента, повысится комфорт пользования терминалом или нет.

Q: Причем тут Rust?

A: Ни при чем, но из-за нативности и отсутствия GC на нем толпа людей побежала переписывать что ни попадя. С таким же успехом можно было бы и npm install, но тормозило бы. Ближе opam install или go get

Теперь мой терминал по истине свистит и пердит. Даю список если кому надо.

  • alacritty - GPU ускоренный терминал.
  • alias cat=bat- cat с хорошей подсветкой синтаксиса и нумерацией строк и пейджером.
  • broot - навигатор по каталогам, который одновременно показывает дерево, но адекватно себя ведет с громадными каталогами, показывая их по чуть-чуть.
  • dust - утилита для исследования места занимаемого каталогами, сортирует деревья файлов начиная с самых больших каталогов.
  • alias ls="exa -l --group-directories-first" ls с хорошими дефолтами, tree встроено.
  • rip Утилита для удаления файлов с разными удобными фичами и восстановлением
  • hors "How do I parse float in javascript?" - находит короткий ответ в интернетах и отвечает. Чуть лучше работает чем оригинал - howdoi.
  • mdcat - cat для Markdown, для отображения удобочитаемой формы документа. Ссылки делает сносками.
  • alias grep=rg - очень быстрый и удобный grep
  • starship - shell command prompt, показывает кучу полезной информации в зависимости от контекста, например git branch если в репозитории, версии софта и ЯП если в каталогах с сорцами, hostname если зайти по ssh.
  • tokei - сборщик статистики по ЯП и строкам кода в деревьях исходников.
  • hyperfine - бенчмарк утилита, time на стероидах.
  • tldr- сокращенная версия man, показывает как чем пользоваться в примерах, а не выдавая полную справку. Страницы поддерживаются сообществом для громадного количества утилит. Изначальный проект - https://tldr.sh/
  • topgrade - универсальная утилита обновления. При запуске пытается обновить все что видит - системные пакеты, vim пакеты и так далее.
  • runiq - быстрый sort | uniq с разными алгоритмами внутри.
  • fd - быстрый и удобный find, удобно чтобы не вспоминать заковыристые ключи
  • fselect - поисковик файлов с SQL-like языком запросов
  • sd - как sed, только интуитивный
  • i3status-rs - Сразу i3status+i3blocks. Плюс батарейки к i3blocks, которые как я понял автор решил убрать.
  • onefetch - Вроде neofetch, но для сорцов. Просто запустите эту штуку с корня любого git репа, клонированого локально
  • wasmtime - JIT runtime для WASI стандарта. Пускалка WebAssembly приложений.
  • scriptisto - «shebang-интерпретатор» для компилируемых языков, прозрачно собирает и кеширует нативные сборки кода

Что не зашло совсем

Все вышеперечисленое ставится через cargo install <package_name> (кроме alacritty), название смотрите на страницах. Сам cargo и Rust ставятся через

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

P.S. Призываю остальных взять ЯП вашей секты и поставить такой эксперимент и отписаться. Да-да, расскажите как вы пользовались ls на Java. Пользователей emacs прошу не беспокоить

 , , ,

vertexua
()

Actor model не взлетела. Причины

Форум — Development

Why has the actor model not succeeded?

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

Вкратце, причины неуспеха модели акторов из статьи:
1) Акторы не имеют прямой связи с моделью ООП.
2) Поведение динамическое, зачастую трудно предсказуемое и проблемы появляются в run-time. Что еще усугубляется возможностью актора создавать других акторов.
4) Требования по памяти обычно не могут быть определены до запуска.
5) Идея асинхронного обмена сообщениями затрудняет реализацию некоторых алгоритмов.
6) Сложность в реализации протокола последовательного взаимодействия между акторами.

 ,

nerdogeek
()

Почему выстрелил SIP, а не H.323?

Форум — Talks

Здравствуйте

Прочитал сравнение SIP vs H.323, после которого складывается ощущение, что SIP убогая костыльная (по всем пунктам) поделка, а H.323 серьезный професиональный протокол

Почему же тогда SIP выстрелил? IP-телефоны, VoIP от операторов - всё это на SIP. А о H.323 упоминают как правило в негативном ключе?

 , ,

makoven
()

libvdpau-va-gl

Форум — Development

https://github.com/i-rinat/libvdpau-va-gl/releases

В двух словах, это VDPAU драйвер, который использует OpenGL для рисования и VA-API для декодирования видео.

VDPAU это открытый интерфейс, который подразумевает единую точку входа (libvdpau) и подключаемые драйверы; API не замкнуто накоротко на nVidia. Выбор конкретного драйвера осуществляется либо через переменную окружения VDPAU_DRIVER, либо спрашивается у X-сервера. Если так или иначе получить имя не удалось, считается, что оно есть «nvidia». Драйвер представляет собой разделяемую библиотеку с именем вида libvdpau_<drivername>.so.1. Программы линкуются с libvdpau, а она в свою очередь загружает нужный драйвер.

Чтобы использовать, нужно собрать, положить библиотеку в директорию, где её сможет найти компоновщик, и добавить в окружение переменную VDPAU_DRIVER=va_gl. Проверить, что драйвер работает, можно запустив vdpauinfo. А vainfo покажет, работает ли драйвер VA-API.

На видеокартах AMD по чудаковатым причинам происходят падения внутри XCloseDisplay. Чтобы обойти проблему, нужно в переменную VDPAU_QUIRKS добавить строку XCloseDisplay. Элементы в VDPAU_QUIRKS перечисляются через запятую, слитно, без пробелов и служат для тонкой настройки поведения драйвера. Кроме XCloseDisplay, есть ещё параметр ShowWatermark, включающий отображение строки va_gl в правом нижнем углу. Полный список можно найти в README.md.

Начиная с версии 2.99.908 xf86-video-intel сообщает переходнику libvdpau.so имя VDPAU драйвера. Символьных ссылок
libvdpau_i965.so.1libvdpau_va_gl.so.1
libvdpau_i915.so.1libvdpau_va_gl.so.1
достаточно для загрузки, и необходимости в использовании VDPAU_DRIVER больше нет.

 , , ,

i-rinat
()

Как вычислить недостающие параметры H.264 потока

Форум — Development

Я тут в процессе написания драйвера vdpau застрял. Чтобы заработало ускорение декодирования, надо вызывать vaapi. Проблема состоит в том, что оба интерфейса требуют разные параметры H.264. Часть из них совпадает по имени поля в структурах (имена взяты из стандарта), а часть нет. При этом VAAPI требует намного больше данных, чем VDPAU, то есть мне нужно откуда-то эти данные взять.

К примеру, нужен такой параметр, как first_mb_in_slice. Его можно достать из потока, ffmpeg его достаёт и... выбрасывает. А потом, когда нужно формировать это поле для передачи в vaRenderPicture, высчитывает заново, причём с текстом стандарта это плохо соотносится (там должно быть смещение, либо половина смещения, в зависимости от флага. Код в ffmpeg делит пополам только координату y, а x просто прибавляет). И так далее. Всё осложняется тем, что я не знаком с подробностями технологий сжатия видео.

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

В общем, нужна рука помощи. Я тут ниже буду постить особо непонятные мне моменты. Надеюсь на ваше понимание.

Upd. Все параметры нашлись в самом потоке. Первый байт после заголовка — NAL header, дальше slice_header (7.3.3), в котором и были недостающие данные.

 , ,

i-rinat
()

C/C++ программист/Специалист по цифровой обработке сигналов, Мск, 170тр Net +

Форум — Job

Российская компания, мировой лидер в области разработки высокотехнологичного ПО операторского класса для обработки и передачи широкополосной речи, видео и данных в сетях с пакетной коммутацией приглашает в штат C/C++ программиста/Специалиста по цифровой обработке сигналов

Обязанности:

  • Участие в разработке и интеграции ПО международного класса для голосовых, видео звонков и конференций;
  • Кросс-платформенная разработка под Linux, Windows, iOS, Android и другие популярные платформы;
  • Реализация, поддержка и развитие алгоритмов улучшения речи в VVoIP системах;
  • Участие в развитии in-house технологий VVoIP.

Требования

  • Высшее техническое образование;
  • Опыт разработки на C/C++;
  • Понимание математических принципов обработки цифровых сигналов;
  • Опыт реализации алгоритмов DSP (фильтрация, корреляции, преобразование Фурье и т.п.);
  • Хорошее знание методов адаптивной фильтрации (опыт реализации будет плюсом);
  • Опыт работы с Matlab;
  • Опыт оптимизации алгоритмов DSP (снижение ресурсоемкости).

Желательно:

  • Опыт разработки и реализации алгоритмов DSP: эхоподавление (AEC), шумоподавление (noise reduction), автоматическая регулировка усиления (AGC);
  • Опыт кросс платформенной разработки (любые платформы);
  • Опыт разработки под платформы Андроид, Apple iOS, Windows Phone.

Условия найма:

  • З\п до 170.000 Net и выше (обсуждается с успешным соискателем). Доплата за питание 3 000 руб.
  • Удобный комфортабельный красивый современный офис в районе м.Павелецкая/Пролетарская
  • Гибкий график работы для сотрудников (с 9-12 до 18-22.30), свободный график обеда, можно выбрать любое время в течение рабочего дня (кроме столовой рядом с офисом имеется много всяких кафе и пр.)
  • Отпуск 28 календарных дней,
  • ДМС включая стоматологию
  • Профессиональный коллектив, сложные развивающие задачи, причастность к созданию продукта, востребованного на глобальном рынке, демократичная атмосфера

------------------------------

  • Svetlana Skorikova
  • Leading Specialist Recruitment
  • email skorikova.sv@gmail.com
  • mob. 8 (929) 6193605

 , , ,

Svet2010
()

Ищу постоянную удаленную работу системным администратором/архитектором.

Форум — Job

Предлагаю удаленный аудит, настройку, оптимизацию, администрирование и организацию информационной защиты инфраструктур серверов/систем/сетей.

{{ Интересует только постоянная удаленка и/или средние/крупные проекты с постоянной занятостью с фиксированной компенсацией. Мелкие разовые заказы не интересуют }}.

Настройка, администрирование:

  • Операционных систем семейства Unix: Linux, FreeBSD, etc.
  • Систем эмуляции архитектур различного уровня их виртуализации: Qemu/KVM, Xen, VMWare.
  • Поддержка контейнерных объектов виртуализации высокого уровня: OpenVZ, LXC/Docker.
  • Систем управления базами данных как реляционного свойства: MySQL, PostrgeSQL, Oracle, Ingres, так и нереляционного: Redis, MongoDB, CouchDB
  • Программного обеспечения сервисов сетевого назначения и обеспечения работы приложений: mail,proxy,web,vpn,etc.
  • Систем цифровой телефонии/телефонных станций и сигналинговых сетей в различных схемах на базе ПО Asterisk, FreeSwitch, OpenSIPs/OpenSER.
  • Биллинговых систем/систем расчетов хостингов, операторов связи, других видов услуг.
  • Систем наблюдения и мониторинга: zabbix/nagios/cacti/etc.
  • Настройка и оптимизация коммутируемых и маршрутизируемых ip сетей на базе протоколов статической и динамической маршрутизации, коммутации.
  • Масштабирование проектов/решений/сервисов, аудит и обеспечение необходимого уровня их отказоустойчивости, доступности, распределенности, масштабируемости в различных вариациях: LoadBalancing/HighAvaliability сетей и сервисов в том числе при использовании таких решений как heartbeat-технологии: lvs/keepalived/pacemaker-автоматизации, haproxy и других.
  • Решений масштабирования объектов хранения: распределенных и кластеризованных и псевдо-кластеризованных файловых систем и устройств.
  • Систем контроля безопасности служб и сервисов систем, выявления и реагирования на угрозы в соответствие с международными стандартами ISO и локальными территориальными стандартами безопасности. Параметризации и нивелирования угроз по их свойствам. Применение сопутствующих инструментов, как свободно распространяемых, так и коммерческих аналогов систем: IDS/IPS/AAA/Firewall/etc.
  • Инструментов и методов автоматизации процессов сопровождения инфраструктуры и разработки на основе git/svn, а также оболочек chief/puppet/ansible, а также многоуровневых интегрированных инфраструктур автоматизации процессов/микросервисов на на базе облачных решений, а также с использованием kubernetes, и продуктов и оценки необходимости использования таковых.
  • Обеспечение динамики процессов CI/CD для тестовых сред и сред разработки. В основном Jenkins.
  • Выявление и устранение технических последствий несанкционированного доступа к инфраструктуре, причин утечек информации, защита итд.
  • Организация и внедрение уникальных и индивидуальных решений в области анонимизации сетей/структур. Под заказ и под ключ.
  • Консультации в сфере указанной компетенции, внедрение, планирование, поддержка.
  • Решение многих других сложных и нетривиальных задач в контексте обозначенной тематики.

Не организация, а частное лицо.

{{ В случае возникновения вопросов, просьба обращаться только через указанные контакты: }}

  • Jabber(JID): orphanedvox@xabber.de
  • Skype: sysbooter
  • Telegram: @sysbooter

 , , , ,

ChAnton
()