#Программирование #Эзотерика
Вы когда-нибудь использовали Perl?
А я вот да. Сегодня. Впервые.
Попросили меня максимально быстро решить следующую задачу:
Есть файл с белорусскими словами с проставленными ударениями; необходимо привести его к виду, когда на каждой строке сначала слово без ударения, а затем это же слово с ударением.
Потыкав sed и выяснив, что с юникодными ударениями работать он не умеет, я пошёл гуглить...
А ведь насколько проще было бы просто написать скрипт на питоне... Но нет, меня уже было не остановить.
Итогом моих мытарств стала вот такая конструкция, в итоге решившая задачу:
Так что теперь могу нарисовать себе на фюзеляже ещё одну звёздочку: я писал на перле.
А как проходит ваш четверг?
Вы когда-нибудь использовали Perl?
А я вот да. Сегодня. Впервые.
Попросили меня максимально быстро решить следующую задачу:
Есть файл с белорусскими словами с проставленными ударениями; необходимо привести его к виду, когда на каждой строке сначала слово без ударения, а затем это же слово с ударением.
Потыкав sed и выяснив, что с юникодными ударениями работать он не умеет, я пошёл гуглить...
А ведь насколько проще было бы просто написать скрипт на питоне... Но нет, меня уже было не остановить.
Итогом моих мытарств стала вот такая конструкция, в итоге решившая задачу:
perl -CSD -pe '$line = $_; $line =~ s/\x{301}//g; $line =~ s/\s+$//; $_ = "$line $_"' slovy-2008-stress.txt > slovy-2008-perldoled.txtТак что теперь могу нарисовать себе на фюзеляже ещё одну звёздочку: я писал на перле.
А как проходит ваш четверг?
#Администрирование #Linux #Windows #Мнение
Помните песенку про Linux от Научно-Технического Рэпа?
Это та, где в третьем куплете было "тут отвалится крыльцо, тут - всё затопило..."
Так вот, именно это у меня сейчас и происходит... Но не с линуксом, а с виндой.
Поставил обновление Equalizer APO - напрочь отвалился звук вместе со скринридером. Пришлось уходить в ребут, и со второго раза всё завелось.
Решил покодить - гит выдал длинную срань в стиле "почини меня, я сломался". Попытка починить не увенчалась успехом - пришлось удалять и переустанавливать.
Подписываю коммиты - gpg орёт, что приватный ключ не найден, хотя в списках я его вижу. Клеопатра подписывает файлы без проблем, а вот гит не хочет.
Gpg постоянно орёт о том, что data execution prevention не включён, и так нельзя. А ведь он включён, я проверил.
Половина игр на bgt ведёт себя так, как будто я их на пентиуме запускаю - периодически подвисают на несколько секунд с остановленными таймерами и не реагируют ни на одну клавишу.
И при этом всём два антивируса не находят ни одной угрозы на компьютере. Проверял встроенным защитником и православным CureIt, который нормально запустить - тоже ещё та задача.
В общем, винду однозначно пора переставлять, но знали бы вы как я не хочу потом ставить и настраивать кучу софта, который ещё и не поставишь из одного источника (что-то есть в choco, что-то только в winget, а что-то вообще ставь руками, ибо ну вот жизнь такая).
И в отличие от Линукса хрен ты сделаешь нормальный бэкап всех конфигов. Половина программ хранит настройки в реестре, другая часть - в файлах, а третья смешивает оба подхода по непонятной причине.
Но переставлять надо, ибо системе потихоньку приходит пипец.
Помните песенку про Linux от Научно-Технического Рэпа?
Это та, где в третьем куплете было "тут отвалится крыльцо, тут - всё затопило..."
Так вот, именно это у меня сейчас и происходит... Но не с линуксом, а с виндой.
Поставил обновление Equalizer APO - напрочь отвалился звук вместе со скринридером. Пришлось уходить в ребут, и со второго раза всё завелось.
Решил покодить - гит выдал длинную срань в стиле "почини меня, я сломался". Попытка починить не увенчалась успехом - пришлось удалять и переустанавливать.
Подписываю коммиты - gpg орёт, что приватный ключ не найден, хотя в списках я его вижу. Клеопатра подписывает файлы без проблем, а вот гит не хочет.
Gpg постоянно орёт о том, что data execution prevention не включён, и так нельзя. А ведь он включён, я проверил.
Половина игр на bgt ведёт себя так, как будто я их на пентиуме запускаю - периодически подвисают на несколько секунд с остановленными таймерами и не реагируют ни на одну клавишу.
И при этом всём два антивируса не находят ни одной угрозы на компьютере. Проверял встроенным защитником и православным CureIt, который нормально запустить - тоже ещё та задача.
В общем, винду однозначно пора переставлять, но знали бы вы как я не хочу потом ставить и настраивать кучу софта, который ещё и не поставишь из одного источника (что-то есть в choco, что-то только в winget, а что-то вообще ставь руками, ибо ну вот жизнь такая).
И в отличие от Линукса хрен ты сделаешь нормальный бэкап всех конфигов. Половина программ хранит настройки в реестре, другая часть - в файлах, а третья смешивает оба подхода по непонятной причине.
Но переставлять надо, ибо системе потихоньку приходит пипец.
🔥1
#Администрирование #Linux
Нулевой диск в домашнем сервере форматирован в btrfs. Зачем? Дурак был восторженный.
Из-за этого есть проблемы с тем, что Docker забивал место бесполезными снапшотами, чистить которые было больно (уже года 4 ждём, пока починят, но у ребят много более важных дел).
Чтобы об этом не париться, забыть и не думать, был создан img файл на 20 гигабайт, на нём была запилена файловая система ext4, и всё это добро было смонтировано в /var/lib/docker.
Работало безотказно несколько лет.
И тут ложится докер вместе с системой мониторинга и оповещений, ибо она на докере и работала.
Узнаю я об этом спустя много дней по чистой случайности.
Попытки поднять докер приводят к ошибке "No space left on device".
Ну, как бы понятно: файлик забился под крышку, а увеличиваться его не научили.
Что делаем:
p.s. Да, можно создавать файловые системы прямо в двоичных файлах на диске, и да, это прекрасно работает.
p.p.s. Напишите, вам интересны такие случаи из жизни мамкиного сисадмина или нет? А то задача как бы достаточно редкая и вроде бы далеко не всем нужна.
Нулевой диск в домашнем сервере форматирован в btrfs. Зачем? Дурак был восторженный.
Из-за этого есть проблемы с тем, что Docker забивал место бесполезными снапшотами, чистить которые было больно (уже года 4 ждём, пока починят, но у ребят много более важных дел).
Чтобы об этом не париться, забыть и не думать, был создан img файл на 20 гигабайт, на нём была запилена файловая система ext4, и всё это добро было смонтировано в /var/lib/docker.
Работало безотказно несколько лет.
И тут ложится докер вместе с системой мониторинга и оповещений, ибо она на докере и работала.
Узнаю я об этом спустя много дней по чистой случайности.
Попытки поднять докер приводят к ошибке "No space left on device".
Ну, как бы понятно: файлик забился под крышку, а увеличиваться его не научили.
Что делаем:
# Отмонтируем файловую систему с докером
sudo umount /var/lib/docker
# Прибавляем к нашему файлу ещё 20 гигабайт (ибо не жалко)
sudo truncate -s +20G /media/docker-filesystem.img
# Запускаем проверку файловой системы, просто на всякий случай
sudo e2fsck -f /media/docker-filesystem.img
# Натыкаемся на несколько автоматически исправляемых ошибок файловой системы. Откуда они там? Соглашаемся на исправление и радуемся
# Затем растягиваем файловую систему под новый размер файла
sudo resize2fs /media/docker-filesystem.img
# И, наконец, монтируем всё обратно, причём так как маунт прописан в /etc/fstab, делаем ленивое
sudo mount -a
# Ну и то, ради чего всё затевалось
sudo systemctl start docker
# Всё работает! Мы ничего не сломали!
p.s. Да, можно создавать файловые системы прямо в двоичных файлах на диске, и да, это прекрасно работает.
p.p.s. Напишите, вам интересны такие случаи из жизни мамкиного сисадмина или нет? А то задача как бы достаточно редкая и вроде бы далеко не всем нужна.
🔥1
#Программирование #Эзотерика #Однострочники #Python
Один хороший человек на днях скинул мне страшнющий однострочник на Python, а затем сотворил вот это руководство.
Пользуйтесь и наслаждайтесь... Если сможете :)
@denizsincar29, спасибо тебе!
Руководство по созданию чудовищных, но эффектных однострочников:
Цель: Уместить максимальное количество логики и операций в одну строку кода, жертвуя читаемостью, поддерживаемостью и безопасностью. Наша цель - создать код, который никто не сможет понять, кроме самого гения-автора (да и то не факт).
Основные принципы:
• Забудьте про обработку исключений: Ошибки - это весело! Пусть программа взрывается. Обработать исключения в однострочнике невозможно, поэтому мы не будем даже пытаться.
• Комбинируйте всё воедино (максимально): Вложенные тернарные операторы, цепочки методов, скобки внутри скобок - чем больше операций в одном выражении, тем лучше.
• Лист-компрехеншены - наше многофункциональное оружие: Превратите любой цикл и фильтрацию данных в однострочный ад. Используйте вложенные лист-компрехеншены для максимальной сложности. Да и цикл в одну строку вы не напишете.
• Мгновенная индексация - для краткости и скорости: Создайте список/словарь на лету и сразу же получите к нему доступ по индексу/ключу.
• Импортируйте не как все (для obfuscation):
• Циклы через
• Больше тернарных операторов (для нелинейной логики): Выведите тернарные операторы на новый уровень, вложив их друг в друга несколько раз. Используйте их даже там, где они не нужны, чтобы добавить немного загадочности.
• Главное - уместить как можно больше: Каждая строка должна быть наполнена операциями до предела. Используйте все доступные приемы, чтобы уменьшить количество символов и увеличить плотность логики.
Пример (стремящийся к абсолютной нечитаемости):
Полезные применения (и предостережения):
• Конкурсы на самый нечитаемый код (где побеждает тот, кто умудрится сделать больше всего в одной строке).
• Демонстрация *мнимого* мастерства владения языком (если кто-то действительно впечатлится, вам повезло).
• Запутывание врагов (только если вы уверены, что они не смогут использовать ваш код против вас).
Важное предупреждение:
Этот код предназначен только для развлечений и экспериментов! Вы можете конечно использовать такой код на работе, *если ваша цель - отомстить вашему работодателю перед увольнением*.
Один хороший человек на днях скинул мне страшнющий однострочник на Python, а затем сотворил вот это руководство.
Пользуйтесь и наслаждайтесь... Если сможете :)
@denizsincar29, спасибо тебе!
Руководство по созданию чудовищных, но эффектных однострочников:
Цель: Уместить максимальное количество логики и операций в одну строку кода, жертвуя читаемостью, поддерживаемостью и безопасностью. Наша цель - создать код, который никто не сможет понять, кроме самого гения-автора (да и то не факт).
Основные принципы:
• Забудьте про обработку исключений: Ошибки - это весело! Пусть программа взрывается. Обработать исключения в однострочнике невозможно, поэтому мы не будем даже пытаться.
• Комбинируйте всё воедино (максимально): Вложенные тернарные операторы, цепочки методов, скобки внутри скобок - чем больше операций в одном выражении, тем лучше.
(a if cond1 else (b if cond2 else c)) - ваш лучший друг. a or b and c - тоже полезно для создания неочевидной логики.• Лист-компрехеншены - наше многофункциональное оружие: Превратите любой цикл и фильтрацию данных в однострочный ад. Используйте вложенные лист-компрехеншены для максимальной сложности. Да и цикл в одну строку вы не напишете.
• Мгновенная индексация - для краткости и скорости: Создайте список/словарь на лету и сразу же получите к нему доступ по индексу/ключу.
[...][i] и {...}[key] позволяют избежать временных переменных и сделать код более лаконичным. Убедитесь, что i и key вычисляются в других сложных выражениях, чтобы увеличить уровень абстракции.• Импортируйте не как все (для obfuscation):
__import__("module").submodule.function() - это не только красиво, но и затрудняет анализ зависимостей.• Циклы через
itertools (для бесконечной мощи): Забудьте про обычные for. __import__("itertools").count() и map() с лямбдами позволяют создавать бесконечные циклы, которые могут привести к зависанию программы, если их не остановить.• Больше тернарных операторов (для нелинейной логики): Выведите тернарные операторы на новый уровень, вложив их друг в друга несколько раз. Используйте их даже там, где они не нужны, чтобы добавить немного загадочности.
• Главное - уместить как можно больше: Каждая строка должна быть наполнена операциями до предела. Используйте все доступные приемы, чтобы уменьшить количество символов и увеличить плотность логики.
Пример (стремящийся к абсолютной нечитаемости):
monthdays = lambda year, month: [31, (29 if (((year % 4) == 0) and ((year % 100) != 0) or ((year % 400) == 0)) else 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][(["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"].index(month.strip().lower()))] # Возвращает количество дней в месяце для заданного года (или взрывается с ошибкой). Не пытайтесь понять, как это работает.Полезные применения (и предостережения):
• Конкурсы на самый нечитаемый код (где побеждает тот, кто умудрится сделать больше всего в одной строке).
• Демонстрация *мнимого* мастерства владения языком (если кто-то действительно впечатлится, вам повезло).
• Запутывание врагов (только если вы уверены, что они не смогут использовать ваш код против вас).
Важное предупреждение:
Этот код предназначен только для развлечений и экспериментов! Вы можете конечно использовать такой код на работе, *если ваша цель - отомстить вашему работодателю перед увольнением*.
😭2❤🔥1🔥1
#Программирование #Из_жизни
Знакома ли вам ситуация, когда ты ещё не написал ни строчки кода, а первый коммит уже вот такой:
Там как бы большая часть - это нереально раздутый
Ну, и, конечно же, так как проект создавала "студия", там уже на старте навалена куча различных конфигов в xml формате.
Позабавила конкретная цифра: тысяча и одно изменение, блин!
Знакома ли вам ситуация, когда ты ещё не написал ни строчки кода, а первый коммит уже вот такой:
8 files changed, 1001 insertions(+) Там как бы большая часть - это нереально раздутый
.gitignore, ибо во-первых, я ленивый и почти всегда заполняю этот файл через API из пресетов, а уж затем дописываю в его начало специфичные для проекта штуки, а во-вторых, с моим непостоянством в используемых инструментах приходится игнорировать в файле и "студию", и VSCode, и ещё парочку инструментов.Ну, и, конечно же, так как проект создавала "студия", там уже на старте навалена куча различных конфигов в xml формате.
Позабавила конкретная цифра: тысяча и одно изменение, блин!
#Администрирование #Linux #Сеть
Как РосТелеком мне инфраструктуру ломал.
Распространите, пожалуйста! Пусть знают...
Пару дней назад в мой Telegram-канал с уведомлениями от Prometheus начали сыпаться постоянные предупреждения о том, что один из серверов якобы прилёг поспать и не отвечает.
Заход по ssh показал, что всё в порядке, да и парочка сайтов на машине всё так же доступны каждому желающему (rhvoice.hu или storage.cyrmax.ru например).
Первая мысль: что-то сломалось в nftables.
Фаервол был временно выключен, а проблема сохранилась.
Вторая идея: что-то сломалось в самом node_exporter после его обновления например.
Целевой сервер был завален подключениями с других серверов; все подключения прошли успешно. Был даже поднят Prometheus точно такой же версии на другой машине, с точно таким же конфигом.
Всё успешно. Из домашней сети подключения нет. Вернее оно есть, но рвётся после некоторого количества прошедших пакетов.
На этом моя компетенция - всё, и я пошёл за помощью к Gemini.
Дальше уже с инструкциями от искусственного интеллекта было сделано следующее:
1. Были внесены конкретные правила для фаерволов на обоих концах. Не помогло.
2. Подключение было проверено с помощью openssl s_client без полезной нагрузки. Подключение успешное, без ошибок.
3. Openssl s_client с полезной нагрузкой, в точности повторяющей структуру get-запроса, совершаемого Prometheus при опросе статистики. Подключение зависает ровно там же, где и при тестировании с curl.
4. Проверка на MTUD Blackhole - отрицательно. Проблем с MTU по пути следования пакетов нет. Сервера и все промежуточные узлы корректно обмениваются информацией о максимальном MTU; пакеты не застревают.
5. Прослушивание трафика с помощью tcpdump на обоих концах показало интересные, наводящие на мысли, результаты.
Сервер и клиент обмениваются пакетами, корректно устанавливают соединение, проводят успешный и правильный tls handshake и уже готовы обменяться первыми порциями полезных данных, когда... Подключение зависает.
В каждой из попыток подключение зависает на одном конкретном пакете одной конкретной длины - 48 байт зашифрованных данных.
Попытка подмешать в запрос левый заголовок со случайной строкой из 50 символов магическим образом пробивает блокаду, и что с помощью curl, что в openssl s_client обмен данными проходят успешно.
При этом попытка симулировать такую же последовательность пакетов с похожим внешним видом кастомными средствами приводит... К зависанию подключения.
Верилось, конечно, слабо, но вдруг это мой роутер шалит. Сервер был подключён к интернету напрямую, без роутера, а я, вооружившись клавиатурой и наушниками, уселся перед камодом, на котором всё это добро и установлено.
Нет. Проблема не в роутере: напрямую подключение ведёт себя абсолютно идентично.
Единственное, чего я не проверил, так это поведение такого же паттерна с других домашних сетей, например других провайдеров или того же РосТелекома, но у других людей.
В общем, "спасибо" РосТелекому за стабильность, надёжность и прозрачность.
Конечно же, я обращусь в поддержку... Но, давайте будем честными, все мы понимаем, что результата ждать не стоит. Если уж по поводу полного отключения интернета до них не достучаться, то чего уж говорить про разрывы при доступе конкретным протоколом к конкретному серверу.
p.s. А самое смешное то, что реальные подключения по протоколам из трёх букв работают безотказно. Иначе как бы я пользовал Gemini, ChatGPT и другие сервисы, официально ушедшие из России и блокирующие российских пользователей.
p.p.s. Пока писал этот пост, Prometheus 8 раз прислал уведомление о том, что сервер лежит. Прикол в том, что именно в это время успешно выполнился GitHub Action, обновивший на этом самом сервере некоторые файлы для сайта.
Вот здесь по ссылке можно скачать архив с двумя pcap файлами, один с перспективы домашнего сервера (prometheus client), второй - с перспективы удалённого сервера (prometheus_node_exporter).
https://disk.yandex.ru/d/QH1Htk8TEa5hDQ
#ростелеком
Как РосТелеком мне инфраструктуру ломал.
Распространите, пожалуйста! Пусть знают...
Пару дней назад в мой Telegram-канал с уведомлениями от Prometheus начали сыпаться постоянные предупреждения о том, что один из серверов якобы прилёг поспать и не отвечает.
Заход по ssh показал, что всё в порядке, да и парочка сайтов на машине всё так же доступны каждому желающему (rhvoice.hu или storage.cyrmax.ru например).
Первая мысль: что-то сломалось в nftables.
Фаервол был временно выключен, а проблема сохранилась.
Вторая идея: что-то сломалось в самом node_exporter после его обновления например.
Целевой сервер был завален подключениями с других серверов; все подключения прошли успешно. Был даже поднят Prometheus точно такой же версии на другой машине, с точно таким же конфигом.
Всё успешно. Из домашней сети подключения нет. Вернее оно есть, но рвётся после некоторого количества прошедших пакетов.
На этом моя компетенция - всё, и я пошёл за помощью к Gemini.
Дальше уже с инструкциями от искусственного интеллекта было сделано следующее:
1. Были внесены конкретные правила для фаерволов на обоих концах. Не помогло.
2. Подключение было проверено с помощью openssl s_client без полезной нагрузки. Подключение успешное, без ошибок.
3. Openssl s_client с полезной нагрузкой, в точности повторяющей структуру get-запроса, совершаемого Prometheus при опросе статистики. Подключение зависает ровно там же, где и при тестировании с curl.
4. Проверка на MTUD Blackhole - отрицательно. Проблем с MTU по пути следования пакетов нет. Сервера и все промежуточные узлы корректно обмениваются информацией о максимальном MTU; пакеты не застревают.
5. Прослушивание трафика с помощью tcpdump на обоих концах показало интересные, наводящие на мысли, результаты.
Сервер и клиент обмениваются пакетами, корректно устанавливают соединение, проводят успешный и правильный tls handshake и уже готовы обменяться первыми порциями полезных данных, когда... Подключение зависает.
В каждой из попыток подключение зависает на одном конкретном пакете одной конкретной длины - 48 байт зашифрованных данных.
Попытка подмешать в запрос левый заголовок со случайной строкой из 50 символов магическим образом пробивает блокаду, и что с помощью curl, что в openssl s_client обмен данными проходят успешно.
При этом попытка симулировать такую же последовательность пакетов с похожим внешним видом кастомными средствами приводит... К зависанию подключения.
Верилось, конечно, слабо, но вдруг это мой роутер шалит. Сервер был подключён к интернету напрямую, без роутера, а я, вооружившись клавиатурой и наушниками, уселся перед камодом, на котором всё это добро и установлено.
Нет. Проблема не в роутере: напрямую подключение ведёт себя абсолютно идентично.
Единственное, чего я не проверил, так это поведение такого же паттерна с других домашних сетей, например других провайдеров или того же РосТелекома, но у других людей.
В общем, "спасибо" РосТелекому за стабильность, надёжность и прозрачность.
Конечно же, я обращусь в поддержку... Но, давайте будем честными, все мы понимаем, что результата ждать не стоит. Если уж по поводу полного отключения интернета до них не достучаться, то чего уж говорить про разрывы при доступе конкретным протоколом к конкретному серверу.
p.s. А самое смешное то, что реальные подключения по протоколам из трёх букв работают безотказно. Иначе как бы я пользовал Gemini, ChatGPT и другие сервисы, официально ушедшие из России и блокирующие российских пользователей.
p.p.s. Пока писал этот пост, Prometheus 8 раз прислал уведомление о том, что сервер лежит. Прикол в том, что именно в это время успешно выполнился GitHub Action, обновивший на этом самом сервере некоторые файлы для сайта.
Вот здесь по ссылке можно скачать архив с двумя pcap файлами, один с перспективы домашнего сервера (prometheus client), второй - с перспективы удалённого сервера (prometheus_node_exporter).
https://disk.yandex.ru/d/QH1Htk8TEa5hDQ
#ростелеком
Яндекс Диск
tcpdumps.7z
Посмотреть и скачать с Яндекс Диска
#Windows #Администрирование #Заклинание
Знакома ли вам ситуация, когда поставили какой-то софт на Винде в консоли, переменные окружения были модифицированы, и вам вроде бы как бы нужно перезапустить консоль, чтобы изменения вступили в силу?
Так вот, сегодня совершенно случайно узнал, что в PowerShell есть такая замечательная команда как
Она обновляет значения переменных окружения из реестра, так же, как это происходит при закрытии и запуске терминала; только без закрытия и потери возможно нужного состояния.
Пользуйтесь и наслаждайтесь.
p.s. Если кто-то знает нечто подобное для cmd, напишите в комментариях.
Знакома ли вам ситуация, когда поставили какой-то софт на Винде в консоли, переменные окружения были модифицированы, и вам вроде бы как бы нужно перезапустить консоль, чтобы изменения вступили в силу?
Так вот, сегодня совершенно случайно узнал, что в PowerShell есть такая замечательная команда как
refreshenv.Она обновляет значения переменных окружения из реестра, так же, как это происходит при закрытии и запуске терминала; только без закрытия и потери возможно нужного состояния.
Пользуйтесь и наслаждайтесь.
p.s. Если кто-то знает нечто подобное для cmd, напишите в комментариях.
В Telegram недавно завезли возможность писать сообщения администратору канала.
В связи с этим вот вам обновление :)
В связи с этим вот вам обновление :)
У канала теперь включены сообщения, и каждый желающий может предложить интересную задачу (с решением или без), задать вопрос или накинуть идей для следующих постов.
Для этого можно использовать кнопку "сообщения каналу" в левом нижнем углу экрана на телефонах или кнопку "button feedback" в Unigram (а зрячие подписчики, думаю, и так уже знают, как всё это делается).
Для этого можно использовать кнопку "сообщения каналу" в левом нижнем углу экрана на телефонах или кнопку "button feedback" в Unigram (а зрячие подписчики, думаю, и так уже знают, как всё это делается).
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