Pull to refresh
1846
537.9

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

Send message

Уменьшаем базу данных в 2000 раз при помощи Rust (завершение)

Level of difficultyMedium
Reading time17 min
Views2K

Сериализация

По сути, мы получили косвенную базу данных в памяти. Далее нам нужно сериализовать её, чтобы проверить, как interning влияет на её постоянное хранение. Кроме того, сериализация — это важный шаг для проверки реальности заявленной экономии места. И, наконец, это ещё одна возможность для дальнейшего сжатия данных.

В Rust для сериализации стандартно используется крейт serde, который мы уже использовали для импортирования входных данных в JSON. Serde изначально имеет поддержку множества форматов благодаря крейтам расширений, поэтому я решил попробовать несколько из них.

Читать далее

Уменьшаем базу данных в 2000 раз при помощи Rust

Level of difficultyMedium
Reading time26 min
Views5.5K

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

Обычный день нарушений на ratpstatus.fr.

В репозитории GitHub сайта ratpstatus.fr содержатся все файлы JSON, запрашиваемые из open-data API каждые две минуты. Данные сохраняются там уже почти год. Репозиторий с 188 тысячами коммитов и более чем 10 ГБ собранных данных всего лишь в одном последнем коммите (измерено при помощи git clone --depth=1) — это определённо интересный выбор для реализации базы данных! Уточню, что в этом посте я не собираюсь критиковать эту систему. Веб-сайт статуса сети RATP — превосходный веб-сайт, мгновенно и стабильно предоставляющий полезную информацию без обычного сегодня раздувания веб-сайтов. [И нет, сайт не написан на Rust. Веб-сайт на PHP тоже может быть невероятно быстрым!]

Тем не менее, размер базы данных (10 ГБ) заставил меня призадуматься: а можно ли сжать её лучше, потратив на это приемлемое количество времени (скажем выходные)? В этом подробном посте я расскажу, как использовал шаблон проектирования interning в Rust, чтобы сжать этот датасет в две тысячи раз! Мы посмотрим, как лучше структурировать сам интернер, как настроить схему данных для оптимальной работы с ним и как сделать так, чтобы сериализация использовала interning наилучшим образом.

Если у вас в хранилище накопилось множество файлов JSON, то вам стоит прочитать эту статью!

Читать далее

В чём причина высокой скорости fastDOOM

Level of difficultyEasy
Reading time11 min
Views14K

Зимой 2024 года я восстанавливал IBM PS/1 486-DX2 66Mhz, «Mini-Tower», model 2168. В подростковом возрасте я мечтал о таком компьютере, но не мог себе его позволить. Не могу выразить словами, насколько меня радовала работа над этой машиной.

Как только мне удалось его запустить, я сразу же провёл бенчмарк одного ПО.

Читать далее

Симуляция воды над рельефом

Level of difficultyEasy
Reading time18 min
Views3.2K

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

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

Допустим, вы генерируете карту для стратегической игры, но не хотите, чтобы границы карты были заполнены непроходимой пустотой (как в олдскульных RTS). Разве не будет здорово, если граница будет заполнена водой, как на этой карте из одного моего заброшенного проекта?

Читать далее

Кризис качества ПО Apple: мощное «железо», посредственные программы

Level of difficultyEasy
Reading time4 min
Views3.7K

Я давний пользователь устройств Apple, и меня всегда радовала беспроблемная интеграция оборудования и ПО, ставшая отличительной чертой экосистемы Apple. Однако мой недавний опыт взаимодействия iPad Air 11" M2 заставил меня задаться вопросом, не потеряла ли Apple видение того, что раньше делало её продукты исключительными.

Читать далее

Проблема Deep Research

Level of difficultyEasy
Reading time6 min
Views4.4K

Deep Research компании OpenAI создан для меня, но я не могу им пользоваться. Это ещё одно потрясающее демо, увы, поломанное. Но ломается оно очень интересным образом.

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

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

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

Читать далее

3200% нагрузки на процессор

Level of difficultyMedium
Reading time15 min
Views18K

Совсем недавно моя машина была в таком запущенном состоянии, что я едва мог подключиться к ней через ssh. 3200% нагрузки на CPU — полностью использовались все 32 ядра хоста! Сравните это с моим последним багом, когда использовалось всего одно ядро, то есть 100%

К счастью, я использовал среду выполнения Java 17, у которой были дампы потоков с указанием времени CPU!

Читать далее

Изучаем программирование шейдеров с Риком и Морти

Level of difficultyMedium
Reading time31 min
Views2.7K

Эта анимация Рика состоит из 240 строк кода. Никаких библиотек и изображений. В статье я покажу, как использовать шейдеры GPU и поля расстояний со знаком для создания подобных анимаций для видео, видеоигр и просто для развлечения! В оригинале статьи даже есть интерактивный редактор кода, благодаря которому вы сможете поэкспериментировать с примерами.

Читать далее

Почему QR-коды в верхнем регистре меньше, чем в нижнем?

Level of difficultyEasy
Reading time2 min
Views17K

Взгляните на эти два QR-кода. Отсканируйте их, если хотите: обещаю, в них нет ничего опасного.

Слева HTTPS://EDENT.TEL/ в верхнем регистре, а справа — https://edent.tel/ в нижнем.

Можно чётко заметить, что слева QR-код «меньше», то есть в нём меньше битов данных. Оба ведут на один и тот же URl, единственное различие заключается в регистре.

Что здесь происходит?

Читать далее

«Чем ближе к вокзалу, тем хуже кебаб?»: «исследование»

Level of difficultyEasy
Reading time10 min
Views13K

Во французском сабреддите я наткнулся на пост с интересной гипотезой:

Чем ближе точка к вокзалу, тем хуже там кебаб.

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

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

Читать далее

Составляем из четырёх двоек любое целое число

Level of difficultyEasy
Reading time2 min
Views23K

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

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

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

Читать далее

Запускаем Pong в 240 вкладках браузера

Level of difficultyEasy
Reading time11 min
Views2.6K

Что вы делаете с незакрытыми вкладками браузера? На мой взгляд, они занимают слишком много места на экране, поэтому на этой неделе я разобрался, как запустить в этих вкладках Pong.

Это 240 вкладок браузера в плотной сетке 8x30. И в них запущен Pong! Видно, что мяч и ракетки перемещаются по canvas в окне и во всех вкладках.

Код (ужасный) можно посмотреть на GitHub. Но как он работает?

Читать далее

Разработчики установщика Windows 95 забыли, что в MS-DOS есть графика?

Level of difficultyEasy
Reading time3 min
Views19K

Когда я написал статью о том, почему установщик Windows 95 использовал три операционные системы [перевод на Хабре], в которой сказал, что установщик на основе MS-DOS был бы текстовым, то мне возразили: «Но ведь MS-DOS могла отображать графику! Вы что там, все глупые?»

Да, MS-DOS могла работать с графикой, в том смысле, что она не очень мешала программисту работать с графикой. Но абсолютно всё ему приходилось делать самому. Не существовало графических примитивов, кроме вызова BIOS для отрисовки отдельного пикселя. Всё остальное было на разработчике, который и не собирался пользоваться вызовом BIOS для отрисовки пикселей, потому что он был медленным. Чтобы добиться хоть какой-то производительности, приходилось непосредственно работать с буфером кадров.

Итак, теперь нам нужно написать графическую библиотеку для отрисовки чего-то сложнее, чем отдельный пиксель. К счастью, для Windows 95 требовалась минимум VGA-видеокарта, поэтому ей не приходилось беспокоиться о CGA или EGA. Напомню, что VGA-адаптер требовал работы с планарными режимами, что было очень утомительно. К счастью, у нас есть способная помочь команда спецов по планарным режимам VGA, работающая в соседних кабинетах над видеодрайверами Windows.

Читать далее

Нет, ваша генеративная модель меня не заменит

Level of difficultyEasy
Reading time4 min
Views22K

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

Как я нашёл эти проблемы? Можно назвать это необъяснимой, основанной на опыте интуицией, шестым чувством нёрда; у меня просто возникло ощущение, что с системой что-то не так. За свои двадцать с лишним лет опыта я видел множество приложений и знал, что где-то в этой системе есть узкое место.

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

Но стоит помнить, что, строго говоря, это не были баги. Успешно проходили все юнит-тесты и интеграционные тесты, тесты BDD, линтеры, статический анализ кода и было выполнено несколько раундов проверок кода. Проблемы заключались в двух невинных строках кода (спрятанных среди тысяч других), казалось бы, не вызывавших никаких трудностей. Слава Богу, проблемы были найдены на этапе разработки и не затронули ни одной системы в продакшене (мои коллеги теперь могли выполнять свои тесты быстрее, поэтому скорость разработки сильно возросла).

Читать далее

Как уместить поиск по 30 тысячам слов в 64 КБ ОЗУ

Level of difficultyMedium
Reading time17 min
Views8.6K

Как уместить словарь размером 250 КБ в 64 КБ ОЗУ с возможностью выполнения быстрого поиска? Для справки: даже современные методики сжатия наподобие gzip -9 не могут сжать этот файл до размера меньше 85 КБ.

В 1970-х Дуглас Макилрой столкнулся с этой непростой задачей при реализации проверки правописания для Unix в AT&T. Из-за ограничений компьютера PDP-11 весь словарь должен был умещаться всего в 64 КБ ОЗУ. Кажется, подобную задачу решить невозможно.

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

История spell в Unix — это не только любопытный исторический факт. Это мастер-класс по проектированию в условиях жёстких ограничений: анализа первооснов задачи, применения математических наблюдений и проектирования изящных решений, работающих в условиях строгого дефицита ресурсов.

Читать далее

Калькулятор? Да его напишет кто угодно

Level of difficultyEasy
Reading time7 min
Views44K

[Прим. пер.: на Хабре уже был перевод этой статьи, но незавершённый примерно на четверть.]

Неправда.

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

В этом посте я расскажу величайшую историю о разработке приложения-калькулятора.

На изображении выше показан калькулятор из iOS.

Заметили что-нибудь?

Он посчитал неправильно.

(10100) + 1 − (10100) равно 1, а не 0.

Android считает правильно. А причина, по которой он это делает, абсолютно безумна.

Читать далее

Контрабанда данных внутри эмодзи

Level of difficultyEasy
Reading time5 min
Views14K

Меня заинтриговал комментарий GuB-42 на Hacker News:

При помощи последовательностей ZWJ (Zero Width Joiner) теоретически можно закодировать в один эмодзи неограниченный объём данных.

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

tl;dr: да, однако я нашёл решение и без ZWJ. На самом деле, можно закодировать данные в любой символ Unicode. Например, в этом предложении есть скрытое послание: This sentence has a hidden message󠅟󠅘󠄐󠅝󠅩󠄜󠄐󠅩󠅟󠅥󠄐󠅖󠅟󠅥󠅞󠅔󠄐󠅤󠅘󠅕󠄐󠅘󠅙󠅔󠅔󠅕󠅞󠄐󠅝󠅕󠅣󠅣󠅑󠅗󠅕󠄐󠅙󠅞󠄐󠅤󠅘󠅕󠄐󠅤󠅕󠅨󠅤󠄑. (Попробуйте вставить его в декодер.)

Читать далее

5 способов нарисовать обводку

Level of difficultyEasy
Reading time13 min
Views5.7K

Рендеринг обводки (контуров) — это техника, часто используемая в играх или из эстетических, или из геймплейных соображений. Например, в игре Sable контуры применяются для создания стиля, напоминающего комиксы, а Last of Us контуры используются для выделения врагов, когда игрок переходит в режим скрытности.

В этом посте мы расскажем о пяти способах рендеринга контура вокруг объекта.

Читать далее

Избавляемся от UB в memcpy

Level of difficultyMedium
Reading time5 min
Views4.8K

Неопределённое поведение (undefined behavior, UB) в языке программирования C — постоянный источник жарких споров между программистами. С одной стороны, UB может быть важным для оптимизаций компилятора. С другой стороны, оно упрощает появление багов, которые приводят к проблемам безопасности.

Хорошая новость: N3322 был принят для C2y, что позволит устранить неопределённое поведение из этого конкретного участка языка C и сделать всё показанное ниже чётко определённым:

memcpy(NULL, NULL, 0);
memcmp(NULL, NULL, 0);
(int *)NULL + 0;
(int *)NULL - 0;
(int *)NULL - (int *)NULL;

Читать далее

Порталы: как устроен расчёт видимости в Quake, часть 2

Level of difficultyEasy
Reading time16 min
Views2.3K

Часть 1

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

«Это просто задача отсечения»

Свет внезапно выключается. Вы сидите в огромном конференц-зале. Кто-то включает проектор. На экране сам Майкл Абраш! Похоже, это знаменитый доклад Quake Postmortem с GDC 1997.

Он говорит о порталах.

Мы берём плоскости отсечения, ограничивающие максимальный объём видимого, и отсекаем их по всё более дальним порталам, пока они не пропадут.

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

Information

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