All streams
Search
Write a publication
Pull to refresh
1940
300.8

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

Send message

Улучшаем тексты в вебе при помощи text-wrap: pretty

Level of difficultyEasy
Reading time12 min
Views2.4K

В новом Safari Technology Preview реализовано значение text-wrap: pretty, обеспечивающее беспрецедентный уровень чёткости типографики в вебе. Давайте рассмотрим возможности WebKit-версии pretty, а затем сравним её с balance и другими значениями text-wrap, чтобы лучше понять, когда какие следует выбирать.

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

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

Одним из решений может стать text-wrap:pretty. Оно предназначено для обеспечения нового уровня качества типографики в вебе благодаря использованию учитывающих абзацы алгоритмов.

Читать далее

Проектируем веб-страницу, отображающую миллион элементов

Level of difficultyEasy
Reading time7 min
Views5.9K

Может ли браузер справиться с миллионом элементов? Если вы когда-нибудь пробовали рендерить в браузере миллион элементов <div>, то знаете, что происходит — он вылетает, зависает и перестаёт реагировать.

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

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

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

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

Читать далее

Как мы пишем код для curl на C

Level of difficultyEasy
Reading time6 min
Views5.8K

Мне часто задают такой вопрос: как мы пишем на C код для curl, чтобы он был безопасным и надёжным в миллиардах установок? Мы предпринимаем определённые меры и принимаем решения. «Серебряной пули» нет, есть только рекомендации. Как вы убедитесь сами из этой статьи, в них тоже нет ничего странного или неожиданного.

«c» в слове «curl» не обозначает и никогда не обозначало язык программирования C, это расшифровывается как client.

Предупреждение

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

Читать далее

Зачем выбирать F#?

Level of difficultyMedium
Reading time17 min
Views8.7K

Если бы кто-нибудь сказал мне несколько месяцев назад, что я буду снова экспериментировать с .NET после более чем пятнадцатилетней паузы, то я бы, наверно, рассмеялся1. В начале своей карьеры я пробовал работать с .NET и Java, и хотя некоторые вещи .NET делал лучше, чем Java (у него была возможность научиться на ошибках ранней Java), я быстро остановился на Java, потому что это была по-настоящему портируемая среда.

Наверно, читающие мой блог знают, что последние несколько лет я время от времени экспериментировал с OCaml, и я могу с уверенностью сказать, что он стал одним из моих любимых языков программирования наряду с Ruby и Clojure. Недавно работа с OCaml привлекла моё внимание к F# — это разработанный компанией Microsoft ML (Meta Language) для .NET , функциональная копия объектно-ориентированного (по большей мере) C#. Самый новый ML-язык…

Читать далее

Карты высот для пиксельной игры с видом сверху

Level of difficultyEasy
Reading time4 min
Views4.3K

Для «движка», разработанного мной для моей игры, я использую карты высот пиксельной графики, чтобы реализовать различные крутые эффекты: динамическую высоту воды, пересекающуюся геометрию, декали, 3D-освещение и даже z-сортировку сцены.

Читать далее

Первоапрельская шутка, из-за которой меня едва не уволили

Level of difficultyEasy
Reading time6 min
Views135K

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

На своей первой работе после колледжа я был программистом баз данных, несмотря на то, что мой диплом никак не был связан с компьютерами, да и сегодняшняя профессия тоже. Причина заключалась в том, что университет, в котором я работал, не мог предложить конкурентоспособную зарплату, но имел различные неденежные бонусы, плюс они готовы были обучать любого, обладавшего достаточными для работы знаниями. Я, только что выпустившийся студент Университета Калифорнии, вполне освоил работу как минимум с BSD/386 и SunOS, и, что более важно, имел отличные рекомендации от своего предшественника, получившего повышение. Меня наняли, и это стало их первой ошибкой.

Читать далее

Мы взломали Google Gemini и скачали его исходный код (частично)

Level of difficultyEasy
Reading time16 min
Views19K

В 2024 году мы выпустили пост We Hacked Google A.I. for $50,000, в котором говорилось, как наша группа в составе Рони «Lupin» Карта (это я), Джозефа «rez0» Тэкера и Джастина «Rhynorater» Гарднера поехала в 2023 году в Лас-Вегас, чтобы искать уязвимости Gemini на проводимом Google мероприятии LLM bugSWAT. В этом году мы повторили нашу поездку…

Читать далее

Все знают, какие приложения установлены у вас в телефоне

Level of difficultyEasy
Reading time8 min
Views18K

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

В 2022 году, с выпуском Android 11, Google удалила этот доступ для разработчиков приложений. Согласно новой политике видимости пакетов, приложения должны видеть другие приложения только в том случае, если те необходимы для их базовой функциональности. Кроме того, разработчики должны явным образом объявлять эти приложения в обязательном для всех приложений Android файле конфигурации AndroidManifest.xml.

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

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

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

Читать далее

Ужасное состояние двоичной совместимости Linux (и что с ним делать)

Level of difficultyMedium
Reading time20 min
Views19K

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

Читать далее

Почему я перестал говорить с архитекторами о микросервисах

Level of difficultyEasy
Reading time6 min
Views25K

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

Читать далее

Пишем стек TCP/IP с нуля: поток данных TCP, Socket API, повторная передача

Level of difficultyMedium
Reading time15 min
Views11K

Первая часть: Ethernet, ARP, IPv4 и ICMPv4

Вторая часть: основы TCP и Handshake

В прошлом посте мы узнали о заголовках TCP и о том, как устанавливается соединение между двумя сторонами.

В этом посте мы изучим передачу данных по TCP и способ управления ею.

Также мы создадим интерфейс сетевого стека, который приложения смогут использовать для передачи данных по сети. Потом этот Socket API мы применим, чтобы наш пример приложения смог отправить простой HTTP-запрос веб-сайту.

Читать далее

Пишем стек TCP/IP с нуля: основы TCP и Handshake

Level of difficultyEasy
Reading time9 min
Views13K

Первая часть: Ethernet, ARP, IPv4 и ICMPv4

Пока наш стек TCP/IP пользовательского пространства содержит минимальные реализации Ethernet и IPv4. Настало время заняться пугающим Transmission Control Protocol (TCP).

TCP, работающий на четвёртом (транспортном) сетевом слое OSI1, отвечает за починку ошибочных подключений и сбоев в доставке пакетов. TCP — «рабочая лошадка» Интернета, обеспечивающая надёжную связь практически во всех компьютерных сетях.

TCP — не особо новый протокол, первая его спецификация вышла в 1974 году2. С тех пор многое поменялось, TCP дополнился множеством расширений и исправлений3.

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

Читать далее

Почему в установщике Windows 95 не использовалась миниатюрная версия Windows 95?

Level of difficultyEasy
Reading time5 min
Views16K

Одной из реакций на мою статью о том, почему в установщике Windows 95 использовалось три операционные системы [перевод на Хабре] (а реакций на неё было много), стала ещё одна моя статья [перевод на Хабре] с объяснением того, что миниатюрная версия Windows 3.1 применялась для апгрейда пользователей с MS-DOS до Windows 95. Но почему было не использовать миниатюрную версию Windows 95?

Читать далее

Пишем стек TCP/IP с нуля: Ethernet, ARP, IPv4 и ICMPv4

Level of difficultyEasy
Reading time13 min
Views26K

Написание собственного стека TCP/IP поначалу может показаться пугающей задачей. И в самом деле, за свой тридцатилетний срок жизни TCP впитал в себя множество спецификаций. Однако базовая спецификация остаётся относительно компактной1 — из важных частей в ней можно выделить парсинг заголовков TCP, машину состояний, отслеживание перегрузок и вычисление таймаута повторной передачи.

Самые распространённые протоколы слоя 2 и слоя 3, Ethernet и IP, скромны по сравнению с сложностью TCP. В этой серии статей мы реализуем минимальный стек TCP/IP пользовательского пространства для Linux.

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

Читать далее

Генератор случайных чисел, застрявший на одном значении

Level of difficultyEasy
Reading time7 min
Views6.2K

Моё исследование посвящено мини-игре Green Toad House в New Super Mario Bros (NSMB). В этой мини-игре используется случайность, поэтому в процессе я изучил генератор случайных чисел (RNG) NSMB.

Чтобы пост не был слишком длинным, будем считать, что вы знаете, что такое RNG, а также о концепции порождающих значений (seed). Если нет, то вот хорошие ресурсы для изучения: pannenkoek2012 в YouTube (SM64)Retro Game Mechanics Explained в YouTube (SMW)Википедия.

Читать далее

Уменьшаем размер двоичного файла на C# в 90 раз

Level of difficultyMedium
Reading time24 min
Views11K

Я написал на C# консольный клон Wordle, но попытался сделать двоичный файл максимально крошечным.

Я взял популярную игру Wordle с такими правилами:

Нужно за шесть попыток угадать слово из пяти букв. После ввода каждого варианта цвет букв будет меняться, показывая близость догадки к загаданному слову.

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

В работе с консолью мне помогла игра Console Games - Snake

Проект запускается в новой консоли dotnet.

Читать далее

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

Level of difficultyMedium
Reading time17 min
Views3.5K

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

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

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

Читать далее

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

Level of difficultyMedium
Reading time26 min
Views8.9K

Этот проект на выходные начался с изучения репозитория открытых данных сети общественного транспорта Парижа, содержащего различные 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
Views15K

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

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

Читать далее

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

Level of difficultyEasy
Reading time18 min
Views4.6K

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

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

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

Читать далее

Information

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