tgindex
Верхняя полка📝

Верхняя полка📝

Статистика
@stopshelfрусский

Путевые заметки программного инженера и легкоатлета-любителя. Автор: Владимир @Toparvion Плизга Домашняя страница: https://toparvion.pro/

Последний пост
13 авг.
Последнее чтение
12:45
Постов за неделю
2
Всего постов
26
Тип
открытый
Язык
русский
В каталоге с
13 авг.
Подписчики
359
0 за 3 дн.
Сутки
0
0,00%
Неделя
 
Месяц
 
Просмотров на пост
211
24 постов
Вовлечённость
58,8%
к подписчикам
Постов в день
0,3
всего 26
Упоминаний
0
каналов
Охват размещения
оценка
1/24сутки в ленте
133
1/48двое суток
152
1/72трое суток
164

Оценка по просмотрам недавних постов: пост набирает почти всё за первые сутки.

Посты

  • Мой текущий статус ☝🏼 А сколько у вас?

  • Коллеги, Доброго дня! А мы опубликовали следующее выступление с нашего митапа: Владимир Плизга — «Профилирование Java-приложений: подходы и инструменты». https://youtu.be/WLGYUvVt2Kk Заходите, смотрите, делитесь своим мнением, подписывайтесь и ставьте лайки — это очень важно для продвижения канала и поможет нам быстрее развивать контент!

  • Если вдруг вы пропустили, сообщаю, что опубликованы результаты опроса State of Java 2026. Они доступны всем желающим в виде небольшой, но ёмкой презентации: https://jokerconf.com/research/state-of-java/2026/presentation.html Напомню, что это был обстоятельный опрос #Java-разработчиков обо всём, что касается их профессии: от используемых языковых конструкций до желаемых зарплат. Я призывал вас принять в нём участие в апреле, а теперь пора пожинать плоды посмотреть, что получилось 👀 Для меня наиболее любопытными оказались мифы про VirtualThreads 🆚 WebFlux и про распределение желаемых зарплат по регионам. А что запомнилось вам? 👐

  • 4 авг.269187

    Отлов спорадичных багов с помощью BTrace 👣 Один из забористых багов, с которым мне довелось "развлекаться" в преддверии отпуска, сочетал в себе много интересного: — воспроизводился только на удалённом сервере в контуре партнёра; — требовал одновременных действий минимум 2-х человек; — не имёл чёткого набора шагов, а только некий паттерн; — из-за этого требовал по несколько попыток, чтобы проявиться. Как не трудно догадаться, там была замешана гонка потоков. Она сильно осложняла диагностику, и даже удалённое подключение отладчиком через SSH-туннель не давало результата — как только один или несколько потоков оказывались под отладкой, они переставали "шалить" и укладывались в положенные временные рамки. Словом, типичный гейзенбаг — существует только пока за ним никто не наблюдает 👻 Втыкать логирование в разные места кода и таким образом постепенно локализовывать проблему было можно, но уж очень долго и утомительно — нужно было бесконечно готовить патчи, выносить их на этот (довольно нагруженный) сервер и перезапускать его, ожидая полного прогрева. Я даже попробовал, но уже на второй итерации мне это разонравилось🤢 И тогда мне вспомнился BTrace — диагностический инструмент под зонтиком OpenJDK, позволяющий внедрять в байт-код работающего приложения различные инъекции (прямо на #Java) для доставания почти любых данных из полей и локальных переменных, в том числе аргументов методов. Из-за того, что такими инъекциями можно наломать дров, в BTrace придуман специальный DSL, сильно ограничивающий допустимые действия (например, нельзя вызывать почти никакие методы прикладного кода), но позволяющий безопасно "снюхивать" данные из многих точек приложения 👃 Основной фичей BTrace в этот раз для меня стало отслеживание зависимых вызовов — это когда для заданного метода агент реагирует не на любые вызовы, а только на те, которые произошли из тела другого (тоже заданного) метода. В тексте BTrace-скрипта выглядит это примерно так (сокращённо): @OnMethod(clazz = "SpreadsheetSession" , method = "handleCellValue" // метод-инициатор вызова , location = @Location(value = Kind.CALL , clazz = "SpreadsheetSession" , method = "calculateCellsDependentOnSingle")) // целевой (проблемный) метод public static void handleCellValue( @TargetMethodOrField String method, @ProbeMethodName String probeMethod, AnyType cellAbsRef, boolean hasManualInput) { // ... String spreadsheet = str(Reflective.get("entity", cellAbsRef)); // извлечение данных через DSL // вывод извлеченных данных (тоже на DSL) println(method + " from " + probeMethod + ": " + spreadsheet + ":" + column + row + ", manualInput: " + hasManualInput); } Это похоже на зависимые точки останова в отладчике, только никакого останова не происходит, а собранные данные выводятся в консоль, из которой запущен BTrace 🖥 Конечно, первое применение BTrace требует сильно больше времени, чем повтыкать System.out.println() или подцепиться отладчиком. Но зато потом, когда механизм освоен и отлажен, итерации диагностики вида "написал-применил-посмотрел-повторил" укорачиваются до нескольких минут и позволяют эффективно локализовывать даже такие упоротые изощрённые проблемы, как эта 🧶 Надеюсь, вам никогда не придётся отлаживать такие баги. Но если вдруг, имейте в виду, что BTrace может в этом пригодиться ✍️ — P.S. Любопытно, что 10 лет назад, когда я не знал о BTrace (хотя он уже в каком-то виде существовал), я создал собственный инструмент jMint со схожей идеей: внедрять в работающее приложение кусочки кода на Java (дроплеты), чтобы менять его поведение с целью тестирования и/или отладки. Основное отличие jMint — в отсутствии "безопасного" DSL. Причина здесь не только в слабоумии и отваге автора, но и в стремлении дать возможность заглушать нежелательное поведение или временно менять интересующее. Поэтому применение инструмента было строго ограничено тестовым контуром. Несмотря на опасности и ограничения, он неплохо прижился в моей прошлой команде и какое-то время продолжал применяться после моего ухода. Подробнее о нём можно узнать здесь 📖 —

  • видео или голосовое, без подписи

  • видео или голосовое, без подписи

  • видео или голосовое, без подписи

  • видео или голосовое, без подписи

  • видео или голосовое, без подписи

  • Например, о том, что последовавшие за отпуском выходные оказались богатыми на #спорт 👇🏼 Сначала я поучаствовал в ежегодном местном заплыве на 5 км и, несмотря на отсутствие плавательных тренировок в отпуске, показал неплохой результат, умудрившись даже занять 3-е место в своей возрастной категории. Правда, здесь есть нюанс — всего пловцов в ней было... 4 🤭 А на следующий день мне довелось впервые сбегать 10 км в рамках благотворительного забега "Достигая цели", приуроченного ко дню железнодорожника. Здесь конкуренция была существенно выше — в мужском абсолюте среди 107 бегунов мне удалось стать лишь 17-ым. Учитывая, что специально к такой дистанции я не готовился, считаю этот результат хорошим 👌 После таких выходных, знаете ли, приятно возвращаться к работе и осознавать, что она сидячая 🫠

  • видео или голосовое, без подписи

  • видео или голосовое, без подписи

  • видео или голосовое, без подписи

  • видео или голосовое, без подписи

  • видео или голосовое, без подписи

  • видео или голосовое, без подписи

  • видео или голосовое, без подписи

  • видео или голосовое, без подписи

  • видео или голосовое, без подписи

  • 3 авг.182141

    Как не трудно догадаться, если канал вдруг затих на две недели, значит, его автор в отпуске. Так и есть, на сей раз в Горном Алтае 🏞 Но если раньше я всё же старался продолжать заниматься личными проектами и в отъездах, то нынче отпуску предшествовала такая запрессовка по работе, что на ноутбук не хотелось даже смотреть. Вкупе со слабеньким интернетом в горах, это сподвигло меня устроить цифровой детокс, и в последующие 10 дней я не открывал ноутбук вообще, а телефон использовал по минимуму. Должен признаться, мне понравилось; рекомендую 👍 Зато удалось много походить по небольшим горам, побегать вдоль завораживающих пейзажей, поплавать на лодке, катере, каяке и сапе — словом, осуществить ту пресловутую "смену обстановки", что иногда так необходима для поддержания нормальной работоспособности 👷‍♂️ А теперь можно приступать к новым делам и продолжать делиться новостями, благо, они есть 🙂

Верхняя полка📝 — tgindex