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

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

Домашняя страница: https://toparvion.pro/
Download Telegram
На втором часу общения с ChatGPT о том, почему у меня на Linux после обновления видеодрайвера на фиг отвалились все сетевые устройства 🥴
🤣14💯1
Forwarded from SnowOne-канал
Всем привет!

До конца года остается чуть меньше двух недель, а мы к вам уже с подарками 🎁

Во-первых, мы опубликовали новых прекрасных спикеров на сайт. Во-вторых, теперь это не просто имена, а темы и тезисы докладов!

Давайте посмотрим, что уже есть в программе SnowOne 2026:

1) Секция "Enterprise":

Сергей Петрелевич расскажет о NIO, как одним потоком обработать множество сетевых запросов;
Антон Курако приведет глубокий анализ производительности аспектов в Spring;
Александр Токарев представит продолжение своего доклада про дебаггинг в Java, где покажет, как отлаживать многопоточный, автогенеренный и нативный код;

2) Секция Хардкор:

Александр Ланцов будет сравнивать алгоритмы GC (включая новейшие) в Java и Go, чтобы разобраться, чем они отличаются и какой лучше подходит для ваших сценариев;
Иван Углянский расскажет о мега-проекте Valhalla и добавлении value классов в Java: зачем это вообще нужно, как повлияет на Java, и как развитие языка помогло реализации рантайма;

3) Секция "Расширение кругозора":

Пётр Портнов покажет, как Java разработчикам пользоваться инструментом Error Prone, чтобы заранее ловить их баги статическим анализом;
Сергей Луговой поделится опытом создания нового языка с JetBrains MPS;
Михаил Пилип расскажет о построении SCADA-системы своими руками, и как ему в этом помог Kotlin.



Мы продолжаем работать над программой и конференцией в целом. И уже с нетерпением ждем конца февраля, чтобы встретиться на ней с вами ☺️

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

Всех с наступающим! 🎄
🔥5
Как вы, надеюсь, поняли по предыдущему сообщению, мы в программном комитете #SnowOne уже вовсю активно работаем над конференцией, чтобы она была интересной и полезной. В этой связи возник вопрос:

Хотите ли вы видеть в программе доклады про AI на Java?
Anonymous Poll
33%
Нет, этот AI и так уже из каждого утюга
52%
Да, парочка докладов не помешает
14%
Конечно, и чем больше, тем лучше!
1%
(свой вариант в комментариях)
👌1
(спасибо всем проголосовавшим выше🤝)

И ещё разок про AI, но не в Java 🐍

На одном из сопутствующих проектов довелось поработать с облачным хостингом Render.com, куда мы деплоим приложение, почти целиком разрабатываемое в Cursor IDE (навайбокодили, да). Заметив на главной странице хостинга баннер про появившийся у них MCP-сервер, я из любопытства на него тыкнул, хотя даже не понимал, зачем облачной платформе нужна такая приблуда 🛠

Оказалось (ожидаемо), что она позволяет мониторить и управлять деплоем через команды на человеческом языке прямо из среды общения с ИИ, т.е. в нашем случае из Cursor. Это позволило, кроме прочего, в буквально смысле писать такой промпт:
Там на проде че-то упало. Сходи посмотри логи да пофикси

, и он (агент) это делает — см. скриншот. Чудесато! 💫

Правда, есть и обратная сторона — косячить в коде агент от этого меньше не стал. Но если раньше ручное копирование логов в промпт как-то заставляло также вручную проверять все правки локально, то теперь возможность показать агенту проблему прямо на проде очень сильно подмывает и проверить её фикс там же — ведь нужно только закоммитить, дальше всё само. А поскольку фиксы нередко кривые, то и прод стал частенько оказываться "отрицательно доступен" (© наш DevOps). Благо, что проект пока игрушечный, и никого это не аффектит🫠

Вкупе с тем, что и сообщения для коммитов теперь генерит агент, участие человека кажется всё менее значимым — написать промпт, прожать OK на ревью, клацнуть Commit & Push. Всё это мог быть делать ИИ. Но пока он так отчаянно косячит и генерит порой правдоподобную чушь, за роль кожаного мешка перед экраном можно не беспокоиться ☺️
👍6🕊1🙈1
Media is too big
VIEW IN TELEGRAM
Я тут периодически упоминаю, что тружусь над отечественной интеграционной low-code платформой #AggreGate, но мало кто понимает, что это за штука и какие задачи она решает 🏺

А на днях коллега-тимлид развлекался с новым ИИ-сервисом от Google под названием NotebookLM и скормил ему документацию на нашу платформу, чтобы посмотреть, что тот сможет по ней выдать. Помимо стандартного "chat with your docs", сервис предложил сгенерировать ознакомительный видеоролик-презентацию о продукте. Коллега согласился, и вот что из этого вышло ☝️

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

В общем, кому интересно, на чем сегодня строится цифровизация промышленности в России (да и не только, на самом деле), уделите 7 минут этому видео. А если вдруг захочется узнать больше, можно продолжить здесь: https://aggregate.digital/ru/ (видосик там тоже есть, но уже рукотворный 🎬 )
🔥4👍21
В последние несколько лет крайняя тренировка года в бассейне проходит для нашего любительского спортивного клуба в виде какого-нибудь упахательного заплыва, например, 50 раз по 100 м вольным стилем в режиме 2 минуты на каждый отрезок, или 5 раз по 1000 м кролем в разной экипировке — словом, освобождаем место под оливье как можем 🥣

Но в этот раз, заговорив о планах на конец года, мы вдруг вспомнили, что почему-то давно не играли в водное поло, и сошлись на том, что было бы здорово завершить плавательный год, устроив это дружеское рубилово развлечение 🤽‍♂️

На удивление, нас собралось полноценные 2 команды: по 6 игроков в поле и 1 вратарь. Таймы решили сделать по 5 минут. В начале это казалось как-то несерьёзно (мало), но уже в конце первого тайма в наших покрасневших от воды глазах отчётливо читалось: "Батюшки, неужели это только начало!?" Да, даже для опытных вотерполистов (а среди нас были и такие) с непривычки это месилово мероприятие оказалось весьма трудозатратным 🫠

Не знаю, как остальные, а я где-то к середине игры всё же как-то вработался и несмотря на усердное топилово воздействие со стороны защитников противника таки сумел забить один гол. Правда, ещё две голевых передачи продолбал. Тем не менее, наша команда выиграла со счётом 3:1 🏐

После игры мы всей гурьбой (вместе с болельщиками, коих было чуть ли не столько же, как игроков) плотно заполнили собою небольшую каморку в здании бассейна, полопали мандаринов, поделились впечатлениями и поздравили с Новым Годом тренера, который играл вместе с нами — без него всё это бы не состоялось 🍊

Едва ли такое мочилово занятие можно рекомендовать всем подряд в качестве популярного вида спорта, но если вдруг обычное плавание вам кажется скучным, однообразным и/или недостаточно динамичным, обратите внимание на водное поло. Наверняка вам очень (не) захочется в этом поучаствовать🤪

#спорт
🔥18👍1🙈1
Вот теперь с Наступившим! 🎉 🎄 🎁

Последние дни и часы минувшего года у меня прошли отнюдь не налегке — нужно было подготовить и провести две большие презентации по итогам года: 30 декабря для коллег и 31-го для родсвтенников (это такая семейная традиция; я рассказывал о ней год назад). А поскольку хотелось порадовать и тех, и других, пришлось хорошенько потрудиться, поэтому к праздничной полуночи мне хотелось уже не тусить и поздравляться, а упасть лицом в мягкий салат и булькать там до конца каникул 🥘

К счастью, это занятие надоело раньше, и вот я снова на связи. Надеюсь, и вы отметили хорошо! 🙏🏻

Чтобы всё же принести хоть какую-то пользу этой заметкой, поделюсь с вами инструментом, который здорово выручил меня при подготовке семейной презентации. Поскольку почти все мои родственники живут в разных местах, мне давно хотелось как-то визуализировать их места пребывания на карте. Я уже совершал несколько подступов к этому снаряду в прошлые годы (в основном, через сервсиы Google), но успехом они ни разу ни разу не увенчались: получалось то сложно, то стрёмно, то 2-в-1 🪣

На сей раз с помощью DeepSeek я набрёл на бесплатный сервис MapChart, который как раз позволяет рисовать географические карты, кастомизированные под многие специфичные нужды. Основной порядок работы с ним довольно прост:
1. Выбираете базовую карту, например, весь мир, Европу, отдельную страну или несколько.
2. Разукрашиваете мышкой интересные вам регионы: целые страны, штаты/субъекты или их комбинации.
3. Экспортируете в картинку и используете на своё усмотрение 🗺

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

Из любопытного: среди базовых сервис предлагает карты фантастических, в том числе игровых миров и возможность строить свои карты альтернативных сценариев истории: https://www.mapchart.net/wargames.html
Только если залипнете, чур не жаловаться, что это я показал🤭
🔥63
Завершаю тему итогов года статистикой #спорт 📊

Физкультуры в минувшем году почему-то оказалось больше, чем в предыдущих, хотя планов таких не строил и обещаний никому не давал, даже себе. Вот как это выражается в цифрах (в скобках изменение к 2024 году):👇

2154 (+587) км преодолено бегом, на лыжах и вплавь 📏
Строго говоря, это бесполезная цифра, так как складывать километры на лыжах с км вплавь — это как сравнивать теплое с мягким, но подобная цифра есть во многих публичных отчётах, поэтому я включил её и сюда.
281 (+53) ч проведено на тренировках ⏱️
Это уже куда более адекватная метрика, отражающая мою "тренировочную способность", но её надо воспринимать с щепоткой соли (см. ниже*).
17 (+4) соревнований, в которых принял участие 🏆
Парочка из них были сдвоенными (типа в субботу один старт, в воскресенье другой), но я считаю их по отдельности, потому что у них разные дистанции, протоколы, медали, а у некоторых и дисциплины, например, акватлон+плавание.

* Примечание к длительности тренировок. Простота интерфейса спортивных часов позволяет мне относительно точно фиксировать периоды отдыха на тренировках, благодаря чему теперь можно ответить на вопрос (голосом жены с руками на боках): "А сколько из этого времени ты реально двигался?" Оказывается, коэффициент булкования (©) в этом году составил аж 11,23%, то есть из 281 часов тренировок аж 32 часа я провёл без движения, болтая на бортике в бассейне, фотая красоты на пробежках и заправляясь чаем из поясного бака на лыжах. 1,5 суток в год на такие дела, представляете? Вот так старость и подступается 👨‍🦳

Из наиболее ярких спортивных достижений года отмечаю:
● лыжный марафон (50 км) в Томске в марте — мой третий марафон наряду с беговым и плавательным 3️⃣
● большой SwimRun (33 км) под Питером в июне — лютая гонка среди чудесных лесов и озёр 🏞
● беговой полумарафон (21,1 км) в Новосибирске в сентябре — ещё раз обновил личный рекорд до 1:25:11 👟

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

Прилагаю несколько слайдов по этой теме со своей недавней презентации ☝️

А как прошёл 2025 спортивный год у вас? Давайте делиться результатами 🙂
🏆8👍31
Про Caddy ⚙️

Помимо безудержного переедания, вопиющего нарушения режима сна и прочих непотребств, эти каникулы я посвящаю одному семейному IT-проекту, до которого раньше никак не доходили руки. Расскажу о нём отдельно в другой раз, а пока — об одной его подзадачке 👇🏼

Возникла потребность принимать на публичном сервере HTTPS-траффик с клиентских устройств, терминировать на нём TLS и отправлять дальше в прикладной сервис. В общем, типичная работёнка для обратного прокси-сервера. Заодно хотелось бы избежать головняка и расходов на SSL-сертификаты (намекаю на Let's Encrypt) и обеспечить перенаправление http(80)->https(443). Значит, нужен какой-то веб-сервер. Благо, варианты есть 📚

1️⃣ Мой собственный опыт в этой сфере сводится только к настройке Apache HTTPD — я вдоволь "наигрался" с этим сначала в универе, потом на работе. Вариант рабочий, но в 2026-ом году, пожалуй, нет, спасибо; здоровье дороже 🤢

2️⃣ В интернетах >80% ответов на подобный запрос сводятся к совету брать Nginx+Certbot — эта связка настолько популярна, что под неё есть даже готовые решения (пример), правда, со своими особенностями применения. В какой-то момент я уже принял мысль, что пойду этим путём, но всё же почти страничный конфиг и 10+ шагов инструкции по его применению не давали покоя, и я решил покопать дальше ⛏️

3️⃣ Модно-молодёжный вариант решения — Traefik — входная точка для микросервисов, поддерживает применение Let's Ecnrypt серфтификатов из коробки и ещё кучу всего. Но вот эта куча меня как раз и смутила — показалось, что это целый комбайн с тонной фич, которые мне не нужны, но за которые придётся "платить" ресурсами машины, а у меня их кот наплакал. Возможно, это заблуждение, но всё же решил поискать ещё 🔍

4️⃣ И тут наткнулся на Caddy — полнофункционональный, но при этом (вроде как) легковесный веб-сервер на Go, главными фичами которого заявлены полная автоматизация настройки TLS и простота конфигурации. Оба пункта прозвучали для меня очень вкусно, и я решил попробовать 😋

После недолгих изысканий я понял, что весь мой конфиг будет состоять из всего 3 строчек в специальном декларативном Caddyfile:
<мой_домен> {
reverse_proxy http://<адрес_моего_сервиса>
}

При первом запуске Caddy увидел, что Let's Encrypt сертификата ещё нет, и автоматически провернул всю процедуру по его получению, а она, кто не в курсе, отнюдь не тривиальна:
* нужно инициировать запрос на выпуск
* пройти т.н. challenge (проверку владения доменом, она бывает 3 типов)
* получить и применить сам сертификат (+ключ)
* настроить перенаправление траффика 80->443.
Так вот Caddy всё это сделал сам с первого раза, чем уже меня порадовал 🪄

Но оставалось опасение, что он будет прожорлив по ресурсам. В качестве бенчмарка (и основного применения) я стал заливать через Caddy на сервер бинарные данные по 100 МБит/с каналу на протяжении нескольких часов с регулярным наблюдением за состоянием витуальной машины. Перед этим я проводил аналогичную процедуру через SSH-туннель — хуже точно не стало, а кое в чем (по мелочи) даже лучше. Это, конечно, не полноценный нагрузочный тест, но для моих целей он пройден

Возможно, мне просто повезло с тем, что Caddy пришёлся кстати именно в моём случае, но 69К звёзд на его GitHub позволяют думать, что он всё же реально неплох, поэтому в следующий раз, когда потребуется поднять реверс-прокси, сбалансировать нагрузку или просто удобно раздать статику, я намерен применить его снова. Предлагаю взять его на заметку и вам 📝

#инструменты
👍17🔥7
Верхняя полка📝
Расскажу о нём отдельно в другой раз
Вероятно, картина покажется вам знакомой, если я скажу, что мой семейный фотоархив представляет собой хаотичное месиво фоток и видео, разбросанных по телефону, облаку (куда они льются сами) и домашним дискам/флешкам. И вряд ли стоит пояснять, что в таком виде эти (в общем-то весьма дорогие мне) воспоминания легко потерять, неудобно пересматривать и весьма трудоёмко искать 🙁

Конечно, я давно осознавал, что надо навести здесь порядок. И ещё долго бы продолжал просто осознавать, если бы накануне Нового Года случайное невысокое падение внешнего HDD с огромной кучей фоток не превратило его в тыкву и не обошлось в несколько десятков килорублей на восстановление. И вот тогда "надо" внезапно превратилось в "пора"...

Под "навести порядок" я принял для себя следующее:
1. Организовать надёжное хранение в едином месте, но с резервированием локально и в облаке
2. Обеспечить автоматическое добавление снимков и видео с телефонов с попутной фильтрацией дубликатов и каталогизацией
3. Предоставить быстрый поиск по людям, датам, местам и объектам с любого авторизованного устройства (для родственников) 🎯

Раньше почти все эти цели достигались использованием Google Photos, но в новых реалиях от него пришлось отказаться, а достойных альтернатив на российском рынке я не нашёл (хотя и попробовал платный Яндекс.Диск). К тому же захотелось получить больше контроля и возможностей, поэтому я решил попробовать self-hosted решение и выбрал Immich — opensource'ный аналог Google Photos, который мне когда-то порекомендовал Артём @artipop Шабуров. Этот сервис превосходит конкурентов не только по числу звёзд на GitHub, но и по зрелости фич, а это для меня очень важно 🔝

Я развернул его c помощью Docker Compose на российском VPS с 2 ядрами CPU, 4 ГБ памяти и 1,5 ТБ места на HDD. Такой сервер обошёлся в 1400 руб/мес на первые три месяца (новогодняя акция), потом будет порядка 1900 руб/мес (хостинг FirstVDS). В целом, основное взаимодействие с сервисом при такой его скромной мощи пока что полностью устраивает: лента скроллится, видосики грузятся, поиск ищёт и находит. Основной дискомфорт вызывает только извлечение метаданных из загружаемых медиа файлов — для мощного поиска под капотом у Immich работает целая банда моделей машинного обучения, а оно на голом CPU работает, мягко говоря, не быстро — чуть ли не бОльшую часть каникул VPS лопатил круглые сутки на полную мощность, чтобы отсмотреть все мои фото/видео и правильно их проиндексировать (векторизовать картинки, извлечь тексты, распознать людей и т.д.) Мне даже пришлось увеличить ему размер SWAP-файла, чтобы во время распознавания Python-процесс не прибивался OOM Killer'ом. Впрочем, такой объём данных требуется обработать лишь раз; дальше медиа файлы будут добавляться поштучно, и минутная задержка на их индексацию кажется вполне приемлемой 👌

Зато теперь у меня наконец-то появилось более-менее целостное, управляемое и удобное хранилище, в котором на сегодня:
• 42К фотографий (уже без дубликатов и почти без "мусора")
• 3,5К видеозаписей
• 20 лет воспоминаний (плюс несколько сотен оцифрованных бумажных снимков более старшего возраста) 📷

Следующими шагами будет настройка резервирования на домашнее сетевое хранилище (заказано, едет) и постепенное наведение смыслового порядка: разметка людей (имена, даты рождения), уточнение дат съёмки, удаление лишних снимков и т.п. Наверняка на этом пути ещё выяснятся какие-нибудь неприятные моменты, но пока впечатление об Immich как сервисе очень даже позитивное. Особо порадовали:
• удобное мобильное приложение (наряду с сайтом)
• мощное распознавание людей (в том числе в полоборота, в том числе детей, в том числе в очках/масках и в воде)
• клёвый контекстный поиск (запросы типа "закат на пляже", "пятнистый кот на руках у мальчика", "девушка на мотоцикле" исполняются на ура) 🪄

Намерен продолжать осваивать и рассказывать вам по мере появления новых любопытных наблюдений. А если у вас уже есть свой опыт в решении подобных задач, поделитесь — нам наверняка есть, чему поучиться друг у друга 🙂
👍13🔥3🤔1