Pull to refresh
22
0.2
Даниил Солопов @dan_sw

Software Engineer, Bachelor of Computer Science

Send message

Как 20-летний баг GTA San Andreas всплыл в Windows 11 24H2

Level of difficultyEasy
Reading time14 min
Views39K

Я занимаюсь разработкой SilentPatch, исправляющего ошибки старых игр серии GTA и других игр. В issue tracker проекта на GitHub я получил недавно очень специфичный отчёт о баге:

Самолёта Skimmer нет в Windows 11 24H2

Когда я обновил Windows до версии 24H2, самолёт Skimmer полностью пропал из игры. Его невозможно создать с помощью трейнера или найти на обычных точках спауна. Я играю и в версию с модами (которая до обновления Windows была абсолютно нормальной), и в «ванильную» с единственным установленным silentpatch (я пробовал версии silentpatch за 2018 год, 2020 год и самую новую). Самолёт всё равно не спаунится в игре.

Если бы я услышал о подобном впервые, то посчитал бы сомнительным и заподозрил, что дело может быть в чём-то другом, а не конкретно в Windows 11 24H2. Однако на GTAForums я получал комментарии точно о такой же проблеме с ноября прошлого года. Некоторые из пользователей винили в ней SilentPatch, однако другие говорили, что то же самое происходит и в игре без модов:

Очевидно, Skimmer не может заспауниться при игре в Windows 11 24h2; надеюсь, этот баг устранят.

Дополнение: кажется, я подтвердил это — создал виртуальную машину с Windows 11 23h2, и этот чёртов самолёт замечательно спаунится; апдейт той же виртуальной машины до 24h2 ломает Skimmer. Остаётся только догадываться, почему небольшое обновление операционной системы в 2024 году ломает какой-то левый самолёт в игре 2005 года.

После нового обновления Silent patch из игры пропадает Skimmer, а когда я пытаюсь создать его с помощью RZL-Trainer или Cheat Menu пользователя Grinch, игра зависает и приходится закрывать её через Диспетчер задач.

[…] Я был вынужден обновиться до 24H2, и после апдейта у меня возникла та же проблема со Skimmer в GTA SA, что и у остальных. Это значит, что проблему вызывают не моды или что-то другое: она возникла после свежего обновления Windows.

Читать далее

Bad USB — сильнее чем кажется на первый взгляд

Level of difficultyMedium
Reading time8 min
Views17K

Сегодня разберемся с довольно старым но очень даже актуальным методом инфицирования системы, рассмотрим нестандартные приемы Bad USB о которых почему-то мало пишут но и тайной они не являются (такие как: ALT-коды, запуск от имени администратора, обход Windows Defender и зачистка следов).

Читать далее

Обработка Segmentation Fault в C++

Reading time3 min
Views72K

Вводная


C++ является «небезопасным» («unmanaged») языком, поэтому программы могут «вылетать» — аварийно завершать работу без сохранения данных пользователя, сообщения об ошибке и т.п. — стоит только, например, залезть в не инициализированную память. Например:
void fall()
{
  char * s = "short_text";
  sprintf(s,"This is very long text");
}

или
void fall()
{
  int * pointer = NULL;
  *pointer = 13;
}


Всем было бы лучше, если бы мы могли «отловить» падение программы — точно так же, как в java ловим исключения — и выполнить хоть что-то перед тем, как программа упадет (сохранить документ пользователя, вывести диалог с сообщением об ошибке и т.п.)

Общего решения задача не имеет, так как C++ не имеет собственной модели обработки исключений, связанных с работой с памятью. Тем не менее, мы рассмотрим два способа, использующих особенности операционной системы, вызвавшей исключение.

Читать дальше →

Устраняем ошибки, связанные с SIGSEGV: ошибка сегментирования в контейнерах Linux (код возврата 139)

Level of difficultyHard
Reading time7 min
Views19K
image

Сигнал SIGSEGV, применяемый в Linux, означает нарушение сегментирования в рамках работающего процесса. Ошибки сегментирования возникают из-за того, что программа пытается обратиться к участку памяти, который пока не выделен. Это может произойти из-за бага, случайно вкравшегося в код, либо из-за того, что внутри системы происходит некая вредоносная активность.

Сигналы SIGSEGV возникают на уровне операционной системы, но столкнуться с ними также вполне можно и в контексте контейнерных технологий, например, Docker и Kubernetes. Когда контейнер завершает работу, выдав код возврата 139, дело именно в том, что он получил сигнал SIGSEGV. Операционная система завершает процесс контейнера, чтобы предохраниться от нарушения целостности памяти.

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

В этой статье будет объяснено, что представляют собой сигналы SIGSEGV, как они влияют на работу ваших контейнеров с Linux в Kubernetes. Также я подскажу, как отлаживать ошибки сегментации в вашем приложении, а если они возникают – как с ними справляться.
Читать дальше →

Как работает Cargo

Level of difficultyEasy
Reading time6 min
Views3.8K

Привет, Хабр!

На дворе 2025, и у каждого языка свой подход к сборке, зависимостям и публикации. В Rust за это отвечает Cargo — инструмент, который берёт на себя всё: от менеджмента зависимостей до тестов, бенчмарков и выкладки на crates.io.

И вот это мы и рассмотрим в статье: как устроен Cargo изнутри, зачем нужен Cargo.toml, как подключать зависимости, куда падают артефакты сборки, что делает cargo check, как запускать и бенчмаркать, и как наконец создать свой крейт на crates.io.

Читать далее

React Reconciliation: скрытый механизм, управляющий компонентами

Level of difficultyEasy
Reading time11 min
Views4.1K



❯ Механизм согласования


В моих предыдущих статьях (1, 2) я подробно рассматривал, как работает React.memo, а также делился более эффективными подходами к оптимизации производительности с помощью компоновки. Однако для глубокого понимания работы React необходимо разобраться в основном механизме, лежащем в основе всех этих оптимизаций – алгоритме согласования (reconciliation).


Согласование – это процесс, в результате которого React приводит DOM в соответствие с деревом компонентов. Именно этот механизм позволяет реализовать декларативный подход к программированию на React: вы формулируете свои намерения, а React самостоятельно определяет, как выполнить эти намерения наилучшим образом и с наименьшими затратами.

Читать дальше →

Релятивистская трассировка лучей

Level of difficultyHard
Reading time14 min
Views13K

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

Для этого, мы сначала выведем уравнения движения лучей света, напишем интегратор Рунге-Кутты на GLSL, и наконец, объединив одно с другим, получим фрагментный шейдер, который вычисляет путь лучей, отправленных из камеры назад во времени.

Читать далее

Пишем на С++ вектор, умеющий расширяться без копирования элементов

Reading time9 min
Views25K

В языке С есть функции malloc, free и realloc. При использовании последней вы можете написать этакий расширяющийся массив из примитивных типов или структур (классов-то нет), который, можно надеяться, не будет копировать все данные при каждом расширении. В С++ есть встроенный класс vector, который представляет из себя расщиряющийся массив, но он так не умеет: при каждом расширении вектора выделяется новый участок памяти и все элементы перемещаются на него (по возможности, с использованием move-семантики). Но ведь, если можно каждый раз не копировать все старые элементы на новое место, вектор должен работать быстрее? В этой статье я попробую написать вектор, который умеет расширяться без копирования элементов.

Код приведён здесь.

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

Читать далее

UB or not UB: дублируем элемент std::vector

Level of difficultyMedium
Reading time10 min
Views7.1K

В статье выясним, можно ли с точки зрения стандарта языка C++ тривиальным вызовом push_back продублировать элемент std::vector. Отвечая на простой вопрос, столкнемся с более интересными: что собой представляет внутренний мир вектора, как "протухают" итераторы при реаллокации, какие ограничения добавляют гарантии безопасности относительно исключений...

Читать далее

Выявляем повторную передачу пакетов в сети

Reading time6 min
Views4.8K

Медленная работа сети — проблема, с которой сталкиваются многие специалисты. В отличие от очевидных обрывов связи, «тормоза» зачастую трудно диагностировать, и найти их причину может быть не так просто. В этой статье мы разберем механизмы, лежащие в основе одного из таких случаев — повторной передачи пакетов в TCP-сети. Вы узнаете, как работает этот процесс, какие инструменты можно использовать для диагностики, а также как на практике выявлять и устранять проблемы с производительностью сети, связанные с потерей пакетов.

Читать далее

История о потоке UI, зависавшем при вызове ядра

Reading time5 min
Views1.9K

Однажды клиент обратился ко мне с вопросом о застарелом, но частом зависании, причину которого никак не удавалось выявить. Насколько можно было судить, поток пользовательского интерфейса направлял вызов в ядро, и этот вызов просто зависал без видимых причин. К сожалению, в дампе ядра не выводился  стек пользовательского режима, поскольку стек был вытеснен из памяти. Причём, это логично: ведь зависший поток не использовал свой стек. Поэтому, как только в системе возникал дефицит памяти, этот стек из памяти вытеснялся.  

Читать далее

Когда линковщик предаёт: как одинаковые символы из разных библиотек ломают ваше приложение

Level of difficultyHard
Reading time4 min
Views1.7K

При линковке приложения с двумя статическими библиотеками, в которых определён один и тот же символ, возникает классическая и потенциально фатальная проблема — двойное определение символа. Вроде бы всё просто: multiple definition — ошибка, надо переименовать. Но не тут-то было.

Разберёмся, как устроен линковщик, почему конфликты могут не проявляться сразу, и как на проде всё может пойти не так. Ну и конечно, как эту проблему исправить, не трогая архитектуру проекта.

Читать далее

Книга: «Создание фронтенд-фреймворка с нуля»

Reading time3 min
Views4.5K
Привет, Хаброжители!

Мы используем фронтенд-фреймворки каждый день. А понимаем ли мы, что происходит там, под капотом? Книга Анхеля Солы Орбайсеты «Создание фронтенд-фреймворка с нуля» предлагает уникальный подход к изучению этой темы — через практическое создание собственного фреймворка. Автор убежден, что лучший способ понять принципы работы фреймворков — самостоятельно реализовать их ключевые механизмы.
Читать дальше →

Новые архитектуры нейросетей

Reading time10 min
Views57K

Новые архитектуры нейросетей


Network


Предыдущая статья «Нейросети. Куда это все движется»


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


Статья не претендует на полноту охвата и хорошее понимание прочитанных «по диагонали» статей. Автор уверен, что пока писал эту статью, появилось еще много новых архитектур. Например, смотрите здесь: https://paperswithcode.com/area/computer-vision.

Читать дальше →

Как генерируется PID-ы в Linux

Level of difficultyEasy
Reading time3 min
Views9.9K

Вы когда-нибудь задумывались, что происходит за кулисами, когда мы запускаем или завершаем процесс? В этом уроке мы узнаем, как Linux генерирует PID для процессов.

Читать далее

Я ушёл на больничный и узнал, что работал за троих (а платили за одного)

Level of difficultyEasy
Reading time8 min
Views135K

В нашей компании всегда было… скажем так, интенсивно. Не то чтобы прямо ад, но бодренько. Обычно у меня было 2–3 проекта одновременно, дедлайны плотненькие, но справлялся. Я даже гордился тем, что мог вытаскивать сложные ситуации.

Читать далее

Введение в концепцию «потока» в левел-дизайне — Часть 1

Level of difficultyEasy
Reading time11 min
Views3.4K

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

Но что именно представляет из себя поток в контексте левел‑дизайна и почему он так важен для создания увлекательного игрового процесса? В этом руководстве мы подробно разберем концепцию «потока» и как ее использование может превратить ваш уровень (и, как следствие, игру!) в нечто впечатляющее.

Читать далее

Альтернативы накрутке опыта

Level of difficultyEasy
Reading time7 min
Views7.6K

В этой статье не будет обсуждаться нравственная сторона «накрутки опыта», насколько она эффективна. На это раз просто хочу рассказать про стажировки, школы дополнительного образования и прочие активности, про которые забывают, либо во все не знают.

Читать далее

Всё, что я узнал о запуске локальных языковых моделей

Level of difficultyEasy
Reading time19 min
Views28K

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

В статье подробно разобраны разные виды LLM, их особенности и сценарии использования. Какие модели лучше подходят для программирования? Какие эффективнее справляются с переводами, генерацией текста или анализом больших объемов данных? Автор статьи Chris Wellons* протестировал популярные открытые модели — Mistral, Qwen, DeepSeek-Coder, Mixtral, Llama 3.1 и другие, — чтобы понять их сильные и слабые стороны. Также автор делится опытом и практическими советами, которые помогут вам запустить и использовать LLM на собственном оборудовании. Хотите разобраться, какую модель выбрать под свои задачи и как эффективно запустить её на локальном оборудовании? Тогда приступим!

*Обращаем ваше внимание, что позиция автора может не всегда совпадать с мнением МойОфис

Читать далее

XML vs Compose, не можете решить? Часть 1: Введение

Level of difficultyMedium
Reading time2 min
Views3.3K

Jetpack Compose — не просто «альтернатива XML». Это совершенно другой парадигмальный сдвиг в том, как Android отрисовывает и управляет UI. Но чтобы по‑настоящему понять, чем Compose отличается от привычного XML, давайте посмотрим, что происходит под капотом в каждом случае.

Читать далее

Information

Rating
3,913-th
Location
Иркутск, Иркутская обл., Россия
Date of birth
Registered
Activity

Specialization

Software Engineer, ML Engineer
Middle
C++
Python
TENSORFLOW
Pytorch
Cmake
Linux
Deep Learning
Cuda
Computer Science
Keras