METANIT.COM – Telegram
METANIT.COM
5.95K subscribers
1.69K photos
81 videos
9 files
1.07K links
Канал о программировании и разработке сайта metanit.com
Download Telegram
Краткая шпаргалка по регулярным выражениям
🔥14👍6👏3🥰1
6 базовых архитектурных паттернов
👍3🔥1👏1
Тестирование API вносит значительный вклад в обеспечение надежности, безопасности, функциональности и эффективности приложений за счет оценки маршрутов связи между компонентами программного обеспечения.
Рассмотрим 6 наиболее распростраенных форм тестирования API:

🔹 Тестирование рабочего процесса (Workflow Testing)
Проверяет, правильно ли работает последовательность вызовов API для завершения определенного процесса.
Часто такие тесты рабочего процесса связаны с какой-либо бизнес-целью, например, с совершением покупки на платформе электронной коммерции.

🔹 Тестирование производительности (Performance Testing)
Он оценивает скорость, отзывчивость и стабильность API в различных условиях, чтобы убедиться, что он соответствует контрольным показателям и ожиданиям пользователей.
Он оценивает ключевые факторы, такие как скорость обработки, использование памяти, нагрузка на соединение, время отклика и пропускная способность сети, чтобы выявить потенциальные узкие места.
Цель состоит в том, чтобы убедиться, что система выдает ожидаемые ответы в разумные сроки, даже при различных уровнях нагрузки.

🔹 Тестирование безопасности (Security Testing)
Выявляет уязвимости, которые потенциально могут привести к несанкционированному доступу или утечке данных.
Он включает в себя строгие проверки, чтобы гарантировать, что меры безопасности достаточно надежны, чтобы предотвратить атаки и утечки данных.
Он использует такие методы, как тестирование на проникновение (penetration testing) и нечеткое тестирование (fuzz testing) для выявления уязвимостей. В качестве отправной точки можно начать со списка безопасности API OWASP.

🔹 Тестирование на основе данных (Data-driven Testing)
Передает различные наборы и типы входных данных в API, чтобы гарантировать его корректную работу в различных сценариях.
Он включает в себя использование таблицы входных данных, сопоставленных с ожидаемыми выходными данными, прогон этих входных данных через систему и проверку того, соответствуют ли фактические выходные данные ожидаемым результатам.

🔹 Тестирование конечной точки (Endpoint Testing)
Проверяет, правильно ли отдельные конечные точки API реагируют на запросы и возвращают ли ожидаемый ответ, данные, коды состояния и сообщения об ошибках.

🔹 Тестирование контракта (Contract Testing)
Проверяет, что взаимодействие между поставщиком API и потребителем соответствует предопределенному соглашению / контракту, включая ожидаемые структуры запросов, форматы ответов и типы данных.
Его основная задача — гарантировать, что поставщик API не вносит критических изменений, которые могут повлиять на потребителей, использующих API.
🔥10
Шпаргалка по наиболее распространенным размерам данных
👍9🔥1👏1
При построении отпимальной архитектуры часто обрщают внимание на две концепции: отказоустойчивость (Failover) и репликация ( Replication). Что представляют эти две концепции?

➤ Отказоустойчивость (Failover) заключается в переключении систем/узлов, когда один из этих узлов выходит из строя. Есть два типа реализации данной концепции:

Активный узел -активный узел: Все узлы обрабатывают трафик. Если один выходит из строя, другой продолжает работать.
Плюсы: нулевое время простоя, высокое использование ресурсов.
Минусы: сложная координация, риск гоночных состояний

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


➤ Репликация (Replication) — это хранение одних и тех же данных в разных местах. Здесь распространены два типа реализации:

Одна ведущая реплика (Single-Leader): один узел пишет, остальные читают.
Плюсы: Более простая последовательность
Минусы: одно узкое место при записи, задержка при чтении реплик

Несколько ведущих реплик (Multileader): запись могут осуществлять несколько узлов.
Плюсы: Все могут писать, более высокая доступность
Минусы: конфликты данных, сложное согласование данных


Что это значит:
1. Репликация НЕ означает нулевую потерю данных.
2. Отказоустойчивость НЕ означает нулевое время простоя.
3. Не стоит выбирать шаблон на основе популярности, а стоит выбирать на основе времени восстановления, допустимой задержки и требований к согласованности.
👍6🔥1🥰1
Иллюстрация к предыдущему посту: Отказоустойчивость и репликация
👍3
Краткая история развития AI
❤‍🔥11👎2🤔2🔥1
Как работает NAT (Network Address Translation)
👍8🍓4🔥3🤷‍♂1
Иностранные компании снова активно нанимают российских IT-специалистов
По итогам 2024 года они наняли порядка 5 тыс. сотрудников, что в два раза больше, чем годом ранее. Среди наиболее активных работодателей, утверждают отечественные разработчики, китайские Huawei, Alibaba и Tencent, однако активизировались и европейские SAP, Delivery Hero и американские Amazon, OpenAI и т.д.. Спрос на российские IT-кадры вырос и со стороны ОАЭ, особенно в финтех-сегменте, а также есть рост со стороны индийских IT-аутсорсеров
Теперь иностранные компании не только напрямую нанимают сотрудников в качестве фрилансеров. Часть найма происходит через договоры оказания услуг, когда коллективы российских инженеров фактически работают над задачами зарубежных вендоров, не меняя своей юрисдикции
В Минцифры в курсе ситуации, но подчеркивают, что речь идет о частных случаях и массового характера они не носят.
https://www.kommersant.ru/doc/7675878
👍12🙏2
20 распространенных концепций для системного дизайна
9
Добавлено руководство по созданию графических приложений с помощью GTK на C#
https://metanit.com/sharp/gtk/1.1.php
#csharp #gtk
👍33🔥63🤨3💩1
Concurrency (конкурентность) и Parallelism (параллелизм) — два термина, которые часто путают. Но понимание параллелизма и конкурентности имеет важное значение для создания высокопроизводительных и эффективных программных решений.
Конкурентность предполагает управление несколькими задачами одновременно, их смешивание для оптимизации использования ресурсов.
Параллелизм предполагает выполнение нескольких задач одновременно.
Как лаконично выразился Роб Пайк (один из создателей Golang): «конкурентность — это работа с большим количеством вещей одновременно. Параллелизм — это выполнение большого количества вещей одновременно».

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

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

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

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

Отличным примером является Node.js, который применяет конкурентность в однопоточной модели с использованием обратных вызовов и циклов событий.
Между тем, многопоточные среды (например, C#) способствуют как параллелизму, так и конкурентности. Они обеспечивают как конкурентное выполнение задач, так и настоящее параллельное выполнение на нескольких процессорах или ядрах одновременно.
👍18🔥2👏2
This media is not supported in your browser
VIEW IN TELEGRAM
(Анимация к предыдущему посту)
👍23🔥5👎1👏1
Как работает криптография публичных ключей
👏4🔥2🥰1
11 ключевых аспектов проектирования системы и системного дизайна:

1. Основы проектирования систем
Основа дизайна приложений представляют следующие концепции: масштабируемость, типы архитектуры, прокси, балансировщики нагрузки, монолит/микросервисы.

2. Сетевое взаимодействие и коммуникация
Принципы работы служб — от IP-адресации и межсетевых экранов до REST и gRPC, TLS, шлюзов API и обнаружения служб.

3. Кэширование
Стратегии кэширования и связанные темы — Redis, TTL, аннулировании кэша, CDN и локальных и глобальных уровнях кэширования.

4. Балансировка нагрузки
Эффективное распределение трафика, такие стратегии, как Round Robin, Least Connections, IP Hash, global LB, sticky sessions и проверки работоспособности.

5. Управление данными
Управление выбором базы и схемы данных с учетом принципов SQL/NoSQL, ACID или BASE, сегментирования, репликации и разделения данных.

6. Асинхронная обработка
Отвязывание систем друг от друга, применение очередей, событийно-ориентированная архитектура, Pub/Sub, веб-хуки, очереди повторных попыток (retry queue) и такие шаблоны, как исходящие сообщения (outbox) и источник событий (event sourcing).

7. Системы хранения и файловые системы
Неструктурированные и структурированные данные с помощью S3, EFS, BLOB-объектов, фрагментации, сжатия, озер данных и последовательного хеширования.

8. Последовательность и доступность
Обеспечение корректности распределенных систем с помощью строгой/конечной согласованности (strong/eventual consistency), протоколов консенсуса (consensus protocols), распределенных блокировок (distributed lock), векторных часов (vector clock) и кворума (quorum).

9. Отказоустойчивость
Проектирование систем, которые сами восстанавливаются с помощью повторных попыток, автоматических выключателей (circuit breaker), переборок (bulkhead), хаос-инжиниринга и стратегий постепенной деградации.

10. Мониторинг
Отслеживание, отладка и оптимизация производительности с помощью метрик, трассировок, стека ELK, OpenTelemetry, проверок работоспособности и инструментов оповещения.

11. Безопасность и аутентификация
Защита системы с помощью OAuth, JWT, RBAC, защиты от CSRF/XSS, TLS и поставщиков удостоверений, таких как Auth0 и Okta.
👍6👏2🔥1
(Иллюстрация к предыдущему посту)
🔥9🥰1👏1
9 ключевых паттернов проектирования для ООП
👍19🔥2👏1
Вышла новая версия популярного набора компиляторов GCC - GCC 15 (формально GCC 15.1). Напомню, что каждый новый релиз мажорной версии выходит раз в год (так GCC 14 вышел в мае 2024 года.)
Основные изменения в GCC 15:

- добавлен интерфейс компилятора COBOL;
- доработаны интерфейсы GCC на языках D и Modula-2, а также интерфейс Fortran.
- улучшена поддержка новых стандартов языков C и C++ (для C по умолчанию применяется стандарт C23);
- добавлена поддержка новых процессоров (AMD Zen 5 и znver5 среди других новых оптимизаций AMD Zen, Intel Xeon 7 Diamond Rapids, поддержка Intel AVX10.2, больше возможностей Intel Advanced Performance Extensions APX, удалена поддержка Xeon Phi, улучшения в работе с OpenMP);
- доработаны возможности ISA;
- улучшена поддержка для языка Rust (для gccrs);
- бекэнд AMDGPU для графических процессоров AMD теперь также поддерживает стандартную библиотеку C++ (libstdc++);
- улучшена экспериментальная поддержка для универсальных устройств;
- бекэнд NVIDIA NVPTX с GCC15 также поддерживает libstdc++;

https://gcc.gnu.org/gcc-15/changes.html
🔥9👍42👏1
Вышла в релиз первая версия среды разработки OpenIDE. Решение создано компаниями «Группа Астра», Axiom JDK и Haulmont на базе IntelliJ IDEA. OpenIDE представляет собой бесплатный и полностью открытый инструмент для Java‑программистов. Среда готова к использованию в реальных проектах.

Основные моменты первого релиза:

-поддержка самой свежей Java 24 "из коробки",

-собственный маркетплейс с 350+ плагинами,

-полноценная работа с Git, Gradle, Maven

-LSP-расширения для Python, Scala, Kotlin,

-открытый исходный код (AGPLv3), собственные серверы обновлений и телеметрии (никакой привязки к JetBrains)

-поддержка Spring и корпоративных технологий.

Оф сайт: https://openide.ru/
👍14🎃8👎3🔥2
После того, как разработчики обнаружили сломанную поддержка регистрозависимости в файловой системе Bcachefs для Linux 6.15 и отправили ее на исправление, Линус Торвальдс написал длинный пост, где жестко прошелся по проблемам регистрозависимости в файловых системах:

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

"Люди, которые делают нечувствительность к регистру *НЕИЗБЕЖНО* делать что-то вроде игнорирования непечатаемых символов, так что теперь «нечувствительный к регистру» также означает «нечувствительный к другим вещам»."

"Чувствительность к регистру — это БАГ (примечание: в оригинале так, но видимо тут описка и имелось в виде НЕчувствительность к регистру - это баг). Тот факт, что люди, которые работают над файловой системой, *все еще* думают, что это фича, я не могу понять. Как будто они так почитают старую файловую систему FAT, что им приходится ее переделывать — ужасно"."

Оригинал: https://lore.kernel.org/lkml/CAHk-=wjajMJyoTv2KZdpVRoPn0LFZ94Loci37WLVXmMxDbLOjg@mail.gmail.com/
😁11👍5👎1👏1
В этом месяце исполняется 60 лет с тех пор, как в 1965 году Кули и Тьюки представили быстрое преобразование Фурье (БПФ) — один из важнейших алгоритмов в обработке сигналов и анализе данных.

В 1805 году Гаусс, изучая орбиты астероидов Паллада и Юнона, придумал метод интерполяции их траекторий по дискретным образцам. То, что он придумал, было математически очень близко к современному БПФ, но Гаусс никогда не публиковал эту работу и не анализировал ее вычислительную сложность. Она предшествовала даже работе Фурье 1822 года о диффузии тепла — но без обрамления или обобщения, которые Кули и Тьюки внесут 160 лет спустя.

В 1965 году Кули и Тьюки опубликовали свой ныне знаменитый алгоритм, который снизил стоимость вычисления дискретного преобразования Фурье с 𝑂 ( 𝑛 ²) до 𝑂 ( 𝑛 log ⁡𝑛 ). Этот скачок сделал возможными обработку сигналов в реальном времени и сжатие цифровых медиаданных.

В итоге сегодня это один из самых важных алгоритмов 20-го века, применяемых в самых различных сценариях.
👍42🔥2👏1