Search
Write a publication
Pull to refresh
1909
208.2

Переводчик-фрилансер

Send message

«Почему компилятор Rust такой медленный?»

Level of difficultyMedium
Reading time43 min
Views1.7K

Я потратил месяц на создание веб-сайта в Docker и теперь готов поделиться ужасными историями.

У меня есть проблема.

Мой веб-сайт (на котором была опубликована эта статья) в основном обслуживается одним двоичным файлом Rust. Он стал слишком длинным. Каждый раз, когда мне нужно внести изменение, я должен:

Собрать новую статически компонуемую библиотеку (с --target=x86_64-unknown-linux-musl)

1. Скопировать её на сервер

2. Перезапустить веб-сайт

Ситуация, мягко говоря, неидеальная.

Поэтому мне бы хотелось перейти к развёртыванию веб-сайта при помощи контейнеров (будь то Docker, Kubernetes или что-то иное), в духе подавляющего большинства ПО, разворачиваемого в последний десяток лет.

Единственная проблема заключается в том, что реализовать быстрые сборки Rust с Docker не так уж просто.

Читать далее

Почему 21 см — это «магическая длина» нашей Вселенной

Level of difficultyMedium
Reading time11 min
Views23K

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

Самый распространённый атом во всей Вселенной — это водород, состоящий всего из одного протона и одного электрона. В процессе формирования новых звёзд атомы водорода ионизируются и снова становятся нейтральными, если эти свободные электроны смогут вернуться к свободному протону. Хотя электроны обычно переходят между допустимыми энергетическими уровнями вплоть до невозбуждённого состояния, при этом генерируется только конкретное множество инфракрасного, видимого и ультрафиолетового излучения. Но важнее то, что в водороде происходит особый переход, излучающий свет с длиной волны примерно с вашу ладонь: 21 сантиметров. Физики имеют полное право называть это значение «магической длиной» нашей Вселенной; возможно это число когда-нибудь раскроет нам самые тёмные секреты, таящиеся в самых глубинах космоса, которые никогда не сможет покинуть звёздных свет.

Читать далее

История успеха, из-за которой компания перестала работать с Rust

Level of difficultyMedium
Reading time6 min
Views19K

Пользователь Reddit опубликовал в r/rustjerk сгенерированный ИИ пост под названием «Почему наш CTO запретил использовать Rust после одного переписывания кода». Очевидно, что этот рассказ выдуман, но у меня есть история похожая на него в том смысле, что успех проекта на Rust привёл к прекращению использования этого языка в компании.

Несколько лет назад я работал в стартапе-«единороге», во время пандемии развивавшемся невероятно быстро. Его основное приложение было написано на Ruby on Rails, а часть инструментария для работы с видео — на Node.js, но мы никак не применяли быстрые компилируемые языки наподобие Rust и Go. Через пару месяцев после моего прихода в компанию нам нужно было реализовать работающий в реальном времени сервис, который бы позволял нам получать информацию о том, кто из пользователей находится онлайн (то есть в профиле есть зелёная точка) и чем они занимаются (например: N пользователей смотрят презентацию X, M пользователей находятся в разделе маркетинга и так далее). Ничего особо сложного, но мы рассчитывали на изначальный рост до ста тысяч пользователей. Эта цель тоже не особо сложна, но большинство разработчиков согласилось, что Ruby — не лучший выбор для этого.

Читать далее

Как я убедил виртуальную машину, что у неё есть кулер

Level of difficultyEasy
Reading time6 min
Views19K

Зачем вообще этим заморачиваться?

Некоторые образцы malware выполняют различные проверки, чтобы определить, запущены ли они в виртуальной машине. Один из самых частых способов — проверка наличия определённых аппаратных компонентов, обычно не эмулируемых в виртуальных средах. Один из таких компонентов — кулер процессора. Например, malware может проверять наличие кулера процессора, поискав в WMI класс Win32_Fan:

wmic path Win32_Fan get *

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

Зловредное ПО может определять, запущено ли оно в виртуальной машине, множеством разных способов. Есть различные классы WMI, позволяющие обнаружит присутствие виртуальной машины, например, Win32_CacheMemory, Win32_VoltageProbe и множество других.

В этом посте я расскажу о кулере процессора. Мне просто понравилась идея убедить виртуальную машину, что он у неё есть. Однако такой же подход можно применить к другим аппаратным компонентам и классам WMI.

Читать далее

Как я использую терминал

Level of difficultyMedium
Reading time8 min
Views12K

Я посвящу этой теме целый пост, потому что она «не помещается в окно Овертона»; чтобы люди хотя бы начали понимать, что я пытаюсь описать, мне обычно приходится показывать видео, которое я выложил под катом.

Читать далее

На сколько же медленнее произвольный доступ на самом деле?

Level of difficultyEasy
Reading time11 min
Views3.3K

Как вы, наверно, знаете, из-за наличия в компьютере различных кэшей (L1, L2, L3...) и того, что операции с памятью выполняются с линиями кэша размером примерно 64 байт каждая, для обеспечения максимальной производительности мы должны писать программы, обеспечивающие локальность.

(Разумеется, диск здесь не показан)

Но насколько хорошо вы это осознаёте? Допустим, у нас есть массив чисел с плавающей запятой и массив индексов первого массива. Есть программа, складывающая числа из первого массива в порядке, определяемом вторым массивом. То есть в этом примере мы будем складывать ε + α + δ + ζ + β + γ в таком порядке:

Давайте рассмотрим всего два случая: индексы идут в порядке от первого до последнего или в произвольном порядке. До того, как я начал писать этот пост, я не мог ответить ни на один из следующих вопросов:

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

2. Сколько в среднем тратится на каждый элемент в порядке от первого до последнего?

3. Насколько медленнее произвольный порядок последовательного в случае массивов, умещающихся в RAM?

4. Насколько медленнее произвольный порядок последовательного в случае массивов, не умещающихся в RAM?

5. Достаточно ли стандартного тасования Фишера-Йейтса для массивов перемешанных индексов для получения произвольного порядка?

6. Насколько медленнее порядок от первого до последнего в случае массивов, не умещающихся в RAM, при использовании файлов с отображением в память?

7. Максимально ли быстры файлы с отображением в память?

Если вы уже знаете ответы на эти вопросы, то это замечательно! Если же нет, то делайте ваши предположения и проверьте их, прочитав пост.

Читать далее

OpenAI взимает оплату поминутно, так что сделаем минуты короче

Level of difficultyEasy
Reading time7 min
Views4.6K

Я имею в виду буквально. Перед транскрибацией увеличьте скорость аудио в два или в три раза в ffmpeg. Благодаря этому вы потратите меньше токенов и вам придётся меньше ждать, а качество транскрипции почти не снизится.

Вот и всё!

Ниже показан скрипт, сочетающий все мои трюки для выполнения этой задачи. Для его работы необходимо установить yt-dlpffmpeg и llm.

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

Вам стоит продолжить чтение, если вы недоумеваете, почему я просто не воспользовался встроенной автотранскрибацией YouTube. Краткий ответ будет таким: я недотёпа, считавший (ошибочно), что она недоступна. Поэтому мне пришлось идти по более сложному пути.

Читать далее

Почему C++ считает мой класс копируемым, если его нельзя скопировать?

Level of difficultyMedium
Reading time3 min
Views5.9K

Рассмотрим следующий сценарий:

template<typename T>
struct Base
{
// Есть конструктор по умолчанию
Base() = default;

// Некопируемый
Base(Base const &) = delete;
};

template<typename T>
struct Derived : Base<T>
{
Derived() = default;
Derived(Derived const& d) : Base<T>(d) {}
};
// Это assertion выполняется?
static_assert(
std::is_copy_constructible_v<Derived<int>>);

Почему выполняется это assertion? Очевидно, что скопировать Derived<int> нельзя, ведь при этом мы попытаемся скопировать некопируемый Base<int>. И в самом деле, если попробовать скопировать его, то мы получим ошибку.

Читать далее

Тайное уравнение, позволявшее США следить за всеми

Level of difficultyMedium
Reading time5 min
Views42K

В 2006 году АНБ скрыла в криптографическом стандарте Dual EC DRBG математический бэкдор. Агентство отрицало его наличие восемь лет. Затем утечки Сноудена подтвердили его существование.

Двойные эллиптические кривые (Dual Elliptic Curve) используются как безопасные генераторы случайных чисел (RNG). Математический бэкдор позволял правительству США расшифровывать SSL-трафик Интернета (Green 2013)1.

Эта статья будет технически глубоким исследованием для программистов. Мы реализуем и исходную правительственную научную статью (SP 800-90 2006)2, и бэкдор, обнаруженный исследователями Microsoft (Shumow & Ferguson 2007)3.

На моём домашнем компьютере для взлома 28 байт (не бит) при помощи этого бэкдора требуется 2 минуты. Представьте, какой объём Интернет-трафика правительство США могло расшифровывать при помощи суперкомпьютеров Министерства обороны.

Читать далее

Решаем задачу про ферзей при помощи SMT-солвера

Level of difficultyEasy
Reading time5 min
Views991

Автор статьи Modern SAT solvers: fast, neat and underused утверждает, что SAT-солверы «преступно мало используются в нашей отрасли». [SAT — Boolean SATisfiability Solver, то есть солвер, способный находить присвоения, делающие истинными сложные булевы выражения. Более подробно я писал о них ранее.] Какое-то время назад я задался вопросом, почему: как получилось, что они настолько мощны, но ими никто не пользуется? Многие специалисты заявили, что причина в неудобстве кодирования SAT: они лучше предпочтут работать с инструментами, которые выполняют компиляцию в SAT.

Я вспомнил об этом, когда прочитал пост Райана Бергера о решении «задачи ферзей с LinkedIn» как задачи SAT.

Вкратце опишу задачу про ферзей (Queens). У нас есть сетка NxN, разделённая на N областей, и нам нужно разместить N ферзей так, чтобы в каждом столбце, строке и области находился ровно один. Ферзи могут находиться на одной диагонали, но не соседствовать по диагонали.

Читать далее

Почему Rust так мало волнует производительность компилятора

Level of difficultyEasy
Reading time15 min
Views7.9K

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

Кроме того, наряду с обычными жалобами на время компиляции, я начал замечать от раздражённых разработчиков на Rust и подобные заявления: «Почему Rust Project не занимается активнее этой важной и очевидной проблемой? Почему с этим что-нибудь не сделают?». Я участник рабочей группы по производительности компилятора Rust, поэтому воспринимаю такие вопросы очень серьёзно. И, разумеется, у меня есть мнение по этому поводу. В этом посте я приведу свои размышления, способные служить ответами на эти (и похожие) вопросы.

Предупреждение: все выраженные в этом посте мнения исключительно мои и необязательно отражают точку зрения Rust Project (группы контрибьюторов и мейнтейнеров тулчейна Rust).

Читать далее

Современное шифрование, которое берёт своё начало в искусстве и математике Ренессанса

Level of difficultyEasy
Reading time6 min
Views2.6K

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

Его звали Филиппо Брунеллески. Он использовал этот аппарат, чтобы нарисовать расположенный рядом с собором баптистерий. Если его биографы не ошибаются, для этого он применил законы перспективы, открытые им приблизительно в 1415-1420 годах. Использование законов перспективы, поразившее случайных прохожих, изменило курс развития западного искусства более чем на 450 лет. Позже оно привело к математическим открытиям, позволившим реализовать эллиптическую криптографию — схему защиты, лежащую в основе биткойна и других криптовалют; сейчас она становится всё более популярным способом шифрования и на других Интернет-платформах.

Но как искусство Ренессанса привело к математическим основам современной криптографии? Эта история растянулась на шесть веков и два континента, прикоснувшись к самой вечности. Персонажами её стали французский военнопленный и два математика, умершие на пике своего развития, один от болезни, другой — от пистолета дуэлянта.

Читать далее

Глубокое обучение в науке вредно без глубокой проверки фактов

Level of difficultyEasy
Reading time7 min
Views4.4K

Глубокое обучение гламурно и ажиотажно. Если обучить трансформер (современную языковую модель) на датасете из 22 миллионов ферментов, а затем использовать его для прогнозирования функции 450 неизвестных ферментов, то можно опубликовать свои результаты Nature Communications (уважаемом научном издании). Вашу статью прочитают 22 тысяч раз и она будет в верхних 5% из всех результатов исследований по оценке Altmetric (рейтингу внимания к онлайн-статьям).

Однако если вы проделаете кропотливую работу по анализу чужой опубликованной работы и обнаружите, что она полна серьёзных ошибок, в том числе сотнями некорректных прогнозов, то можете опубликовать на bioRxiv препринт, который не получит и доли цитат и просмотров исходного исследования. На самом деле, именно это и произошло в случае двух статей:

Functional annotation of enzyme-encoding genes using deep learning with transformer layers | Nature Communications

Limitations of Current Machine-Learning Models in Predicting Enzymatic Functions for Uncharacterized Proteins | bioRxiv

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

Читать далее

Тихая революция в интервальном запоминании информации

Level of difficultyEasy
Reading time9 min
Views21K

Что такое интервальные повторения

Освоение любого предмета построено на фундаменте знания: фактов, эвристик или тактик решения задач. Если предметная область — часть вашей повседневной работы, то вы, вероятно, осваиваете её многократно повторяющимся пересечением с этими знаниями. Но если вы учите что-то в свободное время, например, как я, изучая японский, то добиться того же уровня практики сложно.

То же самое относится и к предметам в школе или вузе: нескольких часов в неделю в классе или домашний заданий редко хватает для наработки крепкой базы знаний, особенно в таких предметах с большим объёмом фактов, как история или медицина. Под этим углом можно рассматривать даже ту часть своей жизни, которую мы не считаем связанной с обучением: не казались ли все эти подкасты и статьи с Hacker News полезнее, если бы мы могли вечно помнить полученную из них информацию?

Системы интервального повторения (spaced repetition) — один из самых проработанных решений этой проблемы. Это компьютерные программы, которые, по сути, показывают флеш-карточки с подсказками, на основе которых нужно вспомнить информацию, написанную на обратной стороне карточки.

Читать далее

Я сделал поисковик хуже Elasticsearch

Level of difficultyEasy
Reading time8 min
Views6K

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

BEIR — это бенчмарки поиска информации, ориентированные на сценарии использования в формате «вопрос-ответ».

Мой хобби-проект SearchArray добавляет в Pandas полнотекстовый поиск. Поэтому естественно, чтобы ощутить трепет от моих потрясающих навыков разработчика, я решил использовать BEIR для сравнения SearchArray с Elasticsearch (с тем же запросом + токенизацией). Поэтому я потратил субботу на интеграцию SearchArray в BEIR и измерение релевантности и производительности с корпусом MSMarco Passage Retrieval (8 миллионов документов).

Барабанная дробь...

Читать далее

Почему Android не может использовать CDC Ethernet

Level of difficultyEasy
Reading time13 min
Views9.3K

Если вам просто нужен ответ на вопрос в заголовке, то просто нажмите на TLDR и можете закрыть страницу. Но если вам любопытны подробности, то пристегнитесь, мы займёмся отладкой; этот пост в основном посвящён моему мыслительному процессу и методикам, которые я использовал, чтобы прийти к ответу.

Читать далее

Вероятно, вам не нужен DI-фреймворк

Level of difficultyEasy
Reading time6 min
Views7.3K

Я считаю, что при работе с Go в контексте нашей отрасли внедрение зависимостей (dependency injection, DI) часто имеет плохую репутацию из-за DI-фреймворков. Но сама по себе DI как техника довольно полезна. Просто её объясняют слишком большим количеством ОО-жаргона, что приводит к ПТСР у тех, кто перешёл на Go, чтобы сбежать из культа банды четырёх.

Читать далее

Как мы снизили время создания бэкапов Git с 48 часов до 41 минуты

Level of difficultyEasy
Reading time6 min
Views6.5K

В этой статье мы расскажем о том, как GitLab выявил и устранил «бутылочное горлышко» производительности в 15-летней функции Git, что повысило эффективность, обеспечив возможность применения более надёжных стратегий резервного копирования и снижения рисков.

Резервные копии репозиториев — важнейший компонент надёжной любой стратегии восстановления после сбоев. Однако с увеличением размеров репозиториев процесс создания надёжных бэкапов становится всё сложнее. Для резервного копирования нашего собственного репозитория Rails нам требовалось 48 часов. Это заставило нас искать невозможные компромиссы между частотой резервного копирования и производительностью системы. Мы хотели найти собственное внутреннее решение для наших клиентов и пользователей.

В конечном итоге, мы нашли источник проблемы в 15-летней функции Git со сложностью O(N²) и устранили его, внеся изменения в алгоритм, что экспоненциально уменьшило время резервного копирования. В результате мы обеспечили снижение затрат, уменьшение рисков и возможность создания стратегий резервного копирования, которые хорошо масштабируются месте с нашей кодовой базой.

Оказалось, что это проблема масштабируемости Git, влияла на всех его пользователей с крупными репозиториями. Ниже мы расскажем историю о том, как выявили и устранили проблему.

Читать далее

Проверяем написанную LLM библиотеку OAuth на уязвимости

Level of difficultyMedium
Reading time8 min
Views4.5K

Сегодня я решил изучить новую библиотеку Cloudflare OAuth provider, которую, судя по заявлениям, почти полностью написали при помощи LLM Claude компании Anthropic:

Эта библиотека (в том числе и документация по схеме) была по большей мере написана при помощи Claude — ИИ-модели компании Anthropic. Результаты работы Claude были тщательно проверены инженерами Cloudflare, уделившим особое внимание безопасности и соответствию стандартам. В исходный результат было внесено множество улучшений, в основном тоже при помощи промптов Claude (и с проверкой результатов). Промпты модели Claude и созданный ею код можно посмотреть в истории коммитов.

[…]

Подчеркнём, что это не «вайб-кодинг». Каждая строка была тщательно проверена и согласована с соответствующими RFC специалистами в сфере безопасности, уже работавшими в этими RFC. Я пытался подтвердить свой скепсис, но оказалось, что я ошибался.

Я и сам в последнее время достаточно много писал подобным образом код при помощи «агентских» LLM. И я тоже специалист по OAuth: я написал API Security in Action, многие годы был членом OAuth Working Group в IETF и ранее работал техлидом, а затем архитектором безопасности в ведущем поставщике решений OAuth. (Также у меня есть степень PhD в сфере ИИ, полученная в группе изучения интеллектуальных агентов, но ещё до возникновения современного ажиотажа вокруг машинного обучения). Поэтому мне было очень любопытно, что же создала эта модель. И сегодня, сидя на паре совещаний, я решил изучить результаты. Дисклеймер: я лишь вкратце просмотрел код и нашёл несколько багов, а не выполнял полный анализ.

Читать далее

Слишком много открытых файлов

Level of difficultyEasy
Reading time8 min
Views4.5K

Недавно я работал над достаточно большим проектом на Rust. К моему удивлению, мне никак не удавалось заставить тесты работать правильно.

Команда cargo test запускала выполнение всех тестов в репозитории, но спустя пару миллисекунд все тесты завершались сбоями из-за не очень знакомой мне ошибки:

Io(Os { code: 24, kind: Other, message: "Too many open files" })

К счастью, описание ошибки достаточно понятно, поэтому я смог за приемлемое время разобраться в её причинах. Я начал копаться и в процессе исследований кое-чему научился.

Читать далее
1
23 ...

Information

Rating
Does not participate
Location
Россия
Registered
Activity