METANIT.COM – Telegram
METANIT.COM
5.88K subscribers
1.67K photos
81 videos
9 files
1.03K links
Канал о программировании и разработке сайта metanit.com
Download Telegram
Различные алгоритмы и структуры данных, которые часто используются в интервью по программированию (описание к предыдущему посту):

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 позволяет выполнять сложные многоэтапные операции атомарно на сервере, исключая необходимость в сетевых обращениях туда-обратно
10
Рекомендации по написанию модульного кода
👍10👏3🔥1
Рекомендации по написанию модульного кода (продолжение к предыдущему посту)

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

1) Дизайн

* Единственная ответственность
Каждый модуль/класс/функция должен выполнять только одну задачу. Это основа принципа единственной ответственности (SRP), одного из столпов SOLID-дизайна.

* Слабая связанность
Модули должны иметь минимальные зависимости. Это обеспечивает более простое повторное использование и снижает затраты на поддержку.

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

2) Структура

* Небольшие функции
Функции должны выполнять одну задачу и делать это хорошо. Это улучшает читаемость и тестируемость.

* Четкие интерфейсы
Хорошо определенные API/интерфейсы обеспечивают простую интеграцию и замену.

* Согласованное именование
Использование согласованных, описательных имен помогает другим разработчикам быстро понимать код.

3) Повторное использование

* Библиотеки
Общая функциональность должна быть вынесена в библиотеки/модули.

* Универсальный код
Используйте параметризацию/обобщения/шаблоны там, где это уместно, чтобы максимально повысить возможность повторного использования.

* Конфигурация
Избегайте жесткого кодирования значений, используйте конфигурации для гибкости.

4) Тестирование

* Юнит-тесты
Необходимы для проверки небольших изолированных частей кода.

* Мокирование
Облегчает тестирование в изоляции, независимо от зависимостей.

* Покрытие
Стремитесь к высокому покрытию тестами для обеспечения надежности.

5) Документация

* Комментарии
Объясняйте, почему (а не только что) в коде.

* Readme
Каждый модуль/библиотека должен иметь четкие инструкции по использованию.

* Примеры
Примеры использования чрезвычайно полезны для адаптации и внедрения.

6) Поддерживаемость

* Регулярный рефакторинг
Устраняйте технический долг до того, как он вырастет.

* Код-ревью
Рецензии коллег помогают выявить проблемы и распространить знания.

* Следование стандартам
Согласованность (через руководства по стилю кода и соглашения) предотвращает путаницу.
👍16😢2👏1
Подборка наиболее часто используемых команд Linux
14👏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/
😁172🔥1👏1
Процесс компиляции GNU от исходного кода до исполняемого файла
Описание - https://news.1rj.ru/str/devnull22/1930
👍51🔥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, где всем ссылкам присваиваются фиксированные адреса. На этом этапе выполняется разрешение символов, чтобы вызовы внешних функций работали корректно.

Наконец, загрузчик помещает этот исполняемый файл в память как работающий процесс, сопоставляя разделы и настраивая выполнение.
👍134🔥1
Распространенне паттерны программирования
(описание)
👍8💩4
Распространенне паттерны программирования: (описание к предыдущему посту)

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 (Интервалы): Используются для работы с диапазонами значений, например, в задачах планирования.
👍11🐳2🔥1🥰1
Роскомнадзор заблокировал в РФ сервис Speedtest из-за угрозы безопасности российского сегмента сети Интернет
Вероятно, что под запрет попадут и остальные иностранные сервисы для замера скорости доступа в интернет, а операторам будет указано обязательно использовать российские программные продукты для измерения скорости передачи данных в своих сетях, например сервис «Линкметр», сервис TelecomDaily «Мегабитус» или QMS от «Ростелекома».
https://www.interfax.ru/digital/1038766
🤡59😭9🖕6👍3🤣3🤔21🤯1🥱1
Роудмап по Docker #docker
11❤‍🔥5👏2
Команда Stack Overflow опубликовала результаты ежегодного опроса разработчиков. В 2025 году на вопросы отвечали более 49 тыс. технических специалистов из 177 стран. В этой статье собрал интересные цифры из результатов опроса. Некоторые результаты:

Десятка популярных языков программирования в 2025 году: JavaScript (66%), HTML/CSS (61%), SQL (58%), Python (57%), Bash/Shell (48%), TypeScript (43%), Java (29%), C# (27%), С++ (23%) и PowerShell (23%).

Популярные СУБД: PostgreSQL (55%), MySQL (40%), SQLite (37%), Microsoft SQL Server (30%) и Redis (28%).

Популярные веб-фреймворки и технологии: Node.js (48%), React (44%), jQuery (23%), Next.js (20%) и ASP.NET Core (19%).

IDE и редакторы кода: VS Code (75%), Visual Studio (29%), Notepad++ (27%), IntelliJ IDEA (27%), Vim (24%), Cursor (17%), PyCharm (15%) и Android Studio (15%).

Популярные ОС для работы: Windows (49%), macOS (32%), Ubuntu (27%).

Ознакомиться с полным отчетом можно на оф сайте по ссылке https://survey.stackoverflow.co/2025/
🔥20👍5🏆2🤷‍♂1
Шпаргалка по распространенным сетевым протоколам
👍27🔥1🥰1
Роудмап для изучения баз данных
#database #sql
👍15🔥4😱2
4 распространенных приема на Python для повседневого использования #python
🤮12👍5👏1
Основные стратегии согласованности кэша:

1. Истечение срока действия (Expiration)

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

Быстро: нет сетевого запроса при актуальности данных
Риск устаревания: данные могут измениться до истечения срока
Лучше всего подходит, когда обновления происходят нечасто, а задержка имеет значение

2. Проверка (Validation)

Клиенты используют заголовки ETag или Last-Modified, чтобы спросить: «Изменилось ли это с тех пор, как я видел это в последний раз?»
Сервер возвращает 304 Not Modified, если ничего не изменилось, что экономит пропускную способность.
Используется в API, где данные меняются, но вы всё равно хотите избежать полной загрузки.

Актуальность: всегда синхронизируется с источником
Эффективность: возвращает заголовки только если ничего не изменилось
Медленнее, чем попадание в кэш: требует обращения к серверу
Лучше всего подходит, когда согласованность критична, но вы всё равно хотите использовать кэширование

3. Аннулирование (Invalidation)

Когда ресурс изменяется, система пытается уведомить или очистить все кэшированные копии.
Это может быть вызвано POST, PUT, DELETE или пользовательскими сигналами.
Теоретически это гарантирует, что потребители не будут работать со старыми данными.

Наивысшая согласованность
Сложность масштабирования: сервер должен отслеживать, у кого есть ресурс
Недружелюбно к веб: HTTP не имеет состояния; аннулирование вне пути ненадёжно
Лучше всего подходит для: внутренних систем, приложений реального времени или установок на основе WebSocket

Также можно применять гибридные стратегии. Например, истечение срока действия + проверка, что позволит найти баланс между производительностью и корректностью в масштабе.
👍94👏2