По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Что такое парадигмы программирования? Это не более, чем просто замысловатое название для популярных способов и стилей организации процесса написания программного кода. Я постараюсь разбить эту тему на части и дать простое пояснение по каждой парадигме. Таким образом, вы сможете легко понять, о чем говорят люди, когда произносят такие слова, как «объектно-ориентированный», «функциональный» или «декларативный». Давайте начнем! Что такое парадигма программирования? Парадигмы программирования – это различные способы и стили, которые используются для организации программы или языка программирования. Каждая парадигма состоит из определенных структур, функций и взглядов на то, как следует решать известные задачи программирования. Вопрос о том, почему существует так много различных парадигм программирования, схож с вопросом о том, почему существует так много языков программирования. Определенные парадигмы лучше подходят для определенных типов задач. Именно поэтому имеет смысл использовать разные парадигмы для разных типов проектов. Кроме того, методики, которые составляют каждую парадигму, развивались с течением времени. Благодаря достижениям как в области программного, так и аппаратного обеспечения появились различные подходы к решению задач, которых раньше просто не было. И последняя причина – я думаю, это просто творческое начало в человеке. По своей натуре, нам просто нравится создавать новые вещи, улучшать то, что другие когда-то создали, и адаптировать инструменты под себя и свои предпочтения или просто делать их более эффективными (в нашем понимании). Все это привело к тому, что на сегодняшний день мы имеем огромное количество вариантов, которые могут помочь нам написать и структурировать ту или иную программу. Чем парадигма программирования не является? Парадигмы программирования – это не языки и не инструменты. Вы не сможете ничего «создать» с помощью парадигмы. Они больше похожи на некий набор образцов и руководящих принципов, о которых условились большое количество людей, которым они следовали и которые они подробно изложили. Язык программирования не всегда привязан к определенной парадигме. Есть языки, которые были созданы с учетом определенной парадигмы и имеют функции, которые облегчают программирование в этом контексте больше, чем другие (хороший пример – Haskel и функциональное программирование). Однако существуют и «многопарадигмальные» языки. Это означает, что вы можете адаптировать свой код, чтобы он подходил под какую-то из парадигм (хороший пример – JavaScript и Python). При этом парадигмы программирования не являются взаимоисключающими в том смысле, что вы можете без каких-либо проблем использовать приемы из различных парадигм одновременно. Популярные парадигмы программирования Теперь, когда вы знаете, что такое парадигмы программирования, а что к ним не относится, давайте рассмотрим самые популярные из них, их характеристики и сравним их. Имейте в виду, что этот список не полный. Существуют и другие парадигмы программирования, которые мы здесь рассматривать не будем. Здесь я расскажу вам только о самых популярных и широко используемых. Императивное программирование Императивное программирование – это набор подробных инструкций, которые даются компьютеру, чтобы тот выполнил их в заданном порядке. Этот тип программирования называется «императивным», потому что мы некоторым образом указываем компьютеру (как программисты), что он должен делать. Императивное программирование концентрируется на описании того, как программа работает, шаг за шагом. Допустим, вы хотите испечь торт. Ваша императивная программа для такого рода задачи может выглядеть следующим образом: 1- Pour flour in a bowl 2- Pour a couple eggs in the same bowl 3- Pour some milk in the same bowl 4- Mix the ingredients 5- Pour the mix in a mold 6- Cook for 35 minutes 7- Let chill Воспользуемся конкретным примером и предположим, что мы хотим отфильтровать массив чисел так, чтобы остались только числа, которые больше 5. Наш императивный код тогда будет выглядеть следующим образом: const nums = [1,4,3,6,7,8,9,2] const result = [] for (let i = 0; i < nums.length; i++) { if (nums[i] > 5) result.push(nums[i]) } console.log(result) // Output: [ 6, 7, 8, 9 ] Обратите внимание, что мы указываем программе, что нужно перебрать каждый элемент массива, сравнить каждый из них с 5 и, если элемент больше 5, то поместить его в конечный массив. Наши инструкции предельно детализированы и конкретны, и именно это и является императивным программированием. Процедурное программирование Процедурное программирование – это производное от императивного программирования только с функциями (также известных как «процедуры» или «подпрограммы»). Процедурное программирования предлагает пользователю разделить выполнение программы на функции, чтобы оптимизировать модульный принцип организации. Вернемся к нашему примеру с тортом. Процедурная программа для этого примера будет выглядеть следующим образом: function pourIngredients() { - Pour flour in a bowl - Pour a couple eggs in the same bowl - Pour some milk in the same bowl } function mixAndTransferToMold() { - Mix the ingredients - Pour the mix in a mold } function cookAndLetChill() { - Cook for 35 minutes - Let chill } pourIngredients() mixAndTransferToMold() cookAndLetChill() Как вы можете видеть, благодаря реализации функций, мы можем просто прочитать три вызова функций в конце файла и понять, что делает наша программа. Такое упрощение и абстрактное представление является одним из преимуществ процедурного программирования. Однако внутри функций находится все тот же императивный код. Функциональное программирование Функциональное программирование продвигает концепцию создания функций немного дальше. В функциональном программировании функции рассматриваются как «полноправные граждане». Это означает, что их можно присваивать переменным, передавать в качестве аргумента и возвращать в качестве результата других функций. Еще одна ключевая концепция – это идея чистых функций. Чистая функций – это функция, которая, чтобы получить результат, полагается только на свои входные данные. И при одних и тех же входных данных всегда будет один и тот же результат. Кроме того, эти функции не имеют никаких побочных эффектов (то есть не вносят никаких изменений вне контекста функции). С учетом всех этих концепций, функциональное программирование призывает писать программы с помощью функций. Оно также поддерживает идею о том, что модульность кода и отсутствие побочных эффектов облегчают определение и разделение обязанностей внутри кодовой базы. Таким образом, это облегчает сопровождение кода. Вернемся к примеру с фильтрацией массива. В императивной парадигме мы можем использовать внешнюю переменную для хранения результата функции, что по сути может считаться побочным эффектом. const nums = [1,4,3,6,7,8,9,2] const result = [] // External variable for (let i = 0; i < nums.length; i++) { if (nums[i] > 5) result.push(nums[i]) } console.log(result) // Output: [ 6, 7, 8, 9 ] Для того, чтобы преобразовать это в функциональное программирование, мы можем сделать следующее: const nums = [1,4,3,6,7,8,9,2] function filterNums() { const result = [] // Internal variable for (let i = 0; i < nums.length; i++) { if (nums[i] > 5) result.push(nums[i]) } return result } console.log(filterNums()) // Output: [ 6, 7, 8, 9 ] Это практически тот же самый код, но мы проворачиваем все итерации внутри функции, в которой мы также сохраняем и массив результатов. Таким образом, мы можем гарантировать, что функция не будет ничего менять за своими пределами. Она создает переменную только для обработки своей собственной информации, и после завершения своей работы удаляет ее. Декларативное программирование Декларативное программирование скрывает всю сложность и приближает языки программирования к человеческому языку и мышлению. Это абсолютная противоположность императивному программированию, хотя бы потому что программист дает инструкции не о том, как компьютеру следует решать задачу, а о том, какой требуется результат. Будет намного понятнее, если мы приведем пример. Воспользуемся примером с фильтрацией массива. Декларативный подход здесь будет выглядеть следующим образом: const nums = [1,4,3,6,7,8,9,2] console.log(nums.filter(num => num > 5)) // Output: [ 6, 7, 8, 9 ] Обратите внимание, что, используя функцию фильтрации filter, мы явно не указываем компьютеру перебирать массив или сохранять значения в отдельном массиве. Мы просто говорим о том, что мы хотим («filter») и условие, которое необходимо выполнить («num > 5»). Что хорошего в таком подходе? Его легче читать и понимать, и зачастую он более емкий в записи. Хорошими примерами декларативного кода являются функции filter, map, reduce и sort в JavaScript. Еще один хороший пример – современные фреймворки/библиотеки JS, такие как React. Посмотрите, например, на этот код: <button onClick={() => console.log('You clicked me!')}>Click me</button> Здесь у нас есть кнопка (button) с приемником событий, который запускает функцию console.log при нажатии кнопки. Синтаксис JSX (то, что использует React) совмещает HTML и JS. Это упрощает и ускоряет написание приложений. Но это не то, что браузеры читают и выполняют. Код React позже преобразуются в обычный HTML и JS, а вот это уже то, с чем работают браузеры. JSX является декларативным, поскольку его цель заключается в том, чтобы предоставить разработчикам более удобный и эффективный интерфейс для работы. Здесь также важно отметить, что в декларативном программировании компьютер все равно обрабатывает информацию как императивный код. Если снова вернуться к примеру с массивом, то компьютер по-прежнему выполняет итерацию по массиву, как в цикле for, но нам, как программистам, не нужно писать это напрямую. Декларативное программирование скрывает всю сложность от программиста. Объектно-ориентированное программирование Одной из самых популярных парадигм программирование является объектно-ориентированное программирование (ООП). Основная концепция ООП заключается в разделении понятий на сущности, которые описываются как некие объекты. Каждая сущность группирует заданный набор информации (свойств) и действий (методов), которые может выполнять эта сущность. ООП широко использует классы. Классы - это способ создания новых объектов с помощью макета или шаблона, который задает программист. Объекты, которые были созданы с помощью класса, называются экземплярами. Вернемся к примеру с приготовлением пищи на псевдокоде. Предположим, что в нашей пекарне у нас есть главный повар (по имени Фрэнк) и помощник повара (по имени Энтони). У каждого их них есть определенные обязанности. Если бы мы использовали ООП, то наша программа бы выглядеть следующим образом: // Create the two classes corresponding to each entity class Cook { constructor constructor (name) { this.name = name } mixAndBake() { - Mix the ingredients - Pour the mix in a mold - Cook for 35 minutes } } class AssistantCook { constructor (name) { this.name = name } pourIngredients() { - Pour flour in a bowl - Pour a couple eggs in the same bowl - Pour some milk in the same bowl } chillTheCake() { - Let chill } } // Instantiate an object from each class const Frank = new Cook('Frank') const Anthony = new AssistantCook('Anthony') // Call the corresponding methods from each instance Anthony.pourIngredients() Frank.mixAndBake() Anthony.chillTheCake() Преимущество ООП заключается в том, что оно облегчает понимание программы за счет четкого разделения задач и обязанностей. Итоги Как мы увидели, парадигмы программирования – это различные способы решения задач программирования и организации нашего кода. Одними из самых популярных и широко используемых на сегодняшний день парадигм являются императивная, процедурная, функциональная, декларативная и объектно-ориентированная. Знание о том, что они из себя представляют, полезно для общего развития, а также для лучшего понимания других тем, связанных с программированием.
img
В данной статье мы опишем настройки сети, которые могут очень пригодится для малых и средних сетей. Мы настроим на Cisco ASA DHCP сервер с несколькими внутренними локальными сетями. У нас есть три разных внутренних локальных сети с ПК пользователей и другой инфраструктурой – серверами, принтерами и так далее. Нашей задачей является разделение этих сетей с помощью использования Cisco ASA (данная задача решается как на старых моделях 5500, так и на новых 5500-X). Три внутренних локальных сети будут подключены к одному коммутатору второго уровня с тремя VLAN-ами на данном коммутаторе ASA будет предоставлять доступ к интернету для всех внутренний ЛВС. Кроме того, ASA также будет выполнять функции DHCP сервера для каждой из ЛВС, назначая нужные IP – адреса для каждой из сетей, используя разные DHCP пулы. Кроме того, мы будем использовать один физический интерфейс на ASA для размещения внутренних зон безопасности (“inside1”,“inside2”,“inside3”). Для этого нам необходимо настроить саб-интерфейсы на физическом интерфейсе нашего МСЭ, который подключен к транковому порту коммутатора. Каждый саб-интерфейс будет служить шлюзом по умолчанию для соответствующих подсетей. Касаемо настроек свитча – нам необходим один порт Dot1Q, который будет подключен к фаерволлу, и также необходимо будет настроить порты доступа для внутренних хостов. Топология изображена ниже: Убедитесь, что вы используете лицензию security-plus. Из топологии мы видим: Интерфейс GE1 на ASA – внешняя зона с адресом 100.1.1.1 будет подключен к провайдеру Интерфейс GE0 на ASA – интерфейс, подключенный к транковому порту на коммутаторе. Данный интерфейс будет разбит на три саб-интерфейса, каждый из которых принадлежит свой зоне безопасности и VLAN. Саб-интерфейс GE0.1 - VLAN10 (адрес 10.1.1.254) – зона безопасности “inside 1” Саб-интерфейс GE0.2 - VLAN10 (адрес 10.2.2.254) – зона безопасности “inside 2” Саб-интерфейс GE0.3 - VLAN10 (адрес 10.3.3.254) – зона безопасности “inside 3” Интерфейс Eth0/1, Eth0/2, Eth 0/3 на коммутаторе – настраиваются как порты доступа для соответствующих VLAN-ов (10, 20, 30) Хосты в VLAN 10 – получат адреса с ASA через DHCP (10.1.1.0/24) на интерфейсе “inside1” Хосты в VLAN 20 - получат адреса с ASA через DHCP (10.2.2.0/24) на интерфейсе “inside2” Хосты в VLAN 30 – получат адреса с ASA через DHCP (10.3.3.0/24) на интерфейсе “inside3” Все внутренние локальные сети – данные сети получат доступ к интернету через ASA с использованием PAT (NAT Overload) на внешнем интерфейсе МСЭ Важно отметить, что в данном примере настройка меж-VLAN маршрутизации проведена не была – есть только доступ в интернет. Конфигурация Cisco ASA Ниже указан конфиг для МСЭ ! Данный физический интерфейс разбиваем на три саб-интерфейса (порт подключен к транковому порту коммутатора) interface GigabitEthernet0 no nameif no security-level no ip address ! ! Это саб-интерфейс GE0.1 для VLAN10 interface GigabitEthernet0.1 vlan 10 nameif inside1 security-level 100 ip address 10.1.1.254 255.255.255.0 ! Это саб-интерфейс GE0.2 для VLAN20 interface GigabitEthernet0.2 vlan 20 nameif inside2 security-level 90 ip address 10.2.2.254 255.255.255.0 ! Это саб-интерфейс GE0.3 для VLAN30 interface GigabitEthernet0.3 vlan 30 nameif inside3 security-level 80 ip address 10.3.3.254 255.255.255.0 ! This is the WAN interface connected to ISP Это WAN интерфейс, подключенный к ISP interface GigabitEthernet1 nameif outside security-level 0 ip address 100.1.1.1 255.255.255.0 ! Настраиваем сетевые объекты для трех ЛВС object network inside1_LAN subnet 10.1.1.0 255.255.255.0 object network inside2_LAN subnet 10.2.2.0 255.255.255.0 object network inside3_LAN subnet 10.3.3.0 255.255.255.0 ! Данный ACL полезен тем, что разрешает ходить ICMP трафику (пинг и так далее) access-list OUT extended permit icmp any any access-group OUT in interface outside ! Разрешаем доступ в Интернет – для этого настраиваем PAT (NAT Overload) на внешнем интерфейсе object network inside1_LAN nat (inside1,outside) dynamic interface object network inside2_LAN nat (inside2,outside) dynamic interface object network inside3_LAN nat (inside3,outside) dynamic interface access-group OUT in interface outside route outside 0.0.0.0 0.0.0.0 100.1.1.2 ! Создаем три разных DHCP cущности ! DHCP сущность для VLAN10 – “inside1” dhcpd address 10.1.1.1-10.1.1.100 inside1 dhcpd enable inside1 ! DHCP сущность для VLAN20 – “inside2” dhcpd address 10.2.2.1-10.2.2.100 inside2 dhcpd enable inside2 ! DHCP сущность для VLAN30 – “inside3” dhcpd address 10.3.3.1-10.3.3.100 inside3 dhcpd enable inside3 ! Назначаем DNS cервер для внутренних хостов dhcpd dns 200.1.1.1 На этом все, переходим к настройке свитча. Настройка коммутатора Настройка коммутатора очень проста – необходимо настроить транковый порт и три порта доступа, с указанием VLAN. ! Транковый порт, который подключается к GE0 interface Ethernet0/0 switchport trunk encapsulation dot1q switchport mode trunk duplex auto ! Порт доступа для VLAN10 interface Ethernet0/1 switchport access vlan 10 switchport mode access duplex auto ! Порт доступа для VLAN20 interface Ethernet0/2 switchport access vlan 20 switchport mode access duplex auto ! Порт доступа для VLAN30 interface Ethernet0/3 switchport access vlan 30 switchport mode access duplex auto
img
В настоящее время происходит рост потребности повышения уровня информатизации и увеличения количества узлов беспроводного доступа, особенно в информационно-коммуникационных технологиях. Пользователи, успешно использующие беспроводные информационные ресурсы, могут всегда и в любое время работать над самыми разными задачами, гораздо более эффективно, по сравнению с теми, кто до сих пор остаётся заложниками кабельных соединений для компьютерных сетей благодаря тому, что напрямую зависят от строго запланированной телекоммуникационной инфраструктуры. Беспроводные сети по сравнению с традиционными проводными решениями имеют преимущества, такие как: Просто создать и легко реализовать; Гибкость всей сети на уровне архитектуры, когда есть возможность изменения топологии сети без прерывания процесса, а также подключение, перемещение и отключение мобильных пользователей без потери драгоценного времени; Быстрота проектирования и ввод в эксплуатацию; Беспроводная сеть не нуждается в огромной массе кабелей и длительном прокладывании. Из-за быстрого развития беспроводных сетей появилась возможность осуществлять управление большинством привычных современных устройств. Благодаря этому взаимодействие населения и специальных служб, повышает эффективность работы многих учреждений путём использования электронных порталов. Оперативное реагирование общества на появление инновационных технологий оказывает положительное влияние на развитие городской инфраструктуры. Данные факторы положили начало развитию системы, которая в зарубежных вариантах называется, как "Smart City", что обычно называют "Умный город". Варианты использования таких систем не ограничиваются простым управлением привычных устройств, что позволяет объединить устройства в группы, а их, в свою очередь, в целые экосистемы с одним центром управления. Это позволяет осуществлять гибкую настройку различных действий по расписанию или при выполнении каких-то смежных действий. Например, интеллектуальные уличные фонари функционируют как точки беспроводного доступа к технологии Wi-Fi, оснащены камерой наблюдения, зарядными устройствами для электромобилей и телефонов и даже измеряют качество воздуха. Этот многозадачный уличный фонарь работает как датчик и привод, предоставляя услуги, которые улучшают качество жизни жителей, собирая важные данные об окружающей среде. При всем подобном разнообразии возможностей и удобстве современных технологий, они не лишены серьёзных недостатков. Беспроводные сети являются сетями повышенной опасности с точки зрения возможного наличия уязвимостей, которые могут использоваться осведомленными злоумышленниками, поэтому необходимо принимать комплексные меры по защите. Также существует проблема надежного хранения данных. Существует несколько подходов к реализации данной задачи: хранение данных на едином централизованном сервере, либо применение технологий распределенного хранения данных. Однако разные подходы не лишены своих недостатков. Хранение данных централизованно повышает: Риск кражи базы данных с целью анализа существующих записей и поиска коллизий для существующих хешей; Риск подмены данных для предоставления доступа к системе по ложным данным; Риск удаления данных с целью полного отказа работоспособности системы.
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59