Верхняя полка📝
362 subscribers
284 photos
11 videos
3 files
145 links
Путевые заметки программного инженера и легкоатлета-любителя.

Автор: Владимир @Toparvion Плизга

Домашняя страница: https://toparvion.pro/
Download Telegram
Одним из участников текущего бизнес-акселератора А:Старт, о котором я упоминал здесь ранее, является мой хороший товарищ с любопытным проектом — виртуальным стилистом по одежде 👗

И хотя сама по себе идея не нова, этот проект примечателен тем, что основан на давно зарекомендовавшей себя методике подбора образов, которая используется профессиональными стилистами по всему миру. Но если раньше эта методика могла применяться исключительно людьми (всё же это не формальный алгоритм), то теперь стала посильна разуму искусственному, и, надо признать, он с ней неплохо справляется 👌

После череды неудач в применении ИИ к задачам, требующим строгого решения, мне начинает казаться, что вот в таких областях, как эта, он может проявить себя гораздо лучше. Ведь здесь нет формализованного порядка действий, а если для одних и тех же входных данных результаты будут немного отличаться от раза к разу, так это даже хорошо — "А то чё как дура всё время в одном и том же!?" 👧

Словом, тот случай, когда хочется верить, что применение ИИ вполне уместно 🎯
👍7
Небезызвестный в #Java мире Крис Ньюланд (a.k.a. ChrisWhoCodes) является автором множества полезных утилит для разработчиков. Но лично мне больше всего пригождается его VM Options Explorer — справочник всех поддерживаемых JVM опций для разных версий и дистрибутивов Java 📚

С его помощью можно узнать/вспомнить, как называется тот самый хитрый ключик, который в такой-то раз помог в(ы)ключить такую-то фичу или подтюнить то самое поведение Java-машины ⚒️

Заодно можно получить моральное облегчение от того, что ваши десятки никому непонятных флажочков в application.yaml — это сущие пустяки на фоне, например, Liberica JDK 21, у которой число опций командной строки почти достигает... Сколько бы вы думали? Правильно: 900! 😱
😨6😁31
Сибирь ассоциируется с лыжами у многих, но мало кто связывает её с морем, и уж тем более с лыжами на море🥴

Однако есть в году сезон, когда в наших краях эти два несвязанных понятия вдруг начинают друг друга гармонично дополнять. И этот сезон — сейчас. Судите сами:
— лёд Обского водохранилища ещё толстый (там много рыбаков, некоторые даже на машинах)
— снег на льду тоже ещё есть
— ночью заморозки
— днём плюсовая
— и так несколько суток подряд.
Всё вместе это ингредиенты для формирования наста — плотного, ровного покрова, катучего для беговых лыж 🚀

Однако хороший наст формируется не всегда, да и поймать его оптимальное состояние не просто — нужно приехать в один из тех самых считанных дней, причем обязательно утром. Сегодня как раз один из них ☀️

Погода нынче непростая, было уже много жарких дней, поэтому наслаждаться гладким настом почти не пришлось. Вместо этого было много рыхлых участков, снежных перемётов, ледяных луж и даже барханов — небольших холмов из снега. Ехать по всему этому в начале было весьма непросто — вестибулярный аппарат ещё не проснулся. Но постепенно я вработался и стало даже нравиться — на скорости около 16 км/ч нужно было очень быстро перестраивать стиль движения под постоянно меняющийся характер поверхности: то бежать одношажным ходом по снегу, то преодолевать неровности (следы снегоходов и людей) равнинным двухшажным, то нестись по льду даббл-поллингом, а порой даже забираться на снежные склоны вблизи островов традиционным горным ходом. Словом, прогулка не удалась вообще, а вот тренировка — вполне! 👍🏼

Пока непонятно, как долго ещё продержатся пригодные для катания условия и удастся ли выбраться туда ещё раз. Но всё же здорово, что получилось хотя бы так, ведь такое завершение сезона стало уже традицией, которая поддерживается примерно лет семь. Равно как и приятно предвкушать скорое появление новых треков с тренировок ровно в тех же местах, только уже вплавь 🏊‍♂️

#спорт
🔥9👍7🤩1
Начинающим линуксоидам на заметку ✍️

И хотя на дворе 2026-ой год, а вокруг сплошные ИИ агенты, в трудовых буднях разработчика всё ещё остаются вещи, которые проще/надёжнее/быстрее сделать руками, надо только вспомнить дурацкий исторически сложившийся синтаксис той самой линуксовой утилиты... ⚒️

В таких случаях меня уже давно выручает не Google и не встроенный в терминал ИИ-агент (хотя они, безусловно, тоже могут), а старый добрый TLDR — терминальный справочник по линуксовым командам 📚

Суть его предельно проста — когда вам нужно вспомнить синтаксис какой-то команды, вы просто пишете tldr <command>, и она возвращает вам краткое описание команды с примерами наиболее частых применений (см. скриншот) 💎

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

Основной недостаток вижу лишь в том, что утилита всякий раз обращается к своей базе онлайн, поэтому для работы требует выхода в Сеть и порой отвечает не мгновенно

Однако этот минус с лихвой компенсируется тем, что (по моему опыту) выводимой информации хватает в >90% случаев — остаётся только скопипастить 📝
👍72🔥2
Давно не был ни у кого в гостях на подкасте, а тут как раз замечательный случай. Присылайте вопросы — постараемся осветить их за время беседы ✍️
Forwarded from Spring АйО
🔥 Профилирование? Не, не слышал

Друзья, следующий подкаст пройдет не как обычно, а с очень уважаемыми IT индустрией людьми - Владимиром Плизга и Алексеем Рагозиным - настоящими гуру JVM performance.

У нас, конечно же, есть, что обсудить.

Например:
🔘Нужны ли профайлеры в 2к26?
🔘Зачем вообще запрофилировать?
🔘Поможет ли ИИ в анализе перформанса?

Но мы ждем и ваши вопросы в комментариях под постом. Самые интересные обсудим на подкасте!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍3
Сага о семейном фотоархиве
Эпизод II. Воцарение бэкапа.

В начале года я рассказывал вам о том, что за новогодние праздники наконец-то построил себе решение для автоматической загрузки, надёжного хранения и гибкого поиска фоток и видео в семейном архиве. Оно основано на opensource сервисе Immich, который я развернул в облаке (на VPS) ☁️

И хотя, в целом, решение рабочее (3 месяца полёт нормальный), оно в каком-то смысле убивает саму идею владения своим фотоархивом, ведь теперь основное хранилище там, в облаке, а доступ к нему может пропасть по 1000 и 1 причине: от банальной неуплаты аренды до глобального сбоя в Интернете. Понимая это, я ещё тогда заказал себе домой сетевое хранилище (NAS) и к нему два одинаковых жестких диска по 2 ТБ, чтобы объединить их в RAID-1 массив и сохранять каждый байт информации дважды на случай отказа одного из дисков. К слову, ждать отказа не пришлось — один из дисков был куплен за полцены по распродаже на Озоне, приехал без гарантийного талона и сдох на первой же массовой записи. Мораль: скупой платит дважды 💰

По моей исходной задумке, данные фотоархива из облака (с VPS) должны быть скопированы домой (на NAS), а затем как-то автоматически обновляться, чтобы домашняя резервная копия оставалась актуальной. Но когда стал продумывать в деталях, осознал, что не понимаю, как именно они должны "обновляться":
— забирать каждый раз весь архив целиком не вариант, он весит 500 ГБ 🏋️
— значит, нужно переносить только разницу: некий дифф того, что изменилось с последнего переноса 🤏

Здесь важно отметить, что в разницу могут входить не только добавленные файлы, но и удалённые, потому что я периодически наведываюсь в архив, чтобы:
удалить откровенно неудачные снимки
убрать дубликаты, пропущенные машинными обучением
стереть фото домов/цветов/котов, которые казались прикольными на момент снимка, а сейчас я даже не помню, где и когда (и на фига) это снято 🧐

Ок, вроде логичное требование, стоит его учесть. Но что если вдруг:
— я с бодуна наудаляю лишнего?
— или Immich сойдёт с ума (из-за бага) и грохнет часть архива?
— или вирус-шифровальщик проникнет на VPS и превратит все фото в тыкву, требуя выкуп?
Придуманное выше автоматическое обновление во всех этих случаях слепо отразит изменения на домашнюю резервную копию, умножив масштаб проблемы вместо её предотвращения. И, понятное дело, оно не сможет отличить "хорошее" удаление файлов от "плохого" 🤷‍♂️

Как быть? Решением видится такой компромисс, при котором все изменения всё же будут безусловно отражаться на резервной копии, но эти изменения при случае можно будет легко откатить. Осталось придумать, как это сделать 😏

Прямую наводку на ответ я нашёл в документации на Immich, в статье о расширенном резервном копировании. В качестве основного инструмента там предлагается Borg — бэкапер, написанный на Python. Borg помещает резервируемые файлы в т.н. репозиторий — версионируемое хранилище в собственном двоичном формате. Версионность здесь означает, что репозиторий может содержать множество слепков (версий) исходного архива, но хранятся они не в виде полных копий, а в виде неких диффов к предыдущим слепкам. Таким образом можно восстановить полное состояние архива на любой момент, для которого в репозитории есть слепок (версия). Дополнительно к этому нативно поддерживаются сжатие и шифрование данных в репозитории. Версии могут именоваться произвольным образом и в этом смысле похожи на коммиты в репозиториях Git, да и вся идея Borg во многом перекликается с Git'ом 🪞

Другая важная для меня фича Borg — работа с удалёнными репозиториями по SSH. Именно под неё я наконец-то заполучил себе у провайдера "белый" IP, настроил для него проброс порта на роутере и поднял вторую копию Borg на сетевом хранилище. Правда, вскоре после этого у провайдера не неделю отвалился интернет во всем подъезде. Еси чё, это не я 🙄
😁5🔥31
Опираясь на эти возможности Borg, я построил такое решение:
1. Каждую ночь специальный скрипт по Cron'у создаёт новую версию всего фотоархива в локальном репозитории Borg на VPS (чтобы в случае отказа сервера бэкап пропал вместе с ним — ну удобно же, да?)
2. Этот же скрипт сразу реплицирует эту версию по SSH на удалённый репозиторий Borg, развернутый дома на NAS.
3. В случае реализации любого из перечисленных выше рисков, последняя версия архива в репозитории окажется испорченной. НО: у меня будет 3 месяца на то, чтобы откатиться к любой предыдущей — именно такую глубину хранения версий я заложил в настройки скрипта 🏛

Восстановление данных в случае Borg не тривиально, ведь он хранит их в своём собственном двоичном формате, и в этом, пожалуй, его главный недостаток. Но всё же предлагаемые им варианты восстановления покрывают все основные потребности. Варианта этих два:
1. Можно извлечь любую версию репозитория в указанную папку, как из архива. Это сделает файлы полностью независимыми от репозитория, но может потребовать много места на диске.
2. А можно смонтировать любую версию репозитория на диск в виде папки с файловой системой FUSE. Содержимое папки будет выглядеть как содержимое архива, но на самом деле это будут данные, прозрачно транслируемые Borg'ом. Благодаря этому папка не занимает места на диске (как при извлечении), но её содержимое доступно только для чтения и только при запущенном Borg'е 🤖

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

Резюме
Построенное решение не на 100% страхует меня от риска потерять ценные данные. Но оно существенно снижает этот риск. Кроме того, оно создаёт достаточно удобный резервный канал доступа к фотографиям на случай, если основной канал (Immich) окажется недоступен.
В качестве доказательства — извлечённая из автоматического бэкапа фотография автора этих строк, сделанная до того, как он осознал сложности надёжного резервного копирования... 📸
6🤔3
Лыжный сезон 2025-2026 завершён

Он начался необыкновенно рано — в первой половине октября внезапно выпало много снега, который потом растаял за день. И хотя это была лишь забавная случайность, она стала предзнаменованием насыщенного, мощного лыжного сезона, фактически продлившегося с середины ноября по сегодняшний день 🗓

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

Скорее всего, никто не помнит, но в ноябре я говорил вам, что купил слот на главный старт этого сезона — лыжный марафон в Кемерово в середине марта (50 км свободным стилем). Ещё шутил, что благодаря публичному объявлению мне будет сложнее отмазываться, если всё же сольюсь. Должен признаться, да, писать эти строки сейчас не просто, ибо я всё же слился... 🙄

Причин, как обычно, несколько. Среди них и внезапные морозы, вычеркнувшие две недели очень важных тренировок, и большая нагрузка по работе, когда приходилось начинать рабочий день по Новосибирску, а заканчивать по Москве, в том числе по выходным, просиживая за компьютером часы плановых тренировок. Но главная (и, возможно, вытекающая из первых двух) причина — это неготовность головой. Трудно объяснить, но это как будто кричишь куда-то вглубь себя: "Ну что, готов!?", а в ответ не задорный отклик, не ободряющий гул и не звонкое эхо, а опустошающая тишина вперемешку с лёгким ропотом и невнятным шёпотом. Конечно, можно было собрать волю в кулак и стартануть назло хандре, но я чувствовал, что этот подвиг обойдётся мне дорого и вряд ли будет в удовольствие, а для меня, любителя, это важно. Поэтому я пропустил этот старт ✖️

Взамен его я взял слот в тех же числах на давно полюбившийся мне лыжный полумарафон (30 км) в родном Академгородке и пробежал его на удивление бодро — стал 18-ым из 53 лыжников, хотя раньше почти никогда не появлялся в верхней половине финишных протоколов. После него ещё стартовал на 10 км, но чувство незакрытого гештальта всё равно не покидало, ведь сопоставимого с марафоном забега так и не было. Отдушиной стало лишь замёрзшее море — только там и только в апреле удалось за один раз пробежать 50 км, пусть и не в соревновательном темпе. И вот тогда, наконец, начало появляться чувство удовлетворения ☺️

Венцом этого периода стал день сегодняшний, а точнее, его "Пляжный забег" — любительский лыжный старт на 10 км вдоль побережья всё ещё замёрзшего водохранилища. Я много слышал об этом соревновании, но всякий раз пропускал из-за слишком позднего срока проведения — стереотипы диванного аналитика не давали понять, как можно в середине апреля бегать на скорость на лыжах, да ещё по морю (звучит как бред). Но этот день показал — очень даже можно, и это новый прикольный опыт, который хочется получить вновь 👍

Я бестолковый бегун в том смысле, что бросаю бег на всю зиму, предаваясь лыжам. А заодно и хреновый лыжник, потому что на полгода бросаю лыжи в пользу бега и плавания вместо того, чтобы всё лето делать специальную силовую работу и гонять на лыжероллерах во имя сохранения техники. И каждый раз переход с одного на другое даётся с большим трудом. И каждый такой раз вспоминается надпись на футболке какого-то случайно встреченного атлета:
Бегаю я медленно, зато плаваю не быстро.

И вот теперь, когда за спиной 856 км на лыжах (с ноября), настало время переобуться в кроссовки ещё раз. Каким будет следующий сезон загадывать не хочу; главное, чтобы он состоялся. Всем #спорт
👍10🔥32