Славный АйТи – анонсы, технологии, GoLang
3.93K subscribers
130 photos
9 videos
125 links
Привет! Я GoLang разработчик, тимлид и автор канала про айтишечку https://www.youtube.com/@VyacheArt

Буду радовать вас роликами про хайлоад, рекламу и про всё то, что я знаю, а вам интересно послушать.

@VyacheslavG
Download Telegram
Хозяйке кликхауса на заметку

Реальный кейс: перетаскивал данные из одной большой таблицы в другую с изменением структуры через INSERT … SELECT. В какой-то момент селекты на перенесённых данных стали просто невозможно долгими, а при попытке переноса следующего куска я даже получил ошибку:

Code: 252. DB::Exception: Too many parts (5585 with average size of 1.14 MiB) in table 'db.table'. Merges are processing significantly slower than inserts. (TOO_MANY_PARTS)


Суть ошибки заключается в том, что партов (не путать с партициями) стало слишком много, а значит дальнейшая вставка нежелательна и может привести к деградации (о чём намекнули медленные селекты). Что вообще за парты?

Основной движок в ClickHouse – это MergeTree. И название тут уже многое говорит, потому что это действительно некое дерево слияний, которое особенно важно для быстрой вставки данных.

Как бы работала наивная медленная вставка? Мы бы брали входные данные, сортировали бы их по ORDER BY таблицы, затем брали бы файл с данными таблицы/колонки, и "расставляли" бы данные в соответствии с нужным порядком. Уже даже звучит не очень шустро.

ClickHouse же делает иначе: когда в INSERT приходят данные, он распределяет их по небольшим отсортированным партам. Пока без слияния: максимально быстро данные получил и сохранил на диск.

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

Для этого ClickHouse выполняет фоновое слияние партов (background part merges), когда берётся несколько десятков маленьких партов, данные в них сортируются и объединяются, и записываются в большой парт. Затем берутся большие парты, точно также данные сортируются и объединяются, и появляется ещё больший парт. И всё это происходит автоматически и в фоне, можно прямо проверить SELECT * FROM system.merges .

Подробнее можете прочитать в потрясающей доке https://clickhouse.com/docs/merges.


Я прочитал часть с Merges are processing significantly slower than inserts , и решил проверить эти самые "merges", выполнив SELECT * FROM system.merges . В этой таблице вы можете увидеть активные в данный момент операции слияния. Я удивился, не увидев там ни одной операции слияния нужной мне таблицы.

Окей, может там и не должно было ничего быть?

Проверил количество активных партов, выполнив SELECT COUNT(*) FROM system.parts WHERE database = 'db' AND table = 'table' AND active; , и что бы вы думали? 5585 партов! Нет, тут точно что-то пошло не так!

Видимо, я настолько утомил кликхаус, что он решил взять больничный! 😁

Решение
Подтолкнуть ClickHouse к обработке мержей оказалось легко и задокументировано. Я запустил:

SYSTEM START MERGES db.table;

И сразу увидел в system.merges, как парты таблицы начали сливаться.

Резюмируя 🤓
1. Похоже иногда может возникнуть ситуация, что ClickHouse "забудет" начать слияние новых партов таблицы. Вполне вероятно это фиксят в каждой новой версии, но многие ли из вас успевают апгрейдить такой важный компонент, ещё и регулярно?
2. Косвенным признаком является драматичное замедление селектов (приходится считывать слишком много разрозненных файлов).
3. Явным признаком является аномальное количество активных партов в system.parts и отсутствие какой-либо обработки в system.merges.
4. SYSTEM START MERGES db.table; волшебным образом "подталкивает" кликхаус начать обработку таблицы без перезапуска и прочего.

Славный АйТи 👨‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍147
Соскучились? Тогда кидаю в вас обновление Web Artisan Pro 1.8!

И изменения вам понравятся 🐣

🔥 JSON в Java POJO конвертер! Было множество просьб его сделать, поэтому жду столько же обратной связи! С поддержкой Lombok (и обычных геттеров/сеттеров, конечно), определением дат, указанием предпочтительного типа коллекций, чисел и другими опциями.

🔥 Экспорт из Text Comparer в unified diff format.

🔥 Возможность добавлять дополнительные таймзоны в Unix конвертере.

Было и множество улучшений того что уже есть:

▪️Поправил баг с экранированием не-ASCII символов в JSON string - Text конвертере.
▪️Доперевёл окно обновления и поправил вёрстку в нём.
▪️Кое-где надписи в кнопках заменил на иконки, чтобы они занимали меньше места в интерфейсе и вашей голове.
▪️Поскольку модули начинают всё больше обрастать кастомными настройками (впереди будет совсем конфетка), то сразу оптимизировал работу с их конфигами.


Спасибо вам огромное за фидбек, он составил большую часть изменений в этом обновлении, и рад, что пользуетесь! Рекомендуйте друзьям, через бота @WebArtisanProBot Славным Айтишникам лицензия всё ещё в подарок 🫰

По традиции: вы можете как скачать новый бинарник с сайта: https://web-artisan.pro/download
Так и в приложении нажать на иконку настроек в левом нижнем углу и кликнуть "Check for Updates...".

Я тут ещё параллельно работаю над очень амбициозной версией 2.0 (до неё ещё несколько 1.x будет), в которой хочу воплотить парадигму, которая превратит Web Artisan в то изначальное видение, которое не до конца получилось сделать в 1 версии. Ведь это должно быть не просто набором инструментов, а набором переиспользуемых блоков, которые комбинируются друг с другом, встраиваются в любой пайплайн и расширяются самим разработчиком. Примерно как у Obsidian, или как идеология Anytype (по крайней мере как я её понимаю). Готовлю ролик ещё, в котором надеюсь получится рассказать что имею ввиду, так что не теряйте меня в суматохе кодеробудней 🧑‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥33👍114👏3
Тик-так, и вот-вот он уже наступит :)

Какое у вас послевкусие от 2025 года? У меня он выдался удивительно насыщенным (хотя по интернет-активности так и не скажешь).

Ещё в 2024 я долго готовил Web Artisan, и в феврале 2025 его показал. Потом началась пятимесячная учёба на курсе CTO, во время которой имел честь перенимать знания у умных людей. А в середине года смог воплотить в жизнь формат исследования, и показал вам как работает время в современных ОС! Для меня это очень важная работа, я очень хочу этот формат сделать "флагманским" у себя на канале.

В процессе даже получилось написать несколько полезных постов здесь, которые вам понравились, вот ТОП3:

Про отличие RGBA и BGRA, и почему вы превратились на фото в смурфа
Как Anytype делает нативные кроссплатформенные клиенты под десктопы и мобилки с общим ядром на Go
В какой момент вычисляются аргументы для defer в Go

А последние несколько месяцев в уходящем году – это полный хаос. Я сильно ушёл в Rust (да!); сломал режим сна настолько, что начал ложиться в 9 утра, а в декабре вроде смог сдвинуть его ближе к нормальному; упоролся с мини-серверной стойкой и много-много времени провёл за интересными рабочими задачами.

Что планирую в 2026?

• Воплотить в жизнь Web Artisan Pro 2.0 в том виде, в котором я его задумал ещё в 2024. Это должна быть воистину гибкая утилита на быстром стеке с минимальным размером бинарника и потреблением ОЗУ (насколько это возможно).
• Выпустить три видео-исследования, связанные с Computer Science. Я сильно ушёл в изучение компьютерной литературы, особенно в события 20го века, и это удивительное время! А самое удивительное, что огромный корень фундамента компьютеров заложен ещё в 19 веке.
• Плотно заняться ютубом, и завести регулярный формат. Не такой глобальный, как в пункте выше, любая сложная качественная работа требует времени, но без регулярности и количество сложно найти то самое качество.

Огромное спасибо вам, что были со мной в этом году! Я желаю вам иметь качественный и стабильный сон (для нашей профессии это база, ночные вы мои друзья!), замечать все положительные тенденции в вашей жизни (вы умнички!), и чтобы никто не смел ограничивать доступ к знаниям.

С Новым 2026 Годом, славные айтишники! 🌲 🥗
🎄25👍12🔥83
А я исполнил мечту и взял себе анаморфную оптику! Ещё и автофокусную!

Это Sirui 40 mm T1.8. Наверное, самый дорогой объектив, который у меня есть :)

Вот уже пару недель пишу сценарий к ролику-исследованию, который надеюсь отснять на следующей неделе, и вы увидите его в действии. А пока вот вам примеры фото.

Как можете заметить, соотношение сторон тут не привычные 16:9, а целые 2.35:1, как у фильмов! Это получается за счёт "асферической оптики", которая проецирует на матрицу оптически сжатое изображение (squeezed). Сомневаюсь, что в роликах-уроках буду пользоваться полным соотношением, потому что скринкаст ведь в 16:9. Скорее, я хотел именно анаморфную оптику ради нестандартного характера, и ради вот этих бликов, которые мне кажутся такими "диджитальными". Сложно объяснить, но могу вас заверить точно: здравого смысла в этой покупке (почти) нет 😁
12🔥10👍7
А ещё у меня есть анонс для разработчиков из Тбилиси! Мне написал человек, который устраивает некоммерческий оффлайн-ридинг в Тбилиси по Computer Science.

Ближайшая встреча будет 27 января (вторник) в 20:00. Ниже вставлю анонс от Дамира.

Собираю оффлайн ридинг по computer science в Тбилиси

Всем привет! Собираю группу, чтобы читать и вместе обсуждать значимые академические и прикладные тексты: от алгоритмов до системного дизайна и метрик качества кода. Основной упор хочется делать не на технологиях как таковых, а на фундаментальных принципах и ограничениях, которые за ними стоят.

Важно: это не учебный курс, а именно формат совместной работы. Встречи планируются каждые две недели. 27 января в 20:00 будем обсуждать небольшую статью «Some Constraints and Tradeoffs in the Design of Network Communications» - Akkoyunlu, Ekanadham, Huber, в которой анализируется проблема синхронизации систем по ненадёжному каналу связи (т.н. «Задача двух генералов»).

Дальше будем формировать список для чтения вместе, но пока предлагаю следующие тексты:
- «The Byzantine Generals Problem» - Leslie Lamport, Robert Shostak, Marshall Pease
- «Cognitive Complexity. An Overview and Evaluation» - Ann Campbell
- «Go To Statement Considered harmful» -  Edsger Dijkstra

Если вы хотите присоединиться, напишите @pilatsis (и, пожалуйста, добавьте пару слов о себе)

Обо мне: разрабатываю бек-энд в game-dev и люблю lock-free алгоритмы


Звучит очень круто, я бы ходил. Никто в Ереване, случаем, не устраивает? :)
3👍3🔥2🌚1
Хочу поделиться способом, который помогает мне поддерживать актуальный контекст проектов, которые я веду, и более эффективно двигать их дальше

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

Самое сложное – переключаться между разными контекстами. Буквально каждое переключение у меня сопровождалось ступором. И спустя много итераций сформировались 7 вполне банальных вопросов, которые снижают сложность возвращения к проекту.

• Цель проекта
• Текущий статус
• Следующее действие
• Узкое место
• Люди
• Ожидания по Deadline
• Что считать успехом

Многие увидят здесь GTD, и не зря, это правда классная штука. Но он лишь частично здесь.

Цель проекта
Конкретная осязаемая польза от проекта в одном предложении. Именно цель помогает помнить зачем проект вообще нужен, а ограничение в одно предложение помогает не размывать внимание. Кроме шуток, формулированию цели можно уделить процентов 80 времени, а 20 остальным вопросам.

Во время работы будет множество выборов: где упороться и сделать сложнее, где поискать существующий опыт, а где можно не заморачиваться. Если вы хорошо сформулируете цель и ответ на вопрос "зачем?", то такие решения будут даваться намного проще.

Текущий статус
Одно предложение для обозначения текущего состояния: продумана архитектура; на верификации у заказчика; разрабатывается модуль А и так далее. Помогает быстро вспомнить на чём вы остановились.

Следующее действие
Конкретное осязаемое действие, которое вам нужно совершить, чтобы двигать проект дальше. Заполнять его надо до того, как вы переключитесь на другой проект (до момента выхода), а конкретно после того, как сделали предыдущее действие. Помогает быстро понять, что от вас требуется дальше.

Узкое место/критическая проблема
Что больше всего мешает двигаться прямо сейчас? Например, вы хотите "ускорить ответ статистики с 10 до 2 секунд для аналитиков", но база перегружена обилием INSERTов (фантазирую). Тогда узким местом может быть "для чтения и записи используется одна и та же база". Этот пункт помогает сфокусировать внимание на том, что действительно его требует, а не пытаться заниматься чем-то более понятным и простым, но не сильно помогающим решить проблему.

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

Люди/ключевые партнёры
Кто влияет на проект? От кого проект зависит? Будет особенно здорово, если вы напишете человека и его конкретную роль, в духе "Иван – владелец, распределяет бюджет, Сергей – админ, …".

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

Ожидания по Deadline
Здесь важна не конкретная точная дата, а именно контекст, который влияет на дедлайны. Например, после какого-то события проект может вообще потерять актуальность, либо проект вполне может ждать, но лучше успеть до сезонного всплеска нагрузки и так далее.

Этот пункт помогает понять нужно ли проект пушить прямо сейчас и актуален ли он в принципе.

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

Что считать успехом
Любой проект при желании можно продолжать бесконечно, рефакторить, пересматривать и так далее. И это нормально. Но проект про конечную цель. Ваше внимание всегда можно потратить на принесение новой пользы, а хвосты этому мешают.
7👍2
(продолжение)

Этот пункт и должен помочь вам в конкретный момент решить, что проект можно считать завершённым (пусть и не идеальным). Это должен быть чётко сформулированный пункт с ответом в стиле "да/нет" без размытых формулировок и идеальности. Обычно он коррелирует с "узким местом".

В итоге у вас должен получиться короткий документ на 7-8 предложений, который поможет именно вернуться в контекст проекта. Это не лог, не список задач, не inbox, это точка входа.

А как у вас устроено управление множеством проектов? К чему вы пришли за свой опыт? Будет здорово услышать ваше мнение про то, насколько вопросы выше оказались для вас банальными, или у меня когнитивное искажение "это и так понятно" 😕
👍81🤔1
Существует такая оптимизация компилятора, как девиртуализация, которая помогает убрать накладные расходы при использовании косвенных вызовов: например, интерфейсов или дженериков.

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

Можете увидеть детальнее в коротком ролике https://youtube.com/shorts/Bov2wEYvy7g 👨‍🎓


К слову, любопытно, что при этом он всё равно поддерживает служебные регистры в том состоянии, какими они были бы при косвенном вызове:


MOVD $main..dict.GenericHasBerries[main.ApplePie](SB), R26
MOVD $main.ApplePie.HasBerries(SB), R1
...
CALL (R1)


Смотрите: хоть в регистр R1 и был помещён прямой вызов (адрес) $main.ApplePie.HasBerries (из-за девиртуализации), но в R26 всё равно был помещён словарь для дженерика для поддержания согласованности!

https://youtube.com/shorts/Bov2wEYvy7g
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥81
Сегодня день, когда важно вспомнить: хотя математика и логика универсальны, но именно женщины первыми вдохнули их в мир машин, чтобы получилось то, что мы называем "программированием".

Нам это доказали:

Ада Лавлейс, которая вопреки ограничениям своей эпохи (но благодаря своим возможностям) первой обосновала концепцию универсальной вычислительной машины.
Шестёрка ENIAC – женщины-математики, которые отделили программную логику от железа (Кэтлин Макналти, Фрэнсис Билас, Элизабет Дженнингс, Фрэнсис Элизабет Снайдер, Рут Лихтерман и Мэрилин Мельцер).
Грейс Хоппер – создательница первого компилятора, и авторка идеи машинно-независимых языков программирования.
Барбара Лисков, сформулировавшая принципы надёжной архитектуры, на которых держится современный софт.

Но если логика едина для всех, то путь к ней всегда был политизирован.

Во времена Ады (19-й век) женщин не пускали в университеты. В 20-м веке их пустили, но даже Барбару Лисков в 60-е годы не рассматривали на инженерные должности "по умолчанию". Я и по сей день сталкиваюсь с предвзятостью при найме в IT.

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

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

С 8 Марта! С днём женской солидарности!
27👍2🔥2
Хэй, ночные самураи, ловите обнову Web Artisan Pro 1.9! 👨‍💻

🔥 Новые модули: JWT Debugger с парсингом и генерацией JWT и проверкой сигнатуры; и... блокнот?!

Да, мне часто нужно куда-то вставить промежуточный результат, и мне надоело искать для этого окно саблайма. А здесь ещё и возможность быстро "переслать" текст в другой модуль. Нужна ли такая же возможность "пересылать" данные между сами модулями? Пишите!

🔥 Возможность выбирать диалект SQL в SQL Beautifier! С поддержкой диалекта ClickHouse, уж очень часто с ним работаю :)

⭐️ В String Inspector теперь можно увидеть длину строки в разных кодировках, Base64 и Base32 (по вашему фидбеку!)

▪️В настройках теперь есть диагностическая вкладка, чтобы быстро перейти в директорию с конфигами и рабочими файлами приложения (теперь вы легко знаете где они лежат), и с переходом в директорию с бинарником. Чуть позже тут появятся настройки логирования, оно уже в работе 🧑‍💻

▪️В SQL Beautifier исправлен баг с пробелами в некоторых выражениях, в частности в CASE...WHEN, когда пробел не ставился, и выражение становилось невалидным. Большое спасибо за багрепорт!

🧠 И чисто архитектурное изменение, которое вы не слишком заметите: разработал другой подход для работы с двусторонними модулями с автообновлением. Сейчас использую в JWT Debugger и в Text-Base64. Я унифицировал понятие Input и Output внутри, и привязал их к конкретному формату. За счёт этого теперь возможна именно двусторонняя связь, когда можно менять Output и влиять на Input и наоборот. Строго говоря для пользователя в том и суть, что теперь оба поля могут быть "Input". Много сложностей было внутри, поэтому распространять по остальным модулям буду аккуратно, тщательно тестируя (хотя куда уж тщательнее..).

По традиции: вы можете как скачать новый бинарник с сайта: https://web-artisan.pro/download
Так и в приложении нажать на иконку настроек в левом нижнем углу и кликнуть "Check for Updates...".

(Если вы под влиянием организации из трёх букв, то замечено, что скачивание бинарника с сайта работает стабильнее, чем из приложения. Авиасейлс, для вас рекламный слот есть всегда, свяжитесь со мной.)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥226❤‍🔥2👍1