ru
Feedback

Не попадитесь на канал ботавода! Telemetrio находит и помечает такие каналы 👉 Хотите видеть метку — оформите подписку

Frontend | Вопросы собесов

Frontend | Вопросы собесов

Открыть в Telegram

📈 Аналитический обзор Telegram-канала Frontend | Вопросы собесов

Канал Frontend | Вопросы собесов (@easy_javascript_ru) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 17 320 подписчиков, занимая 7 477 место в категории Технологии и приложения и 37 825 место в регионе Россия.

📊 Показатели аудитории и динамика

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

Согласно последним данным от 06 ноября, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -291, а за последние 24 часа — -11, при этом общий охват остаётся высоким.

  • Статус верификации: Не верифицирован
  • Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 6.55%. В первые 24 часа после публикации контент обычно набирает 4.40% реакций от общего числа подписчиков.
  • Охват публикаций: В среднем каждый пост получает 1 135 просмотров. В течение первых суток публикация набирает 763 просмотров.
  • Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 4.
  • Тематические интересы: Контент сосредоточен на ключевых темах, таких как ставь, браузер, html, border, flex.

📝 Описание и контентная политика

Автор описывает ресурс как площадку для выражения субъективного мнения:
“Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads”

Благодаря высокой частоте обновлений (последние данные получены 07 ноября, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.

17 320
Подписчики
-1124 часа
-857 дней
-29130 дней
Архив постов
\n\n🟠Redux в React\nЭто библиотека для управления состоянием в приложениях React, которая также предоставляет централизованный механизм для управления событиями и состоянием.\n// actions.js\nexport const setMessage = message => ({\n type: 'SET_MESSAGE',\n payload: message\n});\n\n// reducer.js\nconst initialState = {\n message: ''\n};\n\nconst reducer = (state = initialState, action) => {\n switch (action.type) {\n case 'SET_MESSAGE':\n return {\n ...state,\n message: action.payload\n };\n default:\n return state;\n }\n};\n\nexport default reducer;\n\n// store.js\nimport { createStore } from 'redux';\nimport reducer from './reducer';\n\nconst store = createStore(reducer);\n\nexport default store;\n\n// Component.js\nimport React from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { setMessage } from './actions';\n\nconst Component = () => {\n const message = useSelector(state => state.message);\n const dispatch = useDispatch();\n\n const handleChange = (event) => {\n dispatch(setMessage(event.target.value));\n };\n\n return (\n
\n \n

{message}

\n
\n );\n};\n\nexport default Component;\n\n🟠EventEmitter в Node.js\nВ Node.js можно использовать EventEmitter для централизованного управления событиями.\nconst EventEmitter = require('events');\nclass MyEmitter extends EventEmitter {}\n\nconst myEmitter = new MyEmitter();\n\n// Обработчик события\nmyEmitter.on('event', (message) => {\n console.log('Received:', message);\n});\n\n// Генерация события\nmyEmitter.emit('event', 'Hello, World!');\n\nСтавь 👍 и забирай 📚 Базу знаний","datePublished":"2024-11-23T09:10:08Z","dateModified":"2024-11-23T09:10:08Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":3,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":3942},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":13},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":22},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":3}]}},{"@type":"ListItem","position":7,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/867","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/867","mainEntityOfPage":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/867","headline":"🤔 Что такое dom дерево? DOM (Document Object Model) — это иерархическая структура, представляющая HTML-докуме…","articleBody":"🤔 Что такое dom дерево?\n\nDOM (Document Object Model) — это иерархическая структура, представляющая HTML-документ в виде дерева объектов. Каждый элемент страницы (тег, атрибут, текст) представлен как узел, что позволяет программно изменять структуру, стиль и содержимое документа. DOM — ключевая технология для работы с веб-страницами.\n\nСтавь 👍 если знал ответ, 🔥 если нет\nЗабирай 📚 Базу знаний","datePublished":"2024-11-22T16:10:10Z","dateModified":"2024-11-22T16:10:10Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":6,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":3743},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":29},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":9},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":6}]}},{"@type":"ListItem","position":8,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/866","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/866","mainEntityOfPage":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/866","headline":"Как среди востребованных профессий найти свою? Пройдите бесплатный тест и выясните, в каком направлении вы мо…","articleBody":"Как среди востребованных профессий найти свою?\n\nПройдите бесплатный тест и выясните, в каком направлении вы могли бы преуспеть прямо сейчас. \n\nУзнать больше\n\n#реклама \nform.typeform.com\nО рекламодателе","datePublished":"2024-11-22T12:07:15Z","dateModified":"2024-11-24T10:28:19Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":2502},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":1}]}},{"@type":"ListItem","position":9,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/865","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/865","mainEntityOfPage":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/865","headline":"🤔 В каких случаях однопоточность лучше многопоточности? Однопоточность и многопоточность имеют свои преимущес…","articleBody":"🤔 В каких случаях однопоточность лучше многопоточности? \n\nОднопоточность и многопоточность имеют свои преимущества и недостатки в различных сценариях. В зависимости от конкретной задачи и условий, однопоточность может быть предпочтительнее многопоточности. \n\n🟠Простота реализации и отладки\nОднопоточные приложения обычно проще разрабатывать и отлаживать, так как не нужно учитывать проблемы, связанные с синхронизацией и состоянием, такие как гонки данных, взаимные блокировки и другие сложности, возникающие при многопоточности. Простые скрипты и утилиты, которые выполняют линейную последовательность операций. Приложения, которые не требуют высокой производительности или быстрого времени отклика.\n\n🟠Отсутствие необходимости в параллелизме\nЕсли задача не требует параллельного выполнения или если она не может быть эффективно распараллелена, однопоточность может быть предпочтительнее, так как многопоточность не принесет значительных преимуществ. Задачи с высокой степенью последовательности, где каждый шаг зависит от завершения предыдущего шага. Приложения с низкой нагрузкой, где обработка данных занимает мало времени.\n\n🟠Ограниченные ресурсы\nВ некоторых системах ресурсы, такие как память и процессорное время, ограничены. Однопоточные приложения потребляют меньше ресурсов, так как они не требуют создания и управления несколькими потоками. Встроенные системы и устройства с ограниченными вычислительными ресурсами. Простые IoT устройства, где использование многопоточности может быть излишним.\n\n🟠Предсказуемость и детерминизм\nОднопоточные приложения имеют более предсказуемое поведение, так как отсутствует конкуренция между потоками. Это особенно важно для задач, где требуется строгая последовательность выполнения. Реализация алгоритмов, требующих строгой последовательности шагов. Критические системы, где некорректное выполнение может привести к серьезным последствиям.\n\n🟠Избежание накладных расходов\nУправление потоками имеет свои накладные расходы: создание, переключение контекста и синхронизация потоков. В некоторых случаях эти накладные расходы могут перевесить преимущества многопоточности. Приложения с короткими и нечастыми задачами, где накладные расходы на многопоточность не оправданы. Приложения, работающие в условиях высокой конкуренции за ресурсы, где использование нескольких потоков может привести к деградации производительности.\n\n🚩Примеры в реальной жизни\n\n🟠Однопоточное веб-приложение на Node.js\nNode.js использует однопоточную модель с событиями и обратными вызовами для обработки запросов. Благодаря асинхронной модели ввода-вывода, Node.js может эффективно обрабатывать большое количество одновременных соединений, не создавая новые потоки для каждого запроса.\nconst http = require('http');\n\nconst server = http.createServer((req, res) => {\n res.writeHead(200, { 'Content-Type': 'text/plain' });\n res.end('Hello, world!\\n');\n});\n\nserver.listen(3000, () => {\n console.log('Server running at http://localhost:3000/');\n});\n\n🟠Однопоточное приложение на Python\nДля простых задач, таких как чтение и обработка файла, однопоточность может быть вполне достаточной и проще в реализации.\ndef process_file(file_path):\n with open(file_path, 'r') as file:\n data = file.read()\n # Обработка данных\n print(data)\n\nif __name__ == '__main__':\n process_file('example.txt')\n\nСтавь 👍 и забирай 📚 Базу знаний","datePublished":"2024-11-22T09:10:07Z","dateModified":"2024-11-22T09:10:07Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":5,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":3891},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":9},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":17},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":5}]}},{"@type":"ListItem","position":10,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/864","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/864","mainEntityOfPage":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/864","headline":"🤔Различие методов call apply bind? Методы `call` и `apply` выполняют функцию с заданным контекстом `this`, но…","articleBody":"🤔Различие методов call apply bind?\n\nМетоды `call` и `apply` выполняют функцию с заданным контекстом `this`, но `call` принимает аргументы по отдельности, а `apply` — в виде массива. Метод `bind` возвращает новую функцию с предустановленным значением `this`, которую можно вызвать позже. В отличие от `call` и `apply`, `bind` не вызывает функцию немедленно. `bind` часто используется для создания копий функций с привязкой контекста.\n\nСтавь 👍 если знал ответ, 🔥 если нет\nЗабирай 📚 Базу знаний","datePublished":"2024-11-21T16:10:07Z","dateModified":"2024-11-21T16:10:07Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":3978},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":30},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":15}]}},{"@type":"ListItem","position":11,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/863","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/863","mainEntityOfPage":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/863","headline":"Яндекс Музыка до конца года бесплатно! Подписка Яндекс Плюс для вас и 3-х близких до конца года бесплатно! Сл…","articleBody":"Яндекс Музыка до конца года бесплатно!\n\nПодписка Яндекс Плюс для вас и 3-х близких до конца года бесплатно! \nСлушайте музыку, смотрите фильмы и читайте книги в одной подписке.\nПопробуйте!👍 \n\nПопробовать\n\n#реклама 18+\nplus.yandex.ru\nО рекламодателе","datePublished":"2024-11-21T13:07:40Z","dateModified":"2024-11-23T11:28:25Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":1,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":2537},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1}]}},{"@type":"ListItem","position":12,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/862","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/862","mainEntityOfPage":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/862","headline":"🤔 Что такое инверсия управления? Это принцип программирования, который передает управление выполнением програ…","articleBody":"🤔 Что такое инверсия управления? \n\nЭто принцип программирования, который передает управление выполнением программы из рук разработчика в руки фреймворка или контейнера. IoC позволяет создавать более гибкие, расширяемые и тестируемые приложения за счет отделения бизнес-логики от деталей инфраструктуры.\n\n🚩Идеи инверсии управления\n\n🟠Отделение логики приложения от деталей реализации\nВ традиционном подходе компоненты создают и управляют своими зависимостями напрямую. С IoC компоненты делегируют эту ответственность внешней системе.\n\n🟠Улучшение модульности и повторного использования\nКомпоненты становятся более независимыми и легко заменяемыми, что способствует повторному использованию и тестируемости.\n\n🚩Реализация\n\nIoC может быть реализована несколькими способами, в том числе через Dependency Injection (внедрение зависимостей) и Service Locator (локатор служб).\n\n🟠Dependency Injection (DI)\nЭто наиболее распространенный способ реализации IoC, где зависимости объекта передаются ему извне, а не создаются внутри. Пример на Java с использованием Spring. В этом примере Spring фреймворк автоматически внедряет зависимость Repository в Service через конструктор.\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class Service {\n\n private final Repository repository;\n\n @Autowired\n public Service(Repository repository) {\n this.repository = repository;\n }\n\n public void performAction() {\n repository.doSomething();\n }\n}\n\n🟠Service Locator\nЭто шаблон проектирования, который предоставляет центральное место для получения зависимостей. Компоненты запрашивают зависимости у локатора служб, вместо того чтобы создавать их напрямую. Пример на Java:\npublic class ServiceLocator {\n\n private static final Map, Object> services = new HashMap<>();\n\n public static void registerService(Class serviceClass, T service) {\n services.put(serviceClass, service);\n }\n\n public static T getService(Class serviceClass) {\n return serviceClass.cast(services.get(serviceClass));\n }\n}\n\n// Использование Service Locator\nServiceLocator.registerService(Repository.class, new RepositoryImpl());\n\nRepository repository = ServiceLocator.getService(Repository.class);\nrepository.doSomething();\n\n🚩Плюсы\n\n➕Улучшение тестируемости\nIoC позволяет легко заменять реальные зависимости на моки или стабы в тестах.\n\n➕Уменьшение связности кода\nКомпоненты становятся менее зависимыми друг от друга, что упрощает их замену и модификацию.\n\n➕Повышение гибкости и расширяемости\nЛегко добавлять новые зависимости или изменять существующие без изменения кода, использующего эти зависимости.\n\n➕Явное управление зависимостями\nЗависимости становятся явными, что улучшает понимание и документирование системы.\n\nСтавь 👍 и забирай 📚 Базу знаний","datePublished":"2024-11-21T09:10:11Z","dateModified":"2024-11-21T09:10:11Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":3,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":3974},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":5},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":18},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":3}]}},{"@type":"ListItem","position":13,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/861","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/861","mainEntityOfPage":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/861","headline":"– Помощь с pet-проектом – Составление roadmap – Общая консультация – Проведение код-ревью и mock-собеседовани…","articleBody":"– Помощь с pet-проектом\n– Составление roadmap\n– Общая консультация\n– Проведение код-ревью и mock-собеседования\n– Помощь с трудоустройством\n\nВсе это и многое другое может Ментор. Он обеспечит вам необходимый boost, ускорит и упростит вход в IT.\n\n🔥 Здесь размещен список менторов, и многие из них предлагают бесплатную первую консультацию","datePublished":"2024-11-20T19:29:17Z","dateModified":"2024-11-22T19:29:25Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":2610},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":11}]}},{"@type":"ListItem","position":14,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/860","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/860","mainEntityOfPage":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/860","headline":"– Помощь с pet-проектом – Составление roadmap – Общая консультация – Проведение код-ревью и mock-собеседовани…","articleBody":"– Помощь с pet-проектом\n– Составление roadmap\n– Общая консультация\n– Проведение код-ревью и mock-собеседования\n– Помощь с трудоустройством\n\nВсе это и многое другое может Ментор. Он обеспечит вам необходимый boost, ускорит и упростит вход в IT.\n\n🔥 Здесь размещен список менторов, и многие из них предлагают бесплатную первую консультацию","datePublished":"2024-11-20T19:22:40Z","dateModified":"2024-11-20T19:23:47Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":1}]}},{"@type":"ListItem","position":15,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/859","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/859","mainEntityOfPage":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/859","headline":"🤔 Что такое promise и какие состояния у него есть? Promise в JavaScript — это объект, который представляет ре…","articleBody":"🤔 Что такое promise и какие состояния у него есть?\n\nPromise в JavaScript — это объект, который представляет результат асинхронной операции. Он может находиться в одном из трёх состояний: pending (ожидание), fulfilled (выполнено) и rejected (отклонено). Fulfilled означает, что операция завершилась успешно, а rejected — что произошла ошибка. Это удобный способ работы с асинхронным кодом и упрощает обработку результатов таких операций.\n\nСтавь 👍 если знал ответ, 🔥 если нет\nЗабирай 📚Базу Знаний","datePublished":"2024-11-20T16:10:08Z","dateModified":"2024-11-20T16:10:08Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":3986},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":27},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":24}]}},{"@type":"ListItem","position":16,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/858","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/858","mainEntityOfPage":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/858","headline":"Старшеклассники, залетайте на PROD Это олимпиада по промышленной разработке с призами от Т-Банка, Центральног…","articleBody":"Старшеклассники, залетайте на PROD\n\nЭто олимпиада по промышленной разработке с призами от Т-Банка, Центрального университета и НИУ ВШЭ. Тут можно прокачаться в программировании на реальных ИТ-задачах. \n\nПобедители получат один из призов — грант или скидку на обучение в вузе или упрощенный отбор на стажировку в Т-Банке.\n\nДля участия хватит логики и школьных знаний по информатике. Успей зарегистрироваться до 3 декабря. \n\nУзнать больше\n\n#реклама \nprodcontest.ru\nО рекламодателе","datePublished":"2024-11-20T14:07:22Z","dateModified":"2024-11-22T12:09:50Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":2582}]}},{"@type":"ListItem","position":17,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/857","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/857","mainEntityOfPage":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/857","headline":"🤔 Что такое di? Это паттерн проектирования, который используется для управления зависимостями в программном о…","articleBody":"🤔 Что такое di? \n\nЭто паттерн проектирования, который используется для управления зависимостями в программном обеспечении. Суть этого паттерна заключается в том, что объект получает свои зависимости извне, а не создаёт их сам. Это способствует более гибкому, легко тестируемому и поддерживаемому коду.\n\n🚩Принципы \n\n🟠Инверсия управления (Inversion of Control, IoC)\nПринцип, согласно которому объект делегирует управление своими зависимостями внешнему источнику.\n\n🟠Внедрение зависимостей (Dependency Injection)\nКонкретная реализация инверсии управления, при которой зависимости передаются объекту через конструктор, методы или свойства.\n\n🚩Способы внедрения зависимостей\n\n🟠Внедрение через конструктор\nЗависимости передаются объекту через параметры его конструктора. Пример на Java:\npublic class Service {\nprivate final Repository repository;\n\npublic Service(Repository repository) {\nthis.repository = repository;\n}\n\npublic void performAction() {\nrepository.doSomething();\n}\n}\n\n🟠Внедрение через сеттеры\nЗависимости передаются объекту через методы-сеттеры после его создания. Пример на Java:\npublic class Service {\nprivate Repository repository;\n\npublic void setRepository(Repository repository) {\nthis.repository = repository;\n}\n\npublic void performAction() {\nrepository.doSomething();\n}\n}\n\n🟠Внедрение через интерфейсы\nЗависимости передаются объекту через методы, определённые в интерфейсах. Пример на TypeScript:\ninterface IRepository {\ndoSomething(): void;\n}\n\nclass Repository implements IRepository {\ndoSomething() {\nconsole.log(\"Doing something...\");\n}\n}\n\nclass Service {\nprivate repository: IRepository;\n\nconstructor(repository: IRepository) {\nthis.repository = repository;\n}\n\nperformAction() {\nthis.repository.doSomething();\n}\n}\n\nconst repository = new Repository();\nconst service = new Service(repository);\nservice.performAction();\n\n🚩Плюсы\n\n➕Улучшение тестируемости\nКод становится более модульным и тестируемым, так как зависимости можно легко заменять на моки или стабы в тестах.\n\n➕Улучшение поддерживаемости\nУменьшается связность кода, что упрощает его поддержку и модификацию.\n\n➕Улучшение гибкости\nЛегче менять реализации зависимостей, не изменяя код, который их использует.\n\n➕Явное указание зависимостей\nЗависимости объектов становятся явными, что улучшает понимание кода.\n\n🚩Минусы\n\n➖Усложнение кода\nВнедрение DI может усложнить код, особенно если используется слишком много уровней абстракции.\n➖Кривая обучения\nПонимание и правильное использование DI может потребовать времени и обучения, особенно для разработчиков, незнакомых с паттерном.\n➖Перегрузка конструкции\nПри внедрении большого числа зависимостей через конструктор конструктор может стать перегруженным.\n\nСтавь 👍 и забирай 📚 Базу знаний","datePublished":"2024-11-20T09:10:12Z","dateModified":"2024-11-20T09:10:12Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":2,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":3923},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":9},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":19},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2}]}},{"@type":"ListItem","position":18,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/856","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/856","mainEntityOfPage":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/856","headline":"🤔 Как оцениваешь трудность? Трудность задачи оценивается на основе её объёма, сложности требований, уровня не…","articleBody":"🤔 Как оцениваешь трудность? \n\nТрудность задачи оценивается на основе её объёма, сложности требований, уровня неопределённости и необходимых навыков. \nТакже учитываются сроки выполнения, доступные ресурсы и возможные риски. \nТочный уровень определяется в зависимости от контекста и опыта команды или разработчика. \n\nСтавь 👍 если знал ответ, 🔥 если нет\nЗабирай 📚 Базу знаний","datePublished":"2024-11-19T16:10:13Z","dateModified":"2024-11-19T16:10:13Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":4,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":3818},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":27},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":16},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":4}]}},{"@type":"ListItem","position":19,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/855","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/855","mainEntityOfPage":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/855","headline":"Сообщество IT-специалистов в Telegram от Selectel. Канал крупнейшего независимого провайдера IT-инфраструктур…","articleBody":"Сообщество IT-специалистов в Telegram от Selectel.\n\nКанал крупнейшего независимого провайдера IT-инфраструктуры и облаков.\n\nШесть причин подписаться на канал:\n- железные новости;\n- обзоры продуктов;\n- разборы кейсов;\n- актуальные IT-статьи;\n- анонсы митапов;\n- бесплатные курсы. \n\nПодписаться\n\n#реклама \nО рекламодателе","datePublished":"2024-11-19T14:07:02Z","dateModified":"2024-11-21T12:07:08Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":1,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":2552},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":1},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1}]}},{"@type":"ListItem","position":20,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/854","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/854","mainEntityOfPage":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru/posts/854","headline":"🤔 Что такое симметричная и ассиметричная криптография? Это два основных подхода к шифрованию данных. Они разл…","articleBody":"🤔 Что такое симметричная и ассиметричная криптография? \n\nЭто два основных подхода к шифрованию данных. Они различаются по способу использования ключей для шифрования и дешифрования.\n\n🚩Симметричная криптография\n\nИспользует один и тот же ключ как для шифрования, так и для дешифрования данных. Этот ключ должен быть известен как отправителю, так и получателю, что требует безопасного способа передачи ключа между ними.\nfrom Crypto.Cipher import AES\nfrom Crypto.Random import get_random_bytes\n\n# Генерация ключа\nkey = get_random_bytes(16) # 16 байт = 128 бит\n\n# Создание шифра\ncipher = AES.new(key, AES.MODE_EAX)\n\n# Шифрование данных\ndata = b'Secret message'\nnonce = cipher.nonce\nciphertext, tag = cipher.encrypt_and_digest(data)\n\nprint(f'Ciphertext: {ciphertext}')\n\n# Дешифрование данных\ncipher = AES.new(key, AES.MODE_EAX, nonce=nonce)\nplaintext = cipher.decrypt_and_verify(ciphertext, tag)\n\nprint(f'Plaintext: {plaintext}')\n\n🚩Асимметричная криптография\n\nИспользует пару ключей: открытый ключ и закрытый ключ. Открытый ключ используется для шифрования данных и может быть свободно распространяем, в то время как закрытый ключ используется для дешифрования и должен оставаться в секрете. Это решает проблему передачи ключей, так как отправитель может зашифровать данные открытым ключом получателя, а только получатель сможет расшифровать их с помощью своего закрытого ключа.\nfrom cryptography.hazmat.primitives.asymmetric import rsa\nfrom cryptography.hazmat.primitives import serialization\nfrom cryptography.hazmat.primitives.asymmetric import padding\nfrom cryptography.hazmat.primitives import hashes\n\n# Генерация пары ключей\nprivate_key = rsa.generate_private_key(\n public_exponent=65537,\n key_size=2048,\n)\n\npublic_key = private_key.public_key()\n\n# Шифрование данных\nmessage = b'Secret message'\nciphertext = public_key.encrypt(\n message,\n padding.OAEP(\n mgf=padding.MGF1(algorithm=hashes.SHA256()),\n algorithm=hashes.SHA256(),\n label=None\n )\n)\n\nprint(f'Ciphertext: {ciphertext}')\n\n# Дешифрование данных\nplaintext = private_key.decrypt(\n ciphertext,\n padding.OAEP(\n mgf=padding.MGF1(algorithm=hashes.SHA256()),\n algorithm=hashes.SHA256(),\n label=None\n )\n)\n\nprint(f'Plaintext: {plaintext}')\n\n\n🚩Сравнение симметричной и асимметричной криптографии\n\n🟠Ключи\nСимметричная: Один ключ для шифрования и дешифрования.\nАсимметричная: Пара ключей — открытый для шифрования и закрытый для дешифрования.\n\n🟠Безопасность\nСимметричная: Требует безопасной передачи ключа, что может быть сложно.\nАсимметричная: Обеспечивает безопасную передачу ключей через использование открытого ключа.\n\nСтавь 👍 и забирай 📚 Базу знаний","datePublished":"2024-11-19T09:10:09Z","dateModified":"2024-11-19T09:10:09Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/ru/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":1,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":3787},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":4},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":18},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1}]}}]}
🤔 Как делается http запрос? HTTP-запрос состоит из строки запроса (метод, URL, версия протокола), заголовков (метаинформация) и тела (опционально, для передачи данных). Клиент отправляет запрос серверу, который возвращает ответ с кодом состояния, заголовками и телом. Это стандартный механизм обмена данными в веб-приложениях. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Школьник + бесплатные курсы по ИТ = новые возможности Хотите прокачать мышление, научиться решать задачи по математике и инфо
Школьник + бесплатные курсы по ИТ = новые возможности Хотите прокачать мышление, научиться решать задачи по математике и информатике и познакомиться с ИТ? Бесплатные курсы для школьников в этом помогут. Занятия включают теорию и практические задачи, а само обучение не будет отнимать много времени - нужно 2-3 часа в неделю. После успешного прохождения одного из курсов вам выдадут сертификат - им можно пополнить портфолио. Чтобы начать учиться, выберите подходящую программу и оставьте заявку на сайте Т-Образования. Подать заявку #реклама 16+ education.tbank.ru О рекламодателе

🤔 Что такое wrapper компонента? Это компонент-обертка, который используется для обертывания других компонентов, предоставляя им дополнительные возможности или изменяя их поведение без изменения их исходного кода. Wrapper-компоненты часто используются в React для повторного использования логики, управления состоянием, стилизации и других целей. 🚩Задачи 🟠Повторное использование логики Обертка может инкапсулировать общую логику, которая должна быть доступна нескольким компонентам. 🟠Добавление функциональности Wrapper-компоненты могут добавлять новые функциональные возможности к обернутым компонентам. 🟠Стилизация Обертка может использоваться для применения стилей к компонентам или для организации их в определенной структуре. 🟠Управление состоянием Wrapper-компоненты могут управлять состоянием, которое затем передается обернутым компонентам через пропсы. 🚩Примеры использования 🟠Простая обертка для стилизации Рассмотрим пример, где мы создаем обертку для применения стилей к любому компоненту.
import React from 'react';

// Wrapper-компонент для стилизации
const StyledWrapper = (props) => {
  const style = {
    border: '1px solid black',
    padding: '10px',
    margin: '10px'
  };

  return <div style={style}>{props.children}</div>;
};

// Компонент для обертки
const Content = () => {
  return <p>This is some content inside a styled wrapper.</p>;
};

// Использование Wrapper-компонента
const App = () => {
  return (
    <StyledWrapper>
      <Content />
    </StyledWrapper>
  );
};

export default App;
🟠Wrapper-компонент для управления состоянием Рассмотрим пример, где обертка управляет состоянием и передает его обернутому компоненту через пропсы.
import React, { useState } from 'react';

// Wrapper-компонент для управления состоянием
const StateWrapper = (WrappedComponent) => {
  return (props) => {
    const [count, setCount] = useState(0);

    const increment = () => {
      setCount(count + 1);
    };

    return (
      <WrappedComponent count={count} increment={increment} {...props} />
    );
  };
};

// Обычный компонент
const Counter = ({ count, increment }) => {
  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={increment}>Increment</button>
    </div>
  );
};

// Использование Wrapper-компонента
const EnhancedCounter = StateWrapper(Counter);

const App = () => {
  return <EnhancedCounter />;
};

export default App;
🟠Wrapper-компонент для авторизации Рассмотрим пример, где обертка проверяет, авторизован ли пользователь, и отображает либо обернутый компонент, либо сообщение о необходимости авторизации.
import React from 'react';

// Wrapper-компонент для проверки авторизации
const withAuth = (WrappedComponent) => {
  return (props) => {
    const isAuthenticated = /* логика проверки авторизации */ true;

    if (!isAuthenticated) {
      return <p>Please log in to view this content.</p>;
    }

    return <WrappedComponent {...props} />;
  };
};

// Обычный компонент
const Dashboard = () => {
  return <h1>Welcome to the Dashboard</h1>;
};

// Использование Wrapper-компонента
const ProtectedDashboard = withAuth(Dashboard);

const App = () => {
  return <ProtectedDashboard />;
};

export default App;
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое rest api? REST API — это архитектурный стиль взаимодействия между системами, основанный на протоколе HTTP. Он использует стандартные методы, такие как GET, POST, PUT и DELETE, для работы с ресурсами, представляемыми в виде URL. REST API обеспечивает простую и гибкую интеграцию между клиентом и сервером. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Яндекс Директ Только этой осенью Яндекс Директ добавит до 20 000 ₽ на рекламу для вашего бизнеса ⚡ Узнать больше #реклама yandex.ru О рекламодателе

🤔 Для чего нужен централизованный режим событий? Это подход к управлению событиями в приложениях, который подразумевает обработку всех событий в одном месте или с использованием единого механизма. Это помогает упростить управление событиями, повысить поддерживаемость и улучшить масштабируемость приложения. Этот подход особенно полезен в сложных приложениях, где множество компонентов взаимодействуют друг с другом через события. 🚩Плюсы ➕Упрощение управления событиями ➕Повышение поддерживаемости ➕Масштабируемость ➕Избежание дублирования кода ➕Лучшая организация взаимодействия между компонентами 🚩Примеры централизованного режима событий: 🟠Vue.js и Vuex В приложениях, использующих Vue.js, централизованное управление состоянием и событиями часто реализуется с помощью Vuex. Vuex позволяет управлять состоянием приложения и событиями в одном месте.
// store.js
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    message: ''
  },
  mutations: {
    setMessage(state, message) {
      state.message = message;
    }
  },
  actions: {
    updateMessage({ commit }, message) {
      commit('setMessage', message);
    }
  }
});

// Component.vue
<template>
  <div>
    <input v-model="message" @input="updateMessage(message)">
    <p>{{ message }}</p>
  </div>
</template>

<script>
import { mapState, mapActions } from 'vuex';

export default {
  computed: {
    ...mapState(['message'])
  },
  methods: {
    ...mapActions(['updateMessage'])
  }
};
</script>
🟠Redux в React Это библиотека для управления состоянием в приложениях React, которая также предоставляет централизованный механизм для управления событиями и состоянием.
// actions.js
export const setMessage = message => ({
  type: 'SET_MESSAGE',
  payload: message
});

// reducer.js
const initialState = {
  message: ''
};

const reducer = (state = initialState, action) => {
  switch (action.type) {
    case 'SET_MESSAGE':
      return {
        ...state,
        message: action.payload
      };
    default:
      return state;
  }
};

export default reducer;

// store.js
import { createStore } from 'redux';
import reducer from './reducer';

const store = createStore(reducer);

export default store;

// Component.js
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { setMessage } from './actions';

const Component = () => {
  const message = useSelector(state => state.message);
  const dispatch = useDispatch();

  const handleChange = (event) => {
    dispatch(setMessage(event.target.value));
  };

  return (
    <div>
      <input value={message} onChange={handleChange} />
      <p>{message}</p>
    </div>
  );
};

export default Component;
🟠EventEmitter в Node.js В Node.js можно использовать EventEmitter для централизованного управления событиями.
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

// Обработчик события
myEmitter.on('event', (message) => {
  console.log('Received:', message);
});

// Генерация события
myEmitter.emit('event', 'Hello, World!');
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое dom дерево? DOM (Document Object Model) — это иерархическая структура, представляющая HTML-документ в виде дерева объектов. Каждый элемент страницы (тег, атрибут, текст) представлен как узел, что позволяет программно изменять структуру, стиль и содержимое документа. DOM — ключевая технология для работы с веб-страницами. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Как среди востребованных профессий найти свою? Пройдите бесплатный тест и выясните, в каком направлении вы могли бы преуспеть
Как среди востребованных профессий найти свою? Пройдите бесплатный тест и выясните, в каком направлении вы могли бы преуспеть прямо сейчас. Узнать больше #реклама form.typeform.com О рекламодателе

🤔 В каких случаях однопоточность лучше многопоточности? Однопоточность и многопоточность имеют свои преимущества и недостатки в различных сценариях. В зависимости от конкретной задачи и условий, однопоточность может быть предпочтительнее многопоточности. 🟠Простота реализации и отладки Однопоточные приложения обычно проще разрабатывать и отлаживать, так как не нужно учитывать проблемы, связанные с синхронизацией и состоянием, такие как гонки данных, взаимные блокировки и другие сложности, возникающие при многопоточности. Простые скрипты и утилиты, которые выполняют линейную последовательность операций. Приложения, которые не требуют высокой производительности или быстрого времени отклика. 🟠Отсутствие необходимости в параллелизме Если задача не требует параллельного выполнения или если она не может быть эффективно распараллелена, однопоточность может быть предпочтительнее, так как многопоточность не принесет значительных преимуществ. Задачи с высокой степенью последовательности, где каждый шаг зависит от завершения предыдущего шага. Приложения с низкой нагрузкой, где обработка данных занимает мало времени. 🟠Ограниченные ресурсы В некоторых системах ресурсы, такие как память и процессорное время, ограничены. Однопоточные приложения потребляют меньше ресурсов, так как они не требуют создания и управления несколькими потоками. Встроенные системы и устройства с ограниченными вычислительными ресурсами. Простые IoT устройства, где использование многопоточности может быть излишним. 🟠Предсказуемость и детерминизм Однопоточные приложения имеют более предсказуемое поведение, так как отсутствует конкуренция между потоками. Это особенно важно для задач, где требуется строгая последовательность выполнения. Реализация алгоритмов, требующих строгой последовательности шагов. Критические системы, где некорректное выполнение может привести к серьезным последствиям. 🟠Избежание накладных расходов Управление потоками имеет свои накладные расходы: создание, переключение контекста и синхронизация потоков. В некоторых случаях эти накладные расходы могут перевесить преимущества многопоточности. Приложения с короткими и нечастыми задачами, где накладные расходы на многопоточность не оправданы. Приложения, работающие в условиях высокой конкуренции за ресурсы, где использование нескольких потоков может привести к деградации производительности. 🚩Примеры в реальной жизни 🟠Однопоточное веб-приложение на Node.js Node.js использует однопоточную модель с событиями и обратными вызовами для обработки запросов. Благодаря асинхронной модели ввода-вывода, Node.js может эффективно обрабатывать большое количество одновременных соединений, не создавая новые потоки для каждого запроса.
const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello, world!\n');
});

server.listen(3000, () => {
  console.log('Server running at http://localhost:3000/');
});
🟠Однопоточное приложение на Python Для простых задач, таких как чтение и обработка файла, однопоточность может быть вполне достаточной и проще в реализации.
def process_file(file_path):
    with open(file_path, 'r') as file:
        data = file.read()
        # Обработка данных
        print(data)

if __name__ == '__main__':
    process_file('example.txt')
Ставь 👍 и забирай 📚 Базу знаний

🤔Различие методов call apply bind? Методы `call` и `apply` выполняют функцию с заданным контекстом `this`, но `call` принимает аргументы по отдельности, а `apply` — в виде массива. Метод `bind` возвращает новую функцию с предустановленным значением `this`, которую можно вызвать позже. В отличие от `call` и `apply`, `bind` не вызывает функцию немедленно. `bind` часто используется для создания копий функций с привязкой контекста. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Яндекс Музыка до конца года бесплатно! Подписка Яндекс Плюс для вас и 3-х близких до конца года бесплатно! Слушайте музыку, смотрите фильмы и читайте книги в одной подписке. Попробуйте!👍 Попробовать #реклама 18+ plus.yandex.ru О рекламодателе

🤔 Что такое инверсия управления? Это принцип программирования, который передает управление выполнением программы из рук разработчика в руки фреймворка или контейнера. IoC позволяет создавать более гибкие, расширяемые и тестируемые приложения за счет отделения бизнес-логики от деталей инфраструктуры. 🚩Идеи инверсии управления 🟠Отделение логики приложения от деталей реализации В традиционном подходе компоненты создают и управляют своими зависимостями напрямую. С IoC компоненты делегируют эту ответственность внешней системе. 🟠Улучшение модульности и повторного использования Компоненты становятся более независимыми и легко заменяемыми, что способствует повторному использованию и тестируемости. 🚩Реализация IoC может быть реализована несколькими способами, в том числе через Dependency Injection (внедрение зависимостей) и Service Locator (локатор служб). 🟠Dependency Injection (DI) Это наиболее распространенный способ реализации IoC, где зависимости объекта передаются ему извне, а не создаются внутри. Пример на Java с использованием Spring. В этом примере Spring фреймворк автоматически внедряет зависимость Repository в Service через конструктор.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Service {

    private final Repository repository;

    @Autowired
    public Service(Repository repository) {
        this.repository = repository;
    }

    public void performAction() {
        repository.doSomething();
    }
}
🟠Service Locator Это шаблон проектирования, который предоставляет центральное место для получения зависимостей. Компоненты запрашивают зависимости у локатора служб, вместо того чтобы создавать их напрямую. Пример на Java:
public class ServiceLocator {

    private static final Map<Class<?>, Object> services = new HashMap<>();

    public static <T> void registerService(Class<T> serviceClass, T service) {
        services.put(serviceClass, service);
    }

    public static <T> T getService(Class<T> serviceClass) {
        return serviceClass.cast(services.get(serviceClass));
    }
}

// Использование Service Locator
ServiceLocator.registerService(Repository.class, new RepositoryImpl());

Repository repository = ServiceLocator.getService(Repository.class);
repository.doSomething();
🚩Плюсы ➕Улучшение тестируемости IoC позволяет легко заменять реальные зависимости на моки или стабы в тестах. ➕Уменьшение связности кода Компоненты становятся менее зависимыми друг от друга, что упрощает их замену и модификацию. ➕Повышение гибкости и расширяемости Легко добавлять новые зависимости или изменять существующие без изменения кода, использующего эти зависимости. ➕Явное управление зависимостями Зависимости становятся явными, что улучшает понимание и документирование системы. Ставь 👍 и забирай 📚 Базу знаний

– Помощь с pet-проектом – Составление roadmap – Общая консультация – Проведение код-ревью и mock-собеседования – Помощь с тру
– Помощь с pet-проектом – Составление roadmap – Общая консультация – Проведение код-ревью и mock-собеседования – Помощь с трудоустройством Все это и многое другое может Ментор. Он обеспечит вам необходимый boost, ускорит и упростит вход в IT. 🔥 Здесь размещен список менторов, и многие из них предлагают бесплатную первую консультацию

– Помощь с pet-проектом – Составление roadmap – Общая консультация – Проведение код-ревью и mock-собеседования – Помощь с тру
– Помощь с pet-проектом – Составление roadmap – Общая консультация – Проведение код-ревью и mock-собеседования – Помощь с трудоустройством Все это и многое другое может Ментор. Он обеспечит вам необходимый boost, ускорит и упростит вход в IT. 🔥 Здесь размещен список менторов, и многие из них предлагают бесплатную первую консультацию

🤔 Что такое promise и какие состояния у него есть? Promise в JavaScript — это объект, который представляет результат асинхронной операции. Он может находиться в одном из трёх состояний: pending (ожидание), fulfilled (выполнено) и rejected (отклонено). Fulfilled означает, что операция завершилась успешно, а rejected — что произошла ошибка. Это удобный способ работы с асинхронным кодом и упрощает обработку результатов таких операций. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚Базу Знаний

Старшеклассники, залетайте на PROD Это олимпиада по промышленной разработке с призами от Т-Банка, Центрального университета и
Старшеклассники, залетайте на PROD Это олимпиада по промышленной разработке с призами от Т-Банка, Центрального университета и НИУ ВШЭ. Тут можно прокачаться в программировании на реальных ИТ-задачах. Победители получат один из призов — грант или скидку на обучение в вузе или упрощенный отбор на стажировку в Т-Банке. Для участия хватит логики и школьных знаний по информатике. Успей зарегистрироваться до 3 декабря. Узнать больше #реклама prodcontest.ru О рекламодателе

🤔 Что такое di? Это паттерн проектирования, который используется для управления зависимостями в программном обеспечении. Суть этого паттерна заключается в том, что объект получает свои зависимости извне, а не создаёт их сам. Это способствует более гибкому, легко тестируемому и поддерживаемому коду. 🚩Принципы 🟠Инверсия управления (Inversion of Control, IoC) Принцип, согласно которому объект делегирует управление своими зависимостями внешнему источнику. 🟠Внедрение зависимостей (Dependency Injection) Конкретная реализация инверсии управления, при которой зависимости передаются объекту через конструктор, методы или свойства. 🚩Способы внедрения зависимостей 🟠Внедрение через конструктор Зависимости передаются объекту через параметры его конструктора. Пример на Java:
public class Service {
private final Repository repository;

public Service(Repository repository) {
this.repository = repository;
}

public void performAction() {
repository.doSomething();
}
}
🟠Внедрение через сеттеры Зависимости передаются объекту через методы-сеттеры после его создания. Пример на Java:
public class Service {
private Repository repository;

public void setRepository(Repository repository) {
this.repository = repository;
}

public void performAction() {
repository.doSomething();
}
}
🟠Внедрение через интерфейсы Зависимости передаются объекту через методы, определённые в интерфейсах. Пример на TypeScript:
interface IRepository {
doSomething(): void;
}

class Repository implements IRepository {
doSomething() {
console.log("Doing something...");
}
}

class Service {
private repository: IRepository;

constructor(repository: IRepository) {
this.repository = repository;
}

performAction() {
this.repository.doSomething();
}
}

const repository = new Repository();
const service = new Service(repository);
service.performAction();
🚩Плюсы ➕Улучшение тестируемости Код становится более модульным и тестируемым, так как зависимости можно легко заменять на моки или стабы в тестах. ➕Улучшение поддерживаемости Уменьшается связность кода, что упрощает его поддержку и модификацию. ➕Улучшение гибкости Легче менять реализации зависимостей, не изменяя код, который их использует. ➕Явное указание зависимостей Зависимости объектов становятся явными, что улучшает понимание кода. 🚩Минусы ➖Усложнение кода Внедрение DI может усложнить код, особенно если используется слишком много уровней абстракции. ➖Кривая обучения Понимание и правильное использование DI может потребовать времени и обучения, особенно для разработчиков, незнакомых с паттерном. ➖Перегрузка конструкции При внедрении большого числа зависимостей через конструктор конструктор может стать перегруженным. Ставь 👍 и забирай 📚 Базу знаний

🤔 Как оцениваешь трудность? Трудность задачи оценивается на основе её объёма, сложности требований, уровня неопределённости и необходимых навыков. Также учитываются сроки выполнения, доступные ресурсы и возможные риски. Точный уровень определяется в зависимости от контекста и опыта команды или разработчика. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Сообщество IT-специалистов в Telegram от Selectel. Канал крупнейшего независимого провайдера IT-инфраструктуры и облаков. Шес
Сообщество IT-специалистов в Telegram от Selectel. Канал крупнейшего независимого провайдера IT-инфраструктуры и облаков. Шесть причин подписаться на канал: - железные новости; - обзоры продуктов; - разборы кейсов; - актуальные IT-статьи; - анонсы митапов; - бесплатные курсы. Подписаться #реклама О рекламодателе

🤔 Что такое симметричная и ассиметричная криптография? Это два основных подхода к шифрованию данных. Они различаются по способу использования ключей для шифрования и дешифрования. 🚩Симметричная криптография Использует один и тот же ключ как для шифрования, так и для дешифрования данных. Этот ключ должен быть известен как отправителю, так и получателю, что требует безопасного способа передачи ключа между ними.
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

# Генерация ключа
key = get_random_bytes(16)  # 16 байт = 128 бит

# Создание шифра
cipher = AES.new(key, AES.MODE_EAX)

# Шифрование данных
data = b'Secret message'
nonce = cipher.nonce
ciphertext, tag = cipher.encrypt_and_digest(data)

print(f'Ciphertext: {ciphertext}')

# Дешифрование данных
cipher = AES.new(key, AES.MODE_EAX, nonce=nonce)
plaintext = cipher.decrypt_and_verify(ciphertext, tag)

print(f'Plaintext: {plaintext}')
🚩Асимметричная криптография Использует пару ключей: открытый ключ и закрытый ключ. Открытый ключ используется для шифрования данных и может быть свободно распространяем, в то время как закрытый ключ используется для дешифрования и должен оставаться в секрете. Это решает проблему передачи ключей, так как отправитель может зашифровать данные открытым ключом получателя, а только получатель сможет расшифровать их с помощью своего закрытого ключа.
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes

# Генерация пары ключей
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
)

public_key = private_key.public_key()

# Шифрование данных
message = b'Secret message'
ciphertext = public_key.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print(f'Ciphertext: {ciphertext}')

# Дешифрование данных
plaintext = private_key.decrypt(
    ciphertext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print(f'Plaintext: {plaintext}')
🚩Сравнение симметричной и асимметричной криптографии 🟠Ключи Симметричная: Один ключ для шифрования и дешифрования. Асимметричная: Пара ключей — открытый для шифрования и закрытый для дешифрования. 🟠Безопасность Симметричная: Требует безопасной передачи ключа, что может быть сложно. Асимметричная: Обеспечивает безопасную передачу ключей через использование открытого ключа. Ставь 👍 и забирай 📚 Базу знаний