Code with Cyrmax pinned «У канала теперь включены сообщения, и каждый желающий может предложить интересную задачу (с решением или без), задать вопрос или накинуть идей для следующих постов. Для этого можно использовать кнопку "сообщения каналу" в левом нижнем углу экрана на телефонах…»
Хочу порекомендовать вам канал возможно уже знакомого вам человека с никнеймом M_maker (или же m1maker на GitHub).
Жора пишет на "мощных плюсах", имеет в своём портфолио полноценный легковесный рекордер аудио для Windows, кросс-платформенную библиотеку, по всем параметрам перекрывающую устаревший Tolk... Да блин, он даже свой игровой движок написал!
И всё это при том, что ему только исполнилось 16.
Короче, он крут, нереально крут, и я крайне рекомендую вам на него подписаться!
У него так-то есть и другие каналы, но было бы странно в блоге про код рекламировать что-то кроме кода.
https://t.me/mmakecode
Жора пишет на "мощных плюсах", имеет в своём портфолио полноценный легковесный рекордер аудио для Windows, кросс-платформенную библиотеку, по всем параметрам перекрывающую устаревший Tolk... Да блин, он даже свой игровой движок написал!
И всё это при том, что ему только исполнилось 16.
Короче, он крут, нереально крут, и я крайне рекомендую вам на него подписаться!
У него так-то есть и другие каналы, но было бы странно в блоге про код рекламировать что-то кроме кода.
https://t.me/mmakecode
Telegram
M_maker's code
Блог Георгия Бондаренко о разработке ПО.
Смотрите также @mmakesoft
Смотрите также @mmakesoft
Forwarded from Кодерская мастерская
Мне приснилась Джанга для девопсов:
2 или более участников логинятся на сервак, и по очереди выбивают процессы, кто уронил систему, тот проиграл.
Теперь мне непонятно одно: я это где-то прочитал и забыл, или на самом деле подсознание с нуля сгенерировало?..
2 или более участников логинятся на сервак, и по очереди выбивают процессы, кто уронил систему, тот проиграл.
Теперь мне непонятно одно: я это где-то прочитал и забыл, или на самом деле подсознание с нуля сгенерировало?..
🔥1😁1
#soft #сделал_сам
Speak Instead of Me - небольшая програмка, позволяющая "разговаривать" любым синтезатором речи в любое звуковое устройство.
Полезно для тех, кто хочет выключить микрофон во время онлайн-общения, но при этом не заставлять собеседников читать текстовые сообщения в канале.
Программа использует голоса SAPI, установленные в системе.
С некоторыми синтезаторами речи наблюдаются проблемы. В частности NVDA SAPI и венгерский Profivox либо просто молчат, либо выводят речь на основное устройство и игнорируют настройки в интерфейсе, либо вообще заставляют программу упасть.
Исправить это на моей стороне невозможно. В будущем я буду отфильтровывать из списка те синтезаторы, которые гарантированно не работают с программой.
Ознакомиться с исходным кодом и скачать программу можно в GitHub-репозитории.
https://github.com/cyrmax/sim
В будущем я попробую перенести репозиторий на российскую платформу Git Verse, если на ней также доступны виртуальные машины для автоматической сборки релизов.
Speak Instead of Me - небольшая програмка, позволяющая "разговаривать" любым синтезатором речи в любое звуковое устройство.
Полезно для тех, кто хочет выключить микрофон во время онлайн-общения, но при этом не заставлять собеседников читать текстовые сообщения в канале.
Программа использует голоса SAPI, установленные в системе.
С некоторыми синтезаторами речи наблюдаются проблемы. В частности NVDA SAPI и венгерский Profivox либо просто молчат, либо выводят речь на основное устройство и игнорируют настройки в интерфейсе, либо вообще заставляют программу упасть.
Исправить это на моей стороне невозможно. В будущем я буду отфильтровывать из списка те синтезаторы, которые гарантированно не работают с программой.
Ознакомиться с исходным кодом и скачать программу можно в GitHub-репозитории.
https://github.com/cyrmax/sim
В будущем я попробую перенести репозиторий на российскую платформу Git Verse, если на ней также доступны виртуальные машины для автоматической сборки релизов.
GitHub
GitHub - cyrmax/sim: A small program which allows to speak any written text with TTS and send the audio to any audio device. Written…
A small program which allows to speak any written text with TTS and send the audio to any audio device. Written in C++ with WX Widgets. - cyrmax/sim
#Программирование #Cpp
Когда-то я долгое время писал на Swift, а в этом языке вообще достаточно много "сахара", упрощающего код и прикрывающего жопу программисту.
Чего только стоит так называемый guard statement, который позволяет проверять любые условия, не плодя уровни вложенности и не заставляя морочиться с областями видимости.
Но сейчас не об этом.
Был в Swift такой механизм как defer. Да да, это то же самое, что, возможно, знакомо многим из языка Go.
Ключевое слово !defer позволяет отложить выполнение некоторого блока кода до тех пор, пока вызывающая функция не завершится.
Например, вот такой код считается единственно верным в Go:
То есть мы открываем файл, сразу же сообщаем, что его нужно закрыть при выходе из функции, а уже далее делаем с ним что-то. И файл закроется; выйдем мы из функции нормальным образом или бросим ошибку... Вроде бы даже при panic код в defer кажется выполнится.
В языке C++ ключевого слова defer нет. А вот постоянная потребность освобождать ресурсы - имеется.
А ещё имеется принцип RAII (Resource Acquisition is Initialization) и автоматический вызов деструктора объекта класса при выходе из области видимости.
Поэтому, после нескольких дней работы с Windows API, где постоянно нужно закрывать открытые ранее ресурсы (файлы, ключи реестра и т д) я написал маленький кусочек кода, который теперь радостно перетаскиваю из проекта в проект.
Лежит у меня всё это в defer.hpp.
А пользоваться - вот так:
Таким образом, если ключ реестра был открыт успешно, то что бы ни произошло в коде ниже, ключ будет закрыт. Вернём мы результат, выбросим исключение... Всё равно вызовется деструктор нашего класса ScopeGuard, завёрнутого в макрос defer, и вызовется функция, переданная в качестве аргумента в defer.
Понятно, что здесь поведение не идентично тому, что обеспечивает встроенное ключевое слово defer в Swift и Go, но базовую идею автоматической очистки за собой конструкция реализует.
Когда-то я долгое время писал на Swift, а в этом языке вообще достаточно много "сахара", упрощающего код и прикрывающего жопу программисту.
Чего только стоит так называемый guard statement, который позволяет проверять любые условия, не плодя уровни вложенности и не заставляя морочиться с областями видимости.
Но сейчас не об этом.
Был в Swift такой механизм как defer. Да да, это то же самое, что, возможно, знакомо многим из языка Go.
Ключевое слово !defer позволяет отложить выполнение некоторого блока кода до тех пор, пока вызывающая функция не завершится.
Например, вот такой код считается единственно верным в Go:
func main() {
file, _ := os.Open("myfile.txt")
defer file.Close()
// Do something with opened file
}
То есть мы открываем файл, сразу же сообщаем, что его нужно закрыть при выходе из функции, а уже далее делаем с ним что-то. И файл закроется; выйдем мы из функции нормальным образом или бросим ошибку... Вроде бы даже при panic код в defer кажется выполнится.
В языке C++ ключевого слова defer нет. А вот постоянная потребность освобождать ресурсы - имеется.
А ещё имеется принцип RAII (Resource Acquisition is Initialization) и автоматический вызов деструктора объекта класса при выходе из области видимости.
Поэтому, после нескольких дней работы с Windows API, где постоянно нужно закрывать открытые ранее ресурсы (файлы, ключи реестра и т д) я написал маленький кусочек кода, который теперь радостно перетаскиваю из проекта в проект.
#pragma once
#include <concepts>
#include <functional>
template <std::invocable Func> class ScopeGuard {
public:
explicit ScopeGuard(Func func) noexcept : m_function(std::move(func)) {}
~ScopeGuard() {
m_function();
}
ScopeGuard(const ScopeGuard&) = delete;
ScopeGuard& operator=(const ScopeGuard&) = delete;
ScopeGuard(ScopeGuard&&) = delete;
ScopeGuard& operator=(ScopeGuard&&) = delete;
private:
Func m_function;
};
#define DEFER_CONCAT_IMPL_(x, y) x##y
#define DEFER_CONCAT_(x, y) DEFER_CONCAT_IMPL_(x, y)
#define defer(code) auto DEFER_CONCAT_(defer_object_, __LINE__) = ScopeGuard([&]() { code; })
Лежит у меня всё это в defer.hpp.
А пользоваться - вот так:
#include <windows.h>
#include "defer.hpp"
// Some code before
HKEY hKey;
if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, regPath.c_str(), 0, KEY_READ, &hKey) != ERROR_SUCCESS) {
return std::nullopt;
}
defer(RegCloseKey(hKey));
// Some code after
Таким образом, если ключ реестра был открыт успешно, то что бы ни произошло в коде ниже, ключ будет закрыт. Вернём мы результат, выбросим исключение... Всё равно вызовется деструктор нашего класса ScopeGuard, завёрнутого в макрос defer, и вызовется функция, переданная в качестве аргумента в defer.
Понятно, что здесь поведение не идентично тому, что обеспечивает встроенное ключевое слово defer в Swift и Go, но базовую идею автоматической очистки за собой конструкция реализует.
#Программирование #Ассемблер
Я тут внезапно увлёкся совсем низкоуровневым программированием (для микроконтроллеров и прочего подобного).
Паять вслепую - это больно (в прямом смысле этого слова), поэтому на помощь приходят всяческие эмуляторы, симуляторы и интерпретаторы.
Сразу оговорюсь, что это увлечение - скорее тренировка для мозга, развитие общего понимания работы компьютера на самом низком уровне. Для работы эти навыки в 99% случаев вам не понадобятся (ну мне так кажется).
И вот вопрос: было бы вам, моим читателям, интересно погрузиться немножко в ассемблер?
В опросе ниже или в комментариях можно оставить своё мнение.
Если заинтересованных наберётся достаточно много, я накидаю в канал информации, а когда-нибудь может и маленький сайт с базой знаний и программ сделаю.
Если что, мне и просто так не трудно ответить на ваши вопросы под этим постом. Так что спрашивайте.
Но опять же, всё, что я пока что пишу, гораздо проще реализовать на C или C++, а для большинства современных микроконтроллеров есть и среды под Lua, и нашумевший MicroPython, и даже отдельные скриптовые языки для интернета вещей, подключения датчиков и прочих полезностей.
Я тут внезапно увлёкся совсем низкоуровневым программированием (для микроконтроллеров и прочего подобного).
Паять вслепую - это больно (в прямом смысле этого слова), поэтому на помощь приходят всяческие эмуляторы, симуляторы и интерпретаторы.
Сразу оговорюсь, что это увлечение - скорее тренировка для мозга, развитие общего понимания работы компьютера на самом низком уровне. Для работы эти навыки в 99% случаев вам не понадобятся (ну мне так кажется).
И вот вопрос: было бы вам, моим читателям, интересно погрузиться немножко в ассемблер?
В опросе ниже или в комментариях можно оставить своё мнение.
Если заинтересованных наберётся достаточно много, я накидаю в канал информации, а когда-нибудь может и маленький сайт с базой знаний и программ сделаю.
Если что, мне и просто так не трудно ответить на ваши вопросы под этим постом. Так что спрашивайте.
Но опять же, всё, что я пока что пишу, гораздо проще реализовать на C или C++, а для большинства современных микроконтроллеров есть и среды под Lua, и нашумевший MicroPython, и даже отдельные скриптовые языки для интернета вещей, подключения датчиков и прочих полезностей.
Code with Cyrmax
Интересно ли погрузиться в ассемблер?
Отлично! Все, кто хотел, наверное уже ответили. Всё же желающих приобщиться гораздо больше, а значит с понедельника я начну выкладывать материал по программированию на самом низком уровне.
Расскажу немножко об основных понятиях, поделюсь полезным софтом и скриптами, буду рассказывать о том, как можно упростить себе жизнь при разработке и отладке вслепую (когда не посмотришь на мигающую лампочку в симуляторе или визуальное отображение памяти на экране).
А ещё я тут взялся писать свою маленькую операционную систему. По мере того, как её части будут протестированы на надёжность и предсказуемость, я и ими тоже буду делиться, конечно же с подробными разборами происходящего.
Хотя, "операционная система" - это громко сказано, но всё же нечто, что имеет командную оболочку, умеет запускать внутри себя другие программы и обеспечивать их некоторым количеством системных вызовов, имеет право называться именно так.
Но пока что я не продвинулся дальше примитивов работы с памятью, так что до результата ещё далеко.
Расскажу немножко об основных понятиях, поделюсь полезным софтом и скриптами, буду рассказывать о том, как можно упростить себе жизнь при разработке и отладке вслепую (когда не посмотришь на мигающую лампочку в симуляторе или визуальное отображение памяти на экране).
А ещё я тут взялся писать свою маленькую операционную систему. По мере того, как её части будут протестированы на надёжность и предсказуемость, я и ими тоже буду делиться, конечно же с подробными разборами происходящего.
Хотя, "операционная система" - это громко сказано, но всё же нечто, что имеет командную оболочку, умеет запускать внутри себя другие программы и обеспечивать их некоторым количеством системных вызовов, имеет право называться именно так.
Но пока что я не продвинулся дальше примитивов работы с памятью, так что до результата ещё далеко.
👍1🔥1
#Программирование #Ассемблер
Пост 0x00
Итак, ассемблер. Начнём.
Но для начала стоит оговориться, что вообще-то вот этот язык, а вернее семейство языков, называется "язык ассемблера", а ассемблер - это сам софт для перегонки человекочитаемых инструкций в машинные инструкции.
Но я всю жизнь говорил "программировать на ассемблере" и "учить ассемблер", так что продолжу использовать именно такое понятие.
Почему я сказал "семейство языков"? Потому что кросс-платформенностью в ассемблере даже и не пахнет.
По сути для каждой архитектуры есть свой ассемблер, и их вариантов как минимум так же много, как существующих архитектур процессоров.
При этом иногда один ассемблер может являться частью другого, так как, допустим, современные процессоры с архитектурой amd64 вполне себе поддерживают и набор инструкций от intel 86, да и вроде как даже в 16-битном режиме реальных адресов могут работать.
Но в целом у каждой архитектуры свой набор инструкций, а значит и ассемблер будет свой.
И тут мы плавно подбираемся к пониманию того, что такое вообще программа на ассемблере.
По сути это набор машинных инструкций в удобной для чтения форме.
Без ассемблера было бы вот так:
Это машинные инструкции для процессора на архитектуре Risc-V.
А вот так выглядит исходный код этой же программы:
Я понимаю, что многим и это кажется непонятным набором символов.
Но, согласитесь, это уже как-то можно разбирать на составляющие и пытаться понимать?
Вот в этом и суть ассемблера.
По сути это возможность "поговорить" с процессором почти на его языке, при этом не захлёбываясь в бесконечном потоке цифр.
В остальном же, на этом уровне нет никаких абстракций, никаких упрощений. Только определённый набор простых действий (инструкций процессора), набор регистров (ячеек для чисел в процессоре) и доступ к сырым данным в оперативной памяти по любым адресам.
И вот с этим всем мы и будем разбираться в серии из нескольких постов.
Пост 0x00
Итак, ассемблер. Начнём.
Но для начала стоит оговориться, что вообще-то вот этот язык, а вернее семейство языков, называется "язык ассемблера", а ассемблер - это сам софт для перегонки человекочитаемых инструкций в машинные инструкции.
Но я всю жизнь говорил "программировать на ассемблере" и "учить ассемблер", так что продолжу использовать именно такое понятие.
Почему я сказал "семейство языков"? Потому что кросс-платформенностью в ассемблере даже и не пахнет.
По сути для каждой архитектуры есть свой ассемблер, и их вариантов как минимум так же много, как существующих архитектур процессоров.
При этом иногда один ассемблер может являться частью другого, так как, допустим, современные процессоры с архитектурой amd64 вполне себе поддерживают и набор инструкций от intel 86, да и вроде как даже в 16-битном режиме реальных адресов могут работать.
Но в целом у каждой архитектуры свой набор инструкций, а значит и ассемблер будет свой.
И тут мы плавно подбираемся к пониманию того, что такое вообще программа на ассемблере.
По сути это набор машинных инструкций в удобной для чтения форме.
Без ассемблера было бы вот так:
// Секция исполняемого кода
00500893
00010517
ffc50513
00000073
00a00893
00000513
00000073
// Секция статических данных
6c6c6548
7341206f
626d6573
0a72656c
Это машинные инструкции для процессора на архитектуре Risc-V.
А вот так выглядит исходный код этой же программы:
.global _start
.section .data
msg: .ascii "Hello Assembler\n"
.section .text
_start:
li a7, 5
la a0, msg
ecall
li a7, 10
li a0, 0
ecall
Я понимаю, что многим и это кажется непонятным набором символов.
Но, согласитесь, это уже как-то можно разбирать на составляющие и пытаться понимать?
Вот в этом и суть ассемблера.
По сути это возможность "поговорить" с процессором почти на его языке, при этом не захлёбываясь в бесконечном потоке цифр.
В остальном же, на этом уровне нет никаких абстракций, никаких упрощений. Только определённый набор простых действий (инструкций процессора), набор регистров (ячеек для чисел в процессоре) и доступ к сырым данным в оперативной памяти по любым адресам.
И вот с этим всем мы и будем разбираться в серии из нескольких постов.
👍3🔥2
#Программирование #Go
Я, кажется, наконец-таки понял, почему часто разработчики выбирают написать свою реализацию вместо использования готовых библиотек.
Я сейчас разрабатываю Telegram-бота на Golang.
При старте разработки я выбрал библиотеку telebot, чтобы сэкономить себе время и силы.
Ну, там же есть уже готовые хендлеры для команд, для типов контента, есть готовая система middleware...
Проходит несколько дней, и я понимаю, что, скорее всего, либо перейду на другую библиотеку, которая даёт больше контроля, либо вообще откажусь от внешних зависимостей и использую старый добрый http в чистом виде.
Почему?
Всё просто: в Go есть фундаментальная концепция контекста. В каждую функцию, которая потенциально выполняется долго, совершает какие-то сетевые запросы, передаётся объект контекста в различных его вариациях: контекст с таймаутом, с ручной отменой, с дедлайном.
Причём каждый новый слой может навешивать на переданный контекст новые обёртки, ужесточая условия отмены (но не упрощая их).
Например, в начале работы программы мы создаём контекст с функцией ручной отмены и подвешиваем вызов этой самой отмены на SIGINT и SIGTERM.
Далее, выполняя сетевой запрос, мы на этот контекст навешиваем таймаут в 15 секунд.
Внутри функции сетевого запроса нам нужно обратиться к базе данных: мы навешиваем на контекст ещё один таймаут, уже на 5 секунд.
В итоге, локально для запросов отработают их локальные контексты, но при этом из самого начала программы мы можем "дёрнуть за верёвочку" и отменить абсолютно всё, с этими контекстами связанное.
Так вот, telebot абсолютно игнорирует концепцию контекстов, из-за чего приходится костылить какие-то параллельные мониторы, которые будут реагировать на контекст и вызывать синхронные функции остановки бота.
В общем, библиотека может и хорошая, но подходит только для того, чтобы быстренько нашлёпать несложного бота без грамотной конкурентной модели.
Я, кажется, наконец-таки понял, почему часто разработчики выбирают написать свою реализацию вместо использования готовых библиотек.
Я сейчас разрабатываю Telegram-бота на Golang.
При старте разработки я выбрал библиотеку telebot, чтобы сэкономить себе время и силы.
Ну, там же есть уже готовые хендлеры для команд, для типов контента, есть готовая система middleware...
Проходит несколько дней, и я понимаю, что, скорее всего, либо перейду на другую библиотеку, которая даёт больше контроля, либо вообще откажусь от внешних зависимостей и использую старый добрый http в чистом виде.
Почему?
Всё просто: в Go есть фундаментальная концепция контекста. В каждую функцию, которая потенциально выполняется долго, совершает какие-то сетевые запросы, передаётся объект контекста в различных его вариациях: контекст с таймаутом, с ручной отменой, с дедлайном.
Причём каждый новый слой может навешивать на переданный контекст новые обёртки, ужесточая условия отмены (но не упрощая их).
Например, в начале работы программы мы создаём контекст с функцией ручной отмены и подвешиваем вызов этой самой отмены на SIGINT и SIGTERM.
Далее, выполняя сетевой запрос, мы на этот контекст навешиваем таймаут в 15 секунд.
Внутри функции сетевого запроса нам нужно обратиться к базе данных: мы навешиваем на контекст ещё один таймаут, уже на 5 секунд.
В итоге, локально для запросов отработают их локальные контексты, но при этом из самого начала программы мы можем "дёрнуть за верёвочку" и отменить абсолютно всё, с этими контекстами связанное.
Так вот, telebot абсолютно игнорирует концепцию контекстов, из-за чего приходится костылить какие-то параллельные мониторы, которые будут реагировать на контекст и вызывать синхронные функции остановки бота.
В общем, библиотека может и хорошая, но подходит только для того, чтобы быстренько нашлёпать несложного бота без грамотной конкурентной модели.
🔥1
Новый Год совсем близко, а значит настало время подвести околоайтишные итоги уходящего периода обращения Земли вокруг Солнца.
В этом году все достижения у меня случились ближе к осени и зиме; остальную часть года ничем особым отметить не могу.
Я наконец-таки созрел для использования Ansible и уже радостно применяю его на практике.
Ещё я приобрёл очередной микроконтроллер, на этот раз M5stack Cardputer Adv, и снова погружаюсь в премудрости разработки для подобных устройств.
Также, я в принципе заинтересовался программированием на низком уровне и активно изучаю язык ассемблера для нескольких архитектур. Практической пользы это занятие может и не несёт, но уж точно позволяет понимать, как работают написанные мной программы на языках по типу C++, Go и Rust.
А ещё, готовясь к собеседованиям и разрабатывая парочку домашних проектов, я здорово прокачался в знаниях языка Go, его внутренних особенностей и нюансов поведения рантайма.
И вот это уже безумно полезно, так как, обладая такой информацией, можно вполне себе не напрягаясь оптимизировать свой код, часто даже не ухудшая его читаемость.
И кстати, я кажется стал совсем взрослым в программировании. Возможно даже постарел.
Дело в том, что недавно я скачал исходники самого языка Go и теперь долгими зимними вечерами их изучаю.
Тут должна была бы быть какая-то крутая цитата одного из создателей языка, но я решил потратить это место в памяти на стандартную библиотеку, а не на заучивание высказываний.
Поэтому просто скажу, что внутри самой стандартной библиотеки Go есть чему поучиться: много интересных решений, крутых практик и элегантных подходов, которые можно было бы назвать хаками, если бы они не были так красивы.
В общем, насколько непродуктивной в плане саморазвития была первая половина 2025 года, настолько же продвинула меня вперёд вторая.
Это яркий пример того, каким серьёзным мотиватором к саморазвитию может стать риск остаться без стабильного дохода. :D
Всех поздравляю с наступающим новым годом!
В этом году все достижения у меня случились ближе к осени и зиме; остальную часть года ничем особым отметить не могу.
Я наконец-таки созрел для использования Ansible и уже радостно применяю его на практике.
Ещё я приобрёл очередной микроконтроллер, на этот раз M5stack Cardputer Adv, и снова погружаюсь в премудрости разработки для подобных устройств.
Также, я в принципе заинтересовался программированием на низком уровне и активно изучаю язык ассемблера для нескольких архитектур. Практической пользы это занятие может и не несёт, но уж точно позволяет понимать, как работают написанные мной программы на языках по типу C++, Go и Rust.
А ещё, готовясь к собеседованиям и разрабатывая парочку домашних проектов, я здорово прокачался в знаниях языка Go, его внутренних особенностей и нюансов поведения рантайма.
И вот это уже безумно полезно, так как, обладая такой информацией, можно вполне себе не напрягаясь оптимизировать свой код, часто даже не ухудшая его читаемость.
И кстати, я кажется стал совсем взрослым в программировании. Возможно даже постарел.
Дело в том, что недавно я скачал исходники самого языка Go и теперь долгими зимними вечерами их изучаю.
Тут должна была бы быть какая-то крутая цитата одного из создателей языка, но я решил потратить это место в памяти на стандартную библиотеку, а не на заучивание высказываний.
Поэтому просто скажу, что внутри самой стандартной библиотеки Go есть чему поучиться: много интересных решений, крутых практик и элегантных подходов, которые можно было бы назвать хаками, если бы они не были так красивы.
В общем, насколько непродуктивной в плане саморазвития была первая половина 2025 года, настолько же продвинула меня вперёд вторая.
Это яркий пример того, каким серьёзным мотиватором к саморазвитию может стать риск остаться без стабильного дохода. :D
Всех поздравляю с наступающим новым годом!
👍1
#Администрирование #Windows #WSL
Сегодня выяснил, что у меня в системе жёсткий бардак с сетью: адаптер Bluetooth (просто потому, что его кто-то создал), штук 5 адаптеров от старых установок всяческих OpenVPN (для подключения к корпоративной сети), несколько зависших старых мостов от старых версий VMWare...
Из-за всего этого я не мог нормально завести режим Mirrored в wsl, чтобы трафик из wsl тоже шёл под vpn (для доступа к корпоративным ресурсам и для доступа к сервисам по типу Gemini и OpenAI).
Wsl просто отказывался запускаться в режиме Mirrored или VirtioProxy, сваливаясь в лучшем случае в NAT, в худшем - в None, оставляя виртуалку совсем без сети, даже локальной для общения с хостом.
Что именно мешало wsl жить, я не знаю. Выяснить конкретную проблему, конкретный затык не удалось.
Я до последнего убалтывал Gemini решить вопрос без радикальных шагов, ибо страшно было остаться совсем без интернета, но в итоге вот такой алгоритм действий помог.
1. Закрываем весь софт, который может сломаться от резкого исчезновения сети (vpn сервисы, браузер, TeamTalk и другие). В том числе останавливаем wsl командой
2. Полностью сбрасываем все сетевые адаптеры командой в Powershell от имени администратора
3. Тоже от имени администратора, можно в той же консоли, полностью сбрасываем весь сетевой стек. Тут две команды:
4. Тут же идём в ребут.
После ребута всё завелось какк часы: OpenVPN пересоздал себе новый адаптер при необходимости, sing-box тоже создаёт себе устройство при старте службы, wsl корректно настроился автоматически при первом запуске оболочки. VMWare ещё не проверял, так как он мне пока не нужен, но в крайнем случае переустановка программы однозначно поможет.
Также, поделюсь тут своим конфигом от Wsl, с которым у меня всё работает.
Ведёт оно себя следующим образом:
в правила sing-box для разделения трафика добавлено следующее: проксировать vpn.ifconfig.me.
В итоге видим следующее поведение под Wsl:
Доступ к заблокировавшимся от российских пользователей OpenAI и Claude тоже проходит без проблем как ис-под хоста, так и под wsl.
ps: Важно отметить, что у меня sing-box работает как чистое ядро, завёрнутое в WinSW для запуска в качестве службы Windows. Я не использую графические клиенты вроде Throne, Hiddify или Clash.
Будет ли всё это работать так же с ними - не знаю.
Сегодня выяснил, что у меня в системе жёсткий бардак с сетью: адаптер Bluetooth (просто потому, что его кто-то создал), штук 5 адаптеров от старых установок всяческих OpenVPN (для подключения к корпоративной сети), несколько зависших старых мостов от старых версий VMWare...
Из-за всего этого я не мог нормально завести режим Mirrored в wsl, чтобы трафик из wsl тоже шёл под vpn (для доступа к корпоративным ресурсам и для доступа к сервисам по типу Gemini и OpenAI).
Wsl просто отказывался запускаться в режиме Mirrored или VirtioProxy, сваливаясь в лучшем случае в NAT, в худшем - в None, оставляя виртуалку совсем без сети, даже локальной для общения с хостом.
Что именно мешало wsl жить, я не знаю. Выяснить конкретную проблему, конкретный затык не удалось.
Я до последнего убалтывал Gemini решить вопрос без радикальных шагов, ибо страшно было остаться совсем без интернета, но в итоге вот такой алгоритм действий помог.
1. Закрываем весь софт, который может сломаться от резкого исчезновения сети (vpn сервисы, браузер, TeamTalk и другие). В том числе останавливаем wsl командой
wsl --shutdown;2. Полностью сбрасываем все сетевые адаптеры командой в Powershell от имени администратора
netcfg -d. Команда может зависнуть секунд на 30 при большом количестве проблемных сетевых устройств;3. Тоже от имени администратора, можно в той же консоли, полностью сбрасываем весь сетевой стек. Тут две команды:
netsh winsock reset, затем netsh int ip reset;4. Тут же идём в ребут.
После ребута всё завелось какк часы: OpenVPN пересоздал себе новый адаптер при необходимости, sing-box тоже создаёт себе устройство при старте службы, wsl корректно настроился автоматически при первом запуске оболочки. VMWare ещё не проверял, так как он мне пока не нужен, но в крайнем случае переустановка программы однозначно поможет.
Также, поделюсь тут своим конфигом от Wsl, с которым у меня всё работает.
[wsl2]
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=false
Ведёт оно себя следующим образом:
в правила sing-box для разделения трафика добавлено следующее: проксировать vpn.ifconfig.me.
В итоге видим следующее поведение под Wsl:
~ % curl ifconfig.me
<мой реальный IP>
~ % curl vpn.ifconfig.me
<Ip адрес vpn сервера, к которому подключается sing-box>
Доступ к заблокировавшимся от российских пользователей OpenAI и Claude тоже проходит без проблем как ис-под хоста, так и под wsl.
ps: Важно отметить, что у меня sing-box работает как чистое ядро, завёрнутое в WinSW для запуска в качестве службы Windows. Я не использую графические клиенты вроде Throne, Hiddify или Clash.
Будет ли всё это работать так же с ними - не знаю.
👍2
Archlinux, ну как так-то?!!
Почему в старом и консервативном Debian пакет borgbackup2 есть, и даже почти свежий, а в Arch пакет borg2 доступен только в aur и то не устанавливается из-за криво написанного pkgbuild, а именно кривой секции тестов.
Грустненько.
Но пакет мне нужен, так что пофиг, без тестов, но поставим. Уж очень хочется мигрировать на новую структуру репозиториев с бэкапами на абсолютно всех серверах.
Почему в старом и консервативном Debian пакет borgbackup2 есть, и даже почти свежий, а в Arch пакет borg2 доступен только в aur и то не устанавливается из-за криво написанного pkgbuild, а именно кривой секции тестов.
Грустненько.
Но пакет мне нужен, так что пофиг, без тестов, но поставим. Уж очень хочется мигрировать на новую структуру репозиториев с бэкапами на абсолютно всех серверах.
#Программирование #AI
Ну, вот и я дозрел до полноценного вайбкодинга.
Вайбкодинг, если что - это процесс написания кода без написания кода, с помощью искусственного интеллекта, промптов и лишь внешнего контроля на этапе техзадания и тестирования.
Есть мод для игры Rim World. Сам мод активно разрабатывается с помощью ИИ, и я подумал: "у меня есть дешёвый и неплохой DeepSeek. На тестирование антиспам-бота и разработку пары фич для кардпьютера ушло меньше доллара. Почему бы мне не улучшить мод для игры, в которой я сам провожу каждый день по паре часов минимум".
В общем, за качество кода ручаться не буду, не читал, страшно. Но то, что делает DeepSeek через Cline в VSCode, это очень и очень интересно.
За полчаса я добавил полезную лично для меня фичу, которую, возможно, примут и в основной репозиторий. Ещё за 10 минут исправил пару неточностей в её поведении, а сейчас доделываю финальные штрихи, чтобы протестировать и с чистой душой делать merge request в основной репозиторий.
Ну, вернее, доделывает AI, а я сижу, пью чай, болтаю с друзьями и слушаю, как VSCode что-то там сохраняет, форматирует и сравнивает файлы (судя по звукам самой IDE).
И пусть хоть кто-то попробует сказать, что это сделал не я! Знаете, как было лениво настраивать Cline? Да и всё же полдоллара, потраченные на эту задачу, взяты из моего кармана 😀
Всем добра и поменьше багов!
Ну, вот и я дозрел до полноценного вайбкодинга.
Вайбкодинг, если что - это процесс написания кода без написания кода, с помощью искусственного интеллекта, промптов и лишь внешнего контроля на этапе техзадания и тестирования.
Есть мод для игры Rim World. Сам мод активно разрабатывается с помощью ИИ, и я подумал: "у меня есть дешёвый и неплохой DeepSeek. На тестирование антиспам-бота и разработку пары фич для кардпьютера ушло меньше доллара. Почему бы мне не улучшить мод для игры, в которой я сам провожу каждый день по паре часов минимум".
В общем, за качество кода ручаться не буду, не читал, страшно. Но то, что делает DeepSeek через Cline в VSCode, это очень и очень интересно.
За полчаса я добавил полезную лично для меня фичу, которую, возможно, примут и в основной репозиторий. Ещё за 10 минут исправил пару неточностей в её поведении, а сейчас доделываю финальные штрихи, чтобы протестировать и с чистой душой делать merge request в основной репозиторий.
Ну, вернее, доделывает AI, а я сижу, пью чай, болтаю с друзьями и слушаю, как VSCode что-то там сохраняет, форматирует и сравнивает файлы (судя по звукам самой IDE).
И пусть хоть кто-то попробует сказать, что это сделал не я! Знаете, как было лениво настраивать Cline? Да и всё же полдоллара, потраченные на эту задачу, взяты из моего кармана 😀
Всем добра и поменьше багов!
👍1
#Программирование #Python
Сегодня ночью написал свою первую в жизни нейросеть.
Это, конечно, громко сказано: один нейрон и простейшая логика, но я это делал ради понимания принципа, а не с целью зафигачить свой искусственный интеллект за пару часов.
Сначала сделал это на чистой математике, без всяких ваших pytorch и прочих.
Затем переписал на torch, ибо серьёзные нейронки вручную никто нынче не пишет. Тем более у torch многое уже написано за нас, и можно описывать логику, а не возиться с формулами расчётов ошибок, градиентов для обучения и обновлением весов и смещений.
Теперь есть парочка идей для саморазвития в этой области: для одной идеи нужно, чтобы один хороший человек накодил на своей стороне интерфейс для внешнего софта; другие же идеи нужно просто сесть и написать.
Одна из них, кстати, напрямую связана с уже так полюбившейся мне темой лингвистики в программировании, обработкой текстов и преобразованием слов и их частей.
ps: Долго думал, написать об этом сюда или в основной канал, ибо пост не так что бы и сильно технический, да и короткий. В итоге решил, что просто сделаю репост 🙂
Сегодня ночью написал свою первую в жизни нейросеть.
Это, конечно, громко сказано: один нейрон и простейшая логика, но я это делал ради понимания принципа, а не с целью зафигачить свой искусственный интеллект за пару часов.
Сначала сделал это на чистой математике, без всяких ваших pytorch и прочих.
Затем переписал на torch, ибо серьёзные нейронки вручную никто нынче не пишет. Тем более у torch многое уже написано за нас, и можно описывать логику, а не возиться с формулами расчётов ошибок, градиентов для обучения и обновлением весов и смещений.
Теперь есть парочка идей для саморазвития в этой области: для одной идеи нужно, чтобы один хороший человек накодил на своей стороне интерфейс для внешнего софта; другие же идеи нужно просто сесть и написать.
Одна из них, кстати, напрямую связана с уже так полюбившейся мне темой лингвистики в программировании, обработкой текстов и преобразованием слов и их частей.
ps: Долго думал, написать об этом сюда или в основной канал, ибо пост не так что бы и сильно технический, да и короткий. В итоге решил, что просто сделаю репост 🙂
И от этих невнимательных рукожопов зависит наша карьера!
Прохожу тест на hh.ru, Golang, средний уровень, практика.
Перед началом написано, что мол наши тесты проверены компанией "Магнит чё-то там". Типа пафосно!
Первая же задача:
реализуйте алгоритм фильтрации.
На вход подаётся первой строкой тип фильтра, один из перечисленных:
capital - вернуть "да" для строк, начинающихся с заглавной буквы;
digits - вернуть "да" для строк только из цифр;
long - вернуть "да" для строк строго длиннее 5 символов.
Иначе вернуть "Ошибка. Неизвестный фильтр".
Примеры входных данных:
capital
Hello
Вернуть строку Hello.
unique
hello go go go is fun 123
Вернуть "уникальных слов столько-то"...
Продолжать нет смысла.
Какой, нахрен, unique?!!
Вы двумя абзацами выше пишете про три фильтра, среди которых такого не существует. При этом в примерах и, что самое страшное, в тестах, фильтр есть, и без него всё падает.
При этом в требованиях описывается одно, а в структуре кода ожидается имплементация самих структур фильтров, без возврата текстовых ответов в принципе.
При этом ваши же тесты на абсолютно верном вводе падают с невнятной ошибкой в стиле "ой, оно не собралось". И ошибка торчит куда-то в ту область кода, которая мне неподконтрольна. Тот кусок, который собирает и использует мой пакет с фильтрами на их стороне в тестовом запуске.
Российский бигтех: безжалостный и беспощадный.
Видимо в таком стиле предполагается и работать дальше: сделать вчера! Как? Не ебёт. Сделать, иначе казнить! Не работает, разбирайся сам. Документация? Нууу, её писал наш бывший коллега 5 лет назад, мы хз чё там вообще. Сам как-нибудь. Иначе будешь уволен задним числом.
Походу именно к такому нас и готовят на ХХ.
Прохожу тест на hh.ru, Golang, средний уровень, практика.
Перед началом написано, что мол наши тесты проверены компанией "Магнит чё-то там". Типа пафосно!
Первая же задача:
реализуйте алгоритм фильтрации.
На вход подаётся первой строкой тип фильтра, один из перечисленных:
capital - вернуть "да" для строк, начинающихся с заглавной буквы;
digits - вернуть "да" для строк только из цифр;
long - вернуть "да" для строк строго длиннее 5 символов.
Иначе вернуть "Ошибка. Неизвестный фильтр".
Примеры входных данных:
capital
Hello
Вернуть строку Hello.
unique
hello go go go is fun 123
Вернуть "уникальных слов столько-то"...
Продолжать нет смысла.
Какой, нахрен, unique?!!
Вы двумя абзацами выше пишете про три фильтра, среди которых такого не существует. При этом в примерах и, что самое страшное, в тестах, фильтр есть, и без него всё падает.
При этом в требованиях описывается одно, а в структуре кода ожидается имплементация самих структур фильтров, без возврата текстовых ответов в принципе.
При этом ваши же тесты на абсолютно верном вводе падают с невнятной ошибкой в стиле "ой, оно не собралось". И ошибка торчит куда-то в ту область кода, которая мне неподконтрольна. Тот кусок, который собирает и использует мой пакет с фильтрами на их стороне в тестовом запуске.
Российский бигтех: безжалостный и беспощадный.
Видимо в таком стиле предполагается и работать дальше: сделать вчера! Как? Не ебёт. Сделать, иначе казнить! Не работает, разбирайся сам. Документация? Нууу, её писал наш бывший коллега 5 лет назад, мы хз чё там вообще. Сам как-нибудь. Иначе будешь уволен задним числом.
Походу именно к такому нас и готовят на ХХ.
🔥1
Code with Cyrmax
И от этих невнимательных рукожопов зависит наша карьера! Прохожу тест на hh.ru, Golang, средний уровень, практика. Перед началом написано, что мол наши тесты проверены компанией "Магнит чё-то там". Типа пафосно! Первая же задача: реализуйте алгоритм фильтрации.…
upd: И по результатам этой невнятной ссанины предлагается получать "сертификат Минцифры на ГосУслугах", да?
#Администрирование #Linux
По следам трёхдневного ярого совокупления с поломавшимся домашним сервером.
Расписывать подробно уже нет сил, поэтому пост будет в формате коротких советов и можно сказать чеклистов.
Если сервер ведёт себя странно, то принимает подключения, то не принимает; то пинги по 20 секунд, а попытка запустить обновление системы выливается в часовое ожидание в подключении к внешним адресам.
Ясно, что дело в сетевой конфигурации.
Первым делом проверь dns.
Смотри на содержимое
Если там обычное содержимое без предупреждений, прочитай его и убедись вручную пингом, что до каждого или хотя бы до первого сервера имён есть доступ. В условиях нашей цензуры лишним не будет.
Ещё один способ изолировать проблему с dns - это пропинговать сайт с доменом, например
Помни, что dns кэшируется. После изменений в конфиге пробуй не только старый домен, но и что-то новое. Имей в голове список из пары десятков сайтов для проверки без участия кэша.
Если проблема не в dns, тогда смотри маршруты через
Как минимум должен быть маршрут по умолчанию, причём верный и рабочий.
Обычно этим занимается dhcp-клиент, служба сетевых интерфейсов (ifupdown или systemd-networkd). Их можно подёргать в надежде на чудо. Ну или читай логи.
Кстати, настройки dns тоже могут прилетать по dhcp, имей это в виду, если выяснил, что проблема в dns.
Если всё изложенное выше не дало наводок на корень проблемы, проверь mtu.
Особенно актуально, если одни пакеты проходят, другие - нет, а закономерность непонятна.
Командой
У основного интерфейса посмотри параметр mtu. Он может быть 1500, 1492, 1280 или изредка другое необычное значение.
От значения mtu отними 28 байт и запомни получившееся число.
Дальше подставь его в команду пинга с большим размером пакета:
Если пакет пролезает без фрагментации, значит всё окей. Если же нет, начинаются непредсказуемые приколы.
Размер пакета можно уменьшать или увеличивать, пока не найдёте потолок.
А далее к этому безопасному размеру пакета добавляем 28. Это и будет наш эффективный mtu.
У меня из-за pppoe на роутере максимальный mtu не 1500 как позволяет стандарт ethernet, а 1492 (pppoe требует 8 байт на свои служебные заголовки).
Выставить mtu временно -
Имя интерфейса может быть другим вместо eth0.
А вот как сохранить эти изменения - зависит от того, используете вы systemd-networkd, ifupdown, или ваши интерфейсы всецело под контролем NetworkManager.
И это тема для отдельного поста, в котором я пожалуй ещё и разберу различия этих трёх утилит в деталях. Заодно и сам разберусь.
Надеюсь эти торопливые заметки мамкиного сисадмина кому-то помогут.
По следам трёхдневного ярого совокупления с поломавшимся домашним сервером.
Расписывать подробно уже нет сил, поэтому пост будет в формате коротких советов и можно сказать чеклистов.
Если сервер ведёт себя странно, то принимает подключения, то не принимает; то пинги по 20 секунд, а попытка запустить обновление системы выливается в часовое ожидание в подключении к внешним адресам.
Ясно, что дело в сетевой конфигурации.
Первым делом проверь dns.
Смотри на содержимое
/etc/resolv.conf. Если там написано, что это заглушка от systemd-resolved, тогда проверяй статус через команду resolvectl status.Если там обычное содержимое без предупреждений, прочитай его и убедись вручную пингом, что до каждого или хотя бы до первого сервера имён есть доступ. В условиях нашей цензуры лишним не будет.
Ещё один способ изолировать проблему с dns - это пропинговать сайт с доменом, например
ping ifconfig.me, а затем пинговать просто ip-адрес, например ping 77.88.8.8 (dns Яндекса).Помни, что dns кэшируется. После изменений в конфиге пробуй не только старый домен, но и что-то новое. Имей в голове список из пары десятков сайтов для проверки без участия кэша.
Если проблема не в dns, тогда смотри маршруты через
ip route show.Как минимум должен быть маршрут по умолчанию, причём верный и рабочий.
Обычно этим занимается dhcp-клиент, служба сетевых интерфейсов (ifupdown или systemd-networkd). Их можно подёргать в надежде на чудо. Ну или читай логи.
Кстати, настройки dns тоже могут прилетать по dhcp, имей это в виду, если выяснил, что проблема в dns.
Если всё изложенное выше не дало наводок на корень проблемы, проверь mtu.
Особенно актуально, если одни пакеты проходят, другие - нет, а закономерность непонятна.
Командой
ip link show или ip addr show выведи список интерфейсов, найди свой основной, у которого получен публичный ip (или локальный от роутера).У основного интерфейса посмотри параметр mtu. Он может быть 1500, 1492, 1280 или изредка другое необычное значение.
От значения mtu отними 28 байт и запомни получившееся число.
Дальше подставь его в команду пинга с большим размером пакета:
ping -M do -c 4 -s 1472 8.8.8.8-c 4 - пинговать не бесконечно, а всего 4 раза.-s 1472 - указать размер пакета (1472 это 1500 минус 28 байт заголовков пакета).-M do - помечать пакет как "Do not fragment" (не фрагментировать).Если пакет пролезает без фрагментации, значит всё окей. Если же нет, начинаются непредсказуемые приколы.
Размер пакета можно уменьшать или увеличивать, пока не найдёте потолок.
А далее к этому безопасному размеру пакета добавляем 28. Это и будет наш эффективный mtu.
У меня из-за pppoe на роутере максимальный mtu не 1500 как позволяет стандарт ethernet, а 1492 (pppoe требует 8 байт на свои служебные заголовки).
Выставить mtu временно -
sudo ip link set dev eth0 mtu 1492.Имя интерфейса может быть другим вместо eth0.
А вот как сохранить эти изменения - зависит от того, используете вы systemd-networkd, ifupdown, или ваши интерфейсы всецело под контролем NetworkManager.
И это тема для отдельного поста, в котором я пожалуй ещё и разберу различия этих трёх утилит в деталях. Заодно и сам разберусь.
Надеюсь эти торопливые заметки мамкиного сисадмина кому-то помогут.
❤🔥1🤝1
#Администрирование #Windows
Многие знают про менеджер пакетов для Windows под названием WinGet.
И если уж вы им пользуетесь не только для установки, но и для обновления пакетов, наверняка вас бесила невозможность обновить всё разом или быстро указать конкретный список пакетов для обновления без прописывания ID каждой программы вручную.
Меня тоже это достало, и я, попутно изучая возможности языка PowerShell, накидал маленький скрипт под это дело.
Он получает список всех доступных обновлений, а дальше для каждого пакета спрашивает, либо обновить, либо пропустить, либо пропустить все оставшиеся и приступить к обновлению.
Ещё я лично для себя добавил действие "удалить прямо сейчас", ибо как раз после обновления винды чистил её от мусора. Вы эту ветку можете убрать, если она вам не нужна. Лично мне не мешает.
Скрипт корректно работает на PowerShell 7 и требует установленного модуля для взаимодействия с WinGet.
Поэтому сначала пишем
Кода получилось очень мало, так что вставлю его прямо сюда. Кому надо, забирайте.
Многие знают про менеджер пакетов для Windows под названием WinGet.
И если уж вы им пользуетесь не только для установки, но и для обновления пакетов, наверняка вас бесила невозможность обновить всё разом или быстро указать конкретный список пакетов для обновления без прописывания ID каждой программы вручную.
Меня тоже это достало, и я, попутно изучая возможности языка PowerShell, накидал маленький скрипт под это дело.
Он получает список всех доступных обновлений, а дальше для каждого пакета спрашивает, либо обновить, либо пропустить, либо пропустить все оставшиеся и приступить к обновлению.
Ещё я лично для себя добавил действие "удалить прямо сейчас", ибо как раз после обновления винды чистил её от мусора. Вы эту ветку можете убрать, если она вам не нужна. Лично мне не мешает.
Скрипт корректно работает на PowerShell 7 и требует установленного модуля для взаимодействия с WinGet.
Поэтому сначала пишем
Install-Module -Name 'Microsoft.Winget.Client", а лишь затем используем скрипт.Кода получилось очень мало, так что вставлю его прямо сюда. Кому надо, забирайте.
$ErrorActionPreference = "Stop"
Set-StrictMode -Version Latest
Write-Host "Looking for available WinGet updates..."
$allUpdates = Get-WingetPackage | Where-Object { $_.IsUpdateAvailable }
if (-Not $allUpdates) {
Write-Host "No available WinGet updates found"
exit
}
Write-Host "$($allUpdates.Count) updatable packages found."
$packagesToUpgrade = @()
$skipRemaining = $false
foreach ($pkg in $allUpdates) {
if ($skipRemaining) { break }
Write-Host "Package: $($pkg.Name)"
Write-Host "$($pkg.Id)"
Write-Host "Installed version: $($pkg.InstalledVersion)"
Write-Host "Available version: $($pkg.AvailableVersions[0])"
$choices = @(
New-Object System.Management.Automation.Host.ChoiceDescription "&Update", "Add to upgrade queue"
New-Object System.Management.Automation.Host.ChoiceDescription "&Skip", "Skip this package"
New-Object System.Management.Automation.Host.ChoiceDescription "Skip &All", "Skip all remaining packages"
New-Object System.Management.Automation.Host.ChoiceDescription "&Remove", "Queue this package for removal"
)
$answer = $host.UI.PromptForChoice("Action for $($pkg.Name)", "Choose an action", $choices, 0)
switch ($answer) {
0 {
$packagesToUpgrade += $pkg
}
1 {
Write-Host "Skipping"
}
2 {
Write-Host "Skipping all remaining packages"
$skipRemaining = $true
}
3 {
Uninstall-WinGetPackage -Id $pkg.Id
}
}
}
if ($packagesToUpgrade.Count -eq 0) {
Write-Host "No packages were selected for upgrade"
exit
}
Write-Host "Upgrading $($packagesToUpgrade.Count) packages..."
foreach ($pkg in $packagesToUpgrade) {
Write-Host "Upgrading $($pkg.Name)"
try {
Update-WinGetPackage -Id $pkg.Id -ErrorAction Stop
}
catch {
Write-Host "Upgrade for $($pkg.Id) failed"
Write-Host "Reason: $($_.Exception.Message)"
}
}
#Администрирование #Блокировки
Нет, речь не пойдёт про обход цензуры.
Недавно у меня на одном из московских серверов начали с завидной регулярностью падать ежедневные бэкапы.
Нашлось немного времени, пошёл разбираться. Выяснил, что сами бэкапы проходят, а падать их заставляет неработающий скрипт уведомлений в Telegram.
Всё, походу серверы теперь тоже местами отрезают от API мессенджера.
Грустно, но будем приспосабливаться.
Кстати, второй сервер в этом же датацентре почему-то ходит к боту без проблем и ещё ни разу не падал по таймауту.
Нет, речь не пойдёт про обход цензуры.
Недавно у меня на одном из московских серверов начали с завидной регулярностью падать ежедневные бэкапы.
Нашлось немного времени, пошёл разбираться. Выяснил, что сами бэкапы проходят, а падать их заставляет неработающий скрипт уведомлений в Telegram.
Всё, походу серверы теперь тоже местами отрезают от API мессенджера.
Грустно, но будем приспосабливаться.
Кстати, второй сервер в этом же датацентре почему-то ходит к боту без проблем и ещё ни разу не падал по таймауту.