systemd.path – реагируем на события файловой системы
Как мы уже рассказывали systemd предоставляет администраторам простые, но в тоже время мощные инструменты на все случаи жизни.
Сегодня мы рассмотрим еще один тип юнита – path, который предназначен для контроля событий файловой системы. Сейчас он позволяет реагировать на создание, изменение или модификацию файлов или на появление файлов в директории.
Создадим для примера юнит
И внесем в него следующие строки:
В общем и целом, стандартный юнит, ничего необычного, кроме секции
Если секция Path не содержит директивы
Если требуется запуск другой службы, то ее требуется указать явно, т.е.:
Для начала работы юнит нужно запустить и добавить в автозагрузку:
Или одной командой:
В секции
Для отслеживания событий можно использовать следующие директивы:
▫️
▫️
▫️
▫️
▫️
Дополнительно с последней можно использовать:
▫️
Еще две опции позволяют задать временные лимиты срабатывания.
▫️
Отдельно следует отметить, что systemd.path работает только с локальными файловыми системами и не будет работать с SMB или NFS.
Как мы уже рассказывали systemd предоставляет администраторам простые, но в тоже время мощные инструменты на все случаи жизни.
Сегодня мы рассмотрим еще один тип юнита – path, который предназначен для контроля событий файловой системы. Сейчас он позволяет реагировать на создание, изменение или модификацию файлов или на появление файлов в директории.
Создадим для примера юнит
/etc/systemd/system/my_name.pathИ внесем в него следующие строки:
[Unit]
Description= Path test
[Path]
PathExists=/a/b/c/filename
[Install]
WantedBy=multi-user.target
В общем и целом, стандартный юнит, ничего необычного, кроме секции
Path, в директиве PathExists – путь, который мы отслеживаем.Если секция Path не содержит директивы
Unit, то будет найден и запушен одноименный сервис, т.е. my_name.service.Если требуется запуск другой службы, то ее требуется указать явно, т.е.:
[Path]
PathExists=/a/b/c/filename
Unit=123.service
Для начала работы юнит нужно запустить и добавить в автозагрузку:
systemctl start my_name.path
systemctl enable my_name.path
Или одной командой:
systemctl enable --now my_name.path
В секции
[Path] можно одновременно отслеживать несколько путей, запуск юнита произойдет при выполнении любого условия. Однако если хоть одно условие содержит пустую строку, то все директивы будут проигнорированы и юнит работать не будет.Для отслеживания событий можно использовать следующие директивы:
▫️
PathExists= проверяет существование файла▫️
PathExistsGlob= тоже самое, но позволяет использовать шаблоны подстановки▫️
PathChanged= проверяет изменение файла, срабатывает по окончанию редактирования▫️
PathModified= проверяет модификацию файла, срабатывает сразу, не дожидаясь окончания редактирования.▫️
DirectoryNotEmpty= проверяет появление файлов в директорииДополнительно с последней можно использовать:
▫️
MakeDirectory= при указании true каталог для отслеживания будет автоматически создан▫️ DirectoryMode= права на созданный каталог, по умолчанию 0755Еще две опции позволяют задать временные лимиты срабатывания.
▫️ TriggerLimitIntervalSec= юнит будет срабатывать не чаще указанного промежутка времени, по умолчанию 2 секунды.▫️
TriggerLimitBurst= количество активаций за указанное время, по умолчанию 200. Таким образом если произойдет более 200 срабатываний за 2 секунды, то юнит перейдет в режим сбоя не будет работать до перезапуска. Отдельно следует отметить, что systemd.path работает только с локальными файловыми системами и не будет работать с SMB или NFS.
👍17❤4👌2🔥1
Куда шагает отечественное информационное IT-сообщество сегодня
Над этим вопросом я задумался после вопроса по поводу будущего нашего сайта от одного из подписчиков. Вопрос не праздный, потому как формат статьи на сайте и формат заметки в Телеграм с лимитом в 4000 символов – вещи принципиально разные.
Да, есть определенные технические сложности, но этот фактор в том или ином виде был всегда, это я могу сказать совершенно точно, как человек, который крутится в этой сфере без малого 20 лет.
Сейчас, например, это ИИ, которые перехватывают значительную долю трафика, особенно к статьям из которой можно сделать краткую выжимку на один-два абзаца. Но они не первые и не последние, кто за все это время отравлял жизнь создателей контента.
При том, что ведение информационного ресурса на регулярной основе – это не хобби, а еще одна работа на половину или четверть ставки. И поэтому или ресурс находит свою экономическую модель, либо тихо загибается.
Иного не дано, энтузиазмом сыт не будешь и семью не обеспечишь. Есть расхожее выражение: любовная лодка разбилась о быт. Тут ровно тоже самое.
Но, до последнего времени, были вполне неплохие альтернативы, позволяющие и волков накормить, и овец сберечь. Речь в первую очередь идет о Телеграм и каналах в нем, которые сегодня стали реальной альтернативой СМИ.
А где есть аудитория, там будут рекламодатели, там будет выручка, которая позволяла тянуть даже убыточный сайт и дополнять короткие посты в Телеге емкими материалами, и перекачивать пользователей с сайта в Телегу, с Телеги на сайт.
Модель получилась достаточно стабильная и позволяла многим авторам спокойно заниматься производством контента как деятельностью, приносящей реальный доход.
Но в последнее время все изменилось. И это лежит уже не в технической области, а в законодательной. Мне до сих пор кажется, то регуляторы сами не понимают, что именно они регулируют, но легче не становится.
С каждым днем все больше и больше информации проходит у нас по рангу нежелательной, которую нельзя публиковать, на которую нельзя ссылаться, или надо обязательно ставить сноски, что данная информация распространена нежелательным элементом и все такое прочее.
Но, позвольте, закон обратной силы не имеет! Еще как имеет. Если ваша веб-страница с материалами, нарушающими действующее законодательство доступна здесь и сейчас, хотя и написана была далеко до, то у вас длящееся правонарушение, которое возникло в момент признания этих материалов противоправными.
А много кто помнит, что именно от писал 10 лет назад и нет ли там состава противоправного деяния?
Ну да ладно, мы отвлеклись. Текущая модель предусматривала Телеграм как основной финансовый поток, за счет которого тянулись остальные части проекта. Но с 2027 года реклама в ТГ объявлена вне закона.
Это чувствуется уже сейчас, рекламные доходы существенно просели. Но это не о деньгах, а о мотивации к созданию контента.
Сегодня даже в порядке хобби это крайне сомнительная инициатива. С учетом того, что некоторое известное ведомство из трех букв приравняло IP-адрес к персональным данным.
Т.е. создал сайт – получил проблемы на ровном месте, а если еще что-то там опубликовал, то постоянно смотри, не нарушаешь ли ты чего там, ибо правило обратной силы тут не действует.
И что скажет молодой потенциальный автор? Да нафига оно ему надо, если эта деятельность вместо пары десятков тысяч рублей в семейный бюджет подведет его к куда более крупным штрафам.
Да и о чем писать? Если половину тем под запретом, а остальная половина не будет работать без запретного слова КВН.
Фактически отрасль или выдавливается из страны, или вгоняется в стагнацию, копайтесь в местном болоте и не отсвечивайте.
Но это мы уже проходили и программируемые калькуляторы, при всей моей ностальгии к ним, СССР не спасли.
Над этим вопросом я задумался после вопроса по поводу будущего нашего сайта от одного из подписчиков. Вопрос не праздный, потому как формат статьи на сайте и формат заметки в Телеграм с лимитом в 4000 символов – вещи принципиально разные.
Да, есть определенные технические сложности, но этот фактор в том или ином виде был всегда, это я могу сказать совершенно точно, как человек, который крутится в этой сфере без малого 20 лет.
Сейчас, например, это ИИ, которые перехватывают значительную долю трафика, особенно к статьям из которой можно сделать краткую выжимку на один-два абзаца. Но они не первые и не последние, кто за все это время отравлял жизнь создателей контента.
При том, что ведение информационного ресурса на регулярной основе – это не хобби, а еще одна работа на половину или четверть ставки. И поэтому или ресурс находит свою экономическую модель, либо тихо загибается.
Иного не дано, энтузиазмом сыт не будешь и семью не обеспечишь. Есть расхожее выражение: любовная лодка разбилась о быт. Тут ровно тоже самое.
Но, до последнего времени, были вполне неплохие альтернативы, позволяющие и волков накормить, и овец сберечь. Речь в первую очередь идет о Телеграм и каналах в нем, которые сегодня стали реальной альтернативой СМИ.
А где есть аудитория, там будут рекламодатели, там будет выручка, которая позволяла тянуть даже убыточный сайт и дополнять короткие посты в Телеге емкими материалами, и перекачивать пользователей с сайта в Телегу, с Телеги на сайт.
Модель получилась достаточно стабильная и позволяла многим авторам спокойно заниматься производством контента как деятельностью, приносящей реальный доход.
Но в последнее время все изменилось. И это лежит уже не в технической области, а в законодательной. Мне до сих пор кажется, то регуляторы сами не понимают, что именно они регулируют, но легче не становится.
С каждым днем все больше и больше информации проходит у нас по рангу нежелательной, которую нельзя публиковать, на которую нельзя ссылаться, или надо обязательно ставить сноски, что данная информация распространена нежелательным элементом и все такое прочее.
Но, позвольте, закон обратной силы не имеет! Еще как имеет. Если ваша веб-страница с материалами, нарушающими действующее законодательство доступна здесь и сейчас, хотя и написана была далеко до, то у вас длящееся правонарушение, которое возникло в момент признания этих материалов противоправными.
А много кто помнит, что именно от писал 10 лет назад и нет ли там состава противоправного деяния?
Ну да ладно, мы отвлеклись. Текущая модель предусматривала Телеграм как основной финансовый поток, за счет которого тянулись остальные части проекта. Но с 2027 года реклама в ТГ объявлена вне закона.
Это чувствуется уже сейчас, рекламные доходы существенно просели. Но это не о деньгах, а о мотивации к созданию контента.
Сегодня даже в порядке хобби это крайне сомнительная инициатива. С учетом того, что некоторое известное ведомство из трех букв приравняло IP-адрес к персональным данным.
Т.е. создал сайт – получил проблемы на ровном месте, а если еще что-то там опубликовал, то постоянно смотри, не нарушаешь ли ты чего там, ибо правило обратной силы тут не действует.
И что скажет молодой потенциальный автор? Да нафига оно ему надо, если эта деятельность вместо пары десятков тысяч рублей в семейный бюджет подведет его к куда более крупным штрафам.
Да и о чем писать? Если половину тем под запретом, а остальная половина не будет работать без запретного слова КВН.
Фактически отрасль или выдавливается из страны, или вгоняется в стагнацию, копайтесь в местном болоте и не отсвечивайте.
Но это мы уже проходили и программируемые калькуляторы, при всей моей ностальгии к ним, СССР не спасли.
👍51❤5⚡3🤔3🤮1
Особенности директории /etc/pve
Не все знают, что
Поэтому если вы загрузитесь с диска восстановления или подключите диск к другому ПК с целью скопировать конфигурацию гипервизора, то вас ждет неприятный сюрприз – папка окажется пуста.
В этом случае вам понадобится файл базы данных SQLite в котором реально хранятся данные:
Поэтому, если вам нужно сохранить настройки гипервизора, в который вы не можете загрузиться нормальным образом – вам нужно скопировать именно этот файл и потом заменить им базу на новом экземпляре гипервизора.
Если вы хотите просмотреть содержимое базы данных, то выполните запрос:
В выводе вы получите следующую структуру: номер inode, имя объекта и его тип (4 – директория, 8 – файл).
Если хотите получить список объектов директории выполните запрос с указанием ее inode, в нашем случае 12:
Прочитать содержимое файла из базы вы можете запросом (в данном случае мы читаем файл с inode 6):
При необходимости можем сохранить вывод в файл:
Это дает нам возможность не заменять базу целиком, а скопировать из нее только нужные файлы, скажем – конфигурации виртуальных машин и контейнеров.
Не все знают, что
/etc/pve – это не просто директория на диске, а точка монтирования распределённой файловой системы pmxcfs (Proxmox Cluster File System). Данная система монтируется через FUSE при запуске службы pve-cluster и отражает текущую конфигурацию кластера в реальном времени.Поэтому если вы загрузитесь с диска восстановления или подключите диск к другому ПК с целью скопировать конфигурацию гипервизора, то вас ждет неприятный сюрприз – папка окажется пуста.
В этом случае вам понадобится файл базы данных SQLite в котором реально хранятся данные:
/var/lib/pve-cluster/config.dbПоэтому, если вам нужно сохранить настройки гипервизора, в который вы не можете загрузиться нормальным образом – вам нужно скопировать именно этот файл и потом заменить им базу на новом экземпляре гипервизора.
Если вы хотите просмотреть содержимое базы данных, то выполните запрос:
sqlite3 /var/lib/pve-cluster/config.db "SELECT inode, name, type FROM tree WHERE parent = 1;"
В выводе вы получите следующую структуру: номер inode, имя объекта и его тип (4 – директория, 8 – файл).
Если хотите получить список объектов директории выполните запрос с указанием ее inode, в нашем случае 12:
sqlite3 /var/lib/pve-cluster/config.db "SELECT inode, name, type FROM tree WHERE parent = 12;"
Прочитать содержимое файла из базы вы можете запросом (в данном случае мы читаем файл с inode 6):
sqlite3 /var/lib/pve-cluster/config.db "SELECT CAST(data AS TEXT) FROM tree WHERE inode = 6;"
При необходимости можем сохранить вывод в файл:
sqlite3 /var/lib/pve-cluster/config.db "SELECT CAST(data AS TEXT) FROM tree WHERE inode = 6;" > filename
Это дает нам возможность не заменять базу целиком, а скопировать из нее только нужные файлы, скажем – конфигурации виртуальных машин и контейнеров.
👍28🔥8❤3
Веселая иллюминация на Mikrotik
Сегодня коллега из одного филиала прислал эту фотографию с вопросом: а нормально ли это, что роутер сияет всеми цветами как новогодняя елка?
Начнем с пятого порта, это нормально, на этой модели данный порт имеет функцию PoE-out и в данной конфигурации включена подача питания на порт.
А вот почему светится желтым четвертый порт? Документация не содержит четкого описания цветов и режимов для каждой модели, но найденная в сети информация сбила коллегу с толку, намекая на то, что порт работает в нестандартном режиме (например, 10 Мбит/с).
Но изучение режимов работы порта не выявило никаких отклонений от своих соседей. Почему же тогда он желтый?
Для правильного ответа на этот вопрос я предложил ему временно выключить светодиод на пятом порте. После чего все сразу вернулось на круги своя.
Дело в том, что в данной модели Mikrotik индикаторы распаяны прямо на плате, а рассеиватель физически устроен так, что более яркий красный может спокойно «слепить» соседние зеленые.
В результате мы на месте индикатора четвертого порта и видим желтый цвет, также обратите внимание на средний (третий) индикатор – он немного более желтого оттенка, чем первые два.
Эту особенность хорошо знают те, кто много работает с Mikrotik и подвержены ей все модели в аналогичных корпусах. Если вас все же терзают сомнения, то попробуйте выключить соседние светодиоды в System – LEDs и проверить реальный цвет «подозрительного индикатора».
Сегодня коллега из одного филиала прислал эту фотографию с вопросом: а нормально ли это, что роутер сияет всеми цветами как новогодняя елка?
Начнем с пятого порта, это нормально, на этой модели данный порт имеет функцию PoE-out и в данной конфигурации включена подача питания на порт.
А вот почему светится желтым четвертый порт? Документация не содержит четкого описания цветов и режимов для каждой модели, но найденная в сети информация сбила коллегу с толку, намекая на то, что порт работает в нестандартном режиме (например, 10 Мбит/с).
Но изучение режимов работы порта не выявило никаких отклонений от своих соседей. Почему же тогда он желтый?
Для правильного ответа на этот вопрос я предложил ему временно выключить светодиод на пятом порте. После чего все сразу вернулось на круги своя.
Дело в том, что в данной модели Mikrotik индикаторы распаяны прямо на плате, а рассеиватель физически устроен так, что более яркий красный может спокойно «слепить» соседние зеленые.
В результате мы на месте индикатора четвертого порта и видим желтый цвет, также обратите внимание на средний (третий) индикатор – он немного более желтого оттенка, чем первые два.
Эту особенность хорошо знают те, кто много работает с Mikrotik и подвержены ей все модели в аналогичных корпусах. Если вас все же терзают сомнения, то попробуйте выключить соседние светодиоды в System – LEDs и проверить реальный цвет «подозрительного индикатора».
👍37😁21❤4
Как получить список подключенных USB-устройств в Windows
Возникла необходимость просмотреть список подключенных устройств на удаленном ПК с Windows. Задача не самая простая, ну не бегать же глазами по диспетчеру устройств. В Linux для этого есть команда
Для этой цели будем использовать командлет
Кроме идентификатора мы можем использовать в отборе класс, но в этом случае в вывод не попадут такие устройства как камеры или смарт-карты (токены), но может попасть совсем не USB-устройство, например, контроллер USB на PCIe шине:
При желании можем оба отбора скомбинировать и получить только устройства класса USB подключенные именно как USB:
Как видим, PowerShell дает не меньше возможностей и позволяет легко выполнять отборы по требуемым параметрам.
Возникла необходимость просмотреть список подключенных устройств на удаленном ПК с Windows. Задача не самая простая, ну не бегать же глазами по диспетчеру устройств. В Linux для этого есть команда
lsusb, посмотрим, что может нам предложить PowerShell.Для этой цели будем использовать командлет
Get-PnpDevice, для начала отберем устройства по идентификатору в котором присутствует USB, опция Status OK покажет только активные устройства:Get-PnpDevice -InstanceId 'USB*' -Status OK
Кроме идентификатора мы можем использовать в отборе класс, но в этом случае в вывод не попадут такие устройства как камеры или смарт-карты (токены), но может попасть совсем не USB-устройство, например, контроллер USB на PCIe шине:
Get-PnpDevice -Class 'USB' -Status OK
При желании можем оба отбора скомбинировать и получить только устройства класса USB подключенные именно как USB:
Get-PnpDevice -InstanceId 'USB*' -Class USB -Status OK
Как видим, PowerShell дает не меньше возможностей и позволяет легко выполнять отборы по требуемым параметрам.
👍23🤝5❤3⚡2
Установка и настройка сервера лицензирования 1С:Предприятие
Управление лицензиями 1С:Предприятия - задача не простая, особенно если у вас в эксплуатации несколько серверов или используется виртуализация.
Основные проблемы - это оптимизация распределения лицензий и привязка лицензий к параметрам оборудования, что создает трудности в виртуальной среде.
Облегчить работу и централизовать управление лицензиями вам поможет выделенный сервер лицензирования, как его установить и настроить мы расскажем в этой статье.
https://interface31.ru/tech_it/2024/11/ustanovka-i-nastroyka-servera-licenzirovaniya-1spredpriyatie.html
Управление лицензиями 1С:Предприятия - задача не простая, особенно если у вас в эксплуатации несколько серверов или используется виртуализация.
Основные проблемы - это оптимизация распределения лицензий и привязка лицензий к параметрам оборудования, что создает трудности в виртуальной среде.
Облегчить работу и централизовать управление лицензиями вам поможет выделенный сервер лицензирования, как его установить и настроить мы расскажем в этой статье.
https://interface31.ru/tech_it/2024/11/ustanovka-i-nastroyka-servera-licenzirovaniya-1spredpriyatie.html
👍19❤2
Lazydocker – легкая консольная утилита для управления Docker
Управлять инфраструктурой Docker в голом терминале не очень удобно и каждый раз, когда речь заходит об этом, на ум приходят Portainer и его аналоги.
Но если у вас пяток-десяток контейнеров на недорогом VPS, то тянуть туда еще один тяжелый контейнер для управления – это перебор.
В этом случае может пригодиться Lazydocker – интерактивная консольная утилита, закрывающая все основные потребности по управлению и контролю Docker инфраструктуры.
Для ее установки можно воспользоваться инструкцией из официального репозитория, которая скачивает и запускает скрипт, но в этом случае утилита будет размещена в $HOME/.local/bin, что не очень удобно, поэтому сразу определим место установки.
Если мы хотим, чтобы утилита была доступна всем пользователям сервера по стандартному пути, то установим ее в
Теперь можно запускать сам скрипт:
А дальше просто:
Навигация осуществляется стрелками, цифрами и фигурными скобками (по горизонтали).
Основных разделов шесть: проекты и сервисы – это то, что вы запускаете при помощи Docker Compose, затем идут отдельные контейнеры, образы, тома и сети.
В каждом разделе вы можете посмотреть доступную информацию: настройки, логи, статистику или выполнить набор команд, который доступен в меню по кнопке x, кнопкой b можно вызвать массовые команды для групповых действий.
Все быстро, просто, удобно. Если вы обладаете базовыми знаниями Docker и понимаете, что и для чего, то освоение утилиты займет пару минут.
Утилита написана на Go, работает быстро, потребляет минимум ресурсов и, главное, поработали – закрыли.
Управлять инфраструктурой Docker в голом терминале не очень удобно и каждый раз, когда речь заходит об этом, на ум приходят Portainer и его аналоги.
Но если у вас пяток-десяток контейнеров на недорогом VPS, то тянуть туда еще один тяжелый контейнер для управления – это перебор.
В этом случае может пригодиться Lazydocker – интерактивная консольная утилита, закрывающая все основные потребности по управлению и контролю Docker инфраструктуры.
Для ее установки можно воспользоваться инструкцией из официального репозитория, которая скачивает и запускает скрипт, но в этом случае утилита будет размещена в $HOME/.local/bin, что не очень удобно, поэтому сразу определим место установки.
Если мы хотим, чтобы утилита была доступна всем пользователям сервера по стандартному пути, то установим ее в
/usr/local/bin, для чего перед запуском скрипта определим переменную окружения: export DIR=/usr/local/bin
Теперь можно запускать сам скрипт:
curl https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | bash
А дальше просто:
lazydocker
Навигация осуществляется стрелками, цифрами и фигурными скобками (по горизонтали).
Основных разделов шесть: проекты и сервисы – это то, что вы запускаете при помощи Docker Compose, затем идут отдельные контейнеры, образы, тома и сети.
В каждом разделе вы можете посмотреть доступную информацию: настройки, логи, статистику или выполнить набор команд, который доступен в меню по кнопке x, кнопкой b можно вызвать массовые команды для групповых действий.
Все быстро, просто, удобно. Если вы обладаете базовыми знаниями Docker и понимаете, что и для чего, то освоение утилиты займет пару минут.
Утилита написана на Go, работает быстро, потребляет минимум ресурсов и, главное, поработали – закрыли.
👍28🔥4❤2🤝1
Можно ли заплутать в трех соснах при помощи ИИ?
Сейчас вокруг ИИ складывается большой ажиотаж, многие считают, что наличие такого помощника обесценивает знания и опыт и позволяет даже начинающим сотрудникам выполнять работу старших товарищей, не напрягаясь и не вникая.
Ну да, вкалывают роботы – счастлив человек. Это мы слышали не раз и не два. Но любой, кто серьезно работал с ИИ понимает, что несмотря на весь достигнутый прогресс – это просто помощник: неутомимый, исполнительный, но туповатый, хотя и начитанный.
Это как? Да вот так, теория без практики мертва, практика без теории – сборник магических заклинаний, камланий и ритуалов. И только совмещение первого и второго дают устойчивый результат в виде экспертных знаний и навыков.
Сегодня мы провели небольшой эксперимент, задали трем сетям один провокационный вопрос, в «забеге» участвовали ChatGPT, Gemini и Qwen. А вопрос был простой:
Почему Joplin при размере контейнера в 554 МБ развернулся в 4,46 ГБ?
Сетки начинают активно думать и строить предположения, в целом ход их мысли правильный и грамотный, что может усыпить бдительность вопрошающего. Они совершенно правильно предлагают выполнить внутри контейнера определенные команды, чтобы понять, кто занял все это место.
Но вывод делают абсолютно неправильный, только увидев, что это папка
В общем сразу нагнали жути, а дальше пошли ценные указания как подключить к контейнеру том и на горячую перенести в него данные, чтобы они бесследно не пропали при перезапуске.
Хорошо, демонстративно делаю:
И снова показываю размер образа, и поясняю, что все мои данные на месте. После чего ИИ выдвигает новую гипотезу, что это могут быть временные файлы, логи, кеши и сессии. А дальше идут новые рекомендации как это все оптимизировать, вынести, разнести и т.д. и т.п.
При этом все три сетки продолжают нагнетать жути:
Ладно, предлагаю им ознакомиться с образцом Compose-файла от самих разработчиков, где никаких томов к контейнеру Joplin не монтируется, но в ответ снова идут размышления, что там просто пример, а на практике может быть всякое.
Скажем честно, если бы мы заранее не знали правильный ответ, но возможно бы и повелись, больно все хорошо обосновано было.
Но в итоге мы при помощи тех же самых команд, что советовала сетка показали ей что на самом деле занимает место.
И что? А ничего, ИИ моментально переобулся на ходу (это он умеет):
На самом деле все просто, Joplin Server написан на Node.js, который отлично жмется, а в развернутом виде и составляет те самые 4,5 ГБ.
Сейчас вокруг ИИ складывается большой ажиотаж, многие считают, что наличие такого помощника обесценивает знания и опыт и позволяет даже начинающим сотрудникам выполнять работу старших товарищей, не напрягаясь и не вникая.
Ну да, вкалывают роботы – счастлив человек. Это мы слышали не раз и не два. Но любой, кто серьезно работал с ИИ понимает, что несмотря на весь достигнутый прогресс – это просто помощник: неутомимый, исполнительный, но туповатый, хотя и начитанный.
Это как? Да вот так, теория без практики мертва, практика без теории – сборник магических заклинаний, камланий и ритуалов. И только совмещение первого и второго дают устойчивый результат в виде экспертных знаний и навыков.
Сегодня мы провели небольшой эксперимент, задали трем сетям один провокационный вопрос, в «забеге» участвовали ChatGPT, Gemini и Qwen. А вопрос был простой:
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
joplin/server:latest 5d9e7f9d31b4 4.46GB 554MB U
Почему Joplin при размере контейнера в 554 МБ развернулся в 4,46 ГБ?
Сетки начинают активно думать и строить предположения, в целом ход их мысли правильный и грамотный, что может усыпить бдительность вопрошающего. Они совершенно правильно предлагают выполнить внутри контейнера определенные команды, чтобы понять, кто занял все это место.
Но вывод делают абсолютно неправильный, только увидев, что это папка
/home/joplin сразу возникает гипотеза: Вот и виновник: 3.4 ГБ в папке /home.
В образе Joplin Server по умолчанию рабочая директория и данные пользователя находятся именно в /home/joplin. Поскольку база данных у тебя вынесена в отдельный контейнер Postgres, эти 3.4 ГБ — это не заметки, а скорее всего хранилище ресурсов (Resources/Attachments): картинки, PDF-файлы и другие вложения, которые ты синхронизировал.
Почему это плохо в текущем виде?
Риск потери данных: Если ты сделаешь docker compose down и удалишь контейнер (а не просто остановишь), всё, что не в базе и не в Volume, исчезнет навсегда.
В общем сразу нагнали жути, а дальше пошли ценные указания как подключить к контейнеру том и на горячую перенести в него данные, чтобы они бесследно не пропали при перезапуске.
Хорошо, демонстративно делаю:
docker compose down
docker compose up -d
И снова показываю размер образа, и поясняю, что все мои данные на месте. После чего ИИ выдвигает новую гипотезу, что это могут быть временные файлы, логи, кеши и сессии. А дальше идут новые рекомендации как это все оптимизировать, вынести, разнести и т.д. и т.п.
При этом все три сетки продолжают нагнетать жути:
Для Joplin на Postgres это обычно не критично (всё в БД), но если ты используешь FileSystem как хранилище для ресурсов (Storage Driver), то обязательно выноси эту папку на хост.
Вердикт: Если docker system prune не скинет эти 4ГБ, значит, Joplin хранит вложения или логи внутри себя. Для «чистого» сервера это ненормально, и лучше поправить маппинг папок в конфиге сейчас, пока ты не залил туда всю свою базу заметок.
Ладно, предлагаю им ознакомиться с образцом Compose-файла от самих разработчиков, где никаких томов к контейнеру Joplin не монтируется, но в ответ снова идут размышления, что там просто пример, а на практике может быть всякое.
Скажем честно, если бы мы заранее не знали правильный ответ, но возможно бы и повелись, больно все хорошо обосновано было.
Но в итоге мы при помощи тех же самых команд, что советовала сетка показали ей что на самом деле занимает место.
И что? А ничего, ИИ моментально переобулся на ходу (это он умеет):
Вот мы и нашли "жирок". Эти 3.4 ГБ — это исходный код и зависимости самого приложения Joplin.
Что происходит?
В образе Joplin Server разработчики упаковали всё дерево в /home/joplin/packages.
Это нормально: Это не мусор, а рабочие модули (парсеры, рендерер, сам сервер), без которых приложение не заведется.
На самом деле все просто, Joplin Server написан на Node.js, который отлично жмется, а в развернутом виде и составляет те самые 4,5 ГБ.
👍26😁3❤1
Режимы запуска bash
Скрипты и команды bash – это то, с чем ежедневно сталкивается системный администратора, поэтому важно знать режимы запуска командной оболочки и контекст выполнения команд bash в каждом конкретном случае.
1️⃣ Начнем с режима входа в систему, в этом случае bash является оболочкой входа и при завершении процесса сеанс прекратится. Такой режим используется при интерактивном входе в систему или при подключении через SSH.
При запуске в качестве оболочки входа bash создает новую базовую среду и считывает файлы инициализации
Кроме того,
Таким образом в режиме входа в систему bash создает базовую среду на основе как системных настроек, так и персональных для выполнившего вход пользователя.
2️⃣ Следующий режим – интерактивный, он запускается, когда стандартные потоки ввода-вывода подключены к эмулятору терминала. Например, если вы запустили терминал в графической среде. Или явно запустили bash внутри оболочки входа (а это может быть не обязательно bash).
В этом случае новая базовая среда не создается, а наследуется контекст окружения текущей оболочки, в дополнение к этому считываются персональные настройки из
Если сравнивать интерактивный режим и режим оболочки входа, то основной разницей является то, что интерактивный режим наследует текущее окружение и только лишь дополняет его персональными настройками.
3️⃣ Третий режим – неинтерактивный. Он используется при запуске
Этот режим существенно отличается как от режима оболочки входа, так и интерактивного. Основное его отличие в том, что при запуске создается новая минимальная базовая среда, но при этом не считываются никакие файлы инициализации, кроме файла указанного в переменной
Таким образом большинство привычных настроек, включая пути исполнения, в неинтерактивном режиме окажутся недоступны. И если скрипт у вас прекрасно работал интерактивно, то в неинтерактивном режиме вас может поджидать неприятная неожиданность.
Как избежать данной проблемы? Не запускать скрипты интерактивно. Т.е. вместо
В чем разница? В первом случае скрипт будет исполнен интерактивно, в режиме оболочки входа или интерактивной оболочки. Во втором bash будет запущен неинтерактивно, с минимальным контекстом выполнения, также как и при вызове скрипта системой.
Скрипты и команды bash – это то, с чем ежедневно сталкивается системный администратора, поэтому важно знать режимы запуска командной оболочки и контекст выполнения команд bash в каждом конкретном случае.
1️⃣ Начнем с режима входа в систему, в этом случае bash является оболочкой входа и при завершении процесса сеанс прекратится. Такой режим используется при интерактивном входе в систему или при подключении через SSH.
При запуске в качестве оболочки входа bash создает новую базовую среду и считывает файлы инициализации
/etc/profile и один из файлов: ~/.bash_profile, ~/.bash_login или ~/.profile который будет найден первым при поиске в указанном порядке.Кроме того,
/etc/profile считывает файлы /etc/profile.d/*.sh и /etc/bash.bashrc, а ~/.bash_profile содержит указание на исполнение файла ~/.bashrc.Таким образом в режиме входа в систему bash создает базовую среду на основе как системных настроек, так и персональных для выполнившего вход пользователя.
2️⃣ Следующий режим – интерактивный, он запускается, когда стандартные потоки ввода-вывода подключены к эмулятору терминала. Например, если вы запустили терминал в графической среде. Или явно запустили bash внутри оболочки входа (а это может быть не обязательно bash).
В этом случае новая базовая среда не создается, а наследуется контекст окружения текущей оболочки, в дополнение к этому считываются персональные настройки из
~/.bash_profile и общие из /etc/bash.bashrc. Если сравнивать интерактивный режим и режим оболочки входа, то основной разницей является то, что интерактивный режим наследует текущее окружение и только лишь дополняет его персональными настройками.
3️⃣ Третий режим – неинтерактивный. Он используется при запуске
bash -с или bash имя_скрипта, а также при вызове команд и скриптов системными процессами, тем же cron.Этот режим существенно отличается как от режима оболочки входа, так и интерактивного. Основное его отличие в том, что при запуске создается новая минимальная базовая среда, но при этом не считываются никакие файлы инициализации, кроме файла указанного в переменной
BASH_ENV среды окружения (если задан).Таким образом большинство привычных настроек, включая пути исполнения, в неинтерактивном режиме окажутся недоступны. И если скрипт у вас прекрасно работал интерактивно, то в неинтерактивном режиме вас может поджидать неприятная неожиданность.
Как избежать данной проблемы? Не запускать скрипты интерактивно. Т.е. вместо
./my_script.sh используйте bash my_script.sh.В чем разница? В первом случае скрипт будет исполнен интерактивно, в режиме оболочки входа или интерактивной оболочки. Во втором bash будет запущен неинтерактивно, с минимальным контекстом выполнения, также как и при вызове скрипта системой.
👍14👌1
Новому сайту – быть!
Последнее время многие нас спрашивают про сайт, будет ли он продолжать свое развитие или нет. Вопрос не праздный, потому как формат заметок в Телеграм не позволяет глубоко раскрыть многие темы (ограничение в 4000 символов).
Дополним это тем, что заметка в Телеграм, по сути, одноразовая. Поиск тут так себе, а ленту сильно вверх никто не листает. Поэтому публикация развернутых инструкций и подробных статей возможна только на сайте.
Старый сайт был создан на движке Movable Type 6.2, это довольно интересная CMS, которая генерировала статическое содержимое и наш сайт с самого его основания фактически являлся статическим.
Но сам движок все равно присутствовал на сайте и брал на себя ряд служебных функций: поиск, обработку тегов, пагинацию.
Сам движок тоже пошел сложным путем, сначала разработчики убрали Community-версию, потом и вовсе продали проект японцам, и поддержка продукта стала очень затруднительной.
В текущем виде Movable Type 6.2 – дырявое решето, которое не сломает только ленивый, поэтому большая часть сайта была переведена в режим read-only, потому что иных возможностей сократить поверхность атаки не существовало.
Какое-то время мы хотели все-таки сохранить Movable Type, но практика показала, что ничего хорошего из этого не получится. По актуальным версиям нет не то, что русскоязычной, но и даже англоязычной информации. Сетки тоже не в курсе.
В итоге осенью прошлого года мы затеяли большой переезд, радикально изменив структуру проекта. Теперь за сайт будет отвечать генератор статических страниц HUGO, а сам сайт будет полностью укладываться в парадигму «сайт как код».
Как исходники, так и готовый результат будет храниться в Git и автоматически разворачиваться на хостинг. А ломать там будет принципиально нечего.
Технически структура развернута в Docker на базе Angie и Traefik, а это все тоже набор текстовых файлов, которые легко хранить и можно быстро развернуть где угодно.
Технически новый сайт будет поддерживать все современные технологии: HTTP/3, форматы изображений AVIF и WebP, сжатие zstd и brotli.
По дизайну мы постарались сохранить преемственность, но в тоже время сделать его современным, быстрым и адаптивным. Для любителей будет даже темная тема, но полноценно ей мы заниматься не будем, разве что когда-нибудь потом.
Поэтому она поставляется как есть, те же картинки за всю историю переделать не так просто, чтобы убрать белый фон и добавить прозрачность.
Тут и так могут спросить: а что вы там все эти полгода делали? А делали мы полуручной перенос контента.
Для сайта с 16-летней историей практически невозможно написать нормальный скрипт конвертации, так как сам движок не раз менял подходы к верстке, а еще были и ручные правки.
Нет, быстро переконвертировать можно и забить на огрехи, мол потом поправим, но это не наш метод. Поэтому практически весь материал был проверен вручную. По-быстрому, но тем не менее.
Поэтому косяки будут, но не в том масштабе, в котором могли быть. Сегодня с переносом контента мы закончили и теперь осталось отстроить систему сборки и развертывания.
Поэтому в ближайшие несколько дней новый сайт будет опубликован, а вместе с ним будем публиковать целую пачку материалов, которая лежала в черновиках и изначально версталась под новый сайт.
Последнее время многие нас спрашивают про сайт, будет ли он продолжать свое развитие или нет. Вопрос не праздный, потому как формат заметок в Телеграм не позволяет глубоко раскрыть многие темы (ограничение в 4000 символов).
Дополним это тем, что заметка в Телеграм, по сути, одноразовая. Поиск тут так себе, а ленту сильно вверх никто не листает. Поэтому публикация развернутых инструкций и подробных статей возможна только на сайте.
Старый сайт был создан на движке Movable Type 6.2, это довольно интересная CMS, которая генерировала статическое содержимое и наш сайт с самого его основания фактически являлся статическим.
Но сам движок все равно присутствовал на сайте и брал на себя ряд служебных функций: поиск, обработку тегов, пагинацию.
Сам движок тоже пошел сложным путем, сначала разработчики убрали Community-версию, потом и вовсе продали проект японцам, и поддержка продукта стала очень затруднительной.
В текущем виде Movable Type 6.2 – дырявое решето, которое не сломает только ленивый, поэтому большая часть сайта была переведена в режим read-only, потому что иных возможностей сократить поверхность атаки не существовало.
Какое-то время мы хотели все-таки сохранить Movable Type, но практика показала, что ничего хорошего из этого не получится. По актуальным версиям нет не то, что русскоязычной, но и даже англоязычной информации. Сетки тоже не в курсе.
В итоге осенью прошлого года мы затеяли большой переезд, радикально изменив структуру проекта. Теперь за сайт будет отвечать генератор статических страниц HUGO, а сам сайт будет полностью укладываться в парадигму «сайт как код».
Как исходники, так и готовый результат будет храниться в Git и автоматически разворачиваться на хостинг. А ломать там будет принципиально нечего.
Технически структура развернута в Docker на базе Angie и Traefik, а это все тоже набор текстовых файлов, которые легко хранить и можно быстро развернуть где угодно.
Технически новый сайт будет поддерживать все современные технологии: HTTP/3, форматы изображений AVIF и WebP, сжатие zstd и brotli.
По дизайну мы постарались сохранить преемственность, но в тоже время сделать его современным, быстрым и адаптивным. Для любителей будет даже темная тема, но полноценно ей мы заниматься не будем, разве что когда-нибудь потом.
Поэтому она поставляется как есть, те же картинки за всю историю переделать не так просто, чтобы убрать белый фон и добавить прозрачность.
Тут и так могут спросить: а что вы там все эти полгода делали? А делали мы полуручной перенос контента.
Для сайта с 16-летней историей практически невозможно написать нормальный скрипт конвертации, так как сам движок не раз менял подходы к верстке, а еще были и ручные правки.
Нет, быстро переконвертировать можно и забить на огрехи, мол потом поправим, но это не наш метод. Поэтому практически весь материал был проверен вручную. По-быстрому, но тем не менее.
Поэтому косяки будут, но не в том масштабе, в котором могли быть. Сегодня с переносом контента мы закончили и теперь осталось отстроить систему сборки и развертывания.
Поэтому в ближайшие несколько дней новый сайт будет опубликован, а вместе с ним будем публиковать целую пачку материалов, которая лежала в черновиках и изначально версталась под новый сайт.
🔥81👍30❤10🙏4⚡1
Особенности ротации логов приложений в Docker
В комментариях задали вопрос: как настроить ротацию логов приложения в Docker, в частности вопрос касался веб-сервера Angie.
При этом следует понимать, что речь идет не о логах самого Docker, а именно о логах приложения, работающего в контейнере. И несмотря на то, что в данной заметке речь идет об Angie/NGINX данный подход применим к любым приложениям пишущим собственные логи.
Если мы посмотрим в типовую конфигурацию виртуального хоста Angie/NGINX, то увидим там примерно следующее:
Если ничего больше не делать, то логи будут неконтролируемо расти внутри контейнера, но при его перезапуске окажутся утеряны. И то и другое является нежелательным, поэтому будем исправлять ситуацию.
Прежде всего вынесем логи на хост, поэтому смонтируем дополнительный Volume, для этого в compose-файл добавьте:
Теперь, после перезапуска все логи будут в
Для их ротации воспользуемся системной службой logrotate, для этого в
Где angie-mysite в команде docker exec – имя контейнера, убедитесь, что в вашем compose-файле есть опция:
А в остальном это стандартная конфигурация logrotate, мы делаем ротацию каждый день, храним 14 архивов, все архивы, кроме предпоследнего сжимаем.
После выполнения ротации мы дополнительно посылаем серверу Angie команду reopen на переоткрытие файлов лога.
Проверить работу конфигурации можно командой:
Которая ничего не делает, но только имитирует команду ротации, таким образом вы проверите конфигурационный файл на предмет ошибок и убедитесь, что все указано верно.
В комментариях задали вопрос: как настроить ротацию логов приложения в Docker, в частности вопрос касался веб-сервера Angie.
При этом следует понимать, что речь идет не о логах самого Docker, а именно о логах приложения, работающего в контейнере. И несмотря на то, что в данной заметке речь идет об Angie/NGINX данный подход применим к любым приложениям пишущим собственные логи.
Если мы посмотрим в типовую конфигурацию виртуального хоста Angie/NGINX, то увидим там примерно следующее:
access_log /var/log/angie/my_site.access.log;
error_log /var/log/angie/my_site.error.log;
Если ничего больше не делать, то логи будут неконтролируемо расти внутри контейнера, но при его перезапуске окажутся утеряны. И то и другое является нежелательным, поэтому будем исправлять ситуацию.
Прежде всего вынесем логи на хост, поэтому смонтируем дополнительный Volume, для этого в compose-файл добавьте:
volumes:
- /opt/my_site /logs:/var/log/angie
Теперь, после перезапуска все логи будут в
/opt/my_site /logs и при перезапуске контейнера не будут потеряны. Для их ротации воспользуемся системной службой logrotate, для этого в
/etc/logrotate.d/ создадим дополнительный файл настроек для нашей службы, например angie-mysite и внесем в него следующий текст:/opt/my_site/logs/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0644 root root
sharedscripts
postrotate
docker exec angie-mysite angie -s reopen
endscript
}Где angie-mysite в команде docker exec – имя контейнера, убедитесь, что в вашем compose-файле есть опция:
container_name: angie-mysite
А в остальном это стандартная конфигурация logrotate, мы делаем ротацию каждый день, храним 14 архивов, все архивы, кроме предпоследнего сжимаем.
После выполнения ротации мы дополнительно посылаем серверу Angie команду reopen на переоткрытие файлов лога.
Проверить работу конфигурации можно командой:
logrotate -d /etc/logrotate.d/angie-mysite
Которая ничего не делает, но только имитирует команду ротации, таким образом вы проверите конфигурационный файл на предмет ошибок и убедитесь, что все указано верно.
👍16🤝3🤷♂1❤1
💈Релиз нового сайта! 💈
Сегодня, в пятницу 17 апреля 2026 года мы наконец то выпустили релиз нового сайта. Заходим, смотрим, обживаемся.
Весь контент перенесен, тема адаптирована к уже привычной, цвета и стили по возможности сохранены.
Со стилями еще придется поработать, особенно в области читабельности врезок с кодом и т.д.
Есть темная тема, но она – как есть, специально ей заниматься времени и особого желания нет, так как нужно обрезать белый фон с кучи картинок в заголовках статей.
Материал весь вычитан руками, но вычитан «по диагонали», на предмет цепляющих глаз косяков, поэтому косяки помельче обязательно будут, будем вылавливать и исправлять.
Таксономия будет серьезно переработана, ибо в нынешнем виде она неудобна и некоторые категории сильно перегружены.
Добавлена новая таксономия серии – для более удобного объединения материалов в группы, пока полноценно сделана серия по iptables, можете посмотреть.
Теги – как были, так и останутся, к ним особых вопросов нет.
Все старые ссылки перелинкованы, так что ничего не потеряется если вы будете переходить из внешних источников или закладок.
Все тяжелые файлы вынесены на CDN, нечего им на самом сайте делать, ссылки на скачивание перелинкованы.
Форум убран за ненадобностью, нет и не будет. Такой формат сегодня популярностью не пользуется.
Система комментариев тоже собственная, пока пустая, но будет импортирован весь архив с Disqus, так что ничего не потеряется.
Вход возможен через Яндекс, Google и GitHub, через телегу не войдете, так как заблокированы сервера API.
В целом на этом все, ждем обратной связи.
✅ https://interface31.ru
Сегодня, в пятницу 17 апреля 2026 года мы наконец то выпустили релиз нового сайта. Заходим, смотрим, обживаемся.
Весь контент перенесен, тема адаптирована к уже привычной, цвета и стили по возможности сохранены.
Со стилями еще придется поработать, особенно в области читабельности врезок с кодом и т.д.
Есть темная тема, но она – как есть, специально ей заниматься времени и особого желания нет, так как нужно обрезать белый фон с кучи картинок в заголовках статей.
Материал весь вычитан руками, но вычитан «по диагонали», на предмет цепляющих глаз косяков, поэтому косяки помельче обязательно будут, будем вылавливать и исправлять.
Таксономия будет серьезно переработана, ибо в нынешнем виде она неудобна и некоторые категории сильно перегружены.
Добавлена новая таксономия серии – для более удобного объединения материалов в группы, пока полноценно сделана серия по iptables, можете посмотреть.
Теги – как были, так и останутся, к ним особых вопросов нет.
Все старые ссылки перелинкованы, так что ничего не потеряется если вы будете переходить из внешних источников или закладок.
Все тяжелые файлы вынесены на CDN, нечего им на самом сайте делать, ссылки на скачивание перелинкованы.
Форум убран за ненадобностью, нет и не будет. Такой формат сегодня популярностью не пользуется.
Система комментариев тоже собственная, пока пустая, но будет импортирован весь архив с Disqus, так что ничего не потеряется.
Вход возможен через Яндекс, Google и GitHub, через телегу не войдете, так как заблокированы сервера API.
В целом на этом все, ждем обратной связи.
✅ https://interface31.ru
🔥48👍31⚡6❤6🤮1
Microsoft переделывает «Пуск» с нуля
Такая вот новость появилась вчера в зарубежных, а теперь уже и наших источниках, немного процитирую:
Ничего не напоминает? Прошлый раз столь же большая переработка пользовательского интерфейса в Windows 10 неожиданно вылилась в новую ОС Windows 11, теперь же, по слухам, нас ждет скорый выпуск Windows 12.
И данная новость косвенно на это указывает, новый дизайн пользовательского интерфейса – новая ОС.
Главное, чтобы Microsoft учла собственные ошибки и сделала их них правильные выводы. Интерфейс Windows 11 местами не так уж и плох, многое сделано правильно и хорошо, но все это было перечеркнуто новым, неудачным, меню Пуск.
Да, его немного привели в чувство в более новых релизах, но оно как было деревянным, так и осталось.
Судя по всему, кардинальные изменения нам не грозят:
Но как раз этого и не нужно, потому что ни к чему хорошему это не приводит, лучше последовательно развивать что есть, взяв лучшие стороны из разных решений. Но, как говорится, поживем – увидим.
А пока можно окунуться в прошлое и познакомиться с историей меню Пуск от его возникновения до наших дней:
✅ История кнопки и меню "Пуск"
✅ История кнопки и меню "Пуск". Продолжение
Такая вот новость появилась вчера в зарубежных, а теперь уже и наших источниках, немного процитирую:
Microsoft работает над крупным обновлением меню «Пуск» в Windows 11, которое призвано предоставить пользователям больше контроля над его внешним видом. По словам осведомлённых источников, эти улучшения разрабатываются в рамках нового дизайна пользовательского интерфейса WinUI 3, разработку которого компания уже подтвердила.
Ничего не напоминает? Прошлый раз столь же большая переработка пользовательского интерфейса в Windows 10 неожиданно вылилась в новую ОС Windows 11, теперь же, по слухам, нас ждет скорый выпуск Windows 12.
И данная новость косвенно на это указывает, новый дизайн пользовательского интерфейса – новая ОС.
Главное, чтобы Microsoft учла собственные ошибки и сделала их них правильные выводы. Интерфейс Windows 11 местами не так уж и плох, многое сделано правильно и хорошо, но все это было перечеркнуто новым, неудачным, меню Пуск.
Да, его немного привели в чувство в более новых релизах, но оно как было деревянным, так и осталось.
Судя по всему, кардинальные изменения нам не грозят:
По имеющимся данным, новое меню «Пуск» будет похоже на существующее, но получит более продвинутые возможности настройки, которые можно будет изменить в приложении «Параметры Windows». Добавятся параметры включения или отключения определённых разделов, а также возможность вручную выбирать между маленьким и большим макетом меню «Пуск».
Но как раз этого и не нужно, потому что ни к чему хорошему это не приводит, лучше последовательно развивать что есть, взяв лучшие стороны из разных решений. Но, как говорится, поживем – увидим.
А пока можно окунуться в прошлое и познакомиться с историей меню Пуск от его возникновения до наших дней:
✅ История кнопки и меню "Пуск"
✅ История кнопки и меню "Пуск". Продолжение
🤮3👍1