Бег и плавание — понятные, популярные и широко освещаемые виды спорта, можно сказать "попсовые". Но мало кто знает про их сочетание в виде SwimRun — пришедшего из Скандинавии двоеборья, в котором дистанция пролегает по пересеченной местности, включающей водоёмы, и участникам нужно преодолевать её то бегом, то вплавь. В отличие от акватлона, где бег так же чередуется с плаванием на трёх этапах, в свимране этапов может быть гораздо больше, и между ними нет никаких транзитных зон для переодевания, т.е. в чем бежишь, в том и плывешь (да, в том числе в кроссовках). Кроме того, SwimRun — исторически парный вид спорта: так и веселее, и безопаснее. Короче, дичь да и только 🏃♂️🏊♂️
Как поклоннику обоих видов спорта, мне было интересно попробовать этот безумный коктейль, и в 2018-ом году я впервые пробежал и проплыл дистанцию в 9 км в Новосибирске. Мне сразу же дико понравилось (об этом даже остался очерк), я купил специальный гидрокостюм под это дело, и с тех пор практически каждое лето старался участвовать в такой активности хоть в каком-нибудь формате. В основном, это были небольшие тренировки и самогонки (неофициальные соревнования среди знакомых), но был и довольно серьёзный старт в Ленинградской области в 2022 году, откуда я привез медальку за 1-е место среди мужских команд на средней дистанции 16 км 🏆
И вот спустя ещё три года появилось желание и возможность замахнуться на ступеньку выше — преодолеть на тех же соревнованиях максимальную дистанцию 32 км. Мы с напарником Николаем провели три подготовительные тренировки, отработали множество нюансов и вчера вместе с толпой таких же свимраннеров рванули по лесной тропе под стартовый свисток...
32 км, 41 этап (28 км бега и 4 км плавания), 18 градусов в воде и 15 на воздухе, 4 часа 59 минут... Это было круто! 💥
Впечатления, выводы, наблюдения — всё это ещё предстоит переварить. А пока сознание греет всего одна простая фраза: "Мы это сделали!" ✊✅
Но не время расслабляться — завтра начинается конференция Saint HighLoad++, где я выступаю с докладом. И хотя это не #спорт, подготовка здесь тоже большая, с февраля. Посмотрим, что получится👀
Как поклоннику обоих видов спорта, мне было интересно попробовать этот безумный коктейль, и в 2018-ом году я впервые пробежал и проплыл дистанцию в 9 км в Новосибирске. Мне сразу же дико понравилось (об этом даже остался очерк), я купил специальный гидрокостюм под это дело, и с тех пор практически каждое лето старался участвовать в такой активности хоть в каком-нибудь формате. В основном, это были небольшие тренировки и самогонки (неофициальные соревнования среди знакомых), но был и довольно серьёзный старт в Ленинградской области в 2022 году, откуда я привез медальку за 1-е место среди мужских команд на средней дистанции 16 км 🏆
И вот спустя ещё три года появилось желание и возможность замахнуться на ступеньку выше — преодолеть на тех же соревнованиях максимальную дистанцию 32 км. Мы с напарником Николаем провели три подготовительные тренировки, отработали множество нюансов и вчера вместе с толпой таких же свимраннеров рванули по лесной тропе под стартовый свисток...
32 км, 41 этап (28 км бега и 4 км плавания), 18 градусов в воде и 15 на воздухе, 4 часа 59 минут... Это было круто! 💥
Впечатления, выводы, наблюдения — всё это ещё предстоит переварить. А пока сознание греет всего одна простая фраза: "Мы это сделали!" ✊✅
Но не время расслабляться — завтра начинается конференция Saint HighLoad++, где я выступаю с докладом. И хотя это не #спорт, подготовка здесь тоже большая, с февраля. Посмотрим, что получится👀
🔥8
Forwarded from JPoint и Joker — канал конференций по Java
#видеозаписи
Открываем новую видеозапись выступления:
Владимир Плизга — Путеводитель по профилированию приложений на JVM
YouTube | VK Видео
Скачать презентацию с сайта JPoint
Открываем новую видеозапись выступления:
Владимир Плизга — Путеводитель по профилированию приложений на JVM
YouTube | VK Видео
Скачать презентацию с сайта JPoint
YouTube
Владимир Плизга — Путеводитель по профилированию приложений на JVM
Подробнее о Java-конференциях:
— весной — JPoint: https://jrg.su/gTrwHx
— осенью — Joker: https://jrg.su/h7yvG4
— —
Скачать презентацию с сайта JPoint — https://jrg.su/F9c6ys
Когда ваше приложение тормозит, да еще на production, важно уметь быстро ответить…
— весной — JPoint: https://jrg.su/gTrwHx
— осенью — Joker: https://jrg.su/h7yvG4
— —
Скачать презентацию с сайта JPoint — https://jrg.su/F9c6ys
Когда ваше приложение тормозит, да еще на production, важно уметь быстро ответить…
🔥5❤3🤩1
Вот и отгремела конференция Saint HighLoad++ 2025 в Петербурге. Это были два дня насыщенного общения, интересных докладов и приятного осознания, что в России есть люди, умеющие организовывать масштабные продолжительные мероприятия (почти 2,5 тысячи человек) с точностью до запасных ручек (это не шутка) 💪🏼
Мой доклад, в целом, прошёл нормально, хотя я ожидал, что придёт больше людей. То ли начало в 10:00 после афтепати оказалось многим не под силу, то ли "Узкотематическая секция" показалась не релевантной, то ли название и описание доклада не вызвали отклика в душах и разумах. Как бы там ни было, я благодарен всем, кто всё же пришёл и послушал — я реально горел этой темой, с удовольствием готовился и с нетерпением ждал возможности поделиться ею с вами. Надеюсь, это чувствовалось 🙏🏼
Обратная связь, как и видео запись, будет позже. А пока могу поделиться слайдами: https://toparvion.pro/event/2025/highload/ Приятного прокликивания🙂
Мой доклад, в целом, прошёл нормально, хотя я ожидал, что придёт больше людей. То ли начало в 10:00 после афтепати оказалось многим не под силу, то ли "Узкотематическая секция" показалась не релевантной, то ли название и описание доклада не вызвали отклика в душах и разумах. Как бы там ни было, я благодарен всем, кто всё же пришёл и послушал — я реально горел этой темой, с удовольствием готовился и с нетерпением ждал возможности поделиться ею с вами. Надеюсь, это чувствовалось 🙏🏼
Обратная связь, как и видео запись, будет позже. А пока могу поделиться слайдами: https://toparvion.pro/event/2025/highload/ Приятного прокликивания🙂
🔥6
Баги, которые исчезают сами — самые страшные.
Ведь если они сами исчезают, значит, они могут в любой момент сами и появиться... 🤔🙈
Ведь если они сами исчезают, значит, они могут в любой момент сами и появиться... 🤔🙈
😁7💯3
В амбициозные планы этого года, помимо лыжного марафона (в марте в Томске), входил марафон плавательный – ещё осенью прошлого года я вместе с друзьями по спортивному клубу купил слот на 10 км вплавь по одному из чистейших водоёмов России – озеру Тургояк в Челябинской области. Этот заплыв должен был стать для меня компенсацией, в целом, успешного, но очень тяжелого заплыва на ту же дистанцию на Кузбассе в 2021 году; хотелось бахнуть ту же дистанцию быстрее и, по возможности, легче ⚖️
Однако чем ближе становился этот старт, тем больше я сомневался в своей готовности и желании в нём участвовать: плавательных объёмов не хватало, прогноз погоды предвещал холодную воду, а приступ увлечения swimrun’ом не давал забыть, что вообще-то бег я люблю ни чуть не меньше, чем плавание. А тут ещё выяснилось, что организаторы предстоящего заплыва экспериментируют с форматами и добавляют не только плавание… Дело кончилось тем, что незадолго до старта я разменял свой 10-километровый плавательный слот на два: 5 км вплавь в тот же день (в эстафете) и акватлон накануне: 5 км бегом, 2 км вплавь, 5 км бегом. По нагрузке это примерно как два полумарафона подряд ⏩
В акватлоне я начал весьма бодро, быстро вырвался вперёд и завершил первый беговой этап лидером, хотя бежал по силам, не рвал. А вот последовавшее плавание стало неприятной сменой: первый же участок пролегал на встречу волнам и он тут же вскрыл моё слабое место – пока я с ними боролся, меня обошли сразу несколько атлетов, догнать которых было крайне сложно. На втором беговом этапе, несмотря на появившуюся усталость, я сохранил почти тот же, довольно высокий по меркам остальных темп, однако отыграть накопленное отставание времени не хватило, и я финишировал через 1:36, став только 4-ым из 18 участников 🏆
Следующее утро (в день заплыва на 5 км) было безветренным, вода гладкой, а небо чистым – близкие к идеальным условия. Таковыми они и остались для первого этапа эстафеты. Однако для нас, плывших после, уральская погода приготовила сюрприз – уже к концу первого километра на воде появилась рябь, уверенно переходящая в волнение. Этот процесс уверенно развивался с каждой сотней метров, а вместе с ним постепенно деградировал и темп. И хотя волны были не встречными, а попутно-диагональными, они всё равно здорово усложняли ориентирование и дыхание, а под конец ещё и стали причиной непрерывной борьбы с собственным буем, постоянно забрасываемым вперёд. В этом режиме я достиг финиша лишь через 1:56, а наша команда стала 12-ой из 16 заявившихся 🏅
Несмотря на эти сложности, я остался очень рад и доволен участием и поездкой в целом. Отдельно благодарю друзей, которые болели и помогали до, во время и после обоих стартов – мне было нереально приятно слышать, видеть и чувствовать их поддержку! В этот раз наш новосибирский десант на Тургояк насчитывал вместе с детьми 23 человека, и такая общность – предмет отдельной большой гордости. Видно, #спорт и правда объединяет! 🤗
Однако чем ближе становился этот старт, тем больше я сомневался в своей готовности и желании в нём участвовать: плавательных объёмов не хватало, прогноз погоды предвещал холодную воду, а приступ увлечения swimrun’ом не давал забыть, что вообще-то бег я люблю ни чуть не меньше, чем плавание. А тут ещё выяснилось, что организаторы предстоящего заплыва экспериментируют с форматами и добавляют не только плавание… Дело кончилось тем, что незадолго до старта я разменял свой 10-километровый плавательный слот на два: 5 км вплавь в тот же день (в эстафете) и акватлон накануне: 5 км бегом, 2 км вплавь, 5 км бегом. По нагрузке это примерно как два полумарафона подряд ⏩
В акватлоне я начал весьма бодро, быстро вырвался вперёд и завершил первый беговой этап лидером, хотя бежал по силам, не рвал. А вот последовавшее плавание стало неприятной сменой: первый же участок пролегал на встречу волнам и он тут же вскрыл моё слабое место – пока я с ними боролся, меня обошли сразу несколько атлетов, догнать которых было крайне сложно. На втором беговом этапе, несмотря на появившуюся усталость, я сохранил почти тот же, довольно высокий по меркам остальных темп, однако отыграть накопленное отставание времени не хватило, и я финишировал через 1:36, став только 4-ым из 18 участников 🏆
Следующее утро (в день заплыва на 5 км) было безветренным, вода гладкой, а небо чистым – близкие к идеальным условия. Таковыми они и остались для первого этапа эстафеты. Однако для нас, плывших после, уральская погода приготовила сюрприз – уже к концу первого километра на воде появилась рябь, уверенно переходящая в волнение. Этот процесс уверенно развивался с каждой сотней метров, а вместе с ним постепенно деградировал и темп. И хотя волны были не встречными, а попутно-диагональными, они всё равно здорово усложняли ориентирование и дыхание, а под конец ещё и стали причиной непрерывной борьбы с собственным буем, постоянно забрасываемым вперёд. В этом режиме я достиг финиша лишь через 1:56, а наша команда стала 12-ой из 16 заявившихся 🏅
Несмотря на эти сложности, я остался очень рад и доволен участием и поездкой в целом. Отдельно благодарю друзей, которые болели и помогали до, во время и после обоих стартов – мне было нереально приятно слышать, видеть и чувствовать их поддержку! В этот раз наш новосибирский десант на Тургояк насчитывал вместе с детьми 23 человека, и такая общность – предмет отдельной большой гордости. Видно, #спорт и правда объединяет! 🤗
🔥8
Немного пятницы в эфире "Верхней полки" 📺
В одном из соседних чатов проскользнула ссылка на т.н. Хороший Учебный Язык (программирования) от земляка-новосибирца Алексея Кутепова:
https://github.com/tsoding/good_training_language
В духе гремящего импортозамещения язык предлагает писать примерно так:
Глядя на это, сразу вспоминается язык 1С:
А если взглянуть на аббревиатуру названия, то вспоминается другой язык — некогда шумевший YoptaScript, код на котором тоже пишется по-русски, но, кхм-кхм, со своей спецификой (18+):
```
result сука a иличо b нах
result сука a ичо b нах
вилкойвглаз (x пизже 0 иличо y хуёвей 10) жЫ
шухер( 'Ыгыыг' ) нах
a внатуре пиздишь нах
есть
```
Если знаете другие языки программирования, основанные на русском (или хотя бы кириллице), поделитесь, пожалуйста — будет любопытно добавить их в эту копилку 🗳
В одном из соседних чатов проскользнула ссылка на т.н. Хороший Учебный Язык (программирования) от земляка-новосибирца Алексея Кутепова:
https://github.com/tsoding/good_training_language
В духе гремящего импортозамещения язык предлагает писать примерно так:
вкл прелюдия;
конст ВЫСОТА := 10;
пер скрытое_поле: массив(ВЫСОТА, массив(ШИРИНА, лог));
про отобразить_поле() нч
для строка := 1..ВЫСОТА нч
для столбец := 1..ШИРИНА нч
если поле(строка - 1)(столбец - 1)
то печать(«%»);
иначе то печать(«_»);
кц
печать(«\н»);
кц
кц
Глядя на это, сразу вспоминается язык 1С:
&НаКлиенте
Функция РассчитатьПроцентНаценки(ЦенаЗакупки, ЦенаПродажи)
ПроцентНаценки = 0;
Если ЦенаЗакупки <> 0 Тогда
ПроцентНаценки = (ЦенаПродажи - ЦенаЗакупки) * 100 / ЦенаЗакупки;
КонецЕсли;
Возврат ПроцентНаценки;
КонецФункции
А если взглянуть на аббревиатуру названия, то вспоминается другой язык — некогда шумевший YoptaScript, код на котором тоже пишется по-русски, но, кхм-кхм, со своей спецификой (18+):
result сука a иличо b нах
result сука a ичо b нах
вилкойвглаз (x пизже 0 иличо y хуёвей 10) жЫ
шухер( 'Ыгыыг' ) нах
a внатуре пиздишь нах
есть
```
Если знаете другие языки программирования, основанные на русском (или хотя бы кириллице), поделитесь, пожалуйста — будет любопытно добавить их в эту копилку 🗳
GitHub
GitHub - tsoding/good_training_language: Хороший Учебный Язык
Хороший Учебный Язык. Contribute to tsoding/good_training_language development by creating an account on GitHub.
😁5
Оказывается, многолетний холивар между поклонниками текстовых редакторов Vim и Emacs настолько известен и благодатен для шуточек, что даже Google не устоял и добавил себе пасхалочку на эту тему 🐣
Об этом, кстати, есть заметка в Википедии в статье с недвусмысленным названием Editor war 🪖
Об этом, кстати, есть заметка в Википедии в статье с недвусмысленным названием Editor war 🪖
😁6
Весьма забористый баг довелось встретить и пофиксить намедни. В одной таблице в Cassandra хранились некие события, вычитываемые по их дате. И почему-то в некоторых нечастых случаях запрос из нашего приложения не возвращал ничего, хотя события за запрашиваемые даты совершенно точно хранились в БД (проверено вручную). Мистика, не иначе 👻
Как выяснилось, временные метки событий хранились не в чистом виде, а как
А поскольку ID события у нас имеют тип
На второй день расследования, выдёргивая последний клок волос из головы, я набрёл в исходниках Cassandra на реализацию CQL-функций
Другими словами, целочисленный идентификатор, который вставляется в UUID, трактуется Cassandra'ой как знаковый, а значит, его старший разряд относится не к самому числу, а к его знаку. И поэтому, когда мы через
Решением стал отказ от ручного формирования TimeUuid на основе
Вывод:всё тлен при работе с TimeUuid помнить про его составную природу и по максимуму отряжать манипуляции с ним на сторону либо Cassandra, либо её драйвера ✍️
#бывает
Как выяснилось, временные метки событий хранились не в чистом виде, а как
TimeUuid
— длинный целочисленный идентификатор, включающий в себя как timestamp события, так и его ID (это делается, чтобы исключить коллизии между событиями, произошедшими в один момент времени, а также чтобы сохранить для ключа все свойства обычного целочисленного ID). Как следствие, одному timestamp-у может соответствовать множество значений TimeUuid, и, чтобы это учесть, при реализации поиска событий мой предшественник-разработчик прибег к небольшой хитрости: стал задавать нижнюю границу поиска (минимальную дату) в виде TimeUuid с неким минимальным ID события, а верхнюю границу (максимальную дату) — с максимально возможным ID 🗜А поскольку ID события у нас имеют тип
Long
, то и значения этих границ выбраны соответственно: 0
и Long.MAX_VALUE
. То есть задумка в том, что каким бы ни был фактический ID искомого события, он по-любому будет в диапазоне от 0 до Long.MAX_VALUE
. Казалось бы, что может пойти не так? 🧐На второй день расследования, выдёргивая последний клок волос из головы, я набрёл в исходниках Cassandra на реализацию CQL-функций
maxTimeuuid
и minTimeuuid
, в комментариях к которым написано:* The min and max possible lsb for a UUID.
* Note that his is not 0 and all 1's because Cassandra TimeUUIDType
* compares the lsb parts as a signed byte array comparison. So the min
* value is 8 times -128 and the max is 8 times +127.
Другими словами, целочисленный идентификатор, который вставляется в UUID, трактуется Cassandra'ой как знаковый, а значит, его старший разряд относится не к самому числу, а к его знаку. И поэтому, когда мы через
Long.MAX_VALUE
вкорячиваем туда что-то вроде 0xFF-FFFF-FFFFFF
, то получаем не максимально возможный идентификатор события, а какое-то (отнюдь не максимальное) отрицательное число. Соответственно, ID хранимых в БД событий начинают не особо предсказуемым образом делиться на те, что проходят проверку на сравнение с этим числом, и те, что нет. В нашем случае не проходили лишь пара десятков из почти 4000, поэтому отловить проблему было не просто 🕵️♂️Решением стал отказ от ручного формирования TimeUuid на основе
0
и Long.MAX_VALUE
в пользу тех самых функций из языка CQL, и условие поиска стало выглядеть примерно так:WHERE key = '...'
AND timestamp_uuid >= mintimeuuid('2025-06-01T00:00:00.000')
AND timestamp_uuid <= maxtimeuuid('2025-06-01T00:00:00.000')
Вывод:
#бывает
GitHub
cassandra/src/java/org/apache/cassandra/utils/TimeUUID.java at 8014eec7aad72415b3d53cb5cc6cacf76acf95c1 · apache/cassandra
Apache Cassandra®. Contribute to apache/cassandra development by creating an account on GitHub.
🔥7👍3