METANIT.COM – Telegram
METANIT.COM
5.9K subscribers
1.68K photos
83 videos
9 files
1.05K links
Канал о программировании и разработке сайта metanit.com
Download Telegram
Асинхронная коммуникация и потеря данных
(описание к предыдущему посту)

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

1. Издатель отправляет событие, потом падает перед тем, как брокер подтвердит получение

2. Потребитель берет сообщени, потом падает перед обработкой

3. Потребитель обрабатывает сообщение, но запись в базу данных проходит неудачно без какого-нибудь уведомления

Как это предотвратить?

1. Постоянные очереди + синхронная отправка
Брокер сохраняет сообщение на диске перед подтверждением.
А издатель ждет подтверждения перед продолжением.

2. Режим подтверждения клиентом
Потребитель подтверждает сообщение только после успешной обработки.
Если потребитель упадет посередине процесса, сообщение останется в очереди для повторной попытки.

3. Поддержка последнего участника
Сообщение считается выполненным только тогда, когда данные надежно записаны.
Если вызов базы данных потерпел неудачу, подтверждение не отправляется.
👍3
К слову о "смерти" PHP - по некоторой статистике PHP используют более 74% веб-сайтов #php
🤣56👍7🤮7🤡2
This media is not supported in your browser
VIEW IN TELEGRAM
Сегментация памяти в программе на C/C++
👍12🔥1🥰1
В руководство по языку Си добавлена статья про Макрос перебора списков в стиле for-each
https://metanit.com/c/tutorial/12.5.php
#c_ansi
👍15🔥3👏1
Пример организации памяти программы на примере программы на Си
👍11🤔6👏1😁1
Организация памяти программы на C и структура сегментов (описание к картинке из предыдущего поста)

Структура памяти программы на языке C имеет чётко определённое устройство, которое организует различные типы данных и кода в отдельные сегменты в адресном пространстве процесса.

Каждый сегмент выполняет определённую функцию и обладает уникальными характеристиками, которые определяют, как происходит распределение, доступ и управление памятью во время выполнения программы.

Сегмент стека располагается в верхней части структуры памяти и растёт вниз при вызовах функций и создании локальных переменных. Этот сегмент содержит все локальные переменные, параметры функций и адреса возврата. При каждом вызове функции создаётся новый фрейм стека, который хранит её локальные данные.

В данном примере (картинка из предыдущего поста) сегмент стека хранит локальный массив x, содержащий значения {1, 7, 3}, а также такие переменные, как result, f и q, которые существуют в области видимости соответствующих функций.

Стек работает по принципу last-in-first-out (последним пришёл — первым ушёл), автоматически управляя выделением и освобождением памяти при вызовах и возврате функций. Когда выполняется функция main, она создаёт пространство для массива x и переменной result, в то время как функция f создаёт собственный фрейм стека, содержащий локальную переменную q, инициализированную значением 7.0.

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

Сегмент динамической памяти (heap) предоставляет возможности динамического распределения памяти, хотя в этом простом примере он не используется. Расположенный между стеком и нижними сегментами памяти, heap растёт вверх и позволяет программам запрашивать память во время выполнения с помощью функций malloc() и free().

Сегмент констант и глобальных переменных
хранит переменные, которые существуют на протяжении всего выполнения программы, например, глобальную переменную size со значением 3. Этот сегмент обычно содержит инициализированные глобальные переменные, статические переменные и строковые литералы, которые должны оставаться доступными из нескольких функций или на протяжении всего времени существования программы.

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

Функция f (картинка из предыдущего поста) демонстрирует простую реализацию, которая всегда возвращает значение 7.0 с помощью локальной переменной q, в то время как функция main организует поток программы, инициализируя массив, вызывая функцию f и сохраняя возвращённое значение.

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

https://metanit.com/c/tutorial/5.18.php
👍85👏1
Media is too big
VIEW IN TELEGRAM
Играть в футбол роботы пока не готовы
😁272🤮1
Шпаргалка по работе с f-строками в языке Python #python
👍7🔥5🤨2👏1🤮1
Разработчик из Amazon пожаловался, что уже год работает 30 минут в день. Он рассказывает, что уже год фактически не выполняет никакой реальной работы. Его команда полностью состоит из индийских инженеров, и, по его словам, они систематически избегают поручать ему серьезные задачи. Сначала он был раздражён и хотел перевестись в другую команду, но позже решил смириться и просто «сидеть на попе ровно», выполняя минимальный объём работы - примерно 30 минут в день, при этом продолжая получать полную зарплату.
https://www.teamblind.com/post/havent-done-any-work-in-a-year-at-amazon-ey2vyajr/46747093

Всем бы такие проблемы...
👍27🤣127🤯5😭3🤔2
Теорема CAP
(объяснение к предыдущему посту)

В распределённой системе невозможно получить всё сразу. Приходится идти на компромиссы.

Теорема CAP утверждает, что распределённая система в любой момент времени может гарантировать только два из трёх следующих свойств:

1. C — Согласованность (Consistency)
* Каждое чтение получает самые свежие записи или ошибку. Отсутствия устаревших данных.
* Большинство SQL-баз данных (например, PostgreSQL, MySQL) оптимизированы для строгой согласованности.

2. A — Доступность (Availability)
* Каждый запрос получает ответ, даже если данные могут быть не самыми актуальными.
* NoSQL-базы данных, такие как DynamoDB и Cassandra, часто отдают приоритет доступности над строгой согласованностью.

3. P — Отказоустойчивость при разделении (Partition Tolerance)
* Система продолжает работать даже при разделении сети (то есть при нарушении связи между узлами).
* Все реальные распределённые системы должны быть устойчивы к разделению.

Компромисс: выберите любые два

1. CP (Согласованность + Отказоустойчивость)
* Приоритет отдаётся точности данных. Система может отклонять запросы во время сетевых проблем для поддержания согласованности.

2. AP (Доступность + Отказоустойчивость)
* Приоритет отдаётся доступности. Система продолжает отвечать на запросы, даже если данные могут быть временно несогласованными.

3. CA (Согласованность + Доступность)
* Выглядит отлично на бумаге, но недостижимо в реальных распределённых системах, поскольку сетевые разделения неизбежны.

За пределами CAP: теорема PACELC

В то время как CAP фокусируется на поведении при сетевых сбоях, она игнорирует то, что происходит, когда система работает нормально.

Здесь на помощь приходит PACELC:
* Если происходит разделение (P) → вы выбираете между доступностью (A) и согласованностью (C)
* В противном случае (E) → вы выбираете между задержкой (L) и согласованностью (C)

Эта теорема признаёт, что даже когда система работает нормально, существует компромисс между задержкой и согласованностью.
103👍3
Индийский ИТ-специалист Сохам Парекх (Soham Parekh) исполнил мечту любого наемного работника – он научился не работать, но при этом регулярно получать зарплату. Он устраивался в различные компании, где в течение длительного времени не выполнял свои обязанности, но при этом стабильно получал зарплату.

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

Так продолжалось в течение четырех лет. За эти годы, по данным из открытых источников, Парекх успел стать частью коллектива около 80 компаний. Не исключено, что в некоторых из них он работал одновременно. Иногда он числился в штате сразу четырех-пяти различных организаций, не удосуживаясь уведомить об этом никого из работодателей. Причем некоторые нанимали его повторно.

Также у него было хорошо подготовленное резюме. По мнению ряда его работодателей, оно на 90% состояло из лжи, но, тем не менее, он вполне успешно устраивался во все новые фирмы.
https://timesofindia.indiatimes.com/technology/tech-news/theres-a-guy-named-soham-parekh-in-india-who-silicon-valley-ceo-exposes-the-moonlighting-scam-of-indian-techie/articleshow/122223553.cms
😎23😁16👏6💩2🍌2😐2👎1
Специалист по работе с данными из консалтинговой компании Capco Мохд Фарааз провёл эксперимент, предложив популярным ИИ-моделям угадать число от 1 до 50. Все они выбрали один и тот же вариант ответа.
Фарааз протестировал модели OpenAI ChatGPT, Anthropic Claude Sonnet 4, Google Gemini 2.5 Flash и Llama 4. Все они назвали в качестве ответа «27».
динственным исключением стал чат-бот Grok компании xAI. Он дал ответ «42»
https://mohdfaraaz.medium.com/llms-and-the-illusion-of-randomness-a-fun-ai-guessing-experiment-60ff82aa5f67
😁30🤣12🤡2👎1🤮1
Тестирование: типы и инструменты
🤨93👀3🔥1👏1
Из-за отсутствия финансирования закрылся российский государственный антивирусный сканер
Еще менее года назад - 14 августа 2024 сообщалось, что запущен государственный антивирусный сервис «Мультисканер», который должен быть стать аналогом virustotal. И вот теперь он прекратил свое функционирование из-за отсутствия финансирования.
https://www.cnews.ru/news/top/2025-07-03_iz-za_otsutstviya_finansirovaniya
😁25🤣21😢11🕊4👍2🙏2🤮1
Что на самом деле происходит при вводе URL в браузере
👍12
Что на самом деле происходит при вводе URL в браузере? Разберём этот процесс пошагово (к иллюстрации из предыдущего поста)

1. Вы вводите URL в браузер

Браузер принимает то, что вы ввели (например, http://example.com) и готовится получить этот веб-сайт. Но сначала ему нужно узнать, где находится сайт.

2. Браузер запрашивает IP-адрес у DNS-сервера

DNS работает как телефонная книга интернета. Он сообщает браузеру: «Этот домен находится по этому IP-адресу».

http://example.com93.184.216.34

3. Устанавливается TCP-соединение через этот IP

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

4. Браузер отправляет HTTP-запрос

Он отправляет сообщение вроде: «Привет, сервер, дай мне главную страницу этого сайта». Обычно это GET-запрос.

5. Веб-сервер получает данные

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

6. База данных отправляет данные обратно на сервер

Это могут быть посты в блоге, информация о продуктах, пользовательские данные — всё, что веб-сайту нужно показать динамически.

7. Сервер отвечает браузеру

Сервер отправляет обратно HTML, CSS, JavaScript и другой контент в ответ на запрос.

8. Браузер отображает контент

Наконец, браузер берёт все эти данные и создаёт веб-страницу, которую вы видите. При этом он может продолжать загружать изображения, стили и скрипты в фоновом режиме.
👏18❤‍🔥7👍72