<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>XML</title>
    <description>XML (Extensible Markup Language) — это универсальный язык разметки, предназначенный для структурирования, хранения и передачи данных. Он широко используется для обмена информацией между системами, хранения конфигураций и описания сложных данных.

XML обеспечивает гибкость и читаемость как для человека, так и для машины. Это делает его популярным в различных областях, включая веб-разработку, интеграцию систем, создание документов и настройку приложений.</description>
    <link>https://tproger.ru/tag/xml</link>
    <atom:link href="https://tproger.ru/tag/xml/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Tue, 06 Oct 2026 14:20:45 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>XML</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Microsoft признала сбой в ядре Windows 11 — ломаются «Пуск», «Проводник» и настройки</title>
      <link>https://tproger.ru/news/microsoft-priznala-sboj-v-yadre-windows-11---lomayutsya--pusk----provodnik--i-nastrojki</link>
      <comments>https://tproger.ru/news/microsoft-priznala-sboj-v-yadre-windows-11---lomayutsya--pusk----provodnik--i-nastrojki?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/microsoft-priznala-sboj-v-yadre-windows-11---lomayutsya--pusk----provodnik--i-nastrojki</guid>
      <description><![CDATA[<p>Microsoft признала сбой в ядре Windows 11: ошибка в XAML ломает «Пуск», «Проводник», панель задач и настройки, затрагивая почти весь интерфейс системы</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/microsoft-priznala-sboj-v-yadre-windows-11---lomayutsya--pusk----provodnik--i-nastrojki">Microsoft признала сбой в ядре Windows 11 — ломаются «Пуск», «Проводник» и настройки</a>»</p>]]></description>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Windows 11]]></category>
      <category><![CDATA[XML]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 21 Nov 2025 03:39:32 GMT</pubDate>
      <content:encoded><![CDATA[<p>У Microsoft сейчас не лучший период: после проблем с Microsoft 365, падения производительности в играх и споров вокруг «агентной Windows», компания официально <a href="https://www.neowin.net/news/microsoft-finally-admits-almost-all-major-windows-11-core-features-are-broken/">подтвердила</a> еще одну крупную поломку — <b>сбой в ядре Windows 11</b>.</p><p>Что самое неприятное, проблема задевает почти все ключевые элементы интерфейса.</p><h2>Что сломалось</h2><p>Поломка затронула компоненты Windows Shell, завязанные на XAML. Из-за ошибки начинают разваливаться:</p><ul><li>меню «Пуск» (StartMenuExperienceHost),</li><li>«Проводник» (Explorer.exe),</li><li>«Панель задач»,</li><li>«Настройки Windows» (SystemSettings),</li></ul><p>В общем, все, что открывается в Windows не через .exe из «Program Files», а через современные компоненты Shell.</p><p>Microsoft уточняет, что баг возникает:</p><ul><li>при первом входе пользователя после установки обновления,</li><li>при каждом входе в системы, работающие как VDI / непостоянные образы (где приложения разворачиваются заново).</li></ul><h2>Откуда вообще взялась проблема</h2><p>Оказалось, что источник бага — июльское обновление Windows 11 (KB5062553). То есть все ломалось еще четыре месяца назад, но теперь Microsoft наконец признала ошибку.</p><p>И да, свежее обновление <b>Windows 11 25H2</b> тоже затронуто. В конце концов, в его основе лежит все тот же код.</p><p>Выяснилось, что во всем по итогу виноваты пакеты:</p><ul><li><b>MicrosoftWindows.Client.CBS_cw5n1h2txyewy</b>,</li><li><b>Microsoft.UI.Xaml.CBS_8wekyb3d8bbwe</b>,</li><li><b>MicrosoftWindows.Client.Core_cw5n1h2txyewy</b>.</li></ul><p>Они обновляются вместе с системой и рушат XAML-инфраструктуру. Microsoft уже перечислила характерные признаки проблемы:</p><ul><li>падение <i>Explorer.exe</i> и <i>ShellHost.exe</i>;</li><li>пустая или неработающая панель задач;</li><li>«Пуск» не открывается;</li><li>настройки не запускаются без ошибок — просто молча закрываются;</li><li>XAML-интерфейсы не прогружаются;</li><li>ImmersiveShell ведет себя как будто его удалили.</li></ul><h2>Временные решения</h2><p>Патча, исправляющего баг, пока нет. Но Microsoft предлагает два костыля:</p><h2>Перерегистрация системных пакетов (PowerShell)</h2><h2>Скрипт для входа в систему</h2><p>Microsoft также рекомендует задерживать запуск Explorer.exe, пока не подгрузятся нужные пакеты.</p><h2>Что дальше</h2><p>Microsoft работает над официальным фиксом, но сроков пока нет. Проблема серьезная: ломаются не приложения, а базовые механизмы системы. Поэтому и исправление будет разрабатываться явно не один день.</p>]]></content:encoded>
    </item>
    <item>
      <title>Комментарии в коде: зло или спасение ?</title>
      <link>https://tproger.ru/articles/kommentarii-v-kode--zlo-ili-spasenie--</link>
      <comments>https://tproger.ru/articles/kommentarii-v-kode--zlo-ili-spasenie--?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Baskon]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kommentarii-v-kode--zlo-ili-spasenie--</guid>
      <description><![CDATA[<p>Когда нужны комментарии в коде, а когда без них лучше. Объясняем на примерах, как писать понятные и полезные комментарии</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kommentarii-v-kode--zlo-ili-spasenie--">Комментарии в коде: зло или спасение ?</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Safari]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[DeFi]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[XML]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 23 Jun 2025 10:39:48 GMT</pubDate>
      <content:encoded><![CDATA[<p>Что делать с комментариями в коде — писать или не писать? Одни уверены: чистый код говорит сам за себя, другие не представляют работу без пояснений. Истина, как обычно, посередине. Комментарии — это инструмент, умелый программист применяет их с пользой, неумелый — только усложняет жизнь себе, коллегам, начальству, пользователям и вообщем всем сопричастным. Разберемся, когда комментарии действительно нужны, а когда от них больше вреда и приведем примеры в коде</p><h2>Зачем вообще писать комментарии в коде?</h2><p>Комментарии — это кусочки текста в программе, которые компилятор пропускает, а человек читает. Они не влияют на работу программы, зато сильно влияют на мозг того, кто будет с этой программой разбираться.</p><h3>Какие задачи они решают ?</h3><h4>1. Пояснить неочевидное</h4><p>Код показывает «что» делает программа, а комментарий — «зачем».</p><p>Такой комментарий не просто поясняет логику — он экономит десятки минут будущего чтения.</p><h3>2. Предупредить</h3><p>В коде бывает странное поведение. Иногда это не баг, а фича. И если не предупредить, другой разработчик обязательно «поправит» и всё сломает. Комментарий защитит от этого:</p><h3>3. Пометить незавершёнку</h3><p>TODO, FIXME, HACK — это специальные маячки. Их ставят туда, где нужно что-то доделать, починить или переписать по-человечески.</p><p>Бонусом, IDE умеют обрабатывать такие заметки, каждая по-своему.</p><h3>4. Временно отключить код</h3><p>Иногда нужно что-то закомментировать, чтобы проверить гипотезу. Но такой код нельзя оставлять надолго. Если от него нет пользы — в мусор. Историю всё равно сохранит git.</p><h3>5. Объяснить архитектуру</h3><p>Иногда важно не только «как» сделано, но и «почему так». Особенно это касается паттернов, нестандартных решений или компромиссов.</p><h3>6. Генерация документации</h3><p>Многие языки и фреймворки поддерживают специальные форматированные комментарии для генерации документации. Например, JavaDoc в Java, docstring в Python, XML в C# – предназначены для описания интерфейсов: что делает функция или класс, какие имеют входные параметры и какой результат дают. Такие Комментарии выполняют роль пользовательской документации прямо в коде и могут автоматически собираться в справочник по API.</p><h3>7. Пошутить</h3><p>Программисты – тоже люди, и иногда оставляют в коде шуточные либо эмоциональные комментарии, чтобы снять стресс. В открытых исходниках можно встретить комментарии с шутками, сарказмом или даже ругательствами, адресованными сложному коду или «костылям».</p><p>Как видно, диапазон применения комментариев очень широк. Но одинаково ли хорошо все эти виды влияют на качество кода? Рассмотрим случаи, когда комментарии приносят пользу, а когда создают проблемы.</p><h2>Когда комментарии помогают</h2><p>А часто без комментариев в коде сложно разобраться, особенно когда  код чужой.</p><h3>1. Когда логика не лежит на поверхности</h3><p>Есть участки кода, где без контекста трудно разобраться, даже если код написан довольно читабельно. Например, сложная формула, нетривиальный алгоритм или необычная структура данных – всё, что выбивается из обыденного опыта разработчиков. В таких случаях пара строк комментария, резюмирующих подход, или объясняющих, что происходит, сэкономят часы на анализ. Это особенно важно для командной работы: коллегам, незнакомым с модулем, не придётся разбираться «с нуля».</p><h3>2. Когда нужно документировать контракты и условия</h3><p>Комментарии могут  использоваться для обозначения контрактов – предусловий и постусловий функций, инвариантов и т.д. (подход Design by Contract). Хотя современные языки позволяют выразить многое (например, через assert или декораторы), комментарии могут дополнять код уточнениями вроде:</p><p>Также текстовые пометки в коде полезны для фиксации граничных условий и особых случаев, таких как обработка пустных массивов в бинарном поиске,  другой пример:</p><p>Да, можно это выразить через assert, но комментарий дает сразу и контекст, и предупреждение. Особенно если логика непростая.</p><h3>3. Когда нужно предоставить контекст и ссылки</h3><p>Иногда кусок кода существует благодаря внешнему источнику, например, когда решение просто скопировано из ответа на форуме или из книги по теме. Просто так его не понять — нужна ссылка на источник:</p><h3>4. Когда нужно облегчить ревью</h3><p>Когда код содержит много пояснений к его работе  новому участнику команды проще входить в проект – по сути, комментарии выполняют роль встроенной документации. Кроме того, код-ревью проходит эффективнее, если автор сразу помечает неочевидные места комментариями. Например:</p><p>В PEP 8 (стиле кодирования Python) прямо приводится пример: комментарий “Compensate for border” – полезный, в отличие от банального “Increment x”, который не даёт новой информации.</p><h3>5. Когда нужна поддержка самодокументируемости через структуру</h3><p>Иногда хочется написать: # Этап 1: авторизация пользователя, и в этот момент приходит мысль — а почему бы не вынести это в функцию authorize_user()? И комментарий уже не нужен. То есть сам порыв объяснить словами часто указывает, что код пора расчленить и упростить.</p><h3>6. Когда нужно кого-то обучить программированию или корпоративным стандартам оформления кода</h3><p>Когда человек обучается программированию или только пришел в компанию, где есть свои стандарты, комментарии в коде можно использовать, чтобы дать ему обучающий материал с примерами из практики, пример:</p><p>Комментарий — это инструмент. Если комментарий в коде дает информацию, которую нельзя вытащить из кода напрямую, — значит, работает как надо. Но бывает и обратное — когда комментарии мешают. Об этом — в следующей части.</p><h2>Когда комментарии вредят</h2><p>Худшее, что может случиться с комментариями – когда они вводят в заблуждение или засоряют код впустую. Рассмотрим подробнее:</p><h3>Дублируют очевидное</h3><p>Комментарий, который просто повторяет код своими словами, не несёт никакой пользы:</p><p>А вот так — лучше вообще без пояснений:</p><p>Комментарий должен объяснять, зачем что-то делается, а не что именно:</p><h3>Врут и вводят в заблуждение</h3><p>Классика: код переписали, а про комментарий забыли.</p><p>Спустя некоторое время код могли переписать, и old_api_call() заменили на new_api_call(), но комментарий остался от прежней версии и стал источником дезинформации: разработчик, читающий код, может принять заведомо неверное решение, доверившись устаревшей заметке. По этой причине крайне важно понимать: если уж пишете комментарий, держите его в актуальном состоянии вместе с кодом.</p><h3>Показывают, что код плохой</h3><p>Когда код плохо читается, и его пытаются «объяснить» словами, вместо того чтобы переписать:</p><p>Вместо этого — понятный код:</p><h3>Плодятся бесконтрольно</h3><p>Иногда встречается код, где каждое действие сопровождается избыточными пояснениями:</p><p>Здесь нет ни одной неочевидной строки. Лучше оставить так:</p><h3>Представляют собой мёртвый код</h3><p>Когда в коде остаются большие мёртвые блоки, которые просто закомментированы:</p><p>Может быть, раньше это что-то значило, но сейчас — просто мертвый груз. Если код не нужен — удаляй. История останется в git.</p><h3>Запутывают и размывают смысл</h3><p>Что значит «временное»? Когда переделывать? Почему не постоянное?</p><p>Лучше так:</p><p>Теперь ясно, почему так сделано, и можно отследить, когда это поведение закончится.</p><p>Итак, комментарии становятся злом, когда они не выполняют своей информативной роли, а лишь создают шум или дезинформируют. В худшем случае они могут привести к багам (если программист доверится неверному комментарию) и точно приведут к потере времени на их чтение и разбор. Единственный способ избежать этого зла —  писать комментарии ответственно: убедиться, что они нужны, правдивы и своевременны.</p><h2>Самодокументируемый код vs комментарии</h2><p>Есть мечта у программистов — писать код, который объясняет сам себя. Без сносок, без подсказок, без комментариев. Такой код читается как инструкция: открыл — понял. Это и называется самодокументируемым стилем.</p><p>Как его достигают?</p><ul><li>Говорящие имена. Не x и a, а temperature, retryLimit, userProfile. Лучше сразу по имени понять, что перед тобой — массив с ID или словарь с настройками.</li><li>Функции с характером. У функции должно быть имя-глагол, в котором есть ответ на вопрос “что делает этот код?”. Например: parseInvoice(), sendEmailReminder(), fetchUserByToken().</li><li>Использовать названия для константных значений. Вместо if (status == 4) — if (status == ORDER_CONFIRMED). Вместо 3000 — RETRY_TIMEOUT_MS.</li><li>Структура — как абзацы в тексте. Пустые строки, логические блоки, отступы — чтобы этапы выделялись сами собой.</li></ul><p>Посмотрим например, где простой код поясняется ненужным комментарием:</p><p>Другой пример:</p><p>Комментарий уже не нужен. Из имён всё понятно: считаем среднюю температуру. Здесь самое интересное — само документируемость имеет границы. Потому что:</p><ul><li>Код объясняет «что», но не всегда «почему».</li></ul><p>Вот есть строка:</p><p>А почему 5? Почему не 3, не 10? Если причина — ограничение API, бизнес-логика или чья-то странная прихоть — код не расскажет. А вот комментарий может:</p><p><b>Неочевидные решения и компромиссы</b></p><p>Иногда приходится делать что-то нестандартное. Например:</p><p>Такой кусок кода без пояснений вызовет недоумение: А почему не сортируем?</p><p>Старайтесь писать код так, чтобы его поняли без подсказок. Как будто у вас нет возможности что-то дополнительно объяснить. А если видите, что читателю будет трудно — помогите: добавьте комментарий, который действительно нужен.</p><h2>Влияние ИИ и новых инструментов на подход к комментариям</h2><p>В последние годы в распоряжении разработчиков появились мощные ассистенты на базе искусственного интеллекта — такие как GitHub Copilot (автодополнение кода на основе ИИ) и большие языковые модели вроде ChatGPT. Эти технологии начинают влиять и на практики комментирования кода.</p><p>Во-первых, автогенерация кода по комментариям стала реальностью.</p><p>Инструмент Copilot способен на лету написать фрагмент кода, ориентируясь на описания на естественном языке. Например:</p><p>Copilot тут же может подставить реализацию:</p><p>Такой подход превращает комментарий в своего рода промпт — описание задачи для ИИ. Это приучает писать коротко и по делу. Хотя такие комментарии потом часто удаляют, их роль в генерации кода становится всё важнее.</p><p>Во-вторых, ИИ сам пишет комментарии.</p><p>Можно просто показать код:</p><p>…и попросить ИИ: прокомментируй. В ответ он выдаст:</p><p>Или даже более детальный:</p><p>Такие автокомментарии могут быть полезны, но всё равно требуют проверки: всезнающий ИИ не всегда понимает скрытые нюансы логики, а часто просто галлюцинирует, поэтому доверять полностью не стоит, но, как черновик, вполне годится.</p><p>В-третьих, стало проще понимать чужой код без комментариев.</p><p>Раньше приходилось часами вчитываться, сегодня — можно просто спросить:</p><p>Запрос в ChatGPT: что делает эта функция?</p><p>Ответ: Она возвращает новый список, содержащий удвоенные значения тех элементов исходного списка, которые делятся на 3.</p><p>ИИ не волшебник, но в 90% случаев — удобный переводчик с машинного на человеческий. Это снимает часть нагрузки с необходимости документировать тривиальные вещи.</p><p>В-четвертых, новый тип комментариев: инструкции для ИИ</p><p>Может возникнуть ситуация, когда комментарий пишется не столько для человека, сколько как команда:</p><p>Если вы используете Cursor или Replit, это может очень полезным.</p><h2>Заключение</h2><p>Так всё-таки, комментарии – зло или спасение?</p><p>Это не абсолютное благо и не абсолютное зло, это просто инструмент. Всё зависит от того, в чьих он руках и зачем используется. Комментарии способны помочь понять неочевидные решения, разобраться в сложных структурах, подсказать направление для размышления. Но, как и любой инструмент, в неумелых руках это способ случайно (или не очень) испортить кровь себе и окружающим.</p><p>Но всё-таки чаще наличие комментариев делает жизнь лучше, ведь иногда формулирование мысли разговорным текстом, а не кодом, позволяет понять свою идею лучше, взглянуть на нее с другой стороны.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как встроить распознавание документов в Android: пошаговое руководство</title>
      <link>https://tproger.ru/articles/kak-vstroit-raspoznavanie-dokumentov-v-android--powagovoe-rukovodstvo</link>
      <comments>https://tproger.ru/articles/kak-vstroit-raspoznavanie-dokumentov-v-android--powagovoe-rukovodstvo?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Smart Engines]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-vstroit-raspoznavanie-dokumentov-v-android--powagovoe-rukovodstvo</guid>
      <description><![CDATA[<p>Разбираемся, как быстро добавить возможность распознавания документов в Android. Пошаговое руководство по встраиванию Smart Document Engine.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-vstroit-raspoznavanie-dokumentov-v-android--powagovoe-rukovodstvo">Как встроить распознавание документов в Android: пошаговое руководство</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[SEO]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Распознавание]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[BASIC]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Стартапы]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[XML]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 10 Jun 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Привет, Tproger!</p><p>Мы в <a href="https://smartengines.ru/">Smart Engines</a> занимаемся разработкой софта для распознавания самых разных документов — начиная от паспорта РФ, свидетельства о рождении и заканчивая первичкой вроде УПД или ТОРГ-12, а также банковских карт, номеров телефона и баркодов. Наши библиотеки написаны полностью с нуля (на плюсах), мы уделяем огромное внимание скорости алгоритмов, нейросетям (новым архитектурам, размеру и правильному применению) и оптимизации, за счет чего наш софт портируется на любые архитектуры и может быть использован на любой платформе.</p><p>Сегодня продолжим знакомиться через рассказ о нашем софте, на очереди вторая библиотека — Smart Document Engine и ее возможности работы с жесткими и гибкими формами.</p><h2>Гибкие и жесткие формы</h2><p>Вначале про сами формы: они могут быть «жесткими» и «гибкими». Жёсткие формы подразумевают, что положение всех объектов на форме может быть задано прямо в виде координат на шаблоне. Самое простое определение для жестких форм — они совпадают «на просвет». Возьмите пару листов А4 с распечатанной жёсткой формой, наложите друг на друга, и места расположения полей точно совпадут. Гибкие формы устроены гораздо сложнее, но все равно имеют свою характерную структуру и топологию.</p><p>Распознавание жестких форм можно свести к детекции формы на изображении и распознавании определенных областей, где должны быть искомые поля. Гибкие формы требуют гораздо более сложных систем поиска (к тому же, завязанных на результате предыдущих действий, например, OCR, что только увеличивает возможность ошибки).</p><p>Кстати, иногда вместо распознавания текста целиком достаточно просто ответить на вопрос «есть ли текст в выбранной области, и, если есть, то где»</p><p>Но не надо думать, что жёсткие формы совсем просты — большие белые поля без каких-либо символов (или одинаковый узор по краям, как это бывает с бланками гособразца), малый объём статического текста и некоторая вариативность бланков тоже заставляют потрудиться над детекцией и классификацией шаблонов.</p><p>Также существуют общие для подобных форм проблемы. Правильно интерпретировать галочки в чекбоксах, найти штрихкоды, правильно разметить табличные данные — есть куча проблем, каждая из которых имеет своё state-of-the-art решение и набор алгоритмов, над которыми нужно ломать голову.</p><h2>Почему не LLM, хотя казалось бы</h2><p>Сейчас мы переживаем бум развития нейросетей — генеративные и классифицирующие сети появляются как грибы после дождя. Количество задач, которые они могут решить, тоже кажется неисчислимым: казалось бы — дайте обучающую выборку побольше, и всё получится! Тем более, что примеры использования нейросетей для автоматизации рутины уже можно встретить на каждом шагу: об этом пишут заметки и обзорные статьи на научно-популярных ресурсах, а интеграторы и стартапы предлагают решения по созданию чат-ботов и помощников на основе ИИ, обученного на внутренней документации больших компаний.</p><p>Однако чем сложнее нейросеть, чем глубже степень обучения — тем выше шанс, что она начнёт бредить. Мы все какое-то время назад <a href="https://shedevrum.ai/post/bc5bf060107711eeb9ea06d64eab8f23/">смеялись</a> над шести-семипалыми героями очередных сгенерированных изображений, сейчас посмеиваемся над сгенерированными сетями текстами с описанием несуществующих фильмов и книг, но смешно ли будет нам (а особенно бухгалтерии), если нейросеть начнет галлюцинировать при распознавании платёжных реквизитов или суммы НДС? И чем выше степень развития сетей — тем менее заметными будут становиться такие ошибки.</p><p>В прошлом году на одной из ключевых конференций в области анализа и распознавания документов — ICDAR — учёные традиционно задались вопросом о будущем OCR. И сошлись во мнении, что OCR нисколько не устарела, благополучно развивается и остается наиболее надежным инструментом распознавания. Обеспечить требования консистентности (и ещё всякого такого) информации, извлекаемой из изображения, все равно сможет только старый добрый OCR и прочие детерминированные алгоритмы. И именно их разработкой (и доведением до совершенства) мы и занимаемся.</p><p>Вернёмся к библиотеке <a href="https://smartengines.ru/intelligent-document-recognition/">Smart Document Engine</a>. Как уже говорилось выше, гибкие формы на то и гибкие, что исключительно геометрией на них не обойдёшься — вопрос местонахождения полей решается «на лету». На процесс взаимодействия с библиотекой это влияет в самом конце, на моменте работы с результатом. Перейдем к знакомству с интерфейсом на примере всё того же встраивания в андроид.</p><h2>Встраивание</h2><p>В целом, сценарий работы с библиотекой распознавания документов такой же, как и в <a href="https://tproger.ru/articles/kak-vstroit-raspoznavanie-pasporta-rf-v-android--powagovoe-rukovodstvo">прошлой статье</a> про распознавание паспорта: создаём движок, формируем настройки сессии, заводим саму сессию и кормим её картинками, после чего работаем с результатом распознавания. В отличие от документов, удостоверяющих личность, гибкие и жесткие формы могут быть многостраничными, с одинаковыми «по смыслу» полями на каждой странице. Помимо этого, часто документы загружают «пакетом», и в этом случае на одном изображении могут быть несколько разных документов. Поэтому результат распознавания устроен сложнее, чем в прошлом примере. Есть «результат распознавания», внутри него лежит набор найденных документов, каждый документ разбивается на «логический» и «физический» набор полей:</p><p>Логическая и физическая части документа разбираются отдельно, так как в некоторых случаях геометрия вообще не нужна (если результат распознавания документа дальше идёт в базу данных):</p><p>Как правило, результат распознавания представляют в виде json-объекта, но для наглядности лучше всего пользоваться html — особенно в случае, когда логические и физические поля имеют больше одного соответствия. Вот простенький генератор html на основе документа:</p><p>В результате получается удобная для взаимодействия html-страничка. Если добавить немного фантазии, то можно сразу сделать форму, в которой можно будет проверять и дополнять неуверенно распознанные поля — очень удобно в случае, если качество изображения плохое или документ плохо пропечатан.</p><p>Конечно, помимо андроида встроить распознавание и организовать удобные представление документа (при необходимости) можно и на любой другой платформе, однако с трендом на создание банковских офисов нового поколения и развития курьерской сети автоматизация ввода документов с помощью средненьких мобильных устройств на Андроиде становятся актуальной задачей.</p><p>На этом мы не заканчиваем, ждите новых статей!</p>]]></content:encoded>
    </item>
    <item>
      <title>Все программирование, которое должен знать Project Manager</title>
      <link>https://tproger.ru/articles/vse-programmirovanie--kotoroe-dolzhen-znat-pm</link>
      <comments>https://tproger.ru/articles/vse-programmirovanie--kotoroe-dolzhen-znat-pm?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/vse-programmirovanie--kotoroe-dolzhen-znat-pm</guid>
      <description><![CDATA[<p>Рассказываем, кто такие project-менеджеры и должны ли они уметь программировать и читать код.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/vse-programmirovanie--kotoroe-dolzhen-znat-pm">Все программирование, которое должен знать Project Manager</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Управление проектами]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Тимлид]]></category>
      <category><![CDATA[XML]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 04 Apr 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В IT появилось настолько много профессий с иностранными названиями, что иногда непонятно, что они вообще делают. Кажется, что project manager — просто тот, кто громче всех кричит «где мой релиз» и «за два дня успеете?». Но это далеко не так.</p><p>Разбираемся, какие основные задачи закрывает проджект и нужно ли ему знать программирование и уметь кодить. В этом нам поможет Артем Харченков —  автор <a href="http://t.me/teamlead_insights">Telegram-канала «IT Инсайты»</a>, где он делится мыслями об IT и тимлидстве. Артем руководит командой 40+ человек более 4 лет, управляет департаментами разработки, тестирования, аналитики и DevOps, является спикером TeamLead Conf и участником подкастов и ведущим вебинаров. Был инженером внедрения и Java-программистом.</p><h2>Какие главные задачи у PM в айти</h2><p>Менеджер проекта (или Project Manager, PM) — это функциональный руководитель команды, которая работает над определенным проектом. PM отвечает за то, кто и что в команде делает, чтобы достичь поставленных целей.</p><p>Основная задача менеджера проектов в IT — контролировать, чтобы вверенный ему проект был выполнен в срок, с должным качеством и утверждённым составом работ.</p><blockquote>Часто говорят, что эти три параметра образуют «железный проектный треугольник», то есть изменение одного из параметров невозможно без изменения двух других.</blockquote><p>До работы над проектом обычно составляется план-график, и PM следит за тем, чтобы команда ему следовала. Мотивация команды и поддержание командного духа — также одни из базовых функций PM. Важно понимать, что хороший PM должен не только адекватно оценивать ситуацию на проекте и задавать направление, но и уметь принимать меры, если что-то идёт не так.</p><h2>Нужно ли в принципе проджекту учить программирование или он его должен знать изначально</h2><p>Если говорить о проектах разработки ПО, то для того, чтобы стать в них хорошим PM, очень полезно иметь опыт работы в одной из ролей проектной команды. Так как программисты —  основная движущая сила проекта, опыт работы в этой роли даёт преимущество в понимании процессов разработки. Это помогает общаться с ними «на одном языке».</p><blockquote>Однако я знаю хороших PM, которые выросли из тестировщиков или аналитиков. Одно можно сказать точно: чтобы хорошо руководить командой, следует понимать, по каким правилам она работает, а для этого нужно побывать в ней «изнутри».</blockquote><p>Если вы стали PM без технического бэкграунда, будет крайне полезно изучить, какую работу делает каждая из командных ролей, и начать лучше, конечно, с роли разработчика. Без понимания выполняемых членами команды функций PM не сможет принимать адекватные решения и расставлять приоритеты.</p><h2>Какие базовые штуки из программирования нужно знать PM-у, чтобы не теряться в разговорах с кодерами</h2><p>Начинать стоит не с изучения самого языка программирования, а с общих определений и с понимания того, какой из инструментов зачем используется. Например, чтобы на встрече программистов обсуждение для проджекта не превращалось в «белый шум» нужно знать, что такое, например, «релиз», «деплой», «ветка в гите», «рефакторинг», «кубер» и так далее. Не обязательно самому практиковаться в технологиях, но требуется понимать, для чего они используются. Именно понимание того, какую задачу какой инструмент решает, наиболее важно для PM’а, а вот умение писать код или отличать абстрактный класс от интерфейса не пригодится практически никогда.</p><blockquote>При правильном распределении обязанностей на проекте PM’у вообще не требуется читать код: ни настоящий, ни псевдо. Его задача — организация процесса, а не техническая реализация.</blockquote><h2>Как знание кода помогает адекватно оценивать дедлайны</h2><p>Если PM имеет опыт работы программистом, он понимает, какие задачи в разработке являются сложными, а какие — простыми. Это даёт преимущества в прогнозировании сроков: он может самостоятельно примерно оценить время на реализацию функции или, если оценка другого программиста ему кажется завышенной, уточнить причины расхождения в прогнозах. В таких обсуждениях часто удаётся найти оптимальное решение: выбрать более простой способ реализации, который сократит сроки, но при этом покроет основные потребности заказчика.</p><blockquote>При этом анализ узких мест в коде — не задача PM’а, для этого на проекте обычно есть архитектор, техлид или старший разработчик. Однако PM должен учитывать известные технические риски при планировании, чтобы избежать срыва сроков.</blockquote><h2>Про технические штуки: что нужно и не нужно знать</h2><h3>Стоит ли вникать в Git</h3><p>Git — важный инструмент для командной работы программистов, он уже стал стандартом в современных проектах. Как и в других технических инструментах, PM не обязан знать команды push, fetch или merge и уметь ими пользоваться, но должен иметь общее понимание базовых вещей (например, «ветка», «репозиторий», «merge request», «commit»). Без этих знаний PM не сможет эффективно управлять процессом доставки функций и выпуска релизов, выявлять их узкие места и принимать взвешенные решения по устранению проблем.</p><h3>Нужно ли знать, чем монолит отличается от микросервисов</h3><blockquote>Понимание этой разницы — сейчас базовое требование в IT. Я рекомендую изучить плюсы и минусы обоих подходов к построению систем. Хорошо, что современные ИИ-помощники позволяют разобраться в этом за пару часов: они опишут всё подробно «на пальцах» и с примерами.</blockquote><h3>Должен ли PM знать подходы к разработке, например, CI/CD или TDD</h3><p>PM должен понимать смысл этих аббревиатур, цели их применения командой и пользу, которую они приносят.</p><h3>Как понимание тестов (типа юнит-тестов) спасает при проверке качества</h3><p>Написание тестов — важный этап разработки, который помогает убедиться, что команда в процессе разработки случайно не сломала то, что работало раньше. Многие недооценивают этот этап и ради ускорения работы сокращают время на тесты или вовсе от них отказываются. В краткосрочной перспективе это даёт быстрые результаты, но в долгосрочной — приводит к дополнительным затратам времени на поиск и исправление внезапных ошибок, усложняя поддержку и развитие продукта.</p><h3>Базы данных — это важно для PM-ов или только для разработчиков</h3><p>Важность понимания принципов работы баз данных для PM зависит от предметной области проекта. Например, при разработке стандартной CRM-системы база данных — лишь один из модулей продукта. В этом случае PM должен понимать только то, что это за база, какие данные в ней хранятся и обрабатываются.</p><p>Если же проект связан с созданием ПО для работы с базами данных (например, клиента для БД или системы оптимизации SQL-запросов), потребуется гораздо более глубокое знание их принципов работы.</p><h3>Веб, мобилки, данные — отличается ли набор знаний для PM-а в этих стеках</h3><p>В общем случае — нет. Различия между этими типами проектов в основном технические, но во всех случаях над достижением цели работает команда с распределёнными ролями. Навыки PM в первую очередь — это способность её мотивировать, выделять приоритеты, проводить эффективные встречи и обеспечивать выполнение задач в срок. Технические инструменты PM (например, таск-трекеры, диаграммы Ганта или покер-планирование) могут различаться, но они не связаны напрямую с инструментами разработки, аналитики или тестирования.</p><p>Конечно, одинаковых проектов не бывает: каждый имеет технические и организационные особенности. Однако в любом из них ключевая цель — выполнить определённый объём работ в срок с должным качеством. Именно умение достигатьдост этой цели — главный критерий успешности PM.</p>]]></content:encoded>
    </item>
    <item>
      <title>Что такое AJAX и как он работает</title>
      <link>https://tproger.ru/articles/chto-takoe-ajax-i-kak-on-rabotaet</link>
      <comments>https://tproger.ru/articles/chto-takoe-ajax-i-kak-on-rabotaet?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chto-takoe-ajax-i-kak-on-rabotaet</guid>
      <description><![CDATA[<p>Что такое AJAX. Показываем, в каких случаях нужен AJAX и как правильно с ним работать. Рассматриваем пошаговую инструкцию и основные нюансы ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chto-takoe-ajax-i-kak-on-rabotaet">Что такое AJAX и как он работает</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Отладка]]></category>
      <category><![CDATA[Браузеры]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[XML]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 06 Mar 2025 10:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Технология AJAX (Asynchronous JavaScript and XML) — мощный инструмент разработки динамичных и производительных интерактивных веб-приложений. AJAX меняет подход к обновлению содержимого страниц и позволяет загружать данные в асинхронном режиме без перезагрузки. Благодаря этой технологии сохраняется высокая скорость загрузки, юзерам удобнее пользоваться сайтами.</p><p>Узнаем, что собой представляет технология, как формируются AJAX запросы, как работает инструмент, каковы его преимущества, недостатки и ограничения.</p><h2>Основные компоненты AJAX</h2><p>Термин AJAX используется в программировании с 2005 года, хотя подобные способы обмена данными применялись и ранее. Это универсальное решение для веб-приложений, которое объединяет несколько компонентов. Именно благодаря AJAX реализованы такие проекты, как современные соцсети, Google Maps, Gmail, Google Docs и многие другие.</p><p>Основная задача  AJAX — запросы к серверу в обход перезагрузки страницы. Это уменьшает время отклика и позволяет веб-приложению работать в интерактивном режиме. Несмотря на присутствие в названии отсылки к XML, использовать этот язык разметки не обязательно.</p><p>Технология реализуется через JavaScript — происходит заданный скриптом асинхронный обмен данными между сервером и браузером. Именно на JS создаются запросы для коммуникации с сервером и динамического изменения страницы.</p><p>Асинхронность — ключевое условие запросов AJAX. Они выполняются в фоновом режиме, пока пользователь продолжает работу с сайтом. Загрузка и обработка данных выполняются параллельно.</p><p>Код на JavaScript — не единственный компонент AJAX. В него также входят форматы хранения данных XML или JSON. При этом JSON для отправки запросов AJAX используется чаще, поскольку код у этого формата короче, что существенно упрощает передачу данных.</p><p>Важнейший компонент технологии — объект <b>XMLHttpRequest,</b> который отвечает за все запросы AJAX. Этот API предоставляет клиенту полноценный функционал для взаимного обмена данными с сервером. Раньше XHR поддерживали не все браузеры — разработчикам приходилось дополнительно подключать библиотеку jQuery с встроенным объектом. Сейчас большинство популярных браузеров, включая Chrome и Firefox, работают с XMLHttpRequest напрямую.</p><p>Примечание. В современных программных веб-продуктах вместо XHR нередко используют Fetch AP, но говорить о массовом тренде преждевременно.</p><p>Передача данных выполняется через стандартный протокол взаимодействия клиента и сервера HTTP. Браузер инициирует запрос, получает в ответ HTML-страницу, либо сообщение об ошибке (если в запросе есть неточности). Используются стандартные методы получения данных — GET и POST. Первый (GET) применяется при получении данных от сервера, второй (POST) используется для отправки данных на сервер в теле HTTP-запроса.</p><p>Благодаря способности AJAX работать с разными форматами, типами данных и серверными API, эта методика универсальна. Асинхронный обмен позволяет веб-приложениям быстро загружаться, плавно работать и не перезагружаться после каждого запроса пользователя к серверу. Это особенно актуально для приложений, требующих постоянного взаимодействия с сетевым устройством — социальных сетей, онлайн-магазинов, браузерных версий мессенджеров.</p><h2>Как работает AJAX</h2><p>Магия асинхронных запросов AJAX базируется на взаимодействии с DOM-объектами браузерной страницы. Процесс выглядит следующим образом:</p><ol><li>С помощью JavaScript браузер отправляет HTTP-запрос на сервер, где происходит обработка данных и отправка ответа. Чтобы отправить запрос, потребуется создать объект XMLHttpRequest — без него отправлять запросы и получать ответы без перезагрузки не получится.</li><li>При этом запрос необходимо настроить — указать метод GET/POST, URL и перейти на асинхронный режим работы.</li><li>Сервер возвращает данные, с которыми начинает работать JavaScript. Когда браузер принимает исходный код страницы, он выстраивает множество виртуальных элементов на базе этого кода — сюда входят заголовки, изображения, текст, ссылки и прочее.</li><li>При этом к каждому компоненту виртуальной модели можно обращаться отдельно с целью изменить его свойства или содержание. JavaScript позволяет поменять фон страницы, изменить заголовок и внести другие изменения, не перегружая страницу.</li></ol><p>Простой пример запроса AJAX выглядит следующим образом (используется метод получения данных GET):</p><p>В этом примере мы создаем объект XMLHttpRequest, настраиваем запрос, обрабатываем ответ и данные, отправляем запрос на сервер. Данные выводятся в консоль без перезагрузки страницы — обновляется только нужный элемент интерфейса.</p><p>В следующем примере показан код для отправки формы с использованием запроса AJAX:</p><p>С помощью этого кода пользователь отправляет данные формы на сервер и получает ответ без перезагрузки страницы. В браузере запускается скрипт, привязанный к кнопке «Отправить». Все процессы происходят внутри скрипта — новая информация встроена в уже открытую страницу.</p><h3>Отладка AJAX-запросов</h3><p>Для эффективной разработки и поддержки приложений программистам важно научиться отлаживать и тестировать запросы AJAX. Для этого необходимы встроенные инструменты браузеров Chrome, Firefox, Edge и других.</p><p>Эти инструменты позволяют:</p><ul><li>просматривать отправленные на сервер запросы во вкладке Network;</li><li>проверять атрибуты запросов/ответов и их содержимое;</li><li>следить за временем выполнения отправленных запросов, выявлять узкие места и оптимизировать процессы.</li></ul><p>Для тестирования запросов полезно создавать фейковые API или проверять работу реальных интерфейсов вне контакта браузера с помощью библиотек MSW или Postman.</p><p>Прогерам будут полезны ценные советы по оптимизации процессов при работе с запросами:</p><ul><li>Используйте кэширование, чтобы уменьшить количество запросов. Это снижает нагрузку на сервер и повышает производительность.</li><li>Применяете сжатие данных для снижения объема отправляемой информации. Это ускоряет процесс передачи и обработки данных.</li><li>Всегда обрабатывайте ошибки для улучшения пользовательского опыта. Лучше заранее предусмотреть все варианты, чтобы снизить риск возможных проблем при использовании приложения.</li></ul><h2>Преимущества AJAX</h2><p>Перечислим основные плюсы технологии:</p><ul><li><b>Обновление данных без необходимости перезагружать страницу. </b>Это улучшает опыт пользователей и делает взаимодействие с приложением более плавным и быстрым. Юзерам гораздо удобнее видеть обновление на той же странице, чем загружать новую.</li><li><b>Уменьшение трафика. </b>Поскольку браузер получает от сервера не всю страницу полностью, а только ограниченную запросом информацию, тратится меньше ресурсов на передачу данных.</li><li><b>Снижение нагрузки на сервер</b>. Если приложение открывает страницы «на лету», достаточно один раз прогрузить стандартные элементы (шапку, меню, подвал), а остальные части загружать по необходимости.</li><li><b>Быстрота и отзывчивость приложений.</b> Чем меньше данных в запросе AJAX, тем быстрее придет ответ от сервера. В современных продуктах скорость и удобство — ключевые конкурентные преимущества.</li><li><b>Экономия ресурсов. </b>Безлимитный интернет есть не у всех и не везде, а запросы AJAX используют ресурсы в минимальном режиме.</li></ul><p>Необходимо также понимать, что технология не универсальна и подходит не для всех ситуаций и приложений.</p><h2>Недостатки AJAX</h2><p>В числе основных минусов AJAX:</p><ul><li><b>Потенциальные проблемы с SEO-контентом. </b>Содержание страниц, которое подгружается с помощью AJAX, часто недоступно для поисковиков, что негативно сказывается на индексации. Поисковые системы видят исходный ход, но не данные с серверов. Это может быть проблемой для сайтов, которые нуждаются в привлечении пользователей. Для сеошников работа с сайтами на AJAX — головная боль.</li><li><b>Кэширование.</b> Динамическое содержание может создать сложности с кэшированием, что приводит к загрузке неактуальных данных.</li><li><b>Зависимость от JavaScript. </b>Пользователь может отключить JavaScript, что ограничит функциональность сайта. Данные не смогут прийти с сервера, интерактивного обновления не получится.</li><li><b>Усложнение проекта.</b> Работа с запросами AJAX требует от разработчиков определенной квалификации. Они должны предвидеть различные внештатные ситуации, связанные с асинхронными запросами, и заранее прописать скрипты на такие случаи. Потребуется также продумать бэкенд — ответы сервера на различные запросы.</li></ul><p>При нестабильной связи AJAX может не получить ответа от сервера либо не отправить запрос. Такая ситуация нарушает логику загрузки страницы — ее придется все-таки перезагружать и начинать все с нуля.</p><h2>Где используется AJAX</h2><p>Технологию используют для улучшения пользовательского опыта при работе с сайтами и веб-приложениями. AJAX-запросы решают множество подзадач:</p><ul><li><b>Динамическое обновление.</b> С помощью AJAX обновляются отдельные элементы страниц — таблицы, списки, графики. Это особенно удобно на сайтах, где применяются фильтры — например, на страницах онлайн-магазинов.</li><li><b>Автозаполнение и поиск.</b> AJAX используется для мгновенной выдачи результатов поиска. Юзер только начинает вводить текст в поисковую строку и уже видит релевантные варианты. Это удобно для формирования точных и подробных поисковых запросов.</li><li><b>Отправка формы. </b>Чтобы отправить данные заполненных форм, пользователю не нужно ждать обновления, что делает работу более плавной. Например, можно залогиниться после просмотра сайта, оставшись на той же странице.</li><li><b>Загрузка данных для конкретного пользователя.</b> В соцсетях или на сайтах с интерактивными опциями новые сообщения, уведомления и комментарии подгружаются без обновления страницы.</li><li><b>Динамические интерфейсы.</b> Этот процесс вы можете наглядно наблюдать на Гугл-картах и в подобных приложениях — по мере прокрутки подгружаются новые части территории. Аналогичная опция реализована на сайтах с интерактивными прогулками по гостиницам, музеям и другим локациям.</li></ul><p>Иными словами, AJAX-запросы используются везде, где требуются обновления содержания без перезагрузки: чтобы получить список новых сообщений в чате или в общей ленте; подгрузить позиции на витрине товаров; увидеть рекламные баннеры и т.д.. В Ютубе на этой технологии основано сворачивание видео в компактный плеер в углу.</p><p>AJAX — незаменимый инструмент для разработки динамических интерфейсов и улучшения пользовательского опыта. Механизм основан на асинхронности работы браузера и сервера. При нормальной скорости интернета данные передаются мгновенно, так что пользователям даже не приходится ждать. При этом AJAX универсален и может работать с разными форматами данных и серверными API.</p>]]></content:encoded>
    </item>
    <item>
      <title>EA выложила на GitHub исходный код Command; Conquer: Red Alert и еще нескольких игр серии</title>
      <link>https://tproger.ru/news/ea-vylozhila-na-github-ishodnyj-kod-command--amp--conquer--red-alert-i-eshhe-neskolkih-igr-serii</link>
      <comments>https://tproger.ru/news/ea-vylozhila-na-github-ishodnyj-kod-command--amp--conquer--red-alert-i-eshhe-neskolkih-igr-serii?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/ea-vylozhila-na-github-ishodnyj-kod-command--amp--conquer--red-alert-i-eshhe-neskolkih-igr-serii</guid>
      <description><![CDATA[<p>EA открыла исходный код Command &amp; Conquer: Red Alert и других игр серии на GitHub. Теперь моддеры могут улучшать классику RTS с поддержкой Steam Workshop</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/ea-vylozhila-na-github-ishodnyj-kod-command--amp--conquer--red-alert-i-eshhe-neskolkih-igr-serii">EA выложила на GitHub исходный код Command; Conquer: Red Alert и еще нескольких игр серии</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[XML]]></category>
      <category><![CDATA[Steam]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 28 Feb 2025 10:48:13 GMT</pubDate>
      <content:encoded><![CDATA[<p>Electronic Arts <a href="https://github.com/orgs/electronicarts/repositories">опубликовала</a> исходный код нескольких классических игр серии <b>Command &amp; Conquer</b> на GitHub под лицензией <b>GPL</b>.</p><p>Данный шаг направлен на поддержку моддеров и сохранение исторического наследия культовых стратегий в реальном времени.</p><p>В открытый доступ выложены исходные коды:</p><ul><li><b>Command &amp; Conquer: Tiberian Dawn</b></li><li><b>Command &amp; Conquer: Red Alert</b></li><li><b>Command &amp; Conquer: Renegade</b></li><li><b>Command &amp; Conquer: Generals и дополнение Zero Hour</b></li></ul><h2>Поддержка моддеров и новые возможности</h2><p>EA также добавила <b>поддержку Steam Workshop</b> для нескольких игр серии, включая <b>Renegade, Generals, Zero Hour, Tiberium Wars, Kane’s Wrath</b> и <b>Tiberian Twilight</b>. Это упрощает создание и распространение пользовательских модов.</p><p>Для поддержки моддеров EA также выпустила <b>«C&amp;C Modding Support»</b> – пакет с <b>исходными файлами XML, схемами, скриптами, шейдерами</b> и <b>картами</b> для игр на движке <b>SAGE</b>.</p><p>Он поможет разработчикам добавлять поддержку <b>высоких частот обновления, ультрашироких мониторов</b> и других современных технологий.</p><h2>Кто стоял за открытием исходников?</h2><p>Инициативу по публикации исходного кода возглавили:</p><ul><li><b>Брайан Барнс</b> – технический директор EA,</li><li><b>Джим Веселла</b> – продюсер Respawn,</li><li><b>Люк Фенан</b> – давний участник сообщества C&amp;C.</li></ul><p>Благодаря их усилиям удалось восстановить и опубликовать исходники, что стало значимым вкладом в развитие моддинга и сохранение классики RTS.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как работать с JSON в веб-разработке?</title>
      <link>https://tproger.ru/articles/kak-rabotat-s-json-v-veb-razrabotke-</link>
      <comments>https://tproger.ru/articles/kak-rabotat-s-json-v-veb-razrabotke-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Елизавета Малышева]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-rabotat-s-json-v-veb-razrabotke-</guid>
      <description><![CDATA[<p>Что такое JSON. Показываем основы веб-разработки с помощью JSON. Рассматриваем пошаговую инструкцию, как правильно управлять данными ✔ Tproger </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-rabotat-s-json-v-veb-razrabotke-">Как работать с JSON в веб-разработке?</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Парсинг]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[XML]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 17 Jan 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>JSON может убить ваш сайт на часы, а может, и больше. Хотите узнать, как этого избежать? Тогда читайте дальше: разберем самые частые ошибки и расскажем, как правильно управлять данными.</p><h2>Что такое JSON</h2><p>JSON или JavaScript Object Notation — формат для обмена данными. Его используют в веб-разработке, чтобы передать числовую информацию от клиента к серверу и наоборот. По сути это просто строка, но с нюансами.</p><p>JSON — стандарт в веб-разработке, так как его текстовая структура легко читается как человеком, так и компьютером. Давайте посмотрим, из чего он может состоять:</p><ul><li><b>Объекты </b>— пары “ключ-значение” в фигурных скобках. Выглядят так же, как обычные JS-объекты;</li><li><b>Массивы </b>— упорядоченные значения. Заключаются в квадратные скобки и отделяются запятой;</li><li>Ключи — строки, которые обязательно в двойных кавычках. Одинарные не подойдут;</li><li>Значения — могут быть строками в двойных кавычках, числами, логическими значениями, массивами, объектами или null.</li></ul><p>Мы не зря упоминаем двойные кавычки. Очень важно следить за ними, иначе сервер или ваш сайт не смогут обработать JSON.</p><figure><img src="https://media.tproger.ru/user-uploads/105990/2025-01-10/2881af4f-84d3-46b4-9f97-86c49b1e3c17.png" alt="" /></figure><p>Пример JSON-документа:</p><p>В этом примере объект содержит четыре ключа:</p><ul><li>name — строка,</li><li>type — строка,</li><li>topics — массив строк,</li><li>published — логическое значение, true.</li></ul><p>Этот JSON описывает воображаемую статью, у которой есть темы, название и статус публикации.</p><h2>Зачем нужен JSON, если есть XML?</h2><figure><img src="https://media.tproger.ru/user-uploads/105990/2025-01-10/52e20503-f9b7-4b82-8959-0259db56f08d.png" alt="" /></figure><p>До JSON разработчики использовали XML. Вот основные отличия:</p><figure><img src="https://media.tproger.ru/user-uploads/105990/2025-01-10/f33c9cfe-801c-49d2-ab39-d4f86994a5c1.png" alt="" /></figure><p>Давайте разберём все пункты и посмотрим, в чём же конкретно хорош JSON.</p><h3>Синтаксис</h3><h4>JSON</h4><p>Выглядит как обычный JavaScript-объект.</p><p>Пример:</p><p>Мы создали объект с двумя ключами. Имя –– John, возраст –– 30. Это упрощённый вариант хранения данных о пользователе. Также можно добавить почту, ник, город и так далее.</p><h4>XML</h4><p>XML или (Extensible Markup Language) –– посложнее, так как использует закрывающиеся теги. Это делает его визуально более «шумным» и трудным для восприятия. Особенно если XML-данных много.</p><h3>Размер данных</h3><h4>JSON</h4><p>JSON компактнее, в нём нет лишних тегов и атрибутов. Он лучше подходит для веба, так как важна минимизация. Чем данные легче, тем быстрее работает сайт.</p><h4>XML</h4><p>XML объемнее, потому что каждый элемент должен быть обёрнут в открывающий, а потом закрывающий тег.</p><h3>Легкость парсинга</h3><h4>JSON</h4><p>JSON легко парсить. В JavaScript достаточно использовать JSON.parse(), чтобы преобразовать JSON-строку в JS-объект.</p><p>Пример:</p><p>Здесь мы поместили JSON-строку в переменную и затем распарсили её в другую переменную с помощью функции JSON.parse().</p><h4>XML</h4><p>XML-файлы могут быть большими, с множеством вложенных тегов: чтобы распарсить такие данные, нужно много времени и ресурсов.</p><p>Пример на JavaScript:</p><p>Что здесь происходит:</p><ol><li>Создаем строку, которую хотим превратить в XML. Она содержит элемент  с вложенными элементами;</li><li>Используем объект DOMParser. Он превращает текстовые строки в XML-документы;</li><li>Метод parseFromString() выполняет это преобразование. После этого js работает с переменной через DOM-методы;</li><li>Используем метод getElementsByTagName(), чтобы получить значение элемента . Он возвращает массив элементов с указанным тегом;</li><li>Указываем индекс [0] для выбора первого элемента, а затем получаем его текстовое содержимое через childNodes[0].nodeValue.</li></ol><p>Разница очевидна:</p><ul><li>Для JSON мы можем сразу преобразовать строку в объект с помощью JSON.parse();</li><li>Для XML требуется больше шагов: разбор строки в документ и использование методов DOM для извлечения данных.</li></ul><h3>Читаемость</h3><h4>JSON</h4><p>JSON легко читать, потому что его структура похожа на JavaScript-объект. Он не требует лишних символов и тегов, поэтому визуально лаконичен и прост.</p><h4>XML</h4><p>XML выглядит сложнее. Теги для описания структуры делают документ более громоздким и менее читаемым. Особенно если в файле много вложенных элементов.</p><figure><img src="https://media.tproger.ru/user-uploads/105990/2025-01-10/4c30c1ee-6657-4830-b3df-aa0c8073fd9d.png" alt="" /></figure><h2>Создаём и парсим JSON</h2><p>JSON-документы можно создать вручную. Главное, надо соблюдать синтаксические правила:</p><ul><li>Использовать двойные кавычки для строк;</li><li>Разделять ключи и значения двоеточием, как и в JS-объектах;</li><li>Ставить запятые между ключами.</li></ul><p>А можно использовать <a href="https://www.convertsimple.com/convert-javascript-to-json/">конвертер</a>. Вы ему JS-объект, а он из него  ––  JSON.</p><p>В разных языках  –– разные инструменты для работы с JSON. Разработчики используют встроенные средства языков программирования или сторонние библиотеки:</p><ul><li><b>JavaScript</b>: Методы JSON.stringify() и JSON.parse();</li><li><b>Python</b>: Модуль json для сериализации и десериализации;</li><li><b>PHP</b>: Функции json_encode() и json_decode();</li><li><b>Node.js</b>: Встроенные методы для работы с JSON в модуле fs.</li></ul><h3>Работа с JSON в Python</h3><p>Что тут происходит:</p><ol><li><b>Импортируем json</b>. Это встроенная библиотека Python. Она работает с данными в формате JSON;</li><li><b>Создаём данные для сериализации </b>–– Python-словарь data, который содержит пары ключ-значение. Не пугайтесь нового слова «сериализация». Это всё то же преобразование одного формата в другой;</li><li><b>Используем </b>метод json.dumps() для преобразования Python-объекта в строку в формате JSON. Результатом будет строка, которую можно передать серверу, сохранить в файл или обработать в другой программе;</li><li><b>Десериализириуем данные  </b>с помощью метода json.loads(). Он преобразует JSON-строку обратно в Python-объект;</li><li><b>Выводим десериализованные данные </b>в консоль. В данном случае это словарь parsed_data, который будет точно таким же, как и исходный словарь data.</li></ol><h3>Работа с JavaScript</h3><p>Методы JSON.stringify() и JSON.parse() позволяют преобразовывать данные из объекта в JSON-строку и обратно.</p><p>Пример:</p><p>Метод fetch() используется для отправки HTTP-запросов с JSON-данными:</p><p>Что здесь происходит:</p><ul><li>Мы указываем, куда нужно сделать запрос и что нужно передать серверу. Посылка –– это значение в ключе body. Если не обернуть объект с данными в JSON.stringify(), то запрос упадёт. Так как этот метод превращает JS-объект в JSON-строку. Сервер умеет читать JSON, но не умеет работать с JS-объектами;</li><li>На предпоследней строке мы получаем ответ от сервера. А затем обязательно переводим его обратно, в удобоваримый для JS код.</li></ul><h2>Работа с JSON на сервере</h2><p>JSON незаменим в бэкэнде. Сервер присылает данные через REST API в  JSON. Поэтому в предыдущем блоке мы использовали на ответе метод .json(). Без него данные останутся обычной JSON-строкой.</p><p>Разберём примеры на разных языках.</p><h3>Пример реализации REST API на Node.js</h3><p>Здесь мы создаём приложение на основе Express. Оно слушает POST-запросы на маршруте /data и возвращает ответ в формате JSON с сообщением о том, что данные получены.</p><p>Для работы с JSON на сервере используем встроенную функцию express.json(), которая парсит данные, и метод res.json(), чтобы отправить ответ в формате JSON.</p><h3>Пример работы JSON в python-фреймворке Flask</h3><p>Что делаем:</p><ol><li><b>Импортируем необходимые библиотеки</b>: Flask, request, jsonify для создания нашего веб-приложения и обработки JSON-строк;</li><li><b>Создаем приложение </b>через экземпляр Flask;</li><li><b>Определяем маршрут  </b>/data и указываем, что функция handle_data() будет обрабатывать по этому маршруту POST-запросы;</li><li><b>Извлекаем JSON-данные из запроса </b>внутри функции. Получаем и преобразуем данные из тела запроса в JSON с помощью request.get_json();</li><li><b>Отправляем JSON-ответ</b>. Возвращаем клиенту JSON-ответ, содержащий полученные данные. Либо, если переменная data пуста, отправляем ошибку и 400 статус. И обязательно отлавливаем ошибки с помощью try-except;</li><li><b>Запускаем приложение</b>. Приложение запускается на сервере и слушает входящие запросы.</li></ol><h2>Что не так с JSON</h2><p>За простотой JSON скрываются ловушки, попадать в которые лучше не надо. Малейшая ошибка — и данные становятся нечитаемыми, а приложение падает. Разберём эти ловушки:</p><h3>Неправильная структура</h3><p>Забудете закрыть скобку, добавите не ту кавычку или поставите запятую в конце массива — и всё. Браузер или сервер выдадут ошибку. А если JSON создается динамически, найти проблему будет сложно.</p><p>Пример ошибки:</p><p>В этом примере после крайнего элемента массива стоит лишняя запятая. Исправленный вариант:</p><h3>Большие объемы данных</h3><p>JSON не предназначен для хранения огромных массивов данных. Обрабатывать большие файлы в браузере –– опасно для производительности. Ваш сайт может начать тормозить или вовсе зависнуть.</p><h3>Неэкранированные символы</h3><p>Забыли экранировать кавычку в строке? Получите ошибку. JSON требует строго соблюдать правила синтаксиса, иначе парсинг провалится.</p><p>Пример ошибки:</p><p>Здесь у нас дублирование. Нельзя помещать двойные кавычки внутрь таких же двойных кавычек:</p><p>Исправленный вариант:</p><h3>Уязвимая безопасность</h3><p><b></b> Если данные не проверяются, JSON может стать источником XSS-атак или привести к раскрытию конфиденциальной информации.</p><p>Пример ошибки:</p><p>Пользователь может отправить через поле ввода вредоносные данные. И получится вот такая история:</p><p>Решение: обязательно проверяйте входящие данные. Можно заменить опасные символы безопасными:</p><p>И уже эту строку отправить на сервер.</p><h2>Как избежать проблем с JSON?</h2><p>Чтобы работать с JSON безопасно и эффективно:</p><ul><li><b>Используйте валидаторы</b>. Перед передачей данных обязательно проверяйте JSON на синтаксические ошибки;</li><li><b>Сжимайте данные</b>. Уменьшайте размер JSON, удаляя лишние пробелы и символы, чтобы оптимизировать передачу и обработку;</li><li><b>Не доверяйте входящим данным</b>. Проверяйте и фильтруйте всё, что приходит от клиента или сторонних API;</li><li><b>Ограничивайте глубину вложенности</b>. Глубокая структура JSON может перегрузить обработчик и вызвать зависание.</li></ul><h3>Валидаторы JSON</h3><p>Перед отправкой проверьте свой JSON. Для этого можно использовать онлайн-валидаторы. Например, <a href="https://jsonlint.com/"> </a><a href="https://jsonlint.com">https://jsonlint.com</a>. Как он работает: вы прописываете вашу строку, а валидатор проверяет, нет ли в ней ошибок.</p><h3>Минификация JSON</h3><p>Для уменьшения размера JSON-строку можно минифицировать. Удалить пробелы и переносы строк. Пример минификации в Python:</p><h3>Обработка ошибок при работе с JSON</h3><p>Ошибки часто возникают из-за неправильного формата данных. Всех опасных мест не избежать. Но можно подстелить соломку.</p><p>Вот так обрабатываются возможные ошибки с JSON:</p><p>Что тут происходит:</p><ol><li><b>Получаем данные из localStorage</b>: Используется метод localStorage.getItem(), чтобы извлечь данные по указанному ключу key;</li><li><b>Проверяем на наличие данных</b>: Если данные отсутствуют –– null, выбрасывается ошибка с помощью throw;</li><li><b>Парсим данные</b>: Если данные есть, они парсятся через JSON.parse(). И на выходе получается JS-объект;</li><li><b>Обрабатываем ошибки</b>: В блоке catch ловятся все ошибки. Затем их можно обработать и отобразить пользователю в интерфейсе.</li></ol><p>Теперь даже если в LocalStorage не лежат нужные данные, приложение не упадёт.</p><p>В веб разработке без JSON никуда. Он лёгкий и гибкий. Но чтобы использовать эти преимущества, нужно научиться с ним взаимодействовать.</p><p>Для этого просто следуйте нашим правилам. Проверяйте свои JSON-строки, обрабатывайте ошибки и тестируйте приложение на корнер-кейсы. Тогда ваши сайты и приложения будут в безопасности. 🙂</p>]]></content:encoded>
    </item>
    <item>
      <title>HTTP-запросы: GET, POST и другие</title>
      <link>https://tproger.ru/articles/http-zaprosy--get--post-i-drugie</link>
      <comments>https://tproger.ru/articles/http-zaprosy--get--post-i-drugie?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/http-zaprosy--get--post-i-drugie</guid>
      <description><![CDATA[<p>Что такое HTTP-запросы. Показываем основные виды запросов HTTP. Рассматриваем пошаговую инструкцию по использованию ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/http-zaprosy--get--post-i-drugie">HTTP-запросы: GET, POST и другие</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[XML]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 14 Jan 2025 10:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>HTTP-запросы — основа взаимодействия между клиентской и серверной частями веб-приложений. Методы GET и POST используются для передачи данных и выполнения операций на сервере.</p><p><i>В статье детально разобрали подходы к реализации HTTP-запросов на практике.</i></p><h2>Общие понятия HTTP-запросов</h2><p><b>HTTP (HyperText Transfer Protocol)</b> определяет правила обмена данными между клиентом и сервером. Клиент, браузер или приложение отправляют запрос серверу, который обрабатывает его и возвращает ответ.</p><p>HTTP-запрос состоит из нескольких компонентов:</p><h3>Метод</h3><p>Обозначает действие, которое клиент хочет выполнить. Например, метод GET используется для запроса данных с сервера, а POST — для отправки данных на сервер.</p><h3>URL</h3><p>Определяет адрес ресурса, к которому обращается клиент. Он включает в себя доменное имя и путь к конкретному ресурсу на сервере.</p><h3>Заголовки</h3><p>Содержат дополнительную информацию о запросе. Могут включать данные о типе контента, формате принятого ответа и других параметрах, необходимых для обработки запроса.</p><h3>Тело</h3><p>Используется при отправке сведений на сервер. В методе POST тело содержит данные формы или другие данные, которые необходимо передать. При методе GET тело обычно отсутствует, так как данные передаются в URL.</p><h3>Статус-коды ответа</h3><p>После обработки запроса сервер возвращает ответ со статус-кодом. Он сообщает клиенту о результате обработки запроса.</p><p>Категории статус-кодов:</p><ul><li><b>Информационные 1xx</b>: указывают, что запрос принят и продолжается обработка;</li><li><b>Успешно 2xx</b>: подтверждают успешную обработку запроса;</li><li><b>Перенаправления 3xx</b>: информируют о совершении редиректа;</li><li><b>Ошибки клиента</b> <b>4xx</b>: указывают на проблемы со стороны клиента;</li><li><b>Ошибки сервера 5xx</b>: указывают на проблемы со стороны сервера.</li></ul><p>Статус-коды помогают клиенту понять результат запроса и, при необходимости, предпринять действия — обновить страницу, согласиться на перенаправление и т. д.</p><h2>Основные методы HTTP-запросов</h2><p>GET и POST используются для получения и отправки данных соответственно. Каждый метод имеет свои особенности.</p><h3>GET — получение данных</h3><p>Метод предназначен для запроса данных с сервера. Он используется, когда клиенту необходимо получить ресурс без внесения изменений.</p><p>При использовании GET-запроса параметры передаются через строку запроса в URL: можно закэшировать запросы и делать их повторно без отправки данных.</p><p>Повторное выполнение запроса не изменит состояние сервера. Это важно для безопасности и эффективности в сетевых операциях. Например, при обновлении страницы браузер отправляет GET-запрос, чтобы загрузить актуальное содержимое.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-12-28/1d779461-4482-4bb0-8632-a146d25087a4.jpg" alt="" /><figcaption>Пример GET-запроса</figcaption></figure><p>Ограничения метода GET связаны с объемом передаваемых данных. Поскольку параметры передаются в URL, есть ограничение на длину строки. Поэтому метод GET не подходит для передачи больших объемов данных или конфиденциальной информации, т. к. содержимое отображается в адресной строке.</p><h3>POST — отправка данных</h3><p>Метод используется для отправки данных на сервер, чтобы создать или обновить ресурсы. В отличие от GET, данные передаются в теле запроса. Можно передавать большие объемы информации и делать это более безопасно, потому что данные не отображаются в URL.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-12-28/67e96f9b-1ea9-46f1-a0d3-a123753e6bb1.jpg" alt="" /><figcaption>Пример POST-запроса</figcaption></figure><p>Повторная отправка POST-запроса может привести к созданию нескольких одинаковых ресурсов или повторному выполнению операции. Обрабатывать такие запросы нужно с особой осторожностью.</p><p>POST используется при отправке форм на веб-сайтах, загрузке файлов, в API-запросах. Он поддерживает передачу сложных структур данных, включая JSON или XML.</p><h2>Другие методы HTTP-запросов</h2><p>Помимо GET и POST есть дополнительные методы для гибкого управления ресурсами. К ним относятся PUT, DELETE, PATCH, HEAD и OPTIONS.</p><h3>PUT — обновление данных</h3><p>Применяется для создания нового ресурса или полного обновления существующего на сервере по указанному URI.</p><p>Клиент отправляет запрос с полным представлением ресурса, которое сервер должен сохранить. Если ресурс по указанному URI не существует, сервер создаст его.</p><h3>DELETE — удаление данных</h3><p>Используется для удаления ресурса по URI. При успешной обработке запроса веб-страница становится недоступной.</p><p>Как и PUT, метод DELETE идемпотентный: повторные запросы удаления не приведут к ошибке, хотя сервер может сообщить, что ресурс уже недоступен.</p><h3>PATCH — частичное обновление</h3><p>Предназначен для частичного изменения ресурса.</p><p>Вместо отправки полного представления, как в случае с PUT, клиент отправляет только те данные, которые необходимо обновить.</p><h3>HEAD — запрос заголовков без тела</h3><p>Необходим для получения метаданных без передачи содержимого.</p><p>Применяется для проверки ресурса, определения его размера или времени последнего изменения без необходимости загружать весь ресурс.</p><h3>OPTIONS — получение информации о поддерживаемых методах</h3><p>Используется для выявления возможностей сервера или проверки поддерживаемых методов.</p><p>Клиент может узнать, какие HTTP-методы доступны для данного URI, а также получить информацию о поддерживаемых заголовках и других параметрах.</p><h3>Различия между GET и POST</h3><p>Несмотря на то, что оба метода используются для отправки запросов, они имеют существенные различия в способах передачи данных, кэшировании и безопасности.</p><h3>URL vs. тело запроса</h3><p>GET передает данные через строку URL, добавляя параметры запроса после знака вопроса “?”. Параметры представляют собой пары «ключ=значение», разделенные амперсандом “&amp;”.</p><figure><img src="https://media.tproger.ru/user-uploads/105601/2024-12-28/c0b6b2a6-a1e5-409e-bf4a-11c6d049d370.jpg" alt="" /><figcaption>Пример URL GET-запроса</figcaption></figure><p>POST передает данные в теле запроса, отделенном от заголовков пустой строкой. В ней можно передавать больше данных и использовать форматы типа application/x-www-form-urlencoded или multipart/form-data.</p><h3>Кэширование и безопасность</h3><p>GET подвержен кэшированию браузерами и промежуточными серверами. Он снижает нагрузку на сервер и ускоряет загрузку страниц, повторно используя ранее полученные ответы. Однако кэширование становится причиной тогда, когда клиент получает устаревшие данные, если ресурс на сервере уже был обновлен.</p><p>POST обычно не кэшируется, поскольку предполагается, что каждый запрос может изменять состояние сервера или создавать новые данные. Браузеры и прокси-серверы по умолчанию не сохраняют ответы на POST-запросы в кэше.</p><p>С точки зрения безопасности, GET менее предпочтителен для передачи конфиденциальной информации. Данные, переданные через URL, открыты для посторонних лиц, сохраняются в истории браузера и логах сервера.</p><p>POST дает большую конфиденциальность, так как данные передаются в теле запроса и не отображаются в адресной строке.</p><p>Сами по себе методы GET и POST не спасают сообщение от кражи. При передаче чувствительной информации необходимо использовать соединение HTTPS, которое шифрует данные и защищает от перехвата злоумышленниками.</p><p>Оба метода уязвимы к атаке CSRF. Поскольку GET-запросы можно совершать простым переходом по ссылке или загрузкой изображения, атаки через GET встречаются чаще. Для защиты от CSRF рекомендуется использовать уникальные токены и проверять происхождение запросов на сервере.</p><h2>Работа с HTTP-запросами на практике</h2><p>Рассмотрим реализацию HTTP-запросов в JavaScript с использованием fetch и axios, тестирование запросов через Postman и применение HTTP в бекенд-разработке на примерах Node.js, Python и PHP.</p><h3>JavaScript (fetch, axios)</h3><p>Fetch — встроенная функция JS. Она отправляет HTTP-запросы и обрабатывает ответы.</p><p>Пример выполнения GET-запроса:</p><p>Здесь выполняется запрос к URL, затем ответ преобразуется в формат JSON.</p><p>Для отправки POST-запроса с передачей данных в теле используется следующий синтаксис:</p><p>В теле запроса передаются данные в формате JSON, а заголовок Content-Type сообщает серверу о типе данных.</p><h3>Использование axios</h3><p>Axios — популярная библиотека для выполнения HTTP-запросов, поддерживающая как браузерную, так и серверную среду.</p><p>Пример выполнения GET-запроса:</p><p>Для отправки POST-запроса с данными:</p><p>Axios автоматически преобразует объекты JavaScript в JSON и устанавливает заголовки, что упрощает работу с запросами.</p><h3>Тестирование через Postman</h3><p><a href="https://tproger.ru/articles/gajd-po-rabote-s-postman">Postman</a> — инструмент для разработки и тестирования API. Для его использования необходимо установить приложение, создать новый запрос, указать метод и URL.</p><p>При тестировании GET-запроса в Postman вводится URL и при необходимости добавляются параметры. После отправки запроса интерфейс показывает заголовки и тело ответа, что помогает в отладке и анализе данных.</p><p>Для POST-запросов в Postman можно указать тело запроса в форматах form-data, x-www-form-urlencoded, raw и других. Это позволяет отправлять сложные структуры данных и файлы, имитируя работу реальных приложений.</p><p>Postman также поддерживает сохранение коллекций запросов, управление переменными среды и написание скриптов для автоматизации тестирования.</p><h2>Использование HTTP в backend</h2><p>В Node.js для создания веб-серверов и обработки HTTP-запросов обычно используется фреймворк Express:</p><p>Этот сервер обрабатывает GET и POST-запросы по пути /users. Можно получать список пользователей и создавать новых.</p><h3>Python</h3><p>В Python популярным фреймворком для веб-разработки выступает Flask:</p><p>С помощью Flask создается сервер, обрабатывающий HTTP-запросы и возвращающий данные в формате JSON.</p><h3>PHP</h3><p>В PHP с фреймворком Laravel можно реализовать обработку HTTP-запросов следующим образом:</p><p>Работа с HTTP в backend-приложениях состоит не только в приеме запросов, но и в отправке их к другим сервисам. В языках для веб-разработки есть библиотеки для выполнения исходящих HTTP-запросов:</p><ul><li>axios для Node.js,</li><li>requests для Python,</li><li>Guzzle для PHP.</li></ul><p><b>Теперь ваша очередь! Попробуйте применить полученные знания на практике. Создайте простое приложение, использующее HTTP-запросы, или протестируйте API с помощью Postman.</b></p>]]></content:encoded>
    </item>
    <item>
      <title>Работа с JSON и XML в Python: парсинг, генерация и валидация</title>
      <link>https://tproger.ru/articles/rabota-s-json-i-xml-v-python--parsing--generaciya-i-validaciya-251730</link>
      <comments>https://tproger.ru/articles/rabota-s-json-i-xml-v-python--parsing--generaciya-i-validaciya-251730?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Владислав Устинов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/rabota-s-json-i-xml-v-python--parsing--generaciya-i-validaciya-251730</guid>
      <description><![CDATA[<p>Работа с JSON и XML в Python. Показываем варианты использования. Рассматриваем пошаговую инструкцию и основные способы работы с JSON и XML в Python ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/rabota-s-json-i-xml-v-python--parsing--generaciya-i-validaciya-251730">Работа с JSON и XML в Python: парсинг, генерация и валидация</a>»</p>]]></description>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[XML]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 05 Sep 2024 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Что такое JSON и XML</h2><p>JSON и XML — это форматы для хранения информации. Их используют для обмена данными в веб-разработке между клиентом и сервером, поэтому они часто встречаются при работе с API.</p><p>Если вы хотите научиться работать с этими форматами и эффективно обрабатывать данные, рекомендуем пройти <a href="https://tproger.ru/courses/onlajn-kurs--python-razrabotchik--ot-yandeks-praktikuma?erid=LjN8K7SdF">курс по Python</a>.</p><h3>JSON (JavaScript Object Notation)</h3><p>JSON основан на JavaScript, но его понимают и другие языки программирования. Данный формат проще читать, он меньше весит, быстрее передается и совместим с разными платформами.</p><p>JSON состоит из объектов, ключей и значений. При этом файл сам является основным объектом, внутри которого могут быть другие объекты.</p><p>Перед объектом ставятся фигурные скобки {}. Далее идет имя ключа в кавычках “”, двоеточие и значение.</p><p>Значения могут содержать числа, строки, массивы. Также бывают пустые и булевые значения.</p><p>Пример синтаксиса  JSON:</p><h3>XML (eXtensible Markup Language)</h3><p>Стандартный XML уступает JSON в читабельности, скорости передачи и кроссплатформенной совместимости. Но он поддерживает больше типов данных, поэтому хорошо подходит для сложных строгих структур.</p><p>Его код начинается с пролога. Это запись, в которой мы указываем версию и кодировку:</p><p>Далее идет структура из элементов, внутри которых хранится наша информация с разными типами данных. Этот принцип напоминает устройство HTM кода.</p><p>Элементы состоят из тегов — они бывают открывающими и закрывающими. Открывающий тег состоит из знака меньше “&lt;”, имени и знака больше “&gt;”.</p><p>Аналогично с закрывающим тегом. Но к нему добавляем слэш “/” после знака меньше “&lt;”. Вот так:</p><p><br />Мы можем разместить между тегами другие элементы, либо такие типы данных как текст, числа, булевые значения, url-адреса, пути к аудио, фото, видео-файлам и документам.</p><p>Для открывающих тегов есть возможность прописывать атрибуты — они позволяют указывать дополнительную информацию для элементов. Делается это вот так:</p><p><br />Здесь мы написали атрибут gender со значением “female”</p><p>При написании кода мы должны заключить все элементы в один главный элемент. Его называют корневым:</p><p>В этом примере &lt;person&gt; корневой элемент.</p><h2>Библиотеки python для работы с JSON и XML</h2><p>Существует много библиотек для работы с JSON и XML. Ниже перечислены основные из них.</p><h3>Библиотеки для работы с JSON</h3><h4>json</h4><ul><li>Не нужно устанавливать, встроена по умолчанию.</li><li>Может парсить из строк и файлов.</li><li>Способна конвертировать объекты в JSON-строки.</li></ul><h4>SimpleJSON</h4><ul><li>Может парсить из строк и файлов.</li><li>Способна создавать JSON-строки из объектов.</li><li>Предоставляет более гибкие опции кодирования и декодирования по сравнению с встроенной json.</li></ul><h4>ujson</h4><ul><li>Может парсить из строк и файлов.</li><li>Способна конвертировать объекты в JSON-строки.</li><li>Отличается высокой скоростью работы благодаря реализации на C.</li></ul><h4>orjson</h4><ul><li>Может парсить из строк и файлов.</li><li>Способна создавать JSON-строки из объектов.</li><li>Производительная благодаря реализации на Rust.</li><li>Поддерживает только Python версии 3.6 и выше.<br /></li></ul><h4>ijson</h4><ul><li>Может парсить из строк и файлов.</li><li>Экономит память за счет потоковой обработки данных.</li></ul><h4>jsonschema</h4><ul><li>Специализируется на валидации.</li><li>Поддерживает различные версии спецификации JSON Schema.</li></ul><h4>cerberus</h4><ul><li>Специализируется на валидации.</li><li>Поддерживает валидацию сложных вложенных структур и поддерживает пользовательские правила валидации.</li></ul><h3>Библиотеки для работы с XML</h3><h4>xml.etree.ElementTree</h4><ul><li>Встроена по умолчанию.</li><li>Может парсить из строки и файлов.</li><li>Способна создавать и редактировать XML-строки и файлы.</li></ul><h4>lxml</h4><ul><li>Может парсить из строки и файлов.</li><li>Способна создавать и редактировать XML-строки и файлы.</li><li>Поддерживает валидацию.</li><li>Обеспечивает высокую производительность благодаря реализации на C.</li></ul><h4>xml.dom.minidom</h4><ul><li>Встроена по умолчанию.</li><li>Может парсить из строки и файлов.</li><li>Способна создавать и редактировать XML-строки и файлы.</li><li>Предоставляет DOM-интерфейс для работы с XML.</li></ul><h4>xml.sax</h4><ul><li>Встроена по умолчанию.</li><li>Может парсить из строки и файлов.</li><li>Позволяет создавать собственные обработчики для XML-элементов.</li><li>Эффективна для обработки больших XML-файлов, так как не загружает весь документ в память.</li></ul><h4>xmlschema</h4><ul><li>Может парсить из строки и файлов.</li><li>Выполняет валидацию XML-документов.</li><li>Способна генерировать объекты из XML-данных.</li><li>Позволяет создавать XML-схемы.</li></ul><h4>xmltodict</h4><ul><li>Может парсить из строки и файлов.</li><li>Преобразует XML в словари.</li><li>Способна создавать XML-строки из словарей.</li></ul><h4>BeautifulSoup</h4><ul><li>Может парсить XML и HTML из строки и файлов.</li></ul><h2>Парсинг данных из JSON и XML</h2><p>Парсинг — это извлечение данных для последующей обработки и анализа. Давайте представим, что мы ищем новую работу. Для этого ходим по сайтам IT-агентств и сохраняем их контакты себе в таблицу. Это простейший пример парсинга.</p><h3>Примеры извлечения JSON данных в разных библиотеках</h3><p>Предположим, что нам надо спарсить вот этот код и вытащить из него значение "occupation".</p><h4>json</h4><p>Если данные уже находятся у нас в виде строки, то мы можем вызвать функцию json.loads() для извлечения:</p><p>Здесь мы принимаем JSON и записываем его в словарь Python. Далее выводим значение ключа "occupation".</p><h4>simplejson</h4><p>Представим, что у нас не строка, а файл json_string.json:</p><p>Мы открываем файл json_string.json и называем его f. Далее читаем JSON из файла f с помощью json.load(f) и превращаем в словарь data. В конце возвращаем значение, ключа "occupation".</p><h4>ujson</h4><p>Здесь происходит то же, что и в примере выше: ujson.load(f) читает JSON из файла f и преобразует его в словарь Python, который сохраняется в data.</p><h4>orjson</h4><p>Если мы хотим спарсить данные по url, то понадобиться библиотека requests:</p><p>Функция orjson.loads(response.content) парсит по url JSON, и преобразует их в словарь data, после чего мы можем обращаться к значениям этого словаря.</p><h3>Примеры извлечения XML данных в разных библиотеках</h3><p>Представим, что нам нужно спарсить значение из тега name в этом коде:</p><h4>xml.etree.ElementTree</h4><p>При помощи ET.fromstring(xml_string) мы извлекаем XML из строки и создаем объект root — он представляет корневой элемент. Далее при помощи индекса root[0] обращаемся к первому дочернему элементу &lt;name&gt; и выводим его значение.</p><h4>lxml</h4><p>etree.fromstring(xml_string) извлекает данные из xml_string в объект root. Как и в примере выше, мы можем обращаться к элементам и атрибутам через root и его дочерние элементы при помощи индекса, например, root[0].</p><h4>xml.dom.minidom</h4><p>Здесь minidom.parseString(xml_string) извлекает XML из строки и создает объект dom. Далее команда находит первый элемент с тегом &lt;name&gt;, записывает его в переменную name_element и выводит значение.</p><h4>xmltodict</h4><p>Библиотека анализирует XML структуру и создает словарь, где ключи — это теги XML, а значения — дочерние элементы. Мы обращаемся к элементу &lt;name&gt; и выводим его.</p><h4>BeautifulSoup</h4><p>При помощи BeautifulSoup(xml_string, 'xml') мы парсим из строки xml_string и указываем, что нам нужен формат xml. Далее сохраняем данные в объект soup, находим элемент с тегом &lt;name&gt; и выводим его значение.</p><h2>Генерация данных JSON и XML в Python</h2><h3>Примеры генерации JSON в разных библиотеках</h3><p>Библиотеки python используют схожий подход для генерации JSON. Делается это при помощи функции dumps(). Вот несколько примеров:</p><h4>json</h4><h4>SimpleJSON</h4><h4>ujson</h4><h4>orjson</h4><p>Мы создали словарь data с данными и преобразовали их в JSON.</p><p>dumps() конвертирует объект в JSON. Но если необходимо записать данные в файл, то стоит воспользоваться функцией dump().</p><h3>Примеры генерации XML в разных библиотеках</h3><p>Если мы хотим записать XML файл, то нам понадобятся следующие функции:</p><ul><li>ET.Element() — создает корневой элемент</li><li>ET.SubElement() — создает дочерние элементы</li><li>ET.ElementTree() — сохраняет дерево из элементов</li><li>tree.write() — записывает xml данные в файл</li></ul><h4>xml.etree.ElementTree</h4><p>В этом примере мы создаем корневой элемент person, добавляем дочерние элементы name и age, прописываем их значения, а затем сохраняем XML дерево в файл person.xml.</p><h4>lxml</h4><p>Здесь мы тоже создаем корневой элемент, добавляем дочерние элементы, формируем дерево и записываем в файл.</p><h4>xmltodict</h4><p>А это пример создания XML из словаря. Библиотека анализирует структуру словаря и создает XML документ. Ключи словаря становятся тегами, а значения — текстовым содержимым или вложенными элементами.</p><h2>Примеры валидации данных в JSON и XML</h2><p>Валидация — это проверка кода на соответствие определенным правилам. Например, мы создаем форму для регистрации, где будет пароль только из латинских знаков. Следовательно, нам нужно проверять символы, которые будут вводить пользователи при регистрации.</p><h3>Примеры валидации JSON в jsonschema и Cerberus</h3><h4>jsonschema</h4><p>Мы прописываем схему "schema", которая определяет наши правила. Данные должны быть объектом с ключами "name" и "age". Ключ "name" принимает только строки в качестве значений, а "age" только числа".</p><p>Далее мы определяем два набора данных. Один валидный, другой нет.</p><p>Проверяем, соответствуют ли valid_data и invalid_data заданной схеме. Выводим сообщение о валидности/невалидности данных.</p><h4>Cerberus</h4><p>Задаем схему с правилами. Указываем, что у нас обязательно должен быть ключ "name", который принимает строку. Его наличие обязательно благодаря команде "required": True. Ключ "age" принимает только числа.</p><p>Здесь мы передаем нашу схему в объект validator и определяем два набора данных. Первый — валидный, второй с ошибкой. В нем отсутствует "name".</p><p>Проверяем корректность кода и выводим сообщения.</p><h3>Примеры валидации XML в lxml и xmlschema</h3><h4>lxml</h4><p>Это XML-данные, которые мы будем проверять на ошибки.</p><p>А это наша схема с правилами. Давайте разберем ее более детально.</p><p>&lt;xs:schema xmlns:xs="<a href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema</a>"&gt;  — означает, что этот код является схемой и ссылается на определенный стандарт.</p><p>&lt;xs:element name="person"&gt; — здесь мы говорим, что элемент с тегом &lt;person&gt; должен быть корневым в проверяемом XML коде.</p><p>&lt;xs:complexType&gt; и &lt;xs:sequence&gt; означают, что у нас несколько элементов и они должны идти в определенном порядке. Далее мы указываем наши элементы и их тип.</p><p>xml_data и xsd_date являются строками. Чтобы выполнить валидацию, их необходимо преобразовать в объект python. Делаем это при помощи метода etree.fromstring(). Теперь у нас есть объекты xml_doc и xsd_doc. В них хранится информация о нашем xml коде и схеме.</p><p>При помощи xsd_doc создаем новый объект схемы.</p><p>Валидируем xml_doc и выводим сообщение о результате.</p><h4>xmlschema</h4><p>Рассмотрим вариант, при котором наша схема расположена в отдельном файле.</p><p>Импортируем библиотеку и указываем файл с правилами.</p><p>Определяем два набора данных для проверки. Один валидный, другой нет.</p><p>Проверяем валидность данных в функции validate() и выводим сообщения о результате валидации при помощи условной конструкции try: except.</p><h2>Работа с API JSON и XML</h2><p>Теперь рассмотрим несколько простых примеров передачи данных по API.</p><h3>Получение данных из API с использованием JSON</h3><p>Импортируем библиотеку для работы с API requests и записываем адрес в переменную url.</p><p>Отправляем запрос на наш API и проверяем  ответ. Если  он успешный, то записываем его в словарь data.</p><p>Выводим значения элементов name и email. Если их нет, то код покажет ошибку.</p><h3>Отправка данных в API с использованием JSON</h3><p>Импортируем requests, записываем адрес API в url и определяем данные, которые надо отправить.</p><p>Отправляем POST-запрос с данными на сервер.</p><p>Если всё работает, то получаем статус-код 201 и выводим сообщение об успехе. Если данные не отправились, то выводим сообщение с ошибкой.</p><h3>Получение данных из API с использованием XML</h3><p>Импортируем библиотеки, записываем API-адрес в переменную url и отправляем GET-запрос.</p><p>Если запрос отправлен успешно, обращаемся к элементу name и выводим его значение.</p><h3>Отправка данных в API с использованием XML</h3><p>Всё по классике. Импортируем requests и xmltodict. Записываем API в переменную url. Создаем словарь с данными для отправки.</p><p>Создаем словарь headers , в который записываем заголовок нашего запроса. Отправляем его.</p><p>Проверяем код ответа. Если все отправилось, то выводим соответствующее сообщение. Если нет — выводим ошибку.</p><h2>Конвертация JSON и XML</h2><h3>Пример конвертации JSON в XML</h3><p>Импортируем библиотеку и прописываем JSON, который будем конвертировать.</p><p>Конвертируем JSON в XML, сохраняем данные в xml_data и выводим результат.</p><h3>Пример конвертации XML в JSON</h3><p>Импортируем библиотеки и определяем XML-данные.</p><p>Преобразуем данные в словарь json_data.</p><p>Конвертируем словарь в JSON и выводим его.</p><h2>Оптимизация работы с JSON и XML</h2><p>Встроенные библиотеки Python, такие как json и xml.etree.ElementTree, обычно являются хорошим выбором для простых задач. Однако, для больших объемов или высокопроизводительных приложений они не подходят.</p><h3>Производительность</h3><p>С точки зрения производительности следует рассмотреть библиотеки: orjson и lxml.</p><p><b>Для JSON</b></p><p>orjson: Быстрая библиотека, написанная на Rust. Но поддерживает версию python от 3.6.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2024-09-03/33c7d46e-10ea-4cc4-8385-29423a9b3a67.png" alt="производительность Python библиотек для работы с JSON при сериализации" /><figcaption>Производительность Python библиотек для работы с JSON при сериализации</figcaption></figure><p>Эта диаграмма показывает скорость кодирования JSON данных в объект python на примере работы с API. Как видно, orjson справляется с задачей быстрее всех.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2024-09-03/5a337a02-9400-40d0-addc-af3ab74229a8.png" alt="производительность Python библиотек для работы с JSON при десериализации" /><figcaption>Производительность Python библиотек для работы с JSON при десериализации</figcaption></figure><p>А здесь мы видим обратный процесс — преобразование Python в JSON-данные.</p><p>Эти тесты могут быть предвзятыми, поскольку проводились самими <a href="https://github.com/ijl/orjson?tab=readme-ov-file#performance">разработчиками</a> orjson. Но <a href="https://dev.to/dollardhingra/benchmarking-python-json-serializers-json-vs-ujson-vs-orjson-1o16">другие </a>эксперименты также подтверждают превосходство orjson.</p><p><b>Для XML</b></p><p>lxml: основана на C-библиотеках libxml2 и libxslt, обычно быстрее, чем xml.etree.ElementTree, особенно для больших XML-документов и сложных операций.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2024-09-03/04f9a769-3f17-40fc-97fb-6afa5bbdb503.png" alt="скорость обработки XML данных разными библиотеками при применении в Питоне" /><figcaption>скорость обработки XML данных разными библиотеками</figcaption></figure><p>На этом скриншоте изображены итоги <a href="https://proxiesapi.com/articles/what-is-the-fastest-xml-parser-in-python">теста </a>Python-библиотек. Они анализировали XML-файл весом в 95 мегабайт, и lxml показала себя здесь лучшим образом.</p><h3>Работа с памятью</h3><p>Для работы с памятью лучше использовать библиотеки, которые поддерживают потоковую загрузку и обработку данных.</p><p>Для JSON:</p><ul><li>ijson: Эта библиотека позволяет итеративно обрабатывать данные, не загружая весь документ.</li></ul><p>Для XML:</p><ul><li>xml.sax: обрабатывает данные по частям, не загружая всё в память.</li><li>lxml: также обрабатывает большие объемы информации по кусочкам.</li></ul><p><i>Если вы пользуетесь другими библиотеками или фичами — рассказывайте о них в комментариях. </i></p>]]></content:encoded>
    </item>
    <item>
      <title>Нюансы XML и бинарной сериализации в .Net</title>
      <link>https://tproger.ru/articles/xml-i-binarnaya-serializaciya-v--net</link>
      <comments>https://tproger.ru/articles/xml-i-binarnaya-serializaciya-v--net?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Azizkhon Ishankhonov]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/xml-i-binarnaya-serializaciya-v--net</guid>
      <description><![CDATA[<p>Статья объясняет, почему XML-сериализация игнорирует приватные члены. Также рассматриваются различия между XML и бинарной сериализацией</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/xml-i-binarnaya-serializaciya-v--net">Нюансы XML и бинарной сериализации в .Net</a>»</p>]]></description>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[XML]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 21 Aug 2024 15:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<h3>Почему при XML-сериализации не сериализуются приватные члены</h3><p>XML-сериализация — это мощный инструмент, используемый для преобразования объектов в XML-формат, который легко читается и редактируется человеком. Однако одним из ключевых аспектов этой технологии является то, что при XML-сериализации приватные члены класса не включаются в результирующий XML-документ. Это решение имеет свою логику и обусловлено несколькими важными факторами.</p><p><b>Безопасность данных</b></p><p>Одной из основных причин, по которой приватные члены не сериализуются, является безопасность данных. Приватные члены класса предназначены для внутреннего использования и должны быть защищены от внешнего вмешательства. Если бы XML-сериализация включала приватные члены, то любой мог бы получить доступ к этим данным, просто изменив XML-файл. Это создаёт потенциальные риски, такие как подмена значений или манипуляция данными, что может повлечь за собой серьёзные проблемы с безопасностью.</p><p><b>Целостность и корректность данных</b></p><p>Приватные члены часто содержат информацию, которая не предназначена для общего доступа, и её изменение может нарушить целостность объекта. При XML-сериализации важно сохранять только те данные, которые действительно нужны для обмена или хранения в формате XML. Включение приватных данных в XML-файл могло бы привести к нарушению инвариантов объекта или его внутреннего состояния.</p><p><b>Проектирование API</b></p><p>XML сериализация ориентирована на сериализацию состояния объекта в формат, понятный для внешнего мира. Приватные члены не предназначены для такого использования, и их отсутствие в XML-документе способствует более ясному и безопасному взаимодействию с объектами. Таким образом, XML-сериализация ориентируется на публичные данные, которые являются частью API и предназначены для использования за пределами класса.</p><h3>Асимметрия между XML и бинарной сериализацией</h3><p>Сериализация объектов — это процесс преобразования объектов в формат, который можно сохранить или передать, и существует множество методов для этого, включая XML и бинарную сериализацию. Эти два метода обладают определёнными различиями, которые можно объяснить их назначением и особенностями.</p><p><b>Разные цели</b></p><p>XML и бинарная сериализация были разработаны для решения разных задач. Бинарная сериализация предназначена для сохранения сложных графов объектов .NET с полной информацией о них. Она сохраняет все детали состояния объекта, включая приватные члены и типы данных. XML-сериализация, с другой стороны, используется для поддержки протокола SOAP и обмена данными в формате, который легко читаем и понятен человеку. Она ориентирована на сохранение данных в открытом формате, который может быть прочитан и проверен без необходимости специализированных инструментов.</p><p><b>Приватные члены и безопасность</b></p><p>Как уже упоминалось, XML-сериализация игнорирует приватные члены для обеспечения безопасности и целостности данных. Бинарная сериализация, напротив, сохраняет все данные объекта, включая приватные члены. Поэтому для бинарной сериализации требуется дополнительная настройка, чтобы контролировать, какие данные сохраняются, и для этого используются атрибуты, такие как `[NonSerialized]`, для исключения определённых полей из сериализации.</p><p><i>Пример класса с приватными членами:</i></p><figure><img src="https://media.tproger.ru/user-uploads/99933/2024-08-12/f95b1936-ea13-42b9-9ec8-e2fd68a8a2d1.png" alt="" /><figcaption>Бинарный вид переменной school</figcaption></figure><p><b>Циклические ссылки</b></p><p>В бинарной сериализации проблематика циклических ссылок решается путем проверки и недопущения дублирования сериализованных объектов. Это предотвращает бесконечные циклы и избыточность данных. XML-сериализация, в свою очередь, сталкивается с трудностями при представлении циклических ссылок в XML-документе. Поскольку XML-файлы предназначены для представления данных в текстовом формате, сложные графы объектов с циклическими ссылками требуют дополнительной обработки и представления.</p><p><i>Пример класса с циклической ссылкой:</i></p><p><b>Указание типа данных</b></p><p>Бинарная сериализация хранит метаданные о типах данных и структуре объектов, что может создавать проблемы совместимости при изменении версий. XML-сериализация, в отличие от бинарной, не требует указания типа данных при создании форматтера, что позволяет работать с данными независимо от конкретной реализации и версии .NET. XML-файлы могут быть использованы для обмена данными между различными системами, не привязанными к платформе .NET.</p><p>В заключение, асимметрия между XML и бинарной сериализацией обусловлена их различными назначениями и особенностями. XML-сериализация фокусируется на удобстве обмена данными в формате, понятном человеку, тогда как бинарная сериализация предназначена для сохранения полной информации о состоянии объекта .NET.</p>]]></content:encoded>
    </item>
  </channel>
</rss>