Skiing in the winter wonderland ❄️
🔥13😍9👍3💯1
Любопытно и порой не очень весело наблюдать за развитием некоторых программных инструментов. Например, когда-то я искал, на чём делать свою домашнюю страничку, и остановил выбор на Academic — шаблоне для сайтогенератора Hugo.
Выбрал, в том числе за простоту.
И вот как она преобразилась со временем (даты примерные, но состав точный)👇
Для локальной работы с сайтом на HugoBlox (ex. Wowchemy, ex. Academic) нужно:
2018: Hugo
2019: Hugo Extended
2021: Hugo Extended + Go
2023: Hugo Extended + Go + NodeJS
2025: Hugo Extended + Go + NodeJS + Tailwind CSS
Что дальше? Python? Rust? BrainF*ck?
Это ведь всё те же статически отдаваемые странички... Казалось бы 🤨
Выбрал, в том числе за простоту.
И вот как она преобразилась со временем (даты примерные, но состав точный)👇
Для локальной работы с сайтом на HugoBlox (ex. Wowchemy, ex. Academic) нужно:
2018: Hugo
2019: Hugo Extended
2021: Hugo Extended + Go
2023: Hugo Extended + Go + NodeJS
2025: Hugo Extended + Go + NodeJS + Tailwind CSS
Что дальше? Python? Rust? BrainF*ck?
Это ведь всё те же статически отдаваемые странички... Казалось бы 🤨
gohugo.io
The world's fastest framework for building websites
Hugo is one of the most popular open-source static site generators. With its amazing speed and flexibility, Hugo makes building websites fun again.
😁6
This media is not supported in your browser
VIEW IN TELEGRAM
Рубрика "Век живи, век учись" 🎓
Не первый год работаю на #Linux, но когда нужно вызвать недавнюю команду в консоли, по привычке либо тыкаю стрелку вверх, пока команда не появится, либо пишу что-то типа
Оказывается, это режим, в котором можно начать писать что угодно, и он будет выводить команды из истории, в которых содержался вводимый текст. Листать варианты можно как в обратном порядке (тем же
Как выяснилось, это довольно древняя фича, которая есть практически во всех оболочках (bash, zsh и других). Теперь уже не понимаю, как жил без неё раньше🤓
Не первый год работаю на #Linux, но когда нужно вызвать недавнюю команду в консоли, по привычке либо тыкаю стрелку вверх, пока команда не появится, либо пишу что-то типа
history | grep <что-то>. А тут на днях случайно нажал в консоли Ctrl+R (думал, что нахожусь в браузере) и увидел странное сообщение reverse-i-search. Стал гуглить, что это такое, и ахнул 🤩Оказывается, это режим, в котором можно начать писать что угодно, и он будет выводить команды из истории, в которых содержался вводимый текст. Листать варианты можно как в обратном порядке (тем же
Ctrl+R), так и в прямом (Ctrl+S). Когда команда найдена, остается только жмакнуть Tab либо Enter, в зависимости от того, нужно её поправить перед выполнением или нет ▶️Как выяснилось, это довольно древняя фича, которая есть практически во всех оболочках (bash, zsh и других). Теперь уже не понимаю, как жил без неё раньше🤓
👍14🔥4
Сегодняшнее рабочее утро началось с необходимости повторной аутентификации в Telegram на всех устройствах, причем где-то двух-факторной, а где-то и трёх (даже не знал, что здесь такое бывает)🥴
Вторым неприятным сюрпризом оказалась заморозка аккаунта моего Telegram-бота для поиска своих фотографий в больших альбомах (про него здесь был отдельный пост). При этом ни @SpamBot, ни @BotFather ничего о заморозке не сообщают, равно как и не было сервисных уведомлений от самого Telegram 🤷♂️
Поэтому в качестве оперативной меры бот перезапущен под новым ником: @FramePhotoAlbumBot 🤖
Если кто-то в курсе, что происходит, расскажите, пожалуйста 👀
Вторым неприятным сюрпризом оказалась заморозка аккаунта моего Telegram-бота для поиска своих фотографий в больших альбомах (про него здесь был отдельный пост). При этом ни @SpamBot, ни @BotFather ничего о заморозке не сообщают, равно как и не было сервисных уведомлений от самого Telegram 🤷♂️
Поэтому в качестве оперативной меры бот перезапущен под новым ником: @FramePhotoAlbumBot 🤖
Если кто-то в курсе, что происходит, расскажите, пожалуйста 👀
Telegram
Верхняя полка📝
Давно обещал рассказать вам об очередной программной поделке, идеей которой загорелся ещё в конце прошлого года — Telegram-бот для поиска своих фоток в больших открытых альбомах 👨💻
Мотивация проста:
— я часто участвую в массовых мероприятиях, где работают…
Мотивация проста:
— я часто участвую в массовых мероприятиях, где работают…
🤔8😱2
Кастомные JFR события в дикой природе 🦒
На моем тренинге по #JFR мы с участниками, кроме прочего, учимся делать собственные JFR события, чтобы эммитить их прямо из бизнес-логики, а потом анализировать так же, как встроенные события JVM. И хотя я стараюсь объяснять, зачем это надо, в воздухе нередко остаётся висеть незаданный вопрос участников: "А зачем бы я применил(а) это у себя в проекте?" 🧐
Делюсь свежим примером из своей практики 👇
Когда-то я рассказывал вам, что мы пилим свой условный аналог Excel на платформе AggreGate. Сейчас на этом решении наш партнёр реализует огромный проект для заказчика, и движок вычислений там используется в полный рост, потому что хотелки у заказчика тоже не слабые:
— десятки больших таблиц
— сотни тысяч ячеек в них
— ≈280К узлов в графе связей между ячейками разных таблиц 🕸
Ну и конечно же на этом фоне к нам в JIRA стали периодически поступать тикеты с интригующими заголовками в духе: "У нас где-то что-то когда-то почему-то не посчиталось/не обновилось/не сбросилось, но мы не поняли, где, когда и почему. Разбирайтесь😘"
Как вы наверняка догадываетесь, логировать вычисления в таких масштабах, а потом купаться в этих логах (или выгружать их в какой-то парсер-анализатор) — затея трудоёмкая и малоперспективная. Но видеть ход вычислений в точности до ячеек всё же надо. То есть нужен максимально простой, дешевый (с т.з. overhead'а) и пригодный для анализа результатов способ как-то фиксировать вычисления ✍️
И тут я снова вспомнил про кастомные события JFR, ведь у них очень простой, но при этом гибкий API, они весьма дешевы в эмиссии и хранении, а их анализ в Java Mission Control хоть и не так мощен, как какой-нибудь Logstash+Kibana, но всё же на порядок удобнее, чем с логами 🧶
Я завёл класс с описанием вычисления (см. скриншот 1) и стал эмитить с ним JFR события в двух местах:
— при инициации вычислений (на пользовательском вводе или открытии готовой таблицы)
— и при обновлении по слушателю (когда пересчёт одной ячейки аффектит другую).
Это позволило регистрировать 100% вычислений 💯
Зная масштабы проекта, я опасался, что JFR записи будут огромными и с ними будет тяжело работать, поэтому воспользовался фичей JFR API по добавлению кастомных настроек — поддержал фильтрацию регистрируемых вычислений по диапазону ячеек в обычной нотации Excel, например,
Любопытно, что изначально я планировал управлять этой диагностикой через утилиту
Теперь мы этим активно пользуемся, и когда приносят очередную задачу по проблеме вычислений, знаем, с чего начинать анализ 🕵️♂️
Конечно, сама по себе диагностика на JFR-событиях сложные/редкие/заковыристые проблемы не решает. Но она прокладывает очень важный и довольно длинный кусочек мостика между "Черт возьми, что здесь вообще происходит!?" и статусом тикета "Resolved (Fixed)" ✅
На моем тренинге по #JFR мы с участниками, кроме прочего, учимся делать собственные JFR события, чтобы эммитить их прямо из бизнес-логики, а потом анализировать так же, как встроенные события JVM. И хотя я стараюсь объяснять, зачем это надо, в воздухе нередко остаётся висеть незаданный вопрос участников: "А зачем бы я применил(а) это у себя в проекте?" 🧐
Делюсь свежим примером из своей практики 👇
Когда-то я рассказывал вам, что мы пилим свой условный аналог Excel на платформе AggreGate. Сейчас на этом решении наш партнёр реализует огромный проект для заказчика, и движок вычислений там используется в полный рост, потому что хотелки у заказчика тоже не слабые:
— десятки больших таблиц
— сотни тысяч ячеек в них
— ≈280К узлов в графе связей между ячейками разных таблиц 🕸
Ну и конечно же на этом фоне к нам в JIRA стали периодически поступать тикеты с интригующими заголовками в духе: "У нас где-то что-то когда-то почему-то не посчиталось/не обновилось/не сбросилось, но мы не поняли, где, когда и почему. Разбирайтесь😘"
Как вы наверняка догадываетесь, логировать вычисления в таких масштабах, а потом купаться в этих логах (или выгружать их в какой-то парсер-анализатор) — затея трудоёмкая и малоперспективная. Но видеть ход вычислений в точности до ячеек всё же надо. То есть нужен максимально простой, дешевый (с т.з. overhead'а) и пригодный для анализа результатов способ как-то фиксировать вычисления ✍️
И тут я снова вспомнил про кастомные события JFR, ведь у них очень простой, но при этом гибкий API, они весьма дешевы в эмиссии и хранении, а их анализ в Java Mission Control хоть и не так мощен, как какой-нибудь Logstash+Kibana, но всё же на порядок удобнее, чем с логами 🧶
Я завёл класс с описанием вычисления (см. скриншот 1) и стал эмитить с ним JFR события в двух местах:
— при инициации вычислений (на пользовательском вводе или открытии готовой таблицы)
— и при обновлении по слушателю (когда пересчёт одной ячейки аффектит другую).
Это позволило регистрировать 100% вычислений 💯
Зная масштабы проекта, я опасался, что JFR записи будут огромными и с ними будет тяжело работать, поэтому воспользовался фичей JFR API по добавлению кастомных настроек — поддержал фильтрацию регистрируемых вычислений по диапазону ячеек в обычной нотации Excel, например,
sheet_a!B5:F16 (скриншот 2). Но моему к приятному удивлению, это оказалось лишним: недавно коллеги по запарке оставили JFR-запись включенной без этого фильтра на 21 час, и в неё набежало 303 000 событий, а получившийся JFR файл весил 105 МБ. При этом он без труда открылся в JMC, а работать с ним было также легко, как и с маленьким (скриншот 3) 🌿Любопытно, что изначально я планировал управлять этой диагностикой через утилиту
jattach, но в закрытый контур заказчика втащить даже безобидную jattach оказалось нельзя (небезопасно типа). Тогда мне пришлось извернуться и написать на платформенном low-code-языке функции, которые через JFR API дёргают методы запуска/останова записи, да еще и конфигурируют нужные события. Как ни странно, функции получились довольно компактными и сработали чётко, а в качестве бонуса их вызов удалось вывести прямо в UI-интерфейс платформы для удобства администраторов 👷🏼Теперь мы этим активно пользуемся, и когда приносят очередную задачу по проблеме вычислений, знаем, с чего начинать анализ 🕵️♂️
Конечно, сама по себе диагностика на JFR-событиях сложные/редкие/заковыристые проблемы не решает. Но она прокладывает очень важный и довольно длинный кусочек мостика между "Черт возьми, что здесь вообще происходит!?" и статусом тикета "Resolved (Fixed)" ✅
👍9🔥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.
—
Мы продолжаем работать над программой и конференцией в целом. И уже с нетерпением ждем конца февраля, чтобы встретиться на ней с вами ☺️
Ну и напомним, что сейчас идеальный момент, чтобы купить билет. Так вы успеете до следующего подорожания (с января), а заодно сразу запланируете приятное дело на следующий год.
Всех с наступающим! 🎄
До конца года остается чуть меньше двух недель, а мы к вам уже с подарками 🎁
Во-первых, мы опубликовали новых прекрасных спикеров на сайт. Во-вторых, теперь это не просто имена, а темы и тезисы докладов!
Давайте посмотрим, что уже есть в программе 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?
Хотите ли вы видеть в программе доклады про AI на Java?
Anonymous Poll
33%
Нет, этот AI и так уже из каждого утюга
52%
Да, парочка докладов не помешает
14%
Конечно, и чем больше, тем лучше!
1%
(свой вариант в комментариях)
👌1
(спасибо всем проголосовавшим выше🤝)
И ещё разок про AI, но не в Java 🐍
На одном из сопутствующих проектов довелось поработать с облачным хостингом Render.com, куда мы деплоим приложение, почти целиком разрабатываемое в Cursor IDE (навайбокодили, да). Заметив на главной странице хостинга баннер про появившийся у них MCP-сервер, я из любопытства на него тыкнул, хотя даже не понимал, зачем облачной платформе нужна такая приблуда 🛠
Оказалось (ожидаемо), что она позволяет мониторить и управлять деплоем через команды на человеческом языке прямо из среды общения с ИИ, т.е. в нашем случае из Cursor. Это позволило, кроме прочего, в буквально смысле писать такой промпт:
, и он (агент) это делает — см. скриншот. Чудесато! 💫
Правда, есть и обратная сторона — косячить в коде агент от этого меньше не стал. Но если раньше ручное копирование логов в промпт как-то заставляло также вручную проверять все правки локально, то теперь возможность показать агенту проблему прямо на проде очень сильно подмывает и проверить её фикс там же — ведь нужно только закоммитить, дальше всё само. А поскольку фиксы нередко кривые, то и прод стал частенько оказываться "отрицательно доступен" (© наш DevOps). Благо, что проект пока игрушечный, и никого это не аффектит🫠
Вкупе с тем, что и сообщения для коммитов теперь генерит агент, участие человека кажется всё менее значимым — написать промпт, прожать OK на ревью, клацнуть Commit & Push. Всё это мог быть делать ИИ. Но пока он так отчаянно косячит и генерит порой правдоподобную чушь, за роль кожаного мешка перед экраном можно не беспокоиться ☺️
И ещё разок про 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/ (видосик там тоже есть, но уже рукотворный 🎬 )
А на днях коллега-тимлид развлекался с новым ИИ-сервисом от Google под названием NotebookLM и скормил ему документацию на нашу платформу, чтобы посмотреть, что тот сможет по ней выдать. Помимо стандартного "chat with your docs", сервис предложил сгенерировать ознакомительный видеоролик-презентацию о продукте. Коллега согласился, и вот что из этого вышло ☝️
Признаться, я был приятно удивлён: утверждения корректные, примеры наглядные, изложение стройное. Конечно, есть косяки в оформлении и произношении, но учитывая, что это сделано за считанные минуты и не человеком, получилось вполне достойно 🆗
В общем, кому интересно, на чем сегодня строится цифровизация промышленности в России (да и не только, на самом деле), уделите 7 минут этому видео. А если вдруг захочется узнать больше, можно продолжить здесь: https://aggregate.digital/ru/ (видосик там тоже есть, но уже рукотворный 🎬 )
🔥4👍2❤1
В последние несколько лет крайняя тренировка года в бассейне проходит для нашего любительского спортивного клуба в виде какого-нибудь упахательного заплыва, например, 50 раз по 100 м вольным стилем в режиме 2 минуты на каждый отрезок, или 5 раз по 1000 м кролем в разной экипировке — словом, освобождаем место под оливье как можем 🥣
Но в этот раз, заговорив о планах на конец года, мы вдруг вспомнили, что почему-то давно не играли в водное поло, и сошлись на том, что было бы здорово завершить плавательный год, устроив это дружескоерубилово развлечение 🤽♂️
На удивление, нас собралось полноценные 2 команды: по 6 игроков в поле и 1 вратарь. Таймы решили сделать по 5 минут. В начале это казалось как-то несерьёзно (мало), но уже в конце первого тайма в наших покрасневших от воды глазах отчётливо читалось: "Батюшки, неужели это только начало!?" Да, даже для опытных вотерполистов (а среди нас были и такие) с непривычки этомесилово мероприятие оказалось весьма трудозатратным 🫠
Не знаю, как остальные, а я где-то к середине игры всё же как-то вработался и несмотря на усердноетопилово воздействие со стороны защитников противника таки сумел забить один гол. Правда, ещё две голевых передачи продолбал. Тем не менее, наша команда выиграла со счётом 3:1 🏐
После игры мы всей гурьбой (вместе с болельщиками, коих было чуть ли не столько же, как игроков) плотно заполнили собою небольшую каморку в здании бассейна, полопали мандаринов, поделились впечатлениями и поздравили с Новым Годом тренера, который играл вместе с нами — без него всё это бы не состоялось 🍊
Едва ли такоемочилово занятие можно рекомендовать всем подряд в качестве популярного вида спорта, но если вдруг обычное плавание вам кажется скучным, однообразным и/или недостаточно динамичным, обратите внимание на водное поло. Наверняка вам очень (не) захочется в этом поучаствовать🤪
#спорт
Но в этот раз, заговорив о планах на конец года, мы вдруг вспомнили, что почему-то давно не играли в водное поло, и сошлись на том, что было бы здорово завершить плавательный год, устроив это дружеское
На удивление, нас собралось полноценные 2 команды: по 6 игроков в поле и 1 вратарь. Таймы решили сделать по 5 минут. В начале это казалось как-то несерьёзно (мало), но уже в конце первого тайма в наших покрасневших от воды глазах отчётливо читалось: "Батюшки, неужели это только начало!?" Да, даже для опытных вотерполистов (а среди нас были и такие) с непривычки это
Не знаю, как остальные, а я где-то к середине игры всё же как-то вработался и несмотря на усердное
После игры мы всей гурьбой (вместе с болельщиками, коих было чуть ли не столько же, как игроков) плотно заполнили собою небольшую каморку в здании бассейна, полопали мандаринов, поделились впечатлениями и поздравили с Новым Годом тренера, который играл вместе с нами — без него всё это бы не состоялось 🍊
Едва ли такое
#спорт
🔥18👍1🙈1