Нерусские вомбаты
С просторов Reddit, местами в видео есть громкая музыка. Но вроде таких тут еще не видел.

Господи, забери любую технику у тех, у кого получаются такие рамки.


С просторов Reddit, местами в видео есть громкая музыка. Но вроде таких тут еще не видел.
Сегодня суббота, то есть Шаббат-Вомбат. Белки хоть и не вомбаты, но вторые у нас водиться не желают. Приходится выкручиваться и искать вомбатозаменители.
Хотел написать про работу системы управления памятью, но понял, что для полноценной статьи у меня не хватает практических знаний. Поэтому кратко
Помимо стека, о котором было рассказано в прошлой статье и который содержит локальные переменные, в "потребительской" программе в среднестатистической ОС еще бывают глобальные переменные и динамическая память. Глобальные переменные описываются внутри сегментов .bss и .data, резервируясь в памяти сразу после загрузки образа программы (по-правильному это называется процессом).
Динамическая память иначе называется кучей, так как представляет из себя кучу динамических данных, который могут появляться и исчезать во время работы.
Для работы с динамической памятью в C существует malloc(size_t), запрашивающий (выделяющий, аллоцирующий) у ОС кусок памяти указанного размера и возвращающий указатель на первый байт, и free(void *), принимающий этот указатель и возвращающий (освобождающий) кусок назад в ОС.
В C++ есть операторы new и delete, они устроены гораздо сложнее и я не буду их рассматривать, ибо не пишу на нем. Помимо запроса памяти у ОС они занимаются ее инициализацией.
Если по какой-то причине стандартной библиотеки языка в наличии не имеется, то в Windows за память отвечает HeapAlloc и устаревшие GlobalAlloc и LocalAlloc из времен Windows 3.11 (malloc к ним и обращается внутри. Еще есть парные HeapFree, GlobalFree и LocalFree). Они предоставляют больше контроля над результатом, но проприетарны для Windows. А полный список функций для работы с памятью в WinAPI есть здесь, их сотни на любой случай жизни. Можно даже внутри контекста чужого процесса выделить или освободить кусок памяти (обычно такое используется вирусами и прочей нечистью).
А что будет, если постоянно выделять, но не освобождать? А еще лучше: выделять, но терять адреса выделенной памяти. ОС достаточно быстро подскажет правильный ответ.
В теории есть несколько возможных выходов, можно даже обработать подобный случай и, к примеру, экстренно освободить всё выделенное (только если не терять указатели) или попытаться спасти нужные данные из разваливающейся программы, но если никаких действий не предпринять, то ОС заставит процесс экстренно прекратить свою деятельность и существование.
Случай с потерей указателей на выделенную память называется утечкой памяти и ее последствия необратимы. Но как только ОС завершает выполнение процесса, то вся его память, даже утекшая, становится снова свободной.
Отслеживание правильности выделения и освобождения памяти является достаточно сложной и опасной задачей, особенно если требуется обеспечивать стабильность и безопасность (лучше даже не думать, что будет, если рукожопый программист забьет на MISRA и устроит утечку памяти в подсистеме тормозов в Тесле), и практически невыполнимой в некоторых парадигмах (особенно в функциональном программировании). Поэтому еще с древнейших времен (с 1959 года) существуют языки со сборкой мусора:
Но несмотря не это, практически все современные языки используют сборку мусора, кроме C++ и Rust. C++ по большей части перешел на умные указатели, которые тоже считают количество активных ссылок, но делают это без сборщика мусора. А Rust использует свой уникальный Borrow Checker, который понимают только растофилы.
На этом вроде у меня всё.
В последнее время чё-т я совсем обленился, но продолжаю вивисекцию вомбатных.
Свежий набросок. Не уверен, увидит ли он свет (негде хостить и риск DDoS), но зато теперь я могу читать Вомбат даже в MS-DOS из текстового Links. И в Firefox 2 со всеми картинками (конвертация из WebP на сервере). Вход в аккаунт пока не планируется, хотя и возможен. Видео тоже реализуемы, но проблемно.
Меня достаточно долгое время раздражала нелогичная скругленность интерфейса сайта. Несмотря на то, что так сейчас делают везде, это модно и соответствует передовым принципам дизайностроения, я остаюсь фанатом Windows 8/старых версий Windows 10/Dear ImGui в плане дизайна, с их идеально острыми углами. Некоторым извращенцам еще Windows Phone нравился. Плюс квадратность рож вомбатов определенно намекает, что рожа сайта тоже должна быть квадратной.
Помимо этого были обозначены дополнительные функции: скачивание видео и поиск по тегу. Они есть в TODO сайта и де-факто это можно делать вручную, но неудобно и не все знают/могут.
Первый день начался с... создания нового скрипта GreaseMonkey, вспоминания основ CSS и установки радиуса скругления на всех элементах страницы в 0. Сделано это было довольно быстро, после чего к основным блокам были добавлены рамки. Результат получился довольно неплохим (субъективно), хотя и не без проблем. Круговой индикатор загрузки превратился в 2 шпалы, решил не исправлять. Напоминает предыдущую итерацию дизайна Pikabu (2020) до скругления и удаления рамок.
Следующие две ночи я провел в попытках отследить все видео на странице и окна поиска. Получилось крайне колхозно и ненадежно (вероятно сломается при следующем обновлении), но оно работает. Зато загрузка видео выглядит так, как будто это родная функция. Еще нажатием с Alt можно скопировать прямую ссылку, хотя этого лучше избегать из-за возможного перемещения адреса сервера.
Поиск по тегу помимо уродского дизайна не учитывает одну большую проблему: теги регистрозависимые. То есть "кот" и "Кот" приведут к разным результатам, а еще "вомбат шаббат" и "вомбатшаббат". Решить с клиентской части это невозможно, а с серверной все равно создает много проблем и единственным вариантом я вижу слияние одинаковых тегов в разных регистрах и создание команды модераторов, которые будут приводить теги к единообразию. Но это уже не моя компетенция, в остальном поиск по тегу работает как и должен.
Меню настроек было написано в промежутке с 3 до 6 утра сегодняшнего дня, не вижу смысла заострять внимание. Почему разработчики GreaseMonkey не сделали нормальных штатных функций для этого - ХЗ.
Скачать или полюбоваться на чудеса говнокодостроения можно здесь. Требуется любой менеджер скриптов по вкусу (TamperMonkey (я использую его), GreaseMonkey, ViolentMonkey, т.д.). Chrome умеет устанавливать скрипты как расширения, но у меня используются специфичные функции, которые им напрямую не поддерживаются.
Просьба Он писался человеком, который впервые увидел JS и CSS3 после одиночного знакомства с CSS2 и HTML4 много лет назад. Плюс оно работает, а остальное уже не так важно (есть косяк с тем, что скрипт загружается раньше React и сбивает его с толку, но на работоспособность это вроде не влияет). Еще он должен работать в мобильном Firefox, но я не тестировал. Но поиск по тегам работать точно не будет, исправлю в следующей версии.сильно не бить за качество кода.
Активно поддерживать не обещаю (С), но пока я буду пользоваться сайтом, скрипт должен обновляться. Идеи по новым функциям, исправления или баги можно озвучить в комментариях