Pull to refresh
1811
120.7

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

Send message

Как устроены тени в старых 3D-играх

Level of difficultyEasy
Reading time10 min
Views8.6K

Ближе к концу превосходной ленты Вима Вендерса «Идеальные дни» главный герой Хираяма пьёт пиво под мостом после того, как увидел, как Бизнесмен ухаживает за девушкой, в которую влюблён Хираяма. Внезапно к нему подходит Бизнесмен. Всё оказалось не так просто, но их беседа приводит их к фундаментальным вопросам:

Бизнесмен: Тени. Становятся ли они темнее, когда накладываются друг на друга?
Хираяма: Не знаю.
Бизнесмен: Я не знаю ещё очень многого... Именно так заканчивается жизнь... Наверно.
Хираяма: Давайте узнаем прямо сейчас.
Бизнесмен: Что?

И они выходят на свет уличного фонаря, чтобы изучить свои тени (сцена целиком).

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

К сожалению, Хираяма ошибается. Тени не становились темнее. Источник света всего один, и он довольно далеко, поэтому тень — это просто отсутствие света. Не важно, сколько раз перекрыт источник света.

В 3D-видеоиграх же тени — это нечто совсем иное. Очень легко нарисовать тёмное пятно под ногами персонажа и предполагать, что всё остальное освещено. Возможно, Хираяма вспоминал тень-пятно из Metal Gear Solid, которая становится темнее, когда накладывается на другие?

Читать далее
Total votes 38: ↑36 and ↓2+55
Comments18

Неформатированный текст не так уж прост

Level of difficultyEasy
Reading time7 min
Views1.4K

Когда мы взаимодействуем с текстовым файлом при помощи редактора, то, что мы видим, не всегда отражает содержимое файла. Да, содержимое файла с неформатированным текстом — это байтовые коды, закодированные в таких форматах, как ASCII, UTF8 и UTF16, и в этих байтовых кодах находится источник истины. Но в конечном итоге, именно текстовый редактор выбирает, как интерпретировать и отображать пользователю источник истины (двоичные коды). Это значит, что два файла могут выглядеть одинаково или один и тот же файл может выглядеть по-разному в зависимости от редактора.

Текстовый редактор может подсвечивать (или нет) отдельные части на основании распознанного им синтаксиса, может управлять отображением табов (2 пробела, 4 пробела или даже 8). Он решает, как кодировать нажатие клавиши Tab, например, как \t или как заданное количество пробелов. То же относится и к нажатию на клавишу Enter для создания новой строки — будет ли она кодироваться как \n (UNIX) или \r\n (Windows), зависит от конфигурации редактора.

Текстовый редактор скрывает подробности, чтобы пользователю не пришлось слишком много думать. Однако довольно часто такие подробности протекают сквозь защитный слой, который пытается создать редактор. И мы часто не замечаем подобные тонкости, пока не столкнёмся с ними.

Основная цель моей статьи — поделиться своим опытом и проблемами, с которыми можно столкнуться, работая с неформатированным текстом.

Читать далее
Total votes 9: ↑7 and ↓2+11
Comments3

Детекторы ИИ ошибаются, и это сильно бьёт по студентам

Level of difficultyEasy
Reading time9 min
Views4.5K

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

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

Для 24-летней Олмстед это обвинение стало огромным ударом. Кроме того, оно угрожало её дальнейшей учёбе в университете. «Я была потрясена, ведь у меня могли забрать плоды моих трудов за то, чего я не делала», — рассказывает она.

Читать далее
Total votes 13: ↑11 and ↓2+17
Comments12

Полное руководство по обработке ошибок в Python

Reading time15 min
Views7.6K

Я часто сталкиваюсь с разработчиками, очень хорошо знающими механику обработки ошибок в Python, однако когда я начинаю выполнять ревью их кода, он оказывается далеко неидеальным. Исключения в Python — это одна из тех областей, поверхностный уровень которого знает большинство, но многие разработчики даже не догадываются о существовании более глубокого, почти тайного уровня. Если вы хотите протестировать себя по этой теме, то проверьте, сможете ли вы ответить на следующие вопросы:

  • Когда следует перехватывать исключения, генерируемые вызываемыми вами функциями, а когда этого делать не нужно?
  • Как узнать, какие классы исключений нужно перехватывать?
  • Что нужно делать при перехвате исключений для их «обработки»?
  • Почему перехватывание всех исключений считается порочной практикой, и когда делать это приемлемо?

Вы готовы узнать секреты обработки ошибок в Python? Тогда поехали!
Читать дальше →
Total votes 18: ↑17 and ↓1+24
Comments5

Насколько быстры B-деревья по сравнению с хэш-таблицами?

Reading time12 min
Views11K

Во многих «скриптовых» языках для стандартных ассоциативных структур данных используется хэш-таблица (hashmap) (объекты Javascript, словари Python и так далее). Хэш-таблицы обладают множеством раздражающих свойств:

  • Уязвимость к hash flooding.
  • В случае защиты от hash flooding случайными seed порядок итераций становится недетерминированным, что мешает при тестировании снэпшотов, создании воспроизводимых сборок и так далее.
  • При вставке может требоваться рехэширование, что в наихудших случаях создаёт для больших хэш-таблиц ужасные задержки.
  • Многократное увеличение больших распределений памяти без фрагментации сложно реализовать в целевых платформах wasm, потому что трюки с виртуальной памятью недоступны, а для страниц невозможно выполнить unmapping.
  • Векторные команды в wasm ограничены, а команды AES отсутствуют. Это делает многие хэш-функции ещё более медленными.

Упорядоченные структуры данных наподобие B-деревьев не имеют этих недостатков. Обычно они медленнее хэш-таблиц, но меня удивило, насколько разнятся ожидания людей относительно их скорости.
Читать дальше →
Total votes 13: ↑13 and ↓0+21
Comments3

Названия должностей разработчиков почти потеряли свой смысл

Reading time5 min
Views48K

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

Звание «сениор», когда-то бывшее признаком большого опыта и знаний, обесценилось больше всего. Сегодня разработчиков начинают величать «сениорами» невероятно быстро, часто всего спустя три-четыре года работы. Как будто путь к «сениорству», бывший когда-то марафоном нарабатывания навыков и разнопланового опыта, превратился в спринтерский забег.

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

Читать далее
Total votes 51: ↑48 and ↓3+59
Comments259

Взлом старого ZIP-файла с криптопрограммами подпольщиков ЮАР

Reading time8 min
Views12K

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

Недавно я заинтересовался защищёнными коммуникациями, которые использовались Африканским национальным конгрессом в рамках операции «Вула», проводившейся в конце 1980-х годов. Операция «Вула» заключалась в проникновении лидеров АНК (и передаче снаряжения) в ЮАР для подготовки тайной сети, реализующей различные элементы политической активности АНК внутри страны.

Для успеха операции требовались защищённые коммуникации, организованные на основе 8-битных компьютеров, DTMF-сигналов, акустических преобразователей и различного другого оборудования для обмена сообщений с одноразовым шифрованием, использующих программы, написанные на PowerBASIC.
Читать дальше →
Total votes 26: ↑26 and ↓0+39
Comments9

Популярный, но неправильный способ перевода строки в нижний регистр

Level of difficultyEasy
Reading time3 min
Views6K

Похоже, популярный способ преобразования строки в верхний или нижний регистр заключается в побуквенном изменении.

Но он ошибочен по многим причинам.

Во-первых, std::tolower — это неадресуемая функция. Среди прочего, это значит, что мы не можем брать адрес функции, как мы делаем это здесь, когда передаём указатель на функцию std::transform. То есть нам нужно использовать лямбду.

Читать далее
Total votes 24: ↑23 and ↓1+35
Comments17

Риски перехода на 64-битный time_t

Level of difficultyEasy
Reading time15 min
Views2.2K

Один из разделов статьи Overview of cross-architecture portability problems я посвятил проблемам, возникающим из-за использования 32-битного типа time_t. Это архитектурное решение, до сих пор влияющее на использующие glibc системы с Gentoo, приведут к тому, что у 32-битных приложений в 2038 году начнут возникать ужасные сбои: они будут получать ошибку -1 вместо текущего времени и не смогут выполнять stat() файлов. Одним словом, возникнет полный хаос.

Считается, что решением будет переход на 64-битный тип time_t. Musl уже перешёл на него, а glibc поддерживает его как опцию. Многие другие дистрибутивы, например, Debian, совершили этот переход. К сожалению, дистрибутивам на основе исходников, например, Gentoo, сделать это не так просто. Поэтому мы по-прежнему обсуждаем эту проблему и экспериментируем, пытаясь понять, как пользователи максимально безопасно могли бы выполнить апгрейд.

К сожалению, это совершенно нетривиально. Во-первых, мы говорим о переломном изменении ABI — ситуация «всё ли ничего». Если в API библиотеки используется time_t, то всё связанное с ней должно использовать ту же ширину типа. В этом посте я бы хотел подробно рассмотреть этот вопрос: почему это плохо и что мы можем сделать, чтобы повысить безопасность.

Читать далее
Total votes 10: ↑9 and ↓1+14
Comments5

Quake на плате микроконтроллера с 276 килобайтами ОЗУ

Reading time14 min
Views7.8K

Введение


В прошлом году в рамках празднования 30-летней годовщины Doom мы продемонстрировали его порт для платы Sparkfun Thing Plus Matter MGM240P. В этом году мы портируем Quake на плату Arduino Nano Matter.
Читать дальше →
Total votes 20: ↑19 and ↓1+26
Comments6

Почему слишком быстрые мыши могут ломать FPS в играх

Level of difficultyEasy
Reading time8 min
Views20K

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

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

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

Читать далее
Total votes 51: ↑51 and ↓0+63
Comments24

Визуализатор музыки на основе игры Pong

Reading time5 min
Views2.1K

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

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

Также мы сохраним следующие правила классической игры:

  • Точка контакта мяча с ракеткой определяет угол отражения
  • У ракеток нет ограничений по скорости
  • Мяч отскакивает от верха и низа экрана

Такая физика обеспечивает нам необходимое число степеней свободы для перемещения ракеток, чтобы они ударяли по мячу в нужный момент.

Простая стратегия попадания в любой тайминг — это нахождение ракеток близко к центру. Это даёт нам мало места по горизонтали, но вертикальное пространство практически бесконечно, ведь мяч может отскакивать от нижнего и верхнего краёв экрана. Для получения любой нужной длительности удара мы можем замедлять горизонтальную скорость, ударяя по мячу более вертикально. Но хотя это доказывает, что решение существует для любых входных данных, смотреть на него было бы не очень интересно.
Читать дальше →
Total votes 11: ↑11 and ↓0+18
Comments4

Опыт тюнинга Llama3 405B на AMD MI300x

Level of difficultyMedium
Reading time8 min
Views2.5K

Опенсорсные модели становятся всё объёмнее, поэтому потребность в надёжной инфраструктуре для выполнения крупномасштабного обучения ИИ сегодня как никогда высока. Недавно наша компания выполнила fine-tuning модели LLaMA 3.1 405B на GPU AMD, доказав их способность эффективно справляться с крупномасштабными задачами ИИ. Наш опыт был крайне положительным, и мы с радостью выложили всю свою работу на GitHub в опенсорс.

GPU AMD, и в особенности серия MI300X — это серьёзная альтернатива ИИ-оборудованию NVIDIA, обеспечивающая больше производительности на вложенный доллар. Наша система состояла из одного узла с 8 GPU AMD MI300x, а для fine-tuning мы использовали JAX. В этой статье мы расскажем всю историю fine-tuning LLaMA 405B, в том числе и подробности шардинга параметров и реализации LoRA.

Читать далее
Total votes 8: ↑7 and ↓1+13
Comments9

Как устроено хранение разных типов данных в веб-буфере обмена

Reading time16 min
Views1.6K

Если вы уже давно имеете дело с компьютерами, то, вероятно, знаете, что в буфере обмена (clipboard) могут храниться различные типы данных (изображения, текст с форматированием, файлы и так далее). Меня как разработчика ПО начало напрягать то, что я не знаю, как буфер обмена хранит и упорядочивает данные разных типов.

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

Начнём мы с изучения API веб-буферов обмена и их истории. API накладывают интересные ограничения, связанные с типами данных; мы узнаем, как некоторые из компаний обходят эти ограничения. Также мы рассмотрим некоторые из предложений, предназначенных для устранения этих ограничений (самое примечательное из них — это Web Custom Formats).

Если вы когда-нибудь задавались вопросом, как устроен веб-буфер обмена, то этот пост для вас.
Читать дальше →
Total votes 10: ↑10 and ↓0+17
Comments2

Впечатления от iGPU Adreno чипа Snapdragon X Elite

Level of difficultyEasy
Reading time18 min
Views3.8K

Qualcomm — не новичок в мире интегрированной графики. Её линейка Adreno GPU использовалась во многих поколениях SoC Snapdragon для сотовых телефонов. Но компании Qualcomm всегда было тесно в рамках телефонного рынка, она таила амбиции расширить свою мощь и выйти на другой уровень производительности. Сегодня её Snapdragon X Elite выпускается с прицелом на рынок ноутбуков. Adreno тоже переносится на рынок более высокой производительности, на котором есть такие конкуренты, как iGPU Intel Xe-LPG в Meteor Lake и iGPU AMD RDNA 3 в Phoenix.

Читать далее
Total votes 8: ↑8 and ↓0+14
Comments2

Грепабельность — важная метрика кода

Level of difficultyEasy
Reading time3 min
Views9.6K

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

Читать далее
Total votes 35: ↑32 and ↓3+42
Comments31

Создание гигабитного коммутатора на Linux

Level of difficultyMedium
Reading time9 min
Views16K

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

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

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

Читать далее
Total votes 25: ↑25 and ↓0+33
Comments16

Воспроизводим гитарные табулатуры на Rust

Reading time11 min
Views5.2K

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

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

Например, вот первые четыре такта песни Smoke on the Water группы Deep Purple:

e|-----------------|-----------------|-----------------|-----------------|
B|-----------------|-----------------|-----------------|-----------------|
G|-----3---5-------|---3---6-5-------|-----3---5-----3-|-----------------|
D|-5---3---5-----5-|---3---6-5-------|-5---3---5-----3-|---5-------------|
A|-5-------------5-|-----------------|-5---------------|---5-------------|
E|-----------------|-----------------|-----------------|-----------------| <- верх

Эту песню играют в стандартном строе (EADGBe), обозначенном буквами слева, указывающими строй каждой струны. Цифры же означают, куда нужно ставить пальцы на грифе.

Кроме текстового описания стандартом де-факто стал формат, используемый в ПО Guitar Pro для рендеринга и синтезирования звука табулатуры.

Такие двоичные файлы в зависимости от версии ПО имеют расширение .gp3, .gp4, .gp5 или .gp6, их легко можно найти в Интернете на таких веб-сайтах, как Ultimate Guitar.

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

Вероятно, лучший опенсорсный плеер табулатур — это TuxGuitar, у него очень много функций, это потрясающий инструмент для обучения гитаре.

Так как TuxGuitar уже не поддерживается и написан на Java, я решил, что будет интересно написать собственный плеер табулатур на Rust.
Читать дальше →
Total votes 21: ↑21 and ↓0+28
Comments3

Секрет внутри одного миллиона чекбоксов

Reading time7 min
Views37K

Спустя несколько дней после начала разработки «одного миллиона чекбоксов» (One Million Checkboxes, см. новость на Хабре) я решил, что меня взламывают. Что это делает в моей базе данных?

Спустя несколько часов я уже лил слёзы гордости за талантливых подростков.

Но вернёмся к началу.

Что такое One Million Checkboxes?


26 июня 2024 года я запустил веб-сайт под названием One Million Checkboxes (OMCB). На нём был один миллион глобальных чекбоксов — нажатие на чекбокс мгновенно переключало его состояние для всех на сайте.


Вот как выглядел сайт через полчаса после запуска

Мои ожидания от этого сайта были крайне малы и совершенно ошибочны. Я думал, что сотни игроков будут нажимать тысячи чекбоксов, однако за две недели работы сайта пятьсот тысяч игроков нажали на флажки более 650 миллионов раз. Сайт попал в новости New York Times и Washington Post; он есть в Know Your Meme и Википедии. Это было безумное приключение.
Читать дальше →
Total votes 148: ↑148 and ↓0+177
Comments28

Даты в Javascript наконец-то пофиксят

Level of difficultyEasy
Reading time7 min
Views18K

В чём состоит проблема​

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

Этот API настолько невероятен, что я, наверно, посвящу несколько постов описанию его основных возможностей. Однако в первом посте я расскажу об одном из его главных преимуществ: у нас наконец появился нативный объект, описывающий Zoned Date Time.

Но что же такое Zoned Date Time?

Читать далее
Total votes 29: ↑26 and ↓3+37
Comments56
1
23 ...

Information

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