8 концепций проектирования систем (продолжение к предыдущему посту):
1. Доступность с балансировкой нагрузки (Availability with Load Balancers):
- Распределяет запросы между несколькими экземплярами сервисов, что повышает доступность системы.
2. Латентность с использованием CDN (Latency with CDNs):
- CDN (Content Delivery Network) сокращает время отклика, кэшируя контент ближе к пользователям.
3. Масштабируемость с репликацией (Scalability with Replication):
- Репликация данных позволяет системе масштабироваться, обеспечивая высокую производительность и доступность.
4. Устойчивость с использованием журналов транзакций (Durability with Transaction Logs):
- Журналы транзакций помогают восстановить состояние системы после сбоя.
5. Согласованность с конечной согласованностью (Consistency with Eventual Consistency):
- Система может достичь согласованности данных со временем, даже если данные временно несогласованы.
6. Модульность с ослабленным связыванием и высокой связностью (Modularity with Loose Coupling and High Cohesion):
- Модульность и ослабленное связывание улучшают гибкость и устойчивость системы.
7. Конфигурируемость с использованием кода конфигурации (Configurability with Configuration-as-Code):
- Конфигурация позволяет динамически управлять инфраструктурой и настройками системы.
8. Устойчивость с использованием очереди сообщений (Resiliency with Message Queue):
- Очередь сообщений помогает системе справляться с отказами и перегрузками, балансируя нагрузку между потребителями.
1. Доступность с балансировкой нагрузки (Availability with Load Balancers):
- Распределяет запросы между несколькими экземплярами сервисов, что повышает доступность системы.
2. Латентность с использованием CDN (Latency with CDNs):
- CDN (Content Delivery Network) сокращает время отклика, кэшируя контент ближе к пользователям.
3. Масштабируемость с репликацией (Scalability with Replication):
- Репликация данных позволяет системе масштабироваться, обеспечивая высокую производительность и доступность.
4. Устойчивость с использованием журналов транзакций (Durability with Transaction Logs):
- Журналы транзакций помогают восстановить состояние системы после сбоя.
5. Согласованность с конечной согласованностью (Consistency with Eventual Consistency):
- Система может достичь согласованности данных со временем, даже если данные временно несогласованы.
6. Модульность с ослабленным связыванием и высокой связностью (Modularity with Loose Coupling and High Cohesion):
- Модульность и ослабленное связывание улучшают гибкость и устойчивость системы.
7. Конфигурируемость с использованием кода конфигурации (Configurability with Configuration-as-Code):
- Конфигурация позволяет динамически управлять инфраструктурой и настройками системы.
8. Устойчивость с использованием очереди сообщений (Resiliency with Message Queue):
- Очередь сообщений помогает системе справляться с отказами и перегрузками, балансируя нагрузку между потребителями.
🔥4❤1
Основные типы кибератак (описание инфографики из предыдущего поста):
- Фишинг:
- Китовый фишинг (Whale Phishing) — нацелен на высокопоставленных лиц
- Целевая атака (Spear Attack) — направлена на конкретных пользователей
- Фарминг (Pharming) — перенаправление пользователей на поддельные сайты
- SQL-инъекции:
- Атака, связанная с внедрением вредоносного кода в запросы к базе данных
- Межсайтовый скриптинг (XSS):
- Использование уязвимостей веб-приложений для внедрения вредоносного кода
- Атака «человек посередине» (Man-in-the-Middle):
- Перехват и изменение данных между двумя сторонами
- Включает:
- Перехват сессии (Session Hijacking)
- Спуфинг IP (IP Spoofing)
- Атака воспроизведения (Replay)
- DDoS:
- Направлена на перегрузку серверов или сетей, чтобы сделать их недоступными
- Атаки на пароли:
- Подбирают пароли методом перебора (Brute Force Guessing) или используют словари (Dictionary Attack)
- Атака на устройства:
- Автоматическое заражение устройства при посещении вредоносного сайта
- Ransomware:
- Заражение системы вредоносным ПО, которое блокирует доступ к данным и требует выкуп
- Атака прослушивания (Eavesdropping):
- Перехват данных, передаваемых по сети
- Атаки, управляемые ИИ (AI-Powered Attacks):
- Используют ИИ для автоматизации и усложнения атак
- Фишинг:
- Китовый фишинг (Whale Phishing) — нацелен на высокопоставленных лиц
- Целевая атака (Spear Attack) — направлена на конкретных пользователей
- Фарминг (Pharming) — перенаправление пользователей на поддельные сайты
- SQL-инъекции:
- Атака, связанная с внедрением вредоносного кода в запросы к базе данных
- Межсайтовый скриптинг (XSS):
- Использование уязвимостей веб-приложений для внедрения вредоносного кода
- Атака «человек посередине» (Man-in-the-Middle):
- Перехват и изменение данных между двумя сторонами
- Включает:
- Перехват сессии (Session Hijacking)
- Спуфинг IP (IP Spoofing)
- Атака воспроизведения (Replay)
- DDoS:
- Направлена на перегрузку серверов или сетей, чтобы сделать их недоступными
- Атаки на пароли:
- Подбирают пароли методом перебора (Brute Force Guessing) или используют словари (Dictionary Attack)
- Атака на устройства:
- Автоматическое заражение устройства при посещении вредоносного сайта
- Ransomware:
- Заражение системы вредоносным ПО, которое блокирует доступ к данным и требует выкуп
- Атака прослушивания (Eavesdropping):
- Перехват данных, передаваемых по сети
- Атаки, управляемые ИИ (AI-Powered Attacks):
- Используют ИИ для автоматизации и усложнения атак
❤12🔥2👏1
Различные алгоритмы и структуры данных, которые часто используются в интервью по программированию (описание к предыдущему посту):
1. Clone: Этот паттерн используется для создания точной копии графа. На изображении показано, как оригинальный граф преобразуется в клонированный граф с новыми узлами.
2. Serialize and Deserialize: Этот паттерн позволяет преобразовать структуру данных в последовательность байтов (сериализация) и восстановить её обратно (десериализация). На изображении показан пример сериализации и десериализации дерева.
3. Monotonic Queue: Используется для эффективного поиска минимального или максимального значения в скользящем окне. На изображении показаны гистограммы, иллюстрирующие работу очереди.
4. Segment Tree: Это структура данных, которая позволяет эффективно выполнять запросы на отрезках массива. На изображении показана структура дерева и его узлы.
5. Binary Index Tree: Также известная как дерево Фенвика, используется для эффективного вычисления префиксных сумм. На изображении показан пример дерева.
6. Meet in the Middle: Этот паттерн применяется для оптимизации поиска в больших наборах данных. На изображении показан процесс разделения и объединения данных.
7. Counting: Используется для подсчёта частоты элементов в массиве. На изображении представлена таблица, где ключи — это элементы массива, а значения — их частота.
8. Linear Sorting: Это алгоритмы сортировки, такие как сортировка подсчётом. На изображении показан процесс сортировки массива.
9. Simulation: Используется для моделирования различных процессов, таких как движение объектов. На изображении показаны координаты и направления движения.
1. Clone: Этот паттерн используется для создания точной копии графа. На изображении показано, как оригинальный граф преобразуется в клонированный граф с новыми узлами.
2. Serialize and Deserialize: Этот паттерн позволяет преобразовать структуру данных в последовательность байтов (сериализация) и восстановить её обратно (десериализация). На изображении показан пример сериализации и десериализации дерева.
3. Monotonic Queue: Используется для эффективного поиска минимального или максимального значения в скользящем окне. На изображении показаны гистограммы, иллюстрирующие работу очереди.
4. Segment Tree: Это структура данных, которая позволяет эффективно выполнять запросы на отрезках массива. На изображении показана структура дерева и его узлы.
5. Binary Index Tree: Также известная как дерево Фенвика, используется для эффективного вычисления префиксных сумм. На изображении показан пример дерева.
6. Meet in the Middle: Этот паттерн применяется для оптимизации поиска в больших наборах данных. На изображении показан процесс разделения и объединения данных.
7. Counting: Используется для подсчёта частоты элементов в массиве. На изображении представлена таблица, где ключи — это элементы массива, а значения — их частота.
8. Linear Sorting: Это алгоритмы сортировки, такие как сортировка подсчётом. На изображении показан процесс сортировки массива.
9. Simulation: Используется для моделирования различных процессов, таких как движение объектов. На изображении показаны координаты и направления движения.
👍12🎄3👏1
Почему Redis такой быстрый
🔹 Хранение в оперативной памяти
Redis хранит данные в RAM, где время доступа измеряется в наносекундах, а не в миллисекундах
🔹 Однопоточный цикл событий
Redis обрабатывает команды в одном потоке, позволяя избежать блокировок, гонок за ресурсы и переключений контекста. Благодаря мультиплексированию ввода-вывода он эффективно обрабатывает тысячи одновременных подключений с помощью цикла событий
🔹 Оптимизированные структуры данных
Redis использует специальные реализации списков, множеств и хэшей, оптимизированных как для производительности, так и для эффективного использования памяти
🔹 Эффективность ввода-вывода
Redis применяет легковесный текстовый протокол RESP для обработки сетевого ввода-вывода и поддерживает конвейерную обработку, позволяя отправлять несколько команд в одном запросе
🔹 Серверный скриптинг
Механизм скриптов Lua в Redis позволяет выполнять сложные многоэтапные операции атомарно на сервере, исключая необходимость в сетевых обращениях туда-обратно
🔹 Хранение в оперативной памяти
Redis хранит данные в RAM, где время доступа измеряется в наносекундах, а не в миллисекундах
🔹 Однопоточный цикл событий
Redis обрабатывает команды в одном потоке, позволяя избежать блокировок, гонок за ресурсы и переключений контекста. Благодаря мультиплексированию ввода-вывода он эффективно обрабатывает тысячи одновременных подключений с помощью цикла событий
🔹 Оптимизированные структуры данных
Redis использует специальные реализации списков, множеств и хэшей, оптимизированных как для производительности, так и для эффективного использования памяти
🔹 Эффективность ввода-вывода
Redis применяет легковесный текстовый протокол RESP для обработки сетевого ввода-вывода и поддерживает конвейерную обработку, позволяя отправлять несколько команд в одном запросе
🔹 Серверный скриптинг
Механизм скриптов Lua в Redis позволяет выполнять сложные многоэтапные операции атомарно на сервере, исключая необходимость в сетевых обращениях туда-обратно
❤10
Рекомендации по написанию модульного кода (продолжение к предыдущему посту)
Написание модульного кода — это не просто способ получить чистый код, это значительно упрощает совместную работу и масштабирование.
1) Дизайн
* Единственная ответственность
Каждый модуль/класс/функция должен выполнять только одну задачу. Это основа принципа единственной ответственности (SRP), одного из столпов SOLID-дизайна.
* Слабая связанность
Модули должны иметь минимальные зависимости. Это обеспечивает более простое повторное использование и снижает затраты на поддержку.
* Высокая связность
Связанная функциональность должна быть сгруппирована вместе для лучшей ясности и удобства поддержки.
2) Структура
* Небольшие функции
Функции должны выполнять одну задачу и делать это хорошо. Это улучшает читаемость и тестируемость.
* Четкие интерфейсы
Хорошо определенные API/интерфейсы обеспечивают простую интеграцию и замену.
* Согласованное именование
Использование согласованных, описательных имен помогает другим разработчикам быстро понимать код.
3) Повторное использование
* Библиотеки
Общая функциональность должна быть вынесена в библиотеки/модули.
* Универсальный код
Используйте параметризацию/обобщения/шаблоны там, где это уместно, чтобы максимально повысить возможность повторного использования.
* Конфигурация
Избегайте жесткого кодирования значений, используйте конфигурации для гибкости.
4) Тестирование
* Юнит-тесты
Необходимы для проверки небольших изолированных частей кода.
* Мокирование
Облегчает тестирование в изоляции, независимо от зависимостей.
* Покрытие
Стремитесь к высокому покрытию тестами для обеспечения надежности.
5) Документация
* Комментарии
Объясняйте, почему (а не только что) в коде.
* Readme
Каждый модуль/библиотека должен иметь четкие инструкции по использованию.
* Примеры
Примеры использования чрезвычайно полезны для адаптации и внедрения.
6) Поддерживаемость
* Регулярный рефакторинг
Устраняйте технический долг до того, как он вырастет.
* Код-ревью
Рецензии коллег помогают выявить проблемы и распространить знания.
* Следование стандартам
Согласованность (через руководства по стилю кода и соглашения) предотвращает путаницу.
Написание модульного кода — это не просто способ получить чистый код, это значительно упрощает совместную работу и масштабирование.
1) Дизайн
* Единственная ответственность
Каждый модуль/класс/функция должен выполнять только одну задачу. Это основа принципа единственной ответственности (SRP), одного из столпов SOLID-дизайна.
* Слабая связанность
Модули должны иметь минимальные зависимости. Это обеспечивает более простое повторное использование и снижает затраты на поддержку.
* Высокая связность
Связанная функциональность должна быть сгруппирована вместе для лучшей ясности и удобства поддержки.
2) Структура
* Небольшие функции
Функции должны выполнять одну задачу и делать это хорошо. Это улучшает читаемость и тестируемость.
* Четкие интерфейсы
Хорошо определенные API/интерфейсы обеспечивают простую интеграцию и замену.
* Согласованное именование
Использование согласованных, описательных имен помогает другим разработчикам быстро понимать код.
3) Повторное использование
* Библиотеки
Общая функциональность должна быть вынесена в библиотеки/модули.
* Универсальный код
Используйте параметризацию/обобщения/шаблоны там, где это уместно, чтобы максимально повысить возможность повторного использования.
* Конфигурация
Избегайте жесткого кодирования значений, используйте конфигурации для гибкости.
4) Тестирование
* Юнит-тесты
Необходимы для проверки небольших изолированных частей кода.
* Мокирование
Облегчает тестирование в изоляции, независимо от зависимостей.
* Покрытие
Стремитесь к высокому покрытию тестами для обеспечения надежности.
5) Документация
* Комментарии
Объясняйте, почему (а не только что) в коде.
* Readme
Каждый модуль/библиотека должен иметь четкие инструкции по использованию.
* Примеры
Примеры использования чрезвычайно полезны для адаптации и внедрения.
6) Поддерживаемость
* Регулярный рефакторинг
Устраняйте технический долг до того, как он вырастет.
* Код-ревью
Рецензии коллег помогают выявить проблемы и распространить знания.
* Следование стандартам
Согласованность (через руководства по стилю кода и соглашения) предотвращает путаницу.
👍16😢2👏1
Когда проверка на ботов/роботов уже не спасает.
Новый AI-бот от OpenAI - ChatGPT Agent легко обходит проверку «Я не робот» от Cloudflare и продолжает работу без капчи.
ChatGPT Agent работает в виртуальном браузере, самостоятельно выполняя клики, ввод данных и навигацию — у пользователя запрашиваются подтверждения лишь на ключевых этапах, например, при совершении покупки или отправке письма. В случае с капчей ИИ‑агент ставит галочку «Подтвердите, что вы человек», а затем нажимает кнопку «Далее».
Примечательно, что ChatGPT Agent комментирует прохождение проверки фразами вроде «Этот шаг необходим, чтобы доказать, что я не бот»
Функция ChatGPT Agent доступна пользователям платных тарифов Plus, Pro и Team с 17 июля 2025 года. Бесплатным пользователям ИИ‑агент пока недоступен.
https://arstechnica.com/information-technology/2025/07/openais-chatgpt-agent-casually-clicks-through-i-am-not-a-robot-verification-test/
Новый AI-бот от OpenAI - ChatGPT Agent легко обходит проверку «Я не робот» от Cloudflare и продолжает работу без капчи.
ChatGPT Agent работает в виртуальном браузере, самостоятельно выполняя клики, ввод данных и навигацию — у пользователя запрашиваются подтверждения лишь на ключевых этапах, например, при совершении покупки или отправке письма. В случае с капчей ИИ‑агент ставит галочку «Подтвердите, что вы человек», а затем нажимает кнопку «Далее».
Примечательно, что ChatGPT Agent комментирует прохождение проверки фразами вроде «Этот шаг необходим, чтобы доказать, что я не бот»
Функция ChatGPT Agent доступна пользователям платных тарифов Plus, Pro и Team с 17 июля 2025 года. Бесплатным пользователям ИИ‑агент пока недоступен.
https://arstechnica.com/information-technology/2025/07/openais-chatgpt-agent-casually-clicks-through-i-am-not-a-robot-verification-test/
😁17❤2🔥1👏1
Процесс компиляции GNU от исходного кода до исполняемого файла
Описание - https://news.1rj.ru/str/devnull22/1930
Описание - https://news.1rj.ru/str/devnull22/1930
👍5❤1🔥1🥰1🤔1
Процесс компиляции GNU от исходного кода до исполняемого файла (Описание к предыдущему посту)
Процесс начинается с исходного кода в текстовых файлах (например, программы на языке C) и запускается с препроцессора, который часто называют cpp.
Предположим, исходный код находится в файле prog.c.
Препроцессор расширяет макросы, подключает заголовочные файлы и обрабатывает директивы, преобразуя исходный код в очищенную версию, которая по-прежнему остаётся в текстовом формате. Например, после обработки препроцессором cpp файла prog.c может получиться файл prog.i.
Препроцессор важен для подготовки кода путём раннего разрешения зависимостей, чтобы все определения были на месте до фактической компиляции.
Далее собственно компилятор (например, cc1 или gcc) на основном этапе берёт предварительно обработанный текст и генерирует ассемблерный код.
На этом этапе высокоуровневые инструкции преобразуются в низкоуровневый ассемблер, часто с такими оптимизациями, как преобразование кода. Вы можете увидеть команду gcc -S -m32 prog.c для вывода prog.s в текстовом формате.
Ассемблер остаётся читаемым для человека, но ближе к машинному языку, что позволяет преодолеть разрыв между языками программирования и особенностями аппаратного обеспечения.
Ассемблер (обозначается как as) преобразует этот ассемблерный текст в перемещаемые объектные файлы в двоичном формате.
Эти файлы .o содержат машинный код, но с заполнителями для адресов, отмеченными в записях перемещения, таких как разделы .rel.data или .text. Таблицы символов (.symtab) отслеживают переменные и функции.
Выполнение команды gcc -c prog.c компилирует без компоновки, создавая файл prog.o, готовый к объединению с другими файлами.
Компоновка выполняется с помощью ld, который разрешает символы и перемещает код, подключая библиотечные файлы и другие объектные модули.
Он создаёт исполняемый двоичный файл, например prog из gcc -o prog prog.c, где всем ссылкам присваиваются фиксированные адреса. На этом этапе выполняется разрешение символов, чтобы вызовы внешних функций работали корректно.
Наконец, загрузчик помещает этот исполняемый файл в память как работающий процесс, сопоставляя разделы и настраивая выполнение.
Процесс начинается с исходного кода в текстовых файлах (например, программы на языке C) и запускается с препроцессора, который часто называют cpp.
Предположим, исходный код находится в файле prog.c.
Препроцессор расширяет макросы, подключает заголовочные файлы и обрабатывает директивы, преобразуя исходный код в очищенную версию, которая по-прежнему остаётся в текстовом формате. Например, после обработки препроцессором cpp файла prog.c может получиться файл prog.i.
Препроцессор важен для подготовки кода путём раннего разрешения зависимостей, чтобы все определения были на месте до фактической компиляции.
Далее собственно компилятор (например, cc1 или gcc) на основном этапе берёт предварительно обработанный текст и генерирует ассемблерный код.
На этом этапе высокоуровневые инструкции преобразуются в низкоуровневый ассемблер, часто с такими оптимизациями, как преобразование кода. Вы можете увидеть команду gcc -S -m32 prog.c для вывода prog.s в текстовом формате.
Ассемблер остаётся читаемым для человека, но ближе к машинному языку, что позволяет преодолеть разрыв между языками программирования и особенностями аппаратного обеспечения.
Ассемблер (обозначается как as) преобразует этот ассемблерный текст в перемещаемые объектные файлы в двоичном формате.
Эти файлы .o содержат машинный код, но с заполнителями для адресов, отмеченными в записях перемещения, таких как разделы .rel.data или .text. Таблицы символов (.symtab) отслеживают переменные и функции.
Выполнение команды gcc -c prog.c компилирует без компоновки, создавая файл prog.o, готовый к объединению с другими файлами.
Компоновка выполняется с помощью ld, который разрешает символы и перемещает код, подключая библиотечные файлы и другие объектные модули.
Он создаёт исполняемый двоичный файл, например prog из gcc -o prog prog.c, где всем ссылкам присваиваются фиксированные адреса. На этом этапе выполняется разрешение символов, чтобы вызовы внешних функций работали корректно.
Наконец, загрузчик помещает этот исполняемый файл в память как работающий процесс, сопоставляя разделы и настраивая выполнение.
Telegram
METANIT.COM
Процесс компиляции GNU от исходного кода до исполняемого файла
Описание - https://news.1rj.ru/str/devnull22/1930
Описание - https://news.1rj.ru/str/devnull22/1930
👍13❤4🔥1
Распространенне паттерны программирования: (описание к предыдущему посту)
1. Two-Pointer Technique (Техника двух указателей): Используется для работы с массивами или строками, где два указателя (Pointer 1 и Pointer 2) движутся по структуре данных для решения задач, таких как поиск пар или подмассивов.
2. HashMaps: Это структура данных, которая хранит пары ключ-значение. Она использует хэш-функцию для быстрого доступа к данным.
3. Linked Lists (Связанные списки): Линейная структура данных, где каждый элемент (узел) содержит данные и ссылку на следующий элемент.
4. Fast and Slow Pointers (Быстрые и медленные указатели): Используются для обнаружения циклов в связанных списках или других структурах данных.
5. Sliding Window Technique (Техника скользящего окна): Применяется для обработки массивов или строк, где окно определенного размера перемещается по данным для выполнения операций.
6. Binary Search (Двоичный поиск): Эффективный алгоритм поиска элемента в отсортированном массиве.
7. Stacks (Стеки): Структура данных, работающая по принципу "последним пришел — первым вышел" (LIFO).
8. Heaps (Кучи): Дерево, где каждый узел больше (или меньше) своих потомков, используется для реализации приоритетов.
9. Prefix Sum (Префиксные суммы): Метод вычисления суммы элементов массива до определенной позиции.
10. Trees (Деревья): Иерархическая структура данных, где каждый узел может иметь несколько потомков.
11. Graphs (Графы): Набор узлов и ребер, соединяющих их, используется для моделирования сложных связей.
12. Backtracking (Обратное отслеживание): Алгоритм для поиска решений путем проб и ошибок, отката и повторного поиска.
13. Dynamic Programming (Динамическое программирование): Метод решения задач путем разбиения их на подзадачи и сохранения результатов для повторного использования.
14. Greedy Algorithm (Жадный алгоритм): Принимает локально оптимальные решения на каждом шаге, надеясь на глобальную оптимальность.
15. Intervals (Интервалы): Используются для работы с диапазонами значений, например, в задачах планирования.
1. Two-Pointer Technique (Техника двух указателей): Используется для работы с массивами или строками, где два указателя (Pointer 1 и Pointer 2) движутся по структуре данных для решения задач, таких как поиск пар или подмассивов.
2. HashMaps: Это структура данных, которая хранит пары ключ-значение. Она использует хэш-функцию для быстрого доступа к данным.
3. Linked Lists (Связанные списки): Линейная структура данных, где каждый элемент (узел) содержит данные и ссылку на следующий элемент.
4. Fast and Slow Pointers (Быстрые и медленные указатели): Используются для обнаружения циклов в связанных списках или других структурах данных.
5. Sliding Window Technique (Техника скользящего окна): Применяется для обработки массивов или строк, где окно определенного размера перемещается по данным для выполнения операций.
6. Binary Search (Двоичный поиск): Эффективный алгоритм поиска элемента в отсортированном массиве.
7. Stacks (Стеки): Структура данных, работающая по принципу "последним пришел — первым вышел" (LIFO).
8. Heaps (Кучи): Дерево, где каждый узел больше (или меньше) своих потомков, используется для реализации приоритетов.
9. Prefix Sum (Префиксные суммы): Метод вычисления суммы элементов массива до определенной позиции.
10. Trees (Деревья): Иерархическая структура данных, где каждый узел может иметь несколько потомков.
11. Graphs (Графы): Набор узлов и ребер, соединяющих их, используется для моделирования сложных связей.
12. Backtracking (Обратное отслеживание): Алгоритм для поиска решений путем проб и ошибок, отката и повторного поиска.
13. Dynamic Programming (Динамическое программирование): Метод решения задач путем разбиения их на подзадачи и сохранения результатов для повторного использования.
14. Greedy Algorithm (Жадный алгоритм): Принимает локально оптимальные решения на каждом шаге, надеясь на глобальную оптимальность.
15. Intervals (Интервалы): Используются для работы с диапазонами значений, например, в задачах планирования.
Telegram
METANIT.COM
Распространенне паттерны программирования
(описание)
(описание)
👍11🐳2🔥1🥰1
Роскомнадзор заблокировал в РФ сервис Speedtest из-за угрозы безопасности российского сегмента сети Интернет
Вероятно, что под запрет попадут и остальные иностранные сервисы для замера скорости доступа в интернет, а операторам будет указано обязательно использовать российские программные продукты для измерения скорости передачи данных в своих сетях, например сервис «Линкметр», сервис TelecomDaily «Мегабитус» или QMS от «Ростелекома».
https://www.interfax.ru/digital/1038766
Вероятно, что под запрет попадут и остальные иностранные сервисы для замера скорости доступа в интернет, а операторам будет указано обязательно использовать российские программные продукты для измерения скорости передачи данных в своих сетях, например сервис «Линкметр», сервис TelecomDaily «Мегабитус» или QMS от «Ростелекома».
https://www.interfax.ru/digital/1038766
Интерфакс
Роскомнадзор заблокировал в РФ сервис по замеру скорости интернета Speedtest
Роскомнадзор (РКН) заблокировал в РФ сервис по замеру скорости и качества интернет-соединения Speedtest от компании Ookla в связи с выявленными угрозами безопасности Рунету, сообщили "Интерфаксу" в пресс-службе ведомства."Доступ к сервису Speedtest ограничен…
🤡59😭9🖕6👍3🤣3🤔2❤1🤯1🥱1