Перейти к основному содержимому

· 8 мин. чтения

UPD 2023.12.15

Статья нуждается в реанимации. "Просто о сложном" получилось как "Сложно о простом". Сейчас конец 2023 года, ау. Дети рождаются с kubernetes в голове!

Кстати, на этом же сайте, в /docs есть раздел, посвященный докеру. Там современные полезные штучки


Docker — платформа для запуска приложений в изолированных контейнерах.

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

Только пакетов не обязательно 2 и в них не обязательно что-то опасное, да и комната (сервер) тоже может быть не одна. Реальные примеры с применением будут описаны ниже.

Вместо "прежде, чем мы начнем"

Нет ничего сложного в использовании докера. Для большинства задач нужны совсем поверхностные знания, которые можно получить, почитав всего пару статей или, еще лучше, раздел Get started официальной документации, затем подкрепить все эти знания практикой. Например, запустить MySQL сервер + Adminer в один клик на этой странице. Там есть кнопочка. Но это только для начала.

A white coffee mug with “begin” written on it on a wooden table Photo by Danielle MacInnes / Unsplash


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

С Docker придется понять, что теперь не панель управления, а вы должны будете придумать, где разместить ваши данные из контейнера, будь то сайт или что-то еще

Тоесть, теперь не будет никаких кнопочек а-ля "Файловый менеджер", которые сразу откроют вам папочку с данными ваших контейнеров. Вы должны сами придумать, где будете работать. У меня это ~/dockerfiles/somefolder.


И маленькое замечание насчет безопасности - вам придется выполнять все команды или от рута или от sudo или добавить вашего пользователя в группу docker (лучше последнее)

А еще насчет портов. Есть Docker port, а есть Published port. Docker port это порт, который контейнер будет считать, что использует, а Published это порт, через который будет доступен Docker port на родительской машине. Простыми словами, это проброс портов

Основные понятия

Контейнер

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

Dockerfile

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

docker-compose.yml

В докере один Dockerfile это один сервис. Если вам нужен один сервис, например, торрентокачалка или генерация LetsEncrypt сертификата, вы можете запустить его через docker run. Но если у вас приложение, состоящее из нескольких сервисов (PHP + Nginx + MySQL), то запускать их все по очереди длинными командами с кучей параметров было бы, как минимум, неудобно. Этот файл объединяет все в одном месте и управляется через команду docker compose docker-compose-help Я выделил популярные команды. Они частично будут описаны ниже

Репозиторий

Есть репозитории, а есть Automated builds. По-простому, репозитории это готовые сборки систем. Например, чистый Ubuntu. Некоторые репозитории это сразу система с установленным приложением, например, CMS Ghost. На Docker HUB репозиторий это куча файлов, а Automated build это всего лишь Dockerfile

Automated build

На первый взгляд ничем не отличаются от репозиториев. Мне даже трудно объяснить разницу. По-обезьяньи я понимаю это так: "у репозиториев я не могу посмотреть Dockerfile, а у autobuilds могу". Automated builds это те же репозитории, только с них вы можете без проблем забрать Dockerfile и поправить его под свои нужды.

Также со временем Automated build может перестать работать, если какая-то инструкция в нем устареет (например, Dockerfile писался под Ubuntu 14.04 (FROM ubuntu:latest), а со временем ubuntu:latest обновилась до 18.04 и вжух, проблемы). Репозитории в этом плане монолитные. Какими залиты, такими и будут даже через 100 лет.

Еще есть всякие инструкции для Dockerfile, вроде ADD и COPY, которые добавляют файлы в контейнер во время его создания и которые не работают для репов

Пример Automated Build: cpuminer-multi

Swarm

Вы можете даже ни разу не столкнуться с этим на практике, но на будущее - это что-то вроде кластера. Короче, связка серверов с установленным Docker.

В нем есть главная нода и подчиненные. Главная это та, на которой выполнен docker swarm init, а подчиненные те, которые присоединились через docker swarm join и готовы принимать указания от главной (docker stack deploy)

Способы применения

  • Можно без проблем изучать новые фишки, до которых раньше руки не доходили из-за сложности или не хотелось засорять систему. Например хотели простой блог на JavaScript, торрент качалку или даже целый комбайн из приложений с кучей мусора и зависимостями без заморочки - докер.
  • Если вы раньше использовали VirtualBox для запуска приложений, то Docker его не только заменит, но и сделает все быстрее и проще
  • Он поможет запустить приложение любой сложности на любой системе всего в пару нажатий клавиш при помощи всего лишь одного Dockerfile файла. Или docker-compose.yml , если нужно запустить пачку сервисов.
  • Благодаря докеру вы можете собирать данные кучи приложений в одном, нужном вам месте, благодаря чему их проще будет переносить.
  • Или, например, у вас есть веб приложение с кучей заточенных под вас настроек, всяких баз данных, веб серверов, фреймворков и тд и вам нужно расширяться, копировать все это на другие сервера, прописывать все заново. С докером вы выполняете docker swarm init на главной ноде и docker swarm join на всех подчиненных, затем с главной передаете всем остальным задачу деплоя ваших приложений/сервисов при помощи пары команд.
  • Еще пример. Вы когда-нибудь использовали WAMP? Это связка Apache + PHP + PHPMyAdmin + MySQL и еще пары ништяков, которые помогают PHP разработчкам писать и тестить сайты, сидя на винде без всяких виртуалок. Так вот WAMP полезен только на винде и только для PHP. А Docker полезен хоть на Windows, хоть на Linux, хоть на Mac OS и для чего угодно, а не только PHP разработчиков

Кстати, этот блог запущен внутри Docker контейнера, а рядом с ним крутится еще контейнер с Nginx, контейнер с MariaDB, при необходимости, запускаю еще контейнер с Adminer (Аналог phpmyadmin) и LetsEncrypt генерилкой. Благодаря этому я могу купить еще хоть 100 VDS с Docker, одной командой подключить их к одному swarm'у (кластеру) и запустить сразу на всех мой блог так же в одну команду. Тогда даже если 99 нод "умрут", блог все равно будет доступен на последней.

Шпаргалка по популярным командам

Запуск контейнера

  • Фоновый (Запустили и отключились detach) docker run -d mysql
  • Со своим названием docker run --name database mysql
  • Этот удалится после отключения от него или выполнения задачи docker run -rm ubuntu pwd
  • Проброс порта с контейнера на хост. Слева порт на хосте (Published) docker run -p 8080:80 -d nginx
  • Остановка работающего (Данные внутри сохраняются. Запуск через start) docker stop NAME
  • Удаление контейнера (Проброшенные в него файлы сохраняются) docker rm NAME (-f удаляет даже если контейнер запущен)

Отладка

  • Подключение к терминалу контейнера docker exec -it NAME bash
  • Посмотреть логи внутри контейнера (STDOUT, STDERR) docker logs -f NAME

Управление образами

  • Сборка образа контейнера на базе Dockerfile (точка в конце нужна) docker build --tag image-name .
  • Список docker images -a
  • Удаление docker image rm NAME (-f force)
  • Переименование docker image tag SOURCE[:TAG] TARGET[:TAG]

docker-compose

  • Создание/обновление контейнеров приложения в фоне (-d) docker compose up -d APP_NAME
  • Остановка docker compose stop
  • Запуск остановленного приложения docker compose start
  • Остановка и удаление docker compose down
  • Логи всех сервисов приложения docker compose logs -f

Другие полезности

  • Работающие и остановленные контейнеры docker ps -a (Без -a только работающие)
  • Показать данные контейнера (Тут можно найти его IP, пути к volumes и кучу другого) docker inspect NAME

Чистка мусора

  • Удалить все остановленные контейнеры docker rm $(docker ps -a -q)
  • Удалить незакрепленные ни за каким контейнером volumes docker volume rm $(docker volume ls -f dangling=true -q)
  • Удалить неиспользуемые сети docker network prune
  • Удалить все неиспользуемые данные docker system prune -a
  • Удалить контейнеры, что остановлены больше часа назад + образы, с которыми не работает ни один контейнер (продвинутый способ) docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc:ro spotify/docker-gc

Вместо вывода

Небольшой лайфхак, как разобраться в Docker со скоростью света - изучайте чужие Dockerfile и docker-compose.yml и не ленитесь читать официальные документации, там все написано максимально кратко. Нельзя выучить докер за 5 минут, но сколько бы времени вы не потратили на его изучение, это того стоит.

Ништяки

transmission-web-interface

Полезные ссылки

· 1 мин. чтения

UPD 2023.12.15

На Mac лучше всего с задачей справляется Raycast со встроенным Clipboard Manager. На Windows до сих пор, спустя столько лет использую Ditto


Я устал постоянно проверять, что у меня в буфере обмена перед тем, как скопировать в него новую информацию. Перепробовав 3 менеджера и изучив еще больше, остановился на простом и мощном Ditto.

Он не самый популярный, но это не мешает ему быть самым лучшим.

img

Фичи

  • Простейший интерфейс
  • Удобно открывать (Ctrl + `)
  • Сохраняет историю всего, включая изображения и файлы
  • Абсолютно бесплатный
  • Множество настроек, которые не усложняют приложение
  • Удобный и быстрый поиск по истории
  • Обновляется. Последнее в конце 2017 года

img

Скачать

Официальный сайт: https://ditto-cp.sourceforge.io


У меня все. А вам нужна стена текста?

· 1 мин. чтения

Для одной задачи мне потребовалось подключиться к Redis внутри контейнера с хоста напрямую через redis.sock

В redis репозитории docker'a такой информации нет, а на сайтах устаревшие или нерабочие способы.

Вкратце

  1. wget http://download.redis.io/redis-stable/redis.conf

  2. Ищем, раскомментируем и заменяем unixsocket и unixsocketperm на

    unixsocket /data/redis.sock unixsocketperm 777

  3. docker run -d -v $PWD:/data redis redis-server /data/redis.conf

redis.sock появится после запуска контейнера

Что мы сделали

  1. Заставили Redis использовать unixsocket и поместить его в /data внутри контейнера
  2. Пробросили текущую директорию хоста в /data в контейнере. Там оказался redis.conf
  3. Запустили redis-server указав ему свой кастомный конфиг, который мы пробросили в контейнер
  4. Redis увидел в нем, что нужно поместить сокет в /data, что и сделал
  5. Поскольку эта директория общая для двух систем, мы увидели redis.sock на хосте

· 3 мин. чтения

UPD 2023.12.15

С момента выхода статьи прошло более 5 лет. Я все еще пользуюсь монобанком и считаю его лучшим банком в мире. Раз я начал редактировать эту тему, то заодно и дополню ее.

Самый последний приятный случай. Несколько дней назад в Украине был концерт Дорофеевой. Я бы даже не знал кто это, если бы знакомый ночью не написал подруге "я щас на концерте, тут Гороховский (глава банка) сейчас вышел на сцену и сказал, что каждый, кто напишет в поддержку "Я люблю Дорофееву" получит 100 грн на карту".

Я решил, что Гороховский хорошо набухался и с дури сказанул, но решил по приколу узнать. Не сложно же:

Днем деньги пришли, а Гороховский сделал пост.


Мне повезло стать ~212 тысячным клиентом этого банка и пользуюсь их карточкой уже примерно 4-5 месяцев. Считаю, что этот банк со временем вытеснит или, по крайней мере, потеснит нынче самый популярный PrivatBank.

monobank-open-pack

Плюсы

  • 10% на баланс просто за пользование карточкой. Некоторые банки таких депозитов не открывают, а тут даже делать ничего не надо
  • Кстати, о депозитах. 16% годовых с минимальным сроком в пол года. Это вообще лучшее предложение не только в Украине, а еще и много где за ее пределами
  • Мультифункциональный саппорт, которому можно написать даже потому что вам просто скучно, потому что ответят быстро и не бот.
  • Кешбеки до 20%. На самом деле 20% только в кино, в остальном больше 4% не получить, но он есть и начисляется на баланс, а не в виде бонусов.
  • Комиссия обналички — 0,5%. В ПриватБанке 1%. Остальных не знаю. Но вполне неплохо, когда обналичить надо 10к, например.
  • Транзакции бесплатные и "летают" супербыстро. Я не успеваю расправить пакет на кассе, как получаю оповещение на телефон о том, что с карточки списались деньги
  • Пополнение наличкой тоже без комиссий через терминалы ibox. Они есть везде
  • И пополнение мобильного счета. Это мелочь, но приятно!
  • Все об этом говорят, но они вместе с карточкой присылают стикеры с котиками! :3
  • Никогда не пользовался кредитным лимитом, а тут попробовал, потому что сделать его можно не выходя из туалета в течении 10 минут.
  • Кстати, офисов у них нет, но вы это и так знаете. Регистрируетесь, приходите "на точку" и забираете карточку. Профит! А действительно, зачем офисы?
  • Курс валют выгоднее за PrivatBank. Когда я вывожу денежку с интернета себе на карточку, то получаю на моно больше денежек. А даже если показалось, то на моно они все равно приходят быстрее

monobank-stickers

Минусы

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

· 5 мин. чтения

UPD 2023.12.15 👋

Заканчивается 2023 год, а статья до сих пор хорошая. Эта тема до сих пор находит отголоски в моих текущих задачах. Именно изучение того, как конвертируется ip толкнуло меня в понимании побитовых операций, а также сетевых масок.


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

Преобразования IP в число и обратно это побитовые операции, но я постараюсь объяснить все так, чтобы понятно было тем, кто с ними не знаком или плохо знаком. Подробнее о них можно почитать, например, здесь.

Представление IP

Как вам известно, IP состоит из 4 блоков, где число в блоке <= 255. Почему? В старые времена компьютеры поддерживали числа только до 32 бит. В 32 битах максимальное число 2^32-1 = 4294967295. В шестнадцатиричной системе (HEX) оно выглядит как FFFFFFFF или 32 ноля в двоичной (BIN).

А теперь разделим FFFFFFFF на 4 кусочка (блока): FF FF FF FF FF HEX = 255 DEC. Отсюда и получается максимально большой ИП: 255.255.255.255.

IP это HEX или BIN кусочки, разделенные точкой

Вид 255.255.255.255 в разных представлениях:

DEC 255 255 255 255 BIN 11111111 11111111 11111111 11111111 HEX FF FF FF FF

Ноли в начале чисел ничего не значат. Тоесть, 000001 == 1, поэтому если в тексте ниже сначала чисел будут ноли, то они добавлены "для красоты"

Еще пример. Возьмем любой другой ИП, например 37.230.210.51. Разделим его на кусочки: 37 230 210 51. Конвертируем каждый из этих кусочков в HEX и BIN:

DEC 037 230 210 051 BIN 00100101 11100110 11010010 00110011 HEX 25 E6 D2 33

Конвертер десятичных числел в двоичные и HEX здесь

Склеиваем, получается HEX 25E6D233 или BIN 00100101 11100110 11010010 00110011. Теперь можете конвертировать это в DEC и получите IP в виде числа, которым его удобно хранить в БД

Функция конвертации IP в число

local function ipToInt(ip) -- ip = 37.230.210.51
local int = 0

-- 31 230 210 51
local p1, p2, p3, p4 = ip:match("(%d+)%.(%d+)%.(%d+)%.(%d+)")

-- BIN | HEX
int = int + bit.lshift(p1,24) -- 00100101 00000000 00000000 00000000 | 25 00 00 00
int = int + bit.lshift(p2,16) -- 00100101 11100110 00000000 00000000 | 25 E6 00 00
int = int + bit.lshift(p3,8) -- 00100101 11100110 11010010 00000000 | 25 E6 D2 00
int = int + p4 -- 00100101 11100110 11010010 00110011 | 25 E6 D2 33

return int -- 635884083
end

Функция bit.lshift(a, b) смещает число a на b бит влево (Добавляя ноли справа). Тоесть 11010111 после смещения на 3 бита влево превратится в 11010111000. После этого смещение на 3 бита вправо вернет число в прежнее состояние, убрав ноли справа

Что происходит в функции? Она помещает каждый кусочек IP на свое место в битовом представлении и на выхлопе получается нужное число. Функция делает то же самое, что было описано ранее, только за счет математики

Конвертация числа в IP

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

  1. Представляем DEC в виде BIN
  2. Вырываем с этого BIN 4 кусочка
  3. Разделяем их точкой

Lua функция:

-- Маски из примера ниже
-- FF 00 00 00 == 11111111 00000000 00000000 00000000
-- 00 FF 00 00 == 00000000 11111111 00000000 00000000
-- 00 00 FF 00 == 00000000 00000000 11111111 00000000
-- 00 00 00 FF == 00000000 00000000 00000000 11111111

local function intToIp(int) -- 635884083 (00100101 11100110 11010010 00110011)
local a = bit.band(int, 0xFF000000) -- 00100101 00000000 00000000 00000000 | 25 00 00 00 | 037.000.000.000
local b = bit.band(int, 0x00FF0000) -- 00000000 11100110 00000000 00000000 | 00 E6 00 00 | 000.230.000.000
local c = bit.band(int, 0x0000FF00) -- 00000000 00000000 11010010 00000000 | 00 00 D2 00 | 000.000.210.000
local d = bit.band(int, 0x000000FF) -- 00000000 00000000 00000000 00110011 | 00 00 00 33 | 000.000.000.051

a = bit.rshift(a, 24) -- помещаем в самое начало
b = bit.rshift(b, 16) -- на второе место
c = bit.rshift(c, 8) -- на третье
-- четвертое уже на своем

local ip = a .. "." .. b .. "." .. c .. "." .. d
return ip -- 37.230.210.51
end

print( intToIp(635884083) )

Функция bit.band(a, b) заменяет побитовый оператор AND (и). Он возвращает число, в котором только те биты, которые установлены и в a, и в b. Тоесть bit.band(0x00FF, 0xFF00) вернет 0xFFFF. Это эквивалентно bit.band(0000000011111111, 1111111100000000) == 1111111111111111.

rshift это противоположность lshift, о котором я писал выше

Бонус

Я начал изучение этого вопроса с функции, говорящей, входит ли IP в маску, поэтому делюсь и ею: lua-function-mask-has-ip

Ссылки

· 2 мин. чтения

UPD 2023.12.15

Статья морально устарела. Сейчас модно использовать Tailscale (база – wireguard), либо хотя бы сам WireGuard. Еще можете погуглить Outline.

Кстати, напишите в ЛС, если каким-то образом попали сюда. Не знаю, кто в 2023 мог сюда попасть и очень интересно как именно.


Здесь написано о запуске через docker compose. Я пишу об установке в качестве сервиса systemd

Если сервис "упадет" (Будь то убийство процесса или краш), он перезапустится через 10 секунд

Создаем и запускаем сервис OpenVPN

Создаем volume с названием ovpn-data-NAME, где NAME - название контейнера, которое во всех последующих действиях должно быть одинаковым

OVPN_DATA="ovpn-data-example" docker volume create --name $OVPN_DATA

Здесь название это example. Дальше оно и будет использоваться

Генерируем данные (Замените HOST_OR_IP на адрес сервера) При вводе 2 команды нужно будет дважды ввести пароль, который стоит запомнить. Он еще потребуется при завершении выполнения команды. Название сертификата можно ввести любое или просто .

docker run --rm -v $OVPN_DATA:/etc/openvpn kylemanna/openvpn ovpn_genconfig -u udp://HOST_OR_IP docker run --rm -v $OVPN_DATA:/etc/openvpn -it kylemanna/openvpn ovpn_initpki

Скачиваем docker-openvpn@.service в /etc/systemd/system

curl -L https://raw.githubusercontent.com/kylemanna/docker-openvpn/master/init/docker-openvpn%40.service | sudo tee /etc/systemd/system/docker-openvpn@.service

Запускаем:

systemctl enable --now docker-openvpn@example.service

Статус сервиса : systemctl status docker-openvpn@example.service Лог сервиса : journalctl --unit docker-openvpn@example.service Остановка : systemctl stop docker-openvpn@example.service

Создаем клиентские конфиги

Чтобы подключиться к VPN потребуется конфигурация. Заменяем CLIENTNAME в первой строчке

CLIENTNAME=home_pc docker run --rm -v $OVPN_DATA:/etc/openvpn -it kylemanna/openvpn easyrsa build-client-full $CLIENTNAME nopass docker run --rm -v $OVPN_DATA:/etc/openvpn kylemanna/openvpn ovpn_getclient $CLIENTNAME > $CLIENTNAME.ovpn

На Windows ее нужно поместить в C:\Program Files\OpenVPN\config

Полезные ссылки

· 1 мин. чтения

UPD 2023.12.15

Напиши мне в лс, если это читаешь. Мне очень интересно, кто в 2023 году сюда попал, а главное – КАК?


Ниже заметки, касательно KOTO и yescrypt, но используя cpuminer-multi майнятся и другие монеты

yescrypt-cpu-mining

Установка с Docker

docker run --rm defaced/cpuminer-multi --algo yescrypt --url stratum+tcp://koto.litepool.ru:3032 --user k1FQS7Q2XxaWWLjLdFXFJfG7cQq74mWsZph Можно заменить адрес пула и кошелька

Установка без Docker

Требуется Debian based OS*

Установка зависимостей sudo apt install git build-essential libcurl4-openssl-dev autotools-dev automake

Скачиваем майнер git clone https://github.com/KotoDevelopers/cpuminer-yescrypt.git koto-miner ; cd koto-miner

Устанавливаем ./autogen.sh ./configure make

Запускаем (В -u кошелек) ./minerd -a yescrypt -o stratum+tcp://koto.litepool.ru:3032 -u k1FQS7Q2XxaWWLjLdFXFJfG7cQq74mWsZph

Статистика

Наблюдать за своими воркерами можно по ссылке: http://koto.litepool.ru:8080/workers/k1FQS7Q2XxaWWLjLdFXFJfG7cQq74mWsZph Нужно только заменить адрес кошелька на свой.

koto-litepool-stats

Если есть несколько воркеров (aka rigs), то его имя можно указать через точку после адреса при запуске майнера: --user ADDRESS.rigname

· 6 мин. чтения

gm-donate.net — система автоматического приема и обработки донатов (пожертвований) для Garry’s Mod серверов. Простыми словами – автодонат для гмод серверов.

GMD — это вторая попытка сделать качественный сервис для автоматизации донатов и мне кажется, она удалась.

· 2 мин. чтения

Это перепись моего поста с основного блога, который написан на WordPress

Забитый гвоздь

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

  • Заголовок
  • Формат записи
  • Постоянная ссылка
  • Оформление поста
  • Ключевые слова
  • Описание для гугла
  • Рубрика, Публикации в соц. сети
  • Метки
  • Сам текст, оформить который здесь бывает сложнее, чем написать

Одним словом — дохера лишнего.

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

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

UPD 2018.07.08. Теперь я еще буду писать сюда. На blog.amd-nick.me, используя Ghost. Ghost быстрый, правильный и простой. Я пишу на Markdown, вижу большие буквы и ничего лишнего.

UPD 2023.12.15. Мир идет в перед и я уже год или два пишу через статичный генератор сайтов Docusaurus

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

· 4 мин. чтения

UPD 2023.12.15

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

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


В процессе работы над автодонатом для Garry’s Mod мне доводилось иметь дело с десятком-вторым человек. Некоторые хотят получить помощь по системе, когда сами создают проблему, при чем сами и препятствуют нам ее решать, например, отказывая в удаленном доступа. Другие требуют сделать то, что мы делать не должны, параллельно угрожая уходом, если мы их не послушаемся. Но все они — пустяк на фоне особой и самой основной категории юзеров — скряги.