Forwarded from Библиотека программиста | программирование, кодинг, разработка
Подборка лучших статей «Библиотеки программиста» за октябрь: сохраняй в заметки, чтобы не пропустить #самыйсок
📊 Эффективная работа с JSON в Go
🔝 Лучшие практики Go: путь к чистому коду
📚 ТОП-8 книг по DevOps в 2023 году
💪 6 сервисов для подготовки к техническим собеседованиям
🗺️ Карьерная карта: что это, как ее составить и почему она обязательно нужна разработчику
🛡️ 8 способов защиты от манипуляций на работе
👩💻 Женщины в ИТ: проблемы и преимущества сложной профессии
🤖 8 лучших бесплатных курсов по ИИ и глубокому обучению
👨💻 9 трендов в найме айтишников в 2023 году
🤔 9 мифов об IT и найме айтишников
🤖 25 бесплатных AI-инструментов для разработчиков
☁️ ТОП-10 бессерверных фреймворков
🚩 Итог одной валютной удаленки: проработал месяц бесплатно и ушел с долгами
💻 20 лучших ноутбуков для программиста в 2023 году
🧠 Как научиться критически мыслить: 6 эффективных способов
❔ Результаты ежегодного опроса разработчиков StackOverflow: 20+ главных инсайтов 2023 года
📊 Эффективная работа с JSON в Go
🔝 Лучшие практики Go: путь к чистому коду
📚 ТОП-8 книг по DevOps в 2023 году
💪 6 сервисов для подготовки к техническим собеседованиям
🗺️ Карьерная карта: что это, как ее составить и почему она обязательно нужна разработчику
🛡️ 8 способов защиты от манипуляций на работе
👩💻 Женщины в ИТ: проблемы и преимущества сложной профессии
🤖 8 лучших бесплатных курсов по ИИ и глубокому обучению
👨💻 9 трендов в найме айтишников в 2023 году
🤔 9 мифов об IT и найме айтишников
🤖 25 бесплатных AI-инструментов для разработчиков
☁️ ТОП-10 бессерверных фреймворков
🚩 Итог одной валютной удаленки: проработал месяц бесплатно и ушел с долгами
💻 20 лучших ноутбуков для программиста в 2023 году
🧠 Как научиться критически мыслить: 6 эффективных способов
❔ Результаты ежегодного опроса разработчиков StackOverflow: 20+ главных инсайтов 2023 года
❤1🔥1🥱1
🔎Эта статья рассматривает использование Symfony Messenger вместе с Redis для мониторинга и отслеживания событий, происходящих во время обработки сообщений.
🔑Целью является создание ключей в Redis, которые подсчитывают количество событий различных видов мессенджера как для общего мониторинга, так и для конкретных сообщений. Рассматриваются события, связанные с приемом, обработкой, ошибками и повторными попытками обработки сообщений.
⚙️Настройка включает установку Symfony Messenger и Redis, конфигурацию сервера Redis с использованием Docker и настройку бандла Redis. Используются два типа ключей: общие ключи для общего мониторинга и ключи сообщений для конкретного мониторинга. В статье предоставляется пошаговая инструкция по настройке Redis и созданию необходимых ключей.
🔄Затем представлен сервис MessengerHandler, который взаимодействует с Redis с использованием конвейеров для эффективной обработки хитов для различных ключей. Два перечисления, MessengerEvents и MessengerTimeEvents, используются для категоризации событий и временных интервалов.
👂Далее создается класс MessengerSubscriber, который прослушивает различные события мессенджера и использует сервис MessengerHandler для обновления ключей Redis соответственно.
Для демонстрации функционала в статье создается простое сообщение и его обработчик, настраивается Redis-транспорт Symfony Messenger и отправляется сообщение. В конце статьи объясняется, как проверить сгенерированные ключи Redis, чтобы убедиться, что мониторинг работает правильно.
🔑Целью является создание ключей в Redis, которые подсчитывают количество событий различных видов мессенджера как для общего мониторинга, так и для конкретных сообщений. Рассматриваются события, связанные с приемом, обработкой, ошибками и повторными попытками обработки сообщений.
⚙️Настройка включает установку Symfony Messenger и Redis, конфигурацию сервера Redis с использованием Docker и настройку бандла Redis. Используются два типа ключей: общие ключи для общего мониторинга и ключи сообщений для конкретного мониторинга. В статье предоставляется пошаговая инструкция по настройке Redis и созданию необходимых ключей.
🔄Затем представлен сервис MessengerHandler, который взаимодействует с Redis с использованием конвейеров для эффективной обработки хитов для различных ключей. Два перечисления, MessengerEvents и MessengerTimeEvents, используются для категоризации событий и временных интервалов.
👂Далее создается класс MessengerSubscriber, который прослушивает различные события мессенджера и использует сервис MessengerHandler для обновления ключей Redis соответственно.
Для демонстрации функционала в статье создается простое сообщение и его обработчик, настраивается Redis-транспорт Symfony Messenger и отправляется сообщение. В конце статьи объясняется, как проверить сгенерированные ключи Redis, чтобы убедиться, что мониторинг работает правильно.
DEV Community
Monitoring symfony messenger listening to the worker events
Symfony messenger is a great bundle which allows developers to easily send tasks execution to the...
👍8🥱1
PHP и Laravel дайджест новостей за октябрь 2023 года
Краткий обзор новостей из мира PHP и Laravel за октябрь 2023 г.
Краткий обзор новостей из мира PHP и Laravel за октябрь 2023 г.
Хабр
PHP и Laravel дайджест новостей за октябрь 2023 года
Всем привет! Краткий обзор новостей из мира PHP и Laravel за октябрь 2023 г. PHP Дайджест Вышли PHP 8.1.25 и PHP 8.2.12 В этих выпусках несколько исправлений ошибок и улучшений в модулях Core, CLI,...
❤2
Symfony под капотом: Symfony Messenger и механизм повторной обработки сообщений при ошибках
Здесь рассказывается о том, как в Messenger-компоненте Symfony, устроен механизм повторной обработки сообщений при ошибках
Здесь рассказывается о том, как в Messenger-компоненте Symfony, устроен механизм повторной обработки сообщений при ошибках
Хабр
Symfony под капотом: Symfony Messenger и механизм повторной обработки сообщений при ошибках
Привет! Меня зовут Ваня, последние несколько лет я занимаюсь backend-разработкой в Сравни. Моя команда разрабатывает интеграции с сервисами наших партнёров, код пишем на PHP и Symfony Framework. При...
👍10🥱1
Управление сессиями Laravel в кластерах Kubernetes
В то время как Kubernetes предоставляет преимущества, такие как горизонтальное масштабирование без сохранения состояния, фоновая обработка и гибкость хранения, он вводит сложности для управления сессиями.
Проблемы возникают из-за отсутствия состояния в подах Kubernetes, что может привести к несогласованным данным сессии и проблемам с опытом пользователя. Статья предлагает два решения для разработчиков Laravel:
1️⃣Клиентские сессии (Session Affinity): Это включает в себя настройку Kubernetes для обеспечения того, чтобы запросы от конкретного клиента постоянно направлялись к одному и тому же поду. Это можно достичь через сессионную аффинность на основе IP или куки. В то время как это может решить некоторые проблемы, это может привести к неравномерному распределению трафика и потенциальным нарушениям, если под, обрабатывающий клиентскую сессию, сталкивается с проблемами.
2️⃣Распределенное хранилище сессий с Redis: В статье предлагается использовать Redis в качестве распределенного хранилища сессий для обмена данными сессии между несколькими экземплярами приложения Laravel. Redis выбран из-за своей производительности, масштабируемости, устойчивости и поддержки различных структур данных. Предоставлены шаги по настройке Redis в качестве драйвера сессии в Laravel, включая установку необходимого пакета, обновление конфигурационных файлов и развертывание Redis в Kubernetes с использованием Helm.
Реализуя либо клиентские сессии, либо распределенное хранилище сессий с Redis, разработчики Laravel могут преодолеть проблемы, внесенные Kubernetes, обеспечивая согласованное управление сессиями и опыт пользователя в масштабируемых средах.
В то время как Kubernetes предоставляет преимущества, такие как горизонтальное масштабирование без сохранения состояния, фоновая обработка и гибкость хранения, он вводит сложности для управления сессиями.
Проблемы возникают из-за отсутствия состояния в подах Kubernetes, что может привести к несогласованным данным сессии и проблемам с опытом пользователя. Статья предлагает два решения для разработчиков Laravel:
1️⃣Клиентские сессии (Session Affinity): Это включает в себя настройку Kubernetes для обеспечения того, чтобы запросы от конкретного клиента постоянно направлялись к одному и тому же поду. Это можно достичь через сессионную аффинность на основе IP или куки. В то время как это может решить некоторые проблемы, это может привести к неравномерному распределению трафика и потенциальным нарушениям, если под, обрабатывающий клиентскую сессию, сталкивается с проблемами.
2️⃣Распределенное хранилище сессий с Redis: В статье предлагается использовать Redis в качестве распределенного хранилища сессий для обмена данными сессии между несколькими экземплярами приложения Laravel. Redis выбран из-за своей производительности, масштабируемости, устойчивости и поддержки различных структур данных. Предоставлены шаги по настройке Redis в качестве драйвера сессии в Laravel, включая установку необходимого пакета, обновление конфигурационных файлов и развертывание Redis в Kubernetes с использованием Helm.
Реализуя либо клиентские сессии, либо распределенное хранилище сессий с Redis, разработчики Laravel могут преодолеть проблемы, внесенные Kubernetes, обеспечивая согласованное управление сессиями и опыт пользователя в масштабируемых средах.
Laravel News
Stateful Scaling: Laravel Session Management in Kubernetes Clusters - Laravel News
Learn some of the gotchas in Laravel session management you’ll experience as you move to a Kubernetes deployment
❤3👍3
Что означает утверждение о том, что СУБД поддерживает контроль ссылочной целостности связей?
Утверждение о том, что СУБД поддерживает контроль ссылочной целостности связей означает, что СУБД автоматически обеспечивает целостность данных, связанных между таблицами. Она регулирует и проверяет соответствие значений внешнего ключа (foreign key) со значениями первичного ключа (primary key) родительской таблицы.
#вопросы_с_собеседований
Утверждение о том, что СУБД поддерживает контроль ссылочной целостности связей означает, что СУБД автоматически обеспечивает целостность данных, связанных между таблицами. Она регулирует и проверяет соответствие значений внешнего ключа (foreign key) со значениями первичного ключа (primary key) родительской таблицы.
#вопросы_с_собеседований
👍15🥱9
Создание базовой схемы GraphQL, используя атрибуты PHP и Resonance
Статья рассматривает концепцию GraphQL как альтернативы REST и других систем API, которая преобразует приложение в графовую базу данных, с которой можно выполнять запросы.
Основная идея заключается в том, что вместо того чтобы выставлять и создавать специфические конечные точки, можно выставить структуры данных.
Resonance представляет собой асинхронный PHP-фреймворк, способный параллельно разрешать все поля GraphQL.
Статья начинается с базовой схемы GraphQL, предоставляющей объект ping с единственным полем message, всегда возвращающим «pong».
Основной акцент делается на использовании Resonance для обработки запросов GraphQL асинхронно. Приводится пример кода на PHP для создания GraphQL-схемы, Responder для обработки POST-запросов на '/graphql' и пример объекта типа Ping.
Статья рассматривает концепцию GraphQL как альтернативы REST и других систем API, которая преобразует приложение в графовую базу данных, с которой можно выполнять запросы.
Основная идея заключается в том, что вместо того чтобы выставлять и создавать специфические конечные точки, можно выставить структуры данных.
Resonance представляет собой асинхронный PHP-фреймворк, способный параллельно разрешать все поля GraphQL.
Статья начинается с базовой схемы GraphQL, предоставляющей объект ping с единственным полем message, всегда возвращающим «pong».
Основной акцент делается на использовании Resonance для обработки запросов GraphQL асинхронно. Приводится пример кода на PHP для создания GraphQL-схемы, Responder для обработки POST-запросов на '/graphql' и пример объекта типа Ping.
DEV Community
Build a Basic GraphQL Schema Using PHP
What is GraphQL? GraphQL is an alternative to REST and other API systems that, in essence,...
❤7👍6
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
🥱2👍1
Создание быстрого и простого пользовательского интерфейса мгновенного поиска с помощью Alpine AJAX и Laravel.
Здесь рассказывается о том, как добавить мгновенный фильтр поиска в вашем Laravel-приложении, используя библиотеку Alpine AJAX, создавая функцию «поиска на лету» без написания JavaScript. Пример показан на списке контактов, где пользователи могут искать контакты по имени или электронной почте.
⚙️Настройка данных:
Начните с новой установки Laravel и настройте базу данных.
Запустите миграции (php artisan migrate), чтобы создать таблицу «users».
Используйте Tinker (php artisan tinker), чтобы создать пример данных пользователя (User::factory()->count(20)->create()).
🎨Настройка view:
Создайте шаблон Blade в resources/views/contacts.blade.php.
Разработайте базовую страницу с формой поиска и списком контактов.
Отбросьте стили CSS для простоты.
🌐Логика маршрута:
Создайте маршрут в /contacts в routes/web.php.
Реализуйте логику проверки наличия поискового запроса в запросе и фильтрации результатов из таблицы «users» соответственно.
📜Взаимодействие с Alpine AJAX:
Включите скрипты Alpine и Alpine AJAX в заголовок страницы.
Улучшите форму поиска с помощью атрибутов Alpine:
x-init: Инициализирует компонент Alpine.
x-target: Указывает целевой элемент для обновлений AJAX.
@input.debounce: Автоматически отправляет форму при изменении ввода.
x-show="false»: Скрывает кнопку отправки, обеспечивая резервный вариант, если JavaScript не загружен.
🔄Результат:
Список контактов мгновенно обновляется при вводе, благодаря Alpine AJAX.
Здесь рассказывается о том, как добавить мгновенный фильтр поиска в вашем Laravel-приложении, используя библиотеку Alpine AJAX, создавая функцию «поиска на лету» без написания JavaScript. Пример показан на списке контактов, где пользователи могут искать контакты по имени или электронной почте.
⚙️Настройка данных:
Начните с новой установки Laravel и настройте базу данных.
Запустите миграции (php artisan migrate), чтобы создать таблицу «users».
Используйте Tinker (php artisan tinker), чтобы создать пример данных пользователя (User::factory()->count(20)->create()).
🎨Настройка view:
Создайте шаблон Blade в resources/views/contacts.blade.php.
Разработайте базовую страницу с формой поиска и списком контактов.
Отбросьте стили CSS для простоты.
🌐Логика маршрута:
Создайте маршрут в /contacts в routes/web.php.
Реализуйте логику проверки наличия поискового запроса в запросе и фильтрации результатов из таблицы «users» соответственно.
📜Взаимодействие с Alpine AJAX:
Включите скрипты Alpine и Alpine AJAX в заголовок страницы.
Улучшите форму поиска с помощью атрибутов Alpine:
x-init: Инициализирует компонент Alpine.
x-target: Указывает целевой элемент для обновлений AJAX.
@input.debounce: Автоматически отправляет форму при изменении ввода.
x-show="false»: Скрывает кнопку отправки, обеспечивая резервный вариант, если JavaScript не загружен.
🔄Результат:
Список контактов мгновенно обновляется при вводе, благодаря Alpine AJAX.
Imacrayon
Build a Quick & Easy Instant Search User Interface using Alpine AJAX & Laravel
How to build an instant search filter using Alpine AJAX & Laravel
👍5🥱3🤔2
#хочу_спросить
Задавайте любые вопросы о программировании и получайте ответы от пользователей. В комментариях под постом укажите #язык, #стек и/или #библиотеку, по которым задаете вопрос.
Задавайте любые вопросы о программировании и получайте ответы от пользователей. В комментариях под постом укажите #язык, #стек и/или #библиотеку, по которым задаете вопрос.
❤4
Предотвращение спама в формах Statamic
В этой статье рассказывается о том, как добавить службу предотвращения спама к формам в Statamic для отклонения подозрительных отправок. Автор использует Akismet, но подчеркивает, что можно выбрать любую службу предотвращения спама. Шаги включают создание учетной записи Akismet, получение API-ключа и добавление его в файл .env, а также создание слушателя, который вызывается при отправке формы. Для проверки на спам используется метод isSpam, который в данном случае отправляет данные формы на проверку в Akismet.
Также указаны возможные улучшения, такие как отображение спамных отправок в панели управления Statamic и заменяемость службы предотвращения спама на другую.
В этой статье рассказывается о том, как добавить службу предотвращения спама к формам в Statamic для отклонения подозрительных отправок. Автор использует Akismet, но подчеркивает, что можно выбрать любую службу предотвращения спама. Шаги включают создание учетной записи Akismet, получение API-ключа и добавление его в файл .env, а также создание слушателя, который вызывается при отправке формы. Для проверки на спам используется метод isSpam, который в данном случае отправляет данные формы на проверку в Akismet.
Также указаны возможные улучшения, такие как отображение спамных отправок в панели управления Statamic и заменяемость службы предотвращения спама на другую.
DEV Community
Prevent spam in Statamic forms
If you're using Statamic's Forms feature to power a public facing form, you'll benefit from using...
❤4
Что такое namespace и зачем они?
Namespace в PHP — это механизм, который позволяет управлять областями видимости в коде, предотвращая конфликты имен и обеспечивая логическую организацию кода. Введение пространств имен в PHP позволяет структурировать проект, избегать конфликтов именования классов, функций и констант, а также облегчает интеграцию различных библиотек и компонентов.
Зачем используются пространства имен:
Избежание конфликтов имен: Проекты могут содержать множество классов, функций и констант. Пространства имен позволяют изолировать эти имена друг от друга, предотвращая возможные конфликты, особенно при использовании сторонних библиотек.
Организация кода: Пространства имен помогают логически организовать код, разделяя его на логические группы. Например, все классы, связанные с базой данных, могут быть помещены в пространство имен Database.
Автозагрузка классов: Использование пространств имен может сделать автозагрузку классов более эффективной и структурированной, особенно при использовании стандартов автозагрузки, таких как PSR-4.
#вопросы_с_собеседований
Namespace в PHP — это механизм, который позволяет управлять областями видимости в коде, предотвращая конфликты имен и обеспечивая логическую организацию кода. Введение пространств имен в PHP позволяет структурировать проект, избегать конфликтов именования классов, функций и констант, а также облегчает интеграцию различных библиотек и компонентов.
Зачем используются пространства имен:
Избежание конфликтов имен: Проекты могут содержать множество классов, функций и констант. Пространства имен позволяют изолировать эти имена друг от друга, предотвращая возможные конфликты, особенно при использовании сторонних библиотек.
Организация кода: Пространства имен помогают логически организовать код, разделяя его на логические группы. Например, все классы, связанные с базой данных, могут быть помещены в пространство имен Database.
Автозагрузка классов: Использование пространств имен может сделать автозагрузку классов более эффективной и структурированной, особенно при использовании стандартов автозагрузки, таких как PSR-4.
#вопросы_с_собеседований
🥱13👍5❤1
Полезные каналы по PHP :
PHP вакансии — @rabotaphp
Вакансии для PHP-разработчиков.
Уютное сообщество пхпшников. Книги — @phpdom
Книги + тесты на знание языка + туториалы и разборы кода
PHP books — @phpbook.
Книги по PHP и смежным технологиям;
Реклама. Киренкина Марина Дмитриевна, ИНН 345702417736. Erid 2VtzqwpUHeH
PHP вакансии — @rabotaphp
Вакансии для PHP-разработчиков.
Уютное сообщество пхпшников. Книги — @phpdom
Книги + тесты на знание языка + туториалы и разборы кода
PHP books — @phpbook.
Книги по PHP и смежным технологиям;
Реклама. Киренкина Марина Дмитриевна, ИНН 345702417736. Erid 2VtzqwpUHeH
🥱3❤1
Автор столкнулся с ошибкой «Lock wait timeout» при создании многоадресного API с использованием Laravel и трейта RefreshDatabase. Приложение имело базу данных платформы и отдельную базу данных для каждого арендатора, выбираемую во время выполнения на основе ключа API. Тесты, использующие трейт RefreshDatabase, приводили к ошибке времени ожидания блокировки. Причина была обнаружена в переключении базы данных во время выполнения, что сбивало с толку управление транзакциями Laravel. Решением стало использование свойства connectionsToTransact в классе TestCase, указывающего базы данных, участвующие в транзакциях. Это позволило транзакциям охватывать изменение базы данных и устранило проблему времени ожидания блокировки. Кроме того, это гарантировало правильную очистку тестовых данных из обеих баз данных после выполнения тестов.
Conroyp
Juggling Databases When Testing With Laravel: Tackling the Lock Wait Timeout Error
Discover how to tackle Laravel's testing challenges in multi-database scenarios. Say goodbye to the notorious 'Lock wait timeout' error.
❤5
Безотказные очереди в RabbitMQ: Гарантированная доставка сообщений
Статья представляет RabbitMQ как открытую реализацию протокола AMQP (Advanced Message Queuing Protocol) и мощный брокер сообщений, обеспечивающий эффективное взаимодействие между компонентами системы. Автор фокусируется на безотказных очередях в RabbitMQ и их важности в распределенных системах.🚀
🔑Почему безотказные очереди важны:
🛡️В условиях сбоев и ошибок обеспечение надежной доставки сообщений становится жизненно важным. Безотказные очереди решают эту проблему, гарантируя сохранение сообщений до их успешной доставки, что обеспечивает стабильное взаимодействие между системами.
🤔Проблемы при проектировании решения:
Описывается сценарий, где компоненты системы обмениваются важными сообщениями, и из-за временной недоступности одной системы отправка сообщений может не удаваться.⏳ Решение в «quorum» очередях RabbitMQ предоставляет параметры для контроля попыток отправки, но возникают проблемы с отсутствием встроенной задержки.
🛠️Механизм работы выбранного решения:
Автор представляет механизм обработки сообщений, использующий обменники, первичные очереди, обработку ошибок и механизм повторных попыток.🔄 Он объясняет, как сообщения направляются через различные очереди, как управляется количество попыток и как обеспечивается гибкость и надежность в обработке сообщений.
Статья представляет RabbitMQ как открытую реализацию протокола AMQP (Advanced Message Queuing Protocol) и мощный брокер сообщений, обеспечивающий эффективное взаимодействие между компонентами системы. Автор фокусируется на безотказных очередях в RabbitMQ и их важности в распределенных системах.🚀
🔑Почему безотказные очереди важны:
🛡️В условиях сбоев и ошибок обеспечение надежной доставки сообщений становится жизненно важным. Безотказные очереди решают эту проблему, гарантируя сохранение сообщений до их успешной доставки, что обеспечивает стабильное взаимодействие между системами.
🤔Проблемы при проектировании решения:
Описывается сценарий, где компоненты системы обмениваются важными сообщениями, и из-за временной недоступности одной системы отправка сообщений может не удаваться.⏳ Решение в «quorum» очередях RabbitMQ предоставляет параметры для контроля попыток отправки, но возникают проблемы с отсутствием встроенной задержки.
🛠️Механизм работы выбранного решения:
Автор представляет механизм обработки сообщений, использующий обменники, первичные очереди, обработку ошибок и механизм повторных попыток.🔄 Он объясняет, как сообщения направляются через различные очереди, как управляется количество попыток и как обеспечивается гибкость и надежность в обработке сообщений.
❤4👍1
Что скажете про HTMX, использовали ли?🔽🔽🔽
🥱12👍2🤔1
Минимум, который должен знать каждый разработчик программного обеспечения о Unicode в 2023 году
Unicode — это стандарт, целью которого является унификация всех человеческих языков и обеспечение их работы с компьютерами. Каждому символу присваивается уникальный номер, называемый кодовой точкой.
Статья подробно рассматривает кодовые точки, приводит примеры (например, буквы латинского алфавита, символы эмодзи), и объясняет, как Unicode решает проблему представления различных языков. Она также затрагивает кодировки UTF-8 и UTF-16, описывая, как они представляют символы в памяти компьютера.
Стоит также обратить внимание на важность использования библиотек для работы с Unicode, особенно при выполнении операций, таких как определение границ графем и нормализация строк.
Unicode — это стандарт, целью которого является унификация всех человеческих языков и обеспечение их работы с компьютерами. Каждому символу присваивается уникальный номер, называемый кодовой точкой.
Статья подробно рассматривает кодовые точки, приводит примеры (например, буквы латинского алфавита, символы эмодзи), и объясняет, как Unicode решает проблему представления различных языков. Она также затрагивает кодировки UTF-8 и UTF-16, описывая, как они представляют символы в памяти компьютера.
Стоит также обратить внимание на важность использования библиотек для работы с Unicode, особенно при выполнении операций, таких как определение границ графем и нормализация строк.
tonsky.me
The Absolute Minimum Every Software Developer Must Know About Unicode in 2023 (Still No Excuses!)
Modern extension to classic 2003 article by Joel Spolsky
❤4