Обновить
28
0.4
Даниил Солопов @dan_sw

Software Engineer, Bachelor of Computer Science

Отправить сообщение

Гуманитарий среди технарей: как общаться, чтобы вас не захотелось замьютить

Уровень сложностиПростой
Время на прочтение9 мин
Количество просмотров2.1K

Как не оказаться «Барби»/«Кеном» в комнате с «Опенгеймерами»?

Привет, Хабр! Меня зовут Антон Смирнов, я веду телеграм канал Аналитика сегодня, вот уже более 8 лет руковожу различными командами разработки и я тот самый человек, который приходит к разработчику с задачей «ну ты там сам посмотри, как лучше сделать». Эта статья выросла из моего доклада для закрытого комьюнити Skillbox IT Experts, где мы обсуждаем, как делать крутые продукты, несмотря на разный профессиональный бэкграунд.⠀

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

У меня гуманитарное образование (международные экономические отношения) и для большинства разработчиков я мыслю скорее как гуманитарий. При этом я руковожу продуктовой командой из 28 человек и в работе некоторых из них понимаю меньше 50%. Иногда это мешает, а иногда помогает: чтобы наладить диалог с технарями, совсем не обязательно самому быть инженером. Нужно просто понимать, как они думают, и уметь переводить «между мирами» бизнеса и разработки — об этом и будет статья.

Читать далее

Личный бренд в IT: как перестать быть «невидимкой» и начать получать повышения, приглашения и создавать сайд-проекты

Время на прочтение7 мин
Количество просмотров47K

В IT принято думать, что имя делают строчки кода. Но когда ты уже senior, CTO или фаундер — код больше не говорит за тебя.

В этой статье расскажу, зачем специалистам и лидерам в IT личный бренд, какие заблуждения мешают его выстраивать, и как он влияет на доход, карьеру и входящие предложения. С конкретикой, кейсами и системой оценки. Без блестящих фотосессий.

Читать далее

Android TOML. Просто о каталогах зависимостей в Android Studio

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров6.9K

Всем привет!

Меня зовут Евгений и я Android‑разработчик. Сегодня хотел бы поделиться своими знаниями и наблюдениями относительно нового способа добавления зависимостей в проекты, созданные на базе Android Studio Iguana.

Читать далее

Подробное руководство по Logcat в Android Studio с примерами

Уровень сложностиПростой
Время на прочтение11 мин
Количество просмотров29K

Logcat в Android Studio имеет множества функций, которые ускоряют отладку, тестирование и в целом поиск нужной информации в логах. Однако, большинство в лучшем случае использует только поиск по ключевому слову и даже не подозревают как сильно могут ускорить свою работу.

Здесь я расскажу про Logcat в Android Studio, какие у него есть возможности, как его кастомизировать и использовать по максимуму, с практическими советами в каких ситуациях та или иная фича может вам пригодиться. Материал будет полезен как начинающим тестировщикам, так и матёрым разработчикам, ведь это универсальный инструмент, ускоряющий работу, если знать о всех его хитростях.

Читать далее

Обобщенный алгоритм Дейкстры

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров5.5K

Хочу поделиться знанием, которое не является секретом, в каких-то курсах по алгоритмам оно наверняка дается, но нагуглить его совсем не просто. Поэтому пусть будет.

Алгоритм Дейкстры можно обобщить на произвольную функцию длины пути, если только она удовлетворяет трем условиям:

Монотонность. При добавлении ребра к пути, его длина не уменьшается.

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

Оптимальность префикса. Если к двум путям приписать одинаковое ребро, то кратчайший путь останется кратчайшим.

Под катом я привожу доказательство корректности обобщенного алгоритма и показываю, как его применить в задаче на литкоде: Trapping rain water II.

Читать далее

DevOps инфраструктура для стартапов ч.1

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров12K

Мы — команда студентов из ИТМО, которая прошла путь от хакатонов до продуктовой разработки. На собственном опыте расскажем, как выстроили инфраструктуру, способную масштабироваться, переживать сбои и не стоить, как полкоманды в найме.

Когда вы только начинаете делать стартап, инфраструктура кажется чем-то второстепенным. Важнее MVP, фичи, дизайн, пичдек. Но в какой-то момент всё внезапно перестаёт помещаться на одном сервере, руками деплоить становится больно, SSL не обновляется, а продакшн падает из-за перегрузки или забытого docker-compose up.

Kubernetes? Слишком сложно, долго и дорого. Монолит? Неудобно масштабировать. Мы искали третий путь — и нашли его.

Читать далее

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

Уровень сложностиПростой
Время на прочтение14 мин
Количество просмотров40K

Я занимаюсь разработкой 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 — сильнее чем кажется на первый взгляд

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров19K

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

Читать далее

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

Время на прочтение3 мин
Количество просмотров72K

Вводная


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)

Уровень сложностиСложный
Время на прочтение7 мин
Количество просмотров21K
image

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

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

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

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

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

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров4.8K

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

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

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

Читать далее

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

Уровень сложностиПростой
Время на прочтение11 мин
Количество просмотров5.4K



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


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


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

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

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

Уровень сложностиСложный
Время на прочтение14 мин
Количество просмотров13K

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

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

Читать далее

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

Время на прочтение9 мин
Количество просмотров26K

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

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

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

Читать далее

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

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров7.2K

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

Читать далее

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

Время на прочтение6 мин
Количество просмотров5.9K

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

Читать далее

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

Время на прочтение5 мин
Количество просмотров2K

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

Читать далее

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

Уровень сложностиСложный
Время на прочтение4 мин
Количество просмотров1.7K

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

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

Читать далее

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

Время на прочтение3 мин
Количество просмотров4.9K
Привет, Хаброжители!

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

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

Время на прочтение10 мин
Количество просмотров58K

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


Network


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


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


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

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

Информация

В рейтинге
2 180-й
Откуда
Иркутск, Иркутская обл., Россия
Дата рождения
Зарегистрирован
Активность

Специализация

Software Engineer, ML разработчик
Средний
C++
Python
TensorFlow
PyTorch
Cmake
Linux
Deep Learning
Cuda
Computer Science
Keras