Установка ssl сертификата lets encrypt на nginx в Ubuntu 20.04 и выше

Август 14, 2023, 15:08 - Время чтения: ~1 минут

Для начала обновимся:

sudo apt update && sudo apt upgrade

Установим все необходимое:

sudo apt install certbot nginx python3-certbot-nginx

Далее настроим certbot:

certbot certonly

Вас попросят выбрать конфигурацию и ввести email, а позже и домен. А потом просто запросим сертификат:

sudo certbot run --nginx

Сменить пароль Ubuntu linux

Август 14, 2023, 15:08 - Время чтения: ~1 минут

Сменить пароль можно консольной командой:

sudo passwd root

Ошибка PIP: If you wish to install a non-Debian-packaged Python package

Август 13, 2023, 02:08 - Время чтения: ~1 минут

Ошибка:

If you wish to install a non-Debian-packaged Python package,
create a virtual environment using python3 -m venv path/to/venv.
Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
sure you have python3-full installed.

If you wish to install a non-Debian packaged Python application,
it may be easiest to use pipx install xyz, which will manage a
virtual environment for you. Make sure you have pipx installed.

See /usr/share/doc/python3.11/README.venv for more information.

Или:

Если вы хотите установить Python-пакет, который не является пакетом Debian, создайте виртуальное окружение с помощью команды python3 -m venv путь/к/виртуальному/окружению. Затем используйте путь/к/виртуальному/окружению/bin/python и путь/к/виртуальному/окружению/bin/pip. Убедитесь, что у вас установлен пакет python3-full.

Если вы хотите установить Python-приложение, которое не является пакетом Debian, может быть проще использовать команду pipx install xyz, которая управляет виртуальным окружением для вас. Убедитесь, что у вас установлен пакет pipx.

Дополнительную информацию можно найти в файле /usr/share/doc/python3.11/README.venv.

Обойти это ограничение можно следующим образом:

sudo rm /usr/lib/python3.11/EXTERNALLY-MANAGED

Также хотел бы предложить подписаться на мой телеграм-канал

Если у вас есть какие-либо вопросы или нужна дополнительная помощь, не стесняйтесь спрашивать!


Почему using namespace std - плохо?

Август 3, 2023, 00:08 - Время чтения: ~1 минут

Используя пространства имен, мы можем явно указать, из какого пространства имен мы хотим использовать определенный символ. Например, в коде std::cout, std является пространством имен, а cout - символом из этого пространства имен, представляющим стандартный поток вывода. Использование ключевого слова using namespace std позволяет нам обращаться к символам из пространства имен std без явного указания этого пространства имен каждый раз. Однако, это также может привести к проблемам. Например, если мы имеем два различных пространства имен, каждое со своим символом info, и мы используем using namespace для обоих пространств имен, то возникает конфликт имён. Компилятор не знает, из какого пространства имен мы хотим использовать info, и может возникнуть неоднозначность. Чтобы избежать таких проблем, хорошей практикой является указывать пространство имен перед каждым символом или использовать только необходимые символы из пространства имен с помощью оператора разрешения области видимости ::. Также стоит избегать использования using namespace в глобальной области видимости в заголовочных файлах, чтобы не добавлять символы из пространства имен в глобальную область видимости всего проекта.

Более простым языком я рассказал об этом в своем телеграм канале: https://t.me/Aren_et_adventures/12


Моя нейросеть для генерации картинок

Июнь 26, 2023, 20:06 - Время чтения: ~1 минут

Эксперимент по обучению нейросети для генерации изображений островов 28 на 28 пикселей я провел в своём телеграм канале.

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

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

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

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

В моей нейросети используется как раз VAE.

Исходный код доступен по ссылке в телеграм канале.


Пишем свой антивирус с нуля часть 1

Май 28, 2023, 10:05 - Время чтения: ~1 минут

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

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

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

Вот основные типы вирусов:

Вирус

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

Червь

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

Троян

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

Кроме этого, есть и другие типы вредоносных программ, такие как spyware (шпионские программы), adware (рекламное ПО) и многие другие. Но наиболее распространенными являются вирусы, черви и трояны.

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

Язык программирования

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

Платформа

Наш антивирус будет работать на операционных системах Windows и Linux в основном.

Функциональность

Наш антивирус будет иметь следующие функции:

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

Методы сканирования

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

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

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

В следующей статье напишем простейший сканер и протестируем на самописном вирусе.


Github miner или как выгрузить все репозитории с github по определенному языку

Май 28, 2023, 01:05 - Время чтения: ~1 минут

Итак, буквально за пол часа я написал утилиту https://git.synapseos.ru/0Nera/github_miner Думаю дальше вы разберетесь) Зеркало: https://tvoygit.ru/0Nera/github_miner


x86 IO порты

Май 13, 2023, 19:05 - Время чтения: ~1 минут

IO порты представляют собой входы/выходы (Input/Output) и используются для обмена информацией между микроконтроллерами и внешними устройствами. В данной статье мы рассмотрим работу с IO портами на платформе x86.

На платформе x86 IO порты адресуются 16-битным номером (0x0000 – 0xFFFF). Для работы с IO портами в ОС Linux используется файловая система /dev/port. В Windows доступ к портам осуществляется через функции WinAPI: ReadPort, WritePort.

Для чтения данных из порта на x86 микропроцессоре существует три команды: inb, inw, inl. Каждый из этих операторов читает данные определенного размера (один байт, два байта, четыре байта) из заданного порта в указанный регистр.

Для записи данных в порт на x86 микропроцессоре существует три команды: outb, outw, outl. Каждый из этих операторов записывает данные определенного размера (один байт, два байта, четыре байта) из указанного регистра в заданный порт.

Для упрощения работы с IO портами на x86 микропроцессорах, можно использовать специальные функции, объявленные в заголовочном файле asm/io.h.

Примеры функций для работы с IO портами на x86:

/**
 * @brief Получение одного байта из порта
 *
 * @param port Порт
 * @return uint8_t Значение из порта
 */
uint8_t hal_ioport_inb(uint16_t port) {
    uint8_t ret;
    asm volatile("inb %1, %0"
                 : "=a"(ret)
                 : "Nd"(port));
    return ret;
}

/**
 * @brief Получение 2 байт(word) из порта
 *
 * @param port Порт
 * @return uint16_t Значение из порта
 */
uint16_t hal_ioport_inw(uint16_t port) {
    uint16_t ret;
    asm volatile("inw %1, %0"
                 : "=a"(ret)
                 : "Nd"(port));
    return ret;
}

/**
 * @brief Получение 4 байт из порта
 *
 * @param port Порт
 * @return uint32_t Значение из порта
 */
uint32_t hal_ioport_inl(uint16_t port) {
    uint32_t ret;
    asm volatile("inl %1, %0"
                 : "=a"(ret)
                 : "Nd"(port));
    return ret;
}

/**
 * @brief Ввод одного байта в порт
 *
 * @param port Порт
 * @param val Входные данные
 */
void hal_ioport_outb(uint16_t port, uint8_t val) {
    asm volatile("outb %0, %1"
                 :
                 : "a"(val), "Nd"(port));
}

/**
 * @brief Ввод 2 байт (word) в порт
 *
 * @param port Порт
 * @param val Входные данные
 */
void hal_ioport_outw(uint16_t port, uint16_t val) {
    asm volatile("outw %0, %1"
                 :
                 : "a"(val), "Nd"(port));
}

/**
 * @brief Ввод 4 байт в порт
 *
 * @param port Порт
 * @param val  Входные данные
 */
void hal_ioport_outl(uint16_t port, uint32_t val) {
    asm volatile("outl %0, %1"
                 :
                 : "a"(val), "Nd"(port));
}