По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Исследователи кибербезопасности выявили новую уязвимость, которая может повлиять на устройства в миллиардах по всему миру, включая серверы, рабочие станции, настольные компьютеры, ноутбуки, системы Интернета вещей и многое другое, работающие на системах Windows и Linux. Исследователи говорят, что BootHole - это своего рода уязвимость переполнения буфера, способная воздействовать на все версии загрузчика GRUB2. Он ведет себя аналогично тому, как он разобрал содержимое файла конфигурации. Этот процесс по-разному подписывается другими исполняемыми и системными файлами. Следовательно, это создает почву киберпреступникам для разрушения механизма аппаратного доверия на корне. Вследствие переполнения буфера злоумышленники могут выполнять произвольные коды в среде UEFI. Затем они могут запускать вредоносные программы, вносить изменения в ядро операционной системы напрямую, изменять загрузку или выполнять другие вредоносные действия. Данная уязвимость представляет собой большой риск и называется BootHole или CVE-2020-10713. В настоящее время данной уязвимости подвержен загрузчике GRUB2. Если злоумышленникам удастся его использовать, это может позволить им обойти функцию "Безопасной загрузки". Кроме того, атакующие также могут получить незаметный и постоянный доступ к целевым системам. Безопасная загрузка является одной из функций Унифицированного Расширяемого Интерфейса Встроенного ПО (UEFI). Люди используют его для загрузки определенных критически важных периферийных устройств, операционных систем и компонентов, обеспечивая при этом выполнение только криптографически подписанных кодов во время загрузки. Согласно отчету исследователей Eclypsium, данная функция предназначена для предотвращения выполнения не доверенных кодов до загрузки ОС. Для этого он изменяет цепочку загрузки или отключает безопасную загрузку. В Windows злоумышленники могут использовать BootHole, заменив уже установленные загрузчики по умолчанию слабой версией GRUB2, а затем установить вредоносную программу rootkit. Последствия уязвимости BootHole Уязвимость BootHole может вызвать серьезные проблемы из-за того, что она позволяет злоумышленникам выполнять свои вредоносные коды до загрузки ОС. Следовательно, системам безопасности становится трудно обнаруживать вредоносные программы или устранять их. Другая причина, по которой BootHole может легко создавать ошибки в системах, заключается в том, что в среде выполнения UEFI отсутствует возможность случайного размещения адресного пространства (ASLR), предотвращение выполнения данных (DEP) или другие технологии предотвращения использования уязвимостей. Установка обновлений не решает проблему Эксперты Eclypsium недавно связались с производителями компьютеров и поставщиками ОС, чтобы помочь смягчить проблему. Выяснилось, что решение не так просто. Установки исправлений и обновление загрузчиков GRUB2 недостаточно для устранения проблемы. Причина в том, что злоумышленники могут заменить существующий загрузчик устройства на более слабую версию. Эксперты говорят, что для смягчения последствий потребуется вновь развернутые и подписанные загрузчики. Кроме того, скомпрометированные загрузчики должны быть убраны. Корпорация Майкрософт признает эту проблему и сообщает, что она работает над тестированием совместимости и проверкой обновления Windows, которое может устранить эту уязвимость. Кроме того, он рекомендует пользователям обновлять исправления безопасности по мере их доступности в ближайшие недели. Разработчики некоторых дистрибутивов Linux следуя их примеру также выпустили рекомендации, связанные с данной уязвимостью и готовящимися исправлениями.
img
Современные предприятия во многом доверяют технологии контейнеризации, чтобы упростить развертывания сложных приложений и управление ими. Контейнеры собирают необходимые зависимости внутри одного пакета. Таким образом, вам не нужно беспокоится о том, что возникнут какие-либо конфликты зависимостей в эксплуатационной среде. Контейнеры можно переносить и масштабировать, но для последнего маневра вам понадобится инструмент управления контейнерами. На сегодняшний день Docker Swarm и Kubernetes – самые популярные платформы для оркестрации контейнеров. Они оба имеют свое конкретное назначение и определенные преимущества и недостатки. В данной статье мы рассмотрим оба из них, чтобы помочь в выборе инструмента управления контейнерами с учетом ваших требований. Что такое Docker Swarm? Docker Swarm – это платформа оркестрации контейнеров с открытым исходным кодом, встроенная в Docker. Он поддерживает оркестрацию кластеров механизмов Docker. Docker Swarm преобразует несколько экземпляров Docker в один виртуальный хост. Кластер Docker Swarm обычно состоит из трех элементов: Node - нода Service и Task – службы и задачи Load balancer - балансировщик нагрузки Ноды – это экземпляры механизма Docker, контролирующие ваш кластер, а также контейнеры, используемые для запуска ваших служб и задач. Балансировка нагрузки также является частью кластеров Docker Swarm и используется для маршрутизации запросов между нодами. Преимущества Docker Swarm Docker Swarm довольно прост в установке, поэтому он хорошо подходит для тех, кто только начинает осваивать мир оркестрации контейнеров. Он легковесный. В контейнерах Docker Swarm обеспечивает автоматическую балансировку нагрузки. Поскольку Docker Swarm встроен в Docker, то он работает с интерфейсом командной строки Docker. Помимо этого, он без проблем работает с существующими инструментами Docker, такими как Docker Compose. Docker Swarm обеспечивает рациональный выбор нод, что позволяет выбрать оптимальные ноды в кластере для развертывания контейнера. Имеет собственный Swarm API. Недостатки Docker Swarm Не смотря на множество преимуществ, Docker Swarm имеет также несколько недостатков. Docker Swarm сильно привязан к Docker API, что ограничивает его функциональность в сравнении с Kubernetes. Возможности настройки и расширения в Docker Swarm ограничены. Что такое Kubernetes? Kubernetes – это портативный облачный инфраструктурный инструмент с открытым кодом, изначально разработанный Google для управления своими кластерами. Поскольку он является инструментом оркестрации контейнеров, то он автоматизирует масштабирование, развертывание и управление контейнерными приложениями. Kubernetes имеет более сложную структуру кластера, чем Docker Swarm. Kubernetes – это многофункциональная платформа, главным образом потому, что она с выгодой для себя использует активную деятельность мирового сообщества. Преимущества Kubernetes Он способен поддерживать большую рабочую нагрузку и управлять ей. У него большое сообщество разработчиков открытого ПО, поддерживаемого Google. Поскольку он имеет открытый исходный код, то он предлагает широкую поддержку сообщества и возможность работы с разнообразными сложными сценариями развертывания. Его предлагают все основные поставщики облачных услуг: Google Cloud Platform, Microsoft Azure, IBM Cloud и AWS. Он автоматизирован и поддерживает автоматическое масштабирование. Он многофункционален, имеет встроенный мониторинг и широкий спектр доступных интеграций. Недостатки Kubernetes Несмотря на то, что Kubernetes обладает большим набором функций, он также имеет и несколько недостатков: Процесс обучения Kubernetes достаточно сложный, и для освоения Kubernetes требуются специальные знания. Процесс установки достаточно сложен, особенно для новичков. Поскольку сообщество разработчиков открытого ПО работает достаточно продуктивно, Kubernetes требует регулярной установки обновлений для поддержания последней версии технологии без прерывания рабочей нагрузки. Для простых приложений, которые не требуют постоянного развертывания, Kubernetes слишком сложный. Kubernetes VS Docker Swarm Теперь, когда мы узнали все преимущества и недостатки Kubernetes и Docker Swarm, давайте посмотрим, чем же они отличаются друг от друга. Основное различие этих двух платформ заключается в их сложности. Kubernetes хорошо подходит для сложных приложений, а Docker Swarm разработан для простоты использования, что говорит о том, что его предпочтительнее использовать с простыми приложениями. Далее приведем подробное описание нескольких различий между Docker Swarm и Kubernetes: Установка и настройка Kubernetes можно настроить, но сделать это будет не так просто. Docker Swarm установить и настроить намного легче. Kubernetes: в зависимости от операционной системы ручная установка может отличаться. Если вы пользуетесь услугами поставщика облачных технологий, то установка не требуется. Docker Swarm: экземпляры Docker обычно одинаковы для различных операционных систем и поэтому довольно просты в настройке. Балансировка нагрузки Docker Swarm предлагает автоматическую балансировку нагрузки, а Kubernetes – нет. Однако в Kubernetes легко интегрировать балансировку нагрузки с помощью сторонних инструментов. Kubernetes: службы можно обнаружить через одно DNS-имя. Kubernetes обращается к контейнерным приложениям через IP-адрес или HTTP-маршрут. Docker Swarm: поставляется со встроенными балансировщиками нагрузки. Мониторинг Kubernetes: имеет встроенный мониторинг, а также поддержку интеграции со сторонними инструментами мониторинга. Docker Swarm: нет встроенных механизмов мониторинга. Однако он поддерживает мониторинг через сторонние приложения. Масштабируемость Kubernetes: обеспечивает масштабирование в зависимости от трафика. Встроено горизонтальное автомасштабирование. Масштабирование Kubernetes включает в себя создание новых модулей и их планирование для узлов с имеющимися ресурсами. Docker Swarm: обеспечивает быстрое автоматическое масштабирование экземпляров по запросу. Поскольку Docker Swarm быстрее развертывает контейнеры, то это дает инструменту оркестрации больше времени на реакцию, что позволяет масштабировать по требованию. Какую платформу все же выбрать? И Kubernetes, и Docker Swarm служат для конкретного назначения. Какой из них лучше, зависит от ваших текущих потребностей или потребностей вашей организации. При запуске Docker Swarm – это простое в использовании решение для управления вашими контейнерами. Если вам или вашей компании не нужно управлять сложными рабочими нагрузками, то Docker Swarm – правильный выбор. Если же ваши приложения имеют более ключевую роль, и вы хотите включить функции мониторинга, безопасности, высокой доступности и гибкости, то Kubernetes – вот ваш выбор. Подведем итог Благодаря этой статье мы узнали, что такое Docker Swarm и Kubernetes. Также мы узнали об их плюсах и минусах. Выбор между этими двумя технологиями достаточно субъективен и зависит от желаемых результатов.
img
Алгоритм – это набор четко сформулированных инструкций, который применяется для решения конкретной задачи. Эти задачи вы можете решать любым удобным для вас способом.  Это значит, что ваш метод, который вы используете для решения задачи, может отличаться от моего, но при этом мы оба должны получить один и тот же результат.  Так как способ решения одной и той же задачи может быть не один, то должен существовать и способ оценить эти решения или алгоритмы с точки зрения оптимальности и эффективности (время, которое требуется для запуска/выполнения вашего алгоритма, и общий объем потребляемой памяти). Этот этап довольно важный для программистов. Его цель - помочь убедиться, что их приложения работают должным образом, и помочь написать чистый программный код.  И вот здесь на первый план выходит обозначение «О большое». «О большое» - это метрика, которая определяет эффективность алгоритма. Она позволяет оценить, сколько времени занимает выполнение программного кода с различными входными данными, и измерить, насколько эффективно этот программный код масштабируется по мере увеличения размера входных данных.  Что такое «О большое»? «О большое» показывает сложность алгоритма для наихудшего случая. Для описания сложности алгоритма здесь используются алгебраические выражения.  «О большое» определяет время выполнения алгоритма, показывая, как будет меняться оптимальность алгоритма по мере увеличения размера входных данных. Однако этот показатель не расскажет вам о том, насколько быстро работает ваш алгоритм.  «О большое» измеряет эффективность и оптимальность алгоритма, основываясь на временной и пространственной сложности.    Что такое временная и пространственная сложность? Один из самых основных факторов, который влияет на оптимальность и эффективность вашей программы – это оборудование, ОС и ЦП, которые вы используете.  Однако при анализе оптимальности алгоритма это не учитывается. Куда важнее учесть временную и пространственную сложность как функцию, которая зависит от размера входных данных.  Временная сложность алгоритма – это то, сколько времени потребуется для выполнения алгоритма в зависимости от размера входных данных. Аналогично пространственная сложность – это то, сколько пространства или памяти потребуется для выполнения алгоритма в зависимости от размера входных данных.  В данной статье мы рассмотрим временную сложность. Эта статья станет для вас своего рода шпаргалкой, которая поможет вам понять, как можно рассчитать временную сложность для любого алгоритма. Почему временная сложность зависит от размера входных данных? Для того, чтобы полностью понять, что же такое «зависимость от входных данных», представьте, что у вас есть некий алгоритм, который вычисляет сумму чисел, основываясь на ваших входных данных. Если вы ввели 4, то он сложит 1+2+3+4, и на выходе получится 10; если вы ввели 5, то на выходе будет 15 (то есть алгоритм сложил 1+2+3+4+5). const calculateSum = (input) => {  let sum = 0;  for (let i = 0; i <= input; i++) {    sum += i;  }  return sum; }; В приведенном выше фрагменте программного кода есть три оператора: Давайте посмотрим на картинку выше. У нас есть три оператора. При этом, так как у нас есть цикл, то второй оператор будет выполняться, основываясь на размере входных данных, поэтому, если на входе алгоритм получает 4, то второй оператор будет выполняться четыре раза. А значит, в целом алгоритм выполнится шесть (4+2) раз.  Проще говоря, алгоритм будет выполняться input+2 раза; input может быть любым числом. Это говорит о том, что алгоритм выражается в терминах входных данных. Иными словами, это функция, которая зависит от размера входных данных.  Для понятия «О большое» есть шесть основных типов сложностей (временных и пространственных): Постоянное время: O1 Линейное время: On Логарифмическое время: On log n  Квадратичное время: On2 Экспоненциальное время: O2n Факториальное время: On! Прежде чем мы перейдем к рассмотрению всех этих временных сложностей, давайте посмотрим на диаграмму временной сложности «О большого».  Диаграмма временной сложности «О большого» Диаграмма «О большого» - это асимптотические обозначение, которое используется для выражения сложности алгоритма или его оптимальности в зависимости от размера входных данных.  Данная диаграмма помогает программистам определить сценарий наихудшего случая, а также оценить время выполнения и объем требуемой памяти.  Следующий график иллюстрирует сложность «О большого»:  Глядя на приведенную выше диаграмму, можно определить, что O1 – постоянное время выполнения алгоритма, является наилучшим вариантом. Это означает, что ваш алгоритм обрабатывает только один оператор без какой-либо итерации. Дальше идет Olog n , что тоже является неплохим вариантом, и другие: O1 – отлично/наилучший случай Olog n  – хорошо On – удовлетворительно On log n  – плохо On2, O2n, On! – ужасно/наихудший случай Теперь вы имеете представление о различных временных сложностях, а также можете понять, какие из них наилучшие, хорошие или удовлетворительные, а какие плохие и наихудшие (плохих и наихудших временных сложностей следует избегать). Следующий вопрос, который может прийти на ум: «какой алгоритм какую сложность имеет?» И это вполне логичный вопрос, ведь эта статья задумывалась как шпаргалка. ?  Когда ваши расчеты не зависят от размера входных данных, то это постоянная временная сложность - O1. Когда размер входных данных уменьшается в два раза, например, при итерации, обработке рекурсии и т.д., то это логарифмическая временная сложность - Olog n . Когда у вас один цикл в алгоритме, то это линейная временная сложность - On. Когда у вас есть вложенные циклы, то есть цикл в цикле, то это квадратичная временная сложность - On2. Когда скорость роста удваивается при каждом добавлении входных данных, то это экспоненциальная временная сложность - O2n. Давайте перейдем к описанию временных сложностей. Для каждой будут приведены примеры. Отмечу, что в примерах я использовал JavaScript, но если вы понимаете принцип и что из себя представляет каждая временная сложность, то не имеет значения, какой язык программирования вы выберите.  Примеры временных сложностей «О большого» Постоянное время: O1 Когда алгоритм не зависит от размера входных данных n, то говорят, что он имеет постоянную временную сложность порядка O1. Это значит, что время выполнения алгоритма всегда будет одним и тем же, независимо от размера входных данных.  Допустим, что задача алгоритма – вернуть первый элемент массива. Даже если массив состоит из миллиона элементов, временная сложность будет постоянной, если использовать следующий подход для решения задачи: const firstElement = (array) => {  return array[0]; }; let score = [12, 55, 67, 94, 22]; console.log(firstElement(score)); // 12 Приведенная выше функция выполняет лишь один шаг, а это значит, что функция работает за постоянное время, и ее временная сложность O1.  Однако, как уже было сказано, разные программисты могут найти разные способы решения задачи. Например, другой программист может решить, что сначала надо пройти по массиву, а затем уже вернуть первый элемент: const firstElement = (array) => {  for (let i = 0; i < array.length; i++) {    return array[0];  } }; let score = [12, 55, 67, 94, 22]; console.log(firstElement(score)); // 12 Это просто пример – вряд ли кто-то будет решать эту задачу таким способом. Но здесь уже есть цикл, а значит алгоритм не будет выполняться за постоянное время, здесь в игру вступает линейное время с временной сложностью On. Линейное время: On Линейная временная сложность возникает, когда время работы алгоритма увеличивается линейно с размером входных данных. Когда функция имеет итерацию по входному значению n, то говорят, что она имеет временную сложность порядка On. Допустим, алгоритм должен вычислить и вернуть факториал любого числа, которое вы введете. Это значит, что если вы введете число 5, то алгоритм должен выполнить цикл и умножить 1·2·3·4·5, а затем вывести результат – 120: const calcFactorial = (n) => {  let factorial = 1;  for (let i = 2; i <= n; i++) {    factorial = factorial * i;  }  return factorial; }; console.log(calcFactorial(5)); // 120 Тот факт, что время выполнения алгоритма зависит от размера входных данных, подразумевает наличие линейной временной сложности порядка On. Логарифмическое время: Olog n  Это чем-то похоже на линейную временную сложность. Однако здесь время выполнения зависит не от размера входных данных, а от их половины. Когда размер входных данных уменьшается на каждой итерации или шаге, то говорят, что алгоритм имеет логарифмическую временную сложность.  Такой вариант считается вторым сверху списка лучших, так как ваша программа работает лишь с половиной входных данных. И при всем при этом, размер входных данных уменьшается с каждой итерацией.  Отличный пример – функция бинарного поиска, которая делит отсортированный массив, основываясь на искомом значения.  Допустим, что нам надо найти индекс определенного элемента в массиве с помощью алгоритма бинарного поиска: const binarySearch = (array, target) => {  let firstIndex = 0;  let lastIndex = array.length - 1;  while (firstIndex <= lastIndex) {    let middleIndex = Math.floor((firstIndex + lastIndex) / 2);    if (array[middleIndex] === target) {      return middleIndex;    }    if (array[middleIndex] > target) {      lastIndex = middleIndex - 1;    } else {      firstIndex = middleIndex + 1;    }  }  return -1; }; let score = [12, 22, 45, 67, 96]; console.log(binarySearch(score, 96)); Приведенный выше программный код демонстрирует бинарный поиск. Судя по нему, вы сначала получаете индекс среднего элемента вашего массива, дальше вы сравниваете его с искомым значением и, если они совпадают, то вы возвращаете этот индекс. В противном случае, если они не совпали, вы должны определить, искомое значение больше или меньше среднего, чтобы можно было изменить первый и последний индекс, тем самым уменьшив размер входных данных в два раза. Так как на каждой такой итерации размер входных данных уменьшается в два раза, то данный алгоритм имеет логарифмическую временную сложность порядка Olog n . Квадратичное время: On2 Когда в алгоритме присутствуют вложенные циклы, то есть цикл в цикле, то временная сложность уже становится квадратичной, и здесь нет ничего хорошего.  Представьте, что у вас есть массив из n элементов. Внешний цикл будет выполняться n раз, а внутрениий – n раз для каждой итерации внешнего цикла, и, соответственно, общее количество итераций составит n2. Если в массиве было 10 элементов, то количество итераций будет 100 (102). Ниже приведен пример, где сравниваются элементы для того, чтобы можно было вывести индекс, когда найдутся два одинаковых: const matchElements = (array) => {  for (let i = 0; i < array.length; i++) {    for (let j = 0; j < array.length; j++) {      if (i !== j && array[i] === array[j]) {        return `Match found at ${i} and ${j}`;      }    }  }  return "No matches found ?"; }; const fruit = ["?", "?", "?", "?", "?", "?", "?", "?", "?", "?"]; console.log(matchElements(fruit)); // "Match found at 2 and 8" В этом примере есть вложенный цикл, а значит, здесь будет квадратичная временная сложность порядка On2.  Экспоненциальное время: O2n Экспоненциальная временная сложность появляется, когда скорость роста удваивается с каждым добавлением входных данных n, например, когда вы обходите все подмножества входных элементов. Каждый раз, когда единицу входных данных увеличивают на один, то количество итераций, которые выполняет алгоритм, увеличиваются в два раза.  Хороший пример – рекурсивная последовательность Фибоначчи. Допустим, дано число, и необходимо найти n-ый элемент последовательности Фибоначчи.  Последовательность Фибоначчи – это математическая последовательность, в которой каждое число является суммой двух предыдущих; первые два числа – 0 и 1. Третье число – 1, четвертое – 2, пятое – 3 и т.д. (0, 1, 1, 2, 3, 5, 8, 13, …). Соответственно, если вы введете число 6, то выведется 6-й элемент в последовательности Фибоначчи – 8: const recursiveFibonacci = (n) => {  if (n < 2) {    return n;  }  return recursiveFibonacci(n - 1) + recursiveFibonacci(n - 2); }; console.log(recursiveFibonacci(6)); // 8 Приведенный выше алгоритм задает скорость роста, которая удваивается каждый раз, когда добавляются входные данные. А значит, данный алгоритм имеет экспоненциальную временную сложность порядка O2n. Заключение Из данной статьи вы узнали, что такое временная сложность, как определить оптимальность алгоритма с помощью «О большого», а также рассмотрели различные временные сложности с примерами. 
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59