Естественно, стало интересно, как именно генерят данные на вход. И вот что в целом там происходит: 1. Методы для фаззинга не переизобретали, а просто используют стороннюю либу libfuzzer, а также свой генератор псевдослучайных чисел PCG 2. Жизненный цикл fuzz‑итерации выглядит примерно так: - из seed corpus выбирается случайный элемент (seed input) - передаётся в mutate(), где изменяется случайными операциями - новый инпут передаётся в наш fuzz target - если этот мутированный инпут даёт новое пок...
Daria’s room
Копаюсь в недрах Go, проектирую схемы, абстракции, а главное - учусь Буду рада пообщаться! -> @darya_smyr https://github.com/dariasmyr
Графики
📊 Средний охват постов
📉 ERR % по дням
📋 Публикации по дням
📎 Типы контента
Лучшие публикации
20 из 20Контексты и неочевидности с WithoutCancel Когда мы создаём контекст с отменой: ctx, cancel := context.WithCancel(parentСtx) родительский контекст хранит ссылки на все дочерние контексты с cancel в отдельной мапе map[canceler]struct{} Поэтому, если не отменить дочерний контекст (или его родителя), референс на него продолжит храниться в мапе (и о чем нам потом любезно сообщит go vet). Об этом пишут прямо в описании либы context: Failing to call the CancelFunc leaks the child and its children until...
Сегодня открыла для себя fuzzy тесты, которые уже оказывается много лет существуют наряду с unit и benchmark тестами. А назначение у них как раз автоматически прогонять через функцию кучу разнообразных входных данных, включая редкие и нетипичные варианты (пустые длинные/короткие строки, NaN, битые unicode символы, спец байты и тд). В моем проекте сейчас, который касается расчета цен и скидок, важно учесть все нетривиальные случаи, поэтому fuzzy тесты зашли на ура. Базово работа с fuzz тестом выг...
Part 2: Simple / Extended Protocol Тут будут краткие выдержки из статьи, которая, на мой взгляд, максимально понятно раскрывает плюсы и минусы использования обоих протоколов с учетом всех обновлений. Вообще поддерживаются несколько протоколов передачи запросов (если можно там выразиться), которые в основном разделяются на Simple и Extended. Simple Protocol отправляет весь запрос одной raw строкой, где драйвер в одном проходе выполняет все этапы - parse, analyze, plan и execute. Этот подход прост...
Bloom Filter🌸 Пока все копаются в иишном схематическом поиске, кто-то продолжает копаться в вещах попроще классических алгоритмах фильтрации. Около года назад увидела Bloom filter в одном из обновлении кликхаус, и только сейчас захотелось его разобрать. Если кратко: это быстрая вероятностная проверка принадлежности элемента множеству без хранения самих элементов. То есть мы получаем ответ либо «точно нет», либо «возможно, да»: допускаем ложноположительные (lp) срабатывания, но выигрываем в скор...
Балансировка соединений в постгрю через pgx Задача: настроено три haproxy: 1 мастер и 2 ro-реплики, но на практике мы работаем только с одним хостом. При failover (переключении мастера) есть риск, что клиент будет продолжать использовать старый коннект,…
Search Engine Part 2: Radix Trie for Fast and Compact Indexing Выше я уже описала базовый принцип работы сжатого префиксного дерева: вместо хранения одного символа на узел мы храним максимально длинный общий префикс (lcp), а узлы создаются только там, где действительно есть продолжение слова. Это позволяет избавиться от дублирования префиксов и сделать структуру индекса компактнее. Подробный пример вставки в radix trie большой и проще его реализацию посмотреть прямо в проекте Алгоритм поиска в r...
🐤Cuckoo Filter: удаление через fingerprints/вытеснение и поиск через XOR Дорогой читатель подкинул другие варианты вероятностных фильтров получше, ничего не могу поделать, разбираем Cuckoo Filter... Фишка этого фильтра в том, что в отличии от установки n бит в общем битсете, как в Bloom Filter, он хранит отрезок хеша - fingerprint (или fp) и размещает его в одном из двух возможных бакетов. Если оба бакета заняты, используется алгоритм cuckoo-kicks (вытеснения). Для каждого ключа вычисляется fp ...
Ранее я писала про мультихост-подключение к postgres и идею разделить соединения на два пула — для чтения с реплик и записи в мастер. Недавно эта реализация успешно доехала до прода и снизила нагрузку responce time в несколько раз, а позже я наткнулась на…
Part 2: HAMT Search & Insert operations Вставка слова в HAMT: Начинаем с нулевого узла (корня) и берем хешик node := nodeptr(0) hash := strhash32(key) На первых 5 уровнях спускаемся по Node, создавая новые при необходимости: for range depth - 2 { var…