Читать в телеге. Когда-то там были посты не только от меня.
Перепрошивка флешки
Друзья подкинули флешку на 32Гб, которая определялась на винде как 8Мб. Несколько часов с ней ковырялся, что только не делал: и форматировал, и таблицу разделов перетирал, и с помощью dd
в нули все переписывал, клонировал таблицу разделов с рабочей флешки, перепробовал кучу утилит, которые на самом деле делали одно и то же, даже использовал фирменную утилиту от производителя для “восстановления” флешки. Ничего не помогало, даже на самом низком уровне размер флешки определялся как 8 Мб.
Потом я решил сделать ход конем: включить мозги. Как определяется размер флешки? Есть два возможных способа — либо по VID/PID, либо флешка говорит о нем сама. Поскольку моделей флешек миллиард, то верен второй вариант. Значит, надо что-то сделать с контроллером на самой флешке. В общем, мозги иногда полезно включать, всем рекомендую:)
После этого я смог сделать правильный запрос и найти программу по перепрошивке по VID/PID. Набор приложений, сделанных под MFC (эх, помню лабу на первом курсе про такое), ноль UX, и ничего не понятно, благо, хоть инструкцию можно найти. После нескольких тыков флешка перепрошита и работает как надо. А потом и статья на Хабре нашлась про это.
Работает программа перепрошивки только на винде — шах и мат, линуксоиды!
Настройка kafka
Понял, что тут ничего нет про настройку кафки. Так-то есть очень подробная документация, но кто ж ее в наши дни читает.
Почти каждый доклад про кафку на любой конференции начинается про описание ее архитектуры.
По настройке обычно истории очень похожи: жили — не тужили с настройками по умолчанию, потом что-то сломалось, прод упал, начали бегать, что-то поднастроили и стало все хорошо. Более-менее цельно подобная история рассказана в этом докладе. Там, конечно, веселые ребята с тестами на проде и с cron-скриптами на PHP, но про настройки брокеров хотя бы более-менее дельно рассказали.
Инструкция по отмене почти всего в git
Никаких откровений там опытный пользователь не найдет, но хорошо иметь под рукой, как шпаргалку.
Ограничение запросов ElasticSearch со стороны клиента
ElasticSearch — классная штука, но он не всемогущ. Некоторые запросы могут привести к OOM в кластере. Это может случиться по разным причинам, но в основном связано с дополнительными функциями: подсветка (создает мини-индекс в памяти), агрегации и т.п. — сам по себе поисковый запрос ничего не положит, если только настройки кластера не совсем убогие. Однако есть способы ограничить поисковый запрос на стороне клиента:
timeout
— по умолчанию его нет, но это можно изменить.terminate_after
— ограничивает максимальное число документов, возвращаемое с одной шарды. Хорош в тех случаях, когда поиск подразумевает небольшое число результатов.
UPD: однако с этими настройками стоит быть аккуратнее: они могут вести себя не очень предсказуемо при наличии сортировки: не факт, что будут выданы именно первые результаты.
Недавние открытия из мира сортировок
Перед новым годом наткнулся на две интересные статьи про алгоритмы.
- Алгоритм сортировки, основанный на ML: http://learningsys.org/sosp19/assets/papers/22_CameraReadySubmission_Abstract___SOSP__19_ML_Sys_workshop-4.pdf Меня удивило, что даже в таких низкоуровневых задачах машинное обучение тоже имеет какое-то применение. Алгоритм основан на поразрядной сортировке.
- Способы получения k-ой порядковой статистики: https://danlark.org/2020/11/11/miniselect-practical-and-generic-selection-algorithms/. Эта статья — от передовика оптимизаций: по итогам этого исследования автором был сделан патч в ClickHouse.
Динамические тесты в JUnit и Before/AfterEach
Вляпался недавно с динамическими тестами в ограничение JUnit: динамические тесты — неполноценные участники жизненного цикла, и, как следствие, для них не вызываются методы @BeforeEach
и @AfterEach
. Точнее запускаются, но перед фабрикой динамических тестов:
@BeforeEach
fun init() {
println("init stage")
}
@AfterEach
fun cleanup() {
println("clean up stage")
}
@TestFactory
fun dynamicTests() = listOf("dynamic1", "dynamic2").map { name ->
dynamicTest("dynamic $name") {
println("dynamic $name test")
assert(true)
}
}
Выведет:
init stage
dynamic dynamic1 test
dynamic dynamic2 test
clean up stage
Приходится в таких случаях использовать параметризованные тесты, хоть они и выглядят менее пристойно.
Анатомия GNU/Linux
В каждом утюге эта статья была, пусть будет и в моем.
Она немного поверностная, но хорошо дает обзор основных подсистем с точки зрения пользователя.
Сборка контейнера со Spring-приложением
В новых версиях спринга появилась возможность создавать docker-образ через maven/gradle. Работает это через Cloud Native Buildpacks, все правильно раскладывается по слоям и выставляются оптимальные настройки JVM.
Звучит, конечно, прикольно, но если бы настройки JVM можно было посчитать автоматом — то почему они для всех приложений не определяются автоматом? Сомневаюсь, что утилита знает о характере вычислений и профиле нагрузки на приложение. Впрочем, может, это никому и не надо, сейчас проще накинуть пару лишних гигов оперативки, чем разбираться в нюансах.
Но настораживает и другой тренд: сейчас система сборки обрастает плагинами, которые позволяют не только собирать приложение, но еще и управлять его версиями, ветками git, сейчас вот и докер собирать. Что дальше — деплоить на прод через maven, потому что так удобнее? Только в кубер, конечно же. CI/CD не нужны, все пихаем в исходный код!
Как будто и не помнит никто уже про Nero Burning ROM. Супер-аппы в духе времени: почта продает продукты, такси доставляет еду, магазин выдает посылки, банк продает авиабилеты, в инстаграмме постят лонгриды, в IDE встаивают видеочаты и т.д.
Inline-бот для кода
Раньше было лень открывать IDE — открывал онлайн-IDE. Сейчас можно еще больше облениться и просто писать боту в телеге.
@rextester_bot brainfuck
+[--------->++<]>.---------.------.++++++++.-[++>---<]>+.---[----->++<]>.---.---..
Бот — простой фасад к http://rextester.com.
Поддерживает все популярные языки. Интересно, какая у них там песочница? Она спокойно позволяет запускать ps aux
и ls /
. Выпускники ИБ — это ваш шанс почувствовать себя кулхацкерами, не выходя из телеги:)
Принудительное скачивание исходников
Иногда IntelliJ жестко тупит и не скачивает исходники библиотек в проекте с maven, какие бы настройки ни стояли, и сколько бы ты не нажимал “Download Sources”. Помогут команды
mvn dependency:sources
mvn dependency:resolve -Dclassifier=javadoc
Первая скачает все доступные исходники ко всем зависимостям, а вторая — еще и javadoc к ним.
В sbt это можно сделать командой sbt updateClassifiers
(хотя я это не проверял).
А вот в gradle такого вроде нет (с другой стороны, я и не припомню проблем с этим, может IntelliJ была со старыми иконками и работала нормально).